//	CMwlmfcListCtrlEx クラス

#if !defined(AFX_LISTCTRLEX_H__CEE88A07_809C_4E09_8015_D48A1D53D551__INCLUDED_)
#define AFX_LISTCTRLEX_H__CEE88A07_809C_4E09_8015_D48A1D53D551__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MwlmfcListCtrlEx.h : ヘッダー ファイル
//

#include "SortHeaderCtrl.h"

/////////////////////////////////////////////////////////////////////////////
// CMwlmfcListCtrlEx ウィンドウ

#define ICON_STD_START		(0)
#define ICON_STD_APP		(ICON_STD_START+0)
#define ICON_STD_BATSU		(ICON_STD_START+1)
#define ICON_STD_QUESTION	(ICON_STD_START+2)
#define ICON_STD_HATENA		(ICON_STD_QUESTION)
#define ICON_STD_WARNING	(ICON_STD_START+3)
#define ICON_STD_BIKKURI	(ICON_STD_WARNING)
#define ICON_STD_INFO		(ICON_STD_START+4)

class CMwlmfcListCtrlEx : public CListCtrl
{
// コンストラクション
public:
	CMwlmfcListCtrlEx();

// アトリビュート
public:
	
// オペレーション
public:

// オーバーライド
	// ClassWizard は仮想関数のオーバーライドを生成します。
	//{{AFX_VIRTUAL(CMwlmfcListCtrlEx)
	protected:
	//}}AFX_VIRTUAL
	//virtual void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);

// インプリメンテーション
public:
	virtual ~CMwlmfcListCtrlEx();

	//	ドロップ関係の挙動 -> ドロップは不可。reserved
	void SetDropOnClear(){ m_bDropOnClear = true; }
	void SetDropOnNoclear(){ m_bDropOnClear = false; }

	//	アイコン使用しますよー
	BOOL ValidateIcon();

	//	アイコンのロード
	int LoadIcon( LPCTSTR lpszIconName ){
		ValidateIcon();
		return m_imageList.Add( AfxGetApp()->LoadIcon( lpszIconName ) ); }

	//	標準アイコン群のロード
	void LoadStdIcons(){
		LoadStandardIcon( IDI_APPLICATION );
		LoadStandardIcon( IDI_HAND );
		LoadStandardIcon( IDI_QUESTION );
		LoadStandardIcon( IDI_EXCLAMATION );
		LoadStandardIcon( IDI_ASTERISK );
	}
	int LoadStandardIcon( LPCTSTR lpszIconName ){
		ValidateIcon();
		return m_imageList.Add( AfxGetApp()->LoadStandardIcon( lpszIconName ) ); }

	void DeleteSectedItems();

	RECT m_parentDlgRect;
	RECT m_listFirstRect;
	void OnInitDialog( CDialog *pParentDlg );

	void OnSize( int cx, int cy );
	/*void OnSize( int cx, int cy ){
		GetWindowLong( 
		CWnd::MoveWindow( CWnd::wndBottom, CWnd::wndTop, cx, cy );
		/*CWnd::wndTop
		CWnd::OnSize( SIZE_RESTORED, cx, cy );* }*/

	/*const char* operator []( int nItem ){
		CListCtrl::GetItemText( nItem, 
	}*/
	/*const char* GetItemTextEz( int nItem, int nSubItem ){
		CListCtrl::GetItemText( nItem, nSubItem, m_GetItemTextEz_work, sizeof(m_GetItemTextEz_work) );
		return m_GetItemTextEz_work;
	}*/
	//CHeaderCtrl* GetHeaderCtrl(){ return &m_ctlHeader; }
	//int InsertColumn(){ CListCtrl:: }

	void EnableFullRowSelect()
	{
		SetExtendedStyle(GetExtendedStyle()|LVS_EX_FULLROWSELECT);
	}

	//	文字色
	/*void SetLineColor( int nLine, BYTE r, BYTE g, BYTE b ){
		m_lineColorList[nLine] = RGB(r,g,b);
	}*/
	void SetColorIfData( DWORD dwData, BYTE r, BYTE g, BYTE b ){
		m_colorListData[dwData] = RGB(r,g,b) | (255<<24);
	}
	void SetColorIfData( DWORD dwData, COLORREF cref ){
		m_colorListData[dwData] = cref | (255<<24);
	}
	void SetColorIfData( DWORD dwData, int nSubItem, BYTE r, BYTE g, BYTE b ){
		m_colorListData[dwData] = RGB(r,g,b) | (nSubItem<<24);
	}
	void SetColorIfData( DWORD dwData, int nSubItem, COLORREF cref ){
		m_colorListData[dwData] = cref | (nSubItem<<24);
	}
	void ClearColors(){
		//m_lineColorList.clear();
		m_colorListData.clear();
	}

	// 生成されたメッセージ マップ関数
protected:
	CImageList m_imageList;

	//afx_msg void OnDropFiles(HDROP hDropInfo);
	//{{AFX_MSG(CMwlmfcListCtrlEx)
	afx_msg void OnDestroy();
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()

protected:
	bool m_bDropOnClear;
	bool m_bInitImageList;
	//char m_GetItemTextEz_work[1024];

	//	色
	//map<int,COLORREF> m_rowColorList;
	map<DWORD,COLORREF> m_colorListData;
	/*COLORREF GetLineColorRef( int nLine ){
		if ( m_lineColorList.find(nLine) == m_lineColorList.end() )
			return GetSysColor(COLOR_WINDOWTEXT);
		else
			return m_lineColorList[nLine];
	}*/
};



///////////////////////////////////////////////////////


class CMwlmfcReportListCtrlEx : public CMwlmfcListCtrlEx
{
// コンストラクション
public:
	CMwlmfcReportListCtrlEx();

// アトリビュート
public:
	
// オペレーション
public:

// オーバーライド
	// ClassWizard は仮想関数のオーバーライドを生成します。
	//{{AFX_VIRTUAL(CMwlmfcListCtrlEx)
	protected:
	virtual void PreSubclassWindow();
	//}}AFX_VIRTUAL
	//virtual void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);

// インプリメンテーション
public:
	virtual ~CMwlmfcReportListCtrlEx();

	void Sort( int nKeyColumn=0 ){
		if ( nKeyColumn != m_nPrevSortColumn )
			m_bNowAscending = true;
		else
			reverse_bool( m_bNowAscending );
		Sort( m_bNowAscending, nKeyColumn );
		//m_nPrevSortColumn = nKeyColumn;
	}
	void Sort( bool orderAscending, int nKeyColumn );
	void Resort(){ Sort( m_bSaveOrderAscending, m_nSaveColumn ); }

	void SortArrowReset(){ m_nPrevSortColumn=-1; m_ctlHeader.SortArrowReset(); }
	//CHeaderCtrl* GetHeaderCtrl(){ return &m_ctlHeader; }
	int GetColumnCount(){ return m_ctlHeader.GetItemCount(); }
	void ClearColumns(){
		for(; GetColumnCount() != 0; )
			DeleteColumn(0);
	}
	//int InsertColumn(){ CListCtrl:: }

	// 生成されたメッセージ マップ関数
protected:
	//afx_msg void OnDropFiles(HDROP hDropInfo);
	//{{AFX_MSG(CMwlmfcListCtrlEx)
	afx_msg void OnDestroy();
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()

protected:
	CSortHeaderCtrl m_ctlHeader;

	//	ソート関連
	bool m_bNowAscending;
	int m_nPrevSortColumn;
	int m_CompareFunction_nKeyColumn;
	static int CALLBACK PrivateCompareCallback( LPARAM lParam1, LPARAM lParam2, LPARAM lParamThisInstance );

	//	保持
	bool m_bSaveOrderAscending;
	int m_nSaveColumn;
};

namespace mwlmfc{
	typedef CMwlmfcListCtrlEx CListCtrlEx;
	typedef CMwlmfcReportListCtrlEx CReportListCtrlEx;
}//namespace mwlmfc

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。

#endif // !defined(AFX_LISTCTRLEX_H__CEE88A07_809C_4E09_8015_D48A1D53D551__INCLUDED_)
