1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/univ/notebook.h
3 // Purpose: universal version of wxNotebook
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_UNIV_NOTEBOOK_H_
13 #define _WX_UNIV_NOTEBOOK_H_
15 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
16 #pragma interface "univnotebook.h"
19 #include "wx/arrstr.h"
21 class WXDLLEXPORT wxSpinButton
;
23 // ----------------------------------------------------------------------------
24 // the actions supported by this control
25 // ----------------------------------------------------------------------------
27 // change the page: to the next/previous/given one
28 #define wxACTION_NOTEBOOK_NEXT _T("nexttab")
29 #define wxACTION_NOTEBOOK_PREV _T("prevtab")
30 #define wxACTION_NOTEBOOK_GOTO _T("gototab")
32 // ----------------------------------------------------------------------------
34 // ----------------------------------------------------------------------------
36 class WXDLLEXPORT wxNotebook
: public wxNotebookBase
42 wxNotebook() { Init(); }
44 wxNotebook(wxWindow
*parent
,
46 const wxPoint
& pos
= wxDefaultPosition
,
47 const wxSize
& size
= wxDefaultSize
,
49 const wxString
& name
= wxNOTEBOOK_NAME
)
53 (void)Create(parent
, id
, pos
, size
, style
, name
);
57 bool Create(wxWindow
*parent
,
59 const wxPoint
& pos
= wxDefaultPosition
,
60 const wxSize
& size
= wxDefaultSize
,
62 const wxString
& name
= wxNOTEBOOK_NAME
);
65 virtual ~wxNotebook();
67 // implement wxNotebookBase pure virtuals
68 // --------------------------------------
70 virtual int SetSelection(size_t nPage
);
71 virtual int GetSelection() const { return m_sel
; }
73 virtual bool SetPageText(size_t nPage
, const wxString
& strText
);
74 virtual wxString
GetPageText(size_t nPage
) const;
76 virtual int GetPageImage(size_t nPage
) const;
77 virtual bool SetPageImage(size_t nPage
, int nImage
);
79 virtual void SetPageSize(const wxSize
& size
);
80 virtual void SetPadding(const wxSize
& padding
);
81 virtual void SetTabSize(const wxSize
& sz
);
83 virtual wxSize
CalcSizeFromPage(const wxSize
& sizePage
) const;
85 virtual bool DeleteAllPages();
87 virtual bool InsertPage(size_t nPage
,
88 wxNotebookPage
*pPage
,
89 const wxString
& strText
,
96 // return TRUE if all tabs have the same width
97 bool FixedSizeTabs() const
98 { return GetWindowStyle() & wxNB_FIXEDWIDTH
!= 0; }
100 // return wxTOP/wxBOTTOM/wxRIGHT/wxLEFT
101 wxDirection
GetTabOrientation() const;
103 // return TRUE if the notebook has tabs at the sidesand not at the top (or
105 bool IsVertical() const;
110 virtual int HitTest(const wxPoint
& pt
, long *flags
= NULL
) const;
115 virtual bool PerformAction(const wxControlAction
& action
,
117 const wxString
& strArg
= wxEmptyString
);
119 // refresh the currently selected tab
120 void RefreshCurrent();
123 virtual wxNotebookPage
*DoRemovePage(size_t nPage
);
126 virtual void DoDraw(wxControlRenderer
*renderer
);
127 void DoDrawTab(wxDC
& dc
, const wxRect
& rect
, size_t n
);
130 virtual wxSize
DoGetBestClientSize() const;
131 virtual void DoMoveWindow(int x
, int y
, int width
, int height
);
132 virtual void DoSetSize(int x
, int y
,
133 int width
, int height
,
134 int sizeFlags
= wxSIZE_AUTO
);
136 // common part of all ctors
139 // resize the tab to fit its title (and icon if any)
140 void ResizeTab(int page
);
142 // recalculate the geometry of the notebook completely
145 // is the spin button currently shown?
146 bool HasSpinBtn() const;
148 // calculate last (fully) visible tab: updates m_lastVisible
149 void CalcLastVisibleTab();
151 // show or hide the spin control for tabs scrolling depending on whether it
153 void UpdateSpinBtn();
155 // position the spin button
156 void PositionSpinBtn();
158 // refresh the given tab only
159 void RefreshTab(int page
, bool forceSelected
= FALSE
);
162 void RefreshAllTabs();
164 // get the tab rect (inefficient, don't use this in a loop)
165 wxRect
GetTabRect(int page
) const;
167 // get the rectangle containing all tabs
168 wxRect
GetAllTabsRect() const;
170 // get the part occupied by the tabs - slightly smaller than
171 // GetAllTabsRect() because the tabs may be indented from it
172 wxRect
GetTabsPart() const;
174 // calculate the tab size (without padding)
175 wxSize
CalcTabSize(int page
) const;
177 // get the (cached) size of a tab
178 void GetTabSize(int page
, wxCoord
*w
, wxCoord
*h
) const;
180 // get the (cached) width of the tab
181 wxCoord
GetTabWidth(int page
) const
182 { return FixedSizeTabs() ? m_widthMax
: m_widths
[page
]; }
184 // return TRUE if the tab has an associated image
185 bool HasImage(int page
) const
186 { return m_imageList
&& m_images
[page
] != -1; }
188 // get the part of the notebook reserved for the pages (slightly larger
189 // than GetPageRect() as we draw a border and leave marginin between)
190 wxRect
GetPagePart() const;
192 // get the page rect in our client coords
193 wxRect
GetPageRect() const;
195 // get our client size from the page size
196 wxSize
GetSizeForPage(const wxSize
& size
) const;
198 // scroll the tabs so that the first page shown becomes the given one
199 void ScrollTo(int page
);
201 // scroll the tabs so that the first page shown becomes the given one
202 void ScrollLastTo(int page
);
205 wxArrayString m_titles
;
207 // the current selection
210 // the spin button to change the pages
211 wxSpinButton
*m_spinbtn
;
213 // the offset of the first page shown (may be changed with m_spinbtn)
216 // the first and last currently visible tabs: the name is not completely
217 // accurate as m_lastVisible is, in fact, the first tab which is *not*
218 // visible: so the visible tabs are those with indexes such that
219 // m_firstVisible <= n < m_lastVisible
220 size_t m_firstVisible
,
223 // the last fully visible item, usually just m_lastVisible - 1 but may be
225 size_t m_lastFullyVisible
;
227 // the height of tabs in a normal notebook or the width of tabs in a
228 // notebook with tabs on a side
231 // the biggest height (or width) of a notebook tab (used only if
232 // FixedSizeTabs()) or -1 if not calculated yet
235 // the cached widths (or heights) of tabs
241 // the accel indexes for labels
247 DECLARE_DYNAMIC_CLASS(wxNotebook
)
250 // ----------------------------------------------------------------------------
251 // wxStdNotebookInputHandler: translates SPACE and ENTER keys and the left mouse
252 // click into button press/release actions
253 // ----------------------------------------------------------------------------
255 class WXDLLEXPORT wxStdNotebookInputHandler
: public wxStdInputHandler
258 wxStdNotebookInputHandler(wxInputHandler
*inphand
);
260 virtual bool HandleKey(wxInputConsumer
*consumer
,
261 const wxKeyEvent
& event
,
263 virtual bool HandleMouse(wxInputConsumer
*consumer
,
264 const wxMouseEvent
& event
);
265 virtual bool HandleMouseMove(wxInputConsumer
*consumer
, const wxMouseEvent
& event
);
266 virtual bool HandleFocus(wxInputConsumer
*consumer
, const wxFocusEvent
& event
);
267 virtual bool HandleActivation(wxInputConsumer
*consumer
, bool activated
);
270 void HandleFocusChange(wxInputConsumer
*consumer
);
273 #endif // _WX_UNIV_NOTEBOOK_H_