www.pudn.com > UsefulListView.zip > GFXCUSTOMIZECOLUMNDLG.CPP


// GfxCustomizeColumnDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "CGfxListView.h" 
 
 
#include "GfxCustomizeColumnDlg.h" 
#include "GfxColumnManager.h" 
#include "GfxListView.h" 
#include  
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CGfxCustomizeColumnDlg dialog 
 
 
CGfxCustomizeColumnDlg::CGfxCustomizeColumnDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CGfxCustomizeColumnDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CGfxCustomizeColumnDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	pManager = NULL; 
} 
 
 
void CGfxCustomizeColumnDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CGfxCustomizeColumnDlg) 
	DDX_Control(pDX, IDC_FREECOL, wndFreeCol); 
	DDX_Control(pDX, IDC_ACTCOL, wndCol); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CGfxCustomizeColumnDlg, CDialog) 
	//{{AFX_MSG_MAP(CGfxCustomizeColumnDlg) 
	ON_BN_CLICKED(IDC_ADD, OnAdd) 
	ON_BN_CLICKED(IDC_REMOVE, OnRemove) 
	ON_BN_CLICKED(IDC_MOVEDOWN, OnMovedown) 
	ON_BN_CLICKED(IDC_MOVEUP, OnMoveup) 
	ON_LBN_SELCHANGE(IDC_ACTCOL, OnSelchangeActcol) 
	ON_LBN_SELCHANGE(IDC_FREECOL, OnSelchangeFreecol) 
	ON_LBN_DBLCLK(IDC_ACTCOL, OnDblclkActcol) 
	ON_LBN_DBLCLK(IDC_FREECOL, OnDblclkFreecol) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGfxCustomizeColumnDlg message handlers 
 
BOOL CGfxCustomizeColumnDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	ASSERT(pManager); 
 
	for (int t = 0; t < pManager->iColumnData; t ++) 
	{ 
		if (!(pManager->IsDefColumn(pManager->pColumnData[t].iId))) 
		{ 
			CString cs; 
 
			if (pManager->pColumnData[t].dwData & fhImage) 
				cs = pManager->pColumnData[t].cDescr ? pManager->pColumnData[t].cDescr : pManager->pColumnData[t].cText; 
			else 
				cs = pManager->pColumnData[t].cText; 
 
			if (cs != "") 
			{ 
				wndFreeCol.SetItemData(wndFreeCol.AddString(cs), pManager->pColumnData[t].iId); 
			} 
		} 
	} 
 
	for (int i = 0; i < pManager->iDefColumn; i ++) 
	{ 
		t = pManager->FindColumnById(pManager->pDefColumn[i]); 
		if (t >= 0) 
		{ 
			CString cs; 
 
			if (pManager->pColumnData[t].dwData & fhImage) 
				cs = pManager->pColumnData[t].cDescr ? pManager->pColumnData[t].cDescr : pManager->pColumnData[t].cText; 
			else 
				cs = pManager->pColumnData[t].cText; 
 
			if (cs != "") 
			{ 
				wndCol.SetItemData(wndCol.AddString(cs), pManager->pColumnData[t].iId); 
			} 
		} 
	} 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
int SortIntRev(const void *arg1, const void *arg2 ) 
{ 
	if (*((INT *)arg1)>*((INT *)arg2)) return -1; 
	if (*((INT *)arg1)<*((INT *)arg2)) return 1; 
	return 0; 
} 
 
void CGfxCustomizeColumnDlg::OnAdd()  
{ 
	int max = wndFreeCol.GetSelCount(); 
	if (max > 0) 
	{ 
		INT * pi = new INT[max]; 
		ASSERT(pi); 
		if (LB_ERR != wndFreeCol.GetSelItems(max, pi)) 
		{ 
			qsort((void *) pi, (size_t) max, sizeof(int), SortIntRev); 
			for (int t = 0; t < max; t++) 
			{ 
				int idx = pi[t]; 
				CString cs; 
				wndFreeCol.GetText(idx, cs); 
				long lParam = wndFreeCol.GetItemData(idx); 
				wndFreeCol.DeleteString(idx); 
				wndCol.SetItemData(wndCol.AddString(cs), lParam); 
			} 
			if (GetDlgItem(IDOK)->IsWindowEnabled() == false) GetDlgItem(IDOK)->EnableWindow(true); 
			OnSelchangeFreecol(); 
		} 
		if (pi) delete [] pi; 
	} 
} 
 
void CGfxCustomizeColumnDlg::OnRemove()  
{ 
	int max = wndCol.GetSelCount(); 
	if (max > 0) 
	{ 
		INT * pi = new INT[max]; 
		ASSERT(pi); 
		if (LB_ERR != wndCol.GetSelItems(max, pi)) 
		{ 
			qsort((void *) pi, (size_t) max, sizeof(int), SortIntRev); 
	 
			for (int t = 0; t < max; t++) 
			{ 
				int idx = pi[t]; 
				CString cs; 
				wndCol.GetText(idx, cs); 
				long lParam = wndCol.GetItemData(idx); 
				wndCol.DeleteString(idx); 
				wndFreeCol.SetItemData(wndFreeCol.AddString(cs), lParam); 
			} 
			if (GetDlgItem(IDOK)->IsWindowEnabled() == false) GetDlgItem(IDOK)->EnableWindow(true); 
			OnSelchangeActcol(); 
		} 
		if (pi) delete [] pi; 
	} 
} 
 
