X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/526954c5968baa29218c994ec48e476ae2bd4b9f..ad653fa23069c5d9378247084f03c9a718c3ad62:/src/propgrid/manager.cpp diff --git a/src/propgrid/manager.cpp b/src/propgrid/manager.cpp index 30c3f21e8b..99d6e145fc 100644 --- a/src/propgrid/manager.cpp +++ b/src/propgrid/manager.cpp @@ -346,7 +346,7 @@ private: virtual bool ProcessEvent( wxEvent& event ) { - if ( event.IsKindOf(CLASSINFO(wxHeaderCtrlEvent)) ) + if ( event.IsKindOf(wxCLASSINFO(wxHeaderCtrlEvent)) ) { wxHeaderCtrlEvent& hcEvent = static_cast(event); @@ -355,7 +355,7 @@ private: int col = hcEvent.GetColumn(); int evtType = event.GetEventType(); - if ( evtType == wxEVT_COMMAND_HEADER_RESIZING ) + if ( evtType == wxEVT_HEADER_RESIZING ) { int colWidth = hcEvent.GetWidth(); @@ -367,7 +367,7 @@ private: return true; } - else if ( evtType == wxEVT_COMMAND_HEADER_BEGIN_RESIZE ) + else if ( evtType == wxEVT_HEADER_BEGIN_RESIZE ) { // Never allow column resize if layout is static if ( m_manager->HasFlag(wxPG_STATIC_SPLITTER) ) @@ -380,7 +380,7 @@ private: return true; } - else if ( evtType == wxEVT_COMMAND_HEADER_END_RESIZE ) + else if ( evtType == wxEVT_HEADER_END_RESIZE ) { pg->SendEvent(wxEVT_PG_COL_END_DRAG, NULL, NULL, 0, @@ -411,12 +411,6 @@ private: IMPLEMENT_CLASS(wxPropertyGridManager, wxPanel) -#define ID_ADVTOOLBAR_OFFSET 1 -#define ID_ADVHELPCAPTION_OFFSET 2 -#define ID_ADVHELPCONTENT_OFFSET 3 -#define ID_ADVHEADERCTRL_OFFSET 4 -#define ID_ADVTBITEMSBASE_OFFSET 5 // Must be last. - // ----------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxPropertyGridManager, wxPanel) @@ -508,6 +502,9 @@ void wxPropertyGridManager::Init1() m_nextDescBoxSize = -1; + m_categorizedModeToolId = -1; + m_alphabeticModeToolId = -1; + m_extraHeight = 0; m_dragStatus = 0; m_onSplitter = 0; @@ -555,8 +552,6 @@ void wxPropertyGridManager::Init2( int style ) if ( baseId < 0 ) baseId = wxPG_MAN_ALTERNATE_BASE_ID; - m_baseId = baseId; - #ifdef __WXMAC__ // Smaller controls on Mac SetWindowVariant(wxWINDOW_VARIANT_SMALL); @@ -590,9 +585,6 @@ void wxPropertyGridManager::Init2( int style ) m_pPropGrid->SetExtraStyle(wxPG_EX_INIT_NOCAT); - m_nextTbInd = baseId+ID_ADVTBITEMSBASE_OFFSET + 2; - - // Connect to property grid onselect event. // NB: Even if wxID_ANY is used, this doesn't connect properly in wxPython // (see wxPropertyGridManager::ProcessEvent). @@ -604,11 +596,6 @@ void wxPropertyGridManager::Init2( int style ) wxEVT_PG_COL_DRAGGING, wxPropertyGridEventHandler(wxPropertyGridManager::OnPGColDrag)); - // Connect to toolbar button events. - Connect(baseId+ID_ADVTBITEMSBASE_OFFSET,baseId+ID_ADVTBITEMSBASE_OFFSET+50, - wxEVT_COMMAND_TOOL_CLICKED, - wxCommandEventHandler(wxPropertyGridManager::OnToolbarClick) ); - // Optional initial controls. m_width = -12345; @@ -758,12 +745,14 @@ bool wxPropertyGridManager::DoSelectPage( int index ) return false; } +#if wxUSE_TOOLBAR wxPropertyGridPage* prevPage; if ( m_selPage >= 0 ) prevPage = GetPage(m_selPage); else prevPage = m_emptyPage; +#endif wxPropertyGridPage* nextPage; @@ -796,9 +785,9 @@ bool wxPropertyGridManager::DoSelectPage( int index ) if ( m_pToolbar ) { if ( index >= 0 ) - m_pToolbar->ToggleTool( nextPage->m_id, true ); + m_pToolbar->ToggleTool( nextPage->m_toolId, true ); else - m_pToolbar->ToggleTool( prevPage->m_id, false ); + m_pToolbar->ToggleTool( prevPage->m_toolId, false ); } #endif @@ -881,9 +870,6 @@ void wxPropertyGridManager::Clear() for ( i=(int)GetPageCount()-1; i>=0; i-- ) RemovePage(i); - // Reset toolbar ids - m_nextTbInd = m_baseId+ID_ADVTBITEMSBASE_OFFSET + 2; - m_pPropGrid->Thaw(); } @@ -1002,14 +988,14 @@ wxPropertyGridPage* wxPropertyGridManager::InsertPage( int index, state->InitNonCatMode(); } - if ( label.length() ) + if ( !label.empty() ) { wxASSERT_MSG( !pageObj->m_label.length(), wxT("If page label is given in constructor, empty label must be given in AddPage")); pageObj->m_label = label; } - pageObj->m_id = m_nextTbInd; + pageObj->m_toolId = -1; if ( !HasFlag(wxPG_SPLITTER_AUTO_CENTER) ) pageObj->m_dontCenterSplitter = true; @@ -1032,14 +1018,23 @@ wxPropertyGridPage* wxPropertyGridManager::InsertPage( int index, m_pToolbar->GetToolsCount() < 3 ) m_pToolbar->AddSeparator(); + wxToolBarToolBase* tool; + if ( &bmp != &wxNullBitmap ) - m_pToolbar->AddTool(m_nextTbInd,label,bmp,label,wxITEM_RADIO); - //m_pToolbar->InsertTool(index+3,m_nextTbInd,bmp); + tool = m_pToolbar->AddTool(wxID_ANY, label, bmp, + label, wxITEM_RADIO); else - m_pToolbar->AddTool(m_nextTbInd,label,wxBitmap(gs_xpm_defpage), - label,wxITEM_RADIO); + tool = m_pToolbar->AddTool(wxID_ANY, label, + wxBitmap(gs_xpm_defpage), + label, wxITEM_RADIO); + + pageObj->m_toolId = tool->GetId(); - m_nextTbInd++; + // Connect to toolbar button events. + Connect(pageObj->m_toolId, + wxEVT_TOOL, + wxCommandEventHandler( + wxPropertyGridManager::OnToolbarClick)); m_pToolbar->Realize(); } @@ -1461,10 +1456,6 @@ void wxPropertyGridManager::RecreateControls() if ( was_shown ) Show ( false ); - wxWindowID baseId = m_pPropGrid->GetId(); - if ( baseId < 0 ) - baseId = wxPG_MAN_ALTERNATE_BASE_ID; - #if wxUSE_TOOLBAR if ( m_windowStyle & wxPG_TOOLBAR ) { @@ -1475,8 +1466,9 @@ void wxPropertyGridManager::RecreateControls() if (GetExtraStyle() & wxPG_EX_NO_TOOLBAR_DIVIDER) toolBarFlags |= wxTB_NODIVIDER; - m_pToolbar = new wxToolBar(this,baseId+ID_ADVTOOLBAR_OFFSET, - wxDefaultPosition,wxDefaultSize, + m_pToolbar = new wxToolBar(this, wxID_ANY, + wxDefaultPosition, + wxDefaultSize, toolBarFlags); m_pToolbar->SetToolBitmapSize(wxSize(16, 15)); @@ -1503,32 +1495,62 @@ void wxPropertyGridManager::RecreateControls() { wxString desc1(_("Categorized Mode")); wxString desc2(_("Alphabetic Mode")); - m_pToolbar->AddTool(baseId+ID_ADVTBITEMSBASE_OFFSET+0, - desc1,wxBitmap (gs_xpm_catmode), - desc1,wxITEM_RADIO); - m_pToolbar->AddTool(baseId+ID_ADVTBITEMSBASE_OFFSET+1, - desc2,wxBitmap (gs_xpm_noncatmode), - desc2,wxITEM_RADIO); + + wxToolBarToolBase* tool; + + tool = m_pToolbar->AddTool(wxID_ANY, + desc1, + wxBitmap(gs_xpm_catmode), + desc1, + wxITEM_RADIO); + m_categorizedModeToolId = tool->GetId(); + + tool = m_pToolbar->AddTool(wxID_ANY, + desc2, + wxBitmap(gs_xpm_noncatmode), + desc2, + wxITEM_RADIO); + m_alphabeticModeToolId = tool->GetId(); + m_pToolbar->Realize(); + + Connect(m_categorizedModeToolId, + wxEVT_TOOL, + wxCommandEventHandler( + wxPropertyGridManager::OnToolbarClick)); + Connect(m_alphabeticModeToolId, + wxEVT_TOOL, + wxCommandEventHandler( + wxPropertyGridManager::OnToolbarClick)); + } + else + { + m_categorizedModeToolId = -1; + m_alphabeticModeToolId = -1; } } - if ( (GetExtraStyle()&wxPG_EX_MODE_BUTTONS) ) + if ( (GetExtraStyle() & wxPG_EX_MODE_BUTTONS) ) { // Toggle correct mode button. // TODO: This doesn't work in wxMSW (when changing, // both items will get toggled). - int toggle_but_on_ind = ID_ADVTBITEMSBASE_OFFSET+0; - int toggle_but_off_ind = ID_ADVTBITEMSBASE_OFFSET+1; + int toggle_but_on_ind; + int toggle_but_off_ind; if ( m_pPropGrid->m_pState->IsInNonCatMode() ) { - toggle_but_on_ind++; - toggle_but_off_ind--; + toggle_but_on_ind = m_alphabeticModeToolId; + toggle_but_off_ind = m_categorizedModeToolId; + } + else + { + toggle_but_on_ind = m_categorizedModeToolId; + toggle_but_off_ind = m_alphabeticModeToolId; } - m_pToolbar->ToggleTool(baseId+toggle_but_on_ind,true); - m_pToolbar->ToggleTool(baseId+toggle_but_off_ind,false); + m_pToolbar->ToggleTool(toggle_but_on_ind, true); + m_pToolbar->ToggleTool(toggle_but_off_ind, false); } } @@ -1549,7 +1571,7 @@ void wxPropertyGridManager::RecreateControls() if ( !m_pHeaderCtrl ) { hc = new wxPGHeaderCtrl(this); - hc->Create(this, baseId+ID_ADVHEADERCTRL_OFFSET); + hc->Create(this, wxID_ANY); m_pHeaderCtrl = hc; } else @@ -1574,7 +1596,7 @@ void wxPropertyGridManager::RecreateControls() if ( !m_pTxtHelpCaption ) { m_pTxtHelpCaption = new wxStaticText(this, - baseId+ID_ADVHELPCAPTION_OFFSET, + wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, @@ -1585,7 +1607,7 @@ void wxPropertyGridManager::RecreateControls() if ( !m_pTxtHelpContent ) { m_pTxtHelpContent = new wxStaticText(this, - baseId+ID_ADVHELPCONTENT_OFFSET, + wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, @@ -1658,69 +1680,60 @@ bool wxPropertyGridManager::EnsureVisible( wxPGPropArg id ) void wxPropertyGridManager::OnToolbarClick( wxCommandEvent &event ) { int id = event.GetId(); - if ( id >= 0 ) - { - int baseId = m_pPropGrid->GetId(); - if ( baseId < 0 ) - baseId = wxPG_MAN_ALTERNATE_BASE_ID; - if ( id == ( baseId + ID_ADVTBITEMSBASE_OFFSET + 0 ) ) + if ( id == m_categorizedModeToolId ) + { + // Categorized mode. + if ( m_pPropGrid->m_windowStyle & wxPG_HIDE_CATEGORIES ) { - // Categorized mode. - if ( m_pPropGrid->m_windowStyle & wxPG_HIDE_CATEGORIES ) - { - if ( !m_pPropGrid->HasInternalFlag(wxPG_FL_CATMODE_AUTO_SORT) ) - m_pPropGrid->m_windowStyle &= ~wxPG_AUTO_SORT; - m_pPropGrid->EnableCategories( true ); - } + if ( !m_pPropGrid->HasInternalFlag(wxPG_FL_CATMODE_AUTO_SORT) ) + m_pPropGrid->m_windowStyle &= ~wxPG_AUTO_SORT; + m_pPropGrid->EnableCategories( true ); } - else if ( id == ( baseId + ID_ADVTBITEMSBASE_OFFSET + 1 ) ) + } + else if ( id == m_alphabeticModeToolId ) + { + // Alphabetic mode. + if ( !(m_pPropGrid->m_windowStyle & wxPG_HIDE_CATEGORIES) ) { - // Alphabetic mode. - if ( !(m_pPropGrid->m_windowStyle & wxPG_HIDE_CATEGORIES) ) - { - if ( m_pPropGrid->HasFlag(wxPG_AUTO_SORT) ) - m_pPropGrid->SetInternalFlag(wxPG_FL_CATMODE_AUTO_SORT); - else - m_pPropGrid->ClearInternalFlag(wxPG_FL_CATMODE_AUTO_SORT); + if ( m_pPropGrid->HasFlag(wxPG_AUTO_SORT) ) + m_pPropGrid->SetInternalFlag(wxPG_FL_CATMODE_AUTO_SORT); + else + m_pPropGrid->ClearInternalFlag(wxPG_FL_CATMODE_AUTO_SORT); - m_pPropGrid->m_windowStyle |= wxPG_AUTO_SORT; - m_pPropGrid->EnableCategories( false ); - } + m_pPropGrid->m_windowStyle |= wxPG_AUTO_SORT; + m_pPropGrid->EnableCategories( false ); } - else - { - // Page Switching. + } + else + { + // Page Switching. - int index = -1; - size_t i; - wxPropertyGridPage* pdc; + int index = -1; + size_t i; + wxPropertyGridPage* pdc; - // Find page with given id. - for ( i=0; im_toolId == id ) { - pdc = m_arrPages[i]; - if ( pdc->m_id == id ) - { - index = i; - break; - } + index = i; + break; } + } - wxASSERT( index >= 0 ); - - if ( DoSelectPage( index ) ) - { - - // Event dispatching must be last. - m_pPropGrid->SendEvent( wxEVT_PG_PAGE_CHANGED, NULL ); - - } - else - { - // TODO: Depress the old button on toolbar. - } + wxASSERT( index >= 0 ); + if ( DoSelectPage( index ) ) + { + // Event dispatching must be last. + m_pPropGrid->SendEvent( wxEVT_PG_PAGE_CHANGED, NULL ); + } + else + { + // TODO: Depress the old button on toolbar. } } } @@ -1810,7 +1823,7 @@ void wxPropertyGridManager::SetSplitterLeft( bool subProps, bool allPages ) } if ( highest > 0 ) - m_pPropGrid->SetSplitterPosition( highest ); + SetSplitterPosition( highest ); } #if wxUSE_HEADERCTRL @@ -1819,6 +1832,27 @@ void wxPropertyGridManager::SetSplitterLeft( bool subProps, bool allPages ) #endif } +void wxPropertyGridManager::SetPageSplitterLeft(int page, bool subProps) +{ + wxASSERT_MSG( (page < (int) GetPageCount()), + wxT("SetPageSplitterLeft() has no effect until pages have been added") ); + + if (page < (int) GetPageCount()) + { + wxClientDC dc(this); + dc.SetFont(m_pPropGrid->GetFont()); + + int maxW = m_pState->GetColumnFitWidth(dc, m_arrPages[page]->m_properties, 0, subProps ); + maxW += m_pPropGrid->m_marginWidth; + SetPageSplitterPosition( page, maxW ); + +#if wxUSE_HEADERCTRL + if ( m_showHeader ) + m_pHeaderCtrl->OnColumWidthsChanged(); +#endif + } +} + // ----------------------------------------------------------------------- void wxPropertyGridManager::OnPropertyGridSelect( wxPropertyGridEvent& event ) @@ -1874,6 +1908,11 @@ void wxPropertyGridManager::OnResize( wxSizeEvent& WXUNUSED(event) ) } } } + +#if wxUSE_HEADERCTRL + if ( m_showHeader ) + m_pHeaderCtrl->OnColumWidthsChanged(); +#endif } // ----------------------------------------------------------------------- @@ -1971,7 +2010,7 @@ void wxPropertyGridManager::OnMouseClick( wxMouseEvent &event ) void wxPropertyGridManager::OnMouseUp( wxMouseEvent &event ) { - // No event type check - basicly calling this method should + // No event type check - basically calling this method should // just stop dragging. if ( m_dragStatus >= 1 )