]> git.saurik.com Git - wxWidgets.git/commitdiff
store ids of sub-items directly in wxSubwindows instead of using a parallel data...
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 7 Jan 2008 01:54:33 +0000 (01:54 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 7 Jan 2008 01:54:33 +0000 (01:54 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51065 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/radiobox.h
include/wx/msw/slider95.h
include/wx/msw/subwin.h
src/msw/radiobox.cpp
src/msw/slider95.cpp

index 6ff07ce3d9fc2239228d61eae2ce21d2d243efb2..65ae43e322e0fda644e7c29063d8dc3e43524826 100644 (file)
@@ -158,7 +158,9 @@ protected:
 
     // the buttons we contain
     wxSubwindows *m_radioButtons;
-    wxWindowIDRef *m_radioButtonIds;
+
+    // and the special dummy button used only as a tab group boundary
+    wxSubwindows *m_dummyButton;
 
     // array of widths and heights of the buttons, may be wxDefaultCoord if the
     // corresponding quantity should be computed
index 02ae8699ee69551d002d9a5e781a16fe7829d0ea..7d50a97762510e0f77563f5208f7c05f5f09b698 100644 (file)
@@ -118,7 +118,6 @@ protected:
 
     // the labels windows, if any
     wxSubwindows  *m_labels;
-    wxWindowIDRef *m_labelIds;
 
     int           m_rangeMin;
     int           m_rangeMax;
index cf149b7382e7f5de1323b218385a6acdd50ba328..cbe712e73c61010d71a6b1ae3058fb0eab54561d 100644 (file)
@@ -32,6 +32,7 @@ public:
 
         m_count = n;
         m_hwnds = (HWND *)calloc(n, sizeof(HWND));
+        m_ids = new wxWindowIDRef[n];
     }
 
     // non-virtual dtor, this class is not supposed to be used polymorphically
@@ -43,6 +44,7 @@ public:
         }
 
         free(m_hwnds);
+        delete [] m_ids;
     }
 
     // get the number of subwindows
@@ -56,12 +58,21 @@ public:
         return m_hwnds[n];
     }
 
-    HWND& operator[](size_t n) { return Get(n); }
     HWND operator[](size_t n) const
     {
         return wx_const_cast(wxSubwindows *, this)->Get(n);
     }
 
+    // initialize the given window: id will be stored in wxWindowIDRef ensuring
+    // that it is not reused while this object exists
+    void Set(size_t n, HWND hwnd, wxWindowID id)
+    {
+        wxASSERT_MSG( n < m_count, _T("subwindow index out of range") );
+
+        m_hwnds[n] = hwnd;
+        m_ids[n] = id;
+    }
+
     // check if we have this window
     bool HasWindow(HWND hwnd)
     {
@@ -140,6 +151,9 @@ private:
     // the HWNDs we contain
     HWND *m_hwnds;
 
+    // the IDs of the windows
+    wxWindowIDRef *m_ids;
+
 
     DECLARE_NO_COPY_CLASS(wxSubwindows)
 };
index 7865639116a32724b638e1ae35608f030c2d6e87..53c5efce54ded126aa60b547c14276daa3a891e0 100644 (file)
@@ -129,7 +129,7 @@ void wxRadioBox::Init()
 {
     m_selectedButton = wxNOT_FOUND;
     m_radioButtons = NULL;
-    m_radioButtonIds = NULL;
+    m_dummyButton = NULL;
     m_radioWidth = NULL;
     m_radioHeight = NULL;
 }
@@ -156,8 +156,17 @@ bool wxRadioBox::Create(wxWindow *parent,
     wxUnusedVar(val);
 #endif // wxUSE_VALIDATORS/!wxUSE_VALIDATORS
 
+    // We need an extra one to keep track of the 'dummy' item we
+    // create to end the radio group, so it will be destroyed and
+    // it's id will be released.  But we want it separate from the
+    // other buttons since the wxSubwindows will operate on it as
+    // well and we just want to ignore it until destroying it.
+    // For instance, we don't want the bounding box of the radio
+    // buttons to include the dummy button
     m_radioButtons = new wxSubwindows(n);
-    m_radioButtonIds = new wxWindowIDRef[n + 1];
+    m_dummyButton = new wxSubwindows(1);
+
+
     m_radioWidth = new int[n];
     m_radioHeight = new int[n];
 
@@ -169,14 +178,14 @@ bool wxRadioBox::Create(wxWindow *parent,
         if ( i == 0 )
             styleBtn |= WS_GROUP;
 
-        m_radioButtonIds[i] = NewControlId();
+        wxWindowIDRef subid = NewControlId();
 
         HWND hwndBtn = ::CreateWindow(_T("BUTTON"),
                                       choices[i].wx_str(),
                                       styleBtn,
                                       0, 0, 0, 0,   // will be set in SetSize()
                                       GetHwndOf(parent),
-                                      (HMENU)(wxWindowID)m_radioButtonIds[i],
+                                      (HMENU)subid.GetValue(),
                                       wxGetInstance(),
                                       NULL);
 
@@ -187,21 +196,29 @@ bool wxRadioBox::Create(wxWindow *parent,
             return false;
         }
 
-        (*m_radioButtons)[i] = hwndBtn;
+        // Keep track of the subwindow
+        m_radioButtons->Set(i, hwndBtn, subid);
 
         SubclassRadioButton((WXHWND)hwndBtn);
 
-        m_subControls.Add(m_radioButtonIds[i]);
+        // Also, make it a subcontrol of this control
+        m_subControls.Add(subid);
     }
 
     // Create a dummy radio control to end the group.
-    m_radioButtonIds[n] = NewControlId();
+    wxWindowIDRef subid = NewControlId();
 
-    (void)::CreateWindow(_T("BUTTON"),
+    HWND dummy = ::CreateWindow(_T("BUTTON"),
                          wxEmptyString,
                          WS_GROUP | BS_AUTORADIOBUTTON | WS_CHILD,
                          0, 0, 0, 0, GetHwndOf(parent),
-                         (HMENU)(wxWindowID)m_radioButtonIds[n], wxGetInstance(), NULL);
+                         (HMENU)subid.GetValue(), wxGetInstance(), NULL);
+
+    // Keep track of the subwindow so it will be destroyed when the radio
+    // box is and it's id will be freed.
+    // Also, do we need to consider this dummy item a subcontrol and add it
+    // to m_subControls
+    m_dummyButton->Set(0, dummy, subid);
 
     m_radioButtons->SetFont(GetFont());
 
@@ -241,7 +258,7 @@ wxRadioBox::~wxRadioBox()
     m_isBeingDeleted = true;
 
     delete m_radioButtons;
-    delete[] m_radioButtonIds;
+    delete m_dummyButton;
     delete[] m_radioWidth;
     delete[] m_radioHeight;
 }
index 159e0ddea3493c94e62291caeeacb4fd54c9e7c6..1ebdb425dce97d8f5f4873a7fe1f9d5f8abe0bc2 100644 (file)
@@ -135,7 +135,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
 void wxSlider::Init()
 {
     m_labels = NULL;
-    m_labelIds = NULL;
 
     m_pageSize = 1;
     m_lineSize = 1;
@@ -205,24 +204,25 @@ wxSlider::Create(wxWindow *parent,
     if ( m_windowStyle & wxSL_LABELS )
     {
         m_labels = new wxSubwindows(SliderLabel_Last);
-        m_labelIds = new wxWindowIDRef[SliderLabel_Last];
 
         HWND hwndParent = GetHwndOf(parent);
         for ( size_t n = 0; n < SliderLabel_Last; n++ )
         {
-            m_labelIds[n] = NewControlId();
-
-            (*m_labels)[n] = ::CreateWindow
-                               (
-                                    wxT("STATIC"),
-                                    NULL,
-                                    WS_CHILD | WS_VISIBLE | SS_CENTER,
-                                    0, 0, 0, 0,
-                                    hwndParent,
-                                    (HMENU)(wxWindowID)m_labelIds[n],
-                                    wxGetInstance(),
-                                    NULL
-                               );
+            wxWindowIDRef lblid = NewControlId();
+
+            HWND wnd = ::CreateWindow
+                         (
+                            wxT("STATIC"),
+                            NULL,
+                            WS_CHILD | WS_VISIBLE | SS_CENTER,
+                            0, 0, 0, 0,
+                            hwndParent,
+                            (HMENU)lblid.GetValue(),
+                            wxGetInstance(),
+                            NULL
+                         );
+
+            m_labels->Set(n, wnd, lblid);
         }
 
         m_labels->SetFont(GetFont());
@@ -286,7 +286,6 @@ WXDWORD wxSlider::MSWGetStyle(long style, WXDWORD *exstyle) const
 wxSlider::~wxSlider()
 {
     delete m_labels;
-    delete[] m_labelIds;
 }
 
 // ----------------------------------------------------------------------------