| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: taborder.cpp
- // Purpose: Sample for testing TAB navigation
- // Author: Vadim Zeitlin
- // Copyright: (c) 2007 Vadim Zeitlin
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- // ============================================================================
- // declarations
- // ============================================================================
- // ----------------------------------------------------------------------------
- // headers
- // ----------------------------------------------------------------------------
- #include "wx/wxprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- #ifndef WX_PRECOMP
- #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 wxHAS_IMAGES_IN_RESOURCES
- #include "../sample.xpm"
- #endif
- // ----------------------------------------------------------------------------
- // constants
- // ----------------------------------------------------------------------------
- // menu commands and controls ids
- enum
- {
- // file menu
- TabOrder_Quit = wxID_EXIT,
- TabOrder_About = wxID_ABOUT,
- // navigation menu
- TabOrder_TabForward = 200,
- TabOrder_TabBackward,
- TabOrder_Max
- };
- // status panes: first one is for temporary messages, the second one shows
- // current focus
- enum
- {
- StatusPane_Default,
- StatusPane_Focus,
- StatusPane_Max
- };
- // ----------------------------------------------------------------------------
- // declarations of the classes used in this sample
- // ----------------------------------------------------------------------------
- // the main application class
- class MyApp : public wxApp
- {
- public:
- virtual bool OnInit();
- };
- // and the main sample window
- class MyFrame : public wxFrame
- {
- public:
- MyFrame();
- private:
- void OnAbout(wxCommandEvent& event);
- void OnQuit(wxCommandEvent& event);
- void OnTabForward(wxCommandEvent& event);
- void OnTabBackward(wxCommandEvent& event);
- void OnIdle(wxIdleEvent& event);
- void DoNavigate(int flags)
- {
- if ( m_panel->NavigateIn(flags) )
- {
- wxLogStatus(this, wxT("Navigation event processed"));
- }
- else
- {
- wxLogStatus(this, wxT("Navigation event ignored"));
- }
- }
- wxPanel *m_panel;
- wxDECLARE_EVENT_TABLE();
- };
- // and the panel taking up MyFrame client area
- 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
- (
- wxT("Let the Tab be used for navigation?"),
- wxT("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();
- }
- };
- // ============================================================================
- // implementation
- // ============================================================================
- // ----------------------------------------------------------------------------
- // MyApp
- // ----------------------------------------------------------------------------
- IMPLEMENT_APP(MyApp)
- bool MyApp::OnInit()
- {
- if ( !wxApp::OnInit() )
- return false;
- MyFrame *frame = new MyFrame;
- frame->Show(true);
- return true;
- }
- // ----------------------------------------------------------------------------
- // MyFrame
- // ----------------------------------------------------------------------------
- wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
- EVT_MENU(TabOrder_Quit, MyFrame::OnQuit)
- EVT_MENU(TabOrder_About, MyFrame::OnAbout)
- EVT_MENU(TabOrder_TabForward, MyFrame::OnTabForward)
- EVT_MENU(TabOrder_TabBackward, MyFrame::OnTabBackward)
- EVT_IDLE(MyFrame::OnIdle)
- wxEND_EVENT_TABLE()
- MyFrame::MyFrame()
- : wxFrame(NULL, wxID_ANY, wxT("TabOrder wxWidgets Sample"),
- wxDefaultPosition, wxSize(700, 450))
- {
- SetIcon(wxICON(sample));
- wxMenu *menuFile = new wxMenu;
- menuFile->Append(TabOrder_About);
- menuFile->AppendSeparator();
- menuFile->Append(TabOrder_Quit);
- wxMenu *menuNav = new wxMenu;
- menuNav->Append(TabOrder_TabForward, wxT("Tab &forward\tCtrl-F"),
- wxT("Emulate a <Tab> press"));
- menuNav->Append(TabOrder_TabBackward, wxT("Tab &backward\tCtrl-B"),
- wxT("Emulate a <Shift-Tab> press"));
- wxMenuBar *mbar = new wxMenuBar;
- mbar->Append(menuFile, wxT("&File"));
- mbar->Append(menuNav, wxT("&Navigate"));
- SetMenuBar(mbar);
- m_panel = new MyPanel(this);
- CreateStatusBar(StatusPane_Max);
- }
- void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
- {
- Close(true);
- }
- void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
- {
- wxMessageBox(wxT("Tab navigation sample\n(c) 2007 Vadim Zeitlin"),
- wxT("About TabOrder wxWidgets Sample"), wxOK, this);
- }
- void MyFrame::OnTabForward(wxCommandEvent& WXUNUSED(event))
- {
- DoNavigate(wxNavigationKeyEvent::IsForward | wxNavigationKeyEvent::FromTab);
- }
- void MyFrame::OnTabBackward(wxCommandEvent& WXUNUSED(event))
- {
- DoNavigate(wxNavigationKeyEvent::IsBackward | wxNavigationKeyEvent::FromTab);
- }
- void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
- {
- // track the window which has the focus in the status bar
- static wxWindow *s_windowFocus = NULL;
- wxWindow *focus = wxWindow::FindFocus();
- if ( focus != s_windowFocus )
- {
- s_windowFocus = focus;
- wxString msg;
- if ( focus )
- {
- msg.Printf(wxT("Focus is at %s"), s_windowFocus->GetName().c_str());
- }
- else
- {
- msg = wxT("No focus");
- }
- SetStatusText(msg, StatusPane_Focus);
- }
- }
- // ----------------------------------------------------------------------------
- // MyPanel
- // ----------------------------------------------------------------------------
- MyPanel::MyPanel(wxWindow *parent)
- : wxPanel(parent, wxID_ANY)
- {
- wxNotebook *notebook = new wxNotebook(this, wxID_ANY);
- notebook->AddPage(CreateButtonPage(notebook), wxT("Button"));
- notebook->AddPage(CreateTextPage(notebook), wxT("Text"));
- wxSizer *sizerV = new wxBoxSizer(wxVERTICAL);
- sizerV->Add(notebook, wxSizerFlags(1).Expand());
- wxListBox *lbox = new wxListBox(this, wxID_ANY);
- lbox->AppendString(wxT("Just a"));
- lbox->AppendString(wxT("simple"));
- lbox->AppendString(wxT("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, wxT("&First")), flagsBorder);
- sizerPage->Add(new wxStaticText(page, wxID_ANY, wxT("[st&atic]")),
- flagsBorder);
- sizerPage->Add(new wxButton(page, wxID_ANY, wxT("&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 wxStaticText(page, wxID_ANY, wxT("&Label:")), flagsBorder);
- sizerH->Add(new MyTabTextCtrl(page, wxT("TAB ignored here")), flagsBorder);
- sizerPage->Add(sizerH, wxSizerFlags(1).Expand());
- sizerH = new wxBoxSizer(wxHORIZONTAL);
- sizerH->Add(new wxStaticText(page, wxID_ANY, wxT("&Another one:")),
- flagsBorder);
- sizerH->Add(new MyTabTextCtrl(page, wxT("press Tab here"), wxTE_PROCESS_TAB),
- flagsBorder);
- sizerPage->Add(sizerH, wxSizerFlags(1).Expand());
- page->SetSizer(sizerPage);
- return page;
- }
|