From 0934d91c7bb42c817785f9285b853d86931044b8 Mon Sep 17 00:00:00 2001 From: Stefan Neis Date: Wed, 12 Apr 2006 20:31:46 +0000 Subject: [PATCH] Fixed GetSelection to behave the same as for the other ports, added GetCurrentSelection. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38687 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/os2/choice.h | 23 +++++++++++++++++++---- src/os2/choice.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/include/wx/os2/choice.h b/include/wx/os2/choice.h index 6f7feec581..b04aee3d72 100644 --- a/include/wx/os2/choice.h +++ b/include/wx/os2/choice.h @@ -12,14 +12,18 @@ #ifndef _WX_CHOICE_H_ #define _WX_CHOICE_H_ +// ---------------------------------------------------------------------------- // Choice item +// ---------------------------------------------------------------------------- + class WXDLLEXPORT wxChoice: public wxChoiceBase { DECLARE_DYNAMIC_CLASS(wxChoice) public: // ctors - inline wxChoice() { } + inline wxChoice() { Init(); } + virtual ~wxChoice(); inline wxChoice( wxWindow* pParent ,wxWindowID vId @@ -32,6 +36,7 @@ public: ,const wxString& rsName = wxChoiceNameStr ) { + Init(); Create( pParent ,vId ,rPos @@ -54,6 +59,7 @@ public: ,const wxString& rsName = wxChoiceNameStr ) { + Init(); Create( pParent ,vId ,rPos @@ -89,13 +95,12 @@ public: // // Implement base class virtuals // - virtual int DoAppend(const wxString& rsItem); - virtual int DoInsert(const wxString& rsItem, unsigned int pos); virtual void Delete(unsigned int n); virtual void Clear(void); virtual unsigned int GetCount() const; virtual int GetSelection(void) const; + virtual int GetCurrentSelection(void) const; virtual void SetSelection(int n); virtual wxString GetString(unsigned int n) const; @@ -113,7 +118,12 @@ public: ); protected: - virtual void DoSetItemClientData(unsigned int n, void* pClientData); + // common part of all ctors + void Init() { m_lastAcceptedSelection = wxID_NONE; } + + virtual int DoAppend(const wxString& rsItem); + virtual int DoInsert(const wxString& rsItem, unsigned int pos); + virtual void DoSetItemClientData(unsigned int n, void* pClientData); virtual void* DoGetItemClientData(unsigned int n) const; virtual void DoSetItemClientObject(unsigned int n, wxClientData* pClientData); virtual wxClientData* DoGetItemClientObject(unsigned int n) const; @@ -125,6 +135,11 @@ protected: ,int nsizeFlags = wxSIZE_AUTO ); void Free(void); + + // last "completed" selection, i.e. not the transient one while the user is + // browsing the popup list: this is only used when != wxID_NONE which is + // the case while the drop down is opened + int m_lastAcceptedSelection; }; // end of CLASS wxChoice #endif // _WX_CHOICE_H_ diff --git a/src/os2/choice.cpp b/src/os2/choice.cpp index 498e5cd427..b8940322b3 100644 --- a/src/os2/choice.cpp +++ b/src/os2/choice.cpp @@ -88,6 +88,8 @@ bool wxChoice::Create( // on global settings) rather than inheriting the parent's background colour. // SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + + // initialize the controls contents for (int i = 0; i < n; i++) { Append(asChoices[i]); @@ -100,6 +102,11 @@ bool wxChoice::Create( return true; } // end of wxChoice::Create +wxChoice::~wxChoice() +{ + Free(); +} + // ---------------------------------------------------------------------------- // adding/deleting items to/from the list // ---------------------------------------------------------------------------- @@ -149,6 +156,12 @@ int wxChoice::DoInsert( const wxString& rsItem, unsigned int pos ) void wxChoice::Delete(unsigned int n) { wxCHECK_RET( IsValid(n), wxT("invalid item index in wxChoice::Delete") ); + + if ( HasClientObjectData() ) + { + delete GetClientObject(n); + } + ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, (MPARAM)0); } // end of wxChoice::Delete @@ -163,6 +176,17 @@ void wxChoice::Clear() // ---------------------------------------------------------------------------- int wxChoice::GetSelection() const +{ + // if m_lastAcceptedSelection is set, it means that the dropdown is + // currently shown and that we want to use the last "permanent" selection + // instead of whatever is under the mouse pointer currently + // + // otherwise, get the selection from the control + return m_lastAcceptedSelection == wxID_NONE ? GetCurrentSelection() + : m_lastAcceptedSelection; +} + +int wxChoice::GetCurrentSelection() const { return((int)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYSELECTION, (MPARAM)LIT_FIRST, (MPARAM)0))); } // end of wxChoice::GetSelection -- 2.45.2