/********************************************************************* * * _DROPDOWN_Callback */ static void _DROPDOWN_Callback (WM_MESSAGE*pMsg) { DROPDOWN_Handle hObj = pMsg->hWin; DROPDOWN_Obj* pObj = DROPDOWN_H2P(hObj); char IsExpandedBeforeMsg; IsExpandedBeforeMsg = pObj->hListWin ? 1 : 0; /* Let widget handle the standard messages */ if (WIDGET_HandleActive(hObj, pMsg) == 0) { return; } switch (pMsg->MsgId) { case WM_NOTIFY_PARENT: switch (pMsg->Data.v) { case WM_NOTIFICATION_SCROLL_CHANGED: WM_NotifyParent(hObj, WM_NOTIFICATION_SCROLL_CHANGED); break; case WM_NOTIFICATION_CLICKED: DROPDOWN_SetSel(hObj, LISTBOX_GetSel(pObj->hListWin)); WM_SetFocus(hObj); break; case LISTBOX_NOTIFICATION_LOST_FOCUS: DROPDOWN_Collapse(hObj); break; } break; case WM_PID_STATE_CHANGED: if (IsExpandedBeforeMsg == 0) { /* Make sure we do not react a second time */ const WM_PID_STATE_CHANGED_INFO * pInfo = (const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p; if (pInfo->State) { DROPDOWN_Expand(hObj); } } break; case WM_TOUCH: if (_OnTouch(hObj, pMsg) == 0) { return; } break; case WM_PAINT: _Paint(hObj); break; case WM_DELETE: _FreeAttached(pObj); break; /* No return here ... WM_DefaultProc needs to be called */ case WM_KEY: if ( ((const WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt >0) { int Key = ((const WM_KEY_INFO*)(pMsg->Data.p))->Key; switch (Key) { case GUI_KEY_TAB: break; /* Send to parent by not doing anything */ default: DROPDOWN_AddKey(hObj, Key); return; } } break; } WM_DefaultProc(pMsg); }
/********************************************************************* * * DROPDOWN_SetFont */ void DROPDOWN_SetFont(DROPDOWN_Handle hObj, const GUI_FONT GUI_UNI_PTR * pfont) { int OldHeight; DROPDOWN_Obj* pObj; if (hObj) { WM_LOCK(); pObj = DROPDOWN_H2P(hObj); ASSERT_IS_VALID_PTR(pObj); OldHeight = GUI_GetYDistOfFont(pObj->Props.pFont); pObj->Props.pFont = pfont; DROPDOWN__AdjustHeight(hObj, pObj); DROPDOWN_Invalidate(hObj); if (pObj->hListWin) { if (OldHeight != GUI_GetYDistOfFont(pObj->Props.pFont)) { DROPDOWN_Collapse(hObj); DROPDOWN_Expand(hObj); } LISTBOX_SetFont(pObj->hListWin, pfont); } WM_UNLOCK(); } }
/******************************************************************* * * _ShowSeveralFunctions */ static void _ShowSeveralFunctions(DROPDOWN_Handle hDropDown) { int NumEntries, i, Key = 0, Cnt = 15; char ac[] = "-- sec to play with dropdown control"; /* Set focus */ GUI_DispStringAtCEOL("WM_SetFocus", 5, 55); GUI_Delay(SPEED * 0.9); WM_SetFocus(hDropDown); GUI_Delay(SPEED * 0.7); /* Add strings */ GUI_DispStringAtCEOL("DROPDOWN_AddString", 5, 55); GUI_Delay(SPEED * 0.8); DROPDOWN_AddString(hDropDown, "English"); DROPDOWN_AddString(hDropDown, "Deutsch"); DROPDOWN_AddString(hDropDown, "Fran鏰is"); DROPDOWN_AddString(hDropDown, "Japanese"); DROPDOWN_AddString(hDropDown, "Italiano"); DROPDOWN_AddString(hDropDown, "Espa駉l"); DROPDOWN_AddString(hDropDown, "Other language ..."); GUI_Delay(SPEED * 0.6); /* Increment selection */ GUI_DispStringAtCEOL("DROPDOWN_IncSel", 5, 55); GUI_Delay(SPEED); NumEntries = DROPDOWN_GetNumItems(hDropDown); for (i = 0; i < (NumEntries - 2); i++) { DROPDOWN_IncSel(hDropDown); GUI_Delay(SPEED / 6); } GUI_Delay(SPEED / 4); /* Expand dropdown */ GUI_DispStringAtCEOL("DROPDOWN_Expand", 5, 55); GUI_Delay(SPEED); DROPDOWN_Expand(hDropDown); GUI_Delay(SPEED * 0.75); /* Add scrollbar */ GUI_DispStringAtCEOL("DROPDOWN_SetAutoScroll", 5, 55); GUI_Delay(SPEED); DROPDOWN_SetAutoScroll(hDropDown, 1); GUI_Delay(SPEED * 0.75); /* Set font */ GUI_DispStringAtCEOL("DROPDOWN_SetFont", 5, 55); GUI_Delay(SPEED); DROPDOWN_SetFont(hDropDown, &GUI_Font16B_1); GUI_Delay(SPEED * 0.75); /* Set text color */ GUI_DispStringAtCEOL("DROPDOWN_SetTextColor", 5, 55); GUI_Delay(SPEED); DROPDOWN_SetTextColor(hDropDown, 0, 0x00BB00); DROPDOWN_SetTextColor(hDropDown, 2, GUI_BLACK); GUI_Delay(SPEED * 0.75); /* Set background color */ GUI_DispStringAtCEOL("DROPDOWN_SetBkColor", 5, 55); GUI_Delay(SPEED); DROPDOWN_SetBkColor(hDropDown, 0, GUI_YELLOW); DROPDOWN_SetBkColor(hDropDown, 2, GUI_RED); GUI_Delay(SPEED * 0.75); /* Delete item */ GUI_DispStringAtCEOL("DROPDOWN_DeleteItem", 5, 55); GUI_Delay(SPEED); DROPDOWN_DeleteItem(hDropDown, 5); GUI_Delay(SPEED * 0.75); /* Collapse dropdown */ GUI_DispStringAtCEOL("DROPDOWN_Collapse", 5, 55); GUI_Delay(SPEED); DROPDOWN_Collapse(hDropDown); GUI_Delay(SPEED * 0.75); /* Decrement selection */ GUI_DispStringAtCEOL("DROPDOWN_DecSel", 5, 55); GUI_Delay(SPEED); NumEntries = DROPDOWN_GetNumItems(hDropDown); for (i = 0; i < (NumEntries - 2); i++) { DROPDOWN_DecSel(hDropDown); GUI_Delay(SPEED / 6); } GUI_Delay(SPEED / 4); /* Let user play with dropdown control */ GUI_DispStringAtCEOL("", 5, 55); while (!Key && (Cnt > 0)) { ac[0] = '0' + (Cnt / 10); ac[1] = '0' + (Cnt-- % 10); GUI_DispStringAtCEOL(ac, 5, 40); GUI_Delay(1000); Key = GUI_GetKey(); } /* Delete dropdown widget */ GUI_DispStringAtCEOL("DROPDOWN_Delete", 5, 55); GUI_Delay(SPEED * 1.1); DROPDOWN_Delete(hDropDown); GUI_Delay(SPEED * 0.75); }
/********************************************************************* * * MainTask */ void MainTask(void) { WM_HWIN hScrollbar, hDlgOptions; GUI_RECT RectDlg, RectClient; int Cnt = 0, IndexEffect = 0, ButtonState = 0, DropdownState = 0; int ProgbarValue = 0, ProgbarInc = 1; int SliderValue = 0, SliderInc = 1; int ScrollbarValue = 0, ScrollbarInc = 1; int ListViewInc = 1; int ListBoxInc = 1; int MultiEditInc = 1; int Vz = 1; const WIDGET_EFFECT * _apEffect[] = {&WIDGET_Effect_3D, /* Array of effects */ &WIDGET_Effect_Simple, &WIDGET_Effect_None}; const char * _apEffects[] = {"Widget effect: 3D", "Widget effect: Simple", "Widget effect: None"}; GUI_Init(); GUI_CURSOR_Show(); WM_SetCallback(WM_HBKWIN, _cbBkWindow); WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */ WM_EnableMemdev(WM_HBKWIN); /* Enable use of memory devices for desktop windows */ /* Create framewindow and set its properties */ _hFrameWin = FRAMEWIN_CreateEx(0, 0, 640, 480, 0, WM_CF_SHOW, 0, 0, "", &_cbCallbackFramewin); FRAMEWIN_SetMoveable(_hFrameWin, 1); FRAMEWIN_SetText(_hFrameWin, _apEffects[0]); FRAMEWIN_SetFont(_hFrameWin, &GUI_Font13B_ASCII); /* Create main dialog window as child from framewindows client window */ _hDlg = GUI_CreateDialogBox(_aDlgWidgets, GUI_COUNTOF(_aDlgWidgets), &_cbCallbackWidgets, WM_GetClientWindow(_hFrameWin), 0, 0); /* Attach scrollbar to framewindows client window and set its properties */ hScrollbar = SCROLLBAR_CreateAttached(WM_GetClientWindow(_hFrameWin), 0); WM_GetWindowRectEx(_hDlg, &RectDlg); WM_GetClientRectEx(WM_GetClientWindow(_hFrameWin), &RectClient); SCROLLBAR_SetNumItems(hScrollbar, RectDlg.x1); SCROLLBAR_SetPageSize(hScrollbar, RectClient.x1); /* Create options dialog with 'stay on top' and 'moveable' attribute */ hDlgOptions = GUI_CreateDialogBox(_aDlgOptions, GUI_COUNTOF(_aDlgOptions), &_cbCallbackOptions, WM_HBKWIN, 0, 0); FRAMEWIN_SetMoveable(hDlgOptions, 1); WM_SetStayOnTop(hDlgOptions, 1); /* Main loop for modifying the widgets */ while (1) { if (_AutoMode) { Cnt++; /* Modify progbar */ if ((Cnt % 2) == 0) { ProgbarValue += ProgbarInc; if ((ProgbarValue == 110) || (ProgbarValue == -10)) { ProgbarInc *= -1; } PROGBAR_SetValue(_ahWin[PROGBAR0], ProgbarValue); } /* Modify slider */ if ((Cnt % 2) == 0) { int j; SliderValue += SliderInc; if ((SliderValue == 100) || (SliderValue == 0)) { SliderInc *= -1; } for (j = 0; j < 3; j++) { SLIDER_SetValue(_ahWin[SLIDER0 + j], SliderValue); } } /* Modify scrollbar */ if ((Cnt % 3) == 0) { int j; ScrollbarValue += ScrollbarInc; if ((ScrollbarValue == 90) || (ScrollbarValue == 0)) { ScrollbarInc *= -1; } for (j = 0; j < 3; j++) { SCROLLBAR_SetValue(_ahWin[SCROLLBAR0 + j], ScrollbarValue); } } /* Modify multipage */ if ((Cnt % 120) == 0) { MULTIPAGE_SelectPage(_ahWin[MULTIPAGE0], MULTIPAGE_GetSelection(_ahWin[MULTIPAGE0]) ^ 1); } /* Modify dropdown */ if ((Cnt % 120) == 0) { DropdownState ^= 1; if (DropdownState) { DROPDOWN_Expand(_ahWin[DROPDOWN0]); } else { DROPDOWN_Collapse(_ahWin[DROPDOWN0]); } } /* Modify button */ if ((Cnt % 40) == 0) { ButtonState ^= 1; BUTTON_SetPressed(_ahWin[BUTTON0], ButtonState); } /* Modify listbox */ if ((Cnt % 30) == 0) { int Sel; Sel = LISTBOX_GetSel(_ahWin[LISTBOX0]); if (Sel < 0) { Sel = 0; } LISTBOX_SetSel(_ahWin[LISTBOX0], Sel + ListBoxInc); Sel = LISTBOX_GetSel(_ahWin[LISTBOX0]); if ((Sel == (int)LISTBOX_GetNumItems(_ahWin[LISTBOX0]) - 1) || (Sel == 0)) { ListBoxInc *= -1; } } /* Modify listview */ if ((Cnt % 50) == 0) { int Sel; Sel = LISTVIEW_GetSel(_ahWin[LISTVIEW0]); if (Sel < 0) { Sel = 0; } LISTVIEW_SetSel(_ahWin[LISTVIEW0], Sel + ListViewInc); Sel = LISTVIEW_GetSel(_ahWin[LISTVIEW0]); if ((Sel == (int)LISTVIEW_GetNumRows(_ahWin[LISTVIEW0]) - 1) || (Sel == 0)) { ListViewInc *= -1; } } /* Modify multiedit */ if ((Cnt % 5) == 0) { int Sel, Len; char acBuffer[100]; MULTIEDIT_SetCursorOffset(_ahWin[MULTIEDIT0], MULTIEDIT_GetCursorCharPos(_ahWin[MULTIEDIT0]) + MultiEditInc); MULTIEDIT_GetText(_ahWin[MULTIEDIT0], acBuffer, sizeof(acBuffer)); Sel = MULTIEDIT_GetCursorCharPos(_ahWin[MULTIEDIT0]); Len = strlen(acBuffer); if ((Sel == (Len - 1)) || (Sel == 0)) { MultiEditInc *= -1; } if (!DropdownState) { WM_SetFocus(_ahWin[MULTIEDIT0]); } } /* Modify graph */ _AddValues(_ahWin[GRAPH0], 95); /* Move window */ if ((Cnt % 1200) == 0) { int Inc; WM_HWIN hScroll; WM_SCROLL_STATE ScrollState; hScroll = WM_GetScrollbarH(WM_GetClientWindow(_hFrameWin)); WM_GetScrollState(hScroll, &ScrollState); Inc = (ScrollState.NumItems - ScrollState.PageSize) / 2; ScrollState.v += Inc * Vz; if ((ScrollState.v >= Inc * 2) || (ScrollState.v <= 0)) { Vz *= -1; } SCROLLBAR_SetValue(hScroll, ScrollState.v); } /* Change effect */ if ((Cnt % 400) == 0) { int Index; WM_HWIN hWin; IndexEffect++; Index = IndexEffect % GUI_COUNTOF(_apEffect); _SetEffect(Index); hWin = WM_GetDialogItem(hDlgOptions, GUI_ID_RADIO0); RADIO_SetValue(hWin, Index); } } /* Wait a while */ GUI_Delay(10); } }