WindowsXP-SP1/admin/hmonitor/hmlistview/hmlistviewctl.cpp
2020-09-30 16:53:49 +02:00

735 lines
20 KiB
C++

// HMListViewCtl.cpp : Implementation of the CHMListViewCtrl ActiveX Control class.
#include "stdafx.h"
#include "HMListView.h"
#include "HMListViewCtl.h"
#include "HMListViewPpg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CHMListViewCtrl, COleControl)
/////////////////////////////////////////////////////////////////////////////
// Message map
BEGIN_MESSAGE_MAP(CHMListViewCtrl, COleControl)
//{{AFX_MSG_MAP(CHMListViewCtrl)
ON_WM_CREATE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Dispatch map
BEGIN_DISPATCH_MAP(CHMListViewCtrl, COleControl)
//{{AFX_DISPATCH_MAP(CHMListViewCtrl)
DISP_PROPERTY_EX(CHMListViewCtrl, "Title", GetTitle, SetTitle, VT_BSTR)
DISP_PROPERTY_EX(CHMListViewCtrl, "Description", GetDescription, SetDescription, VT_BSTR)
DISP_FUNCTION(CHMListViewCtrl, "SetProgressRange", SetProgressRange, VT_EMPTY, VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetProgressPos", GetProgressPos, VT_I4, VTS_NONE)
DISP_FUNCTION(CHMListViewCtrl, "SetProgressPos", SetProgressPos, VT_EMPTY, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "InsertItem", InsertItem, VT_I4, VTS_I4 VTS_I4 VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "InsertColumn", InsertColumn, VT_I4, VTS_I4 VTS_BSTR VTS_I4 VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "SetItem", SetItem, VT_I4, VTS_I4 VTS_I4 VTS_I4 VTS_BSTR VTS_I4 VTS_I4 VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetStringWidth", GetStringWidth, VT_I4, VTS_BSTR)
DISP_FUNCTION(CHMListViewCtrl, "GetColumnWidth", GetColumnWidth, VT_I4, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "SetColumnWidth", SetColumnWidth, VT_BOOL, VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "FindItemByLParam", FindItemByLParam, VT_I4, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetImageList", GetImageList, VT_I4, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "DeleteAllItems", DeleteAllItems, VT_BOOL, VTS_NONE)
DISP_FUNCTION(CHMListViewCtrl, "DeleteColumn", DeleteColumn, VT_BOOL, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "StepProgressBar", StepProgressBar, VT_I4, VTS_NONE)
DISP_FUNCTION(CHMListViewCtrl, "SetProgressStep", SetProgressStep, VT_I4, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "SetImageList", SetImageList, VT_I4, VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetNextItem", GetNextItem, VT_I4, VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetItem", GetItem, VT_I4, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "DeleteItem", DeleteItem, VT_BOOL, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetItemCount", GetItemCount, VT_I4, VTS_NONE)
DISP_FUNCTION(CHMListViewCtrl, "ModifyListStyle", ModifyListStyle, VT_BOOL, VTS_I4 VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetColumnCount", GetColumnCount, VT_I4, VTS_NONE)
DISP_FUNCTION(CHMListViewCtrl, "GetColumnOrderIndex", GetColumnOrderIndex, VT_I4, VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "SetColumnOrderIndex", SetColumnOrderIndex, VT_I4, VTS_I4 VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetColumnOrder", GetColumnOrder, VT_BSTR, VTS_NONE)
DISP_FUNCTION(CHMListViewCtrl, "SetColumnOrder", SetColumnOrder, VT_EMPTY, VTS_BSTR)
DISP_FUNCTION(CHMListViewCtrl, "SetColumnFilter", SetColumnFilter, VT_EMPTY, VTS_I4 VTS_BSTR VTS_I4)
DISP_FUNCTION(CHMListViewCtrl, "GetColumnFilter", GetColumnFilter, VT_EMPTY, VTS_I4 VTS_PBSTR VTS_PI4)
DISP_FUNCTION(CHMListViewCtrl, "GetSelectedCount", GetSelectedCount, VT_I4, VTS_NONE)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(CHMListViewCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
/////////////////////////////////////////////////////////////////////////////
// Event map
BEGIN_EVENT_MAP(CHMListViewCtrl, COleControl)
//{{AFX_EVENT_MAP(CHMListViewCtrl)
EVENT_CUSTOM("ListClick", FireListClick, VTS_I4)
EVENT_CUSTOM("ListDblClick", FireListDblClick, VTS_I4)
EVENT_CUSTOM("ListRClick", FireListRClick, VTS_I4)
EVENT_CUSTOM("CompareItem", FireCompareItem, VTS_I4 VTS_I4 VTS_I4 VTS_PI4)
EVENT_CUSTOM("ListLabelEdit", FireListLabelEdit, VTS_BSTR VTS_I4 VTS_PI4)
EVENT_CUSTOM("ListKeyDown", FireListKeyDown, VTS_I4 VTS_I4 VTS_PI4)
EVENT_CUSTOM("FilterChange", FireFilterChange, VTS_I4 VTS_BSTR VTS_I4 VTS_PI4)
//}}AFX_EVENT_MAP
END_EVENT_MAP()
/////////////////////////////////////////////////////////////////////////////
// Property pages
// TODO: Add more property pages as needed. Remember to increase the count!
BEGIN_PROPPAGEIDS(CHMListViewCtrl, 1)
PROPPAGEID(CHMListViewPropPage::guid)
END_PROPPAGEIDS(CHMListViewCtrl)
/////////////////////////////////////////////////////////////////////////////
// Initialize class factory and guid
IMPLEMENT_OLECREATE_EX(CHMListViewCtrl, "HMLISTVIEW.HMListViewCtrl.1",
0x5116a806, 0xdafc, 0x11d2, 0xbd, 0xa4, 0, 0, 0xf8, 0x7a, 0x39, 0x12)
/////////////////////////////////////////////////////////////////////////////
// Type library ID and version
IMPLEMENT_OLETYPELIB(CHMListViewCtrl, _tlid, _wVerMajor, _wVerMinor)
/////////////////////////////////////////////////////////////////////////////
// Interface IDs
const IID BASED_CODE IID_DHMListView =
{ 0x5116a804, 0xdafc, 0x11d2, { 0xbd, 0xa4, 0, 0, 0xf8, 0x7a, 0x39, 0x12 } };
const IID BASED_CODE IID_DHMListViewEvents =
{ 0x5116a805, 0xdafc, 0x11d2, { 0xbd, 0xa4, 0, 0, 0xf8, 0x7a, 0x39, 0x12 } };
/////////////////////////////////////////////////////////////////////////////
// Control type information
static const DWORD BASED_CODE _dwHMListViewOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;
IMPLEMENT_OLECTLTYPE(CHMListViewCtrl, IDS_HMLISTVIEW, _dwHMListViewOleMisc)
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::CHMListViewCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CHMListViewCtrl
BOOL CHMListViewCtrl::CHMListViewCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegApartmentThreading to 0.
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_HMLISTVIEW,
IDB_HMLISTVIEW,
afxRegApartmentThreading,
_dwHMListViewOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
/////////////////////////////////////////////////////////////////////////////
// Licensing strings
static const TCHAR BASED_CODE _szLicFileName[] = _T("HMListView.lic");
static const WCHAR BASED_CODE _szLicString[] =
L"Copyright (c) 1999 Microsoft";
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::CHMListViewCtrlFactory::VerifyUserLicense -
// Checks for existence of a user license
BOOL CHMListViewCtrl::CHMListViewCtrlFactory::VerifyUserLicense()
{
return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName,
_szLicString);
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::CHMListViewCtrlFactory::GetLicenseKey -
// Returns a runtime licensing key
BOOL CHMListViewCtrl::CHMListViewCtrlFactory::GetLicenseKey(DWORD dwReserved,
BSTR FAR* pbstrKey)
{
if (pbstrKey == NULL)
return FALSE;
*pbstrKey = SysAllocString(_szLicString);
return (*pbstrKey != NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::CHMListViewCtrl - Constructor
CHMListViewCtrl::CHMListViewCtrl()
{
InitializeIIDs(&IID_DHMListView, &IID_DHMListViewEvents);
m_bColumnInsertionComplete = false;
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::~CHMListViewCtrl - Destructor
CHMListViewCtrl::~CHMListViewCtrl()
{
// TODO: Cleanup your control's instance data here.
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::OnDraw - Drawing function
void CHMListViewCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::DoPropExchange - Persistence support
void CHMListViewCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::GetControlFlags -
// Flags to customize MFC's implementation of ActiveX controls.
//
// For information on using these flags, please see MFC technical note
// #nnn, "Optimizing an ActiveX Control".
DWORD CHMListViewCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
// The control can receive mouse notifications when inactive.
// TODO: if you write handlers for WM_SETCURSOR and WM_MOUSEMOVE,
// avoid using the m_hWnd member variable without first
// checking that its value is non-NULL.
dwFlags |= pointerInactive;
return dwFlags;
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::OnResetState - Reset control to default state
void CHMListViewCtrl::OnResetState()
{
COleControl::OnResetState(); // Resets defaults found in DoPropExchange
// TODO: Reset any other control state here.
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl::AboutBox - Display an "About" box to the user
void CHMListViewCtrl::AboutBox()
{
CDialog dlgAbout(IDD_ABOUTBOX_HMLISTVIEW);
dlgAbout.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CHMListViewCtrl message handlers
int CHMListViewCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
if( m_titlebar.Create(WS_BORDER|WS_CHILD|WS_VISIBLE|CCS_TOP|CCS_NODIVIDER,CRect(0,0,10,10),this,4500) == -1 )
return -1;
if( m_statusbar.Create(WS_BORDER|WS_CHILD|WS_VISIBLE|CCS_BOTTOM|CCS_NODIVIDER,CRect(0,lpCreateStruct->y,10,10),this,4501) == -1 )
return -1;
if( m_list.Create(WS_BORDER|WS_CHILD|WS_VISIBLE,CRect(0,0,10,10),this,4502) == -1 )
return -1;
// set styles for the list control
DWORD dwStyle = GetWindowLong(m_list.GetSafeHwnd(),GWL_STYLE);
dwStyle |= LVS_EDITLABELS;
SetWindowLong(m_list.GetSafeHwnd(),GWL_STYLE,dwStyle);
// set the extended styles for the list control
m_list.SetExtendedStyle(LVS_EX_INFOTIP|LVS_EX_LABELTIP|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
// set styles for the header control
CHeaderCtrl* pHdrCtrl = m_list.GetHeaderCtrl();
pHdrCtrl->ModifyStyle(0,HDS_DRAGDROP|HDS_BUTTONS/*|HDS_FILTERBAR*/);
// set intial window sizes
CRect rcControl;
GetClientRect(rcControl);
CRect rcTitle;
m_titlebar.GetClientRect(rcTitle);
CRect rcStatus;
m_statusbar.GetClientRect(rcStatus);
m_titlebar.SetWindowPos(NULL,0,0,rcControl.Width(),rcTitle.Height(),SWP_NOZORDER|SWP_NOMOVE|SWP_SHOWWINDOW);
m_list.SetWindowPos(NULL,0,rcTitle.Height()+1,rcControl.Width(),rcControl.Height()-rcTitle.Height()-rcTitle.Height()-3,SWP_NOZORDER|SWP_SHOWWINDOW);
m_statusbar.SetWindowPos(NULL,0,0,rcControl.Width(),rcStatus.Height(),SWP_NOZORDER|SWP_NOMOVE|SWP_SHOWWINDOW);
return 0;
}
void CHMListViewCtrl::OnSize(UINT nType, int cx, int cy)
{
COleControl::OnSize(nType, cx, cy);
if( GetSafeHwnd() )
{
CRect rcControl;
GetClientRect(rcControl);
CRect rcTitle;
m_titlebar.GetClientRect(rcTitle);
CRect rcStatus;
m_statusbar.GetClientRect(rcStatus);
m_titlebar.SetWindowPos(NULL,0,0,rcControl.Width(),rcTitle.Height(),SWP_NOZORDER|SWP_NOMOVE|SWP_SHOWWINDOW);
m_list.SetWindowPos(NULL,0,rcTitle.Height()+1,rcControl.Width(),rcControl.Height()-rcTitle.Height()-rcTitle.Height()-3,SWP_NOZORDER|SWP_SHOWWINDOW);
m_statusbar.SetWindowPos(NULL,0,0,rcControl.Width(),rcStatus.Height(),SWP_NOZORDER|SWP_NOMOVE|SWP_SHOWWINDOW);
}
}
BSTR CHMListViewCtrl::GetTitle()
{
CString strResult = m_titlebar.GetTitleText();
return strResult.AllocSysString();
}
void CHMListViewCtrl::SetTitle(LPCTSTR lpszNewValue)
{
m_titlebar.SetTitleText(lpszNewValue);
SetModifiedFlag();
}
BSTR CHMListViewCtrl::GetDescription()
{
CString strResult = m_statusbar.GetDetailsText();
return strResult.AllocSysString();
}
void CHMListViewCtrl::SetDescription(LPCTSTR lpszNewValue)
{
m_statusbar.SetDetailsText(lpszNewValue);
SetModifiedFlag();
}
void CHMListViewCtrl::SetProgressRange(long lLowerBound, long lUpperBound)
{
CProgressCtrl& ctrl = m_statusbar.GetProgressCtrl();
ctrl.SetRange32(lLowerBound,lUpperBound);
}
long CHMListViewCtrl::GetProgressPos()
{
CProgressCtrl& ctrl = m_statusbar.GetProgressCtrl();
return ctrl.GetPos();
}
void CHMListViewCtrl::SetProgressPos(long lPos)
{
CProgressCtrl& ctrl = m_statusbar.GetProgressCtrl();
ctrl.SetPos(lPos);
}
long CHMListViewCtrl::StepProgressBar()
{
CProgressCtrl& ctrl = m_statusbar.GetProgressCtrl();
return ctrl.StepIt();
}
long CHMListViewCtrl::SetProgressStep(long lStep)
{
CProgressCtrl& ctrl = m_statusbar.GetProgressCtrl();
return ctrl.SetStep(lStep);
}
long CHMListViewCtrl::InsertItem(long lMask, long lItem, LPCTSTR lpszItem, long lState, long lStateMask, long lImage, long lParam)
{
return m_list.InsertItem(lMask,lItem,lpszItem,lState,lStateMask,lImage,lParam);
}
long CHMListViewCtrl::InsertColumn(long lColumn, LPCTSTR lpszColumnHeading, long lFormat, long lWidth, long lSubItem)
{
HDITEM hdItem;
ZeroMemory(&hdItem,sizeof(HDITEM));
hdItem.mask = HDI_FILTER|HDI_LPARAM;
hdItem.type = HDFT_ISSTRING;
hdItem.lParam = HDFS_CONTAINS;
m_bColumnInsertionComplete = false;
long lResult = m_list.InsertColumn(lColumn,lpszColumnHeading,lFormat,lWidth,lSubItem);
CHeaderCtrl* pHdrCtrl = m_list.GetHeaderCtrl();
if( pHdrCtrl )
{
pHdrCtrl->SetItem(lResult,&hdItem);
Header_ClearFilter(pHdrCtrl->GetSafeHwnd(),lResult);
}
m_bColumnInsertionComplete = true;
return lResult;
}
long CHMListViewCtrl::SetItem(long lItem, long lSubItem, long lMask, LPCTSTR lpszItem, long lImage, long lState, long lStateMask, long lParam)
{
return m_list.SetItem(lItem,lSubItem,lMask,lpszItem,lImage,lState,lStateMask,lParam);
}
long CHMListViewCtrl::GetStringWidth(LPCTSTR lpsz)
{
return m_list.GetStringWidth(lpsz);
}
long CHMListViewCtrl::GetColumnWidth(long lCol)
{
return m_list.GetColumnWidth(lCol);
}
BOOL CHMListViewCtrl::SetColumnWidth(long lCol, long lcx)
{
return m_list.SetColumnWidth(lCol,lcx);
}
long CHMListViewCtrl::FindItemByLParam(long lParam)
{
LVFINDINFO lvfi;
ZeroMemory(&lvfi,sizeof(lvfi));
lvfi.flags = LVFI_PARAM;
lvfi.lParam = lParam;
return m_list.FindItem(&lvfi);
}
long CHMListViewCtrl::GetImageList(long lImageListType)
{
CImageList* pImageList = m_list.GetImageList(lImageListType);
if( ! pImageList )
{
return -1L;
}
#ifndef IA64
return (long)pImageList->GetSafeHandle();
#endif // IA64
return 0;
}
long CHMListViewCtrl::SetImageList(long lImageList, long lImageListType)
{
HIMAGELIST hImageList = (HIMAGELIST)lImageList;
CImageList* pOldImageList = m_list.SetImageList(CImageList::FromHandle(hImageList),lImageListType);
#ifndef IA64
return (long)pOldImageList->GetSafeHandle();
#endif // IA64
return 0;
}
BOOL CHMListViewCtrl::DeleteAllItems()
{
return m_list.DeleteAllItems();
}
BOOL CHMListViewCtrl::DeleteColumn(long lCol)
{
return m_list.DeleteColumn(lCol);
}
long CHMListViewCtrl::GetNextItem(long lItem, long lFlags)
{
return m_list.GetNextItem(lItem,lFlags);
}
long CHMListViewCtrl::GetItem(long lItemIndex)
{
LVITEM lvi;
ZeroMemory(&lvi,sizeof(LVITEM));
lvi.mask = LVIF_PARAM;
lvi.iItem = lItemIndex;
if( ! m_list.GetItem(&lvi) )
{
return -1L;
}
return (long)lvi.lParam;
}
BOOL CHMListViewCtrl::DeleteItem(long lIndex)
{
return m_list.DeleteItem(lIndex);
}
long CHMListViewCtrl::GetItemCount()
{
return m_list.GetItemCount();
}
BOOL CHMListViewCtrl::ModifyListStyle(long lRemove, long lAdd, long lFlags)
{
return m_list.ModifyStyle(lRemove,lAdd,lFlags);
}
long CHMListViewCtrl::GetColumnCount()
{
CHeaderCtrl* pHeaderCtrl = m_list.GetHeaderCtrl();
if( !pHeaderCtrl )
{
return -1;
}
return pHeaderCtrl->GetItemCount();
}
long CHMListViewCtrl::GetColumnOrderIndex(long lColumn)
{
int nColumnCount = GetColumnCount();
if( nColumnCount < 0L )
{
return -1;
}
if( lColumn >= nColumnCount )
{
return -1;
}
if( lColumn < 0 )
{
return -1;
}
int* OrderArray = new int[nColumnCount];
if( ! m_list.GetColumnOrderArray(OrderArray,nColumnCount) )
{
delete[] OrderArray;
return -1;
}
for( int i = 0; i < nColumnCount; i++ )
{
if( OrderArray[i] == lColumn )
{
delete[] OrderArray;
return i;
}
}
return -1;
}
long CHMListViewCtrl::SetColumnOrderIndex(long lColumn, long lOrder)
{
int nColumnCount = GetColumnCount();
if( nColumnCount < 0L )
{
return -1;
}
if( lColumn >= nColumnCount )
{
return -1;
}
if( lColumn < 0 )
{
return -1;
}
int* OrderArray = new int[nColumnCount];
if( ! m_list.GetColumnOrderArray(OrderArray,nColumnCount) )
{
delete[] OrderArray;
return -1;
}
for( int i = 0; i < nColumnCount; i++ )
{
if( OrderArray[i] == lColumn )
{
break;
}
}
int Swap = OrderArray[lOrder];
OrderArray[lOrder] = lColumn;
OrderArray[i] = Swap;
if( ! m_list.SetColumnOrderArray(nColumnCount,OrderArray) )
{
delete [] OrderArray;
return -1;
}
delete [] OrderArray;
return 1;
}
BSTR CHMListViewCtrl::GetColumnOrder()
{
CString strResult;
int nColumnCount = GetColumnCount();
if( nColumnCount < 0L )
{
return NULL;
}
int* OrderArray = new int[nColumnCount];
if( ! m_list.GetColumnOrderArray(OrderArray,nColumnCount) )
{
delete[] OrderArray;
return NULL;
}
for( int i = 0; i < nColumnCount; i++ )
{
CString sNumber;
sNumber.Format(_T("%d "),OrderArray[i]);
strResult += sNumber;
}
delete [] OrderArray;
strResult.TrimRight(_T(" "));
return strResult.AllocSysString();
}
void CHMListViewCtrl::SetColumnOrder(LPCTSTR lpszOrder)
{
int nColumnCount = GetColumnCount();
if( nColumnCount < 0L )
{
return;
}
int* OrderArray = new int[nColumnCount];
LPTSTR pszString = new TCHAR[_tcslen(lpszOrder)+1];
_tcscpy(pszString,lpszOrder);
LPTSTR pszToken = _tcstok(pszString,_T(" "));
int i = 0;
while( pszToken && i < nColumnCount )
{
OrderArray[i++] = _ttoi(pszToken);
pszToken = _tcstok(NULL,_T(" "));
}
m_list.SetColumnOrderArray(nColumnCount,OrderArray);
delete[] OrderArray;
delete[] pszString;
}
void CHMListViewCtrl::SetColumnFilter(long lColumn, LPCTSTR lpszFilter, long lFilterType)
{
// TODO: Add your dispatch handler code here
}
void CHMListViewCtrl::GetColumnFilter(long lColumn, BSTR FAR* lplpszFilter, long FAR* lpFilterType)
{
HDITEM hdItem;
HDTEXTFILTER hdTextFilter;
CString sFilter;
hdTextFilter.pszText = sFilter.GetBuffer(_MAX_PATH);
hdTextFilter.cchTextMax = _MAX_PATH;
ZeroMemory(&hdItem,sizeof(HDITEM));
hdItem.mask = HDI_FILTER|HDI_LPARAM;
hdItem.type = HDFT_ISSTRING;
hdItem.pvFilter = &hdTextFilter;
CHeaderCtrl* pHdrCtrl = m_list.GetHeaderCtrl();
if( ! pHdrCtrl )
{
*lplpszFilter = NULL;
*lpFilterType = -1L;
return;
}
pHdrCtrl->GetItem(lColumn,&hdItem);
sFilter.ReleaseBuffer();
*lplpszFilter = sFilter.AllocSysString();
*lpFilterType = (long)hdItem.lParam;
}
long CHMListViewCtrl::GetSelectedCount()
{
return m_list.GetSelectedCount();
}