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); }
#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
enum
{
ComboPage_Reset = wxID_HIGHEST,
+ ComboPage_Popup,
+ ComboPage_Dismiss,
ComboPage_SetCurrent,
ComboPage_CurText,
ComboPage_InsertionPointText,
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);
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)
*/
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[] =
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,
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)