1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: tabg.h 3 // Purpose: Generic tabbed dialogs 4 // Author: Julian Smart 5 // Modified by: 6 // Created: 01/02/97 7 // RCS-ID: $Id: tabg.h 41020 2006-09-05 20:47:48Z VZ $ 8 // Copyright: (c) Julian Smart 9 // Licence: wxWindows licence 10 ///////////////////////////////////////////////////////////////////////////// 11 12 #ifndef __TABGH_G__ 13 #define __TABGH_G__ 14 15 #define WXTAB_VERSION 1.1 16 17 #include "wx/hashmap.h" 18 #include "wx/string.h" 19 #include "wx/dialog.h" 20 #include "wx/panel.h" 21 #include "wx/list.h" 22 23 class WXDLLEXPORT wxTabView; 24 25 /* 26 * A wxTabControl is the internal and visual representation 27 * of the tab. 28 */ 29 30 class WXDLLEXPORT wxTabControl: public wxObject 31 { 32 DECLARE_DYNAMIC_CLASS(wxTabControl) 33 public: 34 wxTabControl(wxTabView *v = (wxTabView *) NULL); 35 virtual ~wxTabControl(void); 36 37 virtual void OnDraw(wxDC& dc, bool lastInRow); SetLabel(const wxString & str)38 void SetLabel(const wxString& str) { m_controlLabel = str; } GetLabel(void)39 wxString GetLabel(void) const { return m_controlLabel; } 40 SetFont(const wxFont & f)41 void SetFont(const wxFont& f) { m_labelFont = f; } GetFont(void)42 wxFont *GetFont(void) const { return (wxFont*) & m_labelFont; } 43 SetSelected(bool sel)44 void SetSelected(bool sel) { m_isSelected = sel; } IsSelected(void)45 bool IsSelected(void) const { return m_isSelected; } 46 SetPosition(int x,int y)47 void SetPosition(int x, int y) { m_offsetX = x; m_offsetY = y; } SetSize(int x,int y)48 void SetSize(int x, int y) { m_width = x; m_height = y; } 49 SetRowPosition(int r)50 void SetRowPosition(int r) { m_rowPosition = r; } GetRowPosition()51 int GetRowPosition() const { return m_rowPosition; } SetColPosition(int c)52 void SetColPosition(int c) { m_colPosition = c; } GetColPosition()53 int GetColPosition() const { return m_colPosition; } 54 GetX(void)55 int GetX(void) const { return m_offsetX; } GetY(void)56 int GetY(void) const { return m_offsetY; } GetWidth(void)57 int GetWidth(void) const { return m_width; } GetHeight(void)58 int GetHeight(void) const { return m_height; } 59 GetId(void)60 int GetId(void) const { return m_id; } SetId(int i)61 void SetId(int i) { m_id = i; } 62 63 virtual bool HitTest(int x, int y) const ; 64 65 protected: 66 wxTabView* m_view; 67 wxString m_controlLabel; 68 bool m_isSelected; 69 wxFont m_labelFont; 70 int m_offsetX; // Offsets from top-left of tab view area (the area below the tabs) 71 int m_offsetY; 72 int m_width; 73 int m_height; 74 int m_id; 75 int m_rowPosition; // Position in row from 0 76 int m_colPosition; // Position in col from 0 77 }; 78 79 /* 80 * Each wxTabLayer is a list of tabs. E.g. there 81 * are 3 layers in the MS Word Options dialog. 82 */ 83 84 class WXDLLEXPORT wxTabLayer: public wxList 85 { 86 }; 87 88 /* 89 * The wxTabView controls and draws the tabbed object 90 */ 91 92 WX_DECLARE_LIST(wxTabLayer, wxTabLayerList); 93 94 #define wxTAB_STYLE_DRAW_BOX 1 // Draws 3D boxes round tab layers 95 #define wxTAB_STYLE_COLOUR_INTERIOR 2 // Colours interior of tabs, otherwise draws outline 96 97 class WXDLLEXPORT wxTabView: public wxObject 98 { 99 DECLARE_DYNAMIC_CLASS(wxTabView) 100 public: 101 wxTabView(long style = wxTAB_STYLE_DRAW_BOX | wxTAB_STYLE_COLOUR_INTERIOR); 102 virtual ~wxTabView(); 103 GetNumberOfLayers()104 inline int GetNumberOfLayers() const { return m_layers.GetCount(); } 105 #if WXWIN_COMPATIBILITY_2_4 GetLayers()106 inline wxList& GetLayers() { return *(wxList *)&m_layers; } 107 #else GetLayers()108 inline wxTabLayerList& GetLayers() { return m_layers; } 109 #endif 110 SetWindow(wxWindow * wnd)111 inline void SetWindow(wxWindow* wnd) { m_window = wnd; } GetWindow(void)112 inline wxWindow* GetWindow(void) const { return m_window; } 113 114 // Automatically positions tabs 115 wxTabControl *AddTab(int id, const wxString& label, wxTabControl *existingTab = (wxTabControl *) NULL); 116 117 // Remove the tab without deleting the window 118 bool RemoveTab(int id); 119 120 void ClearTabs(bool deleteTabs = true); 121 122 bool SetTabText(int id, const wxString& label); 123 wxString GetTabText(int id) const; 124 125 // Layout tabs (optional, e.g. if resizing window) 126 void LayoutTabs(); 127 128 // Draw all tabs 129 virtual void Draw(wxDC& dc); 130 131 // Process mouse event, return false if we didn't process it 132 virtual bool OnEvent(wxMouseEvent& event); 133 134 // Called when a tab is activated 135 virtual void OnTabActivate(int activateId, int deactivateId); 136 // Allows vetoing OnTabPreActivate(int WXUNUSED (activateId),int WXUNUSED (deactivateId))137 virtual bool OnTabPreActivate(int WXUNUSED(activateId), int WXUNUSED(deactivateId) ) { return true; }; 138 139 // Allows use of application-supplied wxTabControl classes. OnCreateTabControl(void)140 virtual wxTabControl *OnCreateTabControl(void) { return new wxTabControl(this); } 141 142 void SetHighlightColour(const wxColour& col); 143 void SetShadowColour(const wxColour& col); 144 void SetBackgroundColour(const wxColour& col); SetTextColour(const wxColour & col)145 inline void SetTextColour(const wxColour& col) { m_textColour = col; } 146 GetHighlightColour(void)147 inline wxColour GetHighlightColour(void) const { return m_highlightColour; } GetShadowColour(void)148 inline wxColour GetShadowColour(void) const { return m_shadowColour; } GetBackgroundColour(void)149 inline wxColour GetBackgroundColour(void) const { return m_backgroundColour; } GetTextColour(void)150 inline wxColour GetTextColour(void) const { return m_textColour; } GetHighlightPen(void)151 inline const wxPen *GetHighlightPen(void) const { return m_highlightPen; } GetShadowPen(void)152 inline const wxPen *GetShadowPen(void) const { return m_shadowPen; } GetBackgroundPen(void)153 inline const wxPen *GetBackgroundPen(void) const { return m_backgroundPen; } GetBackgroundBrush(void)154 inline const wxBrush *GetBackgroundBrush(void) const { return m_backgroundBrush; } 155 SetViewRect(const wxRect & rect)156 inline void SetViewRect(const wxRect& rect) { m_tabViewRect = rect; } GetViewRect(void)157 inline wxRect GetViewRect(void) const { return m_tabViewRect; } 158 159 // Calculate tab width to fit to view, and optionally adjust the view 160 // to fit the tabs exactly. 161 int CalculateTabWidth(int noTabs, bool adjustView = false); 162 SetTabStyle(long style)163 inline void SetTabStyle(long style) { m_tabStyle = style; } GetTabStyle(void)164 inline long GetTabStyle(void) const { return m_tabStyle; } 165 SetTabSize(int w,int h)166 inline void SetTabSize(int w, int h) { m_tabWidth = w; m_tabHeight = h; } GetTabWidth(void)167 inline int GetTabWidth(void) const { return m_tabWidth; } GetTabHeight(void)168 inline int GetTabHeight(void) const { return m_tabHeight; } SetTabSelectionHeight(int h)169 inline void SetTabSelectionHeight(int h) { m_tabSelectionHeight = h; } GetTabSelectionHeight(void)170 inline int GetTabSelectionHeight(void) const { return m_tabSelectionHeight; } 171 172 // Returns the total height of the tabs component -- this may be several 173 // times the height of a tab, if there are several tab layers (rows). 174 int GetTotalTabHeight(); 175 GetTopMargin(void)176 inline int GetTopMargin(void) const { return m_topMargin; } SetTopMargin(int margin)177 inline void SetTopMargin(int margin) { m_topMargin = margin; } 178 179 void SetTabSelection(int sel, bool activateTool = true); GetTabSelection()180 inline int GetTabSelection() const { return m_tabSelection; } 181 182 // Find tab control for id 183 wxTabControl *FindTabControlForId(int id) const ; 184 185 // Find tab control for layer, position (starting from zero) 186 wxTabControl *FindTabControlForPosition(int layer, int position) const ; 187 GetHorizontalTabOffset()188 inline int GetHorizontalTabOffset() const { return m_tabHorizontalOffset; } GetHorizontalTabSpacing()189 inline int GetHorizontalTabSpacing() const { return m_tabHorizontalSpacing; } SetHorizontalTabOffset(int sp)190 inline void SetHorizontalTabOffset(int sp) { m_tabHorizontalOffset = sp; } SetHorizontalTabSpacing(int sp)191 inline void SetHorizontalTabSpacing(int sp) { m_tabHorizontalSpacing = sp; } 192 SetVerticalTabTextSpacing(int s)193 inline void SetVerticalTabTextSpacing(int s) { m_tabVerticalTextSpacing = s; } GetVerticalTabTextSpacing()194 inline int GetVerticalTabTextSpacing() const { return m_tabVerticalTextSpacing; } 195 GetTabFont()196 inline wxFont *GetTabFont() const { return (wxFont*) & m_tabFont; } SetTabFont(const wxFont & f)197 inline void SetTabFont(const wxFont& f) { m_tabFont = f; } 198 GetSelectedTabFont()199 inline wxFont *GetSelectedTabFont() const { return (wxFont*) & m_tabSelectedFont; } SetSelectedTabFont(const wxFont & f)200 inline void SetSelectedTabFont(const wxFont& f) { m_tabSelectedFont = f; } 201 // Find the node and the column at which this control is positioned. 202 wxList::compatibility_iterator FindTabNodeAndColumn(wxTabControl *control, int *col) const ; 203 204 // Do the necessary to change to this tab 205 virtual bool ChangeTab(wxTabControl *control); 206 207 // Move the selected tab to the bottom layer, if necessary, 208 // without calling app activation code 209 bool MoveSelectionTab(wxTabControl *control); 210 GetNumberOfTabs()211 inline int GetNumberOfTabs() const { return m_noTabs; } 212 213 protected: 214 // List of layers, from front to back. 215 wxTabLayerList m_layers; 216 217 // Selected tab 218 int m_tabSelection; 219 220 // Usual tab height 221 int m_tabHeight; 222 223 // The height of the selected tab 224 int m_tabSelectionHeight; 225 226 // Usual tab width 227 int m_tabWidth; 228 229 // Space between tabs 230 int m_tabHorizontalSpacing; 231 232 // Space between top of normal tab and text 233 int m_tabVerticalTextSpacing; 234 235 // Horizontal offset of each tab row above the first 236 int m_tabHorizontalOffset; 237 238 // The distance between the bottom of the first tab row 239 // and the top of the client area (i.e. the margin) 240 int m_topMargin; 241 242 // The position and size of the view above which the tabs are placed. 243 // I.e., the internal client area of the sheet. 244 wxRect m_tabViewRect; 245 246 // Bitlist of styles 247 long m_tabStyle; 248 249 // Colours 250 wxColour m_highlightColour; 251 wxColour m_shadowColour; 252 wxColour m_backgroundColour; 253 wxColour m_textColour; 254 255 // Pen and brush cache 256 const wxPen* m_highlightPen; 257 const wxPen* m_shadowPen; 258 const wxPen* m_backgroundPen; 259 const wxBrush* m_backgroundBrush; 260 261 wxFont m_tabFont; 262 wxFont m_tabSelectedFont; 263 264 int m_noTabs; 265 266 wxWindow* m_window; 267 }; 268 269 /* 270 * A dialog box class that is tab-friendly 271 */ 272 273 class WXDLLEXPORT wxTabbedDialog : public wxDialog 274 { 275 DECLARE_DYNAMIC_CLASS(wxTabbedDialog) 276 277 public: 278 wxTabbedDialog(wxWindow *parent, 279 wxWindowID id, 280 const wxString& title, 281 const wxPoint& pos = wxDefaultPosition, 282 const wxSize& size = wxDefaultSize, 283 long windowStyle = wxDEFAULT_DIALOG_STYLE, 284 const wxString& name = wxDialogNameStr); 285 virtual ~wxTabbedDialog(); 286 GetTabView()287 wxTabView *GetTabView() const { return m_tabView; } SetTabView(wxTabView * v)288 void SetTabView(wxTabView *v) { m_tabView = v; } 289 290 void OnCloseWindow(wxCloseEvent& event); 291 void OnMouseEvent(wxMouseEvent& event); 292 void OnPaint(wxPaintEvent& event); 293 294 protected: 295 wxTabView* m_tabView; 296 297 private: 298 DECLARE_EVENT_TABLE() 299 }; 300 301 /* 302 * A panel class that is tab-friendly 303 */ 304 305 class WXDLLEXPORT wxTabbedPanel : public wxPanel 306 { 307 DECLARE_DYNAMIC_CLASS(wxTabbedPanel) 308 309 public: 310 wxTabbedPanel(wxWindow *parent, 311 wxWindowID id, 312 const wxPoint& pos = wxDefaultPosition, 313 const wxSize& size = wxDefaultSize, 314 long windowStyle = 0, 315 const wxString& name = wxPanelNameStr); 316 virtual ~wxTabbedPanel(); 317 GetTabView()318 wxTabView *GetTabView() const { return m_tabView; } SetTabView(wxTabView * v)319 void SetTabView(wxTabView *v) { m_tabView = v; } 320 321 void OnMouseEvent(wxMouseEvent& event); 322 void OnPaint(wxPaintEvent& event); 323 324 protected: 325 wxTabView* m_tabView; 326 327 private: 328 DECLARE_EVENT_TABLE() 329 }; 330 331 WX_DECLARE_HASH_MAP(int, wxWindow*, wxIntegerHash, wxIntegerEqual, 332 wxIntToWindowHashMap); 333 334 class WXDLLEXPORT wxPanelTabView : public wxTabView 335 { 336 DECLARE_DYNAMIC_CLASS(wxPanelTabView) 337 338 public: 339 wxPanelTabView(wxPanel *pan, long style = wxTAB_STYLE_DRAW_BOX | wxTAB_STYLE_COLOUR_INTERIOR); 340 virtual ~wxPanelTabView(void); 341 342 // Called when a tab is activated 343 virtual void OnTabActivate(int activateId, int deactivateId); 344 345 // Specific to this class 346 void AddTabWindow(int id, wxWindow *window); 347 wxWindow *GetTabWindow(int id) const ; 348 void ClearWindows(bool deleteWindows = true); GetCurrentWindow()349 wxWindow *GetCurrentWindow() const { return m_currentWindow; } 350 351 void ShowWindowForTab(int id); 352 // wxList& GetWindows() const { return (wxList&) m_tabWindows; } 353 354 protected: 355 // List of panels, one for each tab. Indexed 356 // by tab ID. 357 wxIntToWindowHashMap m_tabWindows; 358 wxWindow* m_currentWindow; 359 wxPanel* m_panel; 360 }; 361 362 #endif 363 364