// PropertiesView.cpp // // (c)1998-2025 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "gridsample.h" #include "PropertiesView.h" #include "GridSampleView.h" #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define ID_PROPERTY_MULTIPLESELECTION 1 #define ID_PROPERTY_PREVIEWMODE 2 #define ID_PROPERTY_GROUPBOXVISIBLE 3 #define ID_PROPERTY_FOCUSSUBITEMS 4 #define ID_PROPERTY_ALLOWCOLUMNREMOVE 5 #define ID_PROPERTY_ALLOWCOLUMNREORDER 6 #define ID_PROPERTY_ALLOWCOLUMNRESIZE 7 #define ID_PROPERTY_FLATHEADER 8 #define ID_PROPERTY_HIDESELECTION 9 #define ID_PROPERTY_TREEINDENT 10 class CRecordPropertyGroup : public CXTPGridRecord { public: CRecordPropertyGroup(CString strCaption) { AddItem(new CXTPGridRecordItemText(strCaption)); CXTPGridRecordItem* pItem = AddItem(new CXTPGridRecordItemText(_T(""))); pItem->SetEditable(FALSE); AddItem(new CXTPGridRecordItemText(_T(""))); } }; class CRecordPropertyInt : public CXTPGridRecord { public: CRecordPropertyInt(UINT nID, CString strCaption, int nValue) { AddItem(new CXTPGridRecordItemText(strCaption)); CXTPGridRecordItem* pItem = AddItem(new CXTPGridRecordItemNumber(nValue)); pItem->SetItemData(nID); AddItem(new CXTPGridRecordItemText(_T("int"))); } static int GetValue(XTP_NM_GRIDRECORDITEM* pItemNotify) { return (int)((CXTPGridRecordItemNumber*)pItemNotify->pItem)->GetValue(); } }; class CRecordPropertyBool : public CXTPGridRecord { protected: class CPropertyItemBool : public CXTPGridRecordItem { public: CPropertyItemBool(BOOL bValue) { m_bValue = bValue; GetEditOptions(NULL)->AddConstraint(_T("True"), TRUE); GetEditOptions(NULL)->AddConstraint(_T("False"), FALSE); GetEditOptions(NULL)->m_bConstraintEdit = TRUE; GetEditOptions(NULL)->AddComboButton(); } CString GetCaption(CXTPGridColumn* /*pColumn*/) { CXTPGridRecordItemConstraint* pConstraint = GetEditOptions(NULL)->FindConstraint( m_bValue); _ASSERTE(pConstraint); return pConstraint->m_strConstraint; } void OnConstraintChanged(XTP_GRIDRECORDITEM_ARGS* /*pItemArgs*/, CXTPGridRecordItemConstraint* pConstraint) { m_bValue = (BOOL)pConstraint->m_dwData; } BOOL GetValue() { return m_bValue; } protected: BOOL m_bValue; }; public: CRecordPropertyBool(UINT nID, CString strCaption, BOOL bValue) { AddItem(new CXTPGridRecordItemText(strCaption)); CXTPGridRecordItem* pItem = AddItem(new CPropertyItemBool(bValue)); pItem->SetItemData(nID); AddItem(new CXTPGridRecordItemText(_T("bool"))); } static BOOL GetValue(XTP_NM_GRIDRECORDITEM* pItemNotify) { return ((CPropertyItemBool*)pItemNotify->pItem)->GetValue(); } }; ///////////////////////////////////////////////////////////////////////////// // CPropertiesFrame CPropertiesFrame::CPropertiesFrame(CView* pOwnerView) { m_pOwnerView = pOwnerView; } CPropertiesFrame::~CPropertiesFrame() { } BEGIN_MESSAGE_MAP(CPropertiesFrame, CMiniFrameWnd) //{{AFX_MSG_MAP(CPropertiesFrame) ON_WM_CREATE() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPropertiesFrame message handlers int CPropertiesFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CMiniFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; #ifndef _XTP_INCLUDE_COMMANDBARS if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } #else if (!InitCommandBars()) return -1; CXTPCommandBars* pCommandBars = GetCommandBars(); pCommandBars->SetTheme(xtpThemeNativeWinXP); pCommandBars->GetPaintManager()->m_bAutoResizeIcons = TRUE; #endif return 0; } void CPropertiesFrame::OnDestroy() { ((CGridSampleView*)m_pOwnerView)->m_pPropertiesFrame = NULL; CMiniFrameWnd::OnDestroy(); } ///////////////////////////////////////////////////////////////////////////// // CPropertiesView IMPLEMENT_DYNCREATE(CPropertiesView, CView) CPropertiesView::CPropertiesView() { } CPropertiesView::~CPropertiesView() { } #define ID_GRID_CONTROL 100 BEGIN_MESSAGE_MAP(CPropertiesView, CView) //{{AFX_MSG_MAP(CPropertiesView) ON_WM_CREATE() ON_WM_SIZE() ON_WM_ERASEBKGND() ON_WM_SETFOCUS() //}}AFX_MSG_MAP ON_NOTIFY(XTP_NM_GRID_VALUECHANGED, ID_GRID_CONTROL, OnPropertyChanged) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPropertiesView drawing void CPropertiesView::OnDraw(CDC*) { } ///////////////////////////////////////////////////////////////////////////// // CPropertiesView diagnostics #ifdef _DEBUG void CPropertiesView::AssertValid() const { CView::AssertValid(); } void CPropertiesView::Dump(CDumpContext& dc) const { CView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CPropertiesView message handlers CXTPGridControl* CPropertiesView::GetTargetGrid() { CView* pView = ((CPropertiesFrame*)GetParent())->m_pOwnerView; return &((CGridSampleView*)pView)->GetGridCtrl(); } int CPropertiesView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndGrid.Create(WS_CHILD | WS_TABSTOP | WS_VISIBLE | WM_VSCROLL, CRect(0, 0, 0, 0), this, ID_GRID_CONTROL)) { TRACE(_T("Failed to create view window\n")); return -1; } m_wndGrid.GetGridHeader()->AllowColumnRemove(FALSE); CXTPGridColumn* pColumn = m_wndGrid.AddColumn(new CXTPGridColumn(0, _T("Name"), 200)); pColumn->SetTreeColumn(TRUE); pColumn->SetEditable(FALSE); m_wndGrid.AddColumn(new CXTPGridColumn(1, _T("Value"), 150)); pColumn = m_wndGrid.AddColumn(new CXTPGridColumn(2, _T("Type"), 100)); pColumn->SetEditable(FALSE); CXTPGridRecord* pRecordControl = m_wndGrid.AddRecord( new CRecordPropertyGroup(_T("Grid Control"))); pRecordControl->SetExpanded(TRUE); CXTPGridControl* pTargetGrid = GetTargetGrid(); pRecordControl->GetChilds()->Add(new CRecordPropertyBool(ID_PROPERTY_MULTIPLESELECTION, _T("Multiple Selection"), pTargetGrid->IsMultipleSelection())); pRecordControl->GetChilds()->Add(new CRecordPropertyBool(ID_PROPERTY_PREVIEWMODE, _T("Preview Mode"), pTargetGrid->IsPreviewMode())); pRecordControl->GetChilds()->Add(new CRecordPropertyBool(ID_PROPERTY_GROUPBOXVISIBLE, _T("Group Box Visible"), pTargetGrid->IsGroupByVisible())); pRecordControl->GetChilds()->Add(new CRecordPropertyBool(ID_PROPERTY_FOCUSSUBITEMS, _T("Focus Sub Items"), pTargetGrid->IsFocusSubItems())); CXTPGridRecord* pRecordHeader = pRecordControl->GetChilds()->Add( new CRecordPropertyGroup(_T("Grid Header"))); pRecordHeader->GetChilds()->Add( new CRecordPropertyBool(ID_PROPERTY_ALLOWCOLUMNREMOVE, _T("Allow Column Remove"), pTargetGrid->GetGridHeader()->IsAllowColumnRemove())); pRecordHeader->GetChilds()->Add( new CRecordPropertyBool(ID_PROPERTY_ALLOWCOLUMNREORDER, _T("Allow Column Reorder"), pTargetGrid->GetGridHeader()->IsAllowColumnReorder())); pRecordHeader->GetChilds()->Add( new CRecordPropertyBool(ID_PROPERTY_ALLOWCOLUMNRESIZE, _T("Allow Column Resize"), pTargetGrid->GetGridHeader()->IsAllowColumnResize())); CXTPGridRecord* pRecordPaintManager = pRecordControl->GetChilds()->Add( new CRecordPropertyGroup(_T("Grid Paint Manager"))); pRecordPaintManager->GetChilds()->Add( new CRecordPropertyBool(ID_PROPERTY_FLATHEADER, _T("Flat Header"), pTargetGrid->GetPaintManager()->GetColumnStyle() == xtpGridColumnFlat)); pRecordPaintManager->GetChilds()->Add( new CRecordPropertyBool(ID_PROPERTY_HIDESELECTION, _T("Hide Selection"), pTargetGrid->GetPaintManager()->m_bHideSelection)); pRecordPaintManager->GetChilds()->Add( new CRecordPropertyInt(ID_PROPERTY_TREEINDENT, _T("Tree Indent"), pTargetGrid->GetPaintManager()->m_nTreeIndent)); m_wndGrid.GetPaintManager()->SetColumnStyle(xtpGridColumnFlat); m_wndGrid.AllowEdit(TRUE); m_wndGrid.EditOnClick(FALSE); m_wndGrid.SetMultipleSelection(FALSE); m_wndGrid.SetTreeIndent(10); m_wndGrid.GetGridHeader()->AllowColumnSort(FALSE); m_wndGrid.Populate(); return 0; } void CPropertiesView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); if (m_wndGrid.GetSafeHwnd()) { m_wndGrid.MoveWindow(0, 0, cx, cy); } } BOOL CPropertiesView::OnEraseBkgnd(CDC* /*pDC*/) { return TRUE; } void CPropertiesView::OnSetFocus(CWnd* pOldWnd) { CView::OnSetFocus(pOldWnd); m_wndGrid.SetFocus(); } void CPropertiesView::OnPropertyChanged(NMHDR* pNotifyStruct, LRESULT* /*result*/) { XTP_NM_GRIDRECORDITEM* pItemNotify = (XTP_NM_GRIDRECORDITEM*)pNotifyStruct; switch (pItemNotify->pItem->GetItemData()) { case ID_PROPERTY_MULTIPLESELECTION: GetTargetGrid()->SetMultipleSelection(CRecordPropertyBool::GetValue(pItemNotify)); break; case ID_PROPERTY_PREVIEWMODE: GetTargetGrid()->EnablePreviewMode(CRecordPropertyBool::GetValue(pItemNotify)); GetTargetGrid()->Populate(); break; case ID_PROPERTY_GROUPBOXVISIBLE: GetTargetGrid()->ShowGroupBy(CRecordPropertyBool::GetValue(pItemNotify)); break; case ID_PROPERTY_FOCUSSUBITEMS: GetTargetGrid()->FocusSubItems(CRecordPropertyBool::GetValue(pItemNotify)); break; case ID_PROPERTY_ALLOWCOLUMNREMOVE: GetTargetGrid()->GetGridHeader()->AllowColumnRemove( CRecordPropertyBool::GetValue(pItemNotify)); break; case ID_PROPERTY_ALLOWCOLUMNREORDER: GetTargetGrid()->GetGridHeader()->AllowColumnReorder( CRecordPropertyBool::GetValue(pItemNotify)); break; case ID_PROPERTY_ALLOWCOLUMNRESIZE: GetTargetGrid()->GetGridHeader()->AllowColumnResize( CRecordPropertyBool::GetValue(pItemNotify)); break; case ID_PROPERTY_FLATHEADER: GetTargetGrid()->GetPaintManager()->SetColumnStyle( (CRecordPropertyBool::GetValue(pItemNotify)) ? xtpGridColumnFlat : xtpGridColumnShaded); break; case ID_PROPERTY_HIDESELECTION: GetTargetGrid()->GetPaintManager()->m_bHideSelection = (CRecordPropertyBool::GetValue( pItemNotify)); break; case ID_PROPERTY_TREEINDENT: GetTargetGrid()->GetPaintManager()->m_nTreeIndent = CRecordPropertyInt::GetValue( pItemNotify); GetTargetGrid()->RedrawControl(); break; } }