#include "stdafx.h" #include "ScintillaEditView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CScintillaEditView IMPLEMENT_DYNCREATE(CScintillaEditView, CCustomCtrlView) BEGIN_MESSAGE_MAP(CScintillaEditView, CCustomCtrlView) //{{AFX_MSG_MAP(CScintillaEditView) ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut) ON_COMMAND(ID_EDIT_CUT, OnEditCut) ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo) ON_COMMAND(ID_EDIT_REDO, OnEditRedo) //}}AFX_MSG_MAP ON_NOTIFY(SCN_STYLENEEDED, 0, OnStyleNeeded) ON_NOTIFY(SCN_SAVEPOINTLEFT, 0, OnSavePointLeft) ON_NOTIFY(SCN_SAVEPOINTREACHED, 0, OnSavePointReached) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CScintillaEditView construction/destruction CScintillaEditView::CScintillaEditView() { CScintillaEditCtrl* pSciEditCtrl = new CScintillaEditCtrl(); SetCustomCtrl(pSciEditCtrl); } afx_msg void CScintillaEditView::OnStyleNeeded(NMHDR* pNotifyStruct, LRESULT* pResult) { /* Search backwards the first nonalnum character * CScintillaEditCtrl* pEd = &GetSciEditCtrl(); NMSCINTILLAEDIT& nm = *((NMSCINTILLAEDIT*) pNotifyStruct); int nStartPos = pEd->GetEndStyled(); int nFirstLineNumber = pEd->GetLineFromPosition(nStartPos); int nLastLineNumber = pEd->GetLineFromPosition(nm.position); int nLineLength = pEd->GetLineLength(nFirstLineNumber); pszLine = new TCHAR[nLineLength]; for (nLine = nFirstLineNumber; nLine <= nLastLineNumber; ++nLine) { // Get the text for this line int nCurLineLength = pEd->GetLineLength(nLine); if (nCurLineLength > nLineLength) { delete [] pszLine; nLineLength = nCurLineLength; pszLine = new TCHAR[nLineLength]; } // Get the text for the current line pEd->GetLineText(nLine, pszLine); // Find the first alnum for (int i=0;pszLine[i] != 0; ++i) { switch (pszLine[i]) { case ';': pEd->SetStyling(i, ); break; break; } if (isalnum(pszLine[i])) { } } } delete [] pszLine;*/ } afx_msg void CScintillaEditView::OnSavePointLeft( NMHDR * pNotifyStruct, LRESULT * result ) { CDocument* pdoc = GetDocument(); pdoc->SetModifiedFlag(true); CString strTitle = pdoc->GetTitle(); if (strTitle.Right(1) != "*") { pdoc->SetTitle(pdoc->GetTitle() + "*"); } } afx_msg void CScintillaEditView::OnSavePointReached( NMHDR * pNotifyStruct, LRESULT * result ) { CDocument* pdoc = GetDocument(); pdoc->SetModifiedFlag(false); CString strTitle = pdoc->GetTitle(); if (strTitle.Right(1) == "*") { pdoc->SetTitle(strTitle.Left(strTitle.GetLength()-1)); } } CScintillaEditView::~CScintillaEditView() { } ///////////////////////////////////////////////////////////////////////////// // CScintillaEditView message handlers /* Edit menu handlers */ void CScintillaEditView::OnUpdateEditCopy(CCmdUI* pCmdUI) { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pCmdUI->Enable(pSciEd->CanCopyCut()); } void CScintillaEditView::OnUpdateEditPaste(CCmdUI* pCmdUI) { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pCmdUI->Enable(pSciEd->CanPaste()); } void CScintillaEditView::OnEditCopy() { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pSciEd->CopySelectionText(); } void CScintillaEditView::OnEditPaste() { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pSciEd->PasteClipboardText(); } void CScintillaEditView::OnEditCut() { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pSciEd->CutSelectionText(); } void CScintillaEditView::OnUpdateEditCut(CCmdUI* pCmdUI) { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pCmdUI->Enable(pSciEd->CanCopyCut()); } void CScintillaEditView::OnEditUndo() { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pSciEd->Undo(); } void CScintillaEditView::OnUpdateEditUndo(CCmdUI* pCmdUI) { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pCmdUI->Enable(pSciEd->CanUndo()); } void CScintillaEditView::OnEditRedo() { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pSciEd->Redo(); } void CScintillaEditView::OnUpdateEditRedo(CCmdUI* pCmdUI) { CScintillaEditCtrl* pSciEd = &GetSciEditCtrl(); pCmdUI->Enable(pSciEd->CanRedo()); } ///////////////////////////////////////////////////////////////////////////// // CScintillaEditView diagnostics #ifdef _DEBUG void CScintillaEditView::AssertValid() const { CCustomCtrlView::AssertValid(); } void CScintillaEditView::Dump(CDumpContext& dc) const { CCustomCtrlView::Dump(dc); } #endif //_DEBUG BOOL CScintillaEditView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { BOOL bRes; bRes = CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); // Create the scintilla control if (bRes) { RECT rcClient; GetClientRect(&rcClient); GetSciEditCtrl().Create(&CRect(rcClient), this, 0); } return bRes; } void CScintillaEditView::WriteToArchive(CArchive& ar) { // Save text line by line CString strLine; CScintillaEditCtrl& sci = GetSciEditCtrl(); for (int i=1; i<=sci.GetLineCount(); ++i) { sci.GetLineText(i, strLine); ar.Write((LPCTSTR) strLine, strLine.GetLength()); } // Clear the dirty flag sci.SetSavePoint(); } void CScintillaEditView::ReadFromArchive(CArchive& ar) { CScintillaEditCtrl& sci = GetSciEditCtrl(); UINT nReadChars; // Clear the buffer sci.ClearAll(); // Load text using a 4KB buffer CString strLine; const UINT READBUFFERSIZE = 4096; LPTSTR lpsz = strLine.GetBuffer(READBUFFERSIZE); while (nReadChars = ar.Read(lpsz, READBUFFERSIZE)) { sci.AppendText(nReadChars, strLine); } strLine.ReleaseBuffer(0); // Clear dirty flag and empty undo buffer, so the file insertion is // not accounted for. sci.SetSavePoint(); sci.EmptyUndoBuffer(); }