📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "icrEdit.h"
#include "MainFrm.h"
#include "IcrEditView.h"
#include "resource.h"
#include "DateTime.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
DWORD CALLBACK EditStreamCallbackWriteToFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);
DWORD CALLBACK EditStreamCallbackOut(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_CBN_SELCHANGE(IDC_COMBOX, OnSelchangeCombo)
ON_CBN_SELCHANGE(IDC_COMBOX, OnSelchangeComboFind)
ON_COMMAND(ID_EDITPASTE, OnEditPaste)
ON_COMMAND(ID_EDITCUT, OnEditcut)
ON_UPDATE_COMMAND_UI(ID_EDITCUT, OnUpdateEditcut)
ON_COMMAND(ID_EDITCOPY, OnEditcopy)
ON_UPDATE_COMMAND_UI(ID_EDITCOPY, OnUpdateEditcopy)
ON_UPDATE_COMMAND_UI(ID_EDITPASTE, OnUpdateEditpaste)
ON_COMMAND(ID_EDITUNDO, OnEditundo)
ON_UPDATE_COMMAND_UI(ID_EDITUNDO, OnUpdateEditundo)
ON_COMMAND(ID_EDITREDO, OnEditredo)
ON_UPDATE_COMMAND_UI(ID_EDITREDO, OnUpdateEditredo)
ON_COMMAND(ID_EDITSELECTALL, OnEditselectall)
ON_COMMAND(ID_EDITFIND, OnEditfind)
ON_COMMAND(ID_EDITREPEAT, OnEditrepeat)
ON_COMMAND(ID_EDITREPEATNEXT, OnEditrepeatnext)
ON_UPDATE_COMMAND_UI(ID_EDITREPEAT, OnUpdateEditrepeat)
ON_UPDATE_COMMAND_UI(ID_EDITREPEATNEXT, OnUpdateEditrepeatnext)
ON_COMMAND(ID_EDITREPLACE, OnEditreplace)
ON_COMMAND(ID_VIEW_FONT, OnViewFont)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_EDIT_TRIMTRAILLINGSPACE, OnEditTrimtraillingspace)
ON_COMMAND(ID_EDIT_TRIMTRAILLINGTAB, OnEditTrimtraillingtab)
ON_COMMAND(ID_EDIT_TABTOSPACE, OnEditTabtospace)
ON_COMMAND(ID_EDIT_SPACETOTAB, OnEditSpacetotab)
ON_COMMAND(ID_EDIT_LEADINGSPACETOTAB, OnEditLeadingspacetotab)
ON_COMMAND(ID_EDIT_MOVERIGHT, OnEditMoveright)
ON_COMMAND(ID_EDIT_UNCOMMENT, OnEditUncomment)
ON_COMMAND(ID_EDIT_MOVELEFT, OnEditMoveleft)
ON_COMMAND(ID_EDIT_COMMENT, OnEditComment)
ON_COMMAND(ID_EDIT_LCASE, OnEditLcase)
ON_COMMAND(ID_EDIT_UCASE, OnEditUcase)
ON_COMMAND(ID_EDIT_INVERT, OnEditInvert)
ON_COMMAND(ID_EDIT_CAPITALIZE, OnEditCapitalize)
ON_COMMAND(ID_EDIT_SENTANCECASE, OnEditSentancecase)
ON_COMMAND(ID_EDIT_INSERTDATETIME, OnEditInsertdatetime)
ON_COMMAND(ID_EDIT_INSERTFILE, OnEditInsertfile)
ON_UPDATE_COMMAND_UI(ID_EDIT_LCASE, OnUpdateEditLcase)
ON_UPDATE_COMMAND_UI(ID_EDIT_INVERT, OnUpdateEditInvert)
ON_UPDATE_COMMAND_UI(ID_EDIT_SENTANCECASE, OnUpdateEditSentancecase)
ON_UPDATE_COMMAND_UI(ID_EDIT_UCASE, OnUpdateEditUcase)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_FILESAVE, OnFilesave)
ON_UPDATE_COMMAND_UI(ID_EDIT_CAPITALIZE, OnUpdateEditCapitalize)
ON_COMMAND(ID_FILE_SAVE_AS_, OnFileSaveAs)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
m_pFindDialog = NULL;
m_pReplaceDialog = NULL;
m_strFileName = "";
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
m_bAutoMenuEnable = FALSE;
if(-1 == LoadToolbarCombo())
return FALSE;
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
int CMainFrame::LoadToolbarCombo()
{
CRect rect;
m_wndToolBar.SetButtonInfo(17, IDC_COMBOXFIND, TBBS_SEPARATOR, 140 );
m_wndToolBar.GetItemRect(17, &rect);
rect.bottom += 200;
if(!m_wndToolBar.m_comboboxFind.Create(CBS_DROPDOWN|WS_VISIBLE|WS_TABSTOP|CBS_AUTOHSCROLL|WS_VSCROLL,rect, &m_wndToolBar, IDC_COMBOXFIND))
return -1;
CFont *f = m_wndToolBar.GetFont();
m_wndToolBar.m_comboboxFind.ShowAutoWidth(TRUE);
m_wndToolBar.m_comboboxFind.SetFont(f);
m_wndToolBar.m_comboboxFind.SetMRURegKey ( _T("cmbFind MRU") );
m_wndToolBar.m_comboboxFind.SetMRUValueFormat ( _T("File #%d") );
m_wndToolBar.m_comboboxFind.SetAutoRefreshAfterAdd ( TRUE );
m_wndToolBar.m_comboboxFind.SetAutoSaveAfterAdd ( TRUE );
m_wndToolBar.m_comboboxFind.LoadMRU();
m_wndToolBar.m_comboboxFind.RefreshCtrl();
////////////////////////////////////////
m_wndToolBar.SetButtonInfo(21, IDC_COMBOX, TBBS_SEPARATOR, 110 );
m_wndToolBar.GetItemRect(21, &rect);
rect.bottom += 350;
if(!m_wndToolBar.m_combobox.Create(CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL, rect, &m_wndToolBar, IDC_COMBOX))
return -1;
m_wndToolBar.m_combobox.SetFont(f);
m_wndToolBar.m_combobox.ShowAutoWidth(TRUE);
m_wndToolBar.m_combobox.AddString(_T("Ada"));
m_wndToolBar.m_combobox.AddString(_T("AML"));
m_wndToolBar.m_combobox.AddString(_T("ASM"));
m_wndToolBar.m_combobox.AddString(_T("Basic"));
m_wndToolBar.m_combobox.AddString(_T("BAT"));
m_wndToolBar.m_combobox.AddString(_T("Blue"));
m_wndToolBar.m_combobox.AddString(_T("Clipper"));
m_wndToolBar.m_combobox.AddString(_T("COBOL"));
m_wndToolBar.m_combobox.AddString(_T("C++"));
m_wndToolBar.m_combobox.AddString(_T("C#"));
m_wndToolBar.m_combobox.AddString(_T("Dataflex"));
m_wndToolBar.m_combobox.AddString(_T("Eiffel"));
m_wndToolBar.m_combobox.AddString(_T("FORTRAN"));
m_wndToolBar.m_combobox.AddString(_T("HLBL"));
m_wndToolBar.m_combobox.AddString(_T("HTML"));
m_wndToolBar.m_combobox.AddString(_T("INI"));
m_wndToolBar.m_combobox.AddString(_T("Java"));
m_wndToolBar.m_combobox.AddString(_T("JSP"));
m_wndToolBar.m_combobox.AddString(_T("LIMBO"));
m_wndToolBar.m_combobox.AddString(_T("LISP"));
m_wndToolBar.m_combobox.AddString(_T("Modula2"));
m_wndToolBar.m_combobox.AddString(_T("Object Pascal"));
m_wndToolBar.m_combobox.AddString(_T("Paradox"));
m_wndToolBar.m_combobox.AddString(_T("Perl"));
m_wndToolBar.m_combobox.AddString(_T("PHP"));
m_wndToolBar.m_combobox.AddString(_T("PL1"));
m_wndToolBar.m_combobox.AddString(_T("Progress"));
m_wndToolBar.m_combobox.AddString(_T("Python"));
m_wndToolBar.m_combobox.AddString(_T("REBOL"));
m_wndToolBar.m_combobox.AddString(_T("REXX"));
m_wndToolBar.m_combobox.AddString(_T("RUBY"));
m_wndToolBar.m_combobox.AddString(_T("Smalltalk"));
m_wndToolBar.m_combobox.AddString(_T("SQL"));
m_wndToolBar.m_combobox.AddString(_T("VHDL"));
m_wndToolBar.m_combobox.AddString(_T("XML"));
m_wndToolBar.m_combobox.AddString(_T("Plain text"));
return 0;
}
void CMainFrame::OnSelchangeCombo()
{
CString strlanguage;
m_wndToolBar.m_combobox.GetLBText(
m_wndToolBar.m_combobox.GetCurSel(), strlanguage);
int nlanguage = GetLanguageByStringShow(strlanguage);
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
icrEditView->SelectLanguage(nlanguage);
}
void CMainFrame::OnEditPaste()
{
char * buffer;
if(!OpenClipboard())
return;
buffer = (char*)::GetClipboardData(CF_TEXT);
CloseClipboard();
CString str = buffer;
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
CWnd *pWnd = GetFocus();
if(pWnd->m_hWnd!=edit.m_hWnd)
{
pWnd->SendMessage(WM_PASTE, 0, 0);
return;
}
CHARRANGE cr;
edit.GetSel(cr);
icrEditView->SetParseCookieZeroFromGivenLine(edit.LineFromChar(cr.cpMin)); //粘贴时需重置解析缓冲区
edit.ReplaceSel(str, TRUE);
if(cr.cpMax != cr.cpMin)
{
icrEditView->ReCalcCursorPostion();
}
}
void CMainFrame::OnEditcut()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();
CWnd *pWnd = GetFocus();
if(pWnd->m_hWnd != SynCtrl.m_hWnd)
{
pWnd->SendMessage(WM_CUT, 0, 0);
return;
}
CHARRANGE cr;
SynCtrl.GetSel( cr );
icrEditView->GetRichEditCtrl().Cut();
if(cr.cpMax != cr.cpMin)
{
icrEditView->ReCalcCursorPostion();
}
else
{
SCROLLINFO si;
si.cbSize = sizeof(si);
icrEditView->GetScrollInfo(SB_HORZ, &si);
icrEditView->m_nHorzMaxOld = si.nMax;
}
}
void CMainFrame::OnUpdateEditcut(CCmdUI* pCmdUI)
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl& editctrl = icrEditView->GetRichEditCtrl();
CHARRANGE cr;
editctrl.GetSel(cr);
pCmdUI->Enable(cr.cpMin!=cr.cpMax);
}
void CMainFrame::OnEditcopy()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
CWnd *pWnd = GetFocus();
if(pWnd->m_hWnd != edit.m_hWnd)
{
pWnd->SendMessage(WM_COPY, 0, 0);
}
else
{
edit.Copy();
}
}
void CMainFrame::OnUpdateEditcopy(CCmdUI* pCmdUI)
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl& editctrl = icrEditView->GetRichEditCtrl();
CHARRANGE cr;
editctrl.GetSel(cr);
pCmdUI->Enable(cr.cpMin!=cr.cpMax);
}
void CMainFrame::OnUpdateEditpaste(CCmdUI* pCmdUI)
{
OpenClipboard();
if(::GetClipboardData(CF_TEXT)==FALSE)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
CloseClipboard();
}
void CMainFrame::OnEditundo()
{
GetFocus()->SendMessage(EM_UNDO, 0, 0);
}
void CMainFrame::OnUpdateEditundo(CCmdUI* pCmdUI)
{
CWnd *pWnd = GetFocus();
if(!pWnd)
return;
BOOL bCanUndo = pWnd->SendMessage(EM_CANUNDO, 0, 0);
pCmdUI->Enable(bCanUndo);
}
void CMainFrame::OnEditredo()
{
GetFocus()->SendMessage(EM_REDO, 0, 0);
}
void CMainFrame::OnUpdateEditredo(CCmdUI* pCmdUI)
{
CWnd *pWnd = GetFocus();
if(!pWnd)
return;
BOOL bCanRedo = pWnd->SendMessage(EM_CANREDO, 0, 0);
pCmdUI->Enable(bCanRedo);
}
void CMainFrame::OnEditselectall()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &editctrl=icrEditView->GetRichEditCtrl();
CWnd *pWnd = GetFocus();
if(pWnd->m_hWnd != editctrl.m_hWnd)
{
CString str;
pWnd->GetWindowText(str);
CHARRANGE ichCharRange;
ichCharRange.cpMax = str.GetLength();
ichCharRange.cpMin = 0;
pWnd->SendMessage(EM_EXSETSEL, 0, (LPARAM)&ichCharRange);
return;
}
editctrl.SetSel(0, -1);
editctrl.SetFocus();
editctrl.PostMessage( WM_PAINT, 0, 0 );
}
void CMainFrame::OnEditfind()
{
if(!m_pFindDialog)
m_pFindDialog = new CFind(this);
else
{
m_pFindDialog->ShowWindow(SW_SHOW);
m_pFindDialog->SetFocus();
return;
}
m_pFindDialog->Create(IDD_FIND, this);
m_pFindDialog->ShowWindow(SW_SHOW);
return;
}
void CMainFrame::OnEditrepeat()
{
CWinApp *app = AfxGetApp();
CMainFrame *mainfrm = (CMainFrame *)AfxGetMainWnd();
CIcrEditView *icrEditView=(CIcrEditView *)GetActiveView();
CString strEdit;
mainfrm->m_wndToolBar.m_comboboxFind.GetWindowText(strEdit);
//CString strEdit = app->GetProfileString(_T("CFind"), _T("str"), _T(""));
BOOL bWholeWord = app->GetProfileInt(_T("CFind"), _T("WholeWord"), 0);
BOOL bCase = app->GetProfileInt(_T("CFind"), _T("Case"), 0);
if(strEdit.IsEmpty())
return;
int dwFlags = 0;
if(bCase)
dwFlags|=FR_MATCHCASE;
if(bWholeWord)
dwFlags|=FR_WHOLEWORD;
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
CHARRANGE cr;
edit.GetSel(cr);
FINDTEXTEX *ft = new FINDTEXTEX[1];
ft->chrg.cpMin = cr.cpMin-1;
ft->chrg.cpMax = -1;// search through end of the text
TCHAR *t = new TCHAR[strEdit.GetLength()+1];
strcpy(t, strEdit);
ft->lpstrText = t;
mainfrm->m_wndToolBar.m_comboboxFind.AddToMRU(strEdit);
app->WriteProfileString(_T("CFind"), _T("str"), strEdit);
icrEditView->ShowWindow(SW_HIDE);
int nPos = edit.SendMessage(EM_FINDTEXTEX, dwFlags, (LPARAM)ft);
if(nPos!=-1) {
edit.SetSel(ft->chrgText.cpMin, ft->chrgText.cpMax);
icrEditView->SetFocus();
SetFocus();
icrEditView->ShowWindow(SW_SHOW);
}
else {
icrEditView->ShowWindow(SW_SHOW);
CString strShow;
strShow.Format(_T("Cannot find the string: \"%s\", search again from the end?"), strEdit);
if(MessageBox(strShow,_T("Find"), MB_ICONINFORMATION|MB_YESNO)==IDYES)
{
icrEditView->ShowWindow(SW_HIDE);
edit.SetSel(0, -1);
icrEditView->ShowWindow(SW_SHOW);
CHARRANGE cr;
edit.GetSel(cr);
edit.SetSel(cr.cpMax, cr.cpMax);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -