328 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			328 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // 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"
 | |
| 
 | |
| 
 | |
| #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() wxOVERRIDE;
 | |
| };
 | |
| 
 | |
| // 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, "Navigation event processed");
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             wxLogStatus(this, "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)
 | |
|     {
 | |
|         Bind(wxEVT_KEY_DOWN, &MyTabTextCtrl::OnKeyDown, this);
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     void OnKeyDown(wxKeyEvent& event)
 | |
|     {
 | |
|         if ( event.GetKeyCode() == WXK_TAB &&
 | |
|                 wxMessageBox
 | |
|                 (
 | |
|                     "Let the Tab be used for navigation?",
 | |
|                     "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
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| wxIMPLEMENT_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, "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, "Tab &forward\tCtrl-F",
 | |
|                     "Emulate a <Tab> press");
 | |
|     menuNav->Append(TabOrder_TabBackward, "Tab &backward\tCtrl-B",
 | |
|                     "Emulate a <Shift-Tab> press");
 | |
| 
 | |
|     wxMenuBar *mbar = new wxMenuBar;
 | |
|     mbar->Append(menuFile, "&File");
 | |
|     mbar->Append(menuNav, "&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("Tab navigation sample\n(c) 2007 Vadim Zeitlin",
 | |
|                  "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("Focus is at %s", s_windowFocus->GetName());
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             msg = "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), "Button");
 | |
|     notebook->AddPage(CreateTextPage(notebook), "Text");
 | |
| 
 | |
|     wxSizer *sizerV = new wxBoxSizer(wxVERTICAL);
 | |
|     sizerV->Add(notebook, wxSizerFlags(1).Expand());
 | |
| 
 | |
|     wxListBox *lbox = new wxListBox(this, wxID_ANY);
 | |
|     lbox->AppendString("Just a");
 | |
|     lbox->AppendString("simple");
 | |
|     lbox->AppendString("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, "&First"), flagsBorder);
 | |
|     sizerPage->Add(new wxStaticText(page, wxID_ANY, "[st&atic]"),
 | |
|                    flagsBorder);
 | |
|     sizerPage->Add(new wxButton(page, wxID_ANY, "&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, "&Label:"), flagsBorder);
 | |
|     sizerH->Add(new MyTabTextCtrl(page, "TAB ignored here"), flagsBorder);
 | |
|     sizerPage->Add(sizerH, wxSizerFlags(1).Expand());
 | |
| 
 | |
|     sizerH = new wxBoxSizer(wxHORIZONTAL);
 | |
|     sizerH->Add(new wxStaticText(page, wxID_ANY, "&Another one:"),
 | |
|                 flagsBorder);
 | |
|     sizerH->Add(new MyTabTextCtrl(page, "press Tab here", wxTE_PROCESS_TAB),
 | |
|                 flagsBorder);
 | |
|     sizerPage->Add(sizerH, wxSizerFlags(1).Expand());
 | |
| 
 | |
|     page->SetSizer(sizerPage);
 | |
| 
 | |
|     return page;
 | |
| }
 | |
| 
 |