]> git.saurik.com Git - wxWidgets.git/blobdiff - src/propgrid/manager.cpp
Added ability to switch off more components of the size page UI
[wxWidgets.git] / src / propgrid / manager.cpp
index 0b148c403eab3cce35a26da4ecd73f128a538e7b..788af596d357ba10a09435e01ff49df440a596f3 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     2005-01-14
 // RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
 // Created:     2005-01-14
 // RCS-ID:      $Id$
 // Copyright:   (c) Jaakko Salli
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx/wx.h".
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx/wx.h".
@@ -346,7 +346,7 @@ private:
 
     virtual bool ProcessEvent( wxEvent& event )
     {
 
     virtual bool ProcessEvent( wxEvent& event )
     {
-        if ( event.IsKindOf(CLASSINFO(wxHeaderCtrlEvent)) )
+        if ( event.IsKindOf(wxCLASSINFO(wxHeaderCtrlEvent)) )
         {
             wxHeaderCtrlEvent& hcEvent =
                 static_cast<wxHeaderCtrlEvent&>(event);
         {
             wxHeaderCtrlEvent& hcEvent =
                 static_cast<wxHeaderCtrlEvent&>(event);
@@ -411,12 +411,6 @@ private:
 
 IMPLEMENT_CLASS(wxPropertyGridManager, wxPanel)
 
 
 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)
 // -----------------------------------------------------------------------
 
 BEGIN_EVENT_TABLE(wxPropertyGridManager, wxPanel)
@@ -508,6 +502,9 @@ void wxPropertyGridManager::Init1()
 
     m_nextDescBoxSize = -1;
 
 
     m_nextDescBoxSize = -1;
 
+    m_categorizedModeToolId = -1;
+    m_alphabeticModeToolId = -1;
+
     m_extraHeight = 0;
     m_dragStatus = 0;
     m_onSplitter = 0;
     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;
 
     if ( baseId < 0 )
         baseId = wxPG_MAN_ALTERNATE_BASE_ID;
 
-    m_baseId = baseId;
-
 #ifdef __WXMAC__
    // Smaller controls on Mac
    SetWindowVariant(wxWINDOW_VARIANT_SMALL);
 #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_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).
     // 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));
 
             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;
 
     // Optional initial controls.
     m_width = -12345;
 
@@ -623,8 +610,7 @@ wxPropertyGridManager::~wxPropertyGridManager()
     END_MOUSE_CAPTURE
 
     //m_pPropGrid->ClearSelection();
     END_MOUSE_CAPTURE
 
     //m_pPropGrid->ClearSelection();
-    delete m_pPropGrid;
-    m_pPropGrid = NULL;
+    wxDELETE(m_pPropGrid);
 
     size_t i;
     for ( i=0; i<m_arrPages.size(); i++ )
 
     size_t i;
     for ( i=0; i<m_arrPages.size(); i++ )
@@ -759,12 +745,14 @@ bool wxPropertyGridManager::DoSelectPage( int index )
             return false;
     }
 
             return false;
     }
 
+#if wxUSE_TOOLBAR
     wxPropertyGridPage* prevPage;
 
     if ( m_selPage >= 0 )
         prevPage = GetPage(m_selPage);
     else
         prevPage = m_emptyPage;
     wxPropertyGridPage* prevPage;
 
     if ( m_selPage >= 0 )
         prevPage = GetPage(m_selPage);
     else
         prevPage = m_emptyPage;
+#endif
 
     wxPropertyGridPage* nextPage;
 
 
     wxPropertyGridPage* nextPage;
 
@@ -797,9 +785,9 @@ bool wxPropertyGridManager::DoSelectPage( int index )
     if ( m_pToolbar )
     {
         if ( index >= 0 )
     if ( m_pToolbar )
     {
         if ( index >= 0 )
-            m_pToolbar->ToggleTool( nextPage->m_id, true );
+            m_pToolbar->ToggleTool( nextPage->m_toolId, true );
         else
         else
-            m_pToolbar->ToggleTool( prevPage->m_id, false );
+            m_pToolbar->ToggleTool( prevPage->m_toolId, false );
     }
 #endif
 
     }
 #endif
 
@@ -882,9 +870,6 @@ void wxPropertyGridManager::Clear()
     for ( i=(int)GetPageCount()-1; i>=0; i-- )
         RemovePage(i);
 
     for ( i=(int)GetPageCount()-1; i>=0; i-- )
         RemovePage(i);
 
-    // Reset toolbar ids
-    m_nextTbInd = m_baseId+ID_ADVTBITEMSBASE_OFFSET + 2;
-
     m_pPropGrid->Thaw();
 }
 
     m_pPropGrid->Thaw();
 }
 
@@ -1003,14 +988,14 @@ wxPropertyGridPage* wxPropertyGridManager::InsertPage( int index,
         state->InitNonCatMode();
     }
 
         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;
     }
 
     {
         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;
 
     if ( !HasFlag(wxPG_SPLITTER_AUTO_CENTER) )
         pageObj->m_dontCenterSplitter = true;
@@ -1033,14 +1018,23 @@ wxPropertyGridPage* wxPropertyGridManager::InsertPage( int index,
                  m_pToolbar->GetToolsCount() < 3 )
                 m_pToolbar->AddSeparator();
 
                  m_pToolbar->GetToolsCount() < 3 )
                 m_pToolbar->AddSeparator();
 
+            wxToolBarToolBase* tool;
+
             if ( &bmp != &wxNullBitmap )
             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
             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_COMMAND_TOOL_CLICKED,
+                    wxCommandEventHandler(
+                        wxPropertyGridManager::OnToolbarClick));
 
             m_pToolbar->Realize();
         }
 
             m_pToolbar->Realize();
         }
@@ -1462,10 +1456,6 @@ void wxPropertyGridManager::RecreateControls()
     if ( was_shown )
         Show ( false );
 
     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 )
     {
 #if wxUSE_TOOLBAR
     if ( m_windowStyle & wxPG_TOOLBAR )
     {
@@ -1476,8 +1466,9 @@ void wxPropertyGridManager::RecreateControls()
             if (GetExtraStyle() & wxPG_EX_NO_TOOLBAR_DIVIDER)
                 toolBarFlags |= wxTB_NODIVIDER;
 
             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));
 
                                        toolBarFlags);
             m_pToolbar->SetToolBitmapSize(wxSize(16, 15));
 
@@ -1504,32 +1495,62 @@ void wxPropertyGridManager::RecreateControls()
             {
                 wxString desc1(_("Categorized Mode"));
                 wxString desc2(_("Alphabetic Mode"));
             {
                 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();
                 m_pToolbar->Realize();
+
+                Connect(m_categorizedModeToolId,
+                        wxEVT_COMMAND_TOOL_CLICKED,
+                        wxCommandEventHandler(
+                            wxPropertyGridManager::OnToolbarClick));
+                Connect(m_alphabeticModeToolId,
+                        wxEVT_COMMAND_TOOL_CLICKED,
+                        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).
         {
             // 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() )
             {
             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);
         }
 
     }
         }
 
     }
@@ -1550,7 +1571,7 @@ void wxPropertyGridManager::RecreateControls()
         if ( !m_pHeaderCtrl )
         {
             hc = new wxPGHeaderCtrl(this);
         if ( !m_pHeaderCtrl )
         {
             hc = new wxPGHeaderCtrl(this);
-            hc->Create(this, baseId+ID_ADVHEADERCTRL_OFFSET);
+            hc->Create(this, wxID_ANY);
             m_pHeaderCtrl = hc;
         }
         else
             m_pHeaderCtrl = hc;
         }
         else
@@ -1575,7 +1596,7 @@ void wxPropertyGridManager::RecreateControls()
         if ( !m_pTxtHelpCaption )
         {
             m_pTxtHelpCaption = new wxStaticText(this,
         if ( !m_pTxtHelpCaption )
         {
             m_pTxtHelpCaption = new wxStaticText(this,
-                                                 baseId+ID_ADVHELPCAPTION_OFFSET,
+                                                 wxID_ANY,
                                                  wxT(""),
                                                  wxDefaultPosition,
                                                  wxDefaultSize,
                                                  wxT(""),
                                                  wxDefaultPosition,
                                                  wxDefaultSize,
@@ -1586,7 +1607,7 @@ void wxPropertyGridManager::RecreateControls()
         if ( !m_pTxtHelpContent )
         {
             m_pTxtHelpContent = new wxStaticText(this,
         if ( !m_pTxtHelpContent )
         {
             m_pTxtHelpContent = new wxStaticText(this,
-                                                 baseId+ID_ADVHELPCONTENT_OFFSET,
+                                                 wxID_ANY,
                                                  wxT(""),
                                                  wxDefaultPosition,
                                                  wxDefaultSize,
                                                  wxT(""),
                                                  wxDefaultPosition,
                                                  wxDefaultSize,
@@ -1659,69 +1680,60 @@ bool wxPropertyGridManager::EnsureVisible( wxPGPropArg id )
 void wxPropertyGridManager::OnToolbarClick( wxCommandEvent &event )
 {
     int id = event.GetId();
 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; i<GetPageCount(); i++ )
+        // Find page with given id.
+        for ( i=0; i<GetPageCount(); i++ )
+        {
+            pdc = m_arrPages[i];
+            if ( pdc->m_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.
         }
     }
 }
         }
     }
 }
@@ -1811,7 +1823,7 @@ void wxPropertyGridManager::SetSplitterLeft( bool subProps, bool allPages )
         }
 
         if ( highest > 0 )
         }
 
         if ( highest > 0 )
-            m_pPropGrid->SetSplitterPosition( highest );
+            SetSplitterPosition( highest );
     }
 
 #if wxUSE_HEADERCTRL
     }
 
 #if wxUSE_HEADERCTRL
@@ -1820,6 +1832,27 @@ void wxPropertyGridManager::SetSplitterLeft( bool subProps, bool allPages )
 #endif
 }
 
 #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 )
 // -----------------------------------------------------------------------
 
 void wxPropertyGridManager::OnPropertyGridSelect( wxPropertyGridEvent& event )
@@ -1875,6 +1908,11 @@ void wxPropertyGridManager::OnResize( wxSizeEvent& WXUNUSED(event) )
             }
         }
     }
             }
         }
     }
+
+#if wxUSE_HEADERCTRL
+    if ( m_showHeader )
+        m_pHeaderCtrl->OnColumWidthsChanged();
+#endif
 }
 
 // -----------------------------------------------------------------------
 }
 
 // -----------------------------------------------------------------------
@@ -1972,7 +2010,7 @@ void wxPropertyGridManager::OnMouseClick( wxMouseEvent &event )
 
 void wxPropertyGridManager::OnMouseUp( 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 )
     // just stop dragging.
 
     if ( m_dragStatus >= 1 )