wxwidgets/samples/taborder/taborder.cpp
Vadim Zeitlin 4f4c5fcfdf Use nullptr instead of NULL in the code and documentation
This is a combination of running clang-tidy with modernize-use-nullptr
check for some ports (GTK, X11, OSX) and manual changes to the ports for
which it couldn't be used easily (MSW, DFB) and also manually updating
the docs.

Also replace NULL with null or nullptr in the comments as this is more
consistent with the use of nullptr in the code and makes it simpler to
grep for the remaining occurrences of NULL itself.

And also use null in the assert messages.

Only a few occurrences of "NULL" are still left in non-C files, mostly
corresponding to unclear comments or string output which it might not be
safe to change.
2022-10-18 01:25:25 +02:00

327 lines
8.7 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() override;
};
// 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(nullptr, 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 = nullptr;
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;
}