Beispiel #1
0
/* ---------------------------------------------------------------------
 * TerminalVScrollHook
 * Terminal scroll bar mouse hook
 * ---------------------------------------------------------------------
 */
static void
TerminalVScrollHook(void* w, int sbcode, int pos)
{
	CUIWINDOW* win = (CUIWINDOW*) w;
	CUIRECT rc;
	int sbpos, range;
	
	CUI_USE_ARG(pos);

	WindowGetClientRect(win, &rc);
	sbpos = WindowGetVScrollPos(win);
	range = WindowGetVScrollRange(win);

	switch(sbcode)
	{
	case SB_LINEUP:
		if (sbpos > 0)
		{
			WindowSetVScrollPos(win, sbpos - 1);
			WindowInvalidate(win);
		}
		break;
	case SB_LINEDOWN:
		if (sbpos < range)
		{
			WindowSetVScrollPos(win, sbpos + 1);
			WindowInvalidate(win);
		}
		break;
	case SB_PAGEUP:
		if (sbpos > 0)
		{
			sbpos -= (rc.H - 1);
			sbpos = (sbpos < 0) ? 0 : sbpos;
			WindowSetVScrollPos(win, sbpos);
			WindowInvalidate(win);
		}
		break;
	case SB_PAGEDOWN:
		if (sbpos < range)
		{
			sbpos += (rc.H - 1);
			sbpos = (sbpos > range) ? range : sbpos;
			WindowSetVScrollPos(win, sbpos);
			WindowInvalidate(win);
		}
		break;
	case SB_THUMBTRACK:
		WindowInvalidate(win);
		break;
	}
}
Beispiel #2
0
/* ---------------------------------------------------------------------
 * CbDropdownCalcPos
 * Recalculate Listbox position
 * ---------------------------------------------------------------------
 */
static void
CbDropdownCalcPos(CUIWINDOW* win)
{
	CUIRECT      rc;
	COMBOBOXDATA* data = (COMBOBOXDATA*) win->InstData;
	int          range;
	int          pos;  
        
	if (!data) return;
	if (win->IsCreated)
	{
		WindowGetClientRect(win, &rc);
                
		range = data->NumItems - rc.H;
		if (range < 0)
		{
			WindowSetVScrollRange(win, 0);
			WindowSetVScrollPos(win, 0);  
		}
		else
		{   
			WindowSetVScrollRange(win, range);
                        
			pos = WindowGetVScrollPos(win);
			if (data->SelIndex < 0)
			{
				WindowSetVScrollPos(win, 0);
			}
			else if (data->SelIndex - pos >= rc.H)
			{
				WindowSetVScrollPos(win, data->SelIndex - rc.H + 1);
			}
			else if (data->SelIndex - pos < 0)
			{
				WindowSetVScrollPos(win, data->SelIndex);
			}
		}
	}
}
Beispiel #3
0
/* ---------------------------------------------------------------------
 * TerminalKeyHook
 * Handle EVENT_KEY events
 * ---------------------------------------------------------------------
 */
static int
TerminalKeyHook(void* w, int key)
{
	CUIWINDOW*    win = (CUIWINDOW*) w;
	TERMINALDATA* data = (TERMINALDATA*) win->InstData;
	CUIRECT       rc;
	int           yrange;
	int           yscroll;

	if (!data) return FALSE;

	WindowGetClientRect(win, &rc);

	yscroll = WindowGetVScrollPos(win);
	yrange  = WindowGetVScrollRange(win);

	if (win->IsEnabled)
	{
		/* if the key is processed by the custom callback hook, we
		   are over and done with it, else processing continues */
		if (data->PreKeyHook)
		{
			if (data->PreKeyHook(data->PreKeyTarget, win, key))
			{
				return TRUE;
			}
		}

		switch(key)
		{
		case KEY_DOWN:
			if (yscroll < yrange)
			{
				WindowSetVScrollPos(win, yscroll + 1);
				WindowInvalidate(win);
				TerminalCursorOnOff(win);
			}
			return TRUE;
		case KEY_UP:
			if (yscroll > 0)
			{
				WindowSetVScrollPos(win, yscroll - 1);
				WindowInvalidate(win);
				TerminalCursorOnOff(win);
			}
			return TRUE;
		case KEY_NPAGE:
			if (yscroll < yrange)
			{
				yscroll += (rc.H - 1);
				if (yscroll > yrange)
				{
					yscroll = yrange;
				}
				WindowSetVScrollPos(win, yscroll);
				WindowInvalidate(win);
				TerminalCursorOnOff(win);
			}
			return TRUE;
		case KEY_PPAGE:
			if (yscroll > 0)
			{
				yscroll -= (rc.H - 1);
				if (yscroll < 0)
				{
					yscroll = 0;
				}
				WindowSetVScrollPos(win, yscroll);
				WindowInvalidate(win);
				TerminalCursorOnOff(win);
			}
			return TRUE;
		case KEY_HOME:
			if (yscroll > 0)
			{
				WindowSetVScrollPos(win, 0);
				WindowInvalidate(win);
				TerminalCursorOnOff(win);
			}
			return TRUE;
		case KEY_END:
			if (yscroll < yrange)
			{
				WindowSetVScrollPos(win, yrange);
				WindowInvalidate(win);
				TerminalCursorOnOff(win);
			}
			return TRUE;
		default:
			if (data->CoProc)
			{
				if ((key >= KEY_SPACE) && (key <= 255))
				{
					wchar_t c = (wchar_t) key;
					TerminalCoWrite(data->CoProc, &c, 1);
					return TRUE;
				}
				else if (key == KEY_RETURN)
				{
					TerminalCoWrite(data->CoProc, _T("\n"), 1);
					return TRUE;
				}
			}
			if (data->PostKeyHook)
			{
				if (data->PostKeyHook(data->PostKeyTarget, win, key))
				{
					return TRUE;
				}   
			}
		}
	}
	return FALSE;
}