X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/25889d3c43f537fea00a2b7d6df7bd7e63e113f8..341baa4c718000e49e632d7293888fc133196f74:/src/generic/notebook.cpp diff --git a/src/generic/notebook.cpp b/src/generic/notebook.cpp index 3b18a3ce2a..853fc8ab7d 100644 --- a/src/generic/notebook.cpp +++ b/src/generic/notebook.cpp @@ -27,12 +27,13 @@ #pragma hdrstop #endif -#include -#include -#include -#include -#include -#include +#include "wx/string.h" +#include "wx/log.h" +#include "wx/settings.h" +#include "wx/generic/imaglist.h" +#include "wx/notebook.h" +#include "wx/dcclient.h" +#include "wx/generic/tabg.h" // ---------------------------------------------------------------------------- // macros @@ -45,7 +46,9 @@ // event table // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARIES +DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) + BEGIN_EVENT_TABLE(wxNotebook, wxControl) EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange) EVT_SIZE(wxNotebook::OnSize) @@ -53,17 +56,36 @@ 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) IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) -#endif // ============================================================================ // 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 // ---------------------------------------------------------------------------- @@ -72,7 +94,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) void wxNotebook::Init() { m_tabView = (wxNotebookTabView*) NULL; - m_pImageList = NULL; m_nSelection = -1; } @@ -112,7 +133,7 @@ bool wxNotebook::Create(wxWindow *parent, if (!wxWindow::Create(parent, id, pos, size, style|wxNO_BORDER, name)) return FALSE; - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); SetTabView(new wxNotebookTabView(this)); @@ -128,11 +149,6 @@ wxNotebook::~wxNotebook() // ---------------------------------------------------------------------------- // wxNotebook accessors // ---------------------------------------------------------------------------- -int wxNotebook::GetPageCount() const -{ - return m_aPages.Count(); -} - int wxNotebook::GetRowCount() const { // TODO @@ -157,6 +173,7 @@ int wxNotebook::SetSelection(int nPage) return 0; } +#if 0 void wxNotebook::AdvanceSelection(bool bForward) { int nSel = GetSelection(); @@ -166,6 +183,7 @@ void wxNotebook::AdvanceSelection(bool bForward) else SetSelection(nSel == 0 ? nMax : nSel - 1); } +#endif bool wxNotebook::SetPageText(int nPage, const wxString& strText) { @@ -217,9 +235,21 @@ bool wxNotebook::SetPageImage(int nPage, int nImage) return FALSE; } -void wxNotebook::SetImageList(wxImageList* imageList) -{ - m_pImageList = imageList; +// set the size (the same for all pages) +void wxNotebook::SetPageSize(const wxSize& size) +{ + // TODO +} + +// set the padding between tabs (in pixels) +void wxNotebook::SetPadding(const wxSize& padding) +{ + // TODO +} + +// set the size of the tabs for wxNB_FIXEDWIDTH controls +void wxNotebook::SetTabSize(const wxSize& sz) +{ // TODO } @@ -234,8 +264,8 @@ bool wxNotebook::DeletePage(int nPage) if (m_nSelection != -1) { - m_aPages[m_nSelection]->Show(FALSE); - m_aPages[m_nSelection]->Lower(); + m_pages[m_nSelection]->Show(FALSE); + m_pages[m_nSelection]->Lower(); } wxNotebookPage* pPage = GetPage(nPage); @@ -245,10 +275,10 @@ bool wxNotebook::DeletePage(int nPage) m_tabView->RemoveTab((int) (long) pPage); #endif - delete m_aPages[nPage]; - m_aPages.Remove(nPage); + m_pages.Remove(pPage); + delete pPage; - if (m_aPages.GetCount() == 0) + if (m_pages.GetCount() == 0) { m_nSelection = -1; m_tabView->SetTabSelection(-1, FALSE); @@ -284,8 +314,8 @@ bool wxNotebook::RemovePage(int nPage) { wxCHECK( IS_VALID_PAGE(nPage), FALSE ); - m_aPages[nPage]->Show(FALSE); - // m_aPages[nPage]->Lower(); + m_pages[nPage]->Show(FALSE); + // m_pages[nPage]->Lower(); wxNotebookPage* pPage = GetPage(nPage); #if defined (__WIN16__) @@ -294,9 +324,9 @@ bool wxNotebook::RemovePage(int nPage) m_tabView->RemoveTab((int) (long) pPage); #endif - m_aPages.Remove(nPage); + m_pages.Remove(pPage); - if (m_aPages.GetCount() == 0) + if (m_pages.GetCount() == 0) { m_nSelection = -1; m_tabView->SetTabSelection(-1, TRUE); @@ -341,7 +371,7 @@ int wxNotebook::FindPagePosition(wxNotebookPage* page) const int nPageCount = GetPageCount(); int nPage; for ( nPage = 0; nPage < nPageCount; nPage++ ) - if (m_aPages[nPage] == page) + if (m_pages[nPage] == page) return nPage; return -1; } @@ -354,22 +384,13 @@ bool wxNotebook::DeleteAllPages() int nPageCount = GetPageCount(); int nPage; for ( nPage = 0; nPage < nPageCount; nPage++ ) - delete m_aPages[nPage]; + delete m_pages[nPage]; - m_aPages.Clear(); + m_pages.Clear(); return TRUE; } -// add a page to the notebook -bool wxNotebook::AddPage(wxNotebookPage *pPage, - const wxString& strText, - bool bSelect, - int imageId) -{ - return InsertPage(GetPageCount(), pPage, strText, bSelect, imageId); -} - // same as AddPage() but does it at given position bool wxNotebook::InsertPage(int nPage, wxNotebookPage *pPage, @@ -390,7 +411,7 @@ bool wxNotebook::InsertPage(int nPage, pPage->Show(FALSE); // save the pointer to the page - m_aPages.Insert(pPage, nPage); + m_pages.Insert(pPage, nPage); if (bSelect) { @@ -435,8 +456,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 +480,7 @@ void wxNotebook::OnIdle(wxIdleEvent& event) */ s_bFirstTime = FALSE; } - event.Skip(); +#endif } // Implementation: calculate the layout of the view rect @@ -476,7 +500,7 @@ bool wxNotebook::RefreshLayout(bool force) rect.y = tabHeight + 4; rect.width = cw - 8; rect.height = ch - 4 - rect.y ; - + m_tabView->SetViewRect(rect); m_tabView->LayoutTabs(); @@ -489,7 +513,7 @@ bool wxNotebook::RefreshLayout(bool force) rect.y = tabHeight + 4; rect.width = cw - 8; rect.height = ch - 4 - rect.y ; - + m_tabView->SetViewRect(rect); m_tabView->LayoutTabs(); @@ -499,16 +523,23 @@ bool wxNotebook::RefreshLayout(bool force) // fit the notebook page to the tab control's display area - unsigned int nCount = m_aPages.Count(); + unsigned int nCount = m_pages.Count(); for ( unsigned int nPage = 0; nPage < nCount; nPage++ ) { - wxNotebookPage *pPage = m_aPages[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(); } + // MBN: this is probably just hiding a problem under the carpet, + // but: with OpenMotif 2.2 (not Lesstif), not moving the window + // may cause the tabs to be not clickable. + else + { + pPage->Move(clientRect.x, clientRect.y); + } } Refresh(); } @@ -532,7 +563,7 @@ void wxNotebook::OnSetFocus(wxFocusEvent& event) { // set focus to the currently selected page if any if ( m_nSelection != -1 ) - m_aPages[m_nSelection]->SetFocus(); + m_pages[m_nSelection]->SetFocus(); event.Skip(); } @@ -569,7 +600,7 @@ bool wxNotebook::DoPhase(int /* nPhase */) return TRUE; } -void wxNotebook::Command(wxCommandEvent& event) +void wxNotebook::Command(wxCommandEvent& WXUNUSED(event)) { wxFAIL_MSG("wxNotebook::Command not implemented"); } @@ -585,21 +616,21 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) wxASSERT( nOldSel != nSel ); // impossible if ( nOldSel != -1 ) { - m_aPages[nOldSel]->Show(FALSE); - m_aPages[nOldSel]->Lower(); + m_pages[nOldSel]->Show(FALSE); + m_pages[nOldSel]->Lower(); } - wxNotebookPage *pPage = m_aPages[nSel]; + wxNotebookPage *pPage = m_pages[nSel]; wxRect clientRect = GetAvailableClientSize(); pPage->SetSize(clientRect.x, clientRect.y, clientRect.width, clientRect.height); + Refresh(); + pPage->Show(TRUE); pPage->Raise(); pPage->SetFocus(); - Refresh(); - m_nSelection = nSel; } @@ -636,7 +667,7 @@ wxRect wxNotebook::GetAvailableClientSize() /* * wxNotebookTabView */ - + IMPLEMENT_CLASS(wxNotebookTabView, wxTabView) wxNotebookTabView::wxNotebookTabView(wxNotebook *notebook, long style): wxTabView(style) @@ -658,12 +689,7 @@ void wxNotebookTabView::OnTabActivate(int activateId, int deactivateId) if (!m_notebook) return; -// Because of name truncation! -#if defined(__BORLANDC__) && defined(__WIN16__) - wxNotebookEvent event(wxEVT_COMMAND_NB_PAGE_CHANGED, m_notebook->GetId()); -#else wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_notebook->GetId()); -#endif #if defined (__WIN16__) int activatePos = activateId; @@ -684,4 +710,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; +}