]> git.saurik.com Git - wxWidgets.git/blobdiff - src/qt/notebook.cpp
Should work for wxMSW, now. Cannot test this myself, though.
[wxWidgets.git] / src / qt / notebook.cpp
index bb8f9c4f3ccafcce14e10c94d00378c0996025f1..aecb879f4bf2a2c778d750c183db3d3ea9eaf2ad 100644 (file)
-/////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
 // 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  <wx/string.h>
+#include  <wx/log.h>
+#include  <wx/imaglist.h>
+#include  <wx/notebook.h>
+
+// ----------------------------------------------------------------------------
+// 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)