The call to this function generates the page changing events.
+This function is deprecated and should not be used in new code. Please use the
+\helpref{ChangeSelection}{wxnotebookchangeselection} function instead.
+
\wxheading{See also}
\helpref{wxNotebook::GetSelection}{wxnotebookgetselection}
+
+\membersection{wxNotebook::ChangeSelection}\label{wxnotebookchangeselection}
+
+\func{int}{ChangeSelection}{\param{size\_t}{ page}}
+
+Changes the selection for the given page, returning the previous selection.
+
+The call to this function \emph{does not} generate the page changing events.
+This is the only difference with \helpref{SetSelection}{wxnotebooksetselection}.
+See \helpref{this topic}{progevent} for more info.
The call to this function generates the page changing events.
+This function is deprecated and should not be used in new code. Please use the
+\helpref{ChangeSelection}{wxtreebookchangeselection} function instead.
+
\wxheading{See also}
\helpref{wxTreebook::GetSelection}{wxtreebookgetselection}
+
+
+\membersection{wxTreebook::ChangeSelection}\label{wxtreebookchangeselection}
+
+\func{int}{ChangeSelection}{\param{size\_t}{ page}}
+
+Changes the selection for the given page, returning the previous selection.
+
+The call to this function \emph{does not} generate the page changing events.
+This is the only difference with \helpref{SetSelection}{wxtreebooksetselection}.
+See \helpref{this topic}{progevent} for more info.
WX_DEFINE_EXPORTED_ARRAY_PTR(wxWindow *, wxArrayPages);
class WXDLLEXPORT wxImageList;
+class WXDLLEXPORT wxBookCtrlBaseEvent;
// ----------------------------------------------------------------------------
// constants
// NB: this function will generate PAGE_CHANGING/ED events
virtual int SetSelection(size_t n) = 0;
+ // acts as SetSelection but does not generate events
+ virtual int ChangeSelection(size_t n) = 0;
+
// cycle thru the pages
void AdvanceSelection(bool forward = true)
virtual bool HasMultiplePages() const { return true; }
protected:
+ // typically, wxBookCtrl-derived classes will use DoSetSelection() function
+ // to implement SetSelection() and ChangeSelection() functions.
+ // these flags make DoSetSelection() more readable
+ enum
+ {
+ SetSelection_SendEvent = 1
+ };
+
+ // if using DoSetSelection() for implementing [Set|Change]Selection,
+ // then override UpdateSelectedPage() and MakeChangedEvent()
+ virtual int DoSetSelection(size_t nPage, int flags, wxBookCtrlBaseEvent &event);
+ virtual void UpdateSelectedPage(size_t WXUNUSED(newsel))
+ { wxFAIL_MSG(wxT("Override this function!")); }
+ virtual void MakeChangedEvent(wxBookCtrlBaseEvent &WXUNUSED(event))
+ { wxFAIL_MSG(wxT("Override this function!")); }
+
// Should we accept NULL page pointers in Add/InsertPage()?
//
// Default is no but derived classes may override it if they can treat NULL
class WXDLLEXPORT wxChoice;
+extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED;
+extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING;
+
+
// ----------------------------------------------------------------------------
// wxChoicebook
// ----------------------------------------------------------------------------
const wxString& text,
bool bSelect = false,
int imageId = -1);
- virtual int SetSelection(size_t n);
+ virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); }
+ virtual int ChangeSelection(size_t n) { return DoSetSelection(n); }
virtual void SetImageList(wxImageList *imageList);
virtual bool DeleteAllPages();
// get the size which the choice control should have
virtual wxSize GetControllerSize() const;
+ int DoSetSelection(size_t nPage, int flags = 0);
+
+ void UpdateSelectedPage(size_t newsel)
+ {
+ m_selection = newsel;
+ GetChoiceCtrl()->Select(newsel);
+ }
+
+ void MakeChangedEvent(wxBookCtrlBaseEvent &event)
+ {
+ event.SetEventType(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED);
+ }
+
// event handlers
void OnChoiceSelected(wxCommandEvent& event);
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxChoicebookEvent)
};
-extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED;
-extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING;
-
typedef void (wxEvtHandler::*wxChoicebookEventFunction)(wxChoicebookEvent&);
#define wxChoicebookEventHandler(func) \
// get the currently selected page
int GetSelection() const;
+ // changes selected page without sending events
+ int ChangeSelection(size_t nPage);
+
// set/get the title of a page
bool SetPageText(size_t nPage, const wxString& strText);
wxString GetPageText(size_t nPage) const;
// get the currently selected page
int GetSelection() const { return m_nSelection; }
+ // changes selected page without sending events
+ int ChangeSelection(size_t nPage);
+
// set/get the title of a page
bool SetPageText(size_t nPage, const wxString& strText);
wxString GetPageText(size_t nPage) const;
// set the currently selected page, return the index of the previously
// selected one (or -1 on error)
// NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events
- int SetSelection(size_t nPage);
+ int SetSelection(size_t nPage) { return DoSetSelection(nPage, SetSelection_SendEvent); }
// get the currently selected page
int GetSelection() const;
+ // changes selected page without sending events
+ int ChangeSelection(size_t nPage) { return DoSetSelection(nPage); }
+
// set/get the title of a page
bool SetPageText(size_t nPage, const wxString& strText);
wxString GetPageText(size_t nPage) const;
// flag set to true while we're inside "switch_page" callback
bool m_inSwitchPage;
+ // flag set to true when the switch-page signal has been programatically generated
+ bool m_skipNextPageChangeEvent;
+
protected:
// set all page's attributes
virtual void DoApplyWidgetStyle(GtkRcStyle *style);
// remove one page from the notebook but do not destroy it
virtual wxNotebookPage *DoRemovePage(size_t nPage);
+ int DoSetSelection(size_t nPage, int flags = 0);
+
private:
// the padding set by SetPadding()
int m_padding;
// set the currently selected page, return the index of the previously
// selected one (or -1 on error)
// NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events
- int SetSelection(size_t nPage);
+ int SetSelection(size_t nPage) { return DoSetSelection(nPage, SetSelection_SendEvent); }
// get the currently selected page
- int GetSelection() const;
+ int GetSelection() const;
+
+ // changes selected page without sending events
+ int ChangeSelection(size_t nPage) { return DoSetSelection(nPage); }
// set/get the title of a page
bool SetPageText(size_t nPage, const wxString& strText);
// flag set to true while we're inside "switch_page" callback
bool m_inSwitchPage;
+ // flag set to true when the switch-page signal has been programatically generated
+ bool m_skipNextPageChangeEvent;
+
protected:
// remove one page from the notebook but do not destroy it
virtual wxNotebookPage *DoRemovePage(size_t nPage);
+ int DoSetSelection(size_t nPage, int flags = 0);
+
private:
// the padding set by SetPadding()
int m_padding;
class WXDLLEXPORT wxListView;
class WXDLLEXPORT wxListEvent;
+extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED;
+extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING;
+
// ----------------------------------------------------------------------------
// wxListbook
// ----------------------------------------------------------------------------
const wxString& text,
bool bSelect = false,
int imageId = -1);
- virtual int SetSelection(size_t n);
+ virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); }
+ virtual int ChangeSelection(size_t n) { return DoSetSelection(n); }
virtual void SetImageList(wxImageList *imageList);
virtual bool DeleteAllPages();
// return the page corresponding to the tab at the specified position
virtual int HitTest(const wxPoint& pt, long *flags = NULL) const;
+ int DoSetSelection(size_t nPage, int flags = 0);
+
+ void UpdateSelectedPage(size_t newsel);
+
+ void MakeChangedEvent(wxBookCtrlBaseEvent &event)
+ {
+ event.SetEventType(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED);
+ }
+
// event handlers
void OnListSelected(wxListEvent& event);
void OnSize(wxSizeEvent& event);
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxListbookEvent)
};
-extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED;
-extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING;
-
typedef void (wxEvtHandler::*wxListbookEventFunction)(wxListbookEvent&);
#define wxListbookEventHandler(func) \
// set the currently selected page, return the index of the previously
// selected one (or -1 on error)
// NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events
- int SetSelection(size_t nPage);
+ int SetSelection(size_t nPage) { return DoSetSelection(nPage, SetSelection_SendEvent); }
// get the currently selected page
int GetSelection() const { return m_nSelection; }
+ // changes selected page without sending events
+ int ChangeSelection(size_t nPage) { return DoSetSelection(nPage); }
+
// set/get the title of a page
bool SetPageText(size_t nPage, const wxString& strText);
wxString GetPageText(size_t nPage) const;
void ChangePage(int nOldSel, int nSel); // change pages
void MacSetupTabs();
+ int DoSetSelection(size_t nPage, int flags = 0);
+
// the icon indices
wxArrayInt m_images;
// get the currently selected page
int GetSelection() const { return m_nSelection; }
+ // changes selected page without sending events
+ int ChangeSelection(size_t nPage);
+
// set/get the title of a page
bool SetPageText(size_t nPage, const wxString& strText);
wxString GetPageText(size_t nPage) const;
// common part of all ctors
void Init();
+ // hides m_nSelection-th page, shows the newsel-th one and updates m_nSelection
+ void UpdateSelection(size_t newsel);
+
// remove one page from the notebook, without deleting
virtual wxNotebookPage *DoRemovePage(size_t nPage);
//
int SetSelection(size_t nPage);
+ // changes selected page without sending events
+ int ChangeSelection(size_t nPage);
+
//
// Get the currently selected page
//
// get the currently selected page
int GetSelection() const { return m_nSelection; }
+ // changes the selected page without sending events
+ int ChangeSelection(size_t nPage);
+
// set/get the title of a page
bool SetPageText(size_t nPage, const wxString& strText);
wxString GetPageText(size_t nPage) const;
class WXDLLEXPORT wxToolBarBase;
class WXDLLEXPORT wxCommandEvent;
+extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED;
+extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING;
+
+
// Use wxButtonToolBar
#define wxBK_BUTTONBAR 0x0100
const wxString& text,
bool bSelect = false,
int imageId = -1);
- virtual int SetSelection(size_t n);
+ virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); }
+ virtual int ChangeSelection(size_t n) { return DoSetSelection(n); }
virtual void SetImageList(wxImageList *imageList);
virtual bool DeleteAllPages();
void OnSize(wxSizeEvent& event);
void OnIdle(wxIdleEvent& event);
+ int DoSetSelection(size_t nPage, int flags = 0);
+
+ void UpdateSelectedPage(size_t newsel)
+ {
+ m_selection = newsel;
+ GetToolBar()->ToggleTool(newsel + 1, true);
+ }
+
+ void MakeChangedEvent(wxBookCtrlBaseEvent &event)
+ {
+ event.SetEventType(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED);
+ }
+
// the currently selected page or wxNOT_FOUND if none
int m_selection;
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxToolbookEvent)
};
-extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED;
-extern WXDLLIMPEXP_CORE const wxEventType wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING;
-
typedef void (wxEvtHandler::*wxToolbookEventFunction)(wxToolbookEvent&);
#define wxToolbookEventHandler(func) \
virtual int GetPageImage(size_t n) const;
virtual bool SetPageImage(size_t n, int imageId);
virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const;
- virtual int SetSelection(size_t n);
+ virtual int SetSelection(size_t n) { return DoSetSelection(n, SetSelection_SendEvent); }
+ virtual int ChangeSelection(size_t n) { return DoSetSelection(n); }
virtual void SetImageList(wxImageList *imageList);
virtual void AssignImageList(wxImageList *imageList);
virtual bool DeleteAllPages();
int imageId = wxNOT_FOUND);
// Sets selection in the tree control and updates the page being shown.
- int DoSetSelection(size_t pos);
+ int DoSetSelection(size_t pos, int flags = 0);
// Returns currently shown page. In a case when selected the node
// has empty (NULL) page finds first (sub)child with not-empty page.
// implement wxNotebookBase pure virtuals
// --------------------------------------
- virtual int SetSelection(size_t nPage);
+ virtual int SetSelection(size_t nPage) { return DoSetSelection(nPage, SetSelection_SendEvent); }
virtual int GetSelection() const { return (int) m_sel; }
+ // changes selected page without sending events
+ int ChangeSelection(size_t nPage) { return DoSetSelection(nPage); }
+
virtual bool SetPageText(size_t nPage, const wxString& strText);
virtual wxString GetPageText(size_t nPage) const;
int width, int height,
int sizeFlags = wxSIZE_AUTO);
+ int DoSetSelection(size_t nPage, int flags = 0);
+
// common part of all ctors
void Init();
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
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_GO_HOME, MyFrame::OnGoHome)
#if wxUSE_HELP
EVT_MENU(ID_CONTEXT_HELP, MyFrame::OnContextHelp)
}
}
+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;
void OnDeleteCurPage(wxCommandEvent& event);
void OnDeleteLastPage(wxCommandEvent& event);
void OnNextPage(wxCommandEvent& event);
+ void OnGoHome(wxCommandEvent &event);
void OnAddSubPage(wxCommandEvent& event);
void OnAddPageBefore(wxCommandEvent& event);
ID_NEXT_PAGE,
ID_ADD_PAGE_BEFORE,
ID_ADD_SUB_PAGE,
+ ID_GO_HOME,
#if wxUSE_HELP
ID_CONTEXT_HELP,
return size;
}
+int wxBookCtrlBase::DoSetSelection(size_t n, int flags, wxBookCtrlBaseEvent &event)
+{
+ wxCHECK_MSG( n < GetPageCount(), wxNOT_FOUND,
+ wxT("invalid page index in wxBookCtrlBase::DoSetSelection()") );
+
+ const int oldSel = GetSelection();
+
+ if ( oldSel != wxNOT_FOUND && n != (size_t)oldSel )
+ {
+ bool allowed = false;
+
+ if ( flags & SetSelection_SendEvent )
+ {
+ event.SetSelection(n);
+ event.SetOldSelection(oldSel);
+ event.SetEventObject(this);
+
+ allowed = !GetEventHandler()->ProcessEvent(event) || event.IsAllowed();
+ }
+
+ if ( !(flags & SetSelection_SendEvent) || allowed)
+ {
+ if ( oldSel != wxNOT_FOUND )
+ m_pages[oldSel]->Hide();
+
+ wxWindow *page = m_pages[n];
+ page->SetSize(GetPageRect());
+ page->Show();
+
+ // change selection now to ignore the selection change event
+ UpdateSelectedPage(n);
+
+ if ( flags & SetSelection_SendEvent )
+ {
+ // program allows the page change
+ MakeChangedEvent(event);
+ (void)GetEventHandler()->ProcessEvent(event);
+ }
+ }
+ }
+
+ return oldSel;
+}
+
+
#endif // wxUSE_BOOKCTRL
return m_selection;
}
-int wxChoicebook::SetSelection(size_t n)
+int wxChoicebook::DoSetSelection(size_t n, int flags)
{
- wxCHECK_MSG( IS_VALID_PAGE(n), wxNOT_FOUND,
- wxT("invalid page index in wxChoicebook::SetSelection()") );
-
- const int oldSel = m_selection;
-
- if ( int(n) != m_selection )
- {
- wxChoicebookEvent event(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, m_windowId);
- event.SetSelection(n);
- event.SetOldSelection(m_selection);
- event.SetEventObject(this);
- if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() )
- {
- if ( m_selection != wxNOT_FOUND )
- m_pages[m_selection]->Hide();
-
- wxWindow *page = m_pages[n];
- page->SetSize(GetPageRect());
- page->Show();
-
- // change m_selection now to ignore the selection change event
- m_selection = n;
- GetChoiceCtrl()->Select(n);
-
- // program allows the page change
- event.SetEventType(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(event);
- }
- }
-
- return oldSel;
+ wxChoicebookEvent event(wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING, m_windowId);
+ return wxBookCtrlBase::DoSetSelection(n, flags, event);
}
// ----------------------------------------------------------------------------
// selection
// ----------------------------------------------------------------------------
+void wxListbook::UpdateSelectedPage(size_t newsel)
+{
+ m_selection = newsel;
+ GetListView()->Select(newsel);
+ GetListView()->Focus(newsel);
+}
+
int wxListbook::GetSelection() const
{
return m_selection;
}
-int wxListbook::SetSelection(size_t n)
+int wxListbook::DoSetSelection(size_t n, int flags)
{
- wxCHECK_MSG( IS_VALID_PAGE(n), wxNOT_FOUND,
- wxT("invalid page index in wxListbook::SetSelection()") );
-
- const int oldSel = m_selection;
-
- if ( int(n) != m_selection )
- {
- wxListbookEvent event(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, m_windowId);
- event.SetSelection(n);
- event.SetOldSelection(m_selection);
- event.SetEventObject(this);
- if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() )
- {
- if ( m_selection != wxNOT_FOUND )
- m_pages[m_selection]->Hide();
-
- wxWindow *page = m_pages[n];
- page->SetSize(GetPageRect());
- page->Show();
-
- // change m_selection now to ignore the selection change event
- m_selection = n;
- GetListView()->Select(n);
- GetListView()->Focus(n);
-
- // program allows the page change
- event.SetEventType(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(event);
- }
- }
-
- return oldSel;
+ wxListbookEvent event(wxEVT_COMMAND_LISTBOOK_PAGE_CHANGING, m_windowId);
+ return wxBookCtrlBase::DoSetSelection(n, flags, event);
}
// ----------------------------------------------------------------------------
return m_selection;
}
-int wxToolbook::SetSelection(size_t n)
+int wxToolbook::DoSetSelection(size_t n, int flags)
{
- wxCHECK_MSG( IS_VALID_PAGE(n), wxNOT_FOUND,
- wxT("invalid page index in wxToolbook::SetSelection()") );
-
- const int oldSel = m_selection;
-
- if ( int(n) != m_selection )
- {
- wxToolbookEvent event(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, m_windowId);
- event.SetSelection(n);
- event.SetOldSelection(m_selection);
- event.SetEventObject(this);
- if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() )
- {
- if ( m_selection != wxNOT_FOUND )
- m_pages[m_selection]->Hide();
-
- wxWindow *page = m_pages[n];
- page->SetSize(GetPageRect());
- page->Show();
-
- // change m_selection now to ignore the selection change event
- m_selection = n;
- GetToolBar()->ToggleTool(n + 1, true);
-
- // program allows the page change
- event.SetEventType(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(event);
- }
- }
-
- return oldSel;
+ wxToolbookEvent event(wxEVT_COMMAND_TOOLBOOK_PAGE_CHANGING, m_windowId);
+ return wxBookCtrlBase::DoSetSelection(n, flags, event);
}
// Not part of the wxBookctrl API, but must be called in OnIdle or
// actually shown page (the first (sub)child with page != NULL) is
// already deleted
m_actualSelection = m_selection;
- DoSetSelection(m_selection);
+
+ // send event as documented
+ DoSetSelection(m_selection, SetSelection_SendEvent);
}
//else: nothing to do -- selection is before the deleted node
}
return m_selection;
}
-int wxTreebook::SetSelection(size_t pagePos)
-{
- if ( (size_t)m_selection != pagePos )
- return DoSetSelection(pagePos);
-
- return m_selection;
-}
-
-int wxTreebook::DoSetSelection(size_t pagePos)
+int wxTreebook::DoSetSelection(size_t pagePos, int flags)
{
wxCHECK_MSG( IS_VALID_PAGE(pagePos), wxNOT_FOUND,
- wxT("invalid page index in wxListbook::SetSelection()") );
+ wxT("invalid page index in wxListbook::DoSetSelection()") );
wxASSERT_MSG( GetPageCount() == DoInternalGetPageCount(),
wxT("wxTreebook logic error: m_treeIds and m_pages not in sync!"));
+ wxTreebookEvent event(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, m_windowId);
const int oldSel = m_selection;
wxTreeCtrl *tree = GetTreeCtrl();
+ bool allowed = false;
- wxTreebookEvent event(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGING, m_windowId);
- event.SetEventObject(this);
- event.SetSelection(pagePos);
- event.SetOldSelection(m_selection);
-
- // don't send the event if the old and new pages are the same; do send it
- // otherwise and be prepared for it to be vetoed
- if ( (int)pagePos == m_selection ||
- !GetEventHandler()->ProcessEvent(event) ||
- event.IsAllowed() )
+ if (flags & SetSelection_SendEvent)
+ {
+ event.SetEventObject(this);
+ event.SetSelection(pagePos);
+ event.SetOldSelection(m_selection);
+
+ // don't send the event if the old and new pages are the same; do send it
+ // otherwise and be prepared for it to be vetoed
+ allowed = (int)pagePos == m_selection ||
+ !GetEventHandler()->ProcessEvent(event) ||
+ event.IsAllowed();
+ }
+
+ if ( !(flags & SetSelection_SendEvent) || allowed )
{
// hide the previously shown page
wxTreebookPage * const oldPage = DoGetCurrentPage();
tree->SelectItem(DoInternalGetPage(pagePos));
- // notify about the (now completed) page change
- event.SetEventType(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(event);
+ if (flags & SetSelection_SendEvent)
+ {
+ // notify about the (now completed) page change
+ event.SetEventType(wxEVT_COMMAND_TREEBOOK_PAGE_CHANGED);
+ (void)GetEventHandler()->ProcessEvent(event);
+ }
}
- else // page change vetoed
+ else if ( (flags & SetSelection_SendEvent) && !allowed) // page change vetoed
{
// tree selection might have already had changed
if ( oldSel != wxNOT_FOUND )
int old = notebook->GetSelection();
- wxNotebookEvent eventChanging( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
- notebook->GetId(), page, old );
- eventChanging.SetEventObject( notebook );
- if ( (notebook->GetEventHandler()->ProcessEvent(eventChanging)) &&
- !eventChanging.IsAllowed() )
- {
- /* program doesn't allow the page change */
- g_signal_stop_emission_by_name (notebook->m_widget,
- "switch_page");
- }
- else // change allowed
+ if (notebook->m_skipNextPageChangeEvent)
{
+ // this event was programatically generated by ChangeSelection() and thus must
+ // be skipped
+ notebook->m_skipNextPageChangeEvent = false;
+
// make wxNotebook::GetSelection() return the correct (i.e. consistent
// with wxNotebookEvent::GetSelection()) value even though the page is
// not really changed in GTK+
notebook->m_selection = page;
+ }
+ else
+ {
+ wxNotebookEvent eventChanging( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
+ notebook->GetId(), page, old );
+ eventChanging.SetEventObject( notebook );
- wxNotebookEvent eventChanged( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
- notebook->GetId(), page, old );
- eventChanged.SetEventObject( notebook );
- notebook->GetEventHandler()->ProcessEvent( eventChanged );
+ if ( (notebook->GetEventHandler()->ProcessEvent(eventChanging)) &&
+ !eventChanging.IsAllowed() )
+ {
+ /* program doesn't allow the page change */
+ g_signal_stop_emission_by_name (notebook->m_widget,
+ "switch_page");
+ }
+ else // change allowed
+ {
+ // make wxNotebook::GetSelection() return the correct (i.e. consistent
+ // with wxNotebookEvent::GetSelection()) value even though the page is
+ // not really changed in GTK+
+ notebook->m_selection = page;
+
+ wxNotebookEvent eventChanged( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
+ notebook->GetId(), page, old );
+ eventChanged.SetEventObject( notebook );
+ notebook->GetEventHandler()->ProcessEvent( eventChanged );
+ }
}
notebook->m_inSwitchPage = false;
{
m_padding = 0;
m_inSwitchPage = false;
+ m_skipNextPageChangeEvent = false;
m_imageList = (wxImageList *) NULL;
m_selection = -1;
return m_pagesData.Item(page)->GetData();
}
-int wxNotebook::SetSelection( size_t page )
+int wxNotebook::DoSetSelection( size_t page, int flags )
{
wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid notebook") );
int selOld = GetSelection();
+ if ( !(flags & SetSelection_SendEvent) )
+ m_skipNextPageChangeEvent = true;
+
// cache the selection
m_selection = page;
gtk_notebook_set_current_page( GTK_NOTEBOOK(m_widget), page );
+#ifdef __WXDEBUG__
+ if ( !(flags & SetSelection_SendEvent) )
+ {
+ // gtk_notebook_set_current_page will emit the switch-page signal which will be
+ // caught by our gtk_notebook_page_change_callback which should have reset the
+ // flag to false:
+ wxASSERT(!m_skipNextPageChangeEvent);
+ }
+#endif // __WXDEBUG__
+
wxNotebookPage *client = GetPage(page);
if ( client )
client->SetFocus();
int old = notebook->GetSelection();
- wxNotebookEvent eventChanging( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
- notebook->GetId(), page, old );
- eventChanging.SetEventObject( notebook );
-
- if ( (notebook->GetEventHandler()->ProcessEvent(eventChanging)) &&
- !eventChanging.IsAllowed() )
- {
- /* program doesn't allow the page change */
- gtk_signal_emit_stop_by_name( GTK_OBJECT(notebook->m_widget),
- "switch_page" );
- }
- else // change allowed
+ if (notebook->m_skipNextPageChangeEvent)
{
+ // this event was programatically generated by ChangeSelection() and thus must
+ // be skipped
+ notebook->m_skipNextPageChangeEvent = false;
+
// make wxNotebook::GetSelection() return the correct (i.e. consistent
// with wxNotebookEvent::GetSelection()) value even though the page is
// not really changed in GTK+
notebook->m_selection = page;
+ }
+ else
+ {
+ wxNotebookEvent eventChanging( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
+ notebook->GetId(), page, old );
+ eventChanging.SetEventObject( notebook );
- wxNotebookEvent eventChanged( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
- notebook->GetId(), page, old );
- eventChanged.SetEventObject( notebook );
- notebook->GetEventHandler()->ProcessEvent( eventChanged );
+ if ( (notebook->GetEventHandler()->ProcessEvent(eventChanging)) &&
+ !eventChanging.IsAllowed() )
+ {
+ /* program doesn't allow the page change */
+ g_signal_stop_emission_by_name (notebook->m_widget,
+ "switch_page");
+ }
+ else // change allowed
+ {
+ // make wxNotebook::GetSelection() return the correct (i.e. consistent
+ // with wxNotebookEvent::GetSelection()) value even though the page is
+ // not really changed in GTK+
+ notebook->m_selection = page;
+
+ wxNotebookEvent eventChanged( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
+ notebook->GetId(), page, old );
+ eventChanged.SetEventObject( notebook );
+ notebook->GetEventHandler()->ProcessEvent( eventChanged );
+ }
}
notebook->m_inSwitchPage = FALSE;
return m_pagesData.Item(page)->GetData();
}
-int wxNotebook::SetSelection( size_t page )
+int wxNotebook::DoSetSelection( size_t page, int flags )
{
wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid notebook") );
int selOld = GetSelection();
+ if ( !(flags & SetSelection_SendEvent) )
+ m_skipNextPageChangeEvent = true;
+
// cache the selection
m_selection = page;
gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), page );
+#ifdef __WXDEBUG__
+ if ( !(flags & SetSelection_SendEvent) )
+ {
+ // gtk_notebook_set_current_page will emit the switch-page signal which will be
+ // caught by our gtk_notebook_page_change_callback which should have reset the
+ // flag to false:
+ wxASSERT(!m_skipNextPageChangeEvent);
+ }
+#endif // __WXDEBUG__
+
wxNotebookPage *client = GetPage(page);
if ( client )
client->SetFocus();
return DoGetSizeFromClientSize( sizePage );
}
-int wxNotebook::SetSelection(size_t nPage)
+int wxNotebook::DoSetSelection(size_t nPage, int flags = 0)
{
- wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("SetSelection: invalid notebook page") );
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("DoSetSelection: invalid notebook page") );
if ( int(nPage) != m_nSelection )
{
- wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId);
- event.SetSelection(nPage);
- event.SetOldSelection(m_nSelection);
- event.SetEventObject(this);
- if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() )
+ if (flags & SetSelection_SendEvent)
{
- // program allows the page change
- event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(event);
+ wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId);
+ event.SetSelection(nPage);
+ event.SetOldSelection(m_nSelection);
+ event.SetEventObject(this);
+ if ( !GetEventHandler()->ProcessEvent(event) || event.IsAllowed() )
+ {
+ // program allows the page change
+ event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
+ (void)GetEventHandler()->ProcessEvent(event);
- ChangePage(m_nSelection, nPage);
+ ChangePage(m_nSelection, nPage);
+ }
}
- }
return m_nSelection;
}
MacSetupTabs() ;
}
+ else
+ {
+ ChangePage(m_nSelection, nPage);
+ }
+ }
return true;
}
return m_nSelection;
}
+void wxNotebook::UpdateSelection(size_t newsel)
+{
+ if ( m_nSelection != -1 )
+ m_pages[m_nSelection]->Show(false);
+
+ if ( newsel != -1 )
+ {
+ wxNotebookPage *pPage = m_pages[newsel];
+ pPage->Show(true);
+ }
+
+ // Changing the page should give the focus to it but, as per bug report
+ // http://sf.net/tracker/index.php?func=detail&aid=1150659&group_id=9863&atid=109863,
+ // we should not set the focus to it directly since it erroneously
+ // selects radio buttons and breaks keyboard handling for a notebook's
+ // scroll buttons. So give focus to the notebook and not the page.
+
+ // but don't do this is the notebook is hidden
+ if ( ::IsWindowVisible(GetHwnd()) )
+ SetFocus();
+
+ m_nSelection = newsel;
+}
+
+int wxNotebook::ChangeSelection(size_t nPage)
+{
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") );
+
+ if ( int(nPage) != m_nSelection )
+ {
+ TabCtrl_SetCurSel(GetHwnd(), nPage);
+
+ UpdateSelection(nPage);
+ }
+
+ return m_nSelection;
+}
+
bool wxNotebook::SetPageText(size_t nPage, const wxString& strText)
{
wxCHECK_MSG( IS_VALID_PAGE(nPage), false, wxT("notebook page out of range") );
void wxNotebook::OnSelChange(wxNotebookEvent& event)
{
- // is it our tab control?
- if ( event.GetEventObject() == this )
- {
- int sel = event.GetOldSelection();
- if ( sel != -1 )
- m_pages[sel]->Show(false);
-
- sel = event.GetSelection();
- if ( sel != -1 )
- {
- wxNotebookPage *pPage = m_pages[sel];
- pPage->Show(true);
- }
-
- // Changing the page should give the focus to it but, as per bug report
- // http://sf.net/tracker/index.php?func=detail&aid=1150659&group_id=9863&atid=109863,
- // we should not set the focus to it directly since it erroneously
- // selects radio buttons and breaks keyboard handling for a notebook's
- // scroll buttons. So give focus to the notebook and not the page.
-
- // but don't do this is the notebook is hidden
- if ( ::IsWindowVisible(GetHwnd()) )
- SetFocus();
-
- m_nSelection = sel;
- }
+ // is it our tab control?
+ if ( event.GetEventObject() == this )
+ {
+ UpdateSelection(event.GetSelection());
+ }
- // we want to give others a chance to process this message as well
- event.Skip();
+ // we want to give others a chance to process this message as well
+ event.Skip();
}
void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event)
return nPage;
} // end of wxNotebook::SetSelection
+int wxNotebook::ChangeSelection( size_t nPage )
+{
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") );
+
+ if (nPage != (size_t)m_nSelection)
+ {
+ ::WinSendMsg( GetHWND()
+ ,BKM_TURNTOPAGE
+ ,MPFROMLONG((ULONG)m_alPageId[nPage])
+ ,(MPARAM)0
+ );
+ }
+ m_nSelection = nPage;
+ return nPage;
+}
+
bool wxNotebook::SetPageText( size_t nPage,
const wxString& rsStrText )
{
return 0;
}
+int wxNotebook::ChangeSelection(size_t nPage)
+{
+ return 0;
+}
+
bool wxNotebook::SetPageText(size_t nPage, const wxString& strText)
{
return false;
// wxNotebook page switching
// ----------------------------------------------------------------------------
-int wxNotebook::SetSelection(size_t nPage)
+int wxNotebook::DoSetSelection(size_t nPage, int flags = 0)
{
wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, _T("invalid notebook page") );
return m_sel;
}
- // event handling
wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId);
- event.SetSelection(nPage);
- event.SetOldSelection(m_sel);
- event.SetEventObject(this);
- if ( GetEventHandler()->ProcessEvent(event) && !event.IsAllowed() )
+ if (flags & SetSelection_SendEvent)
{
- // program doesn't allow the page change
- return m_sel;
+ // event handling
+ event.SetSelection(nPage);
+ event.SetOldSelection(m_sel);
+ event.SetEventObject(this);
+ if ( GetEventHandler()->ProcessEvent(event) && !event.IsAllowed() )
+ {
+ // program doesn't allow the page change
+ return m_sel;
+ }
}
// we need to change m_sel first, before calling RefreshTab() below as
m_pages[m_sel]->Show();
}
- // event handling
- event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
- GetEventHandler()->ProcessEvent(event);
+ if (flags & SetSelection_SendEvent)
+ {
+ // event handling
+ event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
+ GetEventHandler()->ProcessEvent(event);
+ }
return selOld;
}