⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listview.c

📁 MCB2300_ucgui_LCD320240.rar LPC2368的uc/gui的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*   											 uC/GUI
*   					 Universal graphic software for embedded applications
*
*   					(c) Copyright 2002, Micrium Inc., Weston, FL
*   					(c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
*   		   礐/GUI is protected by international copyright laws. Knowledge of the
*   		   source code may not be used to write a similar product. This file may
*   		   only be used in accordance with a license and should not be redistributed
*   		   in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File		: LISTVIEW.c
Purpose 	: Implementation of listview widget
---------------------------END-OF-HEADER------------------------------
*/

#include "GUI_ARRAY.h"
#include <stdlib.h>
#include <string.h>
#include "LISTVIEW_Private.h"
#include "HEADER.h"
#include "WIDGET.h"
#include "SCROLLBAR.h"
#include "GUIDebug.h"
#include "GUI_Protected.h"
#include "WM_Intern.h"

#if GUI_WINSUPPORT

/*********************************************************************
*
*   	Private config defaults
*
**********************************************************************
*/

/* Define default fonts */
#ifndef LISTVIEW_FONT_DEFAULT
#define LISTVIEW_FONT_DEFAULT &GUI_Font13_1
#endif

/* Define colors */
#ifndef LISTVIEW_BKCOLOR0_DEFAULT
#define LISTVIEW_BKCOLOR0_DEFAULT GUI_WHITE 	/* Not selected */
#endif

#ifndef LISTVIEW_BKCOLOR1_DEFAULT
#define LISTVIEW_BKCOLOR1_DEFAULT GUI_GRAY  	/* Selected, no focus */
#endif

#ifndef LISTVIEW_BKCOLOR2_DEFAULT
#define LISTVIEW_BKCOLOR2_DEFAULT GUI_BLUE  	/* Selected, focus */
#endif

#ifndef LISTVIEW_TEXTCOLOR0_DEFAULT
#define LISTVIEW_TEXTCOLOR0_DEFAULT GUI_BLACK   /* Not selected */
#endif

#ifndef LISTVIEW_TEXTCOLOR1_DEFAULT
#define LISTVIEW_TEXTCOLOR1_DEFAULT GUI_WHITE   /* Selected, no focus */
#endif

#ifndef LISTVIEW_TEXTCOLOR2_DEFAULT
#define LISTVIEW_TEXTCOLOR2_DEFAULT GUI_WHITE   /* Selected, focus */
#endif

#ifndef LISTVIEW_GRIDCOLOR_DEFAULT
#define LISTVIEW_GRIDCOLOR_DEFAULT GUI_LIGHTGRAY
#endif

/* Define default alignment */
#ifndef LISTVIEW_ALIGN_DEFAULT
#define LISTVIEW_ALIGN_DEFAULT (GUI_TA_VCENTER | GUI_TA_HCENTER)
#endif

/*********************************************************************
*
*   	Static data
*
**********************************************************************
*/
LISTVIEW_PROPS LISTVIEW_DefaultProps = {
LISTVIEW_BKCOLOR0_DEFAULT,
LISTVIEW_BKCOLOR1_DEFAULT,
LISTVIEW_BKCOLOR2_DEFAULT,
LISTVIEW_TEXTCOLOR0_DEFAULT,
LISTVIEW_TEXTCOLOR1_DEFAULT,
LISTVIEW_TEXTCOLOR2_DEFAULT,
LISTVIEW_GRIDCOLOR_DEFAULT,
LISTVIEW_FONT_DEFAULT
};

/*********************************************************************
*
*   	Static routines
*
**********************************************************************
*/
/*********************************************************************
*
*   	LISTVIEW__GetRowDistY
*/
unsigned LISTVIEW__GetRowDistY(const LISTVIEW_Obj *pObj)
{
	unsigned RowDistY;
	if (pObj->RowDistY)
	{
		RowDistY = pObj->RowDistY;
	}
	else
	{
		RowDistY = GUI_GetYDistOfFont(pObj->Props.pFont);
		if (pObj->ShowGrid)
		{
			RowDistY++;
		}
	}
	return RowDistY;
}

/*********************************************************************
*
*   	_GetNumVisibleRows
*
* Purpose:
*   Returns the number of visible rows according the header
*   and (if exist) horizontal scrollbar.
*
* Return value:
*   Number of visible rows. If no entire row can be displayed, this
*   function will return one.
*/
static unsigned _GetNumVisibleRows(LISTVIEW_Handle hObj, const LISTVIEW_Obj *pObj)
{
	unsigned RowDistY, ySize, r = 1;
	GUI_RECT Rect;
	WM_GetInsideRectExScrollbar(hObj, &Rect);
	ySize = Rect.y1 - Rect.y0 + 1 - HEADER_GetHeight(pObj->hHeader);
	RowDistY = LISTVIEW__GetRowDistY(pObj);
	if (RowDistY)
	{
		r = ySize / RowDistY;
		r = (r == 0) ? 1 : r;
	}
	return 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);
}

/*********************************************************************
*
*   	LISTVIEW__InvalidateInsideArea
*/
void LISTVIEW__InvalidateInsideArea(LISTVIEW_Handle hObj, LISTVIEW_Obj *pObj)
{
	GUI_RECT Rect;
	int HeaderHeight;
	HeaderHeight = HEADER_GetHeight(pObj->hHeader);
	WM_GetInsideRectExScrollbar(hObj, &Rect);
	Rect.y0 += HeaderHeight;
	WM_InvalidateRect(hObj, &Rect);
}

/*********************************************************************
*
*   	LISTVIEW__InvalidateRow
*/
void LISTVIEW__InvalidateRow(LISTVIEW_Handle hObj, LISTVIEW_Obj *pObj, int Sel)
{
	if (Sel >= 0)
	{
		GUI_RECT Rect;
		int HeaderHeight, RowDistY;
		HeaderHeight = HEADER_GetHeight(pObj->hHeader);
		RowDistY = LISTVIEW__GetRowDistY(pObj);
		WM_GetInsideRectExScrollbar(hObj, &Rect);
		Rect.y0 += HeaderHeight + (Sel - pObj->ScrollStateV.v) * RowDistY;
		Rect.y1 = Rect.y0 + RowDistY - 1;
		WM_InvalidateRect(hObj, &Rect);
	}
}

/*********************************************************************
*
*   	_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);
		}
	}
}

/*********************************************************************
*
*   	_NotifyOwner
*
* Purpose:
*   Notify owner of the window.
*   If no owner is registered, the parent is considered owner.
*/
static void _NotifyOwner(WM_HWIN hObj, int Notification)
{
	WM_MESSAGE Msg = {0};
	WM_HWIN hOwner;
	LISTVIEW_Obj* pObj = LISTVIEW_H2P(hObj);
	hOwner = pObj->hOwner ? pObj->hOwner : WM_GetParent(hObj);
	Msg.MsgId = WM_NOTIFY_PARENT;
	Msg.Data.v = Notification;
	Msg.hWin = hObj;
	WM_SendMessage(hOwner, &Msg);
}

/*********************************************************************
*
*   	_OnTouch
*/
static void _OnTouch(LISTVIEW_Handle hObj, LISTVIEW_Obj *pObj, WM_MESSAGE *pMsg)
{
	int Notification;
	const GUI_PID_STATE* pState = (const GUI_PID_STATE *) pMsg->Data.p;
	GUI_USE_PARA(pObj);
	if (pMsg->Data.p)
	{
		/* Something happened in our area (pressed or released) */
		if (pState->Pressed)
		{
			_SetSelFromPos(hObj, pObj, pState);
			Notification = WM_NOTIFICATION_CLICKED;
			WM_SetFocus(hObj);
		}
		else
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -