1994-11-10 14:17:03 +00:00
|
|
|
#include <applicat.h>
|
|
|
|
#include <colors.h>
|
1995-01-10 17:07:53 +00:00
|
|
|
#include <config.h>
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
#include <urldefid.h>
|
|
|
|
#include <utility.h>
|
|
|
|
|
|
|
|
#if XVT_OS == XVT_OS_SCOUNIX
|
|
|
|
extern "C" { long nap(long period); }
|
|
|
|
#endif
|
|
|
|
|
1995-04-10 15:28:03 +00:00
|
|
|
|
|
|
|
// ERROR HOOK che intercetta errori XVT
|
1994-11-10 14:17:03 +00:00
|
|
|
// put breakpoint here
|
1995-04-10 15:28:03 +00:00
|
|
|
|
|
|
|
BOOLEAN error_hook(XVT_ERRMSG err, DATA_PTR)
|
1994-11-10 14:17:03 +00:00
|
|
|
{
|
1995-04-10 15:28:03 +00:00
|
|
|
const XVT_ERRSEV sev = xvt_errmsg_get_sev_id(err);
|
|
|
|
#ifdef DBG
|
|
|
|
return FALSE;
|
|
|
|
#else
|
|
|
|
return sev < SEV_ERROR;
|
|
|
|
#endif
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
1995-04-10 15:28:03 +00:00
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
HIDDEN XVT_FNTID DEF_FONT = NULL;
|
1995-03-28 16:28:10 +00:00
|
|
|
HIDDEN XVT_FNTID FAT_FONT = NULL;
|
1995-03-22 09:07:04 +00:00
|
|
|
|
1994-11-10 14:17:03 +00:00
|
|
|
#if XVTWS == WMWS
|
|
|
|
|
|
|
|
short CHARX = 8;
|
|
|
|
short CHARY = 8;
|
|
|
|
short BASEY = 8;
|
|
|
|
short ROWY = 8;
|
|
|
|
|
|
|
|
COLOR MASK_BACK_COLOR = COLOR_WHITE;
|
1995-01-12 18:37:43 +00:00
|
|
|
COLOR MASK_LIGHT_COLOR = COLOR_WHITE;
|
1995-01-03 14:19:41 +00:00
|
|
|
COLOR MASK_DARK_COLOR = COLOR_BLUE;
|
1994-11-10 14:17:03 +00:00
|
|
|
COLOR NORMAL_COLOR = COLOR_BLACK;
|
|
|
|
COLOR NORMAL_BACK_COLOR = COLOR_WHITE;
|
|
|
|
COLOR DISABLED_COLOR = COLOR_GRAY;
|
1995-01-02 09:33:00 +00:00
|
|
|
COLOR DISABLED_BACK_COLOR = MASK_BACK_COLOR;
|
1994-11-10 14:17:03 +00:00
|
|
|
COLOR FOCUS_COLOR = COLOR_BLACK;
|
|
|
|
COLOR FOCUS_BACK_COLOR = COLOR_WHITE;
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
#include <ctl3d.h>
|
|
|
|
|
|
|
|
HIDDEN COLORREF COLOR2RGB(COLOR c)
|
|
|
|
{
|
|
|
|
const byte red = byte((c >> 16) & 0xFF);
|
|
|
|
const byte gre = byte((c >> 8) & 0xFF);
|
|
|
|
const byte blu = byte(c & 0xFF);
|
|
|
|
return RGB(red, gre, blu);
|
|
|
|
}
|
|
|
|
|
|
|
|
HIDDEN COLOR RGB2COLOR(COLORREF c)
|
|
|
|
{
|
|
|
|
const byte red = byte(c & 0xFF);
|
|
|
|
const byte gre = byte((c >> 8) & 0xFF);
|
|
|
|
const byte blu = byte((c >> 16) & 0xFF);
|
1995-03-22 09:07:04 +00:00
|
|
|
return XVT_MAKE_COLOR(red, gre, blu);
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
1995-03-16 13:44:11 +00:00
|
|
|
#ifndef XVT_CALLCONV1
|
|
|
|
#define XVT_CALLCONV1
|
|
|
|
#endif
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
extern "C" {
|
1995-03-16 13:44:11 +00:00
|
|
|
WINDOW XVT_CALLCONV1 xvtwi_hwnd_to_window(HWND);
|
1994-11-10 14:17:03 +00:00
|
|
|
#include <statbar.h>
|
|
|
|
}
|
|
|
|
#include <controls.h>
|
|
|
|
|
|
|
|
short CHARX = 8;
|
|
|
|
short ROWY = GetSystemMetrics(SM_CYSCREEN) / 25;
|
|
|
|
short CHARY = 14;
|
|
|
|
short BASEY = 12;
|
|
|
|
|
|
|
|
HIDDEN HFONT NormalFont = NULL;
|
|
|
|
HIDDEN LOGFONT LogFont;
|
|
|
|
HIDDEN int FontWeight;
|
|
|
|
|
|
|
|
|
1995-01-02 09:33:00 +00:00
|
|
|
COLOR MASK_BACK_COLOR = COLOR_DKCYAN;
|
1995-01-03 14:19:41 +00:00
|
|
|
COLOR MASK_LIGHT_COLOR = COLOR_CYAN;
|
|
|
|
COLOR MASK_DARK_COLOR = COLOR_GRAY;
|
1994-11-10 14:17:03 +00:00
|
|
|
COLOR NORMAL_COLOR = COLOR_BLACK;
|
|
|
|
COLOR NORMAL_BACK_COLOR = COLOR_LTGRAY;
|
|
|
|
COLOR DISABLED_COLOR = COLOR_GRAY;
|
|
|
|
COLOR DISABLED_BACK_COLOR = MASK_BACK_COLOR;
|
1995-01-02 09:33:00 +00:00
|
|
|
COLOR FOCUS_COLOR = NORMAL_COLOR;
|
|
|
|
COLOR FOCUS_BACK_COLOR = COLOR_CYAN;
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
HIDDEN COLORREF MaskColor = COLOR2RGB(MASK_BACK_COLOR);
|
1995-01-02 09:33:00 +00:00
|
|
|
HIDDEN HBRUSH MaskBrush = 0 ;
|
1994-11-10 14:17:03 +00:00
|
|
|
HIDDEN COLORREF NormalForeColor = COLOR2RGB(NORMAL_COLOR);
|
|
|
|
HIDDEN COLORREF NormalBackColor = COLOR2RGB(NORMAL_BACK_COLOR);
|
1995-01-02 09:33:00 +00:00
|
|
|
HIDDEN HBRUSH NormalBrush = 0;
|
|
|
|
HIDDEN COLORREF FocusForeColor = COLOR2RGB(FOCUS_COLOR);
|
|
|
|
HIDDEN COLORREF FocusBackColor = COLOR2RGB(FOCUS_BACK_COLOR);
|
|
|
|
HIDDEN HBRUSH FocusBrush = 0;
|
1994-11-10 14:17:03 +00:00
|
|
|
|
1994-12-27 14:59:25 +00:00
|
|
|
const word WM_WAKEUP = RegisterWindowMessage("WAKEUP");
|
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
|
|
|
|
// By Matt Pietrek
|
|
|
|
bool allow_another_instance()
|
|
|
|
{
|
|
|
|
HINSTANCE hInstance = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
|
|
|
|
|
|
|
|
HMODULE hModuleSel = SELECTOROF( // Convert the HINSTANCE to an HMODULE
|
|
|
|
GlobalLock(GetModuleHandle((const char*)MAKELP(0,hInstance))));
|
|
|
|
|
|
|
|
if ( hModuleSel == 0 ) // Make sure we succeeded.
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
// Make pointers to the resident names table and the OFSTRUCT
|
|
|
|
LPSTR moduleName = (LPSTR)MAKELP( hModuleSel, *(WORD FAR *)MAKELP(hModuleSel, 0x26));
|
|
|
|
LPSTR fileName = (LPSTR)MAKELP( hModuleSel, *(WORD FAR *)MAKELP(hModuleSel, 0x0A));
|
|
|
|
|
|
|
|
// Get the module name length, and advance to the actual string
|
|
|
|
BYTE cbModuleName = *moduleName++; // First byte is a length byte
|
|
|
|
|
|
|
|
// Convert the first uppercase letter of the modulename to lowercase
|
|
|
|
while ( cbModuleName )
|
|
|
|
{
|
|
|
|
if ( isupper(*moduleName) )
|
|
|
|
{
|
|
|
|
*moduleName = tolower(*moduleName); break;
|
|
|
|
}
|
|
|
|
cbModuleName--; moduleName++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( cbModuleName == 0 ) // Make sure we succeeded
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
// Position to the end of the filename. First byte is a length byte
|
|
|
|
fileName += *fileName - 1;
|
|
|
|
|
|
|
|
// Find the first uppercase letter in the filename. Convert to lowercase
|
|
|
|
while ( TRUE )
|
|
|
|
{
|
|
|
|
// Stop when we come to a directory separator or colon
|
|
|
|
if ( (*fileName=='\\') || (*fileName=='/') || (*fileName==':') )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if ( isupper(*fileName) )
|
|
|
|
{
|
|
|
|
*fileName = tolower(*fileName); break;
|
|
|
|
}
|
|
|
|
fileName--;
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
1994-11-10 14:17:03 +00:00
|
|
|
static BOOLEAN event_hook(HWND hwnd,
|
|
|
|
UINT msg,
|
|
|
|
UINT wparam,
|
|
|
|
ULONG lparam,
|
|
|
|
long* ret)
|
|
|
|
{
|
|
|
|
switch(msg)
|
|
|
|
{
|
|
|
|
case WM_SYSCOLORCHANGE:
|
|
|
|
Ctl3dColorChange();
|
|
|
|
break;
|
|
|
|
case WM_CTLCOLOR:
|
|
|
|
{
|
|
|
|
#ifdef __CTL3D__
|
|
|
|
*ret = Ctl3dCtlColorEx(msg, wparam, lparam);
|
1995-03-22 09:07:04 +00:00
|
|
|
return FALSE; // Non fare altro
|
1994-11-10 14:17:03 +00:00
|
|
|
#else
|
|
|
|
const word type = HIWORD(lparam);
|
|
|
|
if (type == CTLCOLOR_LISTBOX || type == CTLCOLOR_EDIT ||
|
|
|
|
type == CTLCOLOR_MSGBOX)
|
|
|
|
{
|
|
|
|
HWND hwnd = LOWORD(lparam);
|
|
|
|
HDC hdc = wparam;
|
|
|
|
|
|
|
|
if (!IsWindowEnabled(hwnd)) // Campo disabilitato
|
|
|
|
{
|
|
|
|
if (type != CTLCOLOR_MSGBOX)
|
|
|
|
{
|
|
|
|
SetTextColor(hdc, NormalForeColor);
|
|
|
|
SetBkColor(hdc, MaskColor);
|
|
|
|
}
|
|
|
|
*ret = MaskBrush;
|
1995-03-22 09:07:04 +00:00
|
|
|
return FALSE; // Non fare altro
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool focus = GetFocus() == hwnd;
|
|
|
|
if (type != CTLCOLOR_MSGBOX)
|
|
|
|
{
|
|
|
|
SetTextColor(hdc, focus ? FocusForeColor : NormalForeColor);
|
|
|
|
SetBkColor(hdc, focus ? FocusBackColor : NormalBackColor);
|
|
|
|
}
|
|
|
|
*ret = focus ? FocusBrush : NormalBrush;
|
1995-03-22 09:07:04 +00:00
|
|
|
return FALSE; // Non fare altro
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
|
|
{
|
|
|
|
const word notify = HIWORD(lparam);
|
|
|
|
if (notify == EN_KILLFOCUS || notify == EN_SETFOCUS)
|
|
|
|
{
|
|
|
|
HWND hwnd = LOWORD(lparam); // Ridisegna BENE il campo
|
|
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_KEYDOWN:
|
|
|
|
if (wparam == VK_PRIOR || wparam == VK_NEXT ||
|
1995-03-22 09:07:04 +00:00
|
|
|
wparam == VK_UP || wparam == VK_DOWN ||
|
|
|
|
wparam == VK_F1 )
|
1994-11-10 14:17:03 +00:00
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
KEY key = 0;
|
1994-11-10 14:17:03 +00:00
|
|
|
char name[16];
|
|
|
|
GetClassName(hwnd, name, 5);
|
1995-03-22 09:07:04 +00:00
|
|
|
|
|
|
|
if (stricmp(name, "Edit") == 0) switch(wparam)
|
1994-11-10 14:17:03 +00:00
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
case VK_PRIOR:
|
|
|
|
key = K_PREV; break;
|
|
|
|
case VK_NEXT:
|
|
|
|
key = K_NEXT; break;
|
|
|
|
case VK_UP:
|
|
|
|
key = K_UP; break;
|
|
|
|
case VK_DOWN:
|
|
|
|
key = K_DOWN; break;
|
|
|
|
default:
|
|
|
|
key = 0; break;
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
1995-03-22 09:07:04 +00:00
|
|
|
|
|
|
|
if (wparam == VK_F1)
|
|
|
|
key = K_F1;
|
|
|
|
|
|
|
|
if (key > 0)
|
|
|
|
{
|
|
|
|
WINDOW w = cur_win();
|
|
|
|
if (w != NULL_WIN)
|
|
|
|
{
|
|
|
|
dispatch_e_char(w, key);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_MENUCHAR:
|
|
|
|
{
|
|
|
|
WINDOW w = cur_win();
|
|
|
|
if (w != NULL_WIN)
|
|
|
|
{
|
|
|
|
const KEY key = toupper(wparam)+K_CTRL;
|
|
|
|
dispatch_e_char(w, key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
1994-12-27 14:59:25 +00:00
|
|
|
if (msg == WM_WAKEUP && wparam == main_app().waiting())
|
|
|
|
main_app().wake_up();
|
|
|
|
break;
|
1994-11-10 14:17:03 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
return TRUE; // Continua col processo normale
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
HIDDEN WIN_TYPE _wc_type = W_NONE;
|
1994-11-15 11:23:24 +00:00
|
|
|
HIDDEN long _bandiere = 0L;
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
static void createwindow_hook(DWORD* exstyle, LPCSTR* classname, LPCSTR* windowname, DWORD* styl,
|
|
|
|
int* x, int* y, int* width, int* height, HWND* parent, HMENU* menu,
|
|
|
|
HINSTANCE inst, void **)
|
|
|
|
{
|
|
|
|
if (_wc_type == WC_EDIT)
|
|
|
|
{
|
1994-11-15 11:23:24 +00:00
|
|
|
if (_bandiere & CTL_FLAG_MAC_MONACO9)
|
|
|
|
*exstyle |= ES_PASSWORD;
|
|
|
|
}
|
1994-11-10 14:17:03 +00:00
|
|
|
_wc_type = W_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
RCT& resize_rect(short x, short y, short dx, short dy, WIN_TYPE wt, WINDOW parent)
|
|
|
|
{
|
|
|
|
static RCT r;
|
|
|
|
|
|
|
|
if (parent != TASK_WIN)
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
if (xvt_vobj_get_type(parent) == W_PLAIN) // Mask with Toolbar
|
1994-11-10 14:17:03 +00:00
|
|
|
{
|
|
|
|
if (y >= 0) y++;
|
|
|
|
if (x > 0 || (wt != WO_TE && x == 0))
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
RCT pc; xvt_vobj_get_client_rect(parent, &pc); // Get parent window size
|
1994-11-10 14:17:03 +00:00
|
|
|
const int width = pc.right;
|
|
|
|
const int tot = 80*CHARX;
|
|
|
|
if (width > tot) x += (width-tot) / (CHARX<<1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
wt = WC_EDIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
switch (wt)
|
|
|
|
{
|
|
|
|
case WC_EDIT :
|
|
|
|
r.left = (x+1)*CHARX;
|
|
|
|
r.top = y*ROWY;
|
|
|
|
r.right = dx*CHARX;
|
|
|
|
r.bottom = (CHARY << 1) - BASEY;
|
|
|
|
if (dy > 1)
|
|
|
|
r.bottom += ROWY*(dy-1);
|
|
|
|
break;
|
|
|
|
case W_DOC:
|
|
|
|
r.left = x * CHARX;
|
|
|
|
r.top = y * ROWY;
|
|
|
|
r.right = dx * CHARX;
|
|
|
|
r.bottom = dy * CHARY;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
r.left = x * CHARX;
|
|
|
|
r.top = y * ROWY;
|
|
|
|
r.right = (dx+2)*CHARX;
|
|
|
|
r.bottom = dy*ROWY-1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
r.left = x * CHARX;
|
|
|
|
r.top = y * CHARY;
|
|
|
|
r.right = dx * CHARX;
|
|
|
|
r.bottom = dy * CHARY;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (x < 0 || y < 0 || dx <= 0 || dy <= 0)
|
|
|
|
{
|
|
|
|
RCT pc;
|
|
|
|
if (parent == NULL_WIN) parent = TASK_WIN;
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_vobj_get_client_rect(parent, &pc); // Get parent window size
|
1994-11-10 14:17:03 +00:00
|
|
|
const short MAXX = pc.right;
|
|
|
|
const short MAXY = pc.bottom;
|
|
|
|
|
|
|
|
if (x < 0)
|
|
|
|
{
|
|
|
|
x = -x;
|
|
|
|
if (wt != WC_EDIT && x == 1) x = 11;
|
|
|
|
if (x > 10)
|
|
|
|
{
|
|
|
|
const int num = x/10 -1;
|
|
|
|
const int tot = x%10;
|
|
|
|
const int spc = (MAXX - tot*r.right) / (tot+1);
|
|
|
|
r.left = spc + num*(spc+r.right);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
r.left = MAXX - r.right - x*CHARX;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (y < 0)
|
|
|
|
{
|
|
|
|
y = -y;
|
|
|
|
if (wt != WC_EDIT && y == 1) y = 11;
|
|
|
|
if (y > 10)
|
|
|
|
{
|
|
|
|
const int num = y/10 -1;
|
|
|
|
const int tot = y%10;
|
|
|
|
const int spc = (MAXY - tot*r.bottom) / (tot+1);
|
|
|
|
r.top = spc + num*(spc+r.bottom);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
r.top = MAXY - r.bottom - (y-1)*ROWY;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dx <= 0) r.right = MAXX + dx*CHARX;
|
|
|
|
else r.right += r.left;
|
|
|
|
if (dy <= 0) r.bottom = MAXY + dy*ROWY;
|
|
|
|
else r.bottom += r.top;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
r.right += r.left;
|
|
|
|
r.bottom += r.top;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void beep()
|
1995-03-22 09:07:04 +00:00
|
|
|
{ xvt_scr_beep(); }
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Event Handling
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
class TEvent_manager
|
|
|
|
{
|
1994-12-02 13:30:45 +00:00
|
|
|
enum { MAX = 2 };
|
1994-11-10 14:17:03 +00:00
|
|
|
WINDOW _w[MAX];
|
|
|
|
EVENT _e[MAX];
|
|
|
|
int _begin, _end;
|
|
|
|
|
|
|
|
public:
|
|
|
|
TEvent_manager() : _begin(0), _end(0) {}
|
|
|
|
void push(WINDOW win, const EVENT& event);
|
|
|
|
void pop();
|
|
|
|
};
|
|
|
|
|
|
|
|
HIDDEN TEvent_manager EM;
|
|
|
|
|
|
|
|
void TEvent_manager::push(WINDOW w, const EVENT& e)
|
|
|
|
{
|
|
|
|
CHECK(w, "You shouldn't send events to NULL_WIN!");
|
|
|
|
_w[_end] = w;
|
|
|
|
_e[_end] = e;
|
1994-12-02 13:30:45 +00:00
|
|
|
const int next = (_end+1) % MAX;
|
|
|
|
if (next == _begin)
|
1995-03-22 09:07:04 +00:00
|
|
|
warning_box("Hey, clicca piu' piano!");
|
1994-12-02 13:30:45 +00:00
|
|
|
else
|
|
|
|
_end = next;
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TEvent_manager::pop()
|
|
|
|
{
|
|
|
|
if (_begin != _end)
|
|
|
|
{
|
|
|
|
const int i = _begin;
|
|
|
|
_begin = (++_begin) % MAX; // Other events may occur!
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_win_dispatch_event(_w[i], &_e[i]);
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void do_events()
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_app_process_pending_events();
|
1994-11-10 14:17:03 +00:00
|
|
|
EM.pop();
|
|
|
|
#if XVT_OS == XVT_OS_SCOUNIX
|
|
|
|
nap(20);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
KEY e_char_to_key(const EVENT* ep)
|
|
|
|
{
|
|
|
|
CHECK(ep->type == E_CHAR, "I can't convert a Non-E_CHAR event to a key");
|
|
|
|
|
|
|
|
KEY key = ep->v.chr.ch;
|
|
|
|
if (key < K_INS || key > K_HELP)
|
|
|
|
{
|
1994-12-27 14:59:25 +00:00
|
|
|
if (ep->v.chr.shift && (key < ' ' || key >= K_UP)) key += K_SHIFT;
|
|
|
|
if (ep->v.chr.control && key >= ' ') key += K_CTRL;
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
return key;
|
|
|
|
}
|
|
|
|
|
1994-11-29 17:31:42 +00:00
|
|
|
void dispatch_e_menu(WINDOW win, MENU_TAG item)
|
|
|
|
{
|
|
|
|
EVENT e;
|
|
|
|
|
|
|
|
e.type = E_COMMAND;
|
|
|
|
e.v.cmd.tag = item;
|
|
|
|
e.v.cmd.shift = e.v.cmd.control = 0;
|
|
|
|
EM.push(win, e);
|
|
|
|
}
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
void dispatch_e_char(WINDOW win, KEY key)
|
|
|
|
{
|
|
|
|
EVENT e;
|
|
|
|
|
|
|
|
e.type = E_CHAR;
|
|
|
|
|
|
|
|
if (key > 10000) { e.v.chr.control = TRUE; key -= K_CTRL; }
|
|
|
|
else e.v.chr.control = FALSE;
|
|
|
|
|
|
|
|
if (key > 1000) { e.v.chr.shift = TRUE; key -= K_SHIFT; }
|
|
|
|
else e.v.chr.shift = FALSE;
|
|
|
|
|
|
|
|
e.v.chr.ch = short(key);
|
|
|
|
|
|
|
|
EM.push(win, e);
|
|
|
|
}
|
|
|
|
|
|
|
|
void dispatch_e_scroll(WINDOW win, KEY key)
|
|
|
|
{
|
|
|
|
EVENT e;
|
|
|
|
EVENT_TYPE& t = e.type;
|
|
|
|
SCROLL_CONTROL& w = e.v.scroll.what;
|
|
|
|
short& p = e.v.scroll.pos;
|
|
|
|
|
|
|
|
w = SC_NONE;
|
|
|
|
|
|
|
|
switch(key)
|
|
|
|
{
|
|
|
|
case K_HOME:
|
|
|
|
t = E_HSCROLL;
|
|
|
|
w = SC_THUMB;
|
|
|
|
p = 0;
|
|
|
|
break;
|
|
|
|
case K_LHOME:
|
|
|
|
t = E_VSCROLL;
|
|
|
|
w = SC_THUMB;
|
|
|
|
p = 0;
|
|
|
|
break;
|
|
|
|
case K_UP:
|
|
|
|
t = E_VSCROLL;
|
|
|
|
w = SC_LINE_UP;
|
|
|
|
break;
|
|
|
|
case K_DOWN:
|
|
|
|
t = E_VSCROLL;
|
|
|
|
w = SC_LINE_DOWN;
|
|
|
|
break;
|
|
|
|
case K_BTAB:
|
|
|
|
t = E_HSCROLL;
|
|
|
|
w = SC_PAGE_UP;
|
|
|
|
break;
|
|
|
|
case K_TAB:
|
|
|
|
t = E_HSCROLL;
|
|
|
|
w = SC_PAGE_DOWN;
|
|
|
|
break;
|
|
|
|
case K_PREV:
|
|
|
|
t = E_VSCROLL;
|
|
|
|
w = SC_PAGE_UP;
|
|
|
|
break;
|
|
|
|
case K_NEXT:
|
|
|
|
t = E_VSCROLL;
|
|
|
|
w = SC_PAGE_DOWN;
|
|
|
|
break;
|
|
|
|
case K_LEFT:
|
|
|
|
t = E_HSCROLL;
|
|
|
|
w = SC_LINE_UP;
|
|
|
|
break;
|
|
|
|
case K_RIGHT:
|
|
|
|
t = E_HSCROLL;
|
|
|
|
w = SC_LINE_DOWN;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
};
|
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
if (w != SC_NONE) xvt_win_dispatch_event(win, &e);
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void customize_controls(bool on)
|
1995-01-02 09:33:00 +00:00
|
|
|
{
|
|
|
|
TConfig colors(CONFIG_GENERAL, "Colors");
|
|
|
|
|
|
|
|
MASK_BACK_COLOR = colors.get_color("MaskBack", NULL, -1, MASK_BACK_COLOR);
|
1995-01-03 14:19:41 +00:00
|
|
|
MASK_LIGHT_COLOR = colors.get_color("MaskLight", NULL, -1, MASK_LIGHT_COLOR);
|
|
|
|
MASK_DARK_COLOR = colors.get_color("MaskDark", NULL, -1, MASK_DARK_COLOR);
|
1995-01-02 09:33:00 +00:00
|
|
|
NORMAL_COLOR = colors.get_color("Normal", NULL, -1, NORMAL_COLOR);
|
|
|
|
NORMAL_BACK_COLOR = colors.get_color("NormalBack", NULL, -1, NORMAL_BACK_COLOR);
|
|
|
|
DISABLED_COLOR = colors.get_color("Disabled", NULL, -1, DISABLED_COLOR);
|
|
|
|
DISABLED_BACK_COLOR = colors.get_color("DisabledBack", NULL, -1, DISABLED_BACK_COLOR);
|
|
|
|
FOCUS_COLOR = colors.get_color("Focus", NULL, -1, FOCUS_COLOR);
|
|
|
|
FOCUS_BACK_COLOR = colors.get_color("FocusBack", NULL, -1, FOCUS_BACK_COLOR);
|
|
|
|
|
1994-11-10 14:17:03 +00:00
|
|
|
if (on)
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
#if XVTWS == WMWS
|
|
|
|
// xvt_vobj_set_attr(NULL_WIN,ATTR_CH_SHADOW,XVT_CH_SHADOW_WINDOW|XVT_CH_SHADOW_DIALOG);
|
|
|
|
xvt_vobj_set_attr(NULL_WIN, ATTR_CH_TOGGLE_COMBO, (long)K_F9);
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_vobj_set_attr(NULL_WIN,ATTR_WIN_PM_DRAWABLE_TWIN, TRUE);
|
|
|
|
xvt_vobj_set_attr(NULL_WIN,ATTR_EVENT_HOOK, (long)event_hook);
|
|
|
|
xvt_vobj_set_attr(NULL_WIN,ATTR_WIN_CREATEWINDOW_HOOK, (long)createwindow_hook);
|
|
|
|
allow_another_instance();
|
|
|
|
|
|
|
|
HINSTANCE _hInstance = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
|
1994-11-10 14:17:03 +00:00
|
|
|
Ctl3dRegister(_hInstance);
|
|
|
|
Ctl3dAutoSubclass(_hInstance);
|
1995-03-22 09:07:04 +00:00
|
|
|
|
1995-01-02 09:33:00 +00:00
|
|
|
MaskColor = COLOR2RGB(MASK_BACK_COLOR);
|
|
|
|
MaskBrush = CreateSolidBrush(MaskColor);
|
|
|
|
|
|
|
|
NormalForeColor = COLOR2RGB(NORMAL_COLOR);
|
|
|
|
NormalBackColor = COLOR2RGB(NORMAL_BACK_COLOR);
|
|
|
|
NormalBrush = CreateSolidBrush(NormalBackColor);
|
|
|
|
|
|
|
|
FocusForeColor = COLOR2RGB(FOCUS_COLOR);
|
|
|
|
FocusBackColor = COLOR2RGB(FOCUS_BACK_COLOR);
|
|
|
|
FocusBrush = CreateSolidBrush(FocusBackColor);
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
else
|
1995-03-22 09:07:04 +00:00
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
HINSTANCE _hInstance = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
|
1994-11-10 14:17:03 +00:00
|
|
|
Ctl3dUnregister(_hInstance);
|
1995-03-22 09:07:04 +00:00
|
|
|
|
1994-11-10 14:17:03 +00:00
|
|
|
DeleteObject(NormalFont);
|
|
|
|
DeleteObject(MaskBrush);
|
|
|
|
DeleteObject(NormalBrush);
|
|
|
|
DeleteObject(FocusBrush);
|
1995-03-22 09:07:04 +00:00
|
|
|
|
1994-11-10 14:17:03 +00:00
|
|
|
free_controls_bmp();
|
1995-03-22 09:07:04 +00:00
|
|
|
#endif
|
|
|
|
xvt_font_destroy(DEF_FONT);
|
1995-03-28 16:28:10 +00:00
|
|
|
xvt_font_destroy(FAT_FONT);
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
1995-04-11 11:08:15 +00:00
|
|
|
|
1995-04-10 15:28:03 +00:00
|
|
|
if (on) xvt_vobj_set_attr(NULL_WIN,ATTR_ERRMSG_HANDLER, (long)error_hook);
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
XVT_FNTID xvt_default_font()
|
1994-11-10 14:17:03 +00:00
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
if (DEF_FONT == NULL)
|
1994-11-10 14:17:03 +00:00
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
DEF_FONT = xvt_dwin_get_font(TASK_WIN);
|
1995-03-28 16:28:10 +00:00
|
|
|
FAT_FONT = xvt_dwin_get_font(TASK_WIN);
|
1994-11-10 14:17:03 +00:00
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
NormalFont = GetStockObject(ANSI_FIXED_FONT);
|
|
|
|
GetObject(NormalFont, sizeof(LOGFONT), &LogFont);
|
|
|
|
|
|
|
|
TConfig font(CONFIG_GENERAL, "Font");
|
|
|
|
CHARY = (int)font.get_long("Height");
|
|
|
|
if (CHARY > 0)
|
|
|
|
{
|
|
|
|
LogFont.lfHeight = CHARY;
|
|
|
|
LogFont.lfWeight = FontWeight = font.get_int("Weight");
|
|
|
|
LogFont.lfPitchAndFamily = font.get_int("Pitch");
|
|
|
|
strcpy(LogFont.lfFaceName, font.get("Name"));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
LogFont.lfHeight = CHARY = 10;
|
|
|
|
FontWeight = 300; // Normal weight
|
|
|
|
}
|
|
|
|
NormalFont = CreateFontIndirect(&LogFont);
|
|
|
|
|
|
|
|
TToken_string desc(128, '/');
|
1995-03-28 16:28:10 +00:00
|
|
|
desc.add("WIN01"); // 0
|
|
|
|
desc.add(LogFont.lfHeight); // 1
|
|
|
|
desc.add(LogFont.lfWidth); // 2
|
|
|
|
desc.add(LogFont.lfEscapement); // 3
|
|
|
|
desc.add(LogFont.lfOrientation); // 4
|
|
|
|
desc.add(LogFont.lfWeight); // 5
|
|
|
|
desc.add(LogFont.lfItalic); // 6
|
1995-04-06 15:27:09 +00:00
|
|
|
desc.add(LogFont.lfUnderline);
|
|
|
|
desc.add(LogFont.lfStrikeOut);
|
1995-03-22 09:07:04 +00:00
|
|
|
desc.add(LogFont.lfCharSet);
|
|
|
|
desc.add(LogFont.lfOutPrecision);
|
|
|
|
desc.add(LogFont.lfClipPrecision);
|
|
|
|
desc.add(LogFont.lfQuality);
|
|
|
|
desc.add(LogFont.lfPitchAndFamily);
|
|
|
|
desc.add(LogFont.lfFaceName);
|
|
|
|
|
|
|
|
xvt_font_set_native_desc(DEF_FONT, (char*)(const char*)desc);
|
|
|
|
CHECK(xvt_font_has_valid_native_desc(DEF_FONT), "Bad font description");
|
|
|
|
xvt_font_map_using_default(DEF_FONT);
|
|
|
|
CHECK(xvt_font_is_mapped(DEF_FONT), "Can't map native font");
|
|
|
|
xvt_dwin_set_font(TASK_WIN, DEF_FONT);
|
|
|
|
|
1995-03-28 16:28:10 +00:00
|
|
|
desc.add(600, 5);
|
|
|
|
xvt_font_set_native_desc(FAT_FONT, (char*)(const char*)desc);
|
|
|
|
CHECK(xvt_font_has_valid_native_desc(FAT_FONT), "Bad font description");
|
|
|
|
xvt_font_map_using_default(FAT_FONT);
|
1995-04-06 15:27:09 +00:00
|
|
|
CHECK(xvt_font_is_mapped(FAT_FONT), "Can't map native font");
|
1995-03-22 09:07:04 +00:00
|
|
|
// Get true text size
|
|
|
|
TEXTMETRIC tm;
|
|
|
|
HWND hdc = (HDC)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_GRAPHIC_CONTEXT);
|
|
|
|
GetTextMetrics(hdc, &tm);
|
|
|
|
|
|
|
|
const int COLX = GetSystemMetrics(SM_CXSCREEN) / 80;
|
|
|
|
CHARX = tm.tmAveCharWidth+1;
|
|
|
|
if (CHARX > COLX) CHARX = COLX;
|
|
|
|
|
|
|
|
CHARY = tm.tmHeight;
|
|
|
|
BASEY = tm.tmAscent;
|
|
|
|
if (CHARY > ROWY-2) CHARY = ROWY-2;
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
1995-03-27 14:46:49 +00:00
|
|
|
}
|
1994-11-10 14:17:03 +00:00
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
return DEF_FONT;
|
|
|
|
}
|
|
|
|
|
|
|
|
void xvt_set_font(WINDOW win, const char* family, int style, int dim)
|
1994-11-10 14:17:03 +00:00
|
|
|
{
|
|
|
|
CHECK(win != NULL_WIN, "Can't set the font in a NULL window");
|
|
|
|
|
1995-03-27 14:46:49 +00:00
|
|
|
#if XVT_OS != XVT_OS_SCOUNIX
|
1995-03-28 16:28:10 +00:00
|
|
|
if ((family == NULL || *family == '\0') &&
|
|
|
|
(style == XVT_FS_NONE || style == XVT_FS_BOLD) &&
|
|
|
|
dim == 0)
|
|
|
|
{
|
|
|
|
xvt_dwin_set_font(win, (style == XVT_FS_NONE) ? DEF_FONT : FAT_FONT);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
XVT_FNTID font = xvt_dwin_get_font(TASK_WIN);
|
|
|
|
if (family && *family) xvt_font_set_family(font, (char*)family);
|
|
|
|
if (dim != 0) xvt_font_set_size(font, dim);
|
|
|
|
if (style != XVT_FS_NONE) xvt_font_set_style(font, style);
|
1995-04-06 15:27:09 +00:00
|
|
|
|
|
|
|
if(!xvt_font_is_mapped(font))
|
|
|
|
xvt_font_map(font, win);
|
1995-03-28 16:28:10 +00:00
|
|
|
|
|
|
|
xvt_dwin_set_font(win, font);
|
|
|
|
xvt_font_destroy(font);
|
|
|
|
}
|
1995-03-27 14:46:49 +00:00
|
|
|
#endif
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WINDOW xvt_create_window(WIN_TYPE wt,
|
|
|
|
short x, short y, short dx, short dy,
|
1995-01-02 09:33:00 +00:00
|
|
|
const char* caption,
|
|
|
|
int menu,
|
|
|
|
WINDOW parent,
|
|
|
|
long flags,
|
|
|
|
EVENT_HANDLER eh, long app_data
|
1994-11-10 14:17:03 +00:00
|
|
|
)
|
|
|
|
{
|
|
|
|
RCT& rect = resize_rect(x, y, dx, dy, wt, parent);
|
|
|
|
|
|
|
|
if (wt == WD_MODAL) wt = W_DOC;
|
1995-03-22 09:07:04 +00:00
|
|
|
WINDOW win = xvt_win_create(wt,
|
|
|
|
&rect,
|
|
|
|
(char*)caption,
|
|
|
|
menu, parent,
|
|
|
|
flags,
|
|
|
|
EM_ALL, eh,
|
|
|
|
app_data);
|
1994-11-10 14:17:03 +00:00
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
CHECK(win, "Can't create a window: XVT error");
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
static bool to_set = TRUE;
|
1995-03-22 09:07:04 +00:00
|
|
|
HWND hwnd = (HWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
|
1994-11-10 14:17:03 +00:00
|
|
|
if (to_set)
|
|
|
|
{
|
|
|
|
word style = GetClassWord(hwnd, GCW_STYLE);
|
|
|
|
style |= CS_BYTEALIGNCLIENT;
|
|
|
|
SetClassWord(hwnd, GCW_STYLE, style);
|
|
|
|
to_set = FALSE;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return win;
|
|
|
|
}
|
|
|
|
|
|
|
|
WINDOW xvt_create_control(WIN_TYPE wt,
|
|
|
|
short x, short y, short dx, short dy,
|
|
|
|
const char* caption,
|
|
|
|
WINDOW parent,
|
|
|
|
long flags,
|
|
|
|
long app_data,
|
|
|
|
int id)
|
|
|
|
{
|
|
|
|
RCT r = resize_rect(x, y, dx, dy, wt, parent);
|
|
|
|
WINDOW win = NULL_WIN;
|
|
|
|
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
_wc_type = wt;
|
1994-11-15 11:23:24 +00:00
|
|
|
_bandiere = flags;
|
|
|
|
flags &= ~(CTL_FLAG_MAC_MONACO9 | CTL_FLAG_MAC_GENEVA9);
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
if (wt == WC_PUSHBUTTON)
|
|
|
|
win = xvt_create_pushbutton(r.left, r.top, r.right, r.bottom,
|
|
|
|
caption, parent, flags, app_data, id);
|
|
|
|
|
|
|
|
#ifndef __CTL3D__
|
|
|
|
if (wt == WC_CHECKBOX)
|
|
|
|
win = xvt_create_checkbox(r.left, r.top, r.right, r.bottom,
|
|
|
|
caption, parent, flags, app_data, id);
|
|
|
|
|
|
|
|
if (wt == WC_RADIOBUTTON)
|
|
|
|
win = xvt_create_radiobutton(r.left, r.top, r.right, r.bottom,
|
|
|
|
caption, parent, flags, app_data, id);
|
|
|
|
|
|
|
|
if (wt == WC_GROUPBOX)
|
|
|
|
{
|
|
|
|
win = xvt_create_groupbox(r.left, r.top, r.right, r.bottom,
|
|
|
|
caption, parent, flags, app_data, id);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (wt == WC_TEXT)
|
|
|
|
{
|
|
|
|
win = xvt_create_text(r.left, r.top, r.right, r.bottom,
|
|
|
|
caption, parent, flags, app_data, id);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
if (wt == WC_GROUPBOX)
|
|
|
|
{
|
|
|
|
win = xvt_create_text(r.left, r.top, r.right, r.top+CHARY,
|
|
|
|
caption, parent, flags, app_data, id);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (win == NULL_WIN)
|
|
|
|
{
|
|
|
|
if (wt == WC_PUSHBUTTON)
|
|
|
|
{
|
|
|
|
if (dy == 2) r.bottom -= ROWY;
|
|
|
|
if (id == DLG_F9)
|
|
|
|
{ wt = WC_TEXT; r.right = r.left+CHARX; caption = "*"; }
|
1994-11-15 11:23:24 +00:00
|
|
|
else if (*caption == '*') caption = "";
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
1994-11-15 11:23:24 +00:00
|
|
|
|
1994-11-10 14:17:03 +00:00
|
|
|
while (*caption == '@') caption += 2;
|
1995-03-22 09:07:04 +00:00
|
|
|
win = xvt_ctl_create(wt, &r, (char*)caption, parent,
|
1994-11-10 14:17:03 +00:00
|
|
|
flags, app_data, id);
|
1994-11-22 18:09:03 +00:00
|
|
|
|
|
|
|
if (win == NULL_WIN)
|
1995-03-22 09:07:04 +00:00
|
|
|
fatal_box("Can't create control %d", id);
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
#ifdef __CTL3D__
|
|
|
|
if (wt != WC_PUSHBUTTON)
|
|
|
|
#else
|
|
|
|
if (wt == WC_EDIT || wt == WC_LISTBUTTON)
|
|
|
|
#endif
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
HWND hwnd = (HWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
|
1994-11-15 11:23:24 +00:00
|
|
|
SendMessage(hwnd, WM_SETFONT, NormalFont, FALSE);
|
|
|
|
if (_bandiere & CTL_FLAG_MAC_MONACO9)
|
|
|
|
SendMessage(hwnd, EM_SETPASSWORDCHAR, (WORD)'#', 0);
|
1994-11-10 14:17:03 +00:00
|
|
|
#ifdef __CTL3D__
|
|
|
|
Ctl3dSubclassCtl(hwnd);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return win;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const char* xvt_get_title(WINDOW win)
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN && !defined(__CTL3D__)
|
|
|
|
const TControl* c = TControl::WINDOW2TControl(win);
|
|
|
|
return c->caption();
|
|
|
|
#else
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_vobj_get_title(win, __tmp_string, 80);
|
1994-11-10 14:17:03 +00:00
|
|
|
return __tmp_string;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
1995-02-01 18:04:04 +00:00
|
|
|
void xvt_set_title(WINDOW win, const char* cap)
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN && !defined(__CTL3D__)
|
|
|
|
TControl* c = TControl::WINDOW2TControl(win);
|
|
|
|
c->set_caption(cap);
|
|
|
|
#else
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_vobj_set_title(win, cap);
|
1995-02-01 18:04:04 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1994-11-10 14:17:03 +00:00
|
|
|
void xvt_set_front_control(WINDOW win)
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN && !defined(__CTL3D__)
|
|
|
|
TControl* c = TControl::WINDOW2TControl(win);
|
|
|
|
c->focus(TRUE);
|
|
|
|
#endif
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_scr_set_focus_vobj(win);
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void xvt_enable_control(WINDOW win, bool on)
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN && !defined(__CTL3D__)
|
|
|
|
TControl* c = TControl::WINDOW2TControl(win);
|
|
|
|
c->enable(on);
|
|
|
|
#else
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_vobj_set_enabled(win, on);
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void xvt_check_box(WINDOW win, bool on)
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN && !defined(__CTL3D__)
|
|
|
|
TControl* c = (TControl*)TControl::WINDOW2TControl(win);
|
|
|
|
c->check(on);
|
|
|
|
#else
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_ctl_set_checked(win, on);
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool xvt_get_checked_state(WINDOW win)
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN && !defined(__CTL3D__)
|
|
|
|
TControl* c = TControl::WINDOW2TControl(win);
|
|
|
|
return c->checked();
|
|
|
|
#else
|
1995-03-22 09:07:04 +00:00
|
|
|
return xvt_ctl_is_checked(win) ? TRUE : FALSE;
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void xvt_check_radio_button(WINDOW win, const WINDOW* ctls, int count)
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN && !defined(__CTL3D__)
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
xvt_check_box(ctls[i], ctls[i] == win);
|
|
|
|
#else
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_ctl_check_radio_button(win, (WINDOW*)ctls, count);
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int xvt_get_checked_radio(const WINDOW* ctls, int count)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < count; i++)
|
|
|
|
if (xvt_get_checked_state(ctls[i])) return i;
|
|
|
|
|
|
|
|
#ifdef DBG
|
|
|
|
error_box("Accendi la tua radio per favore!");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Gestione Status bar
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
HIDDEN WINDOW _statbar = NULL_WIN;
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
WINDOW xvt_create_statbar()
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
CHECK(_statbar == NULL_WIN, "Onli uan stabar, plis");
|
1994-11-10 14:17:03 +00:00
|
|
|
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
const int prop_count = 4;
|
|
|
|
char* prop_list[prop_count+1] =
|
|
|
|
{
|
|
|
|
"Status bar",
|
|
|
|
"HEIGHT=24",
|
|
|
|
"TASK_WIN",
|
|
|
|
"FIELD_OFFSET=24",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
_statbar = statbar_create(0, 0, 600, 1024, 800, prop_count, prop_list,
|
|
|
|
TASK_WIN, 0, 0, "");
|
|
|
|
CHECK(_statbar, "Can't create the status bar");
|
1994-11-10 14:17:03 +00:00
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
statbar_set_fontid(_statbar, xvt_default_font());
|
|
|
|
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
|
1995-03-22 09:07:04 +00:00
|
|
|
return _statbar;
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void xvt_statbar_set(const char* text, bool def)
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
|
|
|
const TDate oggi(TODAY);
|
1995-01-26 13:57:53 +00:00
|
|
|
TString256 t(text);
|
|
|
|
t << '\t' << oggi.string() << " - " << main_app().title();
|
1994-11-10 14:17:03 +00:00
|
|
|
if (def)
|
1995-03-22 09:07:04 +00:00
|
|
|
statbar_set_default_title(_statbar, (char*)(const char*)t);
|
|
|
|
statbar_set_title(_statbar, (char*)(const char*)t);
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void xvt_statbar_refresh()
|
|
|
|
{
|
|
|
|
#if XVT_OS == XVT_OS_WIN
|
1995-03-22 09:07:04 +00:00
|
|
|
statbar_set_title(_statbar, NULL);
|
1994-11-10 14:17:03 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Test menu
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
HIDDEN bool test_menu_tag(MENU_ITEM* mi, MENU_TAG tag)
|
|
|
|
{
|
|
|
|
while (mi->tag)
|
|
|
|
{
|
|
|
|
if (mi->tag == tag) return TRUE;
|
|
|
|
if (mi->child != NULL)
|
|
|
|
{
|
|
|
|
const bool ok = test_menu_tag(mi->child, tag);
|
|
|
|
if (ok) return TRUE;
|
|
|
|
}
|
|
|
|
mi++;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool xvt_test_menu_tag(MENU_TAG tag)
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
MENU_ITEM *mi = xvt_menu_get_tree(TASK_WIN);
|
1994-11-10 14:17:03 +00:00
|
|
|
const bool ok = test_menu_tag(mi, tag);
|
1995-03-22 09:07:04 +00:00
|
|
|
xvt_res_free_menu_tree(mi);
|
1994-11-10 14:17:03 +00:00
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// translation of graphics attributes from codes chars
|
|
|
|
// used by print functions
|
|
|
|
|
|
|
|
COLOR trans_color(char c)
|
1995-03-22 09:07:04 +00:00
|
|
|
{
|
|
|
|
COLOR col;
|
1994-11-10 14:17:03 +00:00
|
|
|
switch (c)
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
case 'b':
|
|
|
|
col = COLOR_BLUE; break;
|
|
|
|
case 'c':
|
|
|
|
col = COLOR_CYAN; break;
|
|
|
|
case 'd':
|
|
|
|
col = COLOR_DKGRAY; break;
|
|
|
|
case 'g':
|
|
|
|
col = COLOR_GREEN; break;
|
|
|
|
case 'k':
|
|
|
|
col = COLOR_GRAY; break;
|
|
|
|
case 'l':
|
|
|
|
col = COLOR_LTGRAY; break;
|
|
|
|
case 'm':
|
|
|
|
col = MASK_BACK_COLOR; break;
|
|
|
|
case 'n':
|
|
|
|
col = COLOR_BLACK; break;
|
|
|
|
case 'r':
|
|
|
|
col = COLOR_RED; break;
|
|
|
|
case 'v':
|
|
|
|
col = COLOR_MAGENTA; break;
|
|
|
|
case 'w':
|
|
|
|
col = COLOR_WHITE; break;
|
|
|
|
case 'y':
|
|
|
|
col = COLOR_YELLOW; break;
|
|
|
|
default:
|
|
|
|
CHECK(0,"trans_color: Undefined color"); break;
|
|
|
|
}
|
|
|
|
return col;
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
PAT_STYLE trans_brush(char p)
|
|
|
|
{
|
|
|
|
switch (p)
|
|
|
|
{
|
1995-03-22 09:07:04 +00:00
|
|
|
case 'n' :
|
|
|
|
return PAT_NONE; break;
|
|
|
|
case 'h' :
|
|
|
|
return PAT_HOLLOW; break;
|
|
|
|
case 's' :
|
|
|
|
return PAT_SOLID; break;
|
|
|
|
case '-' :
|
|
|
|
return PAT_HORZ; break;
|
|
|
|
case '|' :
|
|
|
|
return PAT_VERT; break;
|
|
|
|
case '/' :
|
|
|
|
return PAT_FDIAG; break;
|
|
|
|
case '\\':
|
|
|
|
return PAT_BDIAG; break;
|
|
|
|
case 'X' :
|
|
|
|
return PAT_DIAGCROSS; break;
|
|
|
|
case '+' :
|
|
|
|
return PAT_CROSS; break;
|
|
|
|
default :
|
|
|
|
CHECK(0,"trans_brush: Undefined pattern"); break;
|
|
|
|
}
|
1994-11-10 14:17:03 +00:00
|
|
|
return PAT_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PEN_STYLE trans_pen(char p)
|
1995-01-02 09:33:00 +00:00
|
|
|
{
|
|
|
|
PEN_STYLE ps = P_SOLID;
|
1994-11-10 14:17:03 +00:00
|
|
|
switch (p)
|
|
|
|
{
|
1995-01-02 09:33:00 +00:00
|
|
|
case 'n' :
|
|
|
|
ps = P_SOLID; break;
|
|
|
|
case '.' :
|
|
|
|
ps = P_DOT; break;
|
|
|
|
case '-' :
|
|
|
|
ps = P_DASH; break;
|
|
|
|
default:
|
|
|
|
CHECK(0, "trans_pen: Undefined pattern"); break;
|
|
|
|
}
|
|
|
|
return ps;
|
1994-11-10 14:17:03 +00:00
|
|
|
}
|
|
|
|
|