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