X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c78e7c70271608b076b1dbed201b1204e6898d4..4d19d979165dfab92cccd656b9f75c2d516aa21b:/src/qt/notebook.cpp diff --git a/src/qt/notebook.cpp b/src/qt/notebook.cpp index bb8f9c4f3c..aecb879f4b 100644 --- a/src/qt/notebook.cpp +++ b/src/qt/notebook.cpp @@ -1,185 +1,371 @@ -///////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// // Name: notebook.cpp -// Purpose: -// Author: Robert Roebling -// Created: 01/02/97 -// Id: -// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem +// Purpose: implementation of wxNotebook +// Author: AUTHOR +// Modified by: +// Created: ??/??/98 +// RCS-ID: $Id$ +// Copyright: (c) AUTHOR // Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- #ifdef __GNUG__ #pragma implementation "notebook.h" #endif -#include "wx/notebook.h" -#include "wx/panel.h" -#include "wx/utils.h" -#include "wx/imaglist.h" -#include "wx/log.h" - -//----------------------------------------------------------------------------- -// wxNotebookPage -//----------------------------------------------------------------------------- - -class wxNotebookPage: public wxObject -{ -public: - wxNotebookPage() - { - m_id = -1; - m_text = ""; - m_image = -1; - m_page = NULL; - m_client = NULL; - m_parent = NULL; - }; - -//private: - int m_id; - wxString m_text; - int m_image; - wxWindow *m_client; -}; - -//----------------------------------------------------------------------------- -// wxNotebook -//----------------------------------------------------------------------------- - -IMPLEMENT_DYNAMIC_CLASS(wxNotebook,wxControl) +#include +#include +#include +#include + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + +// check that the page index is valid +#define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount())) + +// ---------------------------------------------------------------------------- +// event table +// ---------------------------------------------------------------------------- + +#if !USE_SHARED_LIBRARIES +BEGIN_EVENT_TABLE(wxNotebook, wxControl) + EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange) + + EVT_SIZE(wxNotebook::OnSize) + EVT_SET_FOCUS(wxNotebook::OnSetFocus) + EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) +END_EVENT_TABLE() + +IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent) +#endif + +// ============================================================================ +// implementation +// ============================================================================ +// ---------------------------------------------------------------------------- +// wxNotebook construction +// ---------------------------------------------------------------------------- + +// common part of all ctors void wxNotebook::Init() { - m_imageList = NULL; - m_pages.DeleteContents( TRUE ); + m_pImageList = NULL; + m_nSelection = -1; } +// default for dynamic class wxNotebook::wxNotebook() { - Init(); -}; + Init(); +} -wxNotebook::wxNotebook( wxWindow *parent, wxWindowID id, - const wxPoint& pos, const wxSize& size, - long style, const wxString& name ) +// the same arguments as for wxControl +wxNotebook::wxNotebook(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) { - Init(); - Create( parent, id, pos, size, style, name ); -}; + Init(); -wxNotebook::~wxNotebook() -{ - DeleteAllPages(); -}; + Create(parent, id, pos, size, style, name); +} -bool wxNotebook::Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos, const wxSize& size, - long style, const wxString& name ) +// Create() function +bool wxNotebook::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) { - PreCreation( parent, id, pos, size, style, name ); + // base init + SetName(name); + SetParent(parent); - PostCreation(); + m_windowId = id == -1 ? NewControlId() : id; - Show( TRUE ); + // colors and font + m_backgroundColour = wxColour(GetSysColor(COLOR_BTNFACE)); + m_foregroundColour = *wxBLACK ; - return TRUE; -}; + // style + m_windowStyle = style; + + if ( parent != NULL ) + parent->AddChild(this); + + // TODO + + return FALSE; +} -int wxNotebook::GetSelection() const +// dtor +wxNotebook::~wxNotebook() { -}; +} +// ---------------------------------------------------------------------------- +// wxNotebook accessors +// ---------------------------------------------------------------------------- int wxNotebook::GetPageCount() const { -}; + return m_aPages.Count(); +} int wxNotebook::GetRowCount() const { -}; + // TODO + return 0; +} -wxString wxNotebook::GetPageText( int page ) const +int wxNotebook::SetSelection(int nPage) { -}; + wxASSERT( IS_VALID_PAGE(nPage) ); -int wxNotebook::GetPageImage( int page ) const -{ -}; + ChangePage(m_nSelection, nPage); -wxNotebookPage* wxNotebook::GetNotebookPage(int page) const + // TODO + return 0; +} + +void wxNotebook::AdvanceSelection(bool bForward) { - return NULL; -}; + int nSel = GetSelection(); + int nMax = GetPageCount() - 1; + if ( bForward ) + SetSelection(nSel == nMax ? 0 : nSel + 1); + else + SetSelection(nSel == 0 ? nMax : nSel - 1); +} -int wxNotebook::SetSelection( int page ) +bool wxNotebook::SetPageText(int nPage, const wxString& strText) { -}; + wxASSERT( IS_VALID_PAGE(nPage) ); -void wxNotebook::AdvanceSelection(bool bForward) + // TODO + return FALSE; +} + +wxString wxNotebook::GetPageText(int nPage) const { + wxASSERT( IS_VALID_PAGE(nPage) ); + + // TODO + return wxString(""); } -void wxNotebook::SetImageList( wxImageList* imageList ) +int wxNotebook::GetPageImage(int nPage) const { - m_imageList = imageList; -}; + wxASSERT( IS_VALID_PAGE(nPage) ); -bool wxNotebook::SetPageText( int page, const wxString &text ) + // TODO + return 0; +} + +bool wxNotebook::SetPageImage(int nPage, int nImage) { - return TRUE; -}; + wxASSERT( IS_VALID_PAGE(nPage) ); + + // TODO + return FALSE; +} + +void wxNotebook::SetImageList(wxImageList* imageList) +{ + m_pImageList = imageList; + // TODO +} + +// ---------------------------------------------------------------------------- +// wxNotebook operations +// ---------------------------------------------------------------------------- -bool wxNotebook::SetPageImage( int page, int image ) +// remove one page from the notebook +bool wxNotebook::DeletePage(int nPage) { - return TRUE; -}; + wxCHECK( IS_VALID_PAGE(nPage), FALSE ); + + // TODO: delete native widget page + + delete m_aPages[nPage]; + m_aPages.Remove(nPage); + + return TRUE; +} -void wxNotebook::SetPageSize( const wxSize &WXUNUSED(size) ) +// remove all pages +bool wxNotebook::DeleteAllPages() { -}; + // TODO: delete native widget pages + + int nPageCount = GetPageCount(); + int nPage; + for ( nPage = 0; nPage < nPageCount; nPage++ ) + delete m_aPages[nPage]; -void wxNotebook::SetPadding( const wxSize &WXUNUSED(padding) ) + m_aPages.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); +} -bool wxNotebook::DeleteAllPages() +// same as AddPage() but does it at given position +bool wxNotebook::InsertPage(int nPage, + wxNotebookPage *pPage, + const wxString& strText, + bool bSelect, + int imageId) { - return TRUE; -}; + wxASSERT( pPage != NULL ); + wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE ); + + // TODO: insert native widget page + + // save the pointer to the page + m_aPages.Insert(pPage, nPage); + + // some page must be selected: either this one or the first one if there is + // still no selection + if ( bSelect ) + m_nSelection = nPage; + else if ( m_nSelection == -1 ) + m_nSelection = 0; + + return TRUE; +} + +// ---------------------------------------------------------------------------- +// wxNotebook callbacks +// ---------------------------------------------------------------------------- -bool wxNotebook::DeletePage( int page ) +// @@@ OnSize() is used for setting the font when it's called for the first +// time because doing it in ::Create() doesn't work (for unknown reasons) +void wxNotebook::OnSize(wxSizeEvent& event) { - return TRUE; -}; + static bool s_bFirstTime = TRUE; + if ( s_bFirstTime ) { + // TODO: any first-time-size processing. + s_bFirstTime = FALSE; + } + + // TODO: all this may or may not be necessary for your platform + + // emulate page change (it's esp. important to do it first time because + // otherwise our page would stay invisible) + int nSel = m_nSelection; + m_nSelection = -1; + SetSelection(nSel); + + // fit the notebook page to the tab control's display area + int w, hl + GetSize(&w, &h); + + uint nCount = m_aPages.Count(); + for ( uint nPage = 0; nPage < nCount; nPage++ ) { + wxNotebookPage *pPage = m_aPages[nPage]; + pPage->SetSize(0, 0, w, h); + if ( pPage->GetAutoLayout() ) + pPage->Layout(); + } + + // Processing continues to next OnSize + event.Skip(); +} -bool wxNotebook::AddPage(wxWindow* win, const wxString& text, - bool bSelect, int imageId) +void wxNotebook::OnSelChange(wxNotebookEvent& event) { - return TRUE; -}; + // is it our tab control? + if ( event.GetEventObject() == this ) + ChangePage(event.GetOldSelection(), event.GetSelection()); + + // we want to give others a chance to process this message as well + event.Skip(); +} -wxWindow *wxNotebook::GetPage( int page ) const +void wxNotebook::OnSetFocus(wxFocusEvent& event) { - return NULL; -}; + // set focus to the currently selected page if any + if ( m_nSelection != -1 ) + m_aPages[m_nSelection]->SetFocus(); + + event.Skip(); +} -void wxNotebook::AddChild( wxWindow *win ) +void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) { -}; + if ( event.IsWindowChange() ) { + // change pages + AdvanceSelection(event.GetDirection()); + } + else { + // pass to the parent + if ( GetParent() ) { + event.SetCurrentFocus(this); + GetParent()->ProcessEvent(event); + } + } +} + +// ---------------------------------------------------------------------------- +// wxNotebook base class virtuals +// ---------------------------------------------------------------------------- // override these 2 functions to do nothing: everything is done in OnSize -void wxNotebook::SetConstraintSizes( bool WXUNUSED(recurse) ) + +void wxNotebook::SetConstraintSizes(bool /* recurse */) +{ + // don't set the sizes of the pages - their correct size is not yet known + wxControl::SetConstraintSizes(FALSE); +} + +bool wxNotebook::DoPhase(int /* nPhase */) { - // don't set the sizes of the pages - their correct size is not yet known - wxControl::SetConstraintSizes(FALSE); + return TRUE; } -bool wxNotebook::DoPhase( int WXUNUSED(nPhase) ) +void wxNotebook::Command(wxCommandEvent& event) { - return TRUE; + wxFAIL_MSG("wxNotebook::Command not implemented"); } -//----------------------------------------------------------------------------- -// wxNotebookEvent -//----------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// wxNotebook helper functions +// ---------------------------------------------------------------------------- + +// hide the currently active panel and show the new one +void wxNotebook::ChangePage(int nOldSel, int nSel) +{ + wxASSERT( nOldSel != nSel ); // impossible + + if ( nOldSel != -1 ) { + m_aPages[nOldSel]->Show(FALSE); + } + + wxNotebookPage *pPage = m_aPages[nSel]; + pPage->Show(TRUE); + pPage->SetFocus(); + + m_nSelection = nSel; +} -IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent)