/* --------------------------------------------------------------------- * ListboxNew * Create a list box dialog control * --------------------------------------------------------------------- */ CUIWINDOW* ListboxNew(CUIWINDOW* parent, const wchar_t* text, int x, int y, int w, int h, int id, int sflags, int cflags) { if (parent) { CUIWINDOW* listbox; int flags = sflags | CWS_TABSTOP | CWS_BORDER; flags &= ~(cflags); listbox = WindowNew(parent, x, y, w, h, flags); listbox->Class = _T("LISTBOX"); WindowSetId(listbox, id); WindowSetNcPaintHook(listbox, ListboxNcPaintHook); WindowSetPaintHook(listbox, ListboxPaintHook); WindowSetKeyHook(listbox, ListboxKeyHook); WindowSetSetFocusHook(listbox, ListboxSetFocusHook); WindowSetKillFocusHook(listbox, ListboxKillFocusHook); WindowSetMButtonHook(listbox, ListboxMButtonHook); WindowSetVScrollHook(listbox, ListboxVScrollHook); WindowSetSizeHook(listbox, ListboxSizeHook); WindowSetDestroyHook(listbox, ListboxDestroyHook); WindowEnableVScroll(listbox, TRUE); WindowSetLayoutHook(listbox, ListboxLayoutHook); listbox->InstData = (LISTBOXDATA*) malloc(sizeof(LISTBOXDATA)); ((LISTBOXDATA*)listbox->InstData)->SetFocusHook = NULL; ((LISTBOXDATA*)listbox->InstData)->KillFocusHook = NULL; ((LISTBOXDATA*)listbox->InstData)->PreKeyHook = NULL; ((LISTBOXDATA*)listbox->InstData)->PostKeyHook = NULL; ((LISTBOXDATA*)listbox->InstData)->LbChangedHook = NULL; ((LISTBOXDATA*)listbox->InstData)->LbChangingHook = NULL; ((LISTBOXDATA*)listbox->InstData)->LbClickedHook = NULL; ((LISTBOXDATA*)listbox->InstData)->NumItems = 0; ((LISTBOXDATA*)listbox->InstData)->SelIndex = -1; ((LISTBOXDATA*)listbox->InstData)->Sorted = ((flags & LB_SORTED) != 0); ((LISTBOXDATA*)listbox->InstData)->Descending = ((flags & LB_DESCENDING) != 0); ((LISTBOXDATA*)listbox->InstData)->FirstItem = NULL; ((LISTBOXDATA*)listbox->InstData)->LastItem = NULL; ((LISTBOXDATA*)listbox->InstData)->MouseDown = FALSE; WindowSetText(listbox, text); return listbox; } return NULL; }
/* --------------------------------------------------------------------- * ComboboxShowDropdown * Display dropdown window * --------------------------------------------------------------------- */ static void ComboboxShowDropdown(CUIWINDOW* win, COMBOBOXDATA* data, int capture) { CUIWINDOW* listbox; CUIRECT rc; int height; WindowGetWindowRect(win, &rc); height = ((data->NumItems + 2) > data->Height) ? data->Height : (data->NumItems + 2); if ((LINES - rc.Y) > height) { listbox = WindowNew(win, rc.X, rc.Y + 1, rc.W, height, CWS_POPUP | CWS_BORDER | CWS_TABSTOP); } else if (rc.Y > (LINES / 2)) { if (height > (rc.Y - 1)) { height = rc.Y - 1; } listbox = WindowNew(win, rc.X, rc.Y - height - 1, rc.W, height, CWS_POPUP | CWS_BORDER | CWS_TABSTOP); } else { if (height > (LINES - rc.Y - 1)) { height = LINES - rc.Y - 1; } listbox = WindowNew(win, rc.X, rc.Y + 1, rc.W, height, CWS_POPUP | CWS_BORDER | CWS_TABSTOP); } listbox->Class = _T("CBDROPDOWN"); WindowSetPaintHook(listbox, CbDropdownPaintHook); WindowSetKeyHook(listbox, CbDropdownKeyHook); WindowSetMButtonHook(listbox, CbDropdownMButtonHook); WindowSetVScrollHook(listbox, CbDropdownVScrollHook); WindowSetSizeHook(listbox, CbDropdownSizeHook); WindowSetSetFocusHook(listbox, CbDropdownSetFocusHook); WindowSetKillFocusHook(listbox, CbDropdownKillFocusHook); WindowEnableVScroll(listbox, TRUE); listbox->InstData = (void*) data; data->SelIndex = data->CtrlSelIndex; data->MouseDown = capture; data->DropdownState = TRUE; data->CloseKey = 0; if (height > 0) { WindowCreate(listbox); if (capture) { WindowSetCapture(listbox); } WindowModal(listbox); WindowReleaseCapture(); } WindowDestroy(listbox); data->DropdownState = FALSE; ComboboxUpdate(win); switch(data->CloseKey) { case KEY_TAB: case KEY_RIGHT: WindowFocusNext(win->Parent); break; case KEY_LEFT: WindowFocusPrevious(win->Parent); break; } }