X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eca15c0d5497309e402d4bb91f8e479b4fb70fa9..f1d5aa4eca541a2f90044a63f555985d6bd4adf3:/samples/notebook/notebook.cpp?ds=sidebyside diff --git a/samples/notebook/notebook.cpp b/samples/notebook/notebook.cpp index c9e3cb44ca..14f3fd951c 100644 --- a/samples/notebook/notebook.cpp +++ b/samples/notebook/notebook.cpp @@ -22,6 +22,8 @@ #include "wx/imaglist.h" #include "wx/artprov.h" +#include "wx/cshelp.h" +#include "wx/utils.h" #include "notebook.h" #if !defined(__WXMSW__) && !defined(__WXPM__) @@ -32,6 +34,13 @@ IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + +#if wxUSE_HELP + wxHelpProvider::Set( new wxSimpleHelpProvider ); +#endif + // Create the main window MyFrame *frame = new MyFrame(); @@ -52,6 +61,10 @@ wxPanel *CreateUserCreatedPage(wxBookCtrlBase *parent) { wxPanel *panel = new wxPanel(parent); +#if wxUSE_HELP + panel->SetHelpText( wxT( "Panel with a Button" ) ); +#endif + (void) new wxButton( panel, wxID_ANY, wxT("Button"), wxPoint(10, 10), wxDefaultSize ); @@ -62,6 +75,10 @@ wxPanel *CreateRadioButtonsPage(wxBookCtrlBase *parent) { wxPanel *panel = new wxPanel(parent); +#if wxUSE_HELP + panel->SetHelpText( wxT( "Panel with some Radio Buttons" ) ); +#endif + wxString animals[] = { wxT("Fox"), wxT("Hare"), wxT("Rabbit"), wxT("Sabre-toothed tiger"), wxT("T Rex") }; @@ -87,6 +104,10 @@ wxPanel *CreateVetoPage(wxBookCtrlBase *parent) { wxPanel *panel = new wxPanel(parent); +#if wxUSE_HELP + panel->SetHelpText( wxT( "An empty panel" ) ); +#endif + (void) new wxStaticText( panel, wxID_ANY, wxT("This page intentionally left blank"), wxPoint(10, 10) ); @@ -97,6 +118,10 @@ wxPanel *CreateBigButtonPage(wxBookCtrlBase *parent) { wxPanel *panel = new wxPanel(parent); +#if wxUSE_HELP + panel->SetHelpText( wxT( "Panel with a maximized button" ) ); +#endif + wxButton *buttonBig = new wxButton(panel, wxID_ANY, wxT("Maximized button")); wxBoxSizer *sizerPanel = new wxBoxSizer(wxVERTICAL); @@ -111,6 +136,10 @@ wxPanel *CreateInsertPage(wxBookCtrlBase *parent) { wxPanel *panel = new wxPanel(parent); +#if wxUSE_HELP + panel->SetHelpText( wxT( "Maroon panel" ) ); +#endif + panel->SetBackgroundColour( wxColour( wxT("MAROON") ) ); (void) new wxStaticText( panel, wxID_ANY, wxT("This page has been inserted, not added."), wxPoint(10, 10) ); @@ -177,8 +206,12 @@ wxPanel *CreatePage(wxBookCtrlBase *parent, const wxString&pageName) } MyFrame::MyFrame() - : wxFrame(NULL, wxID_ANY, wxString(wxT("wxWidgets book controls sample"))) + : wxFrame(NULL, wxID_ANY, wxString(wxT("wxWidgets book controls sample"))) { +#if wxUSE_HELP + SetExtraStyle(wxFRAME_EX_CONTEXTHELP); +#endif // wxUSE_HELP + #if wxUSE_NOTEBOOK m_type = Type_Notebook; #elif wxUSE_CHOICEBOOK @@ -211,6 +244,9 @@ MyFrame::MyFrame() #if wxUSE_TREEBOOK menuType->AppendRadioItem(ID_BOOK_TREEBOOK, wxT("&Treebook\tCtrl-4")); #endif +#if wxUSE_TOOLBOOK + menuType->AppendRadioItem(ID_BOOK_TOOLBOOK, wxT("T&oolbook\tCtrl-5")); +#endif menuType->Check(ID_BOOK_NOTEBOOK + m_type, true); @@ -221,17 +257,26 @@ MyFrame::MyFrame() menuOrient->AppendRadioItem(ID_ORIENT_LEFT, wxT("&Left\tCtrl-8")); menuOrient->AppendRadioItem(ID_ORIENT_RIGHT, wxT("&Right\tCtrl-9")); - wxMenu *menuOperations = new wxMenu; - menuOperations->Append(ID_ADD_PAGE, wxT("&Add page\tAlt-A")); - menuOperations->Append(ID_INSERT_PAGE, wxT("&Insert page\tAlt-I")); - menuOperations->Append(ID_DELETE_CUR_PAGE, wxT("&Delete current page\tAlt-D")); - menuOperations->Append(ID_DELETE_LAST_PAGE, wxT("D&elete last page\tAlt-L")); - menuOperations->Append(ID_NEXT_PAGE, wxT("&Next page\tAlt-N")); + wxMenu *menuPageOperations = new wxMenu; + menuPageOperations->Append(ID_ADD_PAGE, wxT("&Add page\tAlt-A")); + menuPageOperations->Append(ID_ADD_PAGE_NO_SELECT, wxT("&Add page (don't select)\tAlt-B")); + menuPageOperations->Append(ID_INSERT_PAGE, wxT("&Insert page\tAlt-I")); + menuPageOperations->Append(ID_DELETE_CUR_PAGE, wxT("&Delete current page\tAlt-D")); + menuPageOperations->Append(ID_DELETE_LAST_PAGE, wxT("D&elete last page\tAlt-L")); + menuPageOperations->Append(ID_NEXT_PAGE, wxT("&Next page\tAlt-N")); #if wxUSE_TREEBOOK - menuOperations->AppendSeparator(); - menuOperations->Append(ID_ADD_PAGE_BEFORE, wxT("Insert page &before\tAlt-B")); - menuOperations->Append(ID_ADD_SUB_PAGE, wxT("Add s&ub page\tAlt-U")); + menuPageOperations->AppendSeparator(); + menuPageOperations->Append(ID_ADD_PAGE_BEFORE, wxT("Insert page &before\tAlt-B")); + menuPageOperations->Append(ID_ADD_SUB_PAGE, wxT("Add s&ub page\tAlt-U")); #endif + menuPageOperations->AppendSeparator(); + menuPageOperations->Append(ID_GO_HOME, wxT("Go to the first page\tCtrl-F")); + + wxMenu *menuOperations = new wxMenu; +#if wxUSE_HELP + menuOperations->Append(ID_CONTEXT_HELP, wxT("&Context help\tCtrl-F1")); +#endif // wxUSE_HELP + menuOperations->Append(ID_HITTEST, wxT("&Hit test\tCtrl-H")); wxMenu *menuFile = new wxMenu; menuFile->Append(wxID_ANY, wxT("&Type"), menuType, wxT("Type of control")); @@ -245,6 +290,7 @@ MyFrame::MyFrame() wxMenuBar *menuBar = new wxMenuBar; menuBar->Append(menuFile, wxT("&File")); + menuBar->Append(menuPageOperations, wxT("&Pages")); menuBar->Append(menuOperations, wxT("&Operations")); SetMenuBar(menuBar); @@ -286,7 +332,6 @@ MyFrame::MyFrame() m_panel->SetSizer(m_sizerFrame); - m_sizerFrame->Fit(this); m_sizerFrame->SetSizeHints(this); Centre(wxBOTH); @@ -311,78 +356,79 @@ MyFrame::~MyFrame() #define CASE_NOTEBOOK(x) #endif -#if wxUSE_CHOICEBOOK - #define CASE_CHOICEBOOK(x) case Type_Choicebook: x; break; -#else - #define CASE_CHOICEBOOK(x) -#endif - #if wxUSE_LISTBOOK #define CASE_LISTBOOK(x) case Type_Listbook: x; break; #else #define CASE_LISTBOOK(x) #endif +#if wxUSE_CHOICEBOOK + #define CASE_CHOICEBOOK(x) case Type_Choicebook: x; break; +#else + #define CASE_CHOICEBOOK(x) +#endif + #if wxUSE_TREEBOOK #define CASE_TREEBOOK(x) case Type_Treebook: x; break; #else #define CASE_TREEBOOK(x) #endif -#define DISPATCH_ON_TYPE(before, nb, lb, cb, tb, after) \ +#if wxUSE_TOOLBOOK + #define CASE_TOOLBOOK(x) case Type_Toolbook: x; break; +#else + #define CASE_TOOLBOOK(x) +#endif + +#define DISPATCH_ON_TYPE(before, nb, lb, cb, tb, toolb, after) \ switch ( m_type ) \ { \ CASE_NOTEBOOK(before nb after) \ - CASE_CHOICEBOOK(before cb after) \ CASE_LISTBOOK(before lb after) \ + CASE_CHOICEBOOK(before cb after) \ CASE_TREEBOOK(before tb after) \ + CASE_TOOLBOOK(before toolb after) \ \ default: \ wxFAIL_MSG( _T("unknown book control type") ); \ } -int MyFrame::TranslateBookFlag(int nb, int lb, int chb, int tbk) const +int MyFrame::TranslateBookFlag(int nb, int lb, int chb, int tbk, int toolbk) const { int flag = 0; - DISPATCH_ON_TYPE(flag =, nb, lb, chb, tbk, + 0); + DISPATCH_ON_TYPE(flag =, nb, lb, chb, tbk, toolbk, + 0); return flag; } void MyFrame::RecreateBook() { -#define SELECT_FLAG(flag) \ - TranslateBookFlag(wxNB_##flag, wxCHB_##flag, wxLB_##flag, wxTBK_##flag) - int flags; switch ( m_orient ) { case ID_ORIENT_TOP: - flags = SELECT_FLAG(TOP); + flags = wxBK_TOP; break; case ID_ORIENT_BOTTOM: - flags = SELECT_FLAG(BOTTOM); + flags = wxBK_BOTTOM; break; case ID_ORIENT_LEFT: - flags = SELECT_FLAG(LEFT); + flags = wxBK_LEFT; break; case ID_ORIENT_RIGHT: - flags = SELECT_FLAG(RIGHT); + flags = wxBK_RIGHT; break; default: - flags = SELECT_FLAG(DEFAULT); + flags = wxBK_DEFAULT; } -#undef SELECT_FLAG - if ( m_multi && m_type == Type_Notebook ) flags |= wxNB_MULTILINE; - flags |= wxDOUBLE_BORDER; wxBookCtrlBase *oldBook = m_bookCtrl; @@ -390,9 +436,10 @@ void MyFrame::RecreateBook() DISPATCH_ON_TYPE(m_bookCtrl = new, wxNotebook, - wxChoicebook, wxListbook, + wxChoicebook, wxTreebook, + wxToolbook, (m_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, flags)); if ( !m_bookCtrl ) @@ -430,7 +477,7 @@ void MyFrame::RecreateBook() if ( parent != wxNOT_FOUND ) { wxStaticCast(m_bookCtrl, wxTreebook)-> - AddSubPage(parent, page, str, false, image); + InsertSubPage(parent, page, str, false, image); // skip adding it again below continue; @@ -470,12 +517,17 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) // Operations menu EVT_MENU(ID_ADD_PAGE, MyFrame::OnAddPage) + EVT_MENU(ID_ADD_PAGE_NO_SELECT, MyFrame::OnAddPageNoSelect) EVT_MENU(ID_INSERT_PAGE, MyFrame::OnInsertPage) EVT_MENU(ID_DELETE_CUR_PAGE, MyFrame::OnDeleteCurPage) EVT_MENU(ID_DELETE_LAST_PAGE, MyFrame::OnDeleteLastPage) EVT_MENU(ID_NEXT_PAGE, MyFrame::OnNextPage) - EVT_MENU(ID_ADD_SUB_PAGE, MyFrame::OnAddSubPage) - EVT_MENU(ID_ADD_PAGE_BEFORE, MyFrame::OnAddPageBefore) + EVT_MENU(ID_GO_HOME, MyFrame::OnGoHome) + +#if wxUSE_HELP + EVT_MENU(ID_CONTEXT_HELP, MyFrame::OnContextHelp) +#endif // wxUSE_HELP + EVT_MENU(ID_HITTEST, MyFrame::OnHitTest) // Book controls #if wxUSE_NOTEBOOK @@ -490,20 +542,66 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_CHOICEBOOK_PAGE_CHANGED(wxID_ANY, MyFrame::OnChoicebook) EVT_CHOICEBOOK_PAGE_CHANGING(wxID_ANY, MyFrame::OnChoicebook) #endif -#if wxUSE_CHOICEBOOK +#if wxUSE_TREEBOOK EVT_TREEBOOK_PAGE_CHANGED(wxID_ANY, MyFrame::OnTreebook) EVT_TREEBOOK_PAGE_CHANGING(wxID_ANY, MyFrame::OnTreebook) + + EVT_MENU(ID_ADD_SUB_PAGE, MyFrame::OnAddSubPage) + EVT_MENU(ID_ADD_PAGE_BEFORE, MyFrame::OnAddPageBefore) + EVT_UPDATE_UI_RANGE(ID_ADD_PAGE_BEFORE, ID_ADD_SUB_PAGE, + MyFrame::OnUpdateTreeMenu) +#endif +#if wxUSE_TOOLBOOK + EVT_TOOLBOOK_PAGE_CHANGED(wxID_ANY, MyFrame::OnToolbook) + EVT_TOOLBOOK_PAGE_CHANGING(wxID_ANY, MyFrame::OnToolbook) #endif // Update title in idle time EVT_IDLE(MyFrame::OnIdle) - -#if wxUSE_TREEBOOK - EVT_UPDATE_UI_RANGE(ID_ADD_PAGE_BEFORE, ID_ADD_SUB_PAGE, - MyFrame::OnUpdateTreeMenu) -#endif // wxUSE_TREEBOOK END_EVENT_TABLE() +#if wxUSE_HELP + +void MyFrame::OnContextHelp(wxCommandEvent& WXUNUSED(event)) +{ + // launches local event loop + wxContextHelp ch( this ); +} + +#endif // wxUSE_HELP + +void MyFrame::AddFlagStrIfFlagPresent(wxString & flagStr, long flags, long flag, const wxChar * flagName) const +{ + if( (flags & flag) == flag ) + { + if( !flagStr.empty() ) + flagStr += _T(" | "); + flagStr += flagName; + } +} + +void MyFrame::OnHitTest(wxCommandEvent& WXUNUSED(event)) +{ + wxBookCtrlBase * book = GetCurrentBook(); + const wxPoint pt = ::wxGetMousePosition(); + + long flags; + int pagePos = book->HitTest( book->ScreenToClient(pt), &flags ); + + wxString flagsStr; + + AddFlagStrIfFlagPresent( flagsStr, flags, wxBK_HITTEST_NOWHERE, _T("wxBK_HITTEST_NOWHERE") ); + AddFlagStrIfFlagPresent( flagsStr, flags, wxBK_HITTEST_ONICON, _T("wxBK_HITTEST_ONICON") ); + AddFlagStrIfFlagPresent( flagsStr, flags, wxBK_HITTEST_ONLABEL, _T("wxBK_HITTEST_ONLABEL") ); + AddFlagStrIfFlagPresent( flagsStr, flags, wxBK_HITTEST_ONPAGE, _T("wxBK_HITTEST_ONPAGE") ); + + wxLogMessage(wxT("HitTest at (%d,%d): %d: %s"), + pt.x, + pt.y, + pagePos, + flagsStr.c_str()); +} + void MyFrame::OnType(wxCommandEvent& event) { m_type = wx_static_cast(BookType, event.GetId() - ID_BOOK_NOTEBOOK); @@ -554,6 +652,11 @@ void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event)) wxPanel *MyFrame::CreateNewPage() const { wxPanel *panel = new wxPanel(m_bookCtrl, wxID_ANY ); + +#if wxUSE_HELP + panel->SetHelpText( wxT( "Panel with \"First\" and \"Second\" buttons" ) ); +#endif + (void) new wxButton(panel, wxID_ANY, wxT("First button"), wxPoint(10, 10)); (void) new wxButton(panel, wxID_ANY, wxT("Second button"), wxPoint(50, 100)); @@ -578,6 +681,24 @@ void MyFrame::OnAddPage(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnAddPageNoSelect(wxCommandEvent& WXUNUSED(event)) +{ + wxBookCtrlBase *currBook = GetCurrentBook(); + + if ( currBook ) + { + static unsigned s_pageAdded = 0; + currBook->AddPage(CreateNewPage(), + wxString::Format + ( + ADDED_PAGE_NAME wxT("%u"), + ++s_pageAdded + ), + false, + GetIconIndex(currBook)); + } +} + #if wxUSE_TREEBOOK void MyFrame::OnAddSubPage(wxCommandEvent& WXUNUSED(event)) { @@ -592,15 +713,18 @@ void MyFrame::OnAddSubPage(wxCommandEvent& WXUNUSED(event)) } static unsigned s_subPageAdded = 0; - currBook->AddSubPage(selPos, - CreateNewPage(), - wxString::Format - ( - ADDED_SUB_PAGE_NAME wxT("%u"), - ++s_subPageAdded - ), - true, - GetIconIndex(currBook)); + currBook->InsertSubPage + ( + selPos, + CreateNewPage(), + wxString::Format + ( + ADDED_SUB_PAGE_NAME wxT("%u"), + ++s_subPageAdded + ), + true, + GetIconIndex(currBook) + ); } } @@ -688,6 +812,18 @@ void MyFrame::OnNextPage(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnGoHome(wxCommandEvent& WXUNUSED(event)) +{ + wxBookCtrlBase *currBook = GetCurrentBook(); + + if ( currBook ) + { + // ChangeSelection shouldn't send any events, SetSelection() should + currBook->ChangeSelection(0); + //currBook->SetSelection(0); + } +} + void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) ) { static int s_nPages = wxNOT_FOUND; @@ -734,13 +870,6 @@ void MyFrame::OnBookCtrl(wxBookCtrlBaseEvent& event) _T("wxNotebook") }, #endif // wxUSE_NOTEBOOK -#if wxUSE_CHOICEBOOK - { - wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED, - wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, - _T("wxChoicebook") - }, -#endif // wxUSE_CHOICEBOOK #if wxUSE_LISTBOOK { wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED, @@ -748,6 +877,13 @@ void MyFrame::OnBookCtrl(wxBookCtrlBaseEvent& event) _T("wxListbook") }, #endif // wxUSE_LISTBOOK +#if wxUSE_CHOICEBOOK + { + wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED, + wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, + _T("wxChoicebook") + }, +#endif // wxUSE_CHOICEBOOK #if wxUSE_TREEBOOK { wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED, @@ -755,6 +891,13 @@ void MyFrame::OnBookCtrl(wxBookCtrlBaseEvent& event) _T("wxTreebook") }, #endif // wxUSE_TREEBOOK +#if wxUSE_TOOLBOOK + { + wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED, + wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, + _T("wxToolbook") + }, +#endif // wxUSE_TOOLBOOK }; @@ -772,8 +915,11 @@ void MyFrame::OnBookCtrl(wxBookCtrlBaseEvent& event) else if ( eventType == ei.typeChanging ) { const int idx = event.GetOldSelection(); + + // NB: can't use wxStaticCast here as wxBookCtrlBase is not in + // wxRTTI const wxBookCtrlBase * const - book = wxStaticCast(event.GetEventObject(), wxBookCtrlBase); + book = wx_static_cast(wxBookCtrlBase *, event.GetEventObject()); if ( idx != wxNOT_FOUND && book && book->GetPageText(idx) == VETO_PAGE_NAME ) { @@ -817,4 +963,3 @@ void MyFrame::OnBookCtrl(wxBookCtrlBaseEvent& event) m_text->SetInsertionPointEnd(); #endif } -