📄 outputview.cpp
字号:
//####COPYRIGHTBEGIN####// // ----------------------------------------------------------------------------// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.//// This program is part of the eCos host tools.//// This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 2 of the License, or (at your option) // any later version.// // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details.// // You should have received a copy of the GNU General Public License along with// this program; if not, write to the Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.//// ----------------------------------------------------------------------------// //####COPYRIGHTEND####// OutputView.cpp : implementation file//////===========================================================================//===========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): sdf// Contact(s): sdf// Date: 1998/08/11// Version: 0.01// Purpose: // Description: This is the implementation of the output window view// Requires: // Provides: // See also: // Known bugs: // Usage: ////####DESCRIPTIONEND####////===========================================================================#include "stdafx.h"#ifndef PLUGIN#include "BCMenu.h"#endif#include "ConfigTool.h"#include "OutputView.h"#include "MainFrm.h"#include "FindDialog.h"#include "CTUtils.h"#include "ConfigTooldoc.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// COutputViewIMPLEMENT_DYNCREATE(COutputView, CEditView)COutputView::COutputView(){ CConfigTool::SetOutputView(this);}COutputView::~COutputView(){ CConfigTool::SetOutputView(0);}static UINT WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);BEGIN_MESSAGE_MAP(COutputView, CEditView) //{{AFX_MSG_MAP(COutputView) ON_WM_CONTEXTMENU() ON_WM_CHAR() ON_WM_KEYDOWN() ON_COMMAND(ID_EDIT_FINDAGAIN,OnEditFindAgain) ON_UPDATE_COMMAND_UI(ID_EDIT_FIND, OnUpdateEditFind) ON_COMMAND(ID_EDIT_FIND, OnEditFind) ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnEditFindReplace) ON_CONTROL_REFLECT(EN_CHANGE, OnEditChange) ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut) ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR, OnUpdateEditDelete) ON_COMMAND(ID_EDIT_CLEAR_ALL, OnEditClear) ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR_ALL, OnUpdateEditClear) ON_COMMAND(ID_LOG_SAVE, OnFileSave) ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) ON_WM_MENUCHAR() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// COutputView drawingvoid COutputView::OnDraw(CDC* pDC){ // TODO: add draw code here UNUSED_ALWAYS(pDC);}/////////////////////////////////////////////////////////////////////////////// COutputView diagnostics#ifdef _DEBUGvoid COutputView::AssertValid() const{ CEditView::AssertValid();}void COutputView::Dump(CDumpContext& dc) const{ CEditView::Dump(dc);}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// COutputView message handlersvoid COutputView::AddText(const CString & str){ CString strText; // Change \n into \r\n int nStart=0; for(int nIndex=0;nIndex<str.GetLength();nIndex++){ if(str[nIndex]==_TCHAR('\n')){ if(nIndex==0||str[nIndex-1]!=_TCHAR('\r')){ strText+=str.Mid(nStart,nIndex-nStart); strText+=_TCHAR('\r'); nStart=nIndex; } } } strText+=str.Mid(nStart,nIndex-nStart); { int nStart,nEnd; int nLength=GetBufferLength(); GetEditCtrl().GetSel(nStart,nEnd); // Replace selection GetEditCtrl().SetSel(nLength,nLength,TRUE); GetEditCtrl().ReplaceSel(strText); if(GetBufferLength()!=unsigned(nLength+strText.GetLength())){ // Try again by removing equivalent length from start of buffer. // For neatness, remove whole lines int nLine=GetEditCtrl().LineFromChar(strText.GetLength()-1); int nIndex=GetEditCtrl().LineIndex(nLine+1); GetEditCtrl().SetSel(0,nIndex-1,TRUE); GetEditCtrl().ReplaceSel(_T("")); nLength=GetBufferLength(); GetEditCtrl().SetSel(nLength,nLength,TRUE); GetEditCtrl().ReplaceSel(strText); } else if(nStart!=nEnd) { GetEditCtrl().SetSel(nStart,nEnd,TRUE); } }}void COutputView::OnInitialUpdate() { CEditView::OnInitialUpdate(); CConfigToolApp*pApp=(CConfigToolApp*)AfxGetApp(); if(pApp->m_strBufferedLogMessages){ AddText(pApp->m_strBufferedLogMessages); pApp->m_strBufferedLogMessages=_T(""); }}void COutputView::Clear(){ GetEditCtrl().SetSel(0,-1); GetEditCtrl().Clear();}BOOL COutputView::PreCreateWindow(CREATESTRUCT& cs) { //cs.style|=ES_MULTILINE|ES_READONLY|WS_VSCROLL; cs.style|=ES_MULTILINE|WS_VSCROLL|ES_NOHIDESEL; return CEditView::PreCreateWindow(cs);}void COutputView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if(VK_DELETE==nChar){ MessageBeep (MB_OK); } else { CEditView::OnKeyDown(nChar, nRepCnt, nFlags); }}void COutputView::OnContextMenu(CWnd* pWnd, CPoint point) { Menu menu; menu.LoadMenu(IDR_OUTPUT_CONTEXT); menu.LoadToolbar(IDR_MAINFRAME); Menu *pPopup=(Menu *)menu.GetSubMenu(0); if(point.x<0){ point=GetCaretPos(); point.x=max(3,point.x); point.y=max(3,point.y); ClientToScreen(&point); } pPopup->TrackPopupMenu(TPM_LEFTALIGN, point.x,point.y,this); UNUSED_ALWAYS(pWnd);}void COutputView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { switch(nChar){ case 0x03: // ctrl+c SendMessage(WM_COMMAND,ID_EDIT_COPY,0); break; case 0x01: // ctrl+a SendMessage(WM_COMMAND,ID_EDIT_SELECT_ALL,0); break; default: MessageBeep (MB_OK); break; } UNUSED_ALWAYS(nFlags); UNUSED_ALWAYS(nRepCnt);}void COutputView::OnEditClear() { Clear(); }void COutputView::OnEditUndo() { MessageBeep (MB_OK);}void COutputView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { switch(lHint){ case 0: default: return; } UNUSED_ALWAYS(pSender); UNUSED_ALWAYS(pHint);}void COutputView::OnFileSave() { CFileDialog dlg( FALSE, _T("log"), _T("ConfigTool"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Log Files (*.log)|*.log|All Files (*.*)|*.*||")); if(IDOK==dlg.DoModal()){ Save(dlg.GetPathName()); }}void COutputView::OnEditSelectAll() { GetEditCtrl().SetSel(0,-1);}void COutputView::OnEditCopy() { GetEditCtrl().Copy(); }void COutputView::OnUpdateEditCopy(CCmdUI* pCmdUI) { int nStart,nEnd; GetEditCtrl().GetSel(nStart,nEnd); pCmdUI->Enable(nStart!=nEnd);}void COutputView::OnUpdateEditClear(CCmdUI* pCmdUI) { pCmdUI->Enable(GetBufferLength()!=0);}void COutputView::Save(const CString & strFile){ TRY { CStdioFile f( strFile, CFile::modeCreate | CFile::modeWrite ); CStringArray arstr; GetContents(arstr); for(int i=0;i<arstr.GetSize();i++){ f.WriteString(arstr[i]); f.WriteString(_T("\n")); } f.Close(); } CATCH( CFileException, e ) { CUtils::MessageBoxF(_T("Failed to write to %s - %s"),strFile,CUtils::Explanation(*e)); } END_CATCH}void COutputView::GetContents(CStringArray & arstr){ arstr.SetSize(GetEditCtrl().GetLineCount()); for(int i=0;i<arstr.GetSize();i++){ CString &str=arstr[i]; for(int n=256;;n+=256){ TCHAR *pszBuf=str.GetBuffer(n); int nLineLen=GetEditCtrl().GetLine(i,pszBuf,n-1); pszBuf[nLineLen]=_TCHAR('\0'); str.ReleaseBuffer(); if(nLineLen<n-1){ break; } } }}void COutputView::OnEditFindAgain() { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); if(!FindText(pDoc->m_strFind,pDoc->m_nFindFlags&&FR_DOWN, pDoc->m_nFindFlags&FR_MATCHCASE)){ CUtils::MessageBoxF(_T("Cannot find '%s'"),pDoc->m_strFind); }}void COutputView::OnUpdateEditFindAgain(CCmdUI* pCmdUI) { pCmdUI->Enable(!CConfigTool::GetConfigToolDoc()->m_strFind.IsEmpty() && m_hWnd==CWnd::GetFocus()->m_hWnd);}void COutputView::OnFindNext( LPCTSTR lpszFind, BOOL bNext, BOOL bCase ){ CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); pDoc->m_strFind=lpszFind; pDoc->m_nFindFlags=(bNext?FR_DOWN:0)|(bCase?FR_MATCHCASE:0); CEditView::OnFindNext(lpszFind, bNext, bCase );}void COutputView::OnTextNotFound( LPCTSTR lpszFind ){ CUtils::MessageBoxF(_T("Cannot find '%s'"),lpszFind); CEditView::OnTextNotFound(lpszFind);}void COutputView::OnEditFind() { CConfigTool::GetMain()->m_bFindInProgress=true; CEditView::OnEditFind();}void COutputView::OnUpdateEditFind(CCmdUI* pCmdUI) { pCmdUI->Enable(!CConfigTool::GetMain()->m_bFindInProgress); }LONG COutputView::OnEditFindReplace(WPARAM wParam, LPARAM lParam){ CFindReplaceDialog* pDialog = CFindReplaceDialog::GetNotifier(lParam); if(pDialog->IsTerminating()){ CConfigTool::GetMain()->m_bFindInProgress=false; } return CEditView::OnFindReplaceCmd(wParam, lParam);}void COutputView::OnEditChange (){ // override CEditView::OnEditChange() to prevent // setting of the document modified flag}void COutputView::OnUpdateEditCut(CCmdUI* pCmdUI) { pCmdUI->Enable(false);}void COutputView::OnUpdateEditPaste(CCmdUI* pCmdUI) { pCmdUI->Enable(false);}void COutputView::OnUpdateEditDelete(CCmdUI* pCmdUI) { pCmdUI->Enable(false);}LRESULT COutputView::OnMenuChar(UINT, UINT, CMenu*){ const MSG *pMsg=GetCurrentMessage(); // punt to the mainframe to deal with shortcuts in popups return AfxGetMainWnd()->SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -