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

📄 eblistview.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 5 页
字号:
// 

// $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 + -