Tue Feb 1 21:14:47 1994 Bob Amstadt (bob@pooh) * [loader/selector.c] Added function CreateNewSegments(). Modified IPCCopySelector to allow aliasing to any arbitrary memory space. * [memory/global.c] Fixed potential bug in GlobalGetFreeSegments(). * [memory/linear.c] Created functions GlobalLinearLock() and GlobalLinearUnlock(). Tue Feb 1 05:51:43 1994 julliard@di.epfl.ch (Alexandre Julliard) * [controls/widgets.c] Removed CAPTION window class. * [loader/cursor.c] Bug fix in LoadCursor(): don't allocate memory every time for built-in cursors. * [windows/clipping.c] Invalidate child windows in InvalidateRgn(). * [windows/defwnd.c] Added repaint of the caption when changing window text. * [windows/event.c] Modified SetCapture() to allow keyboard events while capturing. * [windows/message.c] New function MSG_GetHardwareMessage(), to do mouse tracking without returning control to the Windows program. * [windows/nonclient.c] A couple of changes in frame drawing for DLGMODALFRAME windows. Rewritten window moving code, to use MSG_GetHardwareMessage() instead of non-client mouse events (this is the way Windows does it), and to send WM_ENTERSIZEMOVE messages. Removed WM_NCBUTTONUP and WM_NCMOUSEMOVE handlers. * [windows/win.c] Allocate temporary structures on the USER heap instead of using GlobalAlloc(). * [windows/winpos.c] Added function WINPOS_GetMinMaxInfo() to get sizing informations. Jan 31, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [windows/nonclient.c] Call to StdDrawScrollBar() during NC's drawing. Call to NC_ScrollBarButtonDown() on NC mouse events WM_LBUTTONDOWN. Call to NC_ScrollBarButtonUp() on NC mouse events WM_LBUTTONUP. Call to NC_ScrollBarMouseMove() on NC mouse events WM_MOUSEMOVE. * [controls/menu.c] New GetSubMenu() function. Move GetMenu() & SetMenu() functions from 'windows/win.c'. * [controls/listbox.c] Start changes to satisfy recent changes in scrollbars/windows. * [loader/resource.c] Put some code in LoadAccelerators() stub. New TranslateAccelerator() function. * [windows/win.c] Remove GetMenu() & SetMenu() functions. Call to NC_CreateScrollBars() if required by CreateWindow(). Mon Jan 24 10:40:10 EST 1994 John Richardson (jrichard@cs.uml.edu) * [window/win.c] Added functions EnumWindows, EnumChildWindows, and helper WIN_EnumChildWin. EnumWindows won't list all wine windows because GetDesktopWindow isn't complete. However, the code is in place for it to work correctly and only needs GetDesktopWindow to do so. Tue Jan 25 05:51:47 1994 julliard@di.epfl.ch (Alexandre Julliard) * [windows/defwnd.c] Added handling of activation messages (WM_ACTIVATE, WM_NCACTIVATE, WM_MOUSEACTIVATE) * [windows/event.c] De-activate the window when losing input focus. * [windows/focus.c] Bug fix in SetFocus(). * [windows/message.c] Added activation of the window on mouse-clicks. * [windows/nonclient.c] Changed non-client area painting to use the correct colors depending upon the activation state. Added WM_NCACTIVATE message handling. Fixed a couple of bugs in window moving and resizing. * [windows/winpos.c] Implemented Get/SetActiveWindow(). Implemented SWP_NOACTIVATE flag in SetWindowPos(). Jan 17, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [misc/message.c] MessageBox has a CaptionBar for his title except for MB_SYSTEMMODAL with MB_ICONHAND. * [windows/nonclient.c] Call to NC_TrackSysMenu on SysMenu button mouse click. * [windows/defwnd.c] Call to NC_TrackSysMenu on Alt key (VK_MENU). * [controls/menu.c] New GetSystemMenu() function. New CopySystemMenu() internal function. New NC_TrackSysMenu() internal function. * [include/windows.h] New WM_INITMENU, WM_INITMENUPOPUP, WM_MENUSELECT & WM_MENUCHAR defines.
367 lines
12 KiB
C
367 lines
12 KiB
C
/*
|
|
* Interface code to COMBOBOX widget
|
|
*
|
|
* Copyright Martin Ayotte, 1993
|
|
*
|
|
*/
|
|
|
|
/*
|
|
#define DEBUG_COMBO
|
|
*/
|
|
|
|
static char Copyright[] = "Copyright Martin Ayotte, 1993";
|
|
|
|
#include <X11/Intrinsic.h>
|
|
#include <X11/StringDefs.h>
|
|
#include "windows.h"
|
|
#include "combo.h"
|
|
#include "heap.h"
|
|
#include "win.h"
|
|
#include <sys/types.h>
|
|
#include <dirent.h>
|
|
#include <sys/stat.h>
|
|
|
|
HBITMAP hComboBit = 0;
|
|
|
|
LPHEADCOMBO ComboGetStorageHeader(HWND hwnd);
|
|
int CreateComboStruct(HWND hwnd);
|
|
|
|
|
|
/***********************************************************************
|
|
* ComboWndProc
|
|
*/
|
|
LONG ComboBoxWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
|
|
{
|
|
WORD wRet;
|
|
RECT rect;
|
|
int y, count;
|
|
int width, height;
|
|
int AltState;
|
|
WND *wndPtr;
|
|
LPHEADCOMBO lphc;
|
|
LPDRAWITEMSTRUCT lpdis;
|
|
HDC hMemDC;
|
|
BITMAP bm;
|
|
char str[128];
|
|
PAINTSTRUCT paintstruct;
|
|
static RECT rectsel;
|
|
switch(message)
|
|
{
|
|
case WM_CREATE:
|
|
ShowScrollBar(hwnd, SB_BOTH, FALSE);
|
|
GetClientRect(hwnd, &rect);
|
|
width = rect.right - rect.left;
|
|
height = rect.bottom - rect.top;
|
|
/* SetWindowPos(hwnd, 0, 0, 0, width, 16,
|
|
SWP_NOMOVE | SWP_NOZORDER); */
|
|
CreateComboStruct(hwnd);
|
|
wndPtr = WIN_FindWndPtr(hwnd);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
if (lphc == NULL) return 0;
|
|
#ifdef DEBUG_COMBO
|
|
printf("Combo WM_CREATE %lX !\n", lphc);
|
|
#endif
|
|
if (hComboBit == (HBITMAP)NULL)
|
|
hComboBit = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_COMBO));
|
|
lphc->hWndDrop = CreateWindow("BUTTON", "",
|
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_OWNERDRAW,
|
|
width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
|
|
if (wndPtr->dwStyle & CBS_SIMPLE)
|
|
/* lphc->hWndEdit = CreateWindow("EDIT", "", */
|
|
lphc->hWndEdit = CreateWindow("STATIC", "",
|
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
|
|
0, 0, width - 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
|
|
else
|
|
lphc->hWndEdit = CreateWindow("STATIC", "",
|
|
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
|
|
0, 0, width - 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
|
|
lphc->hWndLBox = CreateWindow("LISTBOX", "",
|
|
WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
|
|
wndPtr->rectClient.left, wndPtr->rectClient.top + 16, width, height,
|
|
wndPtr->hwndParent, 1, wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
|
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
|
#ifdef DEBUG_COMBO
|
|
printf("Combo Creation Drop=%X LBox=%X!\n", lphc->hWndDrop, lphc->hWndLBox);
|
|
#endif
|
|
return 0;
|
|
case WM_DESTROY:
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
if (lphc == 0) return 0;
|
|
/*
|
|
DestroyWindow(lphc->hWndDrop);
|
|
DestroyWindow(lphc->hWndEdit);
|
|
*/
|
|
DestroyWindow(lphc->hWndLBox);
|
|
free(lphc);
|
|
/*
|
|
*((LPHEADCOMBO *)&wndPtr->wExtra[1]) = 0;
|
|
printf("Combo WM_DESTROY after clearing wExtra !\n");
|
|
*/
|
|
#ifdef DEBUG_COMBO
|
|
printf("Combo WM_DESTROY %lX !\n", lphc);
|
|
#endif
|
|
return DefWindowProc( hwnd, message, wParam, lParam );
|
|
|
|
case WM_COMMAND:
|
|
wndPtr = WIN_FindWndPtr(hwnd);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
if (lphc == NULL) return 0;
|
|
if (LOWORD(lParam) == lphc->hWndDrop) {
|
|
if (HIWORD(lParam) != BN_CLICKED) return 0;
|
|
#ifdef DEBUG_COMBO
|
|
printf("CB_SHOWDROPDOWN !\n");
|
|
#endif
|
|
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
|
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
|
|
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
|
/*
|
|
SetFocus(lphc->hWndLBox);
|
|
*/
|
|
}
|
|
else {
|
|
/*
|
|
SetFocus(lphc->hWndEdit);
|
|
*/
|
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
|
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
|
if (y != LB_ERR) {
|
|
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
|
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
|
}
|
|
}
|
|
}
|
|
if (LOWORD(lParam) == lphc->hWndLBox) {
|
|
switch(HIWORD(lParam))
|
|
{
|
|
case LBN_SELCHANGE:
|
|
lphc->dwState = lphc->dwState & (CB_SHOWDROPDOWN ^ 0xFFFFFFFFL);
|
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
|
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
|
if (y != LB_ERR) {
|
|
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
|
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
|
}
|
|
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
|
|
MAKELONG(hwnd, CBN_SELCHANGE));
|
|
break;
|
|
case LBN_DBLCLK:
|
|
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
|
|
MAKELONG(hwnd, CBN_DBLCLK));
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case WM_LBUTTONDOWN:
|
|
printf("Combo WM_LBUTTONDOWN wParam=%x lParam=%lX !\n", wParam, lParam);
|
|
wndPtr = WIN_FindWndPtr(hwnd);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
|
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN)
|
|
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
|
break;
|
|
case WM_KEYDOWN:
|
|
wndPtr = WIN_FindWndPtr(hwnd);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
|
count = SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L);
|
|
printf("COMBOBOX // GetKeyState(VK_MENU)=%d\n", GetKeyState(VK_MENU));
|
|
if (GetKeyState(VK_MENU) < 0) {
|
|
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
|
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
|
|
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
|
}
|
|
else {
|
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
|
y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
|
|
if (y != LB_ERR) {
|
|
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
|
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch(wParam) {
|
|
case VK_HOME:
|
|
y = 0;
|
|
break;
|
|
case VK_END:
|
|
y = count - 1;
|
|
break;
|
|
case VK_UP:
|
|
y--;
|
|
break;
|
|
case VK_DOWN:
|
|
y++;
|
|
break;
|
|
}
|
|
if (y < 0) y = 0;
|
|
if (y >= count) y = count - 1;
|
|
SendMessage(lphc->hWndLBox, LB_SETCURSEL, y, 0L);
|
|
SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
|
|
SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
|
|
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
|
|
MAKELONG(hwnd, CBN_SELCHANGE));
|
|
}
|
|
break;
|
|
case WM_CTLCOLOR:
|
|
return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
|
|
case WM_DRAWITEM:
|
|
#ifdef DEBUG_SCROLL
|
|
printf("ComboBox WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
|
|
#endif
|
|
lpdis = (LPDRAWITEMSTRUCT)lParam;
|
|
if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_DRAWENTIRE) {
|
|
hMemDC = CreateCompatibleDC(lpdis->hDC);
|
|
GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
|
|
SelectObject(hMemDC, hComboBit);
|
|
BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
|
DeleteDC(hMemDC);
|
|
}
|
|
if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_SELECT) {
|
|
CopyRect(&rect, &lpdis->rcItem);
|
|
InflateRect(&rect, -1, -1);
|
|
DrawReliefRect(lpdis->hDC, rect, 1, 1);
|
|
}
|
|
break;
|
|
case WM_PAINT:
|
|
BeginPaint( hwnd, &paintstruct );
|
|
EndPaint( hwnd, &paintstruct );
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
InvalidateRect(lphc->hWndEdit, NULL, TRUE);
|
|
UpdateWindow(lphc->hWndEdit);
|
|
InvalidateRect(lphc->hWndDrop, NULL, TRUE);
|
|
UpdateWindow(lphc->hWndDrop);
|
|
if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
|
|
InvalidateRect(lphc->hWndLBox, NULL, TRUE);
|
|
UpdateWindow(lphc->hWndLBox);
|
|
}
|
|
break;
|
|
case CB_ADDSTRING:
|
|
#ifdef DEBUG_COMBO
|
|
printf("CB_ADDSTRING '%s' !\n", (LPSTR)lParam);
|
|
#endif
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_ADDSTRING, wParam, lParam));
|
|
case CB_GETLBTEXT:
|
|
printf("CB_GETLBTEXT #%u !\n", wParam);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam));
|
|
case CB_GETLBTEXTLEN:
|
|
printf("CB_GETLBTEXTLEN !\n");
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_GETTEXTLEN, wParam, lParam));
|
|
case CB_INSERTSTRING:
|
|
printf("CB_INSERTSTRING '%s' !\n", (LPSTR)lParam);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam));
|
|
case CB_DELETESTRING:
|
|
printf("CB_DELETESTRING #%u !\n", wParam);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_DELETESTRING, wParam, 0L));
|
|
case CB_RESETCONTENT:
|
|
printf("CB_RESETCONTENT !\n");
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L));
|
|
case CB_DIR:
|
|
printf("ComboBox CB_DIR !\n");
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_DIR, wParam, lParam));
|
|
case CB_FINDSTRING:
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam));
|
|
case CB_GETCOUNT:
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_GETCOUNT, 0, 0L));
|
|
case CB_GETCURSEL:
|
|
printf("ComboBox CB_GETCURSEL !\n");
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L));
|
|
case CB_SETCURSEL:
|
|
printf("ComboBox CB_SETCURSEL wParam=%X !\n", wParam);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_SETCURSEL, wParam, 0L));
|
|
case CB_GETEDITSEL:
|
|
printf("ComboBox CB_GETEDITSEL !\n");
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
/* return(SendMessage(lphc->hWndEdit, EM_GETSEL, 0, 0L)); */
|
|
break;
|
|
case CB_SETEDITSEL:
|
|
printf("ComboBox CB_SETEDITSEL lParam=%lX !\n", lParam);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
/* return(SendMessage(lphc->hWndEdit, EM_SETSEL, 0, lParam)); */
|
|
break;
|
|
case CB_SELECTSTRING:
|
|
printf("ComboBox CB_SELECTSTRING !\n");
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
break;
|
|
case CB_SHOWDROPDOWN:
|
|
printf("ComboBox CB_SHOWDROPDOWN !\n");
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
lphc->dwState = lphc->dwState | CB_SHOWDROPDOWN;
|
|
if (wParam != 0) {
|
|
ShowWindow(lphc->hWndLBox, SW_SHOW);
|
|
}
|
|
else {
|
|
lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
|
|
ShowWindow(lphc->hWndLBox, SW_HIDE);
|
|
SendMessage(GetParent(hwnd), WM_COMMAND, wndPtr->wIDmenu,
|
|
MAKELONG(hwnd, CBN_DROPDOWN));
|
|
}
|
|
break;
|
|
case CB_GETITEMDATA:
|
|
printf("ComboBox CB_GETITEMDATA wParam=%X !\n", wParam);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_GETITEMDATA, wParam, 0L));
|
|
break;
|
|
case CB_SETITEMDATA:
|
|
printf("ComboBox CB_SETITEMDATA wParam=%X lParam=%lX !\n", wParam, lParam);
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
return(SendMessage(lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam));
|
|
break;
|
|
case CB_LIMITTEXT:
|
|
printf("ComboBox CB_LIMITTEXT !\n");
|
|
lphc = ComboGetStorageHeader(hwnd);
|
|
/* return(SendMessage(lphc->hWndEdit, EM_LIMITTEXT, wParam, 0L)); */
|
|
break;
|
|
|
|
default:
|
|
return DefWindowProc( hwnd, message, wParam, lParam );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
LPHEADCOMBO ComboGetStorageHeader(HWND hwnd)
|
|
{
|
|
WND *wndPtr;
|
|
LPHEADCOMBO lphc;
|
|
wndPtr = WIN_FindWndPtr(hwnd);
|
|
if (wndPtr == 0) {
|
|
printf("Bad Window handle on ComboBox !\n");
|
|
return 0;
|
|
}
|
|
lphc = *((LPHEADCOMBO *)&wndPtr->wExtra[1]);
|
|
return lphc;
|
|
}
|
|
|
|
|
|
|
|
int CreateComboStruct(HWND hwnd)
|
|
{
|
|
WND *wndPtr;
|
|
LPHEADCOMBO lphc;
|
|
wndPtr = WIN_FindWndPtr(hwnd);
|
|
if (wndPtr == 0) {
|
|
printf("Bad Window handle on ComboBox !\n");
|
|
return 0;
|
|
}
|
|
lphc = (LPHEADCOMBO)malloc(sizeof(HEADCOMBO));
|
|
*((LPHEADCOMBO *)&wndPtr->wExtra[1]) = lphc;
|
|
lphc->dwState = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|