X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d63f7562cf9ccad9c430d4c2e2a8bd416a016d89..b480b80a27bb103fd77e196aaed5a5306456d174:/samples/taborder/taborder.cpp diff --git a/samples/taborder/taborder.cpp b/samples/taborder/taborder.cpp index 62a49736b4..72e99a0fce 100644 --- a/samples/taborder/taborder.cpp +++ b/samples/taborder/taborder.cpp @@ -22,9 +22,28 @@ #endif #ifndef WX_PRECOMP - #include "wx/wx.h" + #include "wx/app.h" + #include "wx/log.h" + #include "wx/frame.h" + #include "wx/menu.h" + #include "wx/sizer.h" + + #include "wx/panel.h" + #include "wx/msgdlg.h" + + #include "wx/button.h" + #include "wx/listbox.h" + #include "wx/stattext.h" + #include "wx/textctrl.h" #endif +#include "wx/notebook.h" + +#ifndef __WXMSW__ + #include "../sample.xpm" +#endif + + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -33,8 +52,8 @@ enum { // file menu - TabOrder_Quit = 100, - TabOrder_About, + TabOrder_Quit = wxID_EXIT, + TabOrder_About = wxID_ABOUT, // navigation menu TabOrder_TabForward = 200, @@ -78,16 +97,16 @@ private: void OnIdle(wxIdleEvent& event); - void DoNavigate(long flags) + void DoNavigate(int flags) { - wxNavigationKeyEvent event; - event.SetFlags(flags); - if ( ProcessEvent(event) ) + if ( m_panel->NavigateIn(flags) ) wxLogStatus(this, _T("Navigation event processed")); else wxLogStatus(this, _T("Navigation event ignored")); } + wxPanel *m_panel; + DECLARE_EVENT_TABLE() }; @@ -96,6 +115,44 @@ class MyPanel : public wxPanel { public: MyPanel(wxWindow *parent); + +private: + wxWindow *CreateButtonPage(wxWindow *parent); + wxWindow *CreateTextPage(wxWindow *parent); +}; + +// a text control which checks if processing Tab presses in controls with +// wxTE_PROCESS_TAB style really works +class MyTabTextCtrl : public wxTextCtrl +{ +public: + MyTabTextCtrl(wxWindow *parent, const wxString& value, int flags = 0) + : wxTextCtrl(parent, wxID_ANY, value, + wxDefaultPosition, wxDefaultSize, + flags) + { + Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MyTabTextCtrl::OnKeyDown)); + } + +private: + void OnKeyDown(wxKeyEvent& event) + { + if ( event.GetKeyCode() == WXK_TAB && + wxMessageBox + ( + _T("Let the Tab be used for navigation?"), + _T("wxWidgets TabOrder sample: Tab key pressed"), + wxICON_QUESTION | wxYES_NO, + this + ) != wxYES ) + { + // skip Skip() below: we consume the Tab press ourselves and so the + // focus shouldn't change + return; + } + + event.Skip(); + } }; // ============================================================================ @@ -137,10 +194,12 @@ MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, _T("TabOrder wxWidgets Sample"), wxDefaultPosition, wxSize(700, 450)) { + SetIcon(wxICON(sample)); + wxMenu *menuFile = new wxMenu; - menuFile->Append(TabOrder_About, _T("&About...\tF1")); + menuFile->Append(TabOrder_About); menuFile->AppendSeparator(); - menuFile->Append(TabOrder_Quit, _T("E&xit\tAlt-X"), _T("Quit the sample")); + menuFile->Append(TabOrder_Quit); wxMenu *menuNav = new wxMenu; menuNav->Append(TabOrder_TabForward, _T("Tab &forward\tCtrl-F"), @@ -154,7 +213,7 @@ MyFrame::MyFrame() SetMenuBar(mbar); - new MyPanel(this); + m_panel = new MyPanel(this); CreateStatusBar(StatusPane_Max); } @@ -209,16 +268,60 @@ void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) ) MyPanel::MyPanel(wxWindow *parent) : wxPanel(parent, wxID_ANY) +{ + wxNotebook *notebook = new wxNotebook(this, wxID_ANY); + notebook->AddPage(CreateButtonPage(notebook), _T("Button")); + notebook->AddPage(CreateTextPage(notebook), _T("Text")); + + wxSizer *sizerV = new wxBoxSizer(wxVERTICAL); + sizerV->Add(notebook, wxSizerFlags(1).Expand()); + + wxListBox *lbox = new wxListBox(this, wxID_ANY); + lbox->AppendString(_T("Just a")); + lbox->AppendString(_T("simple")); + lbox->AppendString(_T("listbox")); + sizerV->Add(lbox, wxSizerFlags(1).Expand()); + + SetSizerAndFit(sizerV); +} + +wxWindow *MyPanel::CreateButtonPage(wxWindow *parent) +{ + wxSizerFlags flagsBorder = wxSizerFlags().Border().Centre(); + + wxPanel *page = new wxPanel(parent); + wxSizer *sizerPage = new wxBoxSizer(wxHORIZONTAL); + sizerPage->Add(new wxButton(page, wxID_ANY, _T("&First")), flagsBorder); + sizerPage->Add(new wxStaticText(page, wxID_ANY, _T("[st&atic]")), + flagsBorder); + sizerPage->Add(new wxButton(page, wxID_ANY, _T("&Second")), flagsBorder); + + page->SetSizer(sizerPage); + + return page; +} + +wxWindow *MyPanel::CreateTextPage(wxWindow *parent) { wxSizerFlags flagsBorder = wxSizerFlags().Border(); + wxSizer *sizerPage = new wxBoxSizer(wxVERTICAL); + wxPanel *page = new wxPanel(parent); + wxSizer *sizerH = new wxBoxSizer(wxHORIZONTAL); - sizerH->Add(new wxButton(this, wxID_ANY, _T("&First")), flagsBorder); - sizerH->Add(new wxButton(this, wxID_ANY, _T("&Second")), flagsBorder); + sizerH->Add(new wxStaticText(page, wxID_ANY, _T("&Label:")), flagsBorder); + sizerH->Add(new MyTabTextCtrl(page, _T("TAB ignored here")), flagsBorder); + sizerPage->Add(sizerH, wxSizerFlags(1).Expand()); - wxSizer *sizerV = new wxBoxSizer(wxVERTICAL); - sizerV->Add(sizerH, wxSizerFlags(1).Expand()); - sizerV->Add(new wxListBox(this, wxID_ANY), wxSizerFlags(1).Expand()); - SetSizerAndFit(sizerV); + sizerH = new wxBoxSizer(wxHORIZONTAL); + sizerH->Add(new wxStaticText(page, wxID_ANY, _T("&Another one:")), + flagsBorder); + sizerH->Add(new MyTabTextCtrl(page, _T("press Tab here"), wxTE_PROCESS_TAB), + flagsBorder); + sizerPage->Add(sizerH, wxSizerFlags(1).Expand()); + + page->SetSizer(sizerPage); + + return page; }