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.
- wxGraphicsContext is now enabled by default if supported by the platform.
- Fix building with using system libpng 1.4 (Volker Grabsch).
- Add wxComboBox::Popup() and Dismiss() methods (Igor Korot).
GTK:

View File

@@ -47,6 +47,9 @@ public:
virtual int GetSelection() 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
// dropdown is shown and the user selected, but not yet accepted, a value
// different from the old one in it

View File

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

View File

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

View File

@@ -243,5 +243,23 @@ public:
The text to set.
*/
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
{
ComboPage_Reset = wxID_HIGHEST,
ComboPage_Popup,
ComboPage_Dismiss,
ComboPage_SetCurrent,
ComboPage_CurText,
ComboPage_InsertionPointText,
@@ -102,6 +104,8 @@ public:
protected:
// event handlers
void OnButtonReset(wxCommandEvent& event);
void OnButtonPopup(wxCommandEvent&) { m_combobox->Popup(); }
void OnButtonDismiss(wxCommandEvent&) { m_combobox->Dismiss(); }
void OnButtonChange(wxCommandEvent& event);
void OnButtonDelete(wxCommandEvent& event);
void OnButtonDeleteSel(wxCommandEvent& event);
@@ -170,6 +174,8 @@ private:
BEGIN_EVENT_TABLE(ComboboxWidgetsPage, WidgetsPage)
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_Delete, ComboboxWidgetsPage::OnButtonDelete)
EVT_BUTTON(ComboPage_DeleteSel, ComboboxWidgetsPage::OnButtonDeleteSel)
@@ -246,8 +252,7 @@ void ComboboxWidgetsPage::CreateContent()
*/
wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
// left pane
wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("&Set style"));
// upper left pane
// should be in sync with ComboKind_XXX values
static const wxString kinds[] =
@@ -262,18 +267,31 @@ void ComboboxWidgetsPage::CreateContent()
WXSIZEOF(kinds), kinds,
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_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Read only"));
m_chkFilename = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&File name"));
m_chkSort = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&Sort items"));
m_chkReadonly = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&Read only"));
m_chkFilename = CreateCheckBoxAndAddToSizer(sizerLeftTop, wxT("&File name"));
m_chkFilename->Disable(); // not implemented yet
sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
sizerLeft->Add(m_radioKind, 0, wxGROW | wxALL, 5);
sizerLeftTop->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
sizerLeftTop->Add(m_radioKind, 0, wxGROW | wxALL, 5);
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
wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY,

View File

@@ -337,4 +337,13 @@ void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event)
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

View File

@@ -702,6 +702,22 @@ void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent& event)
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
void wxComboBox::DoSetToolTip(wxToolTip *tip)