Mercurial > ecos
diff host/tools/configtool/standalone/win32/OutputView.cpp @ 76:435cced73e2f ecos-v1_3_1-release
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
| author | jlarmour |
|---|---|
| date | Tue, 28 Mar 2000 14:10:45 +0000 |
| parents | |
| children | 74dbf4c3f2e1 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/host/tools/configtool/standalone/win32/OutputView.cpp @@ -0,0 +1,401 @@ +//####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); +}
