]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/combobox.cpp
fixes bug 414369
[wxWidgets.git] / src / msw / combobox.cpp
index cf839f4748e486aeb7e45c26f9710a6a8b9c6dd2..9ccee8b4d0797525ec8dd961df89e5c523bc5d94 100644 (file)
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #if wxUSE_COMBOBOX
 
 #ifndef WX_PRECOMP
-#include "wx/settings.h"
+    #include "wx/settings.h"
+    #include "wx/log.h"
 #endif
 
 #include "wx/combobox.h"
@@ -195,23 +196,38 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam)
 
 bool wxComboBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
 {
+    wxString value;
+    int sel = -1;
     switch ( param )
     {
         case CBN_SELCHANGE:
-            if (GetSelection() > -1)
+            sel = GetSelection();
+            if ( sel > -1 )
             {
+                value = GetString(sel);
+
                 wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, GetId());
-                event.SetInt(GetSelection());
+                event.SetInt(sel);
                 event.SetEventObject(this);
-                event.SetString(GetStringSelection());
+                event.SetString(value);
                 ProcessCommand(event);
             }
-            break;
+            else
+            {
+                break;
+            }
+
+            // fall through: for compability with wxGTK, also send the text
+            // update event when the selection changes (this also seems more
+            // logical as the text does change)
 
         case CBN_EDITCHANGE:
             {
+                // if sel != -1, value was initialized above (and we can't use
+                // GetValue() here as it would return the old selection and we
+                // want the new one)
                 wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId());
-                event.SetString(GetValue());
+                event.SetString(sel == -1 ? GetValue() : value);
                 event.SetEventObject(this);
                 ProcessCommand(event);
             }
@@ -366,25 +382,31 @@ void wxComboBox::SetEditable(bool editable)
 
 void wxComboBox::SetInsertionPoint(long pos)
 {
+    if ( GetWindowStyle() & wxCB_READONLY )
+        return;
+
 #ifdef __WIN32__
-  HWND hWnd = GetHwnd();
-  SendMessage(hWnd, CB_SETEDITSEL, 0, MAKELPARAM(pos, pos));
-  HWND hEditWnd = (HWND) GetEditHWND() ;
-  if (hEditWnd)
-  {
-    // Scroll insertion point into view
-    SendMessage(hEditWnd, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
-    // Why is this necessary? (Copied from wxTextCtrl::SetInsertionPoint)
-    static const wxChar *nothing = _T("");
-    SendMessage(hEditWnd, EM_REPLACESEL, 0, (LPARAM)nothing);
-  }
-#endif
+    HWND hWnd = GetHwnd();
+    ::SendMessage(hWnd, CB_SETEDITSEL, 0, MAKELPARAM(pos, pos));
+    HWND hEditWnd = (HWND) GetEditHWND() ;
+    if ( hEditWnd )
+    {
+        // Scroll insertion point into view
+        SendMessage(hEditWnd, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
+        // Why is this necessary? (Copied from wxTextCtrl::SetInsertionPoint)
+        SendMessage(hEditWnd, EM_REPLACESEL, 0, (LPARAM)_T(""));
+    }
+#endif // __WIN32__
 }
 
 void wxComboBox::SetInsertionPointEnd()
 {
-  long pos = GetLastPosition();
-  SetInsertionPoint(pos);
+    // setting insertion point doesn't make sense for read only comboboxes
+    if ( !(GetWindowStyle() & wxCB_READONLY) )
+    {
+        long pos = GetLastPosition();
+        SetInsertionPoint(pos);
+    }
 }
 
 long wxComboBox::GetInsertionPoint() const
@@ -411,39 +433,21 @@ long wxComboBox::GetLastPosition() const
 void wxComboBox::Replace(long from, long to, const wxString& value)
 {
 #if wxUSE_CLIPBOARD
-    HWND hWnd = GetHwnd();
-    long fromChar = from;
-    long toChar = to;
-
-    // Set selection and remove it
-#ifdef __WIN32__
-    SendMessage(hWnd, CB_SETEDITSEL, fromChar, toChar);
-#else
-    SendMessage(hWnd, CB_SETEDITSEL, (WPARAM)0, (LPARAM)MAKELONG(fromChar, toChar));
-#endif
-    SendMessage(hWnd, WM_CUT, (WPARAM)0, (LPARAM)0);
+    Remove(from, to);
 
     // Now replace with 'value', by pasting.
     wxSetClipboardData(wxDF_TEXT, (wxObject *)(const wxChar *)value, 0, 0);
 
     // Paste into edit control
-    SendMessage(hWnd, WM_PASTE, (WPARAM)0, (LPARAM)0L);
+    SendMessage(GetHwnd(), WM_PASTE, (WPARAM)0, (LPARAM)0L);
 #endif
 }
 
 void wxComboBox::Remove(long from, long to)
 {
-    HWND hWnd = GetHwnd();
-    long fromChar = from;
-    long toChar = to;
-
-    // Cut all selected text
-#ifdef __WIN32__
-    SendMessage(hWnd, CB_SETEDITSEL, fromChar, toChar);
-#else
-    SendMessage(hWnd, CB_SETEDITSEL, (WPARAM)0, (LPARAM)MAKELONG(fromChar, toChar));
-#endif
-    SendMessage(hWnd, WM_CUT, (WPARAM)0, (LPARAM)0);
+    // Set selection and remove it
+    SetSelection(from, to);
+    SendMessage(GetHwnd(), WM_CUT, (WPARAM)0, (LPARAM)0);
 }
 
 void wxComboBox::SetSelection(long from, long to)
@@ -460,13 +464,16 @@ void wxComboBox::SetSelection(long from, long to)
       toChar = -1;
     }
 
+    if ( 
 #ifdef __WIN32__
-    SendMessage(hWnd, CB_SETEDITSEL, (WPARAM)fromChar, (LPARAM)toChar);
-//    SendMessage(hWnd, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
-#else
-    // WPARAM is 0: selection is scrolled into view
-    SendMessage(hWnd, CB_SETEDITSEL, (WPARAM)0, (LPARAM)MAKELONG(fromChar, toChar));
+    SendMessage(hWnd, CB_SETEDITSEL, (WPARAM)0, (LPARAM)MAKELONG(fromChar, toChar))
+#else // Win16
+    SendMessage(hWnd, CB_SETEDITSEL, (WPARAM)fromChar, (LPARAM)toChar)
 #endif
+        == CB_ERR )
+    {
+        wxLogDebug(_T("CB_SETEDITSEL failed"));
+    }
 }
 
 void wxComboBox::DoMoveWindow(int x, int y, int width, int height)