]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/combobox.cpp
don't keep dangling m_prevRadio pointer (2nd part of patch 1836644)
[wxWidgets.git] / src / msw / combobox.cpp
index 5b1fc638681a464f4785d3a59cd1397be4268614..bb651346225a7cbe8d9aa2ff066f8db3700fbdda 100644 (file)
@@ -235,6 +235,9 @@ WXLRESULT wxComboBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara
             {
                 // combobox selection sometimes spontaneously changes when its
                 // size changes, restore it to the old value if necessary
+                if ( !GetEditHWNDIfAvailable() )
+                    break;
+
                 long fromOld, toOld;
                 GetSelection(&fromOld, &toOld);
                 WXLRESULT result = wxChoice::MSWWindowProc(nMsg, wParam, lParam);
@@ -391,22 +394,24 @@ bool wxComboBox::MSWShouldPreProcessMessage(WXMSG *pMsg)
     return wxChoice::MSWShouldPreProcessMessage(pMsg);
 }
 
+WXHWND wxComboBox::GetEditHWNDIfAvailable() const
+{
+    // we assume that the only child of the combobox is the edit window so it's
+    // unnecessary to pass "EDIT" as class name parameter
+    return (WXHWND)::FindWindowEx(GetHwnd(), NULL, NULL, NULL);
+}
+
 WXHWND wxComboBox::GetEditHWND() const
 {
     // this function should not be called for wxCB_READONLY controls, it is
-    // the callers responsability to check this
+    // the callers responsibility to check this
     wxASSERT_MSG( !HasFlag(wxCB_READONLY),
                   _T("read-only combobox doesn't have any edit control") );
 
-    POINT pt;
-    pt.x = pt.y = 4;
-    HWND hwndEdit = ::ChildWindowFromPoint(GetHwnd(), pt);
-    if ( !hwndEdit || hwndEdit == GetHwnd() )
-    {
-        wxFAIL_MSG(_T("combobox without edit control?"));
-    }
+    WXHWND hWndEdit = GetEditHWNDIfAvailable();
+    wxASSERT_MSG( hWndEdit, _T("combobox without edit control?") );
 
-    return (WXHWND)hwndEdit;
+    return hWndEdit;
 }
 
 // ----------------------------------------------------------------------------
@@ -502,6 +507,12 @@ WXDWORD wxComboBox::MSWGetStyle(long style, WXDWORD *exstyle) const
 // wxComboBox text control-like methods
 // ----------------------------------------------------------------------------
 
+wxString wxComboBox::GetValue() const
+{
+    return HasFlag(wxCB_READONLY) ? GetStringSelection()
+                                  : wxTextEntry::GetValue();
+}
+
 void wxComboBox::SetValue(const wxString& value)
 {
     if ( HasFlag(wxCB_READONLY) )
@@ -510,6 +521,28 @@ void wxComboBox::SetValue(const wxString& value)
         wxTextEntry::SetValue(value);
 }
 
+void wxComboBox::Clear()
+{
+    wxChoice::Clear();
+    if ( !HasFlag(wxCB_READONLY) )
+        wxTextEntry::Clear();
+}
+
+void wxComboBox::GetSelection(long *from, long *to) const
+{
+    if ( !HasFlag(wxCB_READONLY) )
+    {
+        wxTextEntry::GetSelection(from, to);
+    }
+    else // text selection doesn't make sense for read only comboboxes
+    {
+        if ( from )
+            *from = -1;
+        if ( to )
+            *to = -1;
+    }
+}
+
 bool wxComboBox::IsEditable() const
 {
     return !HasFlag(wxCB_READONLY) && wxTextEntry::IsEditable();
@@ -574,12 +607,12 @@ void wxComboBox::OnUpdatePaste(wxUpdateUIEvent& event)
 
 void wxComboBox::OnUpdateUndo(wxUpdateUIEvent& event)
 {
-    event.Enable( CanUndo() );
+    event.Enable( IsEditable() && CanUndo() );
 }
 
 void wxComboBox::OnUpdateRedo(wxUpdateUIEvent& event)
 {
-    event.Enable( CanRedo() );
+    event.Enable( IsEditable() && CanRedo() );
 }
 
 void wxComboBox::OnUpdateDelete(wxUpdateUIEvent& event)