X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a756f210019dd5b51331b7181c816d3882146a30..f6f0900d306c28ab5736b372e19333d99d786c9b:/src/generic/notebook.cpp diff --git a/src/generic/notebook.cpp b/src/generic/notebook.cpp index 5cb54f9c67..efd24ca31e 100644 --- a/src/generic/notebook.cpp +++ b/src/generic/notebook.cpp @@ -16,7 +16,7 @@ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "notebook.h" #endif @@ -33,6 +33,7 @@ #include "wx/generic/imaglist.h" #include "wx/notebook.h" #include "wx/dcclient.h" +#include "wx/generic/tabg.h" // ---------------------------------------------------------------------------- // macros @@ -55,7 +56,6 @@ BEGIN_EVENT_TABLE(wxNotebook, wxControl) EVT_MOUSE_EVENTS(wxNotebook::OnMouseEvent) EVT_SET_FOCUS(wxNotebook::OnSetFocus) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) -// EVT_IDLE(wxNotebook::OnIdle) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl) @@ -65,6 +65,27 @@ IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) // implementation // ============================================================================ +// ============================================================================ +// Private class +// ============================================================================ + +// This reuses wxTabView to draw the tabs. +class WXDLLEXPORT wxNotebookTabView: public wxTabView +{ +DECLARE_DYNAMIC_CLASS(wxNotebookTabView) +public: + wxNotebookTabView(wxNotebook* notebook, long style = wxTAB_STYLE_DRAW_BOX | wxTAB_STYLE_COLOUR_INTERIOR); + ~wxNotebookTabView(void); + + // Called when a tab is activated + virtual void OnTabActivate(int activateId, int deactivateId); + // Allows vetoing + virtual bool OnTabPreActivate(int activateId, int deactivateId); + +protected: + wxNotebook* m_notebook; +}; + // ---------------------------------------------------------------------------- // wxNotebook construction // ---------------------------------------------------------------------------- @@ -134,11 +155,8 @@ int wxNotebook::GetRowCount() const return 0; } -int wxNotebook::SetSelection(int nPage) +int wxNotebook::SetSelection(size_t nPage) { - if (nPage == -1) - return 0; - wxASSERT( IS_VALID_PAGE(nPage) ); #if defined (__WIN16__) @@ -164,7 +182,7 @@ void wxNotebook::AdvanceSelection(bool bForward) } #endif -bool wxNotebook::SetPageText(int nPage, const wxString& strText) +bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) { wxASSERT( IS_VALID_PAGE(nPage) ); #if defined (__WIN16__) @@ -183,7 +201,7 @@ bool wxNotebook::SetPageText(int nPage, const wxString& strText) return FALSE; } -wxString wxNotebook::GetPageText(int nPage) const +wxString wxNotebook::GetPageText(size_t nPage) const { wxASSERT( IS_VALID_PAGE(nPage) ); @@ -198,7 +216,7 @@ wxString wxNotebook::GetPageText(int nPage) const #endif } -int wxNotebook::GetPageImage(int nPage) const +int wxNotebook::GetPageImage(size_t nPage) const { wxASSERT( IS_VALID_PAGE(nPage) ); @@ -206,7 +224,7 @@ int wxNotebook::GetPageImage(int nPage) const return 0; } -bool wxNotebook::SetPageImage(int nPage, int nImage) +bool wxNotebook::SetPageImage(size_t nPage, int nImage) { wxASSERT( IS_VALID_PAGE(nPage) ); @@ -237,7 +255,7 @@ void wxNotebook::SetTabSize(const wxSize& sz) // ---------------------------------------------------------------------------- // remove one page from the notebook and delete it -bool wxNotebook::DeletePage(int nPage) +bool wxNotebook::DeletePage(size_t nPage) { wxCHECK( IS_VALID_PAGE(nPage), FALSE ); @@ -288,8 +306,13 @@ bool wxNotebook::DeletePage(wxNotebookPage* page) return FALSE; } +bool wxNotebook::RemovePage(size_t nPage) +{ + return DoRemovePage(nPage) != NULL; +} + // remove one page from the notebook -bool wxNotebook::RemovePage(int nPage) +wxWindow* wxNotebook::DoRemovePage(size_t nPage) { wxCHECK( IS_VALID_PAGE(nPage), FALSE ); @@ -314,25 +337,25 @@ bool wxNotebook::RemovePage(int nPage) { // Only change the selection if the page we // deleted was the selection. - if (nPage == m_nSelection) + if (nPage == (size_t)m_nSelection) { m_nSelection = -1; // Select the first tab. Generates a ChangePage. - m_tabView->SetTabSelection((int) (long) GetPage(0), TRUE); + m_tabView->SetTabSelection(0, TRUE); } else { // We must adjust which tab we think is selected. // If greater than the page we deleted, it must be moved down // a notch. - if (m_nSelection > nPage) + if (size_t(m_nSelection) > nPage) m_nSelection -- ; } } RefreshLayout(FALSE); - return TRUE; + return pPage; } bool wxNotebook::RemovePage(wxNotebookPage* page) @@ -347,8 +370,8 @@ bool wxNotebook::RemovePage(wxNotebookPage* page) // Find the position of the wxNotebookPage, -1 if not found. int wxNotebook::FindPagePosition(wxNotebookPage* page) const { - int nPageCount = GetPageCount(); - int nPage; + size_t nPageCount = GetPageCount(); + size_t nPage; for ( nPage = 0; nPage < nPageCount; nPage++ ) if (m_pages[nPage] == page) return nPage; @@ -360,8 +383,8 @@ bool wxNotebook::DeleteAllPages() { m_tabView->ClearTabs(TRUE); - int nPageCount = GetPageCount(); - int nPage; + size_t nPageCount = GetPageCount(); + size_t nPage; for ( nPage = 0; nPage < nPageCount; nPage++ ) delete m_pages[nPage]; @@ -371,7 +394,7 @@ bool wxNotebook::DeleteAllPages() } // same as AddPage() but does it at given position -bool wxNotebook::InsertPage(int nPage, +bool wxNotebook::InsertPage(size_t nPage, wxNotebookPage *pPage, const wxString& strText, bool bSelect, @@ -435,8 +458,11 @@ void wxNotebook::OnSize(wxSizeEvent& event) // This was supposed to cure the non-display of the notebook // until the user resizes the window. // What's going on? -void wxNotebook::OnIdle(wxIdleEvent& event) +void wxNotebook::OnInternalIdle() { + wxWindow::OnInternalIdle(); + +#if 0 static bool s_bFirstTime = TRUE; if ( s_bFirstTime ) { /* @@ -456,7 +482,7 @@ void wxNotebook::OnIdle(wxIdleEvent& event) */ s_bFirstTime = FALSE; } - event.Skip(); +#endif } // Implementation: calculate the layout of the view rect @@ -499,12 +525,12 @@ bool wxNotebook::RefreshLayout(bool force) // fit the notebook page to the tab control's display area - unsigned int nCount = m_pages.Count(); - for ( unsigned int nPage = 0; nPage < nCount; nPage++ ) { + size_t nCount = m_pages.Count(); + for ( size_t nPage = 0; nPage < nCount; nPage++ ) { wxNotebookPage *pPage = m_pages[nPage]; + wxRect clientRect = GetAvailableClientSize(); if (pPage->IsShown()) { - wxRect clientRect = GetAvailableClientSize(); pPage->SetSize(clientRect.x, clientRect.y, clientRect.width, clientRect.height); if ( pPage->GetAutoLayout() ) pPage->Layout(); @@ -679,4 +705,36 @@ void wxNotebookTabView::OnTabActivate(int activateId, int deactivateId) m_notebook->GetEventHandler()->ProcessEvent(event); } +// Allows Vetoing +bool wxNotebookTabView::OnTabPreActivate(int activateId, int deactivateId) +{ + bool retval = TRUE; + + if (m_notebook) + { + wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_notebook->GetId()); + +#if defined (__WIN16__) + int activatePos = activateId; + int deactivatePos = deactivateId; +#else + // Translate from wxTabView's ids (which aren't position-dependent) + // to wxNotebook's (which are). + wxNotebookPage* pActive = (wxNotebookPage*) activateId; + wxNotebookPage* pDeactive = (wxNotebookPage*) deactivateId; + + int activatePos = m_notebook->FindPagePosition(pActive); + int deactivatePos = m_notebook->FindPagePosition(pDeactive); + +#endif + event.SetEventObject(m_notebook); + event.SetSelection(activatePos); + event.SetOldSelection(deactivatePos); + if (m_notebook->GetEventHandler()->ProcessEvent(event)) + { + retval = event.IsAllowed(); + } + } + return retval; +}