void CGfxCustomizeColumnDlg::OnMovedown()  
{ 
	if (wndCol.GetSelCount() == 1) 
	{ 
		if (GetDlgItem(IDOK)->IsWindowEnabled() == false) GetDlgItem(IDOK)->EnableWindow(true); 
		int idx = wndCol.GetCurSel(); 
		if (idx >= 0 && idx < wndCol.GetCount() - 1) 
		{ 
			CString cs; 
			wndCol.GetText(idx, cs); 
			long lParam = wndCol.GetItemData(idx); 
			wndCol.DeleteString(idx); 
			idx ++; 
			int newins = wndCol.InsertString(idx, cs); 
			wndCol.SetItemData(newins, lParam); 
			wndCol.SetSel(newins); 
			OnSelchangeActcol(); 
		} 
	} 
} 
 
void CGfxCustomizeColumnDlg::OnMoveup()  
{ 
	if (wndCol.GetSelCount() == 1) 
	{ 
		if (GetDlgItem(IDOK)->IsWindowEnabled() == false) GetDlgItem(IDOK)->EnableWindow(true); 
		int idx = wndCol.GetCurSel(); 
		if (idx > 0) 
		{ 
			CString cs; 
			wndCol.GetText(idx, cs); 
			long lParam = wndCol.GetItemData(idx); 
			wndCol.DeleteString(idx); 
			idx --; 
			int newins = wndCol.InsertString(idx, cs); 
			wndCol.SetItemData(newins, lParam); 
			wndCol.SetSel(newins); 
			OnSelchangeActcol(); 
		} 
	} 
} 
 
void CGfxCustomizeColumnDlg::OnOK()  
{ 
	int t, max = wndCol.GetCount(), * pi = NULL; 
 
	if (max == 0) 
	{ 
		AfxMessageBox("E' necessario inserire almeno una colonna .."); 
		return; 
	} 
 
	pi = new int[max + 1]; 
	ASSERT(pi); 
 
	for (t = 0; t < max; t++) 
	{ 
		pi[t + 1] = wndCol.GetItemData(t); 
	} 
 
	pi[0] = 0; 
 
	if (pManager->pDefColumn) delete [] pManager->pDefColumn; 
 
	pManager->pDefColumn = pi; 
	pManager->iDefColumn = max+1; 
	 
	CDialog::OnOK(); 
} 
 
void CGfxCustomizeColumnDlg::OnSelchangeActcol()  
{ 
	int ic = wndCol.GetSelCount(); 
	if (ic <= 0 || wndCol.GetCount() <= 0) 
	{ 
		if (GetDlgItem(IDC_REMOVE)->IsWindowEnabled()) GetDlgItem(IDC_REMOVE)->EnableWindow(false); 
		if (ic != 1) if (GetDlgItem(IDC_MOVEDOWN)->IsWindowEnabled()) GetDlgItem(IDC_MOVEDOWN)->EnableWindow(false); 
		if (ic != 1) if (GetDlgItem(IDC_MOVEUP)->IsWindowEnabled()) GetDlgItem(IDC_MOVEUP)->EnableWindow(false); 
	} 
	else 
	{ 
		if (!(GetDlgItem(IDC_REMOVE)->IsWindowEnabled())) GetDlgItem(IDC_REMOVE)->EnableWindow(true); 
		if (ic == 1 && wndCol.GetCurSel() < wndCol.GetCount() - 1) 
		{ 
			if (!(GetDlgItem(IDC_MOVEDOWN)->IsWindowEnabled())) GetDlgItem(IDC_MOVEDOWN)->EnableWindow(true); 
		} 
		else 
		{ 
			if (GetDlgItem(IDC_MOVEDOWN)->IsWindowEnabled()) GetDlgItem(IDC_MOVEDOWN)->EnableWindow(false); 
		} 
		if (ic == 1 && wndCol.GetCurSel() > 0)  
		{ 
			if (!(GetDlgItem(IDC_MOVEUP)->IsWindowEnabled())) GetDlgItem(IDC_MOVEUP)->EnableWindow(true); 
		} 
		else 
		{ 
			if (GetDlgItem(IDC_MOVEUP)->IsWindowEnabled()) GetDlgItem(IDC_MOVEUP)->EnableWindow(false); 
		} 
	} 
} 
 
void CGfxCustomizeColumnDlg::OnSelchangeFreecol()  
{ 
	if (wndFreeCol.GetSelCount() <= 0  || wndFreeCol.GetCount() <= 0) 
	{ 
		if (GetDlgItem(IDC_ADD)->IsWindowEnabled()) GetDlgItem(IDC_ADD)->EnableWindow(false); 
	} 
	else 
	{ 
		if (!(GetDlgItem(IDC_ADD)->IsWindowEnabled())) GetDlgItem(IDC_ADD)->EnableWindow(true); 
	} 
} 
 
void CGfxCustomizeColumnDlg::OnDblclkActcol()  
{ 
	OnRemove(); 
} 
 
void CGfxCustomizeColumnDlg::OnDblclkFreecol()  
{ 
	OnAdd(); 
}