/********************************************************************* * * WM_InvalidateWindowAndDescs * * Function description * Invalidate window and all descendents (children and grandchildren and ... */ void WM_InvalidateWindowAndDescs(WM_HWIN hWin) { WM_HWIN hChild; if (hWin) { WM_InvalidateWindow(hWin); /* Invalidate window itself */ for (hChild = WM_GetFirstChild(hWin); hChild;) { WM_Obj* pChild = WM_H2P(hChild); WM_InvalidateWindowAndDescs(hChild); hChild = pChild->hNext; } } }
/********************************************************************* * * _SetWidgetEffect * * Purpose: * Sets the effect for the given widget and recursive for its child windows */ static void _SetWidgetEffect(WM_HWIN hWin, const WIDGET_EFFECT * pEffect) { WM_HWIN hChild; if (hWin) { WIDGET_SetEffect(hWin, pEffect); /* Set effect for the widget*/ /* Iterate over the child windows */ hChild = WM_GetFirstChild(hWin); while (hChild) { _SetWidgetEffect(hChild, pEffect); /* Set effect for the child windows */ hChild = WM_GetNextSibling(hChild); } } }
/********************************************************************* * * _NotifyVisChanged * * Description * Notify all descendents */ static void _NotifyVisChanged(WM_HWIN hWin, GUI_RECT * pRect) { WM_Obj* pWin; for (hWin = WM_GetFirstChild(hWin); hWin; hWin = pWin->hNext) { pWin = WM_H2P(hWin); if (pWin->Status & WM_SF_ISVIS) { if (GUI_RectsIntersect(&pWin->Rect, pRect)) { WM__SendMsgNoData(hWin, WM_NOTIFY_VIS_CHANGED); /* Notify window that visibility may have changed */ _NotifyVisChanged(hWin, pRect); } } } }
/***************************************************************************** * FUNCTION - ShowErrorMessage_C * DESCRIPTION: Displays an error message. * Further actions (Rebooting or ignoring errors when not debugging) depend * on the caller (or the caller of the caller...). * * Called by embOS\D3018X\OS_Error and Factory::FatalErrorOccured() * ****************************************************************************/ extern "C" void ShowErrorMessage_C(const char* errorDescription = "-") { int i; char sz_msg[250]; WM_HWIN win; WM_HWIN win_next; GUI_RECT rect; WM_SelectWindow(WM_GetDesktopWindow()); win = WM_GetFirstChild(WM_GetDesktopWindow()); while(win != (WM_HWIN) NULL) { win_next = WM_GetNextSibling(win); WM_DeleteWindow(win); win = win_next; } WM_SetStayOnTop(WM_GetDesktopWindow(),1); WM_BringToTop(WM_GetDesktopWindow()); GUI_SetBkColor(GUI_WHITE); GUI_SetColor(GUI_BLACK); GUI_SetFont(&Helvetica_57_13); GUI_Clear(); sprintf(sz_msg, "Fatal error.\n\n %s", errorDescription); rect.x0 = 0; rect.y0 = 10; rect.x1 = 239; rect.y1 = 319; for (i=0; i<5; i++) { GUI_Clear(); GUI_Delay(100); GUI_DispStringInRect(sz_msg,&rect,GUI_TA_VCENTER|GUI_TA_HCENTER); GUI_Delay(500); } }
void GUIDEMO_main(void) { #if GUI_WINSUPPORT int i; int xSize, ySize, xPos, yPos; #endif #if (GUI_SUPPORT_CURSOR|GUI_SUPPORT_TOUCH) GUI_CURSOR_Show(); #endif GUI_Clear(); #if GUI_WINSUPPORT #if LCD_NUM_DISPLAYS > 1 FRAMEWIN_CreateAsChild(10, 10, 100, 100, WM_GetDesktopWindowEx(1), "Display 1", NULL, WM_CF_SHOW); WM_SetDesktopColorEx(GUI_RED, 1); GUI_Delay(1000); #endif WM_SetCreateFlags(WM_CF_MEMDEV); /* Automatically use memory devices on all windows */ /* Calculate position and size of FrameWin[1] */ _ButtonSizeX = 30; _ButtonSizeY = 20; /* Create the control window incl. buttons */ _ahFrameWin[1] = FRAMEWIN_Create("Control", NULL, WM_CF_SHOW | WM_CF_STAYONTOP, LCD_GetXSize() - 80, LCD_GetYSize() - 60, 80, 60); _ahInfoWin[1] = WM_CreateWindowAsChild( 0, 0, 0, 0, WM_GetFirstChild(_ahFrameWin[1]), WM_CF_SHOW | WM_CF_STAYONTOP, &_cbCmdWin, 0); _ahButton[0] = BUTTON_CreateAsChild(4, 20, _ButtonSizeX, _ButtonSizeY, _ahInfoWin[1], 'S' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV); _ahButton[1] = BUTTON_CreateAsChild(40, 20, _ButtonSizeX, _ButtonSizeY, _ahInfoWin[1], 'N' , WM_CF_SHOW | WM_CF_STAYONTOP | WM_CF_MEMDEV); BUTTON_SetText(_ahButton[0], "Stop"); BUTTON_SetText(_ahButton[1], "Next"); _UpdateCmdWin(); WM_ExecIdle(); #endif /* Show Intro */ GUIDEMO_Intro(); #if GUI_WINSUPPORT /* Calculate position and size of FrameWin[0] */ xSize = LCD_GetXSize() / 2; ySize = 65; xPos = LCD_GetXSize() - xSize; yPos = 0; /* Create info window and run the individual demos */ _ahFrameWin[0] = FRAMEWIN_Create("µC/GUI Demo", NULL, WM_CF_STAYONTOP, xPos, yPos, xSize, ySize); // _ahInfoWin[0] = WM_GetFirstChild(_ahFrameWin[0]); _ahInfoWin[0] = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetFirstChild(_ahFrameWin[0]), WM_CF_SHOW | WM_CF_STAYONTOP, 0, 0); WM_ExecIdle(); #endif /* Run the individual demos ! */ for (_iTest = 0; _apfTest[_iTest]; _iTest++) { GUI_CONTEXT ContextOld; GUI_SaveContext(&ContextOld); _iTestMinor = 0; _UpdateCmdWin(); (*_apfTest[_iTest])(); _CmdNext = 0; GUI_RestoreContext(&ContextOld); } /* Cleanup */ #if GUI_WINSUPPORT for (i = 0; i < countof(_ahFrameWin); i++) { WM_DeleteWindow(_ahFrameWin[i]); } for (i = 0; i < countof(_ahInfoWin); i++) { WM_DeleteWindow(_ahInfoWin[i]); } #endif }
/********************************************************************* * * _cbPage1 * * Purpose: * Callback routine for the second page of the multipage widget */ static void _cbPage1(WM_MESSAGE * pMsg) { TREEVIEW_ITEM_Handle hTVI0, hTVI1; TREEVIEW_ITEM_INFO ItemInfo; WM_HWIN hItem, hDlg, hTree0, hTree1; int i, NCode, Id; hDlg = pMsg->hWin; switch (pMsg->MsgId) { case WM_NOTIFY_PARENT: hTree0= WM_GetDialogItem(WM_GetFirstChild(WM_HBKWIN), GUI_ID_TREEVIEW0); hTree1= WM_GetDialogItem(WM_GetFirstChild(WM_HBKWIN), GUI_ID_TREEVIEW1); Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ hItem = WM_GetDialogItem(hDlg, Id); switch (Id) { case GUI_ID_BUTTON0: /* Delete */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI0 = TREEVIEW_GetSel(hTree0); if (hTVI0) { TREEVIEW_ITEM_Delete(hTVI0); } else { GUI_MessageBox("No item selected!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } break; } break; case GUI_ID_BUTTON1: /* Detach */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI1 = TREEVIEW_GetItem(hTree1, 0, TREEVIEW_GET_FIRST); if (hTVI1) { TREEVIEW_ITEM_Delete(hTVI1); } hTVI0 = TREEVIEW_GetSel(hTree0); TREEVIEW_ITEM_Detach(hTVI0); TREEVIEW_AttachItem(hTree1, hTVI0, 0, TREEVIEW_GET_FIRST); break; } break; case GUI_ID_BUTTON2: /* Attach */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI1 = TREEVIEW_GetItem(hTree1, 0, TREEVIEW_GET_FIRST); if (hTVI1) { hTVI0 = TREEVIEW_GetSel(hTree0); TREEVIEW_ITEM_Detach(hTVI1); if (hTVI0) { TREEVIEW_AttachItem(hTree0, hTVI1, hTVI0, TREEVIEW_INSERT_ABOVE); } else { TREEVIEW_AttachItem(hTree0, hTVI1, 0, 0); } } else { GUI_MessageBox("No item in buffer!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } break; } break; case GUI_ID_BUTTON3: /* Move up */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI0 = TREEVIEW_GetSel(hTree0); if (hTVI0) { hTVI1 = TREEVIEW_GetItem(hTree0, hTVI0, TREEVIEW_GET_PREV_SIBLING); if (hTVI1) { TREEVIEW_ITEM_Detach(hTVI0); TREEVIEW_AttachItem(hTree0, hTVI0, hTVI1, TREEVIEW_INSERT_ABOVE); TREEVIEW_SetSel(hTree0, hTVI0); } else { GUI_MessageBox("Item is already on top!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } } break; } break; case GUI_ID_BUTTON4: /* Move down */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI0 = TREEVIEW_GetSel(hTree0); if (hTVI0) { hTVI1 = TREEVIEW_GetItem(hTree0, hTVI0, TREEVIEW_GET_NEXT_SIBLING); if (hTVI1) { TREEVIEW_ITEM_Detach(hTVI0); TREEVIEW_AttachItem(hTree0, hTVI0, hTVI1, TREEVIEW_INSERT_BELOW); TREEVIEW_SetSel(hTree0, hTVI0); } else { GUI_MessageBox("Item is already on bottom!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } } break; } break; case GUI_ID_BUTTON5: /* New node */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI0 = TREEVIEW_GetSel(hTree0); if (hTVI0) { TREEVIEW_ITEM_GetInfo(hTVI0, &ItemInfo); if (ItemInfo.IsNode) { hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_NODE, hTVI0, TREEVIEW_INSERT_BELOW, "New node"); } else { hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_NODE, hTVI0, TREEVIEW_INSERT_ABOVE, "New node"); } } else { hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_NODE, 0, 0, "New node"); } hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_LEAF, hTVI0, TREEVIEW_INSERT_FIRST_CHILD, "New.A"); hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_LEAF, hTVI0, TREEVIEW_INSERT_BELOW, "New.B"); hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_LEAF, hTVI0, TREEVIEW_INSERT_BELOW, "New.C"); hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_LEAF, hTVI0, TREEVIEW_INSERT_BELOW, "New.D"); break; } break; case GUI_ID_BUTTON6: /* New leaf */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI0 = TREEVIEW_GetSel(hTree0); if (hTVI0) { TREEVIEW_ITEM_GetInfo(hTVI0, &ItemInfo); hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_LEAF, hTVI0, TREEVIEW_INSERT_BELOW, "New leaf"); } else { hTVI0 = TREEVIEW_InsertItem(hTree0, TREEVIEW_ITEM_TYPE_LEAF, 0, 0, "New leaf"); } break; } break; case GUI_ID_BUTTON7: /* Leaf bitmap */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI0 = TREEVIEW_GetSel(hTree0); if (hTVI0) { TREEVIEW_ITEM_GetInfo(hTVI0, &ItemInfo); if (ItemInfo.IsNode == 0) { TREEVIEW_ITEM_SetImage(hTVI0, TREEVIEW_BI_LEAF, &_bmSmilie); } else { GUI_MessageBox("Item is not a leaf!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } } else { GUI_MessageBox("No item selected!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } break; } break; case GUI_ID_BUTTON8: /* Open bitmap */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI0 = TREEVIEW_GetSel(hTree0); if (hTVI0) { TREEVIEW_ITEM_GetInfo(hTVI0, &ItemInfo); if (ItemInfo.IsNode) { TREEVIEW_ITEM_SetImage(hTVI0, TREEVIEW_BI_OPEN, &_bmBookOpen); } else { GUI_MessageBox("Item is not a node!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } } else { GUI_MessageBox("No item selected!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } break; } break; case GUI_ID_BUTTON9: /* Closed bitmap */ switch (NCode) { case WM_NOTIFICATION_RELEASED: hTVI0 = TREEVIEW_GetSel(hTree0); if (hTVI0) { TREEVIEW_ITEM_GetInfo(hTVI0, &ItemInfo); if (ItemInfo.IsNode) { TREEVIEW_ITEM_SetImage(hTVI0, TREEVIEW_BI_CLOSED, &_bmBookClosed); } else { GUI_MessageBox("Item is not a node!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } } else { GUI_MessageBox("No item selected!", "Info", GUI_MESSAGEBOX_CF_MODAL); WM_SetFocus(hTree0); } break; } break; } break; case WM_INIT_DIALOG: /* Initialize the items of the dialog */ for (i = GUI_ID_BUTTON0; i <= GUI_ID_BUTTON9; i++) { hItem = WM_GetDialogItem(hDlg, i); if (hItem) { BUTTON_SetFocussable(hItem, 0); /* So the focus remains on the treeview after pressing the buttons */ } } break; default: WM_DefaultProc(pMsg); } }
/********************************************************************* * * _cbPage0 * * Purpose: * Callback routine for the first page of the multipage widget */ static void _cbPage0(WM_MESSAGE * pMsg) { WM_HWIN hItem, hDlg, hTree; int Sel, NCode, Id; hDlg = pMsg->hWin; switch (pMsg->MsgId) { case WM_NOTIFY_PARENT: hTree = WM_GetDialogItem(WM_GetFirstChild(WM_HBKWIN), GUI_ID_TREEVIEW0); Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ hItem = WM_GetDialogItem(hDlg, Id); switch (Id) { case GUI_ID_RADIO0: /* Select the selection mode */ switch (NCode) { case WM_NOTIFICATION_VALUE_CHANGED: Sel = RADIO_GetValue(hItem); TREEVIEW_SetSelMode(hTree, (Sel == 1) ? TREEVIEW_SELMODE_ROW : TREEVIEW_SELMODE_TEXT); break; } break; case GUI_ID_RADIO1: /* Set the visibility of the lines */ switch (NCode) { case WM_NOTIFICATION_VALUE_CHANGED: Sel = RADIO_GetValue(hItem); TREEVIEW_SetHasLines(hTree, (Sel == 1) ? 1 : 0); break; } break; case GUI_ID_RADIO2: /* Manage horizontal scrollbar */ switch (NCode) { case WM_NOTIFICATION_VALUE_CHANGED: Sel = RADIO_GetValue(hItem); if (Sel == 1) { WM_SetScrollbarH(hTree, 0); } TREEVIEW_SetAutoScrollH(hTree, (Sel == 0) ? 1 : 0); if (Sel == 2) { SCROLLBAR_CreateAttached(hTree, 0); } break; } break; case GUI_ID_RADIO3: /* Manage vertical scrollbar */ switch (NCode) { case WM_NOTIFICATION_VALUE_CHANGED: Sel = RADIO_GetValue(hItem); if (Sel == 1) { WM_SetScrollbarV(hTree, 0); } TREEVIEW_SetAutoScrollV(hTree, (Sel == 0) ? 1 : 0); if (Sel == 2) { SCROLLBAR_CreateAttached(hTree, WIDGET_CF_VERTICAL); } break; } break; case GUI_ID_RADIO4: /* Manage font */ switch (NCode) { case WM_NOTIFICATION_VALUE_CHANGED: Sel = RADIO_GetValue(hItem); TREEVIEW_SetFont(hTree, (Sel == 1) ? &GUI_Font24B_1: &GUI_Font13_1); break; } break; } break; case WM_INIT_DIALOG: /* Initialize the items of the dialog */ hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0); RADIO_SetText(hItem, "Text select", 0); RADIO_SetText(hItem, "Row select", 1); RADIO_SetValue(hItem, 1); hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO1); RADIO_SetText(hItem, "Off", 0); RADIO_SetText(hItem, "On", 1); RADIO_SetValue(hItem, 1); hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO4); RADIO_SetText(hItem, "Small font", 0); RADIO_SetText(hItem, "Large font", 1); break; default: WM_DefaultProc(pMsg); } }