1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
|
///////////////////////////////////////////////////////////////////////////////
// Name: wx/univ/notebook.h
// Purpose: universal version of wxNotebook
// Author: Vadim Zeitlin
// Modified by:
// Created: 01.02.01
// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_UNIV_NOTEBOOK_H_
#define _WX_UNIV_NOTEBOOK_H_
#include "wx/arrstr.h"
class WXDLLIMPEXP_FWD_CORE wxSpinButton;
// ----------------------------------------------------------------------------
// the actions supported by this control
// ----------------------------------------------------------------------------
// change the page: to the next/previous/given one
#define wxACTION_NOTEBOOK_NEXT wxT("nexttab")
#define wxACTION_NOTEBOOK_PREV wxT("prevtab")
#define wxACTION_NOTEBOOK_GOTO wxT("gototab")
// ----------------------------------------------------------------------------
// wxNotebook
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxNotebook : public wxNotebookBase
{
public:
// ctors and such
// --------------
wxNotebook() { Init(); }
wxNotebook(wxWindow *parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxNotebookNameStr)
{
Init();
(void)Create(parent, id, pos, size, style, name);
}
// quasi ctor
bool Create(wxWindow *parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxNotebookNameStr);
// dtor
virtual ~wxNotebook();
// implement wxNotebookBase pure virtuals
// --------------------------------------
virtual int SetSelection(size_t nPage) { return DoSetSelection(nPage, SetSelection_SendEvent); }
// changes selected page without sending events
int ChangeSelection(size_t nPage) { return DoSetSelection(nPage); }
virtual bool SetPageText(size_t nPage, const wxString& strText);
virtual wxString GetPageText(size_t nPage) const;
virtual int GetPageImage(size_t nPage) const;
virtual bool SetPageImage(size_t nPage, int nImage);
virtual void SetPageSize(const wxSize& size);
virtual void SetPadding(const wxSize& padding);
virtual void SetTabSize(const wxSize& sz);
virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const;
virtual bool DeleteAllPages();
virtual bool InsertPage(size_t nPage,
wxNotebookPage *pPage,
const wxString& strText,
bool bSelect = false,
int imageId = NO_IMAGE);
// style tests
// -----------
// return true if all tabs have the same width
bool FixedSizeTabs() const { return HasFlag(wxNB_FIXEDWIDTH); }
// return wxTOP/wxBOTTOM/wxRIGHT/wxLEFT
wxDirection GetTabOrientation() const;
// return true if the notebook has tabs at the sidesand not at the top (or
// bottom) as usual
bool IsVertical() const;
// hit testing
// -----------
virtual int HitTest(const wxPoint& pt, long *flags = NULL) const;
// input handling
// --------------
virtual bool PerformAction(const wxControlAction& action,
long numArg = 0l,
const wxString& strArg = wxEmptyString);
static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef);
virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef)
{
return GetStdInputHandler(handlerDef);
}
// refresh the currently selected tab
void RefreshCurrent();
protected:
virtual wxNotebookPage *DoRemovePage(size_t nPage);
// drawing
virtual void DoDraw(wxControlRenderer *renderer);
void DoDrawTab(wxDC& dc, const wxRect& rect, size_t n);
// resizing
virtual void DoMoveWindow(int x, int y, int width, int height);
virtual void DoSetSize(int x, int y,
int width, int height,
int sizeFlags = wxSIZE_AUTO);
int DoSetSelection(size_t nPage, int flags = 0);
// common part of all ctors
void Init();
// resize the tab to fit its title (and icon if any)
void ResizeTab(int page);
// recalculate the geometry of the notebook completely
void Relayout();
// is the spin button currently shown?
bool HasSpinBtn() const;
// calculate last (fully) visible tab: updates m_lastVisible
void CalcLastVisibleTab();
// show or hide the spin control for tabs scrolling depending on whether it
// is needed or not
void UpdateSpinBtn();
// position the spin button
void PositionSpinBtn();
// refresh the given tab only
void RefreshTab(int page, bool forceSelected = false);
// refresh all tabs
void RefreshAllTabs();
// get the tab rect (inefficient, don't use this in a loop)
wxRect GetTabRect(int page) const;
// get the rectangle containing all tabs
wxRect GetAllTabsRect() const;
// get the part occupied by the tabs - slightly smaller than
// GetAllTabsRect() because the tabs may be indented from it
wxRect GetTabsPart() const;
// calculate the tab size (without padding)
wxSize CalcTabSize(int page) const;
// get the (cached) size of a tab
void GetTabSize(int page, wxCoord *w, wxCoord *h) const;
// get the (cached) width of the tab
wxCoord GetTabWidth(int page) const
{ return FixedSizeTabs() ? m_widthMax : m_widths[page]; }
// return true if the tab has an associated image
bool HasImage(int page) const
{ return HasImageList() && m_images[page] != -1; }
// get the part of the notebook reserved for the pages (slightly larger
// than GetPageRect() as we draw a border and leave marginin between)
wxRect GetPagePart() const;
// get the page rect in our client coords
wxRect GetPageRect() const;
// get our client size from the page size
wxSize GetSizeForPage(const wxSize& size) const;
// scroll the tabs so that the first page shown becomes the given one
void ScrollTo(size_t page);
// scroll the tabs so that the first page shown becomes the given one
void ScrollLastTo(size_t page);
// the pages titles
wxArrayString m_titles;
// the spin button to change the pages
wxSpinButton *m_spinbtn;
// the offset of the first page shown (may be changed with m_spinbtn)
wxCoord m_offset;
// the first and last currently visible tabs: the name is not completely
// accurate as m_lastVisible is, in fact, the first tab which is *not*
// visible: so the visible tabs are those with indexes such that
// m_firstVisible <= n < m_lastVisible
size_t m_firstVisible,
m_lastVisible;
// the last fully visible item, usually just m_lastVisible - 1 but may be
// different from it
size_t m_lastFullyVisible;
// the height of tabs in a normal notebook or the width of tabs in a
// notebook with tabs on a side
wxCoord m_heightTab;
// the biggest height (or width) of a notebook tab (used only if
// FixedSizeTabs()) or -1 if not calculated yet
wxCoord m_widthMax;
// the cached widths (or heights) of tabs
wxArrayInt m_widths;
// the icon indices
wxArrayInt m_images;
// the accel indexes for labels
wxArrayInt m_accels;
// the padding
wxSize m_sizePad;
DECLARE_DYNAMIC_CLASS(wxNotebook)
};
#endif // _WX_UNIV_NOTEBOOK_H_
|