📄 textview.cpp
字号:
// TextView.cpp : implementation file
//
#include "stdafx.h"
#include "resourceeditor.h"
#include "TextView.h"
#include "DirFileInfo.h"
#include "ResDoc.h"
#include "Filedlg.h"
#include "TextDlg.h"
#include "TextExDlg.h"
#include "FindDlg.h"
#include "comdef.h"
#include "excel.h"
#include "atlconv.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
_TCHAR CTextView::ARR_CLMN_NAME[] = _T("ID,English,Simplified Chinese,Traditional Chinese");
/////////////////////////////////////////////////////////////////////////////
// CTextView
IMPLEMENT_DYNCREATE(CTextView, CListView)
CTextView::CTextView()
{
}
CTextView::~CTextView()
{
}
BEGIN_MESSAGE_MAP(CTextView, CListView)
//{{AFX_MSG_MAP(CTextView)
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_COMMAND(IDM_TEXT_ADD_ITEM, OnTextAddItem)
ON_COMMAND(IDM_TEXT_DEL_ITEM, OnTextDelItem)
ON_COMMAND(IDM_TEXT_EDIT_ITEM, OnTextEditItem)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_UPDATE_COMMAND_UI(IDM_TEXT_ADD_FILE, OnUpdateTextAddFile)
ON_UPDATE_COMMAND_UI(IDM_TEXT_ADD_ITEM, OnUpdateTextAddItem)
ON_UPDATE_COMMAND_UI(IDM_TEXT_DEL_ITEM, OnUpdateTextDelItem)
ON_UPDATE_COMMAND_UI(IDM_TEXT_EDIT_ITEM, OnUpdateTextEditItem)
ON_COMMAND(IDM_TEXT_FIND_ITEM, OnTextFindItem)
ON_WM_KEYDOWN()
ON_UPDATE_COMMAND_UI(IDM_TEXT_SAVETO_FILE, OnUpdateTextSavetoFile)
ON_COMMAND(IDM_TEXT_DEL_ALL_ITEM, OnTextDelAllItem)
ON_COMMAND(IDM_TEXT_EXPORT_TO_EXCEL, OnTextExportToExcel)
ON_COMMAND(IDM_TEXT_IMPORT_FORM_EXCEL, OnTextImportFormExcel)
ON_UPDATE_COMMAND_UI(IDM_TEXT_IMPORT_FORM_EXCEL, OnUpdateTextImportFormExcel)
ON_UPDATE_COMMAND_UI(IDM_TEXT_EXPORT_TO_EXCEL, OnUpdateTextExportToExcel)
ON_UPDATE_COMMAND_UI(IDM_TEXT_DEL_ALL_ITEM, OnUpdateTextDelAllItem)
ON_UPDATE_COMMAND_UI(IDM_TEXT_FIND_ITEM, OnUpdateTextFindItem)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTextView drawing
void CTextView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CTextView diagnostics
#ifdef _DEBUG
void CTextView::AssertValid() const
{
CListView::AssertValid();
}
void CTextView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTextView message handlers
BOOL CTextView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= LVS_REPORT;
cs.style |= LVS_SHOWSELALWAYS;
return CListView::PreCreateWindow(cs);
}
void CTextView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
LPNMITEMACTIVATE pnia = (LPNMITEMACTIVATE)pNMHDR;
CMenu menu;
VERIFY( menu.LoadMenu(IDM_POPUP_TEXT) );
CMenu * pMenu = menu.GetSubMenu(0);
if( PreTrackPopupMenu(pMenu, pnia->iItem, pnia->iSubItem) )
{
POINT pt = pnia->ptAction;
ClientToScreen(&pt);
pMenu->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this);
*pResult = 1;
}
else
{
*pResult = 0;
}
}
BOOL CTextView::PreTrackPopupMenu( CMenu * pMenu, int nIdx, int nSubItem /* = 0 */ )
{
_ASSERTE( pMenu != NULL );
CListCtrl &ls = GetListCtrl();
if( !g_theApp.IsSuperUser() )
{
if( nIdx == -1 )
{
return FALSE;
}
else
{
pMenu->DeleteMenu(IDM_TEXT_ADD_FILE, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_TEXT_SAVETO_FILE, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_TEXT_ADD_ITEM, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_TEXT_DEL_ITEM, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_TEXT_DEL_ALL_ITEM, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_TEXT_IMPORT_FORM_EXCEL, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_TEXT_EXPORT_TO_EXCEL, MF_BYCOMMAND);
}
}
else
{
if( nIdx == -1 )
{
pMenu->EnableMenuItem( IDM_TEXT_EDIT_ITEM, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_TEXT_DEL_ITEM, MF_BYCOMMAND | MF_GRAYED );
}
if( ls.GetSelectedCount() == 0 )
{
pMenu->EnableMenuItem( IDM_TEXT_SAVETO_FILE, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_TEXT_EXPORT_TO_EXCEL, MF_BYCOMMAND | MF_GRAYED );
}
}
if( nIdx != -1 )
{
if( ls.GetSelectedCount() > 1 )
pMenu->EnableMenuItem( IDM_TEXT_EDIT_ITEM, MF_BYCOMMAND | MF_GRAYED );
}
if( ls.GetItemCount() == 0 )
{
pMenu->EnableMenuItem( IDM_TEXT_DEL_ALL_ITEM, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_TEXT_FIND_ITEM, MF_BYCOMMAND | MF_GRAYED );
}
m_FindInfo.nCurIdx = nIdx;
m_FindInfo.nSubItem = nSubItem;
return TRUE;
}
void CTextView::FillColumn()
{
/* CListCtrl &ls = GetListCtrl();
LPTSTR pStart = ARR_CLMN_NAME;
LPTSTR pFind = _tcschr(pStart, _T(','));
for( int i = 0; pFind != NULL; ++i )
{
*pFind = 0;
ls.InsertColumn(i, pStart, LVCFMT_LEFT, 200 + i * 40);
*pFind = _T(',');
pStart = pFind + 1;
pFind = _tcschr(pStart, _T(','));
}
ls.InsertColumn(i, pStart, LVCFMT_LEFT, 200 + i * 40);
// used test*/
CListCtrl &ls = GetListCtrl();
int nColNum = g_theApp.m_nUsedLangNum+1;
CStringArray &arrColName = g_theApp.m_arrUsedLangNames;
ls.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 200);
for(int i=1;i<nColNum;i++)
{
ls.InsertColumn(i, arrColName.GetAt(i-1), LVCFMT_LEFT, 200 + i * 40);
}
}
void CTextView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl &ls = GetListCtrl();
DWORD dwStyle = ls.GetExtendedStyle();
dwStyle |= LVS_EX_GRIDLINES;
dwStyle |= LVS_EX_FULLROWSELECT;
ls.SetExtendedStyle( dwStyle );
// TODO: Add your specialized code here and/or call the base class
FillColumn();
m_pInfo = g_theApp.m_pTextInfo;
_ASSERTE( m_pInfo != NULL );
CDirFileNode * pRoot = (CDirFileNode *)m_pInfo->GetRoot();
CDirFileNode * pChild = (CDirFileNode *)m_pInfo->GetChild(pRoot);
for( int i = 0; pChild != NULL; ++i )
{
CStringArray arr;
VERIFY( g_theApp.m_MMIRes.GetTextEx(pChild->szID, arr) );
ls.InsertItem(i, pChild->szID);
for(int j = 1; j <= g_theApp.m_nUsedLangNum; j++)
ls.SetItemText(i, j, arr[j-1]);
ls.SetItemData(i, (DWORD)pChild);
pChild = (CDirFileNode *)m_pInfo->GetNext(pChild);
}
}
void CTextView::SetModifiedFlag( BOOL bModified /* = TRUE */)
{
CDocument * pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->SetModifiedFlag( bModified );
}
//DEL void CTextView::OnTextAddFile()
//DEL {
//DEL // TODO: Add your command handler code here
//DEL CFileDlg dlg;
//DEL dlg.SetFileExt(_T(".def"));
//DEL dlg.SetFileFilter(_T("text define files (*.def)|*.def|All Files (*.*)|*.*||"));
//DEL
//DEL CString strFileName = dlg.GetPathName();
//DEL if( strFileName.IsEmpty() )
//DEL return;
//DEL
//DEL CWaitCursor waitCur;
//DEL
//DEL if( !AddItemFromFile( strFileName ) )
//DEL AfxMessageBox(_T("Add item from file fail!"));
//DEL else
//DEL SetModifiedFlag();
//DEL }
void CTextView::OnTextAddItem()
{
// TODO: Add your command handler code here
CTextExDlg dlg;
dlg.m_strArrLangValues.RemoveAll();
int i=0;
for(i = 1;i<=g_theApp.m_nUsedLangNum;i++)
dlg.m_strArrLangValues.Add(_T(""));
CListCtrl &ls = GetListCtrl();
POSITION pos = ls.GetFirstSelectedItemPosition();
int nSel = -1;
if(pos != NULL)
nSel = ls.GetNextSelectedItem(pos);
if(nSel!=-1)
dlg.m_bSel = TRUE;
if( dlg.DoModal() == IDOK )
{
if( g_theApp.m_MMIRes.AddTextEx( dlg.m_strID, dlg.m_strArrLangValues ) )
{
int nCount = ls.GetItemCount();
CDirFileNode * pRoot = (CDirFileNode *)m_pInfo->GetRoot();
CDirFileNode * pChild = NULL;
CDirFileNode * pBrother = NULL;
CDirFileNode * pCur = NULL;
//add at tail
if(dlg.m_nPosition == ADD_ITEM_AT_TAIL)
{
ls.InsertItem( nCount, dlg.m_strID );
for(i = 1;i<=g_theApp.m_nUsedLangNum;i++)
ls.SetItemText( nCount, i, dlg.m_strArrLangValues.GetAt(i-1) );
//for debug
CString strThai = dlg.m_strArrLangValues.GetAt(1);
pChild = (CDirFileNode *)m_pInfo->MallocNode();
if( NULL == pChild )
return ;
_tcscpy( pChild->szID, dlg.m_strID );
m_pInfo->AddChild( pRoot, pChild );
ls.SetItemData(nCount, (DWORD)pChild);
}
//add at head
if(dlg.m_nPosition == ADD_ITEM_AT_HEAD)
{
ls.InsertItem(nCount,ls.GetItemText(nCount-1,0));
ls.SetItemData(nCount,ls.GetItemData(nCount-1));
for(i = 1;i<=g_theApp.m_nUsedLangNum;i++)
ls.SetItemText( nCount, i, ls.GetItemText(nCount-1,i) );
for(i = nCount-1;i>=1;i--)
{
ls.SetItemData(i,ls.GetItemData(i-1));
for(int j=0; j <= g_theApp.m_nUsedLangNum; j++)
ls.SetItemText( i, j, ls.GetItemText(i-1,j) );
}
ls.SetItemText( 0, 0,dlg.m_strID );
for(i = 1;i<=g_theApp.m_nUsedLangNum;i++)
ls.SetItemText( 0, i, dlg.m_strArrLangValues.GetAt(i-1));
pChild = (CDirFileNode *)m_pInfo->MallocNode();
if( NULL == pChild )
return ;
_tcscpy( pChild->szID, dlg.m_strID );
m_pInfo->AddChild( pRoot, pChild, FALSE );
ls.SetItemData(0, (DWORD)pChild);
}
//add before curent
if(dlg.m_nPosition == ADD_ITEM_BEFORE_CUR)
{
_ASSERT(nSel != -1);
pCur = (CDirFileNode *)ls.GetItemData(nSel);
_ASSERT(pCur != NULL);
ls.InsertItem(nCount,ls.GetItemText(nCount-1,0));
ls.SetItemData(nCount,ls.GetItemData(nCount-1));
for(i = 1;i<=g_theApp.m_nUsedLangNum;i++)
ls.SetItemText( nCount, i, ls.GetItemText(nCount-1,i) );
for(i = nCount-1;i>=nSel+1;i--)
{
ls.SetItemData(i,ls.GetItemData(i-1));
for(int j=0; j <= g_theApp.m_nUsedLangNum; j++)
ls.SetItemText( i, j, ls.GetItemText(i-1,j) );
}
ls.SetItemText( nSel, 0,dlg.m_strID );
for(i = 1;i<=g_theApp.m_nUsedLangNum;i++)
ls.SetItemText( nSel, i, dlg.m_strArrLangValues.GetAt(i-1));
pBrother = (CDirFileNode *)m_pInfo->MallocNode();
if( NULL == pBrother )
return ;
_tcscpy( pBrother->szID, dlg.m_strID );
m_pInfo->InsertInBrothers( pCur, pBrother, TRUE );
ls.SetItemData(nSel, (DWORD)pBrother);
}
//add after curent
if(dlg.m_nPosition == ADD_ITEM_AFTER_CUR)
{
_ASSERT(nSel != -1);
pCur = (CDirFileNode *)ls.GetItemData(nSel);
_ASSERT(pCur != NULL);
ls.InsertItem(nCount,ls.GetItemText(nCount-1,0));
ls.SetItemData(nCount,ls.GetItemData(nCount-1));
for(i = 1;i<=g_theApp.m_nUsedLangNum;i++)
ls.SetItemText( nCount, i, ls.GetItemText(nCount-1,i) );
for(i = nCount-1;i>=nSel+2;i--)
{
ls.SetItemData(i,ls.GetItemData(i-1));
for(int j=0; j <= g_theApp.m_nUsedLangNum; j++)
ls.SetItemText( i, j, ls.GetItemText(i-1,j) );
}
ls.SetItemText( nSel+1, 0,dlg.m_strID );
for(i = 1;i<=g_theApp.m_nUsedLangNum;i++)
ls.SetItemText( nSel+1, i, dlg.m_strArrLangValues.GetAt(i-1));
pBrother = (CDirFileNode *)m_pInfo->MallocNode();
if( NULL == pBrother )
return ;
_tcscpy( pBrother->szID, dlg.m_strID );
m_pInfo->InsertInBrothers( pCur, pBrother, FALSE );
ls.SetItemData(nSel+1, (DWORD)pBrother);
}
SetModifiedFlag();
}
else
{
AfxMessageBox(g_theApp.m_MMIRes.GetErrMsg());
}
}
}
void CTextView::OnTextDelItem()
{
// TODO: Add your command handler code here
if( AfxMessageBox(_T("Are you sure delete the selected items!"), MB_YESNO) == IDNO )
return;
CWaitCursor waitCursor;
CListCtrl &ls = GetListCtrl();
POSITION pos = ls.GetFirstSelectedItemPosition();
_ASSERTE( pos != NULL );
CUIntArray arrSel;
while( pos != NULL )
{
arrSel.Add( ls.GetNextSelectedItem(pos) );
}
int nCount = arrSel.GetSize();
CString strID;
for( int i = nCount - 1; i >= 0; --i )
{
strID = ls.GetItemText(arrSel[i], 0);
//if( g_theApp.m_MMIRes.DeleteText(strID) )
//xb
if( g_theApp.m_MMIRes.DeleteTextEx(strID) )
//xe*/
{
CDirFileNode * pNode = (CDirFileNode *)ls.GetItemData(arrSel[i]);
m_pInfo->RemoveNode(pNode);
ls.DeleteItem(arrSel[i]);
}
else
{
_ASSERTE( 0 );
}
}
arrSel.RemoveAll();
SetModifiedFlag();
}
void CTextView::OnTextDelAllItem()
{
// TODO: Add your command handler code here
if( AfxMessageBox(_T("Are you sure delete all items!"), MB_YESNO) == IDNO )
return;
CWaitCursor waitCursor;
CListCtrl &lst = GetListCtrl();
CDirFileNode * pNode = NULL;
CString strID;
int nCount = lst.GetItemCount();
for( int i = 0; i < nCount; ++i )
{
strID = lst.GetItemText(i, 0);
g_theApp.m_MMIRes.DeleteTextEx(strID);
pNode = (CDirFileNode *)lst.GetItemData(i);
m_pInfo->RemoveNode(pNode);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -