fixed event generation for wxComboBox to be consistent with the other platforms and also simplified the code by using the existing wxChoice logic instead of reimplementing it in a broken way
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
c11f04122f
commit
7d90194ccb
@ -23,7 +23,7 @@
|
||||
class WXDLLEXPORT wxComboBox: public wxChoice
|
||||
{
|
||||
public:
|
||||
wxComboBox() { Init(); }
|
||||
wxComboBox() { }
|
||||
|
||||
wxComboBox(wxWindow *parent, wxWindowID id,
|
||||
const wxString& value = wxEmptyString,
|
||||
@ -34,8 +34,6 @@ public:
|
||||
const wxValidator& validator = wxDefaultValidator,
|
||||
const wxString& name = wxComboBoxNameStr)
|
||||
{
|
||||
Init();
|
||||
|
||||
Create(parent, id, value, pos, size, n, choices, style, validator, name);
|
||||
}
|
||||
wxComboBox(wxWindow *parent, wxWindowID id,
|
||||
@ -47,8 +45,6 @@ public:
|
||||
const wxValidator& validator = wxDefaultValidator,
|
||||
const wxString& name = wxComboBoxNameStr)
|
||||
{
|
||||
Init();
|
||||
|
||||
Create(parent, id, value, pos, size, choices, style, validator, name);
|
||||
}
|
||||
|
||||
@ -75,7 +71,7 @@ public:
|
||||
// List functions: see wxChoice
|
||||
|
||||
// Text field functions
|
||||
wxString GetValue() const { return m_value; }
|
||||
virtual wxString GetValue() const;
|
||||
virtual void SetValue(const wxString& value);
|
||||
|
||||
// Clipboard operations
|
||||
@ -91,19 +87,18 @@ public:
|
||||
virtual wxTextPos GetLastPosition() const;
|
||||
virtual void Replace(long from, long to, const wxString& value);
|
||||
virtual void Remove(long from, long to);
|
||||
virtual void SetSelection(int n);
|
||||
virtual void SetSelection(int n) { wxChoice::SetSelection(n); }
|
||||
virtual void SetSelection(long from, long to);
|
||||
virtual int GetSelection() const;
|
||||
virtual int GetSelection() const { return wxChoice::GetSelection(); }
|
||||
virtual void GetSelection(long* from, long* to) const;
|
||||
virtual void SetEditable(bool editable);
|
||||
virtual void Clear();
|
||||
|
||||
virtual void Undo() ;
|
||||
virtual void Redo() ;
|
||||
virtual void Undo();
|
||||
virtual void Redo();
|
||||
virtual bool CanUndo() const;
|
||||
virtual bool CanRedo() const;
|
||||
virtual void SelectAll();
|
||||
virtual bool IsEditable() const ;
|
||||
virtual bool IsEditable() const;
|
||||
virtual bool HasSelection() const;
|
||||
|
||||
// implementation only from now on
|
||||
@ -132,17 +127,6 @@ public:
|
||||
|
||||
virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const;
|
||||
|
||||
protected:
|
||||
// common part of all ctors
|
||||
void Init() { m_selectionOld = -1; }
|
||||
|
||||
|
||||
// the previous selection (see MSWCommand() to see why it is needed)
|
||||
int m_selectionOld;
|
||||
|
||||
// the current selection (also see MSWCommand())
|
||||
wxString m_value;
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS_NO_COPY(wxComboBox)
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
@ -245,15 +245,6 @@ WXLRESULT wxComboBox::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPara
|
||||
|
||||
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.
|
||||
@ -326,40 +317,27 @@ bool wxComboBox::MSWProcessEditMsg(WXUINT msg, WXWPARAM wParam, WXLPARAM lParam)
|
||||
|
||||
bool wxComboBox::MSWCommand(WXUINT param, WXWORD id)
|
||||
{
|
||||
wxString value;
|
||||
int sel = -1;
|
||||
wxString value;
|
||||
|
||||
switch ( param )
|
||||
{
|
||||
case CBN_SELENDOK:
|
||||
case CBN_SELCHANGE:
|
||||
// we need to reset this to prevent the selection from being undone
|
||||
// by wxChoice, see wxChoice::MSWCommand() and comments there
|
||||
m_lastAcceptedSelection = wxID_NONE;
|
||||
|
||||
// set these variables so that they could be also fixed in
|
||||
// CBN_EDITCHANGE below
|
||||
sel = GetSelection();
|
||||
|
||||
// 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 )
|
||||
value = GetValue();
|
||||
{
|
||||
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);
|
||||
event.SetInt(sel);
|
||||
event.SetString(value);
|
||||
ProcessCommand(event);
|
||||
}
|
||||
else // no valid selection
|
||||
{
|
||||
m_selectionOld = sel;
|
||||
|
||||
// hence no EVT_TEXT neither
|
||||
break;
|
||||
}
|
||||
|
||||
// fall through: for compability with wxGTK, also send the text
|
||||
// update event when the selection changes (this also seems more
|
||||
@ -368,29 +346,15 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id)
|
||||
case CBN_EDITCHANGE:
|
||||
{
|
||||
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId());
|
||||
event.SetEventObject(this);
|
||||
|
||||
// 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);
|
||||
ProcessCommand(event);
|
||||
}
|
||||
break;
|
||||
@ -399,10 +363,9 @@ bool wxComboBox::MSWCommand(WXUINT param, WXWORD id)
|
||||
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
|
||||
@ -517,15 +480,17 @@ WXDWORD wxComboBox::MSWGetStyle(long style, WXDWORD *exstyle) 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
|
||||
@ -548,7 +513,7 @@ void wxComboBox::Undo()
|
||||
{
|
||||
if (CanUndo())
|
||||
{
|
||||
HWND hEditWnd = (HWND) GetEditHWND() ;
|
||||
HWND hEditWnd = (HWND) GetEditHWND();
|
||||
if ( hEditWnd )
|
||||
::SendMessage(hEditWnd, EM_UNDO, 0, 0);
|
||||
}
|
||||
@ -559,7 +524,7 @@ void wxComboBox::Redo()
|
||||
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);
|
||||
}
|
||||
@ -575,7 +540,7 @@ bool wxComboBox::CanUndo() const
|
||||
if (!IsEditable())
|
||||
return false;
|
||||
|
||||
HWND hEditWnd = (HWND) GetEditHWND() ;
|
||||
HWND hEditWnd = (HWND) GetEditHWND();
|
||||
if ( hEditWnd )
|
||||
return ::SendMessage(hEditWnd, EM_CANUNDO, 0, 0) != 0;
|
||||
else
|
||||
@ -587,7 +552,7 @@ bool wxComboBox::CanRedo() const
|
||||
if (!IsEditable())
|
||||
return false;
|
||||
|
||||
HWND hEditWnd = (HWND) GetEditHWND() ;
|
||||
HWND hEditWnd = (HWND) GetEditHWND();
|
||||
if ( hEditWnd )
|
||||
return ::SendMessage(hEditWnd, EM_CANUNDO, 0, 0) != 0;
|
||||
else
|
||||
@ -609,7 +574,7 @@ bool wxComboBox::CanCopy() const
|
||||
|
||||
bool wxComboBox::CanCut() const
|
||||
{
|
||||
return IsEditable() && CanCopy() ;
|
||||
return IsEditable() && CanCopy();
|
||||
}
|
||||
|
||||
bool wxComboBox::CanPaste() const
|
||||
@ -647,7 +612,7 @@ void wxComboBox::SetInsertionPoint(long pos)
|
||||
#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
|
||||
@ -743,28 +708,6 @@ void wxComboBox::GetSelection(long* from, long* to) const
|
||||
}
|
||||
}
|
||||
|
||||
int wxComboBox::GetSelection() const
|
||||
{
|
||||
return wxChoice::GetSelection();
|
||||
}
|
||||
|
||||
void wxComboBox::Clear()
|
||||
{
|
||||
wxChoice::Clear();
|
||||
m_selectionOld = -1;
|
||||
m_value.clear();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// overridden wxChoice methods
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxComboBox::SetSelection(int n)
|
||||
{
|
||||
wxChoice::SetSelection(n);
|
||||
m_selectionOld = n;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// standard event handling
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -834,7 +777,7 @@ void wxComboBox::OnUpdateRedo(wxUpdateUIEvent& event)
|
||||
|
||||
void wxComboBox::OnUpdateDelete(wxUpdateUIEvent& event)
|
||||
{
|
||||
event.Enable(HasSelection() && IsEditable()) ;
|
||||
event.Enable(HasSelection() && IsEditable());
|
||||
}
|
||||
|
||||
void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event)
|
||||
|
Loading…
Reference in New Issue
Block a user