]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/notebook.h
crash in wxAppBase::SetActive fixed
[wxWidgets.git] / include / wx / notebook.h
index 63bbee89ead8109b379af773f81db424b2a71db3..efec6fc928fbed622f81e14b13682aa94a29e61f 100644 (file)
@@ -1,3 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        wx/notebook.h
+// Purpose:     wxNotebook interface
+// Author:      Vadim Zeitlin
+// Modified by:
+// Created:     01.02.01
+// RCS-ID:      $Id$
+// Copyright:   (c) 1996-2000 wxWindows team
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
 #ifndef _WX_NOTEBOOK_H_BASE_
 #define _WX_NOTEBOOK_H_BASE_
 
 // headers
 // ----------------------------------------------------------------------------
 
-#include "wx/event.h"   // the base class: wxNotifyEvent
+#include "wx/defs.h"
+
+#if wxUSE_NOTEBOOK
+
+#include "wx/control.h"
+#include "wx/dynarray.h"
+
+class WXDLLEXPORT wxImageList;
+
+// ----------------------------------------------------------------------------
+// types
+// ----------------------------------------------------------------------------
+
+// array of notebook pages
+typedef wxWindow wxNotebookPage;  // so far, any window can be a page
+
+WX_DEFINE_EXPORTED_ARRAY(wxNotebookPage *, wxArrayPages);
+
+#define wxNOTEBOOK_NAME _T("notebook")
+
+// ----------------------------------------------------------------------------
+// wxNotebookBase: define wxNotebook interface
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxNotebookBase : public wxControl
+{
+public:
+    // ctor
+    wxNotebookBase()
+    {
+        m_imageList = NULL;
+    }
+
+    // quasi ctor
+    bool Create(wxWindow *parent,
+                wxWindowID id,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = 0,
+                const wxString& name = wxNOTEBOOK_NAME);
+
+    // accessors
+    // ---------
+
+    // get number of pages in the dialog
+    int GetPageCount() const { return m_pages.GetCount(); }
+
+    // get the panel which represents the given page
+    wxNotebookPage *GetPage(int nPage) { return m_pages[nPage]; }
+
+    // get the currently selected page
+    virtual int GetSelection() const = 0;
+
+    // set/get the title of a page
+    virtual bool SetPageText(int nPage, const wxString& strText) = 0;
+    virtual wxString GetPageText(int nPage) const = 0;
+
+    // image list stuff: each page may have an image associated with it (all
+    // images belong to the same image list)
+    virtual void SetImageList(wxImageList* imageList)
+    {
+        m_imageList = imageList;
+    }
+
+    // get pointer (may be NULL) to the associated image list
+    wxImageList* GetImageList() const { return m_imageList; }
+
+    // sets/returns item's image index in the current image list
+    virtual int GetPageImage(int nPage) const = 0;
+    virtual bool SetPageImage(int nPage, int nImage) = 0;
+
+    // get the number of rows for a control with wxNB_MULTILINE style (not all
+    // versions support it - they will always return 1 then)
+    virtual int GetRowCount() const { return 1; }
+
+    // set the size (the same for all pages)
+    virtual void SetPageSize(const wxSize& size) = 0;
+
+    // set the padding between tabs (in pixels)
+    virtual void SetPadding(const wxSize& padding) = 0;
+
+    // set the size of the tabs for wxNB_FIXEDWIDTH controls
+    virtual void SetTabSize(const wxSize& sz) = 0;
+
+    // calculate the size of the notebook from the size of its page
+    virtual wxSize CalcSizeFromPage(const wxSize& sizePage)
+    {
+        // this was just taken from wxNotebookSizer::CalcMin() and is, of
+        // course, totally bogus - just like the original code was
+        wxSize sizeTotal = sizePage;
+        if ( HasFlag(wxNB_LEFT) || HasFlag(wxNB_RIGHT) )
+            sizeTotal.x += 90;
+        else
+            sizeTotal.y += 40;
+
+        return sizeTotal;
+    }
+
+    // operations
+    // ----------
+
+    // remove one page from the notebook and delete it
+    virtual bool DeletePage(int nPage)
+    {
+        wxNotebookPage *page = DoRemovePage(nPage);
+        if ( !page )
+            return FALSE;
+
+        delete page;
+
+        return TRUE;
+    }
+
+    // remove one page from the notebook, without deleting it
+    virtual bool RemovePage(int nPage) { return DoRemovePage(nPage) != NULL; }
+
+    // remove all pages and delete them
+    virtual bool DeleteAllPages() { WX_CLEAR_ARRAY(m_pages); return TRUE; }
+
+    // adds a new page to the notebook (it will be deleted by the notebook,
+    // don't delete it yourself) and make it the current one if bSelect
+    virtual bool AddPage(wxNotebookPage *pPage,
+                         const wxString& strText,
+                         bool bSelect = FALSE,
+                         int imageId = -1)
+    {
+        return InsertPage(GetPageCount(), pPage, strText, bSelect, imageId);
+    }
+
+    // the same as AddPage(), but adds the page at the specified position
+    virtual bool InsertPage(int nPage,
+                            wxNotebookPage *pPage,
+                            const wxString& strText,
+                            bool bSelect = FALSE,
+                            int imageId = -1) = 0;
+
+    // set the currently selected page, return the index of the previously
+    // selected one (or -1 on error)
+    //
+    // NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events
+    virtual int SetSelection(int nPage) = 0;
+
+    // cycle thru the tabs
+    void AdvanceSelection(bool forward = TRUE)
+    {
+        int nPage = GetNextPage(forward);
+        if ( nPage != -1 )
+            SetSelection(nPage);
+    }
+
+protected:
+    // remove the page and return a pointer to it
+    virtual wxNotebookPage *DoRemovePage(int page) = 0;
+
+    // get the next page wrapping if we reached the end
+    int GetNextPage(bool forward) const
+    {
+        int nPage;
+
+        int nMax = GetPageCount();
+        if ( nMax-- ) // decrement it to get the last valid index
+        {
+            int nSel = GetSelection();
+
+            // change selection wrapping if it becomes invalid
+            nPage = forward ? nSel == nMax ? 0
+                                           : nSel + 1
+                            : nSel == 0 ? nMax
+                                        : nSel - 1;
+        }
+        else // notebook is empty, no next page
+        {
+            nPage = -1;
+        }
+
+        return nPage;
+    }
+
+    wxImageList  *m_imageList; // we can have an associated image list
+    wxArrayPages  m_pages;     // array of pages
+};
 
 // ----------------------------------------------------------------------------
 // notebook event class (used by NOTEBOOK_PAGE_CHANGED/ING events)
@@ -38,50 +229,61 @@ private:
 };
 
 // ----------------------------------------------------------------------------
-// event macros
+// event types and macros for them
 // ----------------------------------------------------------------------------
 
+#if defined(__BORLANDC__) && defined(__WIN16__)
+    // For 16-bit BC++, these 2 would be identical otherwise (truncated)
+    #define wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED wxEVT_COMMAND_NB_PAGE_CHANGED
+    #define wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING wxEVT_COMMAND_NB_PAGE_CHANGING
+#endif
+
+BEGIN_DECLARE_EVENT_TYPES()
+    DECLARE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, 802)
+    DECLARE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, 803)
+END_DECLARE_EVENT_TYPES()
+
 typedef void (wxEvtHandler::*wxNotebookEventFunction)(wxNotebookEvent&);
 
 // Truncation in 16-bit BC++ means we need to define these differently
 #if defined(__BORLANDC__) && defined(__WIN16__)
 #define EVT_NOTEBOOK_PAGE_CHANGED(id, fn)                                   \
-  {                                                                         \
-    wxEVT_COMMAND_NB_PAGE_CHANGED,                                    \
+  DECLARE_EVENT_TABLE_ENTRY(                                                \
+    wxEVT_COMMAND_NB_PAGE_CHANGED,                                          \
     id,                                                                     \
     -1,                                                                     \
     (wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn,  \
     NULL                                                                    \
-  },
+  ),
 
 #define EVT_NOTEBOOK_PAGE_CHANGING(id, fn)                                  \
-  {                                                                         \
-    wxEVT_COMMAND_NB_PAGE_CHANGING,                                   \
+  DECLARE_EVENT_TABLE_ENTRY(                                                \
+    wxEVT_COMMAND_NB_PAGE_CHANGING,                                         \
     id,                                                                     \
     -1,                                                                     \
     (wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn,  \
     NULL                                                                    \
-  },
+  ),
 
 #else
 
 #define EVT_NOTEBOOK_PAGE_CHANGED(id, fn)                                   \
-  {                                                                         \
+  DECLARE_EVENT_TABLE_ENTRY(                                                \
     wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,                                    \
     id,                                                                     \
     -1,                                                                     \
     (wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn,  \
     NULL                                                                    \
-  },
+  ),
 
 #define EVT_NOTEBOOK_PAGE_CHANGING(id, fn)                                  \
-  {                                                                         \
+  DECLARE_EVENT_TABLE_ENTRY(                                                \
     wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,                                   \
     id,                                                                     \
     -1,                                                                     \
     (wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn,  \
     NULL                                                                    \
-  },
+  ),
 
 #endif
 
@@ -89,25 +291,29 @@ typedef void (wxEvtHandler::*wxNotebookEventFunction)(wxNotebookEvent&);
 // wxNotebook class itself
 // ----------------------------------------------------------------------------
 
-#if defined(__WXMSW__)
-#ifdef __WIN16__
-  #include  "wx/generic/notebook.h"
-#else
-  #include  "wx/msw/notebook.h"
-#endif
+#if defined(__WXUNIVERSAL__)
+    #include "wx/univ/notebook.h"
+#elif defined(__WXMSW__)
+    #ifdef __WIN16__
+        #include  "wx/generic/notebook.h"
+    #else
+        #include  "wx/msw/notebook.h"
+    #endif
 #elif defined(__WXMOTIF__)
-  #include  "wx/generic/notebook.h"
+    #include  "wx/generic/notebook.h"
 #elif defined(__WXGTK__)
-  #include  "wx/gtk/notebook.h"
+    #include  "wx/gtk/notebook.h"
 #elif defined(__WXQT__)
-  #include  "wx/qt/notebook.h"
+    #include  "wx/qt/notebook.h"
 #elif defined(__WXMAC__)
-  #include  "wx/mac/notebook.h"
+    #include  "wx/mac/notebook.h"
 #elif defined(__WXPM__)
-  #include  "wx/os2/notebook.h"
+    #include  "wx/os2/notebook.h"
 #elif defined(__WXSTUBS__)
-  #include  "wx/stubs/notebook.h"
+    #include  "wx/stubs/notebook.h"
 #endif
 
+#endif // wxUSE_NOTEBOOK
+
 #endif
     // _WX_NOTEBOOK_H_BASE_