Add wxComboBox::Popup() and Dismiss() to manually show or hide its popup.

Add implementations for wxMSW and wxGTK.

Closes #11506.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63242 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-01-24 01:00:45 +00:00
parent d21866cbd7
commit d1d1f8175d
8 changed files with 79 additions and 10 deletions

View File

@@ -491,6 +491,7 @@ All (GUI):
- Added wxBORDER_THEME to XRC. - Added wxBORDER_THEME to XRC.
- wxGraphicsContext is now enabled by default if supported by the platform. - wxGraphicsContext is now enabled by default if supported by the platform.
- Fix building with using system libpng 1.4 (Volker Grabsch). - Fix building with using system libpng 1.4 (Volker Grabsch).
- Add wxComboBox::Popup() and Dismiss() methods (Igor Korot).
GTK: GTK:

View File

@@ -47,6 +47,9 @@ public:
virtual int GetSelection() const = 0; virtual int GetSelection() const = 0;
virtual void GetSelection(long *from, long *to) const = 0; virtual void GetSelection(long *from, long *to) const = 0;
virtual void Popup() { wxFAIL_MSG( wxT("Not implemented") ); };
virtual void Dismiss() { wxFAIL_MSG( wxT("Not implemented") ); };
// may return value different from GetSelection() when the combobox // may return value different from GetSelection() when the combobox
// dropdown is shown and the user selected, but not yet accepted, a value // dropdown is shown and the user selected, but not yet accepted, a value
// different from the old one in it // different from the old one in it

View File

@@ -88,6 +88,8 @@ public:
{ {
return wxItemContainer::GetStringSelection(); return wxItemContainer::GetStringSelection();
} }
virtual void Popup();
virtual void Dismiss();
virtual void Clear() virtual void Clear()
{ {

View File

@@ -82,7 +82,8 @@ public:
virtual void SetValue(const wxString& value); virtual void SetValue(const wxString& value);
virtual wxString GetStringSelection() const virtual wxString GetStringSelection() const
{ return wxChoice::GetStringSelection(); } { return wxChoice::GetStringSelection(); }
virtual void Popup() { MSWDoPopupOrDismiss(true); }
virtual void Dismiss() { MSWDoPopupOrDismiss(false); }
virtual void SetSelection(int n) { wxChoice::SetSelection(n); } virtual void SetSelection(int n) { wxChoice::SetSelection(n); }
virtual void SetSelection(long from, long to) virtual void SetSelection(long from, long to)
{ wxTextEntry::SetSelection(from, to); } { wxTextEntry::SetSelection(from, to); }
@@ -125,6 +126,7 @@ protected:
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
virtual void DoSetToolTip(wxToolTip *tip); virtual void DoSetToolTip(wxToolTip *tip);
#endif #endif
void MSWDoPopupOrDismiss(bool show);
// this is the implementation of GetEditHWND() which can also be used when // this is the implementation of GetEditHWND() which can also be used when
// we don't have the edit control, it simply returns NULL then // we don't have the edit control, it simply returns NULL then

View File

@@ -243,5 +243,23 @@ public:
The text to set. The text to set.
*/ */
virtual void SetValue(const wxString& text); virtual void SetValue(const wxString& text);
/**
Shows the list box portion of the combo box.
Currently only implemented in wxMSW and wxGTK.
@since 2.9.1
*/
virtual void Popup();
/**
Hides the list box portion of the combo box.
Currently only implemented in wxMSW and wxGTK.
@since 2.9.1
*/
virtual void Dismiss();
}; };

View File

@@ -53,6 +53,8 @@
enum enum
{ {
ComboPage_Reset = wxID_HIGHEST, ComboPage_Reset = wxID_HIGHEST,
ComboPage_Popup,
ComboPage_Dismiss,
ComboPage_SetCurrent, ComboPage_SetCurrent,
ComboPage_CurText, ComboPage_CurText,
ComboPage_InsertionPointText, ComboPage_InsertionPointText,
@@ -102,6 +104,8 @@ public:
protected: protected:
// event handlers // event handlers
void OnButtonReset(wxCommandEvent& event); void OnButtonReset(wxCommandEvent& event);
void OnButtonPopup(wxCommandEvent&) { m_combobox->Popup(); }
void OnButtonDismiss(wxCommandEvent&) { m_combobox->Dismiss(); }
void OnButtonChange(wxCommandEvent& event); void OnButtonChange(wxCommandEvent& event);
void OnButtonDelete(wxCommandEvent& event); void OnButtonDelete(wxCommandEvent& event);
void OnButtonDeleteSel(wxCommandEvent& event); void OnButtonDeleteSel(wxCommandEvent& event);
@@ -170,6 +174,8 @@ private:
BEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage) BEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage)
EVT_BUTTON(ComboPage_Reset, ComboboxWidgetsPage::OnButtonReset) EVT_BUTTON(ComboPage_Reset, ComboboxWidgetsPage::OnButtonReset)
EVT_BUTTON(ComboPage_Popup, ComboboxWidgetsPage::OnButtonPopup)
EVT_BUTTON(ComboPage_Dismiss, ComboboxWidgetsPage::OnButtonDismiss)
EVT_BUTTON(ComboPage_Change, ComboboxWidgetsPage::OnButtonChange) EVT_BUTTON(ComboPage_Change, ComboboxWidgetsPage::OnButtonChange)
EVT_BUTTON(ComboPage_Delete, ComboboxWidgetsPage::OnButtonDelete) EVT_BUTTON(ComboPage_Delete, ComboboxWidgetsPage::OnButtonDelete)
EVT_BUTTON(ComboPage_DeleteSel, ComboboxWidgetsPage::OnButtonDeleteSel) EVT_BUTTON(ComboPage_DeleteSel, ComboboxWidgetsPage::OnButtonDeleteSel)
@@ -246,8 +252,7 @@ void ComboboxWidgetsPage::CreateContent()
*/ */
wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
// left pane // upper left pane
wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("&Set style"));
// should be in sync with ComboKind_XXX values // should be in sync with ComboKind_XXX values
static const wxString kinds[] = static const wxString kinds[] =
@@ -262,18 +267,31 @@ void ComboboxWidgetsPage::CreateContent()
WXSIZEOF(kinds), kinds, WXSIZEOF(kinds), kinds,
1, wxRA_SPECIFY_COLS); 1, wxRA_SPECIFY_COLS);
wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); wxSizer *sizerLeftTop = new wxStaticBoxSizer(wxVERTICAL, this, "&Set style");
m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Sort items")); m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&Sort items"));
m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Read only")); m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&Read only"));
m_chkFilename = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&File name")); m_chkFilename = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&File name"));
m_chkFilename->Disable(); // not implemented yet m_chkFilename->Disable(); // not implemented yet
sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer sizerLeftTop->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
sizerLeft->Add(m_radioKind, 0, wxGROW | wxALL, 5); sizerLeftTop->Add(m_radioKind, 0, wxGROW | wxALL, 5);
wxButton *btn = new wxButton(this, ComboPage_Reset, wxT("&Reset")); wxButton *btn = new wxButton(this, ComboPage_Reset, wxT("&Reset"));
sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15); sizerLeftTop->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15);
// lower left pane
wxSizer *sizerLeftBottom = new wxStaticBoxSizer(wxVERTICAL, this, "&Popup");
sizerLeftBottom->Add(new wxButton(this, ComboPage_Popup, "&Show"),
wxSizerFlags().Border().Centre());
sizerLeftBottom->Add(new wxButton(this, ComboPage_Dismiss, "&Hide"),
wxSizerFlags().Border().Centre());
wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL);
sizerLeft->Add(sizerLeftTop);
sizerLeft->AddSpacer(10);
sizerLeft->Add(sizerLeftBottom);
// middle pane // middle pane
wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,

View File

@@ -337,4 +337,13 @@ void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event)
event.Enable(!wxTextEntry::IsEmpty()); event.Enable(!wxTextEntry::IsEmpty());
} }
void wxComboBox::Popup()
{
gtk_combo_box_popup( GTK_COMBO_BOX(m_widget) );
}
void wxComboBox::Dismiss()
{
gtk_combo_box_popdown( GTK_COMBO_BOX(m_widget) );
}
#endif // wxUSE_COMBOBOX #endif // wxUSE_COMBOBOX

View File

@@ -702,6 +702,22 @@ void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event)
event.Enable(IsEditable() && !wxTextEntry::IsEmpty()); event.Enable(IsEditable() && !wxTextEntry::IsEmpty());
} }
void wxComboBox::MSWDoPopupOrDismiss(bool show)
{
wxASSERT_MSG( !HasFlag(wxCB_SIMPLE),
wxT("can't popup/dismiss the list for simple combo box") );
// we *must* set focus to the combobox before showing or hiding the drop
// down as without this we get WM_LBUTTONDOWN messages with invalid HWND
// when hiding it (whether programmatically or manually) resulting in a
// crash when we pass them to IsDialogMessage()
//
// this can be seen in the combo page of the widgets sample under Windows 7
SetFocus();
::SendMessage(GetHwnd(), CB_SHOWDROPDOWN, show, 0);
}
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
void wxComboBox::DoSetToolTip(wxToolTip *tip) void wxComboBox::DoSetToolTip(wxToolTip *tip)