X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca65c0440a7163e4e37e48b1c4329709d722db47..c13d6ac1ea199d1e3908d40d129e2fd5a4d82df7:/src/generic/notebook.cpp diff --git a/src/generic/notebook.cpp b/src/generic/notebook.cpp index e4cbc77c80..560ea1000f 100644 --- a/src/generic/notebook.cpp +++ b/src/generic/notebook.cpp @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: notebook.cpp -// Purpose: implementation of wxNotebook +// Name: src/generic/notebook.cpp +// Purpose: generic implementation of wxNotebook // Author: Julian Smart // Modified by: // Created: 17/09/98 @@ -16,27 +16,26 @@ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "notebook.h" -#endif - -#ifdef __VMS -#pragma message disable unscomzer -#endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif -#include "wx/string.h" -#include "wx/log.h" -#include "wx/settings.h" -#include "wx/generic/imaglist.h" +#if wxUSE_NOTEBOOK + #include "wx/notebook.h" -#include "wx/dcclient.h" + +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/log.h" + #include "wx/dcclient.h" + #include "wx/settings.h" +#endif + +#include "wx/imaglist.h" #include "wx/generic/tabg.h" // ---------------------------------------------------------------------------- @@ -44,16 +43,13 @@ // ---------------------------------------------------------------------------- // check that the page index is valid -#define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount())) +#define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount()) // ---------------------------------------------------------------------------- // event table // ---------------------------------------------------------------------------- -DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) - -BEGIN_EVENT_TABLE(wxNotebook, wxControl) +BEGIN_EVENT_TABLE(wxNotebook, wxBookCtrlBase) EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, wxNotebook::OnSelChange) EVT_SIZE(wxNotebook::OnSize) EVT_PAINT(wxNotebook::OnPaint) @@ -62,9 +58,6 @@ BEGIN_EVENT_TABLE(wxNotebook, wxControl) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) END_EVENT_TABLE() -IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl) -IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) - // ============================================================================ // implementation // ============================================================================ @@ -73,23 +66,43 @@ IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) // Private class // ============================================================================ +WX_DECLARE_HASH_MAP(int, wxNotebookPage*, wxIntegerHash, wxIntegerEqual, + wxIntToNotebookPageHashMap); + +WX_DECLARE_HASH_MAP(wxNotebookPage*, int, wxPointerHash, wxPointerEqual, + wxNotebookPageToIntHashMap); + // 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); + wxNotebookTabView(wxNotebook* notebook, long style = wxTAB_STYLE_DRAW_BOX | wxTAB_STYLE_COLOUR_INTERIOR); + virtual ~wxNotebookTabView(void); - // Called when a tab is activated - virtual void OnTabActivate(int activateId, int deactivateId); - // Allows vetoing - virtual bool OnTabPreActivate(int activateId, int deactivateId); + // Called when a tab is activated + virtual void OnTabActivate(int activateId, int deactivateId); + // Allows vetoing + virtual bool OnTabPreActivate(int activateId, int deactivateId); + + // map integer ids used by wxTabView to wxNotebookPage pointers + int GetId(wxNotebookPage *page); + wxNotebookPage *GetPage(int id) { return m_idToPage[id]; } protected: - wxNotebook* m_notebook; + wxNotebook* m_notebook; + +private: + wxIntToNotebookPageHashMap m_idToPage; + wxNotebookPageToIntHashMap m_pageToId; + int m_nextid; }; +static int GetPageId(wxTabView *tabview, wxNotebookPage *page) +{ + return static_cast(tabview)->GetId(page); +} + // ---------------------------------------------------------------------------- // wxNotebook construction // ---------------------------------------------------------------------------- @@ -97,8 +110,8 @@ protected: // common part of all ctors void wxNotebook::Init() { - m_tabView = (wxNotebookTabView*) NULL; - m_nSelection = -1; + m_tabView = NULL; + m_selection = -1; } // default for dynamic class @@ -131,13 +144,14 @@ bool wxNotebook::Create(wxWindow *parent, // base init SetName(name); + if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) + style |= wxBK_TOP; + m_windowId = id == wxID_ANY ? NewControlId() : id; if (!wxControl::Create(parent, id, pos, size, style|wxNO_BORDER, wxDefaultValidator, name)) return false; - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); - SetTabView(new wxNotebookTabView(this)); return true; @@ -164,12 +178,18 @@ int wxNotebook::SetSelection(size_t nPage) wxNotebookPage* pPage = GetPage(nPage); - m_tabView->SetTabSelection((int) (long) pPage); + m_tabView->SetTabSelection(GetPageId(m_tabView, pPage)); // TODO return 0; } +int wxNotebook::ChangeSelection(size_t nPage) +{ + // FIXME: currently it does generate events too + return SetSelection(nPage); +} + #if 0 void wxNotebook::AdvanceSelection(bool bForward) { @@ -189,7 +209,7 @@ bool wxNotebook::SetPageText(size_t nPage, const wxString& strText) wxNotebookPage* page = GetPage(nPage); if (page) { - m_tabView->SetTabText((int) (long) page, strText); + m_tabView->SetTabText(GetPageId(m_tabView, page), strText); Refresh(); return true; } @@ -203,12 +223,12 @@ wxString wxNotebook::GetPageText(size_t nPage) const wxNotebookPage* page = ((wxNotebook*)this)->GetPage(nPage); if (page) - return m_tabView->GetTabText((int) (long) page); + return m_tabView->GetTabText(GetPageId(m_tabView, page)); else return wxEmptyString; } -int wxNotebook::GetPageImage(size_t nPage) const +int wxNotebook::GetPageImage(size_t WXUNUSED_UNLESS_DEBUG(nPage)) const { wxASSERT( IS_VALID_PAGE(nPage) ); @@ -216,7 +236,8 @@ int wxNotebook::GetPageImage(size_t nPage) const return 0; } -bool wxNotebook::SetPageImage(size_t nPage, int nImage) +bool wxNotebook::SetPageImage(size_t WXUNUSED_UNLESS_DEBUG(nPage), + int WXUNUSED(nImage)) { wxASSERT( IS_VALID_PAGE(nPage) ); @@ -225,19 +246,19 @@ bool wxNotebook::SetPageImage(size_t nPage, int nImage) } // set the size (the same for all pages) -void wxNotebook::SetPageSize(const wxSize& size) +void wxNotebook::SetPageSize(const wxSize& WXUNUSED(size)) { // TODO } // set the padding between tabs (in pixels) -void wxNotebook::SetPadding(const wxSize& padding) +void wxNotebook::SetPadding(const wxSize& WXUNUSED(padding)) { // TODO } // set the size of the tabs for wxNB_FIXEDWIDTH controls -void wxNotebook::SetTabSize(const wxSize& sz) +void wxNotebook::SetTabSize(const wxSize& WXUNUSED(sz)) { // TODO } @@ -251,32 +272,32 @@ bool wxNotebook::DeletePage(size_t nPage) { wxCHECK( IS_VALID_PAGE(nPage), false ); - if (m_nSelection != -1) + if (m_selection != -1) { - m_pages[m_nSelection]->Show(false); - m_pages[m_nSelection]->Lower(); + m_pages[m_selection]->Show(false); + m_pages[m_selection]->Lower(); } wxNotebookPage* pPage = GetPage(nPage); - m_tabView->RemoveTab((int) (long) pPage); + m_tabView->RemoveTab(GetPageId(m_tabView, pPage)); m_pages.Remove(pPage); delete pPage; if (m_pages.GetCount() == 0) { - m_nSelection = -1; - m_tabView->SetTabSelection(-1, false); + m_selection = -1; + m_tabView->SetTabSelection(-1, false); } - else if (m_nSelection > -1) + else if (m_selection > -1) { - m_nSelection = -1; + m_selection = -1; - m_tabView->SetTabSelection((int) (long) GetPage(0), false); + m_tabView->SetTabSelection(GetPageId(m_tabView, GetPage(0)), false); - if (m_nSelection != 0) - ChangePage(-1, 0); + if (m_selection != 0) + ChangePage(-1, 0); } RefreshLayout(false); @@ -301,29 +322,29 @@ bool wxNotebook::RemovePage(size_t nPage) // remove one page from the notebook wxWindow* wxNotebook::DoRemovePage(size_t nPage) { - wxCHECK( IS_VALID_PAGE(nPage), false ); + wxCHECK( IS_VALID_PAGE(nPage), NULL ); m_pages[nPage]->Show(false); // m_pages[nPage]->Lower(); wxNotebookPage* pPage = GetPage(nPage); - m_tabView->RemoveTab((int) (long) pPage); + m_tabView->RemoveTab(GetPageId(m_tabView, pPage)); m_pages.Remove(pPage); if (m_pages.GetCount() == 0) { - m_nSelection = -1; + m_selection = -1; m_tabView->SetTabSelection(-1, true); } - else if (m_nSelection > -1) + else if (m_selection > -1) { // Only change the selection if the page we // deleted was the selection. - if (nPage == (size_t)m_nSelection) + if (nPage == (size_t)m_selection) { - m_nSelection = -1; + m_selection = -1; // Select the first tab. Generates a ChangePage. m_tabView->SetTabSelection(0, true); } @@ -332,8 +353,8 @@ wxWindow* wxNotebook::DoRemovePage(size_t nPage) // We must adjust which tab we think is selected. // If greater than the page we deleted, it must be moved down // a notch. - if (size_t(m_nSelection) > nPage) - m_nSelection -- ; + if (size_t(m_selection) > nPage) + m_selection -- ; } } @@ -382,12 +403,12 @@ bool wxNotebook::InsertPage(size_t nPage, wxNotebookPage *pPage, const wxString& strText, bool bSelect, - int imageId) + int WXUNUSED(imageId)) { wxASSERT( pPage != NULL ); wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), false ); - m_tabView->AddTab((int) (long) pPage, strText); + m_tabView->AddTab(GetPageId(m_tabView, pPage), strText); if (!bSelect) pPage->Show(false); @@ -399,12 +420,12 @@ bool wxNotebook::InsertPage(size_t nPage, { // This will cause ChangePage to be called, via OnSelPage - m_tabView->SetTabSelection((int) (long) pPage, true); + m_tabView->SetTabSelection(GetPageId(m_tabView, pPage), true); } // some page must be selected: either this one or the first one if there is // still no selection - if ( m_nSelection == -1 ) + if ( m_selection == -1 ) ChangePage(-1, 0); RefreshLayout(false); @@ -518,12 +539,12 @@ bool wxNotebook::RefreshLayout(bool force) return true; } -void wxNotebook::OnSelChange(wxNotebookEvent& event) +void wxNotebook::OnSelChange(wxBookCtrlEvent& event) { // is it our tab control? if ( event.GetEventObject() == this ) { - if (event.GetSelection() != m_nSelection) + if (event.GetSelection() != m_selection) ChangePage(event.GetOldSelection(), event.GetSelection()); } @@ -534,23 +555,25 @@ void wxNotebook::OnSelChange(wxNotebookEvent& event) void wxNotebook::OnSetFocus(wxFocusEvent& event) { // set focus to the currently selected page if any - if ( m_nSelection != -1 ) - m_pages[m_nSelection]->SetFocus(); + if ( m_selection != -1 ) + m_pages[m_selection]->SetFocus(); event.Skip(); } void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) { - if ( event.IsWindowChange() ) { + if ( event.IsWindowChange() ) + { // change pages AdvanceSelection(event.GetDirection()); } else { // pass to the parent - if ( GetParent() ) { + if ( GetParent() ) + { event.SetCurrentFocus(this); - GetParent()->ProcessEvent(event); + GetParent()->ProcessWindowEvent(event); } } } @@ -603,7 +626,7 @@ void wxNotebook::ChangePage(int nOldSel, int nSel) pPage->Raise(); pPage->SetFocus(); - m_nSelection = nSel; + m_selection = nSel; } void wxNotebook::OnMouseEvent(wxMouseEvent& event) @@ -619,6 +642,17 @@ void wxNotebook::OnPaint(wxPaintEvent& WXUNUSED(event) ) m_tabView->Draw(dc); } +wxSize wxNotebook::CalcSizeFromPage(const wxSize& sizePage) const +{ + // MBN: since the total tab height is really a function of the + // width, this should really call + // GetTotalTabHeightPretendingWidthIs(), but the current + // implementation will suffice, provided the wxNotebook has been + // created with a sensible initial width. + return wxSize( sizePage.x + 12, + sizePage.y + m_tabView->GetTotalTabHeight() + 6 + 4 ); +} + wxRect wxNotebook::GetAvailableClientSize() { int cw, ch; @@ -642,7 +676,8 @@ wxRect wxNotebook::GetAvailableClientSize() IMPLEMENT_CLASS(wxNotebookTabView, wxTabView) -wxNotebookTabView::wxNotebookTabView(wxNotebook *notebook, long style): wxTabView(style) +wxNotebookTabView::wxNotebookTabView(wxNotebook *notebook, long style) + : wxTabView(style), m_nextid(1) { m_notebook = notebook; @@ -655,18 +690,31 @@ wxNotebookTabView::~wxNotebookTabView(void) { } +int wxNotebookTabView::GetId(wxNotebookPage *page) +{ + int& id = m_pageToId[page]; + + if (!id) + { + id = m_nextid++; + m_idToPage[id] = page; + } + + return id; +} + // Called when a tab is activated void wxNotebookTabView::OnTabActivate(int activateId, int deactivateId) { if (!m_notebook) return; - wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_notebook->GetId()); + wxBookCtrlEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_notebook->GetId()); // Translate from wxTabView's ids (which aren't position-dependent) // to wxNotebook's (which are). - wxNotebookPage* pActive = (wxNotebookPage*) activateId; - wxNotebookPage* pDeactive = (wxNotebookPage*) deactivateId; + wxNotebookPage* pActive = GetPage(activateId); + wxNotebookPage* pDeactive = GetPage(deactivateId); int activatePos = m_notebook->FindPagePosition(pActive); int deactivatePos = m_notebook->FindPagePosition(pDeactive); @@ -684,12 +732,12 @@ bool wxNotebookTabView::OnTabPreActivate(int activateId, int deactivateId) if (m_notebook) { - wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_notebook->GetId()); + wxBookCtrlEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, m_notebook->GetId()); // Translate from wxTabView's ids (which aren't position-dependent) // to wxNotebook's (which are). - wxNotebookPage* pActive = (wxNotebookPage*) activateId; - wxNotebookPage* pDeactive = (wxNotebookPage*) deactivateId; + wxNotebookPage* pActive = GetPage(activateId); + wxNotebookPage* pDeactive = GetPage(deactivateId); int activatePos = m_notebook->FindPagePosition(pActive); int deactivatePos = m_notebook->FindPagePosition(pDeactive); @@ -705,3 +753,4 @@ bool wxNotebookTabView::OnTabPreActivate(int activateId, int deactivateId) return retval; } +#endif // wxUSE_NOTEBOOK