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


// ScListCSV.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "agsm2.h" 
#include "ScListCtrl.h" 
#include "ScListCSV.h" 
#include "Helper.h" 
#include "ref/csv.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CScListExportCSV dialog 
 
 
CScListExportCSV::CScListExportCSV(CWnd* pParent /*=NULL*/) 
	: CDialog(CScListExportCSV::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CScListExportCSV) 
	m_ExportFile = _T(""); 
	m_bComOpen = TRUE; 
	//}}AFX_DATA_INIT 
	m_pExportWhat = NULL; 
} 
 
 
void CScListExportCSV::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CScListExportCSV) 
	DDX_Control(pDX, IDC_LIST_EXPORT, m_listExport); 
	DDX_Text(pDX, IDC_EDIT_EXPORT, m_ExportFile); 
	DDX_Check(pDX, IDC_CHECK_COMOPEN, m_bComOpen); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CScListExportCSV, CDialog) 
	//{{AFX_MSG_MAP(CScListExportCSV) 
	ON_BN_CLICKED(IDC_BUTTON_BROWSER, OnButtonBrowser) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CScListExportCSV message handlers 
///////////////////////////////////////////////////////////////////////////// 
// CScListImportCSV dialog 
 
 
CScListImportCSV::CScListImportCSV(CWnd* pParent /*=NULL*/) 
	: CDialog(CScListImportCSV::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CScListImportCSV) 
	m_ImportFile = _T(""); 
	//}}AFX_DATA_INIT 
} 
 
 
void CScListImportCSV::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CScListImportCSV) 
	DDX_Control(pDX, IDC_LIST_IMPORT, m_listImport); 
	DDX_Text(pDX, IDC_EDIT_IMPORT, m_ImportFile); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CScListImportCSV, CDialog) 
	//{{AFX_MSG_MAP(CScListImportCSV) 
	ON_BN_CLICKED(IDC_BUTTON_BROWSER, OnButtonBrowser) 
	ON_NOTIFY(NM_CLICK, IDC_LIST_IMPORT, OnClickListImport) 
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_IMPORT, OnDblclkListImport) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CScListImportCSV message handlers 
 
void CScListExportCSV::ExportScList(CScListCtrl *pScList) 
{ 
	m_pExportWhat = pScList; 
} 
 
void CScListImportCSV::ImportScList(CScListCtrl *pScList) 
{ 
 
	m_pImportTo = pScList; 
} 
 
BOOL CScListExportCSV::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	// TODO: Add extra initialization here 
	m_listExport.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT ); 
	m_listExport.InsertColumn(0,_T(""),LVCFMT_LEFT,80); 
	LVCOLUMN col; 
	int i = 0; 
	TCHAR TxtBuf[256]; 
 
	col.mask = LVCF_TEXT; 
	col.pszText =  TxtBuf; 
    col.cchTextMax = 256;  
 
	do{ 
		if(m_pExportWhat->GetColumn(i, &col)) 
		{ 
			m_listExport.InsertItem(i,col.pszText); 
			i++; 
		}else 
			break; 
	}while(1); 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CScListExportCSV::OnButtonBrowser()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(); 
	CString strExt(_T("csv")); 
	CString strTitle((LPCSTR)IDS_STRING_SAVE_AS); 
	CString strFilter((LPCSTR)IDS_DEFAULTCSVFILTERS); 
 
	CFileDialog fileDialog(TRUE, strExt, NULL, OFN_ENABLESIZING  | OFN_HIDEREADONLY, 
							strFilter, this); 
	fileDialog.m_ofn.lpstrTitle = strTitle; 
 
	int ret = fileDialog.DoModal(); 
	if (IDOK == ret) 
	{ 
		CString strPathName = fileDialog.GetPathName(); 
		if (!strPathName.IsEmpty()) 
		{ 
			m_ExportFile = strPathName; 
			UpdateData(FALSE); 
		} 
	} 
} 
 
void CScListExportCSV::OnOK()  
{ 
	// TODO: Add extra validation here 
	if(m_ExportFile.IsEmpty()) 
	{ 
		AfxMessageBox(IDS_STRING134); 
		return ; 
	} 
	int nCount = m_listExport.GetItemCount(); 
	int last = -1; 
	for(int j=0; jGetItemCount(); i++) 
	{ 
		for(j=0; jGetItemText(i,j); 
				if(!str.IsEmpty()) 
					newline = TRUE; 
			} 
		} 
		if(!newline) 
			continue; 
		for(j=0; jGetItemText(i,j); 
				//CSV encoding... 
				if(str.FindOneOf(",\r\n\"") != -1) 
				{ 
					str.Replace("\"","\"\"");//Microsot's 通讯簿 don't do this 
					str.Insert(0,'\"'); 
					str.Insert(str.GetLength(),'\"'); 
					TRACE("new CSV String %s\n",str); 
				} 
 
				if(j == last) 
					fprintf(fout,"%s",str); 
				else 
					fprintf(fout,"%s,",str); 
			} 
		} 
		fprintf(fout,"\n"); 
		newline = FALSE; 
	} 
	fclose(fout); 
	CDialog::OnOK(); 
	if(m_bComOpen) 
	{ 
			ShellExecute( 
						 NULL, 
						 TEXT("open"), 
						 m_ExportFile, 
						 NULL, 
						 NULL, 
						 SW_SHOWNORMAL); 
	} 
} 
 
BOOL CScListImportCSV::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	m_listImport.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT ); 
	CString txt((LPCSTR)IDS_STRING_TEXT); 
	CString mapto((LPCSTR)IDS_STRING_MAP_TO); 
	m_listImport.InsertColumn(0,txt,LVCFMT_LEFT,80); 
	m_listImport.InsertColumn(1,mapto,LVCFMT_LEFT,80); 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CScListImportCSV::OnButtonBrowser()  
{ 
	// TODO: Add your control notification handler code here 
	CString strExt(_T("csv")); 
	CString strTitle((LPCSTR)IDS_STRING_OPEN_FILE); 
	CString strFilter((LPCSTR)IDS_DEFAULTCSVFILTERS); 
	CString colFormat((LPCSTR)IDS_STRING_COL); 
 
	CFileDialog fileDialog(TRUE, strExt, NULL, OFN_ENABLESIZING | OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, 
							strFilter, this); 
	fileDialog.m_ofn.lpstrTitle = strTitle; 
 
	int ret = fileDialog.DoModal(); 
	if (IDOK == ret) 
	{ 
		CString strPathName = fileDialog.GetPathName(); 
		if (!strPathName.IsEmpty()) 
		{ 
			m_ImportFile = strPathName; 
			UpdateData(FALSE); 
			fin = fopen(m_ImportFile,"r"); 
			if(fin == NULL) 
			{ 
				Helper::ShowLastError(); 
				return; 
			} 
			int iRet = csv_row_fread(fin, 
						buf,1024, 
						row, 32, 
						',', CSV_TRIM | CSV_QUOTES); 
			LVCOLUMN col; 
			TCHAR TxtBuf[256]; 
			col.mask = LVCF_TEXT; 
			col.pszText =  TxtBuf; 
			col.cchTextMax = 256;  
 
			//探测第一行是否为域名称 
			BOOL have_match = FALSE; 
			int cols[32]; 
			memset(cols,-1,32*sizeof(int)); 
			int i=0; 
			while(row[i]) 
			{ 
				int nCols = m_pImportTo->GetHeaderCtrl()->GetItemCount(); 
 
				for(int j=0; jGetColumn(j, &col)) 
					{ 
						if(!strcmp(TxtBuf,(const char *)row[i])) 
						{ 
							have_match = TRUE; 
							cols[i] = j; 
							break; 
						} 
					} 
				} 
				i++; 
			} 
			if(have_match)//第一行是域名称 
			{ 
				int iRet = csv_row_fread(fin, 
						buf,1024, 
						row, 32, 
						',', CSV_TRIM | CSV_QUOTES); 
				i=0; 
				while(row[i]) 
				{ 
					CString str = row[i]; 
					if(str.IsEmpty()) 
						str.Format(colFormat,i); 
					m_listImport.InsertItem(i,str); 
					if(cols[i] != -1) 
					{ 
						m_pImportTo->GetColumn(cols[i],&col); 
						m_listImport.SetItem(i,1,LVIF_TEXT, 
										col.pszText, 
										0,0,0,0); 
						m_listImport.SetCheck(i); 
					} 
					i++; 
				} 
 
			}else{//第一行不是域名称 
				i=0; 
				while(row[i]) 
				{ 
					CString str = row[i]; 
					if(str.IsEmpty()) 
						str.Format(colFormat,i); 
					m_listImport.InsertItem(i,str); 
					i++; 
				} 
			} 
			//if(fin) 
			//	fclose(fin); 
 
		} 
	} 
	 
} 
///////////////////////////////////////////////////////////////////////////// 
// CChangeMapDlg dialog 
 
 
CChangeMapDlg::CChangeMapDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CChangeMapDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CChangeMapDlg) 
	m_MapWhat = _T(""); 
	//}}AFX_DATA_INIT 
} 
 
 
void CChangeMapDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CChangeMapDlg) 
	DDX_Control(pDX, IDC_COMBO_MAPTO, m_comboMapTo); 
	DDX_Text(pDX, IDC_STATIC_TXT, m_MapWhat); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CChangeMapDlg, CDialog) 
	//{{AFX_MSG_MAP(CChangeMapDlg) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CChangeMapDlg message handlers 
 
void CScListImportCSV::OnClickListImport(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; 
	// TODO: Add your control notification handler code here 
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
	int iItem = pNMListView->iItem; 
 
	CPoint      ptAction; 
	UINT        nFlags; 
 
	GetCursorPos(&ptAction); 
	m_listImport.ScreenToClient(&ptAction); 
	iItem = m_listImport.HitTest(ptAction, &nFlags); 
	TRACE(_T("%d\n"),nFlags); 
	TRACE(_T("%d %d %d %d %d %d %d %d\n"), 
				LVHT_NOWHERE ,LVHT_ONITEMICON, 
				LVHT_ONITEMLABEL,LVHT_ONITEMSTATEICON, 
				LVHT_ABOVE, LVHT_BELOW, 
				LVHT_TORIGHT, LVHT_TOLEFT); 
	if(nFlags & LVHT_ONITEMSTATEICON) 
	{ 
		CString map; 
		map = m_listImport.GetItemText(iItem,1); 
		if(map.IsEmpty() && !m_listImport.GetCheck(iItem)) 
		{ 
			CChangeMapDlg dlg; 
			dlg.m_MapWhat = m_listImport.GetItemText(iItem,0); 
			dlg.m_listMapTo = m_pImportTo; 
			dlg.DoModal(); 
			TRACE(_T("%s\n"),dlg.m_strMapTo); 
			if(!dlg.m_strMapTo.IsEmpty()) 
			{ 
				for(int i=0; iGetHeaderCtrl()->GetItemCount(); 
	LVCOLUMN col; 
	TCHAR TxtBuf[256]; 
	col.mask = LVCF_TEXT; 
	col.pszText =  TxtBuf; 
	col.cchTextMax = 256;  
 
	for(int i=0; iGetColumn(i,&col); 
		m_comboMapTo.AddString(col.pszText); 
	} 
	if(!m_strMapTo.IsEmpty()) 
		m_comboMapTo.SelectString(0,m_strMapTo); 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CChangeMapDlg::OnOK()  
{ 
	// TODO: Add extra validation here 
	int iCur = m_comboMapTo.GetCurSel(); 
	if(iCur != CB_ERR ) 
	{ 
		m_comboMapTo.GetLBText(  
					iCur, 
					m_strMapTo); 
	}else 
		m_strMapTo = _T(""); 
	CDialog::OnOK(); 
} 
 
void CScListImportCSV::OnDblclkListImport(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; 
	// TODO: Add your control notification handler code here 
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
	int iItem = pNMListView->iItem; 
 
	CString map; 
	map = m_listImport.GetItemText(iItem,1); 
 
	CChangeMapDlg dlg; 
	dlg.m_MapWhat = m_listImport.GetItemText(iItem,0); 
	dlg.m_listMapTo = m_pImportTo; 
	dlg.m_strMapTo = map; 
	dlg.DoModal(); 
	TRACE(_T("%s\n"),dlg.m_strMapTo); 
	if(!dlg.m_strMapTo.IsEmpty()) 
	{ 
		for(int i=0; iGetHeaderCtrl()->GetItemCount(); 
	CString tmp_str; 
	for(i=0; iGetItemCount(); i++) 
	{ 
		for(j=1; jGetItemText(i,j); 
			if(!tmp_str.IsEmpty()) 
			{ 
				list_is_empty = FALSE; 
				break; 
			} 
		} 
	} 
	int nItem = 0; 
	if(!list_is_empty) 
	{ 
		int iRet = AfxMessageBox(IDS_STRING141,MB_YESNOCANCEL); 
		if(iRet == IDCANCEL) 
			return; 
		else if(iRet == IDYES ) 
			m_pImportTo->DeleteAllItems(); 
		else if(iRet == IDNO) 
			nItem = m_pImportTo->GetItemCount(); 
 
	} 
	//判断填加到哪一列. 
	int cols[32]; 
	memset(cols,-1,32*sizeof(int)); 
	BOOL have_col0 = FALSE; 
	LVCOLUMN col; 
	TCHAR TxtBuf[256]; 
	col.mask = LVCF_TEXT; 
	col.pszText =  TxtBuf; 
	col.cchTextMax = 256;  
 
	int nCount = m_listImport.GetItemCount(); 
	for(i=0; iGetColumn(j, &col)) 
				{ 
					tmp_str = m_listImport.GetItemText(i,1); 
					if(TxtBuf == tmp_str) 
					{ 
						cols[i] = j; 
						if(j == 0) 
							have_col0 = TRUE; 
						break; 
					} 
				} 
			} 
		} 
	} 
	//开始填加 
	int iRet; 
	do{ 
		i=0; 
		if(!have_col0 && !list_is_empty) 
		{ 
			tmp_str.Format("%d",nItem+1); 
			m_pImportTo->AddItem(nItem,0,tmp_str); 
		} 
		while(row[i]) 
		{ 
			if(cols[i] == 0 && !list_is_empty) 
			{ 
				tmp_str.Format("%d",nItem+1); 
				m_pImportTo->AddItem(nItem,0,tmp_str); 
			}else if(cols[i] != -1) 
			{ 
				m_pImportTo->AddItem(nItem,cols[i],(const char *)row[i]); 
			} 
			i++; 
		} 
		iRet = csv_row_fread(fin, 
						buf,1024, 
						row, 32, 
						',', CSV_TRIM | CSV_QUOTES); 
		nItem++; 
 
	}while(iRet>0); 
	fclose(fin); 
	CDialog::OnOK(); 
}