📄 eblistview.c
字号:
//
// $Id: eblistview.c,v 1.5 2005/10/17 07:55:53 tangjb Exp $
//
// listview.c: the spin box control
//
// Copyright (C) 2001, Shu Ming
//
// Create date: 2001/12/03
/*
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Library General Public
** License as published by the Free Software Foundation; either
** version 2 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Library General Public License for more details.
**
** You should have received a copy of the GNU Library General Public
** License along with this library; if not, write to the Free
** Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
** MA 02111-1307, USA
*/
/*
** Alternatively, the contents of this file may be used under the terms
** of the Mozilla Public License (the "MPL License") in which case the
** provisions of the MPL License are applicable instead of those above.
*/
//
// Modify records:
//
// Who When Where For What Status
//-----------------------------------------------------------------------------
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include "eblistview.h"
#include "ebcontrol.h"
/********************************************** List internals data **********************************************/
static void setHeadHeight (int height, PEBLSTVWDATA pLVInternalData);
static int sGetItemSeq (PEBLSTVWDATA pLVInternalData);
static int sAddColumnToList (int nCols, const char *pszHeadText, int w,
PEBLSTVWDATA pLVInternalData);
static int sModifyHead (int nCols, const char *pszHeadText,
PEBLSTVWDATA pLVInternalData);
static BOOL sRemoveColumnFromList (int nCols, PEBLSTVWDATA pLVInternalData);
static int sRemoveItemFromList (int nItem, PEBLSTVWDATA pLVInternalData);
static int sRemoveAllItem (PEBLSTVWDATA pLVInternalData);
static int sFillSubItemToList (PEBLVSUBITEM p0,
PEBLSTVWDATA pLVInternalData);
static int sAddItemToList (int nItem, PEBLSTVWDATA pLVInternalData);
static int sFindItemFromList (PEBLVFINDINFO pFindInfo,
PEBLSTVWDATA pLVInternalData);
static int sGetSubItemCopy (PEBLVSUBITEM pSubItem, PEBLSTVWDATA pLVInternalData);
static int itemDelete (PEBITEMDATA pHead);
static void InitListViewData (HWND hwnd);
static PEBLSTHDR lsthdrNew (const char *pszHeadText, int nCols,
PEBLSTVWDATA pLVInternalData);
static PEBSUBITEMDATA subitemNew (const char *pszInfoText);
static void subitemDelete (PEBSUBITEMDATA pSubItemData);
static int itemDelete (PEBITEMDATA pItem);
static void lsthdrDelete (PEBLSTHDR pLstHdr);
static PEBSUBITEMDATA sGetSubItemFromList (int nItem, int subItem,
PEBLSTVWDATA pLVInternalData);
static PEBITEMDATA itemNew (int nCols,PEBLSTVWDATA pLVInternalData);
static int sCmpInfo (const char *szSrc, const char *szDest);
static PEBITEMDATA sGetItemFromList (int nSeq, PEBLSTVWDATA pLVInternalData);
static int isInListViewHead (int mouseX, int mouseY, PEBLSTHDR * pRet,
PEBLSTVWDATA pLVInternalData);
static int isInLVHeadBorder (int mouseX, int mouseY, PEBLSTHDR * pRet,
PEBLSTVWDATA pLVInternalData);
static int isInLVItem (int mouseX, int mouseY, PEBITEMDATA * pRet,
PEBLSTVWDATA pLVInternalData);
static int isInListViewHead (int mouseX, int mouseY, PEBLSTHDR * pRet,
PEBLSTVWDATA pLVInternalData);
static void sDrawTextToSubItem (HWND hwnd,HDC hdc, PEBSUBITEMDATA psubitem, int nRows,
int nCols, PEBITEMDATA pItem,
PEBLSTVWDATA pLVInternalData);
static void sDrawText (HDC hdc, int x, int y, int width, int height,
const char *pszText);
static int sSortItemByCol (unsigned int nCols, SORTTYPE sort,
PEBLSTVWDATA pLVInternalData);
static int sGetFrontSubItemsWidth (int end, PEBLSTVWDATA pLVInternalData);
static int sGetItemWidth (PEBLSTVWDATA pLVInternalData);
static int sGetSubItemWidth (int nCols, PEBLSTVWDATA pLVInternalData);
static int sGetSubItemX (int nCols, PEBLSTVWDATA pLVInternalData);
static int sAddOffsetToTailSubItem (int nCols, int offset,
PEBLSTVWDATA pLVInternalData);
static int sAddOffsetToSubItem (PEBLSTHDR p, int offset);
static int setItemColor (int color, int rows, PEBLSTVWDATA plvinternaldata);
static int lstSetVScrollInfo (PEBLSTVWDATA pLVInternalData);
static int lstSetHScrollInfo (PEBLSTVWDATA pLVInternalData);
static void lvDataDestory (PEBLSTVWDATA pLvInternalData);
static void
InitListViewData (HWND hwnd)
{
RECT rcClient;
int nHeight = 0;
PEBLSTVWDATA pLVInternalData;
PEBLVEXTDATA pdata1 = (PEBLVEXTDATA)GetWindowAdditionalData(hwnd);
DWORD dwStyle = GetWindowStyle (hwnd);
pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hwnd);
GetClientRect (hwnd, &rcClient);
pLVInternalData->nCols = 0;
pLVInternalData->nRows = 0;
pLVInternalData->hWnd = hwnd;
pLVInternalData->pLstHead = NULL;
pLVInternalData->pItemHead = NULL;
pLVInternalData->nOriginalX = 0;
pLVInternalData->nOriginalY = 0;
pLVInternalData->bBorderDraged = FALSE;
pLVInternalData->bItemClicked = FALSE;
pLVInternalData->nFirstVisableRow =1; //add by hejian 2004.12.11
pLVInternalData->pItemDraged = NULL;
pLVInternalData->pItemClicked = NULL;
pLVInternalData->pItemSelected = NULL;
pLVInternalData->pItemMouseOver = NULL;
pLVInternalData->oldMouseX = 0;
pLVInternalData->oldMouseY = 0;
pLVInternalData->nItemDraged = 0;
pLVInternalData->nItemSelected = 0;
pLVInternalData->nItemMouseOver = 0;
pLVInternalData->nItemHeight = pdata1->nItemHeight;
pLVInternalData->nItemGap = pdata1->nItemGap;
if(dwStyle & ELVS_ITEMUSERCOLOR)
{
pLVInternalData->nSelectBKColor = pdata1->nSelectBKColor;
pLVInternalData->nItemBKColor = pdata1->nItemBKColor;
pLVInternalData->nSelectTextColor = pdata1->nSelectTextColor;
pLVInternalData->nItemTextColor = pdata1->nItemTextColor;
pLVInternalData->nMouseOverBkColor = pdata1->nMouseOverBkColor;
pLVInternalData->nMouseOverTextColor = pdata1->nMouseOverTextColor;
}
else
{
pLVInternalData->nSelectBKColor = RGB2Pixel (HDC_SCREEN, 0, 0, LIGHTBLUE);
pLVInternalData->nItemBKColor = PIXEL_lightwhite;
pLVInternalData->nSelectTextColor =PIXEL_lightwhite;
pLVInternalData->nItemTextColor = PIXEL_black;
pLVInternalData->nMouseOverBkColor = PIXEL_black;
pLVInternalData->nMouseOverTextColor = PIXEL_yellow;
}
pLVInternalData->nItemBKImage = pdata1->nItemBKImage;
pLVInternalData->nBKImage = pdata1->nBKImage;
nHeight = GetWindowFont (hwnd)->size;
if((nHeight + pLVInternalData->nItemGap) > pLVInternalData->nItemHeight)
pLVInternalData->nItemHeight = nHeight + pLVInternalData->nItemGap;
if(dwStyle & ELVS_USEHEADER)
pLVInternalData->nHeadHeight = nHeight + 2;
else
pLVInternalData->nHeadHeight = 0;
pLVInternalData->nVisableRows =(rcClient.bottom -rcClient.top -pLVInternalData->nHeadHeight)/(pLVInternalData->nItemHeight);
pLVInternalData->nCheckboxImg = 0;
}
static void lvDataDestory (PEBLSTVWDATA pLVInternalData)
{
PEBITEMDATA p1, p2;
p1 = pLVInternalData->pItemHead;
lsthdrDelete (pLVInternalData->pLstHead);
while (p1 != NULL)
{
p2 = p1;
p1 = p1->pNext;
itemDelete (p2);
}
free (pLVInternalData);
}
static PEBLSTHDR lsthdrNew (const char *pszHeadText, int nCols, PEBLSTVWDATA pLVInternalData)
{
PEBLSTHDR p1;
int x;
p1 = (PEBLSTHDR) malloc (sizeof (EBLSTHDR));
p1->pNext = NULL;
if (pszHeadText != NULL)
{
p1->pTitle = (char *) malloc (strlen (pszHeadText) + 1);
strcpy (p1->pTitle, pszHeadText);
}
else
p1->pTitle = NULL;
x = sGetFrontSubItemsWidth (nCols - 1, pLVInternalData);
p1->x = x;
p1->width = COLWIDTHDEFAULTS;
p1->sort = NOTSORTED;
p1->height = pLVInternalData->nHeadHeight;
return p1;
}
static void lsthdrDelete (PEBLSTHDR pLstHdr)
{
if (pLstHdr != NULL)
{
if (pLstHdr->pTitle != NULL)
free (pLstHdr->pTitle);
free (pLstHdr);
}
}
static void setHeadHeight (int height, PEBLSTVWDATA pLVInternalData)
{
PEBLSTHDR p1;
p1 = pLVInternalData->pLstHead;
if (height < 0)
return;
while (p1 != NULL)
{
p1->height = height;
p1 = p1->pNext;
}
}
static PEBSUBITEMDATA subitemNew (const char *pszInfoText)
{
PEBSUBITEMDATA p1;
p1 = (PEBSUBITEMDATA) malloc (sizeof (EBSUBITEMDATA));
memset(p1,0,sizeof(EBSUBITEMDATA));
//p1->pNext = NULL;
if (pszInfoText != NULL)
{
p1->cchTextMax = strlen (pszInfoText) + 1;
p1->pszText = (char *) malloc (p1->cchTextMax);
strcpy (p1->pszText, pszInfoText);
}
else
p1->pszText = NULL;
return p1;
}
static int setItemColor(int rows, int color, PEBLSTVWDATA pLVInternalData)
{
PEBITEMDATA p1;
int oldColor;
if (!(p1 = sGetItemFromList (rows, pLVInternalData)))
return -1;
oldColor = p1->nTextColor;
p1->nTextColor = color;
return oldColor;
}
static void subitemDelete (PEBSUBITEMDATA pSubItemData)
{
if (pSubItemData != NULL)
{
if (pSubItemData->pszText != NULL)
free (pSubItemData->pszText);
if(pSubItemData->worddata != NULL)
free(pSubItemData->worddata);
if(pSubItemData->iImage != 0)
{
free((char *)pSubItemData->iImage);
}
free (pSubItemData);
}
}
static int sAddColumnToList(int nCols,const char *pszHeadText,int w,PEBLSTVWDATA pLVInternalData)
{
PEBLSTHDR p1 = NULL;
PEBLSTHDR p2 = NULL;
PEBLSTHDR p4 = NULL;
PEBITEMDATA p3 = NULL;
int nPosition;
int x = 0;
int y = 0;
RECT rcClient;
int width;
nPosition = nCols;
width = w;
if (pszHeadText == NULL)
return -1;
if ((nPosition > pLVInternalData->nCols) || (nPosition < 1))
nPosition = pLVInternalData->nCols + 1;
//if (width < COLWIDTHDEFAULTS)
// width = COLWIDTHDEFAULTS;
if (nPosition >= (pLVInternalData->nCols + 1))
{
x = sGetItemWidth (pLVInternalData);
}
else
x = sGetSubItemX (nPosition, pLVInternalData);
p1 = pLVInternalData->pLstHead;
GetClientRect (pLVInternalData->hWnd, &rcClient);
if (width > (rcClient.right - rcClient.left))
width = rcClient.right - rcClient.left;
y = rcClient.top;
p4 = lsthdrNew (pszHeadText, nCols, pLVInternalData);
p4->x = x;
p4->y = y;
p4->width = width;
p4->height = pLVInternalData->nHeadHeight;
p4->up = TRUE;
sAddOffsetToTailSubItem (nCols, width, pLVInternalData);
if (nPosition == 1)
{
p4->pNext = p1;
pLVInternalData->pLstHead = p4;
}
else
{
while (nPosition != 1)
{
p2 = p1;
p1 = p1->pNext;
nPosition = nPosition - 1;
}
p2->pNext = p4;
p4->pNext = p1;
}
p3 = pLVInternalData->pItemHead;
while (p3 != NULL)
{
PEBSUBITEMDATA p5, p6, p7;
if (nPosition == 1)
{
p7 = p3->pSubItemHead;
p6 = subitemNew (NULL);
p3->pSubItemHead = p6;
p6->pNext = p7;
}
else
{
p5 = p3->pSubItemHead;
while (nPosition != 1)
{
p6 = p5;
p5 = p5->pNext;
nPosition = nPosition - 1;
}
p7 = subitemNew (NULL);
p6->pNext = p7;
p7->pNext = p5;
}
p3 = p3->pNext;
}
pLVInternalData->nCols = pLVInternalData->nCols + 1;
return 0;
}
static int sGetItemSeq (PEBLSTVWDATA pLVInternalData)
{
PEBITEMDATA p1;
int i = 0;
p1 = pLVInternalData->pItemHead;
while (p1)
{
i++;
if (p1->bSelected)
return i;
p1 = p1->pNext;
}
return -1;
}
static int sModifyHead (int nCols, const char *pszHeadText, PEBLSTVWDATA pLVInternalData)
{
PEBLSTHDR p1 = NULL;
int i;
if ((nCols < 1) || (nCols > pLVInternalData->nCols) || (pszHeadText == NULL))
return -1;
p1 = pLVInternalData->pLstHead;
i = nCols;
while (i > 1)
{
i--;
p1 = p1->pNext;
}
if (p1->pTitle != NULL)
free (p1->pTitle);
p1->pTitle = (char *) malloc (sizeof (pszHeadText) + 1);
strcpy (p1->pTitle, pszHeadText);
return 0;
}
static PEBSUBITEMDATA sGetSubItemFromList (int nItem, int nSubItem, PEBLSTVWDATA pLVInternalData)
{
PEBSUBITEMDATA p1 = NULL;
PEBSUBITEMDATA p3 = NULL;
PEBITEMDATA p2 = NULL;
PEBITEMDATA p4 = NULL;
PEBSUBITEMDATA p5 = NULL;
int i, j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -