/////////////////////////////////////////////////////////////////////////////
-// Name: msw/combobox.cpp
+// Name: src/msw/combobox.cpp
// Purpose: wxComboBox class
// Author: Julian Smart
// Modified by:
#if wxUSE_COMBOBOX
+#include "wx/combobox.h"
+
#ifndef WX_PRECOMP
#include "wx/settings.h"
#include "wx/log.h"
// for wxEVT_COMMAND_TEXT_ENTER
#include "wx/textctrl.h"
+ #include "wx/app.h"
+ #include "wx/brush.h"
#endif
-#include "wx/app.h"
-#include "wx/combobox.h"
-#include "wx/brush.h"
#include "wx/clipbrd.h"
#include "wx/msw/private.h"
{
wxCHECK_MSG( win, 0, _T("should have a parent") );
- if ( win->GetWindowStyle() & wxPROCESS_ENTER )
+ if ( win->GetWindowStyle() & wxTE_PROCESS_ENTER )
{
// need to return a custom dlg code or we'll never get it
return DLGC_WANTMESSAGE;
}
break;
- // deal with tooltips here
-#if wxUSE_TOOLTIPS && defined(TTN_NEEDTEXT)
- case WM_NOTIFY:
- {
- wxCHECK_MSG( win, 0, _T("should have a parent") );
-
- NMHDR* hdr = (NMHDR *)lParam;
- if ( hdr->code == TTN_NEEDTEXT )
- {
- wxToolTip *tooltip = win->GetToolTip();
- if ( tooltip )
- {
- TOOLTIPTEXT *ttt = (TOOLTIPTEXT *)lParam;
- ttt->lpszText = (wxChar *)tooltip->GetTip().c_str();
- }
-
- // processed
- return 0;
- }
- }
+ case WM_CUT:
+ case WM_COPY:
+ case WM_PASTE:
+ if( win->HandleClipboardEvent( message ) )
+ return 0;
break;
-#endif // wxUSE_TOOLTIPS
}
return ::CallWindowProc(CASTWNDPROC gs_wndprocEdit, hWnd, message, wParam, lParam);
switch ( nMsg )
{
- case CB_SETCURSEL:
- // Selection was set with SetSelection. Update the value too.
- if ((int)wParam > GetCount())
- m_value.clear();
- else
- m_value = GetString(wParam);
- m_selectionOld = -1;
- break;
-
case WM_SIZE:
// wxStaticBox can generate this message, when modifying the control's style.
// This causes the content of the combobox to be selected, for some reason.
if ( wParam == VK_RETURN )
{
wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
- InitCommandEvent(event);
+
+ const int sel = GetSelection();
+ event.SetInt(sel);
event.SetString(GetValue());
- event.SetInt(GetSelection());
+ InitCommandEventWithItems(event, sel);
+
if ( ProcessCommand(event) )
{
// don't let the event through to the native control
bool wxComboBox::MSWCommand(WXUINT param, WXWORD id)
{
- wxString value;
int sel = -1;
+ wxString value;
+
switch ( param )
{
case CBN_SELENDOK:
- case CBN_SELCHANGE:
- sel = GetSelection();
+#ifndef __SMARTPHONE__
+ // we need to reset this to prevent the selection from being undone
+ // by wxChoice, see wxChoice::MSWCommand() and comments there
+ m_lastAcceptedSelection = wxID_NONE;
+#endif
- // we may sometimes get 2 CBN_SELCHANGE events or a CBN_SELENDOK
- // before CBN_SELCHANGE with the same index when the user selects
- // an item in the combobox -- ignore duplicates
- if ( sel > -1 && sel != m_selectionOld )
+ // set these variables so that they could be also fixed in
+ // CBN_EDITCHANGE below
+ sel = GetSelection();
+ value = GetStringSelection();
{
- m_selectionOld = sel;
-
- // GetValue() would still return the old value from here but
- // according to the docs we should return the new value if the
- // user calls it in his event handler, so update internal
- // m_value
- m_value = GetString(sel);
-
wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, GetId());
event.SetInt(sel);
- event.SetEventObject(this);
- event.SetString(m_value);
- ProcessCommand(event);
- }
- else // no valid selection
- {
- m_selectionOld = sel;
+ event.SetString(value);
+ InitCommandEventWithItems(event, sel);
- // hence no EVT_TEXT neither
- break;
+ ProcessCommand(event);
}
// fall through: for compability with wxGTK, also send the text
{
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId());
- // 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)
+ // if sel != -1, value was already initialized above
if ( sel == -1 )
{
- m_value = wxGetWindowText(GetHwnd());
- m_selectionOld = -1;
- }
- else // we're synthesizing text updated event from sel change
- {
- // We need to retrieve the current selection because the
- // user may have changed it in the previous handler (for
- // CBN_SELCHANGE above).
- sel = GetSelection();
- if ( sel > -1 )
- {
- m_value = GetString(sel);
- }
+ value = wxGetWindowText(GetHwnd());
}
- event.SetString(m_value);
- event.SetEventObject(this);
+ event.SetString(value);
+ InitCommandEventWithItems(event, sel);
+
ProcessCommand(event);
}
break;
return wxChoice::MSWCommand(param, id);
}
- // let the def window proc have it by returning false, but do not pass the
- // message we've already handled here (notably CBN_SELCHANGE) to the base
- // class as it would generate another event for them
- return false;
+ // skip wxChoice version as it would generate its own events for
+ // CBN_SELENDOK
+ return wxControl::MSWCommand(param, id);
}
WXHWND wxComboBox::GetEditHWND() const
// wxComboBox text control-like methods
// ----------------------------------------------------------------------------
+wxString wxComboBox::GetValue() const
+{
+ return wxGetWindowText(m_hWnd);
+}
+
void wxComboBox::SetValue(const wxString& value)
{
if ( HasFlag(wxCB_READONLY) )
SetStringSelection(value);
else
SetWindowText(GetHwnd(), value.c_str());
-
- m_value = value;
- m_selectionOld = GetSelection();
}
// Clipboard operations
{
if (CanUndo())
{
- HWND hEditWnd = (HWND) GetEditHWND() ;
+ HWND hEditWnd = (HWND) GetEditHWND();
if ( hEditWnd )
::SendMessage(hEditWnd, EM_UNDO, 0, 0);
}
if (CanUndo())
{
// Same as Undo, since Undo undoes the undo, i.e. a redo.
- HWND hEditWnd = (HWND) GetEditHWND() ;
+ HWND hEditWnd = (HWND) GetEditHWND();
if ( hEditWnd )
::SendMessage(hEditWnd, EM_UNDO, 0, 0);
}
if (!IsEditable())
return false;
- HWND hEditWnd = (HWND) GetEditHWND() ;
+ HWND hEditWnd = (HWND) GetEditHWND();
if ( hEditWnd )
return ::SendMessage(hEditWnd, EM_CANUNDO, 0, 0) != 0;
else
if (!IsEditable())
return false;
- HWND hEditWnd = (HWND) GetEditHWND() ;
+ HWND hEditWnd = (HWND) GetEditHWND();
if ( hEditWnd )
return ::SendMessage(hEditWnd, EM_CANUNDO, 0, 0) != 0;
else
bool wxComboBox::CanCut() const
{
- return IsEditable() && CanCopy() ;
+ return IsEditable() && CanCopy();
}
bool wxComboBox::CanPaste() const
#ifdef __WIN32__
HWND hWnd = GetHwnd();
::SendMessage(hWnd, CB_SETEDITSEL, 0, MAKELPARAM(pos, pos));
- HWND hEditWnd = (HWND) GetEditHWND() ;
+ HWND hEditWnd = (HWND) GetEditHWND();
if ( hEditWnd )
{
// Scroll insertion point into view
}
}
-int wxComboBox::GetSelection() const
-{
- return wxChoice::GetSelection();
-}
-
-void wxComboBox::Clear()
-{
- wxChoice::Clear();
- m_selectionOld = -1;
- m_value.clear();
-}
-
// ----------------------------------------------------------------------------
// standard event handling
// ----------------------------------------------------------------------------
void wxComboBox::OnUpdateDelete(wxUpdateUIEvent& event)
{
- event.Enable(HasSelection() && IsEditable()) ;
+ event.Enable(HasSelection() && IsEditable());
}
void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event)
}
#endif // wxUSE_COMBOBOX
-