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:
@@ -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:
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -88,6 +88,8 @@ public:
|
|||||||
{
|
{
|
||||||
return wxItemContainer::GetStringSelection();
|
return wxItemContainer::GetStringSelection();
|
||||||
}
|
}
|
||||||
|
virtual void Popup();
|
||||||
|
virtual void Dismiss();
|
||||||
|
|
||||||
virtual void Clear()
|
virtual void Clear()
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
@@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user