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