]> git.saurik.com Git - wxWidgets.git/blob - include/wx/univ/notebook.h
maintaint the mouse capture stack in all ports, not just wxUniv
[wxWidgets.git] / include / wx / univ / notebook.h
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$
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
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);
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
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
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
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