Пример #1
0
/* ---------------------------------------------------------------------
 * 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;
}
Пример #2
0
/* ---------------------------------------------------------------------
 * 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;
	}
}