1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/univ/notebook.h
3 // Purpose:     universal version of wxNotebook
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     01.02.01
7 // RCS-ID:      $Id: notebook.h,v 1.1 2006/12/02 15:58:58 scara Exp $
8 // Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
9 // Licence:     wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_UNIV_NOTEBOOK_H_
13 #define _WX_UNIV_NOTEBOOK_H_
14 
15 #ifdef __GNUG__
16     #pragma interface "univnotebook.h"
17 #endif
18 
19 class WXDLLEXPORT wxSpinButton;
20 
21 // ----------------------------------------------------------------------------
22 // the actions supported by this control
23 // ----------------------------------------------------------------------------
24 
25 // change the page: to the next/previous/given one
26 #define wxACTION_NOTEBOOK_NEXT      _T("nexttab")
27 #define wxACTION_NOTEBOOK_PREV      _T("prevtab")
28 #define wxACTION_NOTEBOOK_GOTO      _T("gototab")
29 
30 // ----------------------------------------------------------------------------
31 // wxNotebook
32 // ----------------------------------------------------------------------------
33 
34 class WXDLLEXPORT wxNotebook : public wxNotebookBase
35 {
36 public:
37     // ctors and such
38     // --------------
39 
wxNotebook()40     wxNotebook() { Init(); }
41 
42     wxNotebook(wxWindow *parent,
43                wxWindowID id,
44                const wxPoint& pos = wxDefaultPosition,
45                const wxSize& size = wxDefaultSize,
46                long style = 0,
47                const wxString& name = wxNOTEBOOK_NAME)
48     {
49         Init();
50 
51         (void)Create(parent, id, pos, size, style, name);
52     }
53 
54     // quasi ctor
55     bool Create(wxWindow *parent,
56                 wxWindowID id,
57                 const wxPoint& pos = wxDefaultPosition,
58                 const wxSize& size = wxDefaultSize,
59                 long style = 0,
60                 const wxString& name = wxNOTEBOOK_NAME);
61 
62     // dtor
63     virtual ~wxNotebook();
64 
65     // implement wxNotebookBase pure virtuals
66     // --------------------------------------
67 
68     virtual int SetSelection(int nPage);
GetSelection()69     virtual int GetSelection() const { return m_sel; }
70 
71     virtual bool SetPageText(int nPage, const wxString& strText);
72     virtual wxString GetPageText(int nPage) const;
73 
74     virtual int GetPageImage(int nPage) const;
75     virtual bool SetPageImage(int nPage, int nImage);
76 
77     virtual void SetPageSize(const wxSize& size);
78     virtual void SetPadding(const wxSize& padding);
79     virtual void SetTabSize(const wxSize& sz);
80 
81     virtual wxSize CalcSizeFromPage(const wxSize& sizePage);
82 
83     virtual bool DeleteAllPages();
84 
85     virtual bool InsertPage(int nPage,
86                             wxNotebookPage *pPage,
87                             const wxString& strText,
88                             bool bSelect = FALSE,
89                             int imageId = -1);
90 
91     // style tests
92     // -----------
93 
94     // return TRUE if all tabs have the same width
FixedSizeTabs()95     bool FixedSizeTabs() const
96         { return GetWindowStyle() & wxNB_FIXEDWIDTH != 0; }
97 
98     // return wxTOP/wxBOTTOM/wxRIGHT/wxLEFT
99     wxDirection GetTabOrientation() const;
100 
101     // return TRUE if the notebook has tabs at the sidesand not at the top (or
102     // bottom) as usual
103     bool IsVertical() const;
104 
105     // hit testing
106     // -----------
107 
108     // return the tab at this position or -1 if none
109     int HitTest(const wxPoint& pt) const;
110 
111     // input handling
112     // --------------
113 
114     virtual bool PerformAction(const wxControlAction& action,
115                                long numArg = 0l,
116                                const wxString& strArg = wxEmptyString);
117 
118     // refresh the currently selected tab
119     void RefreshCurrent();
120 
121 protected:
122     virtual wxNotebookPage *DoRemovePage(int nPage);
123 
124     // drawing
125     virtual void DoDraw(wxControlRenderer *renderer);
126     void DoDrawTab(wxDC& dc, const wxRect& rect, size_t n);
127 
128     // resizing
129     virtual wxSize DoGetBestClientSize() const;
130     virtual void DoMoveWindow(int x, int y, int width, int height);
131     virtual void DoSetSize(int x, int y,
132                            int width, int height,
133                            int sizeFlags = wxSIZE_AUTO);
134 
135     // common part of all ctors
136     void Init();
137 
138     // resize the tab to fit its title (and icon if any)
139     void ResizeTab(int page);
140 
141     // recalculate the geometry of the notebook completely
142     void Relayout();
143 
144     // is the spin button currently shown?
145     bool HasSpinBtn() const;
146 
147     // calculate last (fully) visible tab: updates m_lastVisible
148     void CalcLastVisibleTab();
149 
150     // show or hide the spin control for tabs scrolling depending on whether it
151     // is needed or not
152     void UpdateSpinBtn();
153 
154     // position the spin button
155     void PositionSpinBtn();
156 
157     // refresh the given tab only
158     void RefreshTab(int page, bool forceSelected = FALSE);
159 
160     // refresh all tabs
161     void RefreshAllTabs();
162 
163     // get the tab rect (inefficient, don't use this in a loop)
164     wxRect GetTabRect(int page) const;
165 
166     // get the rectangle containing all tabs
167     wxRect GetAllTabsRect() const;
168 
169     // get the part occupied by the tabs - slightly smaller than
170     // GetAllTabsRect() because the tabs may be indented from it
171     wxRect GetTabsPart() const;
172 
173     // calculate the tab size (without padding)
174     wxSize CalcTabSize(int page) const;
175 
176     // get the (cached) size of a tab
177     void GetTabSize(int page, wxCoord *w, wxCoord *h) const;
178 
179     // get the (cached) width of the tab
GetTabWidth(int page)180     wxCoord GetTabWidth(int page) const
181         { return FixedSizeTabs() ? m_widthMax : m_widths[page]; }
182 
183     // return TRUE if the tab has an associated image
HasImage(int page)184     bool HasImage(int page) const
185         { return m_imageList && m_images[page] != -1; }
186 
187     // get the part of the notebook reserved for the pages (slightly larger
188     // than GetPageRect() as we draw a border and leave marginin between)
189     wxRect GetPagePart() const;
190 
191     // get the page rect in our client coords
192     wxRect GetPageRect() const;
193 
194     // get our client size from the page size
195     wxSize GetSizeForPage(const wxSize& size) const;
196 
197     // change thep age and send events about it (can be vetoed by user code)
198     void ChangePage(int nPage);
199 
200     // scroll the tabs so that the first page shown becomes the given one
201     void ScrollTo(int page);
202 
203     // scroll the tabs so that the first page shown becomes the given one
204     void ScrollLastTo(int page);
205 
206     // the pages titles
207     wxArrayString m_titles;
208 
209     // the current selection
210     size_t m_sel;
211 
212     // the spin button to change the pages
213     wxSpinButton *m_spinbtn;
214 
215     // the offset of the first page shown (may be changed with m_spinbtn)
216     wxCoord m_offset;
217 
218     // the first and last currently visible tabs: the name is not completely
219     // accurate as m_lastVisible is, in fact, the first tab which is *not*
220     // visible: so the visible tabs are those with indexes such that
221     // m_firstVisible <= n < m_lastVisible
222     size_t m_firstVisible,
223            m_lastVisible;
224 
225     // the last fully visible item, usually just m_lastVisible - 1 but may be
226     // different from it
227     size_t m_lastFullyVisible;
228 
229     // the height of tabs in a normal notebook or the width of tabs in a
230     // notebook with tabs on a side
231     wxCoord m_heightTab;
232 
233     // the biggest height (or width) of a notebook tab (used only if
234     // FixedSizeTabs()) or -1 if not calculated yet
235     wxCoord m_widthMax;
236 
237     // the cached widths (or heights) of tabs
238     wxArrayInt m_widths;
239 
240     // the icon indices
241     wxArrayInt m_images;
242 
243     // the accel indexes for labels
244     wxArrayInt m_accels;
245 
246     // the padding
247     wxSize m_sizePad;
248 
249     DECLARE_DYNAMIC_CLASS(wxNotebook)
250 };
251 
252 // ----------------------------------------------------------------------------
253 // wxStdNotebookInputHandler: translates SPACE and ENTER keys and the left mouse
254 // click into button press/release actions
255 // ----------------------------------------------------------------------------
256 
257 class WXDLLEXPORT wxStdNotebookInputHandler : public wxStdInputHandler
258 {
259 public:
260     wxStdNotebookInputHandler(wxInputHandler *inphand);
261 
262     virtual bool HandleKey(wxInputConsumer *consumer,
263                            const wxKeyEvent& event,
264                            bool pressed);
265     virtual bool HandleMouse(wxInputConsumer *consumer,
266                              const wxMouseEvent& event);
267     virtual bool HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event);
268     virtual bool HandleFocus(wxInputConsumer *consumer, const wxFocusEvent& event);
269     virtual bool HandleActivation(wxInputConsumer *consumer, bool activated);
270 
271 protected:
272     void HandleFocusChange(wxInputConsumer *consumer);
273 };
274 
275 #endif // _WX_UNIV_NOTEBOOK_H_
276 
277