1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/msw/notebook.h
3 // Purpose:     MSW/GTK compatible notebook (a.k.a. property sheet)
4 // Author:      Robert Roebling
5 // Modified by: Vadim Zeitlin for Windows version
6 // RCS-ID:      $Id: notebook.h 41797 2006-10-09 12:10:01Z VZ $
7 // Copyright:   (c) Julian Smart
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef _NOTEBOOK_H
12 #define _NOTEBOOK_H
13 
14 #if wxUSE_NOTEBOOK
15 
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19 
20 #include "wx/control.h"
21 
22 // ----------------------------------------------------------------------------
23 // wxNotebook
24 // ----------------------------------------------------------------------------
25 
26 class WXDLLEXPORT wxNotebookPageInfo : public wxObject
27 {
28 public :
wxNotebookPageInfo()29     wxNotebookPageInfo() { m_page = NULL; m_imageId = -1; m_selected = false; }
~wxNotebookPageInfo()30     virtual ~wxNotebookPageInfo() { }
31 
Create(wxNotebookPage * page,const wxString & text,bool selected,int imageId)32     void Create(wxNotebookPage *page,
33                 const wxString& text,
34                 bool selected,
35                 int imageId)
36     {
37         m_page = page;
38         m_text = text;
39         m_selected = selected;
40         m_imageId = imageId;
41     }
42 
GetPage()43     wxNotebookPage* GetPage() const { return m_page; }
GetText()44     wxString GetText() const { return m_text; }
GetSelected()45     bool GetSelected() const { return m_selected; }
GetImageId()46     int GetImageId() const { return m_imageId; }
47 
48 private:
49     wxNotebookPage *m_page;
50     wxString m_text;
51     bool m_selected;
52     int m_imageId;
53 
54     DECLARE_DYNAMIC_CLASS(wxNotebookPageInfo)
55 };
56 
57 
58 WX_DECLARE_EXPORTED_LIST(wxNotebookPageInfo, wxNotebookPageInfoList );
59 
60 class WXDLLEXPORT wxNotebook : public wxNotebookBase
61 {
62 public:
63   // ctors
64   // -----
65     // default for dynamic class
66   wxNotebook();
67     // the same arguments as for wxControl (@@@ any special styles?)
68   wxNotebook(wxWindow *parent,
69              wxWindowID id,
70              const wxPoint& pos = wxDefaultPosition,
71              const wxSize& size = wxDefaultSize,
72              long style = 0,
73              const wxString& name = wxNotebookNameStr);
74     // Create() function
75   bool Create(wxWindow *parent,
76               wxWindowID id,
77               const wxPoint& pos = wxDefaultPosition,
78               const wxSize& size = wxDefaultSize,
79               long style = 0,
80               const wxString& name = wxNotebookNameStr);
81   virtual ~wxNotebook();
82 
83   // accessors
84   // ---------
85     // get number of pages in the dialog
86   virtual size_t GetPageCount() const;
87 
88     // set the currently selected page, return the index of the previously
89     // selected one (or -1 on error)
90     // NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events
91   int SetSelection(size_t nPage);
92     // get the currently selected page
GetSelection()93   int GetSelection() const { return m_nSelection; }
94 
95     // changes selected page without sending events
96   int ChangeSelection(size_t nPage);
97 
98     // set/get the title of a page
99   bool SetPageText(size_t nPage, const wxString& strText);
100   wxString GetPageText(size_t nPage) const;
101 
102   // image list stuff: each page may have an image associated with it. All
103   // the images belong to an image list, so you have to
104   // 1) create an image list
105   // 2) associate it with the notebook
106   // 3) set for each page it's image
107     // associate image list with a control
108   void SetImageList(wxImageList* imageList);
109 
110     // sets/returns item's image index in the current image list
111   int  GetPageImage(size_t nPage) const;
112   bool SetPageImage(size_t nPage, int nImage);
113 
114     // currently it's always 1 because wxGTK doesn't support multi-row
115     // tab controls
116   int GetRowCount() const;
117 
118   // control the appearance of the notebook pages
119     // set the size (the same for all pages)
120   void SetPageSize(const wxSize& size);
121     // set the padding between tabs (in pixels)
122   void SetPadding(const wxSize& padding);
123 
124   // operations
125   // ----------
126     // remove all pages
127   bool DeleteAllPages();
128 
129     // inserts a new page to the notebook (it will be deleted ny the notebook,
130     // don't delete it yourself). If bSelect, this page becomes active.
131   bool InsertPage(size_t nPage,
132                   wxNotebookPage *pPage,
133                   const wxString& strText,
134                   bool bSelect = false,
135                   int imageId = -1);
136 
AddPageInfo(wxNotebookPageInfo * info)137   void AddPageInfo( wxNotebookPageInfo* info ) { AddPage( info->GetPage() , info->GetText() , info->GetSelected() , info->GetImageId() ); }
138   const wxNotebookPageInfoList& GetPageInfos() const;
139 
140     // Windows-only at present. Also, you must use the wxNB_FIXEDWIDTH
141     // style.
142   void SetTabSize(const wxSize& sz);
143 
144     // hit test
145   virtual int HitTest(const wxPoint& pt, long *flags = NULL) const;
146 
147     // calculate the size of the notebook from the size of its page
148   virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const;
149 
150   // callbacks
151   // ---------
152   void OnSize(wxSizeEvent& event);
153   void OnSelChange(wxNotebookEvent& event);
154   void OnNavigationKey(wxNavigationKeyEvent& event);
155 
156   // base class virtuals
157   // -------------------
158 
159   virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
160   virtual bool MSWOnScroll(int orientation, WXWORD nSBCode,
161                            WXWORD pos, WXHWND control);
162 
163 #if wxUSE_CONSTRAINTS
164   virtual void SetConstraintSizes(bool recurse = true);
165   virtual bool DoPhase(int nPhase);
166 #endif // wxUSE_CONSTRAINTS
167 
168   // Attempts to get colour for UX theme page background
169   wxColour GetThemeBackgroundColour() const;
170 
171   // implementation only
172   // -------------------
173 
174 #if wxUSE_UXTHEME
SetBackgroundColour(const wxColour & colour)175   virtual bool SetBackgroundColour(const wxColour& colour)
176   {
177       if ( !wxNotebookBase::SetBackgroundColour(colour) )
178           return false;
179 
180       UpdateBgBrush();
181 
182       return true;
183   }
184 
185   // return the themed brush for painting our children
186   virtual WXHBRUSH MSWGetBgBrushForChild(WXHDC hDC, WXHWND hWnd);
187 
188   // draw child background
189   virtual bool MSWPrintChild(WXHDC hDC, wxWindow *win);
190 #endif // wxUSE_UXTHEME
191 
192   // translate wxWin styles to the Windows ones
193   virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle = NULL) const;
194 
195 protected:
196   // common part of all ctors
197   void Init();
198 
199   // hides the currently shown page and shows the given one (if not -1) and
200   // updates m_nSelection accordingly
201   void UpdateSelection(int selNew);
202 
203   // remove one page from the notebook, without deleting
204   virtual wxNotebookPage *DoRemovePage(size_t nPage);
205 
206   // get the page rectangle for the current notebook size
207   //
208   // returns empty rectangle if an error occurs, do test for it
209   wxRect GetPageSize() const;
210 
211   // set the size of the given page to fit in the notebook
212   void AdjustPageSize(wxNotebookPage *page);
213 
214 #if wxUSE_UXTHEME
215   // gets the bitmap of notebook background and returns a brush from it
216   WXHBRUSH QueryBgBitmap();
217 
218   // creates the brush to be used for drawing the tab control background
219   void UpdateBgBrush();
220 
221   // common part of QueryBgBitmap() and MSWPrintChild()
222   //
223   // if child == NULL, draw background for the entire notebook itself
224   bool DoDrawBackground(WXHDC hDC, wxWindow *child = NULL);
225 #endif // wxUSE_UXTHEME
226 
227   // these function are only used for reducing flicker on notebook resize and
228   // we don't need to do this for WinCE
229 #ifndef __WXWINCE__
230   void OnEraseBackground(wxEraseEvent& event);
231   void OnPaint(wxPaintEvent& event);
232 
233   // true if we have already subclassed our updown control
234   bool m_hasSubclassedUpdown;
235 #endif // __WXWINCE__
236 
237   // the current selection (-1 if none)
238   int m_nSelection;
239 
240   wxNotebookPageInfoList m_pageInfos;
241 
242 #if wxUSE_UXTHEME
243   // background brush used to paint the tab control
244   WXHBRUSH m_hbrBackground;
245 #endif // wxUSE_UXTHEME
246 
247 
248   DECLARE_DYNAMIC_CLASS_NO_COPY(wxNotebook)
249   DECLARE_EVENT_TABLE()
250 };
251 
252 #endif // wxUSE_NOTEBOOK
253 
254 #endif // _NOTEBOOK_H
255