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