/********************************************************************* * * _Paint */ static void _Paint(TEXT_Handle hObj, TEXT_Obj* pObj) { const char * s; GUI_RECT Rect; GUI_USE_PARA(hObj); LCD_SetColor(pObj->Props.TextColor); GUI_SetFont (pObj->Props.pFont); /* Fill with parents background color */ #if !TEXT_SUPPORT_TRANSPARENCY /* Not needed any more, since window is transparent*/ if (pObj->Props.BkColor == GUI_INVALID_COLOR) { LCD_SetBkColor(WIDGET__GetBkColor(hObj)); } else { LCD_SetBkColor(pObj->Props.BkColor); } GUI_Clear(); #else if (!WM_GetHasTrans(hObj)) { LCD_SetBkColor(pObj->Props.BkColor); GUI_Clear(); } #endif /* Show the text */ if (pObj->hpText) { s = (const char*) GUI_ALLOC_h2p(pObj->hpText); GUI_SetTextMode(GUI_TM_TRANS); WM_GetClientRect(&Rect); GUI_DispStringInRectWrap(s, &Rect, pObj->Align, pObj->Props.WrapMode); } }
/********************************************************************* * * _InitContext * * Purpose * Initializes the given context. * * Special considerations * Make sure that no GUI functions are called, because locking is * not allowed here (GUITASK_INIT not yet called). */ static void _InitContext(GUI_CONTEXT* pContext) { /* memset(..,0,..) is not required, as this function is called only at startup of the GUI when data is 0 */ #if GUI_SUPPORT_DEVICES pContext->pDeviceAPI = LCD_aAPI[0]; /* &LCD_L0_APIList; */ #endif pContext->pClipRect_HL = &GUI_Context.ClipRect; LCD_L0_GetRect(&pContext->ClipRect); #if GUI_SUPPORT_AA pContext->pLCD_HL = &_HL_APIList; #endif pContext->pAFont = GUI_DEFAULT_FONT; pContext->pClipRect_HL = &GUI_Context.ClipRect; pContext->PenSize = 1; /* Variables in WM module */ #if GUI_WINSUPPORT pContext->hAWin = WM_GetDesktopWindow(); #endif /* Variables in GUI_AA module */ #if GUI_SUPPORT_AA pContext->AA_Factor = 3; #endif pContext->Color = GUI_INVALID_COLOR; pContext->BkColor = GUI_INVALID_COLOR; LCD_SetBkColor(GUI_DEFAULT_BKCOLOR); LCD_SetColor(GUI_DEFAULT_COLOR); #if GUI_SUPPORT_UNICODE pContext->pUC_API = &GUI_UC_None; #endif }
/********************************************************************* * * GUI_SetBkColor */ void GUI_SetBkColor(GUI_COLOR color) { GUI_LOCK(); { LCD_SetBkColor(color); } GUI_UNLOCK(); }
/********************************************************************* * * _DrawPart */ static void _DrawPart(const PROGBAR_Obj* pObj, int Index, int xText, int yText, const char* pText) { LCD_SetBkColor(pObj->BarColor[Index]); LCD_SetColor(pObj->TextColor[Index]); GUI_Clear(); GUI_GotoXY(xText, yText); GUI_DispString(pText); }
/********************************************************************* * * WINDOW_Callback */ void WINDOW_Callback(WM_MESSAGE* pMsg) { WM_HWIN hObj; WINDOW_OBJ* pObj; WM_CALLBACK* cb; hObj = pMsg->hWin; pObj = WINDOW_H2P(hObj); cb = pObj->cb; switch (pMsg->MsgId) { case WM_HANDLE_DIALOG_STATUS: if (pMsg->Data.p) { /* set pointer to Dialog status */ pObj->pDialogStatus = (WM_DIALOG_STATUS*)pMsg->Data.p; } else { /* return pointer to Dialog status */ pMsg->Data.p = pObj->pDialogStatus; } return; case WM_SET_FOCUS: if (pMsg->Data.v) { /* Focus received */ if (pObj->hFocussedChild && (pObj->hFocussedChild != hObj)) { WM_SetFocus(pObj->hFocussedChild); } else { pObj->hFocussedChild = WM_SetFocusOnNextChild(hObj); } pMsg->Data.v = 0; /* Focus change accepted */ } return; case WM_GET_ACCEPT_FOCUS: WIDGET_HandleActive(hObj, pMsg); return; case WM_NOTIFY_CHILD_HAS_FOCUS: _OnChildHasFocus(hObj, pObj, pMsg); return; 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_BACKTAB: pObj->hFocussedChild = WM_SetFocusOnPrevChild(hObj); break; /* Send to parent by not doing anything */ case GUI_KEY_TAB: pObj->hFocussedChild = WM_SetFocusOnNextChild(hObj); break; /* Send to parent by not doing anything */ } } break; case WM_PAINT: LCD_SetBkColor(WINDOW__DefaultBkColor); GUI_Clear(); break; case WM_GET_BKCOLOR: pMsg->Data.Color = WINDOW__DefaultBkColor; return; /* Message handled */ } if (cb) { (*cb)(pMsg); } else { WM_DefaultProc(pMsg); } }
/********************************************************************* * * _OnPaint */ static void _OnPaint(LISTBOX_Handle hObj, LISTBOX_Obj* pObj, WM_MESSAGE* pMsg) { WIDGET_ITEM_DRAW_INFO ItemInfo; GUI_RECT RectInside, RectItem, ClipRect; int ItemDistY, NumItems, i; NumItems = LISTBOX__GetNumItems(pObj); GUI_SetFont(pObj->Props.pFont); /* Calculate clipping rectangle */ ClipRect = *(const GUI_RECT*)pMsg->Data.p; GUI_MoveRect(&ClipRect, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0); WM_GetInsideRectExScrollbar(hObj, &RectInside); GUI__IntersectRect(&ClipRect, &RectInside); RectItem.x0 = ClipRect.x0; RectItem.x1 = ClipRect.x1; /* Fill item info structure */ ItemInfo.Cmd = WIDGET_ITEM_DRAW; ItemInfo.hWin = hObj; ItemInfo.x0 = RectInside.x0 - pObj->ScrollStateH.v; ItemInfo.y0 = RectInside.y0; /* Do the drawing */ for (i = pObj->ScrollStateV.v; i < NumItems; i++) { RectItem.y0 = ItemInfo.y0; /* Break when all other rows are outside the drawing area */ if (RectItem.y0 > ClipRect.y1) { break; } ItemDistY = _GetItemSizeY(hObj, pObj, i); RectItem.y1 = RectItem.y0 + ItemDistY - 1; /* Make sure that we draw only when row is in drawing area */ if (RectItem.y1 >= ClipRect.y0) { /* Set user clip rect */ WM_SetUserClipArea(&RectItem); /* Fill item info structure */ ItemInfo.ItemIndex = i; /* Draw item */ if (pObj->pfDrawItem) { pObj->pfDrawItem(&ItemInfo); } else { LISTBOX_OwnerDraw(&ItemInfo); } } ItemInfo.y0 += ItemDistY; } WM_SetUserClipArea(NULL); /* Calculate & clear 'data free' area */ RectItem.y0 = ItemInfo.y0; RectItem.y1 = RectInside.y1; LCD_SetBkColor(pObj->Props.aBackColor[0]); GUI_ClearRectEx(&RectItem); /* Draw the 3D effect (if configured) */ WIDGET__EFFECT_DrawDown(&pObj->Widget); }
static void _InitContext(GUI_CONTEXT* pContext) { #if GUI_SUPPORT_MEMDEV GUI_SelectLCD(); #else LCD_SetClipRectMax(); #endif pContext->pLCD_HL = &LCD_HL_APIList; pContext->pAFont = GUI_DEFAULT_FONT; pContext->pClipRect_HL = &GUI_Context.ClipRect; pContext->PenSize = 1; /* Variables in WM module */ #if GUI_WINSUPPORT pContext->hAWin = WM_GetDesktopWindow(); #endif /* Variables in GUI_AA module */ pContext->AA_Factor = 3; LCD_SetBkColor(GUI_DEFAULT_BKCOLOR); LCD_SetColor(GUI_DEFAULT_COLOR); }
/********************************************************************* * * _Paint */ static void _Paint(DROPDOWN_Handle hObj) { int Border; GUI_RECT r; const char* s; int InnerSize, ColorIndex; DROPDOWN_Obj* pObj; int TextBorderSize; /* Do some initial calculations */ pObj = DROPDOWN_H2P(hObj); Border = pObj->Widget.pEffect->EffectSize; TextBorderSize = pObj->Props.TextBorderSize; GUI_SetFont(pObj->Props.pFont); ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 2 : 1; s = _GetpItem(pObj, pObj->Sel); WM_GetClientRect(&r); GUI__ReduceRect(&r, &r, Border); InnerSize = r.y1 - r.y0 + 1; /* Draw the 3D effect (if configured) */ WIDGET__EFFECT_DrawDown(&pObj->Widget); /* Draw the outer text frames */ r.x1 -= InnerSize; /* Spare square area to the right */ LCD_SetColor(pObj->Props.aBackColor[ColorIndex]); /* Draw the text */ LCD_SetBkColor(pObj->Props.aBackColor[ColorIndex]); GUI_FillRectEx(&r); r.x0 += TextBorderSize; r.x1 -= TextBorderSize; LCD_SetColor (pObj->Props.aTextColor[ColorIndex]); GUI_DispStringInRect(s, &r, pObj->Props.Align);/**/ /* Draw arrow */ WM_GetClientRect(&r); GUI__ReduceRect(&r, &r, Border); r.x0 = r.x1 + 1 - InnerSize; LCD_SetColor(0xc0c0c0); GUI_FillRectEx(&r); LCD_SetColor(GUI_BLACK); _DrawTriangleDown((r.x1 + r.x0) / 2, r.y0 + 5, (r.y1 - r.y0 - 8) / 2); WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &r); }
/********************************************************************* * * _Paint */ static void _Paint(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, WM_MESSAGE* pMsg) { const GUI_ARRAY* pRow; GUI_RECT ClipRect, Rect; int NumRows, NumVisRows, NumColumns; int LBorder, RBorder, EffectSize; int xPos, yPos, Width, RowDistY; int Align, i, j, EndRow; /* Init some values */ NumColumns = HEADER_GetNumItems(pObj->hHeader); NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); NumVisRows = _GetNumVisibleRows(hObj, pObj); RowDistY = LISTVIEW__GetRowDistY(pObj); LBorder = pObj->LBorder; RBorder = pObj->RBorder; EffectSize = pObj->Widget.pEffect->EffectSize; yPos = HEADER_GetHeight(pObj->hHeader) + EffectSize; EndRow = pObj->ScrollStateV.v + (((NumVisRows + 1) > NumRows) ? NumRows : NumVisRows + 1); /* Calculate clipping rectangle */ ClipRect = *(const GUI_RECT*)pMsg->Data.p; GUI_MoveRect(&ClipRect, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0); WM_GetInsideRectExScrollbar(hObj, &Rect); GUI__IntersectRect(&ClipRect, &Rect); /* Set drawing color, font and text mode */ LCD_SetColor(pObj->Props.aTextColor[0]); GUI_SetFont(pObj->Props.pFont); GUI_SetTextMode(GUI_TM_TRANS); /* Do the drawing */ for (i = pObj->ScrollStateV.v; i < EndRow; i++) { pRow = (const GUI_ARRAY*)GUI_ARRAY_GetpItem(&pObj->RowArray, i); if (pRow) { Rect.y0 = yPos; /* Break when all other rows are outside the drawing area */ if (Rect.y0 > ClipRect.y1) { break; } Rect.y1 = yPos + RowDistY - 1; /* Make sure that we draw only when row is in drawing area */ if (Rect.y1 >= ClipRect.y0) { int ColorIndex; /* Set background color */ if (i == pObj->Sel) { ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 2 : 1; } else { ColorIndex = 0; } LCD_SetBkColor(pObj->Props.aBkColor[ColorIndex]); /* Iterate over all columns */ if (pObj->ShowGrid) { Rect.y1--; } xPos = EffectSize - pObj->ScrollStateH.v; for (j = 0; j < NumColumns; j++) { Width = HEADER_GetItemWidth(pObj->hHeader, j); Rect.x0 = xPos; /* Break when all other columns are outside the drawing area */ if (Rect.x0 > ClipRect.x1) { break; } Rect.x1 = xPos + Width - 1; /* Make sure that we draw only when column is in drawing area */ if (Rect.x1 >= ClipRect.x0) { LISTVIEW_ITEM * pItem; pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, j); if (pItem->hItemInfo) { LISTVIEW_ITEM_INFO * pItemInfo; pItemInfo = (LISTVIEW_ITEM_INFO *)GUI_ALLOC_h2p(pItem->hItemInfo); LCD_SetBkColor(pItemInfo->aBkColor[ColorIndex]); LCD_SetColor(pItemInfo->aTextColor[ColorIndex]); } else { LCD_SetColor(pObj->Props.aTextColor[ColorIndex]); } /* Clear background */ GUI_ClearRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1); /* Draw text */ Rect.x0 += LBorder; Rect.x1 -= RBorder; Align = *((int*)GUI_ARRAY_GetpItem(&pObj->AlignArray, j)); GUI_DispStringInRect(pItem->acText, &Rect, Align); if (pItem->hItemInfo) { LCD_SetBkColor(pObj->Props.aBkColor[ColorIndex]); } } xPos += Width; } /* Clear unused area to the right of items */ if (xPos <= ClipRect.x1) { GUI_ClearRect(xPos, Rect.y0, ClipRect.x1, Rect.y1); } } yPos += RowDistY; } } /* Clear unused area below items */ if (yPos <= ClipRect.y1) { LCD_SetBkColor(pObj->Props.aBkColor[0]); GUI_ClearRect(ClipRect.x0, yPos, ClipRect.x1, ClipRect.y1); } /* Draw grid */ if (pObj->ShowGrid) { LCD_SetColor(pObj->Props.GridColor); yPos = HEADER_GetHeight(pObj->hHeader) + EffectSize - 1; for (i = 0; i < NumVisRows; i++) { yPos += RowDistY; /* Break when all other rows are outside the drawing area */ if (yPos > ClipRect.y1) { break; } /* Make sure that we draw only when row is in drawing area */ if (yPos >= ClipRect.y0) { GUI_DrawHLine(yPos, ClipRect.x0, ClipRect.x1); } } xPos = EffectSize - pObj->ScrollStateH.v; for (i = 0; i < NumColumns; i++) { xPos += HEADER_GetItemWidth(pObj->hHeader, i); /* Break when all other columns are outside the drawing area */ if (xPos > ClipRect.x1) { break; } /* Make sure that we draw only when column is in drawing area */ if (xPos >= ClipRect.x0) { GUI_DrawVLine(xPos, ClipRect.y0, ClipRect.y1); } } } /* Draw the effect */ WIDGET__EFFECT_DrawDown(&pObj->Widget); }
/********************************************************************* * * _Paint */ static void _Paint(BUTTON_Obj* pObj, BUTTON_Handle hObj) { const char* s = NULL; unsigned int Index; int State, PressedState, ColorIndex; GUI_RECT rClient, rInside; State = pObj->Widget.State; PressedState = (State & BUTTON_STATE_PRESSED) ? 1 : 0; ColorIndex = (WM__IsEnabled(hObj)) ? PressedState : 2; GUI_SetFont(pObj->Props.pFont); GUI_DEBUG_LOG("BUTTON: Paint(..)\n"); if (pObj->hpText) { s = (const char*) GUI_ALLOC_h2p(pObj->hpText); } GUI_GetClientRect(&rClient); /* Start drawing */ rInside = rClient; /* Draw the 3D effect (if configured) */ #if BUTTON_USE_3D { int EffectSize; if ((PressedState) == 0) { pObj->Widget.pEffect->pfDrawUp(); /* _WIDGET_EFFECT_3D_DrawUp(); */ EffectSize = pObj->Widget.pEffect->EffectSize; } else { LCD_SetColor(0x000000); GUI_DrawRect(rClient.y0, rClient.x0, rClient.x1, rClient.y1); EffectSize = 1; } GUI__ReduceRect(&rInside, &rInside, EffectSize); } #endif /* Draw background */ LCD_SetBkColor (pObj->Props.aBkColor[ColorIndex]); LCD_SetColor (pObj->Props.aTextColor[ColorIndex]); WM_SetUserClipRect(&rInside); GUI_Clear(); /* Draw bitmap. If we have only one, we will use it. If we have to we will use the second one (Index 1) for the pressed state */ if (ColorIndex < 2) { Index = (pObj->ahDrawObj[BUTTON_BI_PRESSED] && PressedState) ? BUTTON_BI_PRESSED : BUTTON_BI_UNPRESSED; } else { Index = pObj->ahDrawObj[BUTTON_BI_DISABLED] ? BUTTON_BI_DISABLED : BUTTON_BI_UNPRESSED; } GUI_DRAW__Draw(pObj->ahDrawObj[Index], 0, 0); /* Draw the actual button (background and text) */ { GUI_RECT r; r = rInside; #if BUTTON_USE_3D if (PressedState) { GUI_MoveRect(&r, BUTTON_3D_MOVE_X,BUTTON_3D_MOVE_Y); } #endif GUI_SetTextMode(GUI_TM_TRANS); GUI_DispStringInRect(s, &r, pObj->Props.Align); } /* Draw focus */ if (State & BUTTON_STATE_FOCUS) { LCD_SetColor(pObj->Props.FocusColor); GUI_DrawFocusRect(&rClient, 2); } WM_SetUserClipRect(NULL); }
/********************************************************************* * * _OnPaint * * Purpose: * Paints the RADIO button. * The button can actually consist of multiple buttons (NumItems). * The focus rectangle will be drawn on top of the text if any text is set, * otherwise around the entire buttons. */ static void _OnPaint(RADIO_Handle hObj, RADIO_Obj* pObj) { const GUI_BITMAP* pBmRadio; const GUI_BITMAP* pBmCheck; const char* pText; GUI_FONTINFO FontInfo; GUI_RECT Rect, r, rFocus = {0}; int i, y, HasFocus, FontDistY; U8 SpaceAbove, CHeight, FocusBorder; /* Init some data */ WIDGET__GetClientRect(&pObj->Widget, &rFocus); HasFocus = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 1 : 0; pBmRadio = pObj->apBmRadio[WM__IsEnabled(hObj)]; pBmCheck = pObj->pBmCheck; rFocus.x1 = pBmRadio->XSize + RADIO_BORDER * 2 - 1; rFocus.y1 = pObj->Height + ((pObj->NumItems - 1) * pObj->Spacing) - 1; /* Select font and text color */ LCD_SetColor(pObj->TextColor); GUI_SetFont(pObj->pFont); GUI_SetTextMode(GUI_TM_TRANS); /* Get font infos */ GUI_GetFontInfo(pObj->pFont, &FontInfo); FontDistY = GUI_GetFontDistY(); CHeight = FontInfo.CHeight; SpaceAbove = FontInfo.Baseline - CHeight; Rect.x0 = pBmRadio->XSize + RADIO_BORDER * 2 + 2; Rect.y0 = (CHeight <= pObj->Height) ? ((pObj->Height - CHeight) / 2) : 0; Rect.y1 = Rect.y0 + CHeight - 1; FocusBorder = (FontDistY <= 12) ? 2 : 3; if (Rect.y0 < FocusBorder) { FocusBorder = Rect.y0; } /* Clear inside ... Just in case */ /* Fill with parents background color */ #if WM_SUPPORT_TRANSPARENCY if (!WM_GetHasTrans(hObj)) #endif { if (pObj->BkColor != GUI_INVALID_COLOR) { LCD_SetBkColor(pObj->BkColor); } else { LCD_SetBkColor(RADIO_DEFAULT_BKCOLOR); } GUI_Clear(); } /* Iterate over all items */ for (i = 0; i < pObj->NumItems; i++) { y = i * pObj->Spacing; /* Draw the radio button bitmap */ GUI_DrawBitmap(pBmRadio, RADIO_BORDER, RADIO_BORDER + y); /* Draw the check bitmap */ if (pObj->Sel == i) { GUI_DrawBitmap(pBmCheck, RADIO_BORDER + (pBmRadio->XSize - pBmCheck->XSize) / 2, RADIO_BORDER + ((pBmRadio->YSize - pBmCheck->YSize) / 2) + y); } /* Draw text if available */ pText = (const char*)GUI_ARRAY_GetpItem(&pObj->TextArray, i); if (pText) { if (*pText) { r = Rect; r.x1 = r.x0 + GUI_GetStringDistX(pText) - 2; GUI_MoveRect(&r, 0, y); GUI_DispStringAt(pText, r.x0, r.y0 - SpaceAbove); /* Calculate focus rect */ if (HasFocus && (pObj->Sel == i)) { _ResizeRect(&rFocus, &r, FocusBorder); } } } } /* Draw the focus rect */ if (HasFocus) { LCD_SetColor(GUI_BLACK); WIDGET__DrawFocusRect(&pObj->Widget, &rFocus, 0); } }
/********************************************************************* * * _Paint */ static void _Paint(CHECKBOX_Obj* pObj, CHECKBOX_Handle hObj) { GUI_RECT RectBox = {0}; int ColorIndex, EffectSize, Index; EffectSize = pObj->Widget.pEffect->EffectSize; ColorIndex = WM__IsEnabled(hObj); /* Clear inside ... Just in case */ /* Fill with parents background color */ #if WM_SUPPORT_TRANSPARENCY if (!WM_GetHasTrans(hObj)) #endif { if (pObj->Props.BkColor == GUI_INVALID_COLOR) { LCD_SetBkColor(WIDGET__GetBkColor(hObj)); } else { LCD_SetBkColor(pObj->Props.BkColor); } GUI_Clear(); } /* Get size from bitmap */ RectBox.x1 = pObj->Props.apBm[CHECKBOX_BI_ACTIV]->XSize - 1 + 2 * EffectSize; RectBox.y1 = pObj->Props.apBm[CHECKBOX_BI_ACTIV]->YSize - 1 + 2 * EffectSize; WM_SetUserClipRect(&RectBox); /* Clear inside ... Just in case */ LCD_SetBkColor(pObj->Props.aBkColorBox[ColorIndex]); GUI_Clear(); Index = pObj->CurrentState * 2 + ColorIndex; if (pObj->Props.apBm[Index]) { GUI_DrawBitmap(pObj->Props.apBm[Index], EffectSize, EffectSize); } /* Draw the effect arround the box */ WIDGET__EFFECT_DrawDownRect(&pObj->Widget, &RectBox); WM_SetUserClipRect(NULL); /* Draw text if needed */ if (pObj->hpText) { const char * s; GUI_RECT RectText; /* Draw the text */ s = (const char *) GUI_ALLOC_h2p(pObj->hpText); WM_GetClientRect(&RectText); RectText.x0 += RectBox.x1 + 1 + pObj->Props.Spacing; GUI_SetTextMode(GUI_TM_TRANS); LCD_SetColor(pObj->Props.TextColor); GUI_SetFont(pObj->Props.pFont); GUI_DispStringInRect(s, &RectText, pObj->Props.Align); /* Draw focus rectangle */ if (pObj->Widget.State & WIDGET_STATE_FOCUS) { int xSizeText = GUI_GetStringDistX(s); int ySizeText = GUI_GetFontSizeY(); GUI_RECT RectFocus = RectText; switch (pObj->Props.Align & ~(GUI_TA_HORIZONTAL)) { case GUI_TA_VCENTER: RectFocus.y0 = (RectText.y1 - ySizeText + 1) / 2; break; case GUI_TA_BOTTOM: RectFocus.y0 = RectText.y1 - ySizeText; break; } switch (pObj->Props.Align & ~(GUI_TA_VERTICAL)) { case GUI_TA_HCENTER: RectFocus.x0 += ((RectText.x1 - RectText.x0) - xSizeText) / 2; break; case GUI_TA_RIGHT: RectFocus.x0 += (RectText.x1 - RectText.x0) - xSizeText; break; } RectFocus.x1 = RectFocus.x0 + xSizeText - 1; RectFocus.y1 = RectFocus.y0 + ySizeText - 1; LCD_SetColor(pObj->Props.FocusColor); GUI_DrawFocusRect(&RectFocus, -1); } } }
/********************************************************************* * * _Paint */ static void _Paint(SLIDER_Obj* pObj, WM_HWIN hObj) { GUI_RECT r, rFocus, rSlider, rSlot; int x0, xsize, i, Range, NumTicks; WIDGET__GetClientRect(&pObj->Widget, &rFocus); GUI__ReduceRect(&r, &rFocus, 1); NumTicks = pObj->NumTicks; xsize = r.x1 - r.x0 + 1 - pObj->Width; x0 = r.x0 + pObj->Width / 2; Range = pObj->Max - pObj->Min; if (Range == 0) { Range = 1; } /* Fill with parents background color */ #if !SLIDER_SUPPORT_TRANSPARENCY /* Not needed any more, since window is transparent*/ if (pObj->Props.BkColor == GUI_INVALID_COLOR) { LCD_SetBkColor(WIDGET__GetBkColor(hObj)); } else { LCD_SetBkColor(pObj->Props.BkColor); } GUI_Clear(); #else if (!WM_GetHasTrans(hObj)) { LCD_SetBkColor(pObj->Props.BkColor); GUI_Clear(); } #endif /* Calculate Slider position */ rSlider = r; rSlider.y0 = 5; rSlider.x0 = x0 + (U32)xsize * (U32)(pObj->v - pObj->Min) / Range - pObj->Width / 2; rSlider.x1 = rSlider.x0 + pObj->Width; /* Calculate Slot position */ rSlot.x0 = x0; rSlot.x1 = x0 + xsize; rSlot.y0 = (rSlider.y0 + rSlider.y1) / 2 - 1; rSlot.y1 = rSlot.y0 + 3; WIDGET__EFFECT_DrawDownRect(&pObj->Widget, &rSlot); /* Draw slot */ /* Draw the ticks */ if (NumTicks < 0) { NumTicks = Range + 1; if (NumTicks > (xsize / 5)) { NumTicks = 11; } } if (NumTicks > 1) { LCD_SetColor(GUI_BLACK); for (i = 0; i < NumTicks; i++) { int x = x0 + xsize * i / (NumTicks - 1); WIDGET__DrawVLine(&pObj->Widget, x, 1, 3); } } /* Draw the slider itself */ LCD_SetColor(pObj->Props.Color); WIDGET__FillRectEx(&pObj->Widget, &rSlider); LCD_SetColor(GUI_BLACK); WIDGET__EFFECT_DrawUpRect(&pObj->Widget, &rSlider); /* Draw focus */ if (pObj->Widget.State & WIDGET_STATE_FOCUS) { LCD_SetColor(pObj->Props.FocusColor); WIDGET__DrawFocusRect(&pObj->Widget, &rFocus, 0); } }
/********************************************************************* * * LISTBOX_OwnerDraw */ int LISTBOX_OwnerDraw(const WIDGET_ITEM_DRAW_INFO* pDrawItemInfo) { switch (pDrawItemInfo->Cmd) { case WIDGET_ITEM_GET_XSIZE: { LISTBOX_Obj* pObj; const GUI_FONT GUI_UNI_PTR* pOldFont; const char* s; int DistX; pObj = LISTBOX_H2P(pDrawItemInfo->hWin); pOldFont = GUI_SetFont(pObj->Props.pFont); s = LISTBOX__GetpString(pObj, pDrawItemInfo->ItemIndex); DistX = GUI_GetStringDistX(s); GUI_SetFont(pOldFont); return DistX; } case WIDGET_ITEM_GET_YSIZE: { LISTBOX_Obj* pObj; pObj = LISTBOX_H2P(pDrawItemInfo->hWin); return GUI_GetYDistOfFont(pObj->Props.pFont) + pObj->ItemSpacing; } case WIDGET_ITEM_DRAW: { LISTBOX_Obj* pObj; LISTBOX_ITEM* pItem; WM_HMEM hItem; GUI_RECT r; int FontDistY; int ItemIndex = pDrawItemInfo->ItemIndex; const char* s; int ColorIndex; char IsDisabled; char IsSelected; pObj = LISTBOX_H2P(pDrawItemInfo->hWin); hItem = GUI_ARRAY_GethItem(&pObj->ItemArray, ItemIndex); pItem = (LISTBOX_ITEM *)GUI_ALLOC_h2p(hItem); WM_GetInsideRect(&r); FontDistY = GUI_GetFontDistY(); /* Calculate color index */ IsDisabled = (pItem->Status & LISTBOX_ITEM_DISABLED) ? 1 : 0; IsSelected = (pItem->Status & LISTBOX_ITEM_SELECTED) ? 1 : 0; if (pObj->Flags & LISTBOX_SF_MULTISEL) { if (IsDisabled) { ColorIndex = 3; } else { ColorIndex = (IsSelected) ? 2 : 0; } } else { if (IsDisabled) { ColorIndex = 3; } else { if (ItemIndex == pObj->Sel) { ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 2 : 1; } else { ColorIndex = 0; } } } /* Display item */ LCD_SetBkColor(pObj->Props.aBackColor[ColorIndex]); LCD_SetColor (pObj->Props.aTextColor[ColorIndex]); s = LISTBOX__GetpString(pObj, ItemIndex); GUI_SetTextMode(GUI_TM_TRANS); GUI_Clear(); GUI_DispStringAt(s, pDrawItemInfo->x0 + 1, pDrawItemInfo->y0); /* Display focus rectangle */ if ((pObj->Flags & LISTBOX_SF_MULTISEL) && (ItemIndex == pObj->Sel)) { GUI_RECT rFocus; rFocus.x0 = pDrawItemInfo->x0; rFocus.y0 = pDrawItemInfo->y0; rFocus.x1 = r.x1; rFocus.y1 = pDrawItemInfo->y0 + FontDistY - 1; LCD_SetColor(GUI_WHITE - pObj->Props.aBackColor[ColorIndex]); GUI_DrawFocusRect(&rFocus, 0); } return 0; } } return 0; }
/********************************************************************* * * _Paint */ static void _Paint(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, WM_MESSAGE* pMsg) { const LISTVIEW_ROW* pRow; GUI_RECT ClipRect, Rect; int NumRows, NumVisRows, NumColumns; int LBorder, RBorder, EffectSize; int xPos, yPos, Width, RowDistY; int Align, i, j, EndRow; /* Init some values */ NumColumns = LISTVIEW__GetNumColumns(pObj); NumRows = LISTVIEW__GetNumRows(pObj); NumVisRows = _GetNumVisibleRows(hObj, pObj); RowDistY = LISTVIEW__GetRowDistY(pObj); LBorder = pObj->LBorder; RBorder = pObj->RBorder; EffectSize = pObj->Widget.pEffect->EffectSize; yPos = HEADER_GetHeight(pObj->hHeader) + EffectSize; /* Calculate clipping rectangle */ ClipRect = *(const GUI_RECT*)pMsg->Data.p; GUI_MoveRect(&ClipRect, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0); WM_GetInsideRectExScrollbar(hObj, &Rect); GUI__IntersectRect(&ClipRect, &Rect); /* Set drawing color, font and text mode */ LCD_SetColor(pObj->Props.aTextColor[0]); GUI_SetFont(pObj->Props.pFont); GUI_SetTextMode(GUI_TM_TRANS); /* Sort before drawing, because scroll position may change */ if (pObj->hSort && (pObj->SortIndex >= 0)) { LISTVIEW_SORT * pSort; pSort = (LISTVIEW_SORT *)GUI_ALLOC_h2p(pObj->hSort); if (pSort->fpSort(hObj)) { return; /* Return on error */ } } /* Calculate end row after sorting, because scroll position may have changed */ EndRow = pObj->ScrollStateV.v + (((NumVisRows + 1) > NumRows) ? NumRows : NumVisRows + 1); /* Do the drawing */ for (i = pObj->ScrollStateV.v; i < EndRow; i++) { pRow = _GetpRow(pObj, i); if (pRow) { Rect.y0 = yPos; /* Break when all other rows are outside the drawing area */ if (Rect.y0 > ClipRect.y1) { break; } Rect.y1 = yPos + RowDistY - 1; /* Make sure that we draw only when row is in drawing area */ if (Rect.y1 >= ClipRect.y0) { int ColorIndex; /* Set background color */ if (pRow->Disabled) { ColorIndex = LISTVIEW_CI_DISABLED; } else if (i == pObj->Sel) { ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? LISTVIEW_CI_SELFOCUS : LISTVIEW_CI_SEL; } else { ColorIndex = LISTVIEW_CI_UNSEL; } LCD_SetBkColor(pObj->Props.aBkColor[ColorIndex]); /* Iterate over all columns */ if (pObj->ShowGrid) { Rect.y1--; } xPos = EffectSize - pObj->ScrollStateH.v; for (j = 0; j < NumColumns; j++) { Width = HEADER_GetItemWidth(pObj->hHeader, j); Rect.x0 = xPos; /* Break when all other columns are outside the drawing area */ if (Rect.x0 > ClipRect.x1) { break; } Rect.x1 = xPos + Width - 1; /* Make sure that we draw only when column is in drawing area */ if (Rect.x1 >= ClipRect.x0) { LISTVIEW_COLUMN* pColumn; LISTVIEW_CELL* pCell; pCell = (LISTVIEW_CELL*)GUI_ARRAY_GetpItem(&pRow->CellArray, j); if (pCell) { if (pCell->hCellInfo) { LISTVIEW_CELL_INFO* pCellInfo; pCellInfo = (LISTVIEW_CELL_INFO*) GUI_ALLOC_h2p(pCell->hCellInfo); LCD_SetBkColor(pCellInfo->aBkColor[ColorIndex]); LCD_SetColor(pCellInfo->aTextColor[ColorIndex]); } else { LCD_SetColor(pObj->Props.aTextColor[ColorIndex]); } /* Clear background */ GUI_ClearRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1); /* Draw text */ Rect.x0 += LBorder; Rect.x1 -= RBorder; pColumn = (LISTVIEW_COLUMN*) GUI_ARRAY_GetpItem(&pObj->ColumnArray, j); Align = pColumn->Align; GUI_DispStringInRect(pCell->acText, &Rect, Align); if (pCell->hCellInfo) { LCD_SetBkColor(pObj->Props.aBkColor[ColorIndex]); } } } xPos += Width; } /* Clear unused area to the right of items */ if (xPos <= ClipRect.x1) { GUI_ClearRect(xPos, Rect.y0, ClipRect.x1, Rect.y1); } } yPos += RowDistY; } } /* Clear unused area below items */ if (yPos <= ClipRect.y1) { LCD_SetBkColor(pObj->Props.aBkColor[0]); GUI_ClearRect(ClipRect.x0, yPos, ClipRect.x1, ClipRect.y1); } /* Draw grid */ if (pObj->ShowGrid) { LCD_SetColor(pObj->Props.GridColor); yPos = HEADER_GetHeight(pObj->hHeader) + EffectSize - 1; for (i = 0; i < NumVisRows; i++) { yPos += RowDistY; /* Break when all other rows are outside the drawing area */ if (yPos > ClipRect.y1) { break; } /* Make sure that we draw only when row is in drawing area */ if (yPos >= ClipRect.y0) { GUI_DrawHLine(yPos, ClipRect.x0, ClipRect.x1); } } xPos = EffectSize - pObj->ScrollStateH.v; for (i = 0; i < NumColumns; i++) { xPos += HEADER_GetItemWidth(pObj->hHeader, i); /* Break when all other columns are outside the drawing area */ if (xPos > ClipRect.x1) { break; } /* Make sure that we draw only when column is in drawing area */ if (xPos >= ClipRect.x0) { GUI_DrawVLine(xPos, ClipRect.y0, ClipRect.y1); } } } /* Draw the effect */ WIDGET__EFFECT_DrawDown(&pObj->Widget); }
/********************************************************************* * * _Paint */ static void _Paint(EDIT_Obj* pObj, EDIT_Handle hObj) { GUI_RECT rFillRect, rInside, rText, rInvert; const char GUI_UNI_PTR * pText = NULL; int IsEnabled, CursorWidth = 0; IsEnabled = WM__IsEnabled(hObj); /* Set colors and font */ LCD_SetBkColor(pObj->Props.aBkColor[IsEnabled]); LCD_SetColor(pObj->Props.aTextColor[0]); GUI_SetFont(pObj->Props.pFont); /* Calculate size */ WIDGET__GetInsideRect(&pObj->Widget, &rFillRect); if (pObj->hpText) { pText = (const char*) GUI_ALLOC_h2p(pObj->hpText); } rInside = rFillRect; rInside.x0 += pObj->Props.Border + EDIT_XOFF; rInside.x1 -= pObj->Props.Border + EDIT_XOFF; GUI__CalcTextRect(pText, &rInside, &rText, pObj->Props.Align); /* Calculate position and size of cursor */ if (pObj->Widget.State & WIDGET_STATE_FOCUS) { int NumChars; CursorWidth = ((pObj->XSizeCursor > 0) ? (pObj->XSizeCursor) : (1)); NumChars = GUI__GetNumChars(pText); if (pText) { U16 Char; int i, IsRTL = 0; if ((pObj->EditMode != GUI_EDIT_MODE_INSERT) || (pObj->SelSize)) { if (pObj->CursorPos < NumChars) { if (pObj->SelSize) { CursorWidth = 0; for (i = pObj->CursorPos; i < (int)(pObj->CursorPos + pObj->SelSize); i++) { Char = GUI__GetCursorCharacter(pText, i, NumChars, 0); CursorWidth += GUI_GetCharDistX(Char); } if (!CursorWidth) { CursorWidth = 1; } } else { Char = GUI__GetCursorCharacter(pText, pObj->CursorPos, NumChars, &IsRTL); CursorWidth = GUI_GetCharDistX(Char); } } } rInvert = rText; if (IsRTL) { rInvert.x0 -= CursorWidth; } rInvert.x0 += GUI__GetCursorPosX(pText, pObj->CursorPos, NumChars); } } /* WM loop */ WM_ITERATE_START(NULL) { /* Set clipping rectangle */ WM_SetUserClipRect(&rFillRect); /* Display text */ WIDGET__FillStringInRect(pText, &rFillRect, &rInside, &rText); /* Display cursor if needed */ if (pObj->Widget.State & WIDGET_STATE_FOCUS) { GUI_InvertRect(rInvert.x0, rInvert.y0, rInvert.x0 + CursorWidth - 1, rInvert.y1); } WM_SetUserClipRect(NULL); /* Draw the 3D effect (if configured) */ WIDGET__EFFECT_DrawDown(&pObj->Widget); } WM_ITERATE_END(); }