#pragma once

class CListViewCtrlEx : public CListViewCtrl {
public:
	CListViewCtrlEx( HWND wnd = NULL ) : CListViewCtrl(wnd) {}
	CListViewCtrlEx const & operator=( HWND wnd ) { m_hWnd = wnd; return *this; }
	unsigned InsertColumnEx(unsigned index, const wchar_t * name, unsigned widthDLU);
	unsigned AddColumnEx( const wchar_t * name, unsigned widthDLU );
	void FixContextMenuPoint( CPoint & pt );
	unsigned GetColunnCount();

	unsigned InsertString( unsigned index, const wchar_t * str );
	unsigned InsertString8( unsigned index, const char * str );
	unsigned AddString( const wchar_t * str );
	unsigned AddString8(const char * str);
	void SetItemText(unsigned item, unsigned subItem, const wchar_t * str );
	void SetItemText8(unsigned item, unsigned subItem, const char * str );

	void AutoSizeColumn( int iCol ) { SetColumnWidth(iCol, LVSCW_AUTOSIZE) ;}
	int AddGroup(int iGroupID, const wchar_t * header);
};

// BOOL HandleLVKeyDownMod()
#define LVN_KEYDOWN_MOD_HANDLER(id, key, mod, func) \
	if (uMsg == WM_NOTIFY && LVN_KEYDOWN == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom && ((LPNMLVKEYDOWN)lParam)->wVKey == (key) && GetHotkeyModifierFlags() == (mod)) \
	{ \
		SetMsgHandled(TRUE); \
		lResult = func()?1:0; \
		if(IsMsgHandled()) \
			return TRUE; \
	}

// BOOL HandleLVCopy()
#define LVN_COPY_HANDLER(id, func) LVN_KEYDOWN_MOD_HANDLER(id, 'C', MOD_CONTROL, func)
