www.pudn.com > agsm2-1.2_src.zip > ScListCtrl.cpp


// ScListCtrl.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "agsm2.h" 
#include "ScListCtrl.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CScListCtrl 
 
CScListCtrl::CScListCtrl() 
{ 
	m_bDragging = FALSE; 
	m_pimagelist = NULL; 
	m_bSortAscending = TRUE; 
} 
 
CScListCtrl::~CScListCtrl() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CScListCtrl, CListCtrl) 
	//{{AFX_MSG_MAP(CScListCtrl) 
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick) 
	ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBegindrag) 
	ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit) 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONUP() 
	ON_NOTIFY_REFLECT(LVN_DELETEITEM, OnDeleteitem) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CScListCtrl message handlers 
 
 
void CScListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
	int iColumn = pNMListView->iSubItem; 
	TRACE("%d Column click.\n",iColumn); 
	if(iColumn == 0) 
		return; 
	if(iColumn == m_iSortColumn) 
		m_bSortAscending = !m_bSortAscending; 
	else 
		m_bSortAscending = TRUE; 
	m_iSortColumn = iColumn; 
	SortItems(ScCompareProc,reinterpret_cast(this)); 
	char buf[8]; 
	for(int i=0; inItem = i; 
	} 
	if(GetSelectedCount()) 
		EnsureVisible((int)GetFirstSelectedItemPosition()-1,FALSE); 
	*pResult = 0; 
} 
 
BOOL CScListCtrl::AddItem(int nItem, int nSubItem, LPCTSTR strItem, int nImageIndex) 
{ 
	LV_ITEM lvItem; 
	lvItem.mask = LVIF_TEXT; 
	lvItem.iItem = nItem; 
	lvItem.iSubItem = nSubItem; 
	lvItem.pszText = (LPTSTR) strItem; 
	if(nImageIndex != -1){ 
		lvItem.mask |= LVIF_IMAGE; 
		lvItem.iImage |= LVIF_IMAGE; 
	} 
	SCLIST_ITEMDATA *pItemData; 
	if(nSubItem == 0) 
	{ 
		BOOL ret = InsertItem(&lvItem); 
		//sort function use the ItemData. 
		pItemData = (SCLIST_ITEMDATA *)this->GetItemData(nItem); 
		if(pItemData) 
		{ 
			if(pItemData->ItemData) 
				free((void *)pItemData->ItemData); 
		}else 
			pItemData = (SCLIST_ITEMDATA *)malloc(sizeof(SCLIST_ITEMDATA)); 
		pItemData->nItem = nItem; 
		pItemData->ItemData = 0; 
		pItemData->dirty = FALSE; 
		SetItemData(nItem,(DWORD)pItemData); 
		return ret; 
	} 
	pItemData = (SCLIST_ITEMDATA *)this->GetItemData(nItem); 
	pItemData->dirty = TRUE; 
	return SetItem(&lvItem); 
 
} 
 
 
 
void CScListCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
	TRACE("OnBegindrag\n"); 
	CPoint      ptAction; 
	UINT        nFlags; 
 
	GetCursorPos(&ptAction); 
	ScreenToClient(&ptAction); 
	ASSERT(!m_bDragging); 
	m_bDragging = TRUE; 
	m_nitemDrag = HitTest(ptAction, &nFlags); 
	m_nitemDrop = NULL; 
 
	TRACE("nItemDrag=%d\n",m_nitemDrag); 
	ASSERT(m_pimagelist == NULL); 
	m_pimagelist = CreateDragImage(m_nitemDrag,&ptAction);  // get the image list for dragging 
	m_pimagelist->DragShowNolock(TRUE); 
	m_pimagelist->SetDragCursorImage(0, CPoint(0, 0)); 
	m_pimagelist->BeginDrag(0, CPoint(0,0)); 
	m_pimagelist->DragMove(ptAction); 
	m_pimagelist->DragEnter(this, ptAction); 
	SetCapture(); 
 
	*pResult = 0; 
} 
 
void CScListCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 
	// TODO: Add your control notification handler code here 
	TRACE("OnEndlabeledit\n"); 
	*pResult = 0; 
} 
 
void CScListCtrl::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	int		nitem; 
	UINT	flags; 
 
	if (m_bDragging) 
	{ 
		ASSERT(m_pimagelist != NULL); 
		m_pimagelist->DragMove(point); 
		if ((nitem = HitTest(point, &flags)) >= 0) 
		{ 
			m_nitemDrop = nitem; 
		} 
	} 
	CListCtrl::OnMouseMove(nFlags, point); 
} 
 
void CScListCtrl::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if (m_bDragging) 
	{ 
		ASSERT(m_pimagelist != NULL); 
		m_pimagelist->DragLeave(this); 
		m_pimagelist->EndDrag(); 
		delete m_pimagelist; 
		m_pimagelist = NULL; 
 
		if (m_nitemDrag != m_nitemDrop) 
		{ 
			//change m_nitemDrag and m_nitemDrop 
			int cc = GetColumnCount(); 
			CString str1,str2; 
			for(int i=1; i 1) 
	{ 
		int cc = GetColumnCount(); 
		CString str1,str2; 
		for(int i=1; inItem; 
	int nItem2 = ((SCLIST_ITEMDATA *)lParam2)->nItem; 
 
	CString    strItem1 = pListCtrl->GetItemText(nItem1, pListCtrl->m_iSortColumn); 
	CString    strItem2 = pListCtrl->GetItemText(nItem2, pListCtrl->m_iSortColumn); 
	if(pListCtrl->m_bSortAscending) 
	{ 
		if(*strItem2 == 0) 
			return -1; 
		else 
			return strcmp(strItem1, strItem2); 
	}else{ 
		// Sort the item in reverse alphabetical order 
		return strcmp(strItem2, strItem1); 
 
	} 
} 
 
BOOL CScListCtrl::Find(CString what, CString replace, BOOL mcase, int dir/*0 up 1 down*/,BOOL ReplaceAll) 
{ 
	BOOL ret = FALSE; 
	POSITION pos = GetFirstSelectedItemPosition(); 
	if(dir)//down 
	{ 
		int from = 0,to = 0; 
		if(pos) 
			from = (int)pos; 
		to = GetItemCount(); 
		int i; 
		if((i = FindItemString(from,to,what,replace,mcase,ReplaceAll)) > -1) 
		{ 
			SetItem(((int)pos == GetItemCount()) ? (GetItemCount() - 1) : from-1, 
						0, LVIF_STATE, NULL, 0, ~LVIS_SELECTED,  
						LVIS_SELECTED, 0); 
			if(!ReplaceAll) 
				return TRUE; 
			else 
				ret = TRUE; 
		} 
		if(from != 0) 
		{ 
			if((i = FindItemString(0,from,what,replace,mcase,ReplaceAll)) > -1) 
			{ 
				SetItem(((int)pos == GetItemCount()) ? (GetItemCount() - 1) : from-1, 
							0, LVIF_STATE, NULL, 0, ~LVIS_SELECTED,  
							LVIS_SELECTED, 0); 
				if(!ReplaceAll) 
					return TRUE; 
				else 
					ret = TRUE; 
			} 
		} 
	}else{ 
		int from = this->GetItemCount()-1; 
		int	to = -1; 
		if((int)pos > 1) 
			from = (int)pos-2; 
		int i; 
		int cc = GetColumnCount(); 
		if((i = FindItemString(from,to,what,replace,mcase,ReplaceAll)) > -1) 
		{ 
				SetItem(((int)pos == 1) ? 0 : from+1, 
							0, LVIF_STATE, NULL, 0, ~LVIS_SELECTED,  
							LVIS_SELECTED, 0); 
				if(!ReplaceAll) 
					return TRUE; 
				else 
					ret = TRUE; 
		} 
		if(from != GetItemCount()-1) 
		{ 
			if((i = FindItemString(GetItemCount()-1,from,what,replace,mcase,ReplaceAll)) > -1) 
			{ 
					SetItem(((int)pos == 1) ? 0 : from+1, 
								0, LVIF_STATE, NULL, 0, ~LVIS_SELECTED,  
								LVIS_SELECTED, 0); 
				if(!ReplaceAll) 
					return TRUE; 
				else 
					ret = TRUE; 
			} 
		} 
 
	} 
	return ret; 
} 
 
BOOL CScListCtrl::FindItemString(int from, int to, CString what, CString replace, BOOL mcase,BOOL ReplaceAll) 
{ 
		int rret = -1; 
		int cc = GetColumnCount(); 
		if(from < to) 
		{ 
			for(int i=from; i -1) 
					{ 
						SetItem(i, 0, LVIF_STATE, NULL, 0, LVIS_SELECTED,  
								LVIS_SELECTED, 0); 
						EnsureVisible(i, FALSE); 
						if(!ReplaceAll) 
							return i; 
						else 
							rret = i; 
					} 
				} 
			} 
		}else{ 
			for(int i=from; i>to; i--) 
			{ 
				CString str; 
				for(int j=1; j -1) 
					{ 
						SetItem(i, 0, LVIF_STATE, NULL, 0, LVIS_SELECTED,  
								LVIS_SELECTED, 0); 
						EnsureVisible(i, FALSE); 
						if(!ReplaceAll) 
							return i; 
						else 
							rret = i; 
					} 
				} 
			} 
		} 
		return rret; 
} 
 
void CScListCtrl::Delete() 
{ 
	ULONG uSelectedCount = GetSelectedCount(); 
	int cc = GetColumnCount(); 
 
	ULONG i;  
	int  nItem = -1; 
 
	if (uSelectedCount > 0) 
	{ 
		for (i=0;i < uSelectedCount;i++) 
		{ 
			nItem = GetNextItem(nItem, LVNI_SELECTED); 
			ASSERT(nItem != -1); 
			for(int j=1; jiItem); 
	SCLIST_ITEMDATA *pItemData = (SCLIST_ITEMDATA *)GetItemData(pNMListView->iItem); 
	if(pItemData) 
	{ 
		if(pItemData->ItemData) 
			free((void *)pItemData->ItemData); 
		free(pItemData); 
	} 
	*pResult = 0; 
} 
 
void CScListCtrl::CopySelectedItems() 
{ 
	ULONG uSelectedCount = GetSelectedCount(); 
	if(uSelectedCount) 
	{ 
		if ( !OpenClipboard() ) 
		{ 
			AfxMessageBox( "Cannot open the Clipboard" ); 
			return; 
		} 
		// Remove the current Clipboard contents 
		if( !EmptyClipboard() ) 
		{ 
			AfxMessageBox( "Cannot empty the Clipboard" ); 
			return; 
		} 
		// Get the currently selected data 
		HANDLE hData; 
		LPVOID lpData; 
		if (!(hData = ::GlobalAlloc(GMEM_DDESHARE, 1024*uSelectedCount))) { 
			AfxMessageBox( "Out of memory" ); 
			return; 
		} 
		if (!(lpData = GlobalLock(hData))) 
		{ 
			AfxMessageBox( "Out of memory" ); 
			return; 
		} 
		char *buf_base = (char *)malloc(1024*uSelectedCount); 
		char *buf = buf_base; 
		ULONG i;  
		int  nItem = -1; 
 
		// Update all of the selected items. 
		if (uSelectedCount > 0) 
		{ 
		   for (i=0;i < uSelectedCount;i++) 
		   { 
			  nItem = GetNextItem(nItem, LVNI_SELECTED); 
			  ASSERT(nItem != -1); 
			  int cc = GetColumnCount(); 
			  for(int j=0; j