// PropertiesPanel.cpp : implementation file // #include "stdafx.h" #include "PropertiesPanel.h" #include "Objects\\BaseObject.h" #include "Objects\\SelectionGroup.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define HEIGHT_OFFSET 4 #define HEIGHT_ADD 4 ///////////////////////////////////////////////////////////////////////////// // CPropertiesPanel dialog CPropertiesPanel::CPropertiesPanel( CWnd* pParent /*=NULL*/) : CDialog(CPropertiesPanel::IDD, pParent) { //{{AFX_DATA_INIT(CPropertiesPanel) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_multiSelect = false; Create( IDD,pParent ); } void CPropertiesPanel::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPropertiesPanel) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPropertiesPanel, CDialog) //{{AFX_MSG_MAP(CPropertiesPanel) ON_WM_DESTROY() ON_WM_KILLFOCUS() ON_WM_SIZE() //}}AFX_MSG_MAP ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPropertiesPanel message handlers BOOL CPropertiesPanel::OnInitDialog() { CDialog::OnInitDialog(); CRect rc; GetClientRect(rc); m_wndProps.Create( WS_CHILD|WS_VISIBLE,rc,this ); m_wndProps.ModifyStyleEx( 0,WS_EX_CLIENTEDGE ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPropertiesPanel::SetMultiSelect( bool bEnable ) { m_multiSelect = bEnable; if (m_wndProps.m_hWnd) { m_wndProps.SetDisplayOnlyModified( bEnable ); } } ////////////////////////////////////////////////////////////////////////// void CPropertiesPanel::DeleteVars() { if (!m_wndProps.m_hWnd) return; m_wndProps.DeleteAllItems(); m_updateCallbacks.clear(); m_varBlock = 0; } ////////////////////////////////////////////////////////////////////////// void CPropertiesPanel::AddVars( CVarBlock *vb,const UpdateCallback &updCallback ) { assert(vb); if (!m_wndProps.m_hWnd) return; //m_wndProps.DeleteAllItems(); bool bNewBlock = false; // Make a clone of properties. if (!m_varBlock) { // Must first clear any selection in properties window. m_wndProps.ClearSelection(); m_wndProps.DeleteAllItems(); m_varBlock = vb->Clone(true); m_wndProps.AddVarBlock( m_varBlock ); bNewBlock = true; } m_varBlock->Wire( vb ); //CVarBlock *propVB = m_varBlock->Clone(true); //propVB->Wire( m_varBlock ); //m_wndProps.AddVarBlock( propVB ); if (bNewBlock) { m_wndProps.SetUpdateCallback( functor(*this,&CPropertiesPanel::OnPropertyChanged) ); m_wndProps.ExpandAll(); // Resize to fit properties. CRect rc; GetClientRect( rc ); int h = m_wndProps.GetVisibleHeight() + HEIGHT_ADD; if (h > 400) h = 400; SetWindowPos( NULL,0,0,rc.right,h+HEIGHT_OFFSET*2+4,SWP_NOMOVE ); m_multiSelect = false; m_wndProps.SetDisplayOnlyModified( false ); // When new object set all previous callbacks freed. m_updateCallbacks.clear(); } else { m_multiSelect = true; m_wndProps.SetDisplayOnlyModified( true ); } if (updCallback) stl::push_back_unique( m_updateCallbacks,updCallback ); } void CPropertiesPanel::ReloadValues() { if (m_wndProps.m_hWnd) { m_wndProps.ReloadValues(); } } void CPropertiesPanel::OnDestroy() { CDialog::OnDestroy(); } void CPropertiesPanel::OnKillFocus(CWnd* pNewWnd) { CDialog::OnKillFocus(pNewWnd); } void CPropertiesPanel::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if (m_wndProps.m_hWnd) { int h = m_wndProps.GetVisibleHeight() + HEIGHT_ADD; CRect rc( 2,HEIGHT_OFFSET,cx-2,cy - HEIGHT_OFFSET*2 + 4 ); m_wndProps.MoveWindow( rc,TRUE ); } } ////////////////////////////////////////////////////////////////////////// void CPropertiesPanel::OnPropertyChanged( XmlNodeRef node ) { std::list::iterator iter; for (iter = m_updateCallbacks.begin(); iter != m_updateCallbacks.end(); ++iter) { (*iter)(); } } void CPropertiesPanel::OnLButtonDown(UINT nFlags, CPoint point) { //ReloadValues(); CDialog::OnLButtonDown(nFlags, point); }