⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sclistcsv.cpp

📁 agsm a gsm sim manager for browsing, managing, and manipulating the phonebook,SMS on the SIM card. I
💻 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; j<nCount; j++)
	{
		if(m_listExport.GetCheck(j))
			last = j;
	}
	if(last == -1)
	{
		AfxMessageBox(IDS_STRING135);
		return;
	}

	FILE *fout = NULL;
	char mode[] = "a";
    if( (fout  = fopen(m_ExportFile, "r" )) != NULL )
	{
		fclose(fout);
		fout = NULL;
		CString str;
		CString format((LPCSTR)IDS_STRING136);
		str.Format(format,m_ExportFile);
		int iRet = AfxMessageBox(str,MB_YESNOCANCEL);
		if(iRet == IDCANCEL)
			return;
		else if(iRet == IDYES )
			strcpy(mode,"w");
		else if(iRet == IDNO)
			strcpy(mode,"a");

	}

	for(j=0; j<nCount; j++)
	{
		if(m_listExport.GetCheck(j))
		{
			if(fout == NULL)
			{
					fout = fopen(m_ExportFile,mode);
					if(fout == NULL)
					{
						Helper::ShowLastError();
						return;
					}
			}
			if(j == last)
				fprintf(fout,"%s",m_listExport.GetItemText(j,0));
			else
				fprintf(fout,"%s,",m_listExport.GetItemText(j,0));
		}
	}

	if(last != -1)
	{
		fprintf(fout,"\n");
	}

	BOOL newline = FALSE;
	for(int i=0; i<m_pExportWhat->GetItemCount(); i++)
	{
		for(j=0; j<nCount; j++)
		{
			if(m_listExport.GetCheck(j))
			{
				CString str = m_pExportWhat->GetItemText(i,j);
				if(!str.IsEmpty())
					newline = TRUE;
			}
		}
		if(!newline)
			continue;
		for(j=0; j<nCount; j++)
		{
			if(m_listExport.GetCheck(j))
			{
				CString str = m_pExportWhat->GetItemText(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; j<nCols; j++)
				{
					if(m_pImportTo->GetColumn(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; i<m_listImport.GetItemCount(); i++)
				{
					CString str = m_listImport.GetItemText(i,1);
					if(str == dlg.m_strMapTo)
					{
						m_listImport.SetItem(i,1,LVIF_TEXT,
										_T(""),
										0,0,0,0);
						m_listImport.SetCheck(i,FALSE);
					}
				}
				m_listImport.SetItem(iItem,1,LVIF_TEXT,
								dlg.m_strMapTo,
								0,0,0,0);
				//m_listImport.SetCheck(iItem,FALSE);
			}else{
				m_listImport.SetCheck(iItem,TRUE);
			}
		}
	}
	*pResult = 0;
}

BOOL CChangeMapDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	int nCount = m_listMapTo->GetHeaderCtrl()->GetItemCount();
	LVCOLUMN col;
	TCHAR TxtBuf[256];
	col.mask = LVCF_TEXT;
	col.pszText =  TxtBuf;
	col.cchTextMax = 256; 

	for(int i=0; i<nCount; i++)
	{
		m_listMapTo->GetColumn(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; i<m_listImport.GetItemCount(); i++)
		{
			CString str = m_listImport.GetItemText(i,1);
			if(str == dlg.m_strMapTo)
			{
				m_listImport.SetItem(i,1,LVIF_TEXT,
									_T(""),
									0,0,0,0);
				m_listImport.SetCheck(i,FALSE);
			}
		}
		m_listImport.SetItem(iItem,1,LVIF_TEXT,
						dlg.m_strMapTo,
						0,0,0,0);
	}
	*pResult = 0;
}

void CScListImportCSV::OnOK() 
{
	// TODO: Add extra validation here
	//当前内容是空吗?
	BOOL list_is_empty = TRUE;
	int i =0,j=0;
	int nCols = m_pImportTo->GetHeaderCtrl()->GetItemCount();
	CString tmp_str;
	for(i=0; i<m_pImportTo->GetItemCount(); i++)
	{
		for(j=1; j<nCols; j++)
		{
			tmp_str = m_pImportTo->GetItemText(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; i<nCount; i++)
	{
		if(m_listImport.GetCheck(i))
		{
			for(j=0; j<nCols; j++)
			{
				if(m_pImportTo->GetColumn(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();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -