public:
// 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);
// get the currently selected page
int GetSelection() const;
// On platforms that support it, get the theme page background colour, else invalid colour
virtual wxColour GetThemeBackgroundColour() const { return wxNullColour; }
+
+ // send wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING/ED events
+
+ // returns false if the change to nPage is vetoed by the program
+ bool SendPageChangingEvent(int nPage);
+
+ // sends the event about page change from old to new (or GetSelection() if
+ // new is -1)
+ void SendPageChangedEvent(int nPageOld, int nPageNew = -1);
+
+
protected:
DECLARE_NO_COPY_CLASS(wxNotebookBase)
};
return true;
}
-
int wxNotebook::SetSelection(size_t nPage)
+{
+ const int pageOld = GetSelection();
+
+ if ( !SendPageChangingEvent(nPage) )
+ return pageOld;
+
+ int page = ChangeSelection(nPage);
+ if ( page != wxNOT_FOUND )
+ {
+ SendPageChangedEvent(pageOld);
+ }
+
+ return page;
+}
+
+int wxNotebook::ChangeSelection(size_t nPage)
{
wxAutoNSAutoreleasePool pool;
[GetNSTabView() selectTabViewItemAtIndex:nPage];
return sizeTotal;
}
+// ----------------------------------------------------------------------------
+// events
+// ----------------------------------------------------------------------------
+
+bool wxNotebookBase::SendPageChangingEvent(int nPage)
+{
+ wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, GetId());
+ event.SetSelection(nPage);
+ event.SetOldSelection(GetSelection());
+ event.SetEventObject(this);
+ return !GetEventHandler()->ProcessEvent(event) || event.IsAllowed();
+}
+
+void wxNotebookBase::SendPageChangedEvent(int nPageOld, int nPageNew)
+{
+ wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, GetId());
+ event.SetSelection(nPageNew == -1 ? GetSelection() : nPageNew);
+ event.SetOldSelection(nPageOld);
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event);
+}
+
#endif // wxUSE_NOTEBOOK
extern "C" {
static void gtk_notebook_page_change_callback(GtkNotebook *WXUNUSED(widget),
- GtkNotebookPage *WXUNUSED(page),
+ GtkNotebookPage *WXUNUSED(gpage),
guint page,
wxNotebook *notebook )
{
}
else
{
- wxNotebookEvent eventChanging( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
- notebook->GetId(), page, old );
- eventChanging.SetEventObject( notebook );
-
- if ( (notebook->GetEventHandler()->ProcessEvent(eventChanging)) &&
- !eventChanging.IsAllowed() )
+ if ( !notebook->SendPageChangingEvent(page) )
{
/* program doesn't allow the page change */
g_signal_stop_emission_by_name (notebook->m_widget,
// 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->SendPageChangedEvent(old);
}
}
{
if ( flags & SetSelection_SendEvent )
{
- 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 ( !SendPageChangingEvent(nPage) )
{
// vetoed by program
return m_nSelection;
}
//else: program allows the page change
- event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(event);
+ SendPageChangedEvent(m_nSelection, nPage);
}
ChangePage(m_nSelection, nPage);
{
wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") );
- if ( int(nPage) != m_nSelection )
+ if ( m_nSelection == wxNOT_FOUND || nPage != (size_t)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 ( SendPageChangingEvent(nPage) )
{
// program allows the page change
- event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(event);
+ SendPageChangedEvent(m_nSelection, nPage);
- TabCtrl_SetCurSel(GetHwnd(), nPage);
+ TabCtrl_SetCurSel(GetHwnd(), nPage);
}
}
return m_sel;
}
- wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_windowId);
- if (flags & SetSelection_SendEvent)
+ if ( flags & SetSelection_SendEvent )
{
- // event handling
- event.SetSelection(nPage);
- event.SetOldSelection(m_sel);
- event.SetEventObject(this);
- if ( GetEventHandler()->ProcessEvent(event) && !event.IsAllowed() )
+ if ( !SendPageChangingEvent(nPage) )
{
// program doesn't allow the page change
return m_sel;
m_pages[m_sel]->Show();
}
- if (flags & SetSelection_SendEvent)
+ if ( flags & SetSelection_SendEvent )
{
// event handling
- event.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
- GetEventHandler()->ProcessEvent(event);
+ SendPageChangedEvent(selOld);
}
return selOld;