📄 pplistbase.cpp
字号:
#include <stdio.h>
#include "GUIpp.h"
#include "ppListView.h"
#include "DateTime.h"
#if _USE_GUI == 1
NANAListItem::NANAListItem(NANAListBase * pParentView,int nColums)
{
int i;
w_pParentListView = pParentView;
w_nSubItemCnt = nColums;
w_pSubItems = (PSListSubItem)SafeMalloc(sizeof(SListSubItem)*nColums);
w_pNodeData = NULL;
for(i=0;i<w_nSubItemCnt;i++)
{
w_pSubItems[i].w_nData = 0;
w_pSubItems[i].w_strText = NULL;
w_pSubItems[i].w_nIcon = 0;
w_pSubItems[i].w_Font = w_pParentListView->w_Font;
}
}
void NANAListItem::DeleteText(void)
{
int i;
if(w_nHaveText)
{
for(i=0;i<w_nSubItemCnt;i++)
{
if(w_pSubItems[i].w_strText)
{
SafeFree(w_pSubItems[i].w_strText);
w_pSubItems[i].w_strText = NULL;
}
}
w_nHaveText = 0;
}
}
NANAListItem::~NANAListItem()
{
DeleteText();
SafeFree(w_pSubItems);
w_pSubItems = NULL;
}
void NANAListItem::SetItemData(int nSubItem,int nData)
{
DEBUG_Assert(nSubItem < w_nSubItemCnt );
w_pSubItems[nSubItem].w_nData = nData;
}
void NANAListItem::SetSubItemText(int nSubItem,const char *strText)
{
DEBUG_Assert(nSubItem < w_nSubItemCnt );
if(w_pSubItems[nSubItem].w_strText)
{
SafeFree(w_pSubItems[nSubItem].w_strText);
w_pSubItems[nSubItem].w_strText = NULL;
}
w_pSubItems[nSubItem].w_strText = (char *)SafeMalloc(strlen(strText) + 1);
strcpy(w_pSubItems[nSubItem].w_strText,strText);
w_pSubItems[nSubItem].w_Font = &NANA_FONT12;
w_pParentListView->SetUIDirty(1);
}
void NANAListItem::SetItemIcon(int nSubItem,int nIcon)
{
DEBUG_Assert(nSubItem < w_nSubItemCnt );
w_pSubItems[nSubItem].w_nIcon = nIcon;
w_pParentListView->SetUIDirty(1);
}
void NANAListItem::SetItemFont(int nSubItem, NANA_FONT font)
{
DEBUG_Assert(nSubItem < w_nSubItemCnt );
w_pSubItems[nSubItem].w_Font = font;
w_pParentListView->SetUIDirty(1);
}
void NANAListItem::SetItemText(void)
{
char caMessage[100];
int j;
for(j=0;j<w_nSubItemCnt;j++)
{
SetSubItemText(j,w_pNodeData->GetNodeDataFieldString(j,caMessage,sizeof(caMessage)));
}
w_nHaveText = 1;
};
//////////////////////////////////////////////////////////////////////////
int NANAListBase::GetItemIndex(NANAListItem *pItem)
{
DEBUG_Assert(pItem->w_pParentListView == this);
return (w_ListHeader.GetStepsTo(pItem)) - 1;
}
NANAListItem * NANAListBase::NewItem(void)
{
NANAListItem *pNewItem = new NANAListItem(this,w_nColumn);
w_ListTail.InsertBefore(pNewItem);
w_nItemCount ++;
return pNewItem;
}
NANAListItem * NANAListBase::GetItem(int nItem)
{
//第一个node是w_ListHeader本身,因此第一个数据项是
//nItem+1
return (NANAListItem*)w_ListHeader.GetNextNode(nItem+1);
}
void NANAListBase::DeleteItem(NANAListItem * pItem)
{
if(pItem == NULL)
{
return;
}
DEBUG_Assert(pItem->w_pParentListView == this);
pItem->RemoveMe();
w_nItemCount--;
delete pItem;
pItem = NULL;
}
//////////////////////////////////////////////////
NANAIconList::NANAIconList(int nColums):NANAListBase(nColums)
{
w_itemSelected = NULL;
}
void NANAIconList::DrawItem(int x,int y,int width,int height,NANAListItem * pitem,int bSelected,int bHighlight)
{
int t_width,t_height;
int t_x,t_y;
int i_x,i_y;
const char * strText = pitem->GetItemText(0);
//get the required size of text
TextBlockPrint(strText,0,0,&t_width,&t_height,
pitem->w_pSubItems[0].w_Font,0,ALIGN_MIDDLE,1,1);
//plus require size of icon
ICON * picon = GetIcon(pitem->w_pSubItems[0].w_nIcon);
i_x = x + (width - (picon->width))/2;
t_x = x + (width - (t_width))/2;
i_y = y + (height - t_height - picon->height - 6)/2;
t_y = i_y + picon->height + 3;
if(bHighlight)
{
RectFill(x+1,y+1,x+width,y+height-1,COLOR_BORDER);
TextBlockPrint(strText,t_x,t_y,&t_width,&t_height,
pitem->w_pSubItems[0].w_Font,1,ALIGN_MIDDLE,1,0);
DrawICON(pitem->w_pSubItems[0].w_nIcon,i_x,i_y,1);
}else
{
RectFill(x+1,y+1,x+width,y+height-1,COLOR_BKGROUND);
TextBlockPrint(strText,t_x,t_y,&t_width,&t_height,
pitem->w_pSubItems[0].w_Font,0,ALIGN_MIDDLE,1,0);
DrawICON(pitem->w_pSubItems[0].w_nIcon,i_x,i_y,0);
}
if(bSelected)
{
RectLine(x,y,x+width-1,y+height-1,COLOR_BORDER);
}else{
RectLine(x,y,x+width-1,y+height-1,COLOR_BKGROUND);
}
}
void NANAIconList::SetItemSize(int width,int height)
{
w_itemWidth = width;
w_itemHeight = height;
}
void NANAIconList::OnPaint()
{
int x,y;
NANARect rc;
GetWindowRect(&rc);
x = rc.w_nX1;
y = rc.w_nY1;
NANAListItem *pItem = (NANAListItem *)w_ListHeader.GetNextNode(1);
while ((pItem != &w_ListTail) && y<rc.w_nY2)
{
if(x+w_itemWidth >= rc.w_nX2)
{
y += w_itemHeight;
x = rc.w_nX1;
}
DrawItem(x,y,w_itemWidth,w_itemHeight,pItem,(w_itemSelected == pItem),0);
x += w_itemWidth;
pItem = (NANAListItem *)pItem->GetNextNode(1);
}
}
void NANAIconList::OnMouseDown(int x,int y)
{
int x_item,y_item;
NANARect rc;
GetWindowRect(&rc);
x_item = rc.w_nX1;
y_item = rc.w_nY1;
NANAListItem *pItem = (NANAListItem *)w_ListHeader.GetNextNode(1);
NANAListItem *pItemOrgSel = w_itemSelected;
while ((pItem != &w_ListTail) && y_item<rc.w_nY2)
{
if(x_item+w_itemWidth >= rc.w_nX2)
{
y_item += w_itemHeight;
x_item = rc.w_nX1;
}
if(x>x_item && x<x_item + w_itemWidth && y>y_item && y<y_item+w_itemHeight)
{
w_itemSelected = pItem;
DrawItem(x_item,y_item,w_itemWidth,w_itemHeight,pItem,1,1);
}
else
if(pItemOrgSel == pItem)
{
//clear old selected Item's apperance
DrawItem(x_item,y_item,w_itemWidth,w_itemHeight,pItem,0,0);
}
x_item += w_itemWidth;
pItem = (NANAListItem *)pItem->GetNextNode(1);
}
GHAL_RefreshAll();
}
void NANAIconList::OnMouseUp(int x,int y)
{
int x_item,y_item;
NANARect rc;
GetWindowRect(&rc);
x_item = rc.w_nX1;
y_item = rc.w_nY1;
NANAListItem *pItem = (NANAListItem *)w_ListHeader.GetNextNode(1);
while ((pItem != &w_ListTail) && y_item<rc.w_nY2)
{
if(x_item+w_itemWidth >= rc.w_nX2)
{
y_item += w_itemHeight;
x_item = rc.w_nX1;
}
if( w_itemSelected == pItem )
{
//
DrawItem(x_item,y_item,w_itemWidth,w_itemHeight,pItem,1,0);
if(x>x_item && y>y_item && x<x_item+w_itemWidth && y<y_item+w_itemHeight)
{
NotifyWindow(GetParentWnd(),UGNC_CLICK,pItem->w_pSubItems[0].w_nData,(unsigned int)pItem);
}
break;
}
x_item += w_itemWidth;
pItem = (NANAListItem *)pItem->GetNextNode(1);
}
GHAL_RefreshAll();
}
NANAListView::NANAListView(int nColumn,CLinkList * pLinkList):NANAListBase(nColumn)
{
int i,j;
NANAListItem * pItem;
CLinkListNode * pNodeData;
w_pSelectedItem = &w_ListHeader;
w_pFirstVisibleItem = &w_ListHeader;
w_pLinkList = pLinkList;
for(i=0;i< (w_pLinkList->GetNodeNumber());i++)
{
pItem = NewItem();
pNodeData = w_pLinkList->GetLinkListNode(i);
pItem->w_pNodeData = pNodeData;
}
}
NANAListView::~NANAListView()
{
NANAListItem *pItem;
pItem = GetItem(0);
while(pItem != &w_ListTail)
{
pItem->RemoveMe();
delete pItem;
pItem = GetItem(0);
}
}
NANAListItem * NANAListView::NewItem(void)
{
NANAListItem *pNewItem = NANAListBase::NewItem();
if(w_pFirstVisibleItem == &w_ListHeader)
{
w_pFirstVisibleItem = pNewItem;
}
if(w_pSelectedItem == &w_ListTail || w_pSelectedItem == &w_ListHeader)
{
w_pSelectedItem = pNewItem;
}
SetUIDirty(1);
return pNewItem;
}
void NANAListView::DeleteItem(NANAListItem * pItem)
{
if(pItem == NULL)
{
return;
}
DEBUG_Assert(pItem->w_pParentListView == this);
if(w_pSelectedItem == pItem)
{
w_pSelectedItem = (NANAListItem*)pItem->GetNextNode(1);
if(w_pSelectedItem == &w_ListTail)
{
w_pSelectedItem = (NANAListItem*)pItem->GetPrevNode(1);
}
}
if(w_pFirstVisibleItem == pItem)
{
w_pFirstVisibleItem = (NANAListItem*)pItem->GetNextNode(1);
if(w_pFirstVisibleItem == &w_ListTail)
{
w_pFirstVisibleItem = (NANAListItem*)pItem->GetPrevNode(1);
}
}
NANAListBase::DeleteItem(pItem);
SetUIDirty(1);
}
void NANAListView::SelectItem(NANAListItem *pItem)
{
DEBUG_Assert(pItem->w_pParentListView == this);
if(w_pSelectedItem != pItem)
{
w_pSelectedItem = pItem;
SetUIDirty(1);
}
}
NANAListItem * NANAListView::GetSelectedItem(void)
{
if(w_pSelectedItem == &w_ListHeader)
{
return NULL;
}
return w_pSelectedItem;
}
int NANAListView::GetDisplayLineCount(void)
{
int nLineHeight;
NANARect rc;
GetWindowRect(&rc);
nLineHeight = LIST_SELECT_TOP_WIDTH + LIST_SELECT_BOTTOM_WIDTH +
LIST_TOP_TO_SELECT_MARGIN + LIST_BOTTOM_TO_SELECT_MARGIN +
16;
return (rc.GetHeight()-LIST_FRAME_WIDTH - LIST_TOP_MARGIN -
LIST_CAPTION_TOP_MARGIN - LIST_CAPTION_BOTTOM_MARGIN -
LIST_CAPTION_TEXT_MARGIN - 16)/nLineHeight;
}
void NANAListView::Draw_ScrollBar(NANARect rcBar)
{
int nPosition;
int nTopIndex;
int nScrollBarLength;
int nTotalLength;
int nDisplayLines;
nTotalLength = rcBar.GetHeight() - 1;
//计算可见行数
nDisplayLines = GetDisplayLineCount();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -