diff host/tools/configtool/common/win32/CellView.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
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/host/tools/configtool/common/win32/CellView.cpp
@@ -0,0 +1,671 @@
+//####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####
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): 	sdf
+// Contact(s):	sdf
+// Date:		1998/08/11
+// Version:		0.01
+// Purpose:	
+// Description:	Implementation of a the cell window view class
+// Requires:	
+// Provides:	
+// See also:#include	
+// Known bugs:	
+// Usage:	
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+
+#include "stdafx.h"
+#include "ConfigTool.h"
+#include "CellView.h"
+#include "ControlView.h"
+#include "ConfigItem.h"
+#include "IntegerEdit.h"
+#include "DoubleEdit.h"
+#include "StringEdit.h"
+#include "ComboEdit.h"
+
+#include "CTUtils.h"
+#include "ConfigToolDoc.h"
+
+#include "resource.h"
+
+#ifdef PLUGIN
+  #define INCLUDEFILE "ide.guicommon.h" // for ID_EDIT_FINDAGAIN
+  #include "IncludeSTL.h"
+#endif
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CCellView
+
+IMPLEMENT_DYNCREATE(CCellView, CView)
+
+CCellView::CCellView():
+  m_bComboSellPending(false)
+{
+  m_hInCell=NULL;
+  m_pwndCell=NULL;
+  m_GrayPen.CreatePen(PS_SOLID,1,RGB(192,192,192));	
+  CConfigTool::SetCellView(this);
+}
+
+CCellView::~CCellView()
+{
+    deleteZ(m_pwndCell);
+    CConfigTool::SetCellView(0);
+}
+
+
+BEGIN_MESSAGE_MAP(CCellView, CView)
+	//{{AFX_MSG_MAP(CCellView)
+	ON_WM_LBUTTONDOWN()
+	ON_WM_SIZE()
+	ON_WM_CREATE()
+	ON_WM_VSCROLL()
+	ON_WM_MOUSEMOVE()
+	ON_WM_MOUSEWHEEL()
+    ON_COMMAND(ID_EDIT_FIND,OnEditFind)
+    ON_COMMAND(ID_EDIT_FINDAGAIN,OnEditFindAgain)
+	ON_UPDATE_COMMAND_UI(ID_EDIT_FINDAGAIN, OnUpdateEditFindAgain)
+	ON_WM_RBUTTONDOWN()
+	ON_UPDATE_COMMAND_UI(ID_EDIT_FIND, OnUpdateEditFind)
+	ON_WM_ERASEBKGND()
+	ON_COMMAND(ID_EDIT_COPY,   OnEditCopy)
+	ON_COMMAND(ID_EDIT_CUT,    OnEditCut)
+	ON_COMMAND(ID_EDIT_PASTE,  OnEditPaste)
+	ON_COMMAND(ID_EDIT_CLEAR,  OnEditDelete)
+	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY,   OnUpdateEditCopy)
+	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT,    OnUpdateEditCut)
+	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE,  OnUpdateEditPaste)
+	ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR,  OnUpdateEditDelete)
+	ON_WM_HELPINFO()
+    ON_MESSAGE(WM_CANCEL_EDIT,OnCancelEdit)
+
+	//}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CCellView drawing
+
+void CCellView::OnInitialUpdate()
+{
+	m_nFirstVisibleItem=0;
+	CView::OnInitialUpdate();
+}
+
+void CCellView::OnDraw(CDC* pDC)
+{
+	CTreeCtrl &Tree=CConfigTool::GetControlView()->GetTreeCtrl();
+
+	CConfigToolDoc* pDoc=CConfigTool::GetConfigToolDoc();
+	if(pDoc->ItemCount()>0)
+	{
+		CRect rect;
+		Tree.GetItemRect(Tree.GetRootItem(),rect,TRUE);
+		m_nFirstVisibleItem=rect.top;
+
+		CRect rcClient;
+		GetClientRect(rcClient);
+		CPen *pOldPen=pDC->SelectObject(&m_GrayPen);
+		CFont *pOldFont=pDC->SelectObject(CConfigTool::GetControlView()->GetFont());
+		pDC->SetBkMode(TRANSPARENT);
+
+		CRect rcClip;
+		pDC->GetClipBox(rcClip);
+		
+		CPtrArray arItems;
+		int dy=CConfigTool::GetControlView()->GetItemHeight();
+		int cy=0;
+		for(HTREEITEM h=Tree.GetFirstVisibleItem();h;h=Tree.GetNextVisibleItem(h))
+		{
+			if(cy>rcClip.bottom){
+				break;
+			}
+
+			CRect rcEdit(0,cy,rcClient.right,cy+dy);
+			cy+=dy;
+
+			pDC->MoveTo(rcClient.left,rcEdit.top);
+			pDC->LineTo(rcClient.right,rcEdit.top);
+
+			CConfigItem &ti=TI(h);
+			if(h!=m_hInCell){
+        switch(ti.Type()){
+		      case CConfigItem::Enum:
+						// Using combobox
+						rcEdit.left+=2;
+						rcEdit.top+=2;
+            // fall through
+          case CConfigItem::Integer:
+          case CConfigItem::Double:
+          case CConfigItem::String:
+						// Using editbox
+						rcEdit.top+=2;
+						rcEdit.left+=3;
+            {
+				      CString str(ti.StringValue());
+				      // cell contents is greyed if the option is not both active and modifiable
+				      // or if a booldata item is not enabled
+				      const CdlValuable valuable = ti.GetCdlValuable();
+				      // check for a package explicitly because is_modifiable() returns true for a package
+				      pDC->SetTextColor (GetSysColor ((! valuable) || (valuable->is_modifiable () && valuable->is_active () && ((! ti.HasBool ()) || ti.IsEnabled ()) && ! ti.IsPackage ()) ? COLOR_WINDOWTEXT : COLOR_GRAYTEXT));
+				      pDC->TextOut(rcEdit.left,rcEdit.top,str);
+            }
+            break;
+          default:
+            break;
+        }
+			}
+		}
+		pDC->MoveTo(rcClient.left,cy);
+		pDC->LineTo(rcClient.right,cy);
+		pDC->SelectObject(pOldPen);
+		pDC->SelectObject(pOldFont);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// CCellView diagnostics
+
+#ifdef _DEBUG
+void CCellView::AssertValid() const
+{
+	CView::AssertValid();
+}
+
+void CCellView::Dump(CDumpContext&	dc) const
+{
+	CView::Dump(dc);
+}
+#endif //_DEBUG
+
+/////////////////////////////////////////////////////////////////////////////
+// CCellView message handlers
+
+void CCellView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
+{
+	switch(lHint)
+	{
+		case CConfigToolDoc::IntFormatChanged:
+      {
+			  for(HTREEITEM h=CConfigTool::GetControlView()->GetFirstVisibleItem();h;h=CConfigTool::GetControlView()->GetNextVisibleItem(h)){
+				  CConfigItem &ti=TI(h);
+          if(ti.Type()==CConfigItem::Integer) {
+					  CRect rect;
+					  GetItemRect(h,rect);
+					  InvalidateRect(rect);
+				  }
+			  }
+        if(m_pwndCell && TI(m_hInCell).Type()==CConfigItem::Integer) {
+				  CString strData;
+				  m_pwndCell->GetWindowText(strData);
+				  ItemIntegerType n;
+				  CUtils::StrToItemIntegerType(strData,n);
+          m_pwndCell->SetWindowText(CUtils::IntToStr(n,CConfigTool::GetConfigToolDoc()->m_bHex));
+			  }
+      }
+			break;
+		case CConfigToolDoc::Clear:	
+			deleteZ(m_pwndCell);
+			Invalidate();
+			UpdateWindow(); // This prevents cell view half of config pane still being displayed
+      break;
+		case CConfigToolDoc::ValueChanged:
+			{
+				CConfigItem *pti=(CConfigItem *)pHint;
+				CRect rect;
+				GetItemRect(pti->HItem(),rect);
+				InvalidateRect(rect);
+			}
+			break;
+		case 0:
+			Invalidate();
+			break;
+		default:
+			break;
+	}	
+	UNUSED_ALWAYS(pSender);
+}
+
+void CCellView::GetItemRect(HTREEITEM h,CRect & rect) const
+{
+	CRect rcClient;
+	GetClientRect(rcClient);
+
+	CConfigTool::GetControlView()->GetItemRect( h, &rect, FALSE );
+	rect.left=rcClient.left;
+	rect.right=rcClient.right;
+}
+
+void CCellView::GetInCellRect(HTREEITEM h, CRect & rect, BOOL bDropped) const
+{
+	CConfigItem &ti=TI(h);
+	GetItemRect(h,rect);
+  switch(ti.Type()){
+		case CConfigItem::Enum:
+			// Using combobox
+      if(bDropped) {
+        CStringArray arEnum;
+        ti.EvalEnumStrings(arEnum);
+        rect.bottom += (2+(int)arEnum.GetSize()-1)*rect.Height();
+      }
+      break;
+    case CConfigItem::Integer:  
+    case CConfigItem::Double:
+    case CConfigItem::String:
+			// Using editbox
+			//rect.bottom++;
+			//rect.DeflateRect(2,2); // To allow room  for the border we draw ourselves
+      //rect.InflateRect(2,2);
+      break;
+    default:
+      return;
+  }
+}
+
+ItemIntegerType CCellView::GetCellValue() const
+{
+  // If the item is being edited in-cell, we'll get the data from the control
+  ItemIntegerType rc=0;
+  switch(TI(m_hInCell).Type()){
+		case CConfigItem::Integer:
+      {
+        CString strData;
+        m_pwndCell->GetWindowText(strData);
+        if(!CUtils::StrToItemIntegerType(strData,rc)){
+          rc=0;
+        }
+      }
+      break;
+    case CConfigItem::Enum:
+    /*
+    case CConfigItem::Boolean:
+    case CConfigItem::Radio:
+    //rc=((CTreeComboBox *)m_pwndCell)->GetCurSel();
+    rc=((CComboEdit *)m_pwndCell)->GetCurSel();
+    break;
+      */
+    case CConfigItem::String:
+    default:
+      int type=TI(m_hInCell).Type();
+      UNUSED_ALWAYS(type);
+      ASSERT(FALSE);
+      break;
+  }
+  return rc;
+}
+
+void CCellView::CancelCellEdit(bool bApplyChanges)
+{
+  if(m_hInCell){
+    CConfigItem &ti=TI(m_hInCell);
+    if(bApplyChanges){
+      CString strValue;
+      m_pwndCell->GetWindowText(strValue);
+      // Ignore empty strings in integer or floating cells - these are legal as intermediate values but not now
+      if(strValue!=ti.StringValue() && (!strValue.IsEmpty() || (ti.Type()!=CConfigItem::Integer && ti.Type()!=CConfigItem::Double))){
+        CConfigTool::GetConfigToolDoc()->SetValue (ti, strValue);
+      }
+    }
+
+    deleteZ(m_pwndCell);
+    m_hInCell=NULL;
+  }
+}
+
+BOOL CCellView::InCell(HTREEITEM h)
+{
+  CancelCellEdit();
+  if(h && TI(h).IsEnabled()){
+    CConfigItem &ti=TI(h);
+    // edit cell only if option is both active and modifiable
+    const CdlValuable valuable = ti.GetCdlValuable();
+    // check packages explicitly because is_modifiable() returns true for a package
+    if ((! valuable) || (valuable->is_modifiable () && valuable->is_active () && ! ti.IsPackage ())){
+      CRect rcEdit;
+      GetItemRect(h,rcEdit);
+      rcEdit.bottom++;
+      switch(ti.Type()){
+        case CConfigItem::Double:
+          {
+            double d;
+            CUtils::StrToDouble(ti.StringValue(),d);
+            m_pwndCell=new CDoubleEdit(d);
+            m_pwndCell->Create(WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL, rcEdit, this, IDC_CELL);
+          }
+          break;
+        case CConfigItem::Integer:
+          {
+            ItemIntegerType i;
+            CUtils::StrToItemIntegerType(ti.StringValue(),i);
+            m_pwndCell=new CIntegerEdit(i);
+          }
+          m_pwndCell->Create(WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL, rcEdit, this, IDC_CELL);
+          break;
+        case CConfigItem::String:
+          {
+            CStringEdit *pStringEdit=new CStringEdit(ti.StringValue());
+            m_pwndCell=pStringEdit;
+            m_pwndCell->Create(WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL, rcEdit, this, IDC_CELL);
+            pStringEdit->EnableDoubleClickEdit(true,IDC_CT_EDIT);
+          }
+
+          break;
+        case CConfigItem::Enum:
+          {
+            CStringArray arEnum;
+            ti.EvalEnumStrings(arEnum);
+            rcEdit.bottom += (2+(int)arEnum.GetSize()-1)*rcEdit.Height();
+            m_pwndCell=new CComboEdit(ti.StringValue(),arEnum);
+            m_pwndCell->Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST, rcEdit, this, IDC_CELL);
+          }
+          break;
+        default:
+          return 0;
+          break;
+      }
+      m_hInCell=h;
+      m_pwndCell->SetFont(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
+      m_pwndCell->SetFocus();
+      m_pwndCell->GetWindowText(m_strInitialCell);
+    }
+  }
+  return NULL!=m_hInCell;
+}
+
+void CCellView::OnLButtonDown(UINT nFlags, CPoint point) 
+{
+    UNUSED_ALWAYS(nFlags);
+	CTreeCtrl &Tree=CConfigTool::GetControlView()->GetTreeCtrl();
+	CancelCellEdit();
+	HTREEITEM h=HitTest();
+	if(h){
+		InCell(h);
+		Tree.SelectItem(h);
+	}
+
+	// Relay to the splitter
+	ClientToScreen(&point);
+	GetParent()->ScreenToClient(&point);
+	GetParent()->SendMessage(WM_LBUTTONDOWN,(WPARAM)nFlags,MAKELPARAM(point.x,point.y));	
+}
+
+void CCellView::OnSize(UINT nType, int cx, int cy) 
+{
+	CView::OnSize(nType, cx, cy);
+	if(m_hInCell){
+//sdf1		UpdateWindow();
+		CRect rect;
+    GetItemRect(m_hInCell,rect);
+		m_pwndCell->MoveWindow(rect,TRUE);
+	}
+	
+}
+
+int CCellView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
+{
+	if (CView::OnCreate(lpCreateStruct) == -1)
+		return -1;
+	
+	return 0;
+}
+
+
+
+BOOL CCellView::PreCreateWindow(CREATESTRUCT& cs) 
+{
+	// TODO: Add your specialized code here and/or call the base class
+	cs.style &= (~WS_BORDER);
+	return CView::PreCreateWindow(cs);
+}
+
+void CCellView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
+{
+	CView::OnVScroll(nSBCode, nPos, pScrollBar);
+	Sync();
+}
+
+void CCellView::Sync()
+{
+	CTreeCtrl &t=CConfigTool::GetControlView()->GetTreeCtrl();
+	CRect rect;
+	t.GetItemRect(t.GetRootItem(),rect,TRUE);
+	int pos=rect.top;
+
+	if(pos!=m_nFirstVisibleItem){
+		ScrollWindow(0,pos-m_nFirstVisibleItem);
+    UpdateWindow();
+	}
+}
+
+
+void CCellView::OnMouseMove(UINT nFlags, CPoint point) 
+{
+	// Relay the mouse event to the splitter
+	ClientToScreen(&point);
+	GetParent()->ScreenToClient(&point);
+	GetParent()->SendMessage(WM_MOUSEMOVE,(WPARAM)nFlags,MAKELPARAM(point.x,point.y));	
+}
+
+
+BOOL CCellView::OnMouseWheel(UINT, short zDelta, CPoint) 
+{
+  UINT nScrollCode=((zDelta<0)?SB_LINEDOWN:SB_LINEUP);
+  LPARAM lParam=(LPARAM)GetScrollBarCtrl(SB_VERT)->GetSafeHwnd();
+  if(lParam){
+    for(int i=0;i<abs(zDelta)/WHEEL_DELTA;i++){
+      CConfigTool::GetControlView()->SendMessage(WM_VSCROLL,MAKEWPARAM(nScrollCode,0),lParam);
+      Sync();
+    }
+  }
+  return TRUE;
+}
+
+void CCellView::OnEditFind() 
+{
+    CConfigTool::GetControlView()->OnEditFind();
+}
+
+void CCellView::OnEditFindAgain() 
+{
+    CConfigTool::GetControlView()->OnEditFindAgain();
+}
+
+void CCellView::OnUpdateEditFindAgain(CCmdUI* pCmdUI) 
+{
+    CConfigTool::GetControlView()->OnUpdateEditFindAgain(pCmdUI);
+}
+
+void CCellView::OnRButtonDown(UINT nFlags, CPoint point) 
+{
+    UNUSED_ALWAYS(nFlags);
+    // Make the r-click have an effect equivalent to that when on the control view part
+    CControlView *pv=CConfigTool::GetControlView();
+	HTREEITEM h=HitTest();
+	if(h){
+		pv->SelectItem(h);
+    }
+	// point is in client coords
+	ClientToScreen(&point);
+	pv->ShowPopupMenu(h,point);
+}
+
+void CCellView::OnUpdateEditFind(CCmdUI* pCmdUI) 
+{
+    CConfigTool::GetControlView()->OnUpdateEditFind(pCmdUI);
+}
+
+BOOL CCellView::OnEraseBkgnd(CDC* pDC) 
+{
+    /*
+    static int x=3;
+    const MSG *pMsg=GetCurrentMessage();
+	WNDCLASS wndcls;
+    if (::GetClassInfo(NULL, _T("AfxFrameOrView42ud"), &wndcls)){
+        TRACE(_T("proc=%08x hbrBackground=%08x "),wndcls.lpfnWndProc,wndcls.hbrBackground);
+    }
+   
+    TRACE(_T("msg=%d hWnd=%08x wParam=%08x lParam=%08x m_pfnSuper=%08x super=%08x\n"),
+        pMsg->message,pMsg->hwnd, pMsg->lParam,pMsg->wParam,m_pfnSuper,	GetSuperWndProcAddr());
+    if(x){
+        return CView::OnEraseBkgnd(pDC);
+    }
+    */
+
+    // Work around bug apparently caused by SlickEdit
+	CRect rcClient;
+	pDC->GetClipBox(rcClient);
+	pDC->FillSolidRect(rcClient,GetSysColor(COLOR_WINDOW));
+		
+	return TRUE;
+}
+
+BOOL CCellView::PreTranslateMessage(MSG* pMsg) 
+{
+	CTreeCtrl &Tree=CConfigTool::GetControlView()->GetTreeCtrl();
+    if(WM_KEYDOWN==pMsg->message){
+		switch(pMsg->wParam){
+            case VK_TAB:
+                {
+                 	HTREEITEM h=Tree.GetSelectedItem();
+                    if(h){
+			            if(0==(::GetKeyState(VK_SHIFT)&0x8000)){
+				            // Shift key not down
+                            h=Tree.GetNextVisibleItem(h);
+                        }
+                        if(h){
+                            CancelCellEdit();
+                    		Tree.SelectItem(h);
+                            Tree.SetFocus();
+                        } else {
+                            MessageBeep (0xFFFFFFFF);
+                        }
+                        // Always handle this message to keep focus within the tree control
+                        return true;
+                    }
+                }
+		    }
+    }
+	return CView::PreTranslateMessage(pMsg);
+}
+
+HTREEITEM CCellView::HitTest()
+{
+	// Can use the control view's hittest because all it's interested in is the y coord
+
+	TVHITTESTINFO tvi;
+    DWORD dwPos=GetMessagePos();
+	CTreeCtrl &Tree=CConfigTool::GetControlView()->GetTreeCtrl();
+    tvi.pt.y=GET_Y_LPARAM(dwPos);
+    Tree.ScreenToClient(&tvi.pt);
+    tvi.pt.x=0;
+	return Tree.HitTest(&tvi);
+
+}
+
+void CCellView::OnEditCopy() 
+{
+  if(m_pwndCell){
+    m_pwndCell->OnEditCopy();
+  }
+}
+
+void CCellView::OnEditCut() 
+{
+  if(m_pwndCell){
+    m_pwndCell->OnEditCut();
+  }
+}
+
+void CCellView::OnEditPaste() 
+{
+  if(m_pwndCell){
+    m_pwndCell->OnEditPaste();
+  }
+}
+
+void CCellView::OnEditDelete() 
+{
+  if(m_pwndCell){
+    m_pwndCell->OnEditDelete();
+  }
+}
+
+void CCellView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
+{
+  if(m_pwndCell){
+    m_pwndCell->OnUpdateEditCopy(pCmdUI);
+  } else {
+    pCmdUI->Enable(false);
+  }
+}
+
+void CCellView::OnUpdateEditCut(CCmdUI* pCmdUI) 
+{
+  if(m_pwndCell){
+    m_pwndCell->OnUpdateEditCut(pCmdUI);
+  } else {
+    pCmdUI->Enable(false);
+  }
+}
+
+void CCellView::OnUpdateEditPaste(CCmdUI* pCmdUI) 
+{
+  if(m_pwndCell){
+    m_pwndCell->OnUpdateEditPaste(pCmdUI);
+  } else {
+    pCmdUI->Enable(false);
+  }
+}
+
+void CCellView::OnUpdateEditDelete(CCmdUI* pCmdUI) 
+{
+  if(m_pwndCell){
+    m_pwndCell->OnUpdateEditDelete(pCmdUI);
+  } else {
+    pCmdUI->Enable(false);
+  }
+}
+
+BOOL CCellView::OnHelpInfo(HELPINFO* pHelpInfo) 
+{
+	return CConfigTool::GetControlView()->OnHelpInfo(pHelpInfo);
+}
+
+LRESULT CCellView::OnCancelEdit(WPARAM wParam, LPARAM)
+{
+  CancelCellEdit(wParam);
+  return 0;
+}