/********************************************************************* * * LISTVIEW_DeleteColumn */ void LISTVIEW_DeleteColumn(LISTVIEW_Handle hObj, unsigned Index) { if (hObj) { LISTVIEW_Obj* pObj; WM_LOCK(); pObj = LISTVIEW_H2P(hObj); if (Index < GUI_ARRAY_GetNumItems(&pObj->AlignArray)) { unsigned NumRows, i; GUI_ARRAY* pRow; HEADER_DeleteItem(pObj->hHeader, Index); GUI_ARRAY_DeleteItem(&pObj->AlignArray, Index); NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); for (i = 0; i < NumRows; i++) { LISTVIEW_ITEM * pItem; pRow = (GUI_ARRAY*)GUI_ARRAY_GetpItem(&pObj->RowArray, i); /* Delete attached info items */ pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, Index); if (pItem->hItemInfo) { GUI_ALLOC_Free(pItem->hItemInfo); } /* Delete cell */ GUI_ARRAY_DeleteItem(pRow, Index); } LISTVIEW__UpdateScrollParas(hObj, pObj); LISTVIEW__InvalidateInsideArea(hObj, pObj); } WM_UNLOCK(); } }
/********************************************************************* * * LISTVIEW__UpdateScrollParas * * Purpose: * Calculates number of items and page size of both vertical * and horizontal scrollbar. After this LISTVIEW__UpdateScrollPos will * be called to ensure scroll positions are in valid ranges. */ int LISTVIEW__UpdateScrollParas(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj) { int NumRows, IsRequired; int xSize, xSizeHeader; unsigned NumVisibleRows; NumVisibleRows = _GetNumVisibleRows(hObj, pObj); xSize = _GetXSize(hObj); xSizeHeader = _GetHeaderWidth(pObj); if (pObj->Flags & LISTVIEW_SF_AUTOSCROLLBAR_V) { IsRequired = (NumVisibleRows < GUI_ARRAY_GetNumItems(&pObj->RowArray)); WM_SetScrollbarV(hObj, IsRequired); } if (pObj->Flags & LISTVIEW_SF_AUTOSCROLLBAR_H) { IsRequired = (xSizeHeader > xSize); WM_SetScrollbarH(hObj, IsRequired); NumVisibleRows = _GetNumVisibleRows(hObj, pObj); } NumRows = LISTVIEW__GetNumRows(pObj); /* update vertical scrollbar */ pObj->ScrollStateV.PageSize = NumVisibleRows; pObj->ScrollStateV.NumItems = (NumRows) ? NumRows : 1; /* update horizontal scrollbar */ pObj->ScrollStateH.PageSize = xSize; pObj->ScrollStateH.NumItems = xSizeHeader; return LISTVIEW__UpdateScrollPos(hObj, pObj); }
/********************************************************************* * * LISTVIEW__UpdateScrollParas * * Purpose: * Calculates number of items and page size of both vertical * and horizontal scrollbar. After this LISTVIEW__UpdateScrollPos will * be called to ensure scroll positions are in valid ranges. */ int LISTVIEW__UpdateScrollParas(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj) { int NumRows; NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); /* update vertical scrollbar */ pObj->ScrollStateV.PageSize = _GetNumVisibleRows(hObj, pObj); pObj->ScrollStateV.NumItems = (NumRows) ? NumRows : 1; /* update horizontal scrollbar */ pObj->ScrollStateH.PageSize = _GetXSize(hObj); pObj->ScrollStateH.NumItems = _GetHeaderWidth(pObj, pObj->hHeader); return LISTVIEW__UpdateScrollPos(hObj, pObj); }
/********************************************************************* * * LISTVIEW_GetNumColumns */ unsigned LISTVIEW_GetNumColumns(LISTVIEW_Handle hObj) { unsigned NumColumns = 0; if (hObj) { LISTVIEW_Obj* pObj; WM_LOCK(); pObj = LISTVIEW_H2P(hObj); NumColumns = GUI_ARRAY_GetNumItems(&pObj->AlignArray); WM_UNLOCK(); } return NumColumns; }
/********************************************************************* * * _FreeAttached * * Purpose: * Delete attached objects (if any). */ static void _FreeAttached(LISTVIEW_Obj * pObj) { int i, j, NumRows, NumColumns; NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); NumColumns = GUI_ARRAY_GetNumItems(&pObj->AlignArray); for (i = 0; i < NumRows; i++) { GUI_ARRAY * pRow; pRow = (GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, i); /* Delete attached info items */ for (j = 0; j < NumColumns; j++) { LISTVIEW_ITEM * pItem; pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, j); if (pItem->hItemInfo) { GUI_ALLOC_Free(pItem->hItemInfo); } } /* Delete row */ GUI_ARRAY_Delete(pRow); } GUI_ARRAY_Delete(&pObj->AlignArray); GUI_ARRAY_Delete(&pObj->RowArray); }
/********************************************************************* * * LISTVIEW_DeleteRow */ void LISTVIEW_DeleteRow(LISTVIEW_Handle hObj, unsigned Index) { if (hObj) { LISTVIEW_Obj* pObj; unsigned NumRows; WM_LOCK(); pObj = LISTVIEW_H2P(hObj); NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); if (Index < NumRows) { unsigned NumColumns, i; GUI_ARRAY* pRow; pRow = (GUI_ARRAY*)GUI_ARRAY_GetpItem(&pObj->RowArray, Index); /* Delete attached info items */ NumColumns = GUI_ARRAY_GetNumItems(pRow); for (i = 0; i < NumColumns; i++) { LISTVIEW_ITEM * pItem; pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, i); if (pItem->hItemInfo) { GUI_ALLOC_Free(pItem->hItemInfo); } } /* Delete row */ GUI_ARRAY_Delete(pRow); GUI_ARRAY_DeleteItem(&pObj->RowArray, Index); /* Adjust properties */ if (pObj->Sel == (signed int)Index) { pObj->Sel = -1; } if (pObj->Sel > (signed int)Index) { pObj->Sel--; } if (LISTVIEW__UpdateScrollParas(hObj, pObj)) { LISTVIEW__InvalidateInsideArea(hObj, pObj); } else { _InvalidateRowAndBelow(hObj, pObj, Index); } } WM_UNLOCK(); } }
/********************************************************************* * * RADIO_SetFont */ void RADIO_SetFont(RADIO_Handle hObj, const GUI_FONT GUI_UNI_PTR* pFont) { if (hObj) { RADIO_Obj* pObj; WM_LOCK(); pObj = RADIO_H2P(hObj); if (pFont != pObj->pFont) { pObj->pFont = pFont; if (GUI_ARRAY_GetNumItems(&pObj->TextArray)) { WM_InvalidateWindow(hObj); } } WM_UNLOCK(); } }
/********************************************************************* * * LISTVIEW_SetTextAlign */ void LISTVIEW_SetTextAlign(LISTVIEW_Handle hObj, unsigned int Index, int Align) { if (hObj) { LISTVIEW_Obj * pObj; WM_LOCK(); pObj = LISTVIEW_H2P(hObj); if (Index < GUI_ARRAY_GetNumItems(&pObj->AlignArray)) { int* pAlign; pAlign = (int *)GUI_ARRAY_GetpItem(&pObj->AlignArray, Index); if (Align != *pAlign) { *pAlign = Align; LISTVIEW__InvalidateInsideArea(hObj, pObj); } } WM_UNLOCK(); } }
/********************************************************************* * * HEADER__SetDrawObj */ void HEADER__SetDrawObj(HEADER_Handle hObj, unsigned Index, GUI_DRAW_HANDLE hDrawObj) { if (hObj) { HEADER_Obj * pObj; WM_LOCK(); pObj = HEADER_H2P(hObj); if (Index <= GUI_ARRAY_GetNumItems(&pObj->Columns)) { HEADER_COLUMN * pColumn; pColumn = (HEADER_COLUMN *)GUI_ARRAY_GetpItem(&pObj->Columns, Index); if (pColumn) { GUI_ALLOC_FreePtr(&pColumn->hDrawObj); pColumn->hDrawObj = hDrawObj; } } WM_UNLOCK(); } }
/********************************************************************* * * _SetSelFromPos */ static void _SetSelFromPos(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, const GUI_PID_STATE* pState) { GUI_RECT Rect; int x, y, HeaderHeight; HeaderHeight = HEADER_GetHeight(pObj->hHeader); WM_GetInsideRectExScrollbar(hObj, &Rect); x = pState->x - Rect.x0; y = pState->y - Rect.y0 - HeaderHeight; Rect.x1 -= Rect.x0; Rect.y1 -= Rect.y0; if ((x >= 0) && (x <= Rect.x1) && (y >= 0) && (y <= (Rect.y1 - HeaderHeight))) { unsigned Sel; Sel = (y / LISTVIEW__GetRowDistY(pObj)) + pObj->ScrollStateV.v; if (Sel < GUI_ARRAY_GetNumItems(&pObj->RowArray)) { LISTVIEW_SetSel(hObj, Sel); } } }
/********************************************************************* * * LISTBOX_AddString */ void LISTBOX_AddString(LISTBOX_Handle hObj, const char* s) { if (hObj && s) { LISTBOX_Obj* pObj; LISTBOX_ITEM Item = {0, 0}; WM_LOCK(); pObj = LISTBOX_H2P(hObj); if (GUI_ARRAY_AddItem(&pObj->ItemArray, &Item, sizeof(LISTBOX_ITEM) + strlen(s)) == 0) { unsigned ItemIndex = GUI_ARRAY_GetNumItems(&pObj->ItemArray) - 1; LISTBOX_ITEM* pItem= (LISTBOX_ITEM*)GUI_ARRAY_GetpItem(&pObj->ItemArray, ItemIndex); strcpy(pItem->acText, s); LISTBOX__InvalidateItemSize(pObj, ItemIndex); LISTBOX_UpdateScrollers(hObj); LISTBOX__InvalidateItem(hObj, pObj, ItemIndex); } WM_UNLOCK(); } }
/********************************************************************* * * LISTVIEW_AddRow */ void LISTVIEW_AddRow(LISTVIEW_Handle hObj, const GUI_ConstString* ppText) { if (hObj) { LISTVIEW_Obj* pObj; int NumRows; WM_LOCK(); pObj = LISTVIEW_H2P(hObj); NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray); /* Create GUI_ARRAY for the new row */ if (GUI_ARRAY_AddItem(&pObj->RowArray, NULL, sizeof(GUI_ARRAY)) == 0) { int i, NumColumns, NumBytes; GUI_ARRAY* pRow; const char* s; GUI_ARRAY_CREATE((GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, NumRows)); /* For higher debug levels only */ /* Add columns for the new row */ NumColumns = HEADER_GetNumItems(pObj->hHeader); for (i = 0; i < NumColumns; i++) { LISTVIEW_ITEM * pItem; pRow = (GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, NumRows); s = (ppText) ? *ppText++ : 0; if (s == 0) { ppText = 0; } NumBytes = GUI__strlen(s) + 1; /* 0 if no string is specified (s == NULL) */ GUI_ARRAY_AddItem(pRow, NULL, sizeof(LISTVIEW_ITEM) + NumBytes); pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, i); if (NumBytes > 1) { strcpy(pItem->acText, s); } } LISTVIEW__UpdateScrollParas(hObj, pObj); LISTVIEW__InvalidateRow(hObj, pObj, NumRows); } WM_UNLOCK(); } }
/********************************************************************* * * _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); }
/********************************************************************* * * LISTBOX__GetNumItems * * Returns: * Number of items */ unsigned LISTBOX__GetNumItems(const LISTBOX_Obj* pObj) { return GUI_ARRAY_GetNumItems(&pObj->ItemArray); }
/********************************************************************* * * LISTVIEW__GetNumColumns */ unsigned LISTVIEW__GetNumColumns(LISTVIEW_Obj* pObj) { return GUI_ARRAY_GetNumItems(&pObj->ColumnArray); }
/********************************************************************* * * LISTVIEW__GetNumRows */ unsigned LISTVIEW__GetNumRows(LISTVIEW_Obj* pObj) { return GUI_ARRAY_GetNumItems(&pObj->RowArray); }