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
26class WXDLLEXPORT wxNotebookPageInfo : public wxObject
27{
28public :
29    wxNotebookPageInfo() { m_page = NULL; m_imageId = -1; m_selected = false; }
30    virtual ~wxNotebookPageInfo() { }
31
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
43    wxNotebookPage* GetPage() const { return m_page; }
44    wxString GetText() const { return m_text; }
45    bool GetSelected() const { return m_selected; }
46    int GetImageId() const { return m_imageId; }
47
48private:
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
58WX_DECLARE_EXPORTED_LIST(wxNotebookPageInfo, wxNotebookPageInfoList );
59
60class WXDLLEXPORT wxNotebook : public wxNotebookBase
61{
62public:
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
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
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
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
195protected:
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