]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/radiobox.cpp
Fixed wxscintilla compilation for wxDFB.
[wxWidgets.git] / src / msw / radiobox.cpp
index 53c5efce54ded126aa60b547c14276daa3a891e0..634d598476286bd7c2eb0f005397be7cc7a4d3aa 100644 (file)
@@ -74,10 +74,7 @@ wxBEGIN_FLAGS( wxRadioBoxStyle )
     wxFLAGS_MEMBER(wxHSCROLL)
 
     wxFLAGS_MEMBER(wxRA_SPECIFY_COLS)
-    wxFLAGS_MEMBER(wxRA_HORIZONTAL)
     wxFLAGS_MEMBER(wxRA_SPECIFY_ROWS)
-    wxFLAGS_MEMBER(wxRA_VERTICAL)
-
 wxEND_FLAGS( wxRadioBoxStyle )
 
 IMPLEMENT_DYNAMIC_CLASS_XTI(wxRadioBox, wxControl,"wx/radiobox.h")
@@ -129,7 +126,7 @@ void wxRadioBox::Init()
 {
     m_selectedButton = wxNOT_FOUND;
     m_radioButtons = NULL;
-    m_dummyButton = NULL;
+    m_dummyHwnd = NULL;
     m_radioWidth = NULL;
     m_radioHeight = NULL;
 }
@@ -150,6 +147,11 @@ bool wxRadioBox::Create(wxWindow *parent,
     if ( !wxStaticBox::Create(parent, id, title, pos, size, style, name) )
         return false;
 
+    // the code elsewhere in this file supposes that either wxRA_SPECIFY_COLS
+    // or wxRA_SPECIFY_ROWS is set, ensure that this is indeed the case
+    if ( !(style & (wxRA_SPECIFY_ROWS | wxRA_SPECIFY_COLS)) )
+        style |= wxRA_SPECIFY_COLS;
+
 #if wxUSE_VALIDATORS
     SetValidator(val);
 #else
@@ -164,8 +166,6 @@ bool wxRadioBox::Create(wxWindow *parent,
     // For instance, we don't want the bounding box of the radio
     // buttons to include the dummy button
     m_radioButtons = new wxSubwindows(n);
-    m_dummyButton = new wxSubwindows(1);
-
 
     m_radioWidth = new int[n];
     m_radioHeight = new int[n];
@@ -180,12 +180,12 @@ bool wxRadioBox::Create(wxWindow *parent,
 
         wxWindowIDRef subid = NewControlId();
 
-        HWND hwndBtn = ::CreateWindow(_T("BUTTON"),
+        HWND hwndBtn = ::CreateWindow(wxT("BUTTON"),
                                       choices[i].wx_str(),
                                       styleBtn,
                                       0, 0, 0, 0,   // will be set in SetSize()
                                       GetHwndOf(parent),
-                                      (HMENU)subid.GetValue(),
+                                      (HMENU)wxUIntToPtr(subid.GetValue()),
                                       wxGetInstance(),
                                       NULL);
 
@@ -206,19 +206,15 @@ bool wxRadioBox::Create(wxWindow *parent,
     }
 
     // Create a dummy radio control to end the group.
-    wxWindowIDRef subid = NewControlId();
+    m_dummyId = NewControlId();
 
-    HWND dummy = ::CreateWindow(_T("BUTTON"),
+    m_dummyHwnd = (WXHWND)::CreateWindow(wxT("BUTTON"),
                          wxEmptyString,
                          WS_GROUP | BS_AUTORADIOBUTTON | WS_CHILD,
                          0, 0, 0, 0, GetHwndOf(parent),
-                         (HMENU)subid.GetValue(), wxGetInstance(), NULL);
+                         (HMENU)wxUIntToPtr(m_dummyId.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());
 
@@ -255,10 +251,11 @@ bool wxRadioBox::Create(wxWindow *parent,
 
 wxRadioBox::~wxRadioBox()
 {
-    m_isBeingDeleted = true;
+    SendDestroyEvent();
 
     delete m_radioButtons;
-    delete m_dummyButton;
+    if ( m_dummyHwnd )
+        DestroyWindow((HWND)m_dummyHwnd);
     delete[] m_radioWidth;
     delete[] m_radioHeight;
 }
@@ -406,7 +403,7 @@ bool wxRadioBox::Enable(unsigned int item, bool enable)
     wxCHECK_MSG( IsValid(item), false,
                  wxT("invalid item in wxRadioBox::Enable()") );
 
-    BOOL ret = ::EnableWindow((*m_radioButtons)[item], enable);
+    BOOL ret = MSWEnableHWND((*m_radioButtons)[item], enable);
 
     return (ret == 0) != enable;
 }
@@ -462,11 +459,32 @@ void wxRadioBox::DoSetItemToolTip(unsigned int item, wxToolTip *tooltip)
     if ( tooltip != NULL )
         tooltip->Add(hwndRbtn);
     else // unset the tooltip
-        wxToolTip::Remove(hwndRbtn);
+        wxToolTip::Remove(hwndRbtn, 0, wxRect(0,0,0,0));
+        // the second parameter can be zero since it's ignored by Remove()
+        // as we pass a rect for which wxRect::IsEmpty()==true...
 }
 
 #endif // wxUSE_TOOLTIPS
 
+bool wxRadioBox::Reparent(wxWindowBase *newParent)
+{
+    if ( !wxStaticBox::Reparent(newParent) )
+    {
+        return false;
+    }
+
+    HWND hwndParent = GetHwndOf(GetParent());
+    for ( size_t item = 0; item < m_radioButtons->GetCount(); item++ )
+    {
+        ::SetParent((*m_radioButtons)[item], hwndParent);
+    }
+#ifdef __WXWINCE__
+    // put static box under the buttons in the Z-order
+    SetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
+#endif
+    return true;
+}
+
 WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(wxRadioBox, wxStaticBox, m_radioButtons)
 
 // ----------------------------------------------------------------------------
@@ -546,57 +564,34 @@ wxSize wxRadioBox::DoGetBestSize() const
     return best;
 }
 
-// Restored old code.
 void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    int currentX, currentY;
-    GetPosition(&currentX, &currentY);
-    int widthOld, heightOld;
-    GetSize(&widthOld, &heightOld);
+    if ( (width == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_WIDTH)) ||
+            (height == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_HEIGHT)) )
+    {
+        // Attempt to have a look coherent with other platforms: We compute the
+        // biggest toggle dim, then we align all items according this value.
+        const wxSize totSize = GetTotalButtonSize(GetMaxButtonSize());
 
-    int xx = x;
-    int yy = y;
+        // only change our width/height if asked for
+        if ( width == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_WIDTH) )
+            width = totSize.x;
 
-    if (x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
-        xx = currentX;
-    if (y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
-        yy = currentY;
+        if ( height == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_HEIGHT) )
+            height = totSize.y;
+    }
 
-    int y_offset = yy;
-    int x_offset = xx;
+    wxStaticBox::DoSetSize(x, y, width, height);
+}
 
-    int cx1, cy1;
-    wxGetCharSize(m_hWnd, &cx1, &cy1, GetFont());
+void wxRadioBox::DoMoveWindow(int x, int y, int width, int height)
+{
+    wxStaticBox::DoMoveWindow(x, y, width, height);
 
-    // Attempt to have a look coherent with other platforms: We compute the
-    // biggest toggle dim, then we align all items according this value.
     wxSize maxSize = GetMaxButtonSize();
     int maxWidth = maxSize.x,
         maxHeight = maxSize.y;
 
-    wxSize totSize = GetTotalButtonSize(maxSize);
-    int totWidth = totSize.x,
-        totHeight = totSize.y;
-
-    // only change our width/height if asked for
-    if ( width == wxDefaultCoord )
-    {
-        if ( sizeFlags & wxSIZE_AUTO_WIDTH )
-            width = totWidth;
-        else
-            width = widthOld;
-    }
-
-    if ( height == wxDefaultCoord )
-    {
-        if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
-            height = totHeight;
-        else
-            height = heightOld;
-    }
-
-    DoMoveWindow(xx, yy, width, height);
-
     // Now position all the buttons: the current button will be put at
     // wxPoint(x_offset, y_offset) and the new row/column will start at
     // startX/startY. The size of all buttons will be the same wxSize(maxWidth,
@@ -608,8 +603,11 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
     // wxRA_SPECIFY_ROWS means that the buttons are arranged top to bottom and
     // GetMajorDim() is the number of rows.
 
-    x_offset += cx1;
-    y_offset += cy1;
+    int cx1, cy1;
+    wxGetCharSize(m_hWnd, &cx1, &cy1, GetFont());
+
+    int x_offset = x + cx1;
+    int y_offset = y + cy1;
 
     // Add extra space under the label, if it exists.
     if (!wxControl::GetLabel().empty())