📄 listedit.c
字号:
break;
}
// Make sure that we draw only when row is in drawing area
if (yPos >= ClipRect.y0) {
GUI_DrawHLine(yPos, ClipRect.x0, ClipRect.x1);
}
}
{
int tmpposx=0,l=0;
for(l=0;l<pObj->ScrollStateH.v;l++)
{
tmpposx += HEADER_GetItemWidth(pObj->hHeader,l);
}
xPos = EffectSize - tmpposx;
}
// xPos = EffectSize - pObj->ScrollStateH.v;
// for (i = 0; i < NumColumns; i++) {
for (i = 0; i < EndCol; 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);
//*/
}
/*********************************************************************
*
* LISTEDIT__InvalidateInsideArea
*/
void LISTEDIT__InvalidateInsideArea(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj) {
GUI_RECT Rect;
int HeaderHeight;
HeaderHeight = HEADER_GetHeight(pObj->hHeader);
WM_GetInsideRectExScrollbar(hObj, &Rect);
Rect.y0 += HeaderHeight;
WM_InvalidateRect(hObj, &Rect);
}
/*********************************************************************
*
* LISTEDIT__InvalidateRow
*/
void LISTEDIT__InvalidateRow(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj, int Sel) {
if (Sel >= 0) {
GUI_RECT Rect;
int HeaderHeight, RowDistY;
HeaderHeight = HEADER_GetHeight(pObj->hHeader);
RowDistY = LISTEDIT__GetRowDistY(pObj);
WM_GetInsideRectExScrollbar(hObj, &Rect);
Rect.y0 += HeaderHeight + (Sel - pObj->ScrollStateV.v) * RowDistY;
Rect.y1 = Rect.y0 + RowDistY - 1;
WM_InvalidateRect(hObj, &Rect);
}
}
/*********************************************************************
*
* LISTEDIT__InvalidateCol
*/
void LISTEDIT__InvalidateCol(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj, int ColSel)
{
if (ColSel >= 0)
{
GUI_RECT Rect;
int i=0;
int HeaderHeight, RowDistY,ColDistX=0;
HeaderHeight = HEADER_GetHeight(pObj->hHeader);
RowDistY = LISTEDIT__GetRowDistY(pObj);
//ColDistX = LISTEDIT__GetColDistX(pObj,ColSel);
WM_GetInsideRectExScrollbar(hObj, &Rect);
Rect.y0 += HeaderHeight + (pObj->RowSel - pObj->ScrollStateV.v) * RowDistY;
Rect.y1 = Rect.y0 + RowDistY - 1;
//for(i=0;i<pObj->ColSel-pObj->ScrollStateH.v;i++)
for(i=0;i<ColSel-pObj->ScrollStateH.v;i++)
{
ColDistX+=LISTEDIT__GetColDistX(pObj,pObj->ScrollStateH.v+i);
}
Rect.x0 = ColDistX+pObj->Widget.pEffect->EffectSize;;
Rect.x1 = Rect.x0+LISTEDIT__GetColDistX(pObj,ColSel);
WM_InvalidateRect(hObj, &Rect);
}
}
/*********************************************************************
*
* _SetSelFromPos
*/
static void _SetSelFromPos(LISTEDIT_Handle hObj, LISTEDIT_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 RowSel,ColSel;
int i,colwidth=0;
RowSel = (y / LISTEDIT__GetRowDistY(pObj)) + pObj->ScrollStateV.v;
if (RowSel < GUI_ARRAY_GetNumItems(&pObj->RowArray))
{
LISTEDIT_SetRowSel(hObj, RowSel);
}
for(i=pObj->ScrollStateH.v;i<HEADER_GetNumItems(pObj->hHeader);i++)
{
colwidth+=HEADER_GetItemWidth(pObj->hHeader,i);
if(colwidth>x)
break;
}
ColSel = i;
LISTEDIT_SetColSel(hObj, ColSel);
}
}
/*********************************************************************
*
* _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;
LISTEDIT_Obj* pObj = LISTEDIT_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(LISTEDIT_Handle hObj, LISTEDIT_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 {
Notification = WM_NOTIFICATION_RELEASED;
}
} else {
Notification = WM_NOTIFICATION_MOVED_OUT;
}
_NotifyOwner(hObj, Notification);
}
/*********************************************************************
*
* _GetXSize
*
* Purpose:
* Returns the width of the inside listview area.
*/
static int _GetXSize(LISTEDIT_Handle hObj) {
GUI_RECT Rect;
WM_GetInsideRectExScrollbar(hObj, &Rect);
return Rect.x1 + 1;
}
/*********************************************************************
*
* _GetHeaderWidth
*
* Purpose:
* Returns the width of all items in header.
*
* Return value:
* NumItems > 0: width of all items.
* NumItems = 0: 1 (to avoid problem with horizontal scrollbar)
*/
static int _GetHeaderWidth(LISTEDIT_Obj* pObj, HEADER_Handle hHeader) {
int NumItems, i, r = 1;
NumItems = HEADER_GetNumItems(hHeader);
if (NumItems) {
for (i = 0, r = 0; i < NumItems; i++) {
r += HEADER_GetItemWidth(hHeader, i);
}
}
if (pObj->ScrollStateH.v > (r - pObj->ScrollStateH.PageSize)) {
r += pObj->ScrollStateH.PageSize - (r - pObj->ScrollStateH.v);
}
return r;
}
/*********************************************************************
*
* LISTEDIT__UpdateScrollPos
*
* Purpose:
* Checks whether if we must scroll up or scroll down to ensure
* that selection is in the visible area. This function also
* makes sure that scroll positions are in valid ranges.
*
* Return value:
* Difference between old and new vertical scroll pos.
*/
int LISTEDIT__UpdateScrollPos(LISTEDIT_Handle hObj, LISTEDIT_Obj* pObj,int row)
{
if(row)
{
int PrevScrollStateV;
PrevScrollStateV = pObj->ScrollStateV.v;
if (pObj->RowSel >= 0)
{
WM_CheckScrollPos(&pObj->ScrollStateV, pObj->RowSel, 0, 0);
}
else
{
WM_CheckScrollBounds(&pObj->ScrollStateV);
}
{
WM_CheckScrollBounds(&pObj->ScrollStateH);
}
WIDGET__SetScrollState(hObj, &pObj->ScrollStateV, &pObj->ScrollStateH);
return pObj->ScrollStateV.v - PrevScrollStateV;
}
else
{
int PrevScrollStateH;
PrevScrollStateH = pObj->ScrollStateH.v;
WM_CheckScrollBounds(&pObj->ScrollStateV);
if (pObj->ColSel >= 0)
{
WM_CheckScrollPos(&pObj->ScrollStateH, pObj->ColSel, 0, 0);
}
else
{
WM_CheckScrollBounds(&pObj->ScrollStateH);
}
WIDGET__SetScrollState(hObj, &pObj->ScrollStateV, &pObj->ScrollStateH);
return pObj->ScrollStateH.v - PrevScrollStateH;
}
}
/*********************************************************************
*
* LISTEDIT__UpdateScrollParas
*
* Purpose:
* Calculates number of items and page size of both vertical
* and horizontal scrollbar. After this LISTEDIT__UpdateScrollPos will
* be called to ensure scroll positions are in valid ranges.
*/
int LISTEDIT__UpdateScrollParas(LISTEDIT_Handle hObj, LISTEDIT_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.PageSize = _GetNumVisibleCols(hObj,pObj);
//pObj->ScrollStateH.NumItems = _GetHeaderWidth(pObj, pObj->hHeader);
pObj->ScrollStateH.NumItems = HEADER_GetNumItems(pObj->hHeader);
return LISTEDIT__UpdateScrollPos(hObj, pObj,1);
}
/*********************************************************************
*
* _FreeAttached
*
* Purpose:
* Delete attached objects (if any).
*/
static void _FreeAttached(LISTEDIT_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++) {
LISTEDIT_ITEM * pItem;
pItem = (LISTEDIT_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);
}
void LISTEDIT_GetCurItemText(LISTEDIT_Handle hObj, const char * s)
{
LISTEDIT_Obj* pObj;
LISTEDIT_ITEM * pItem;
GUI_ARRAY* pRow;
pObj = LISTEDIT_H2P(hObj);
strcpy(s,pObj->CurString);
}
//void LISTEDIT_GetItemText (LISTEDIT_Handle hObj, unsigned Column, unsigned Row, const char * s);
/*********************************************************************
*
* _AddKey
*
* Returns: 1 if Key has been consumed
* 0 else
*/
int firstflag=1;
static int _AddKey(LISTEDIT_Handle hObj, int Key)
{
LISTEDIT_Obj* pObj;
LISTEDIT_ITEM * pItem;
GUI_ARRAY* pRow;
pObj = LISTEDIT_H2P(hObj);
switch (Key)
{
case GUI_KEY_DOWN:
LISTEDIT_IncRowSel(hObj);
firstflag=1;
return 1; /* Key has been consumed */
case GUI_KEY_UP:
LISTEDIT_DecRowSel(hObj);
firstflag=1;
return 1; /* Key has been consumed */
case GUI_KEY_ENTER:
// LISTEDIT_SetItemText(hObj,pObj->ColSel,pObj->RowSel,pObj->CurString);
// LISTEDIT_IncColSel(hObj);
firstflag=1;
break;
case GUI_KEY_RIGHT:
LISTEDIT_IncColSel(hObj);
firstflag=1;
return 1; /* Key has been consumed */
case GUI_KEY_LEFT:
LISTEDIT_DecColSel(hObj);
firstflag=1;
return 1; /* Key has been consumed */
case '0':case '1':case '2':case '3':case '4':
case '5':case '6':case '7':case '8':case '9':
case '.':case '-':case 'h':case GUI_KEY_BACKSPACE:
{
GUI_RECT rect;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -