URL
https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk
Subversion Repositories openrisc_me
[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [tools/] [src/] [tools/] [configtool/] [standalone/] [win32/] [OutputView.cpp] - Rev 174
Compare with Previous | Blame | View Log
//####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_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COutputView IMPLEMENT_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_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COutputView drawing void COutputView::OnDraw(CDC* pDC) { // TODO: add draw code here UNUSED_ALWAYS(pDC); } ///////////////////////////////////////////////////////////////////////////// // COutputView diagnostics #ifdef _DEBUG void COutputView::AssertValid() const { CEditView::AssertValid(); } void COutputView::Dump(CDumpContext& dc) const { CEditView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // COutputView message handlers void 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); }