1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: wx/tbarbase.h 3 // Purpose: Base class for toolbar classes 4 // Author: Julian Smart 5 // Modified by: 6 // Created: 01/02/97 7 // RCS-ID: $Id: tbarbase.h 61872 2009-09-09 22:37:05Z VZ $ 8 // Copyright: (c) Julian Smart 9 // Licence: wxWindows licence 10 ///////////////////////////////////////////////////////////////////////////// 11 12 #ifndef _WX_TBARBASE_H_ 13 #define _WX_TBARBASE_H_ 14 15 // ---------------------------------------------------------------------------- 16 // headers 17 // ---------------------------------------------------------------------------- 18 19 #include "wx/defs.h" 20 21 #if wxUSE_TOOLBAR 22 23 #include "wx/bitmap.h" 24 #include "wx/list.h" 25 #include "wx/control.h" 26 27 class WXDLLIMPEXP_FWD_CORE wxToolBarBase; 28 class WXDLLIMPEXP_FWD_CORE wxToolBarToolBase; 29 class WXDLLIMPEXP_FWD_CORE wxImage; 30 31 // ---------------------------------------------------------------------------- 32 // constants 33 // ---------------------------------------------------------------------------- 34 35 extern WXDLLEXPORT_DATA(const wxChar) wxToolBarNameStr[]; 36 extern WXDLLEXPORT_DATA(const wxSize) wxDefaultSize; 37 extern WXDLLEXPORT_DATA(const wxPoint) wxDefaultPosition; 38 39 enum wxToolBarToolStyle 40 { 41 wxTOOL_STYLE_BUTTON = 1, 42 wxTOOL_STYLE_SEPARATOR = 2, 43 wxTOOL_STYLE_CONTROL 44 }; 45 46 // ---------------------------------------------------------------------------- 47 // wxToolBarTool is a toolbar element. 48 // 49 // It has a unique id (except for the separators which always have id wxID_ANY), the 50 // style (telling whether it is a normal button, separator or a control), the 51 // state (toggled or not, enabled or not) and short and long help strings. The 52 // default implementations use the short help string for the tooltip text which 53 // is popped up when the mouse pointer enters the tool and the long help string 54 // for the applications status bar. 55 // ---------------------------------------------------------------------------- 56 57 class WXDLLEXPORT wxToolBarToolBase : public wxObject 58 { 59 public: 60 // ctors & dtor 61 // ------------ 62 63 wxToolBarToolBase(wxToolBarBase *tbar = (wxToolBarBase *)NULL, 64 int toolid = wxID_SEPARATOR, 65 const wxString& label = wxEmptyString, 66 const wxBitmap& bmpNormal = wxNullBitmap, 67 const wxBitmap& bmpDisabled = wxNullBitmap, 68 wxItemKind kind = wxITEM_NORMAL, 69 wxObject *clientData = (wxObject *) NULL, 70 const wxString& shortHelpString = wxEmptyString, 71 const wxString& longHelpString = wxEmptyString) m_label(label)72 : m_label(label), 73 m_shortHelpString(shortHelpString), 74 m_longHelpString(longHelpString) 75 { 76 m_tbar = tbar; 77 m_id = toolid; 78 if (m_id == wxID_ANY) 79 m_id = wxNewId(); 80 m_clientData = clientData; 81 82 m_bmpNormal = bmpNormal; 83 m_bmpDisabled = bmpDisabled; 84 85 m_kind = kind; 86 87 m_enabled = true; 88 m_toggled = false; 89 90 m_toolStyle = toolid == wxID_SEPARATOR ? wxTOOL_STYLE_SEPARATOR 91 : wxTOOL_STYLE_BUTTON; 92 } 93 wxToolBarToolBase(wxToolBarBase * tbar,wxControl * control)94 wxToolBarToolBase(wxToolBarBase *tbar, wxControl *control) 95 { 96 m_tbar = tbar; 97 m_control = control; 98 m_id = control->GetId(); 99 100 m_kind = wxITEM_MAX; // invalid value 101 102 m_enabled = true; 103 m_toggled = false; 104 105 m_toolStyle = wxTOOL_STYLE_CONTROL; 106 } 107 ~wxToolBarToolBase()108 virtual ~wxToolBarToolBase(){} 109 110 // accessors 111 // --------- 112 113 // general GetId()114 int GetId() const { return m_id; } 115 GetControl()116 wxControl *GetControl() const 117 { 118 wxASSERT_MSG( IsControl(), wxT("this toolbar tool is not a control") ); 119 120 return m_control; 121 } 122 GetToolBar()123 wxToolBarBase *GetToolBar() const { return m_tbar; } 124 125 // style IsButton()126 bool IsButton() const { return m_toolStyle == wxTOOL_STYLE_BUTTON; } IsControl()127 bool IsControl() const { return m_toolStyle == wxTOOL_STYLE_CONTROL; } IsSeparator()128 bool IsSeparator() const { return m_toolStyle == wxTOOL_STYLE_SEPARATOR; } GetStyle()129 int GetStyle() const { return m_toolStyle; } GetKind()130 wxItemKind GetKind() const 131 { 132 wxASSERT_MSG( IsButton(), wxT("only makes sense for buttons") ); 133 134 return m_kind; 135 } 136 137 // state IsEnabled()138 bool IsEnabled() const { return m_enabled; } IsToggled()139 bool IsToggled() const { return m_toggled; } CanBeToggled()140 bool CanBeToggled() const 141 { return m_kind == wxITEM_CHECK || m_kind == wxITEM_RADIO; } 142 143 // attributes GetNormalBitmap()144 const wxBitmap& GetNormalBitmap() const { return m_bmpNormal; } GetDisabledBitmap()145 const wxBitmap& GetDisabledBitmap() const { return m_bmpDisabled; } 146 GetBitmap()147 const wxBitmap& GetBitmap() const 148 { return IsEnabled() ? GetNormalBitmap() : GetDisabledBitmap(); } 149 GetLabel()150 const wxString& GetLabel() const { return m_label; } 151 GetShortHelp()152 const wxString& GetShortHelp() const { return m_shortHelpString; } GetLongHelp()153 const wxString& GetLongHelp() const { return m_longHelpString; } 154 GetClientData()155 wxObject *GetClientData() const 156 { 157 if ( m_toolStyle == wxTOOL_STYLE_CONTROL ) 158 { 159 return (wxObject*)m_control->GetClientData(); 160 } 161 else 162 { 163 return m_clientData; 164 } 165 } 166 167 // modifiers: return true if the state really changed 168 bool Enable(bool enable); 169 bool Toggle(bool toggle); 170 bool SetToggle(bool toggle); 171 bool SetShortHelp(const wxString& help); 172 bool SetLongHelp(const wxString& help); 173 Toggle()174 void Toggle() { Toggle(!IsToggled()); } 175 SetNormalBitmap(const wxBitmap & bmp)176 void SetNormalBitmap(const wxBitmap& bmp) { m_bmpNormal = bmp; } SetDisabledBitmap(const wxBitmap & bmp)177 void SetDisabledBitmap(const wxBitmap& bmp) { m_bmpDisabled = bmp; } 178 SetLabel(const wxString & label)179 virtual void SetLabel(const wxString& label) { m_label = label; } 180 SetClientData(wxObject * clientData)181 void SetClientData(wxObject *clientData) 182 { 183 if ( m_toolStyle == wxTOOL_STYLE_CONTROL ) 184 { 185 m_control->SetClientData(clientData); 186 } 187 else 188 { 189 m_clientData = clientData; 190 } 191 } 192 193 // add tool to/remove it from a toolbar Detach()194 virtual void Detach() { m_tbar = (wxToolBarBase *)NULL; } Attach(wxToolBarBase * tbar)195 virtual void Attach(wxToolBarBase *tbar) { m_tbar = tbar; } 196 197 protected: 198 wxToolBarBase *m_tbar; // the toolbar to which we belong (may be NULL) 199 200 // tool parameters 201 int m_toolStyle; // see enum wxToolBarToolStyle 202 int m_id; // the tool id, wxID_SEPARATOR for separator 203 wxItemKind m_kind; // for normal buttons may be wxITEM_NORMAL/CHECK/RADIO 204 205 // as controls have their own client data, no need to waste memory 206 union 207 { 208 wxObject *m_clientData; 209 wxControl *m_control; 210 }; 211 212 // tool state 213 bool m_toggled; 214 bool m_enabled; 215 216 // normal and disabled bitmaps for the tool, both can be invalid 217 wxBitmap m_bmpNormal; 218 wxBitmap m_bmpDisabled; 219 220 // the button label 221 wxString m_label; 222 223 // short and long help strings 224 wxString m_shortHelpString; 225 wxString m_longHelpString; 226 227 DECLARE_DYNAMIC_CLASS_NO_COPY(wxToolBarToolBase) 228 }; 229 230 // a list of toolbar tools 231 WX_DECLARE_EXPORTED_LIST(wxToolBarToolBase, wxToolBarToolsList); 232 233 // ---------------------------------------------------------------------------- 234 // the base class for all toolbars 235 // ---------------------------------------------------------------------------- 236 237 class WXDLLEXPORT wxToolBarBase : public wxControl 238 { 239 public: 240 wxToolBarBase(); 241 virtual ~wxToolBarBase(); 242 243 // toolbar construction 244 // -------------------- 245 246 // the full AddTool() function 247 // 248 // If bmpDisabled is wxNullBitmap, a shadowed version of the normal bitmap 249 // is created and used as the disabled image. 250 wxToolBarToolBase *AddTool(int toolid, 251 const wxString& label, 252 const wxBitmap& bitmap, 253 const wxBitmap& bmpDisabled, 254 wxItemKind kind = wxITEM_NORMAL, 255 const wxString& shortHelp = wxEmptyString, 256 const wxString& longHelp = wxEmptyString, 257 wxObject *data = NULL) 258 { 259 return DoAddTool(toolid, label, bitmap, bmpDisabled, kind, 260 shortHelp, longHelp, data); 261 } 262 263 // the most common AddTool() version 264 wxToolBarToolBase *AddTool(int toolid, 265 const wxString& label, 266 const wxBitmap& bitmap, 267 const wxString& shortHelp = wxEmptyString, 268 wxItemKind kind = wxITEM_NORMAL) 269 { 270 return AddTool(toolid, label, bitmap, wxNullBitmap, kind, shortHelp); 271 } 272 273 // add a check tool, i.e. a tool which can be toggled 274 wxToolBarToolBase *AddCheckTool(int toolid, 275 const wxString& label, 276 const wxBitmap& bitmap, 277 const wxBitmap& bmpDisabled = wxNullBitmap, 278 const wxString& shortHelp = wxEmptyString, 279 const wxString& longHelp = wxEmptyString, 280 wxObject *data = NULL) 281 { 282 return AddTool(toolid, label, bitmap, bmpDisabled, wxITEM_CHECK, 283 shortHelp, longHelp, data); 284 } 285 286 // add a radio tool, i.e. a tool which can be toggled and releases any 287 // other toggled radio tools in the same group when it happens 288 wxToolBarToolBase *AddRadioTool(int toolid, 289 const wxString& label, 290 const wxBitmap& bitmap, 291 const wxBitmap& bmpDisabled = wxNullBitmap, 292 const wxString& shortHelp = wxEmptyString, 293 const wxString& longHelp = wxEmptyString, 294 wxObject *data = NULL) 295 { 296 return AddTool(toolid, label, bitmap, bmpDisabled, wxITEM_RADIO, 297 shortHelp, longHelp, data); 298 } 299 300 301 // insert the new tool at the given position, if pos == GetToolsCount(), it 302 // is equivalent to AddTool() 303 virtual wxToolBarToolBase *InsertTool 304 ( 305 size_t pos, 306 int toolid, 307 const wxString& label, 308 const wxBitmap& bitmap, 309 const wxBitmap& bmpDisabled = wxNullBitmap, 310 wxItemKind kind = wxITEM_NORMAL, 311 const wxString& shortHelp = wxEmptyString, 312 const wxString& longHelp = wxEmptyString, 313 wxObject *clientData = NULL 314 ); 315 316 virtual wxToolBarToolBase *AddTool (wxToolBarToolBase *tool); 317 virtual wxToolBarToolBase *InsertTool (size_t pos, wxToolBarToolBase *tool); 318 319 // add an arbitrary control to the toolbar (notice that 320 // the control will be deleted by the toolbar and that it will also adjust 321 // its position/size) 322 // 323 // NB: the control should have toolbar as its parent 324 virtual wxToolBarToolBase *AddControl(wxControl *control); 325 virtual wxToolBarToolBase *InsertControl(size_t pos, wxControl *control); 326 327 // get the control with the given id or return NULL 328 virtual wxControl *FindControl( int toolid ); 329 330 // add a separator to the toolbar 331 virtual wxToolBarToolBase *AddSeparator(); 332 virtual wxToolBarToolBase *InsertSeparator(size_t pos); 333 334 // remove the tool from the toolbar: the caller is responsible for actually 335 // deleting the pointer 336 virtual wxToolBarToolBase *RemoveTool(int toolid); 337 338 // delete tool either by index or by position 339 virtual bool DeleteToolByPos(size_t pos); 340 virtual bool DeleteTool(int toolid); 341 342 // delete all tools 343 virtual void ClearTools(); 344 345 // must be called after all buttons have been created to finish toolbar 346 // initialisation 347 virtual bool Realize(); 348 349 // tools state 350 // ----------- 351 352 virtual void EnableTool(int toolid, bool enable); 353 virtual void ToggleTool(int toolid, bool toggle); 354 355 // Set this to be togglable (or not) 356 virtual void SetToggle(int toolid, bool toggle); 357 358 // set/get tools client data (not for controls) 359 virtual wxObject *GetToolClientData(int toolid) const; 360 virtual void SetToolClientData(int toolid, wxObject *clientData); 361 362 // returns tool pos, or wxNOT_FOUND if tool isn't found 363 virtual int GetToolPos(int id) const; 364 365 // return true if the tool is toggled 366 virtual bool GetToolState(int toolid) const; 367 368 virtual bool GetToolEnabled(int toolid) const; 369 370 virtual void SetToolShortHelp(int toolid, const wxString& helpString); 371 virtual wxString GetToolShortHelp(int toolid) const; 372 virtual void SetToolLongHelp(int toolid, const wxString& helpString); 373 virtual wxString GetToolLongHelp(int toolid) const; 374 375 // margins/packing/separation 376 // -------------------------- 377 378 virtual void SetMargins(int x, int y); SetMargins(const wxSize & size)379 void SetMargins(const wxSize& size) 380 { SetMargins((int) size.x, (int) size.y); } SetToolPacking(int packing)381 virtual void SetToolPacking(int packing) 382 { m_toolPacking = packing; } SetToolSeparation(int separation)383 virtual void SetToolSeparation(int separation) 384 { m_toolSeparation = separation; } 385 GetToolMargins()386 virtual wxSize GetToolMargins() const { return wxSize(m_xMargin, m_yMargin); } GetToolPacking()387 virtual int GetToolPacking() const { return m_toolPacking; } GetToolSeparation()388 virtual int GetToolSeparation() const { return m_toolSeparation; } 389 390 // toolbar geometry 391 // ---------------- 392 393 // set the number of toolbar rows 394 virtual void SetRows(int nRows); 395 396 // the toolbar can wrap - limit the number of columns or rows it may take SetMaxRowsCols(int rows,int cols)397 void SetMaxRowsCols(int rows, int cols) 398 { m_maxRows = rows; m_maxCols = cols; } GetMaxRows()399 int GetMaxRows() const { return m_maxRows; } GetMaxCols()400 int GetMaxCols() const { return m_maxCols; } 401 402 // get/set the size of the bitmaps used by the toolbar: should be called 403 // before adding any tools to the toolbar SetToolBitmapSize(const wxSize & size)404 virtual void SetToolBitmapSize(const wxSize& size) 405 { m_defaultWidth = size.x; m_defaultHeight = size.y; } GetToolBitmapSize()406 virtual wxSize GetToolBitmapSize() const 407 { return wxSize(m_defaultWidth, m_defaultHeight); } 408 409 // the button size in some implementations is bigger than the bitmap size: 410 // get the total button size (by default the same as bitmap size) GetToolSize()411 virtual wxSize GetToolSize() const 412 { return GetToolBitmapSize(); } 413 414 // returns a (non separator) tool containing the point (x, y) or NULL if 415 // there is no tool at this point (corrdinates are client) 416 virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, 417 wxCoord y) const = 0; 418 419 // find the tool by id 420 wxToolBarToolBase *FindById(int toolid) const; 421 422 // return true if this is a vertical toolbar, otherwise false IsVertical()423 bool IsVertical() const { return HasFlag(wxTB_LEFT | wxTB_RIGHT); } 424 425 426 // the old versions of the various methods kept for compatibility 427 // don't use in the new code! 428 // -------------------------------------------------------------- 429 430 wxToolBarToolBase *AddTool(int toolid, 431 const wxBitmap& bitmap, 432 const wxBitmap& bmpDisabled, 433 bool toggle = false, 434 wxObject *clientData = NULL, 435 const wxString& shortHelpString = wxEmptyString, 436 const wxString& longHelpString = wxEmptyString) 437 { 438 return AddTool(toolid, wxEmptyString, 439 bitmap, bmpDisabled, 440 toggle ? wxITEM_CHECK : wxITEM_NORMAL, 441 shortHelpString, longHelpString, clientData); 442 } 443 444 wxToolBarToolBase *AddTool(int toolid, 445 const wxBitmap& bitmap, 446 const wxString& shortHelpString = wxEmptyString, 447 const wxString& longHelpString = wxEmptyString) 448 { 449 return AddTool(toolid, wxEmptyString, 450 bitmap, wxNullBitmap, wxITEM_NORMAL, 451 shortHelpString, longHelpString, NULL); 452 } 453 454 wxToolBarToolBase *AddTool(int toolid, 455 const wxBitmap& bitmap, 456 const wxBitmap& bmpDisabled, 457 bool toggle, 458 wxCoord xPos, 459 wxCoord yPos = wxDefaultCoord, 460 wxObject *clientData = NULL, 461 const wxString& shortHelp = wxEmptyString, 462 const wxString& longHelp = wxEmptyString) 463 { 464 return DoAddTool(toolid, wxEmptyString, bitmap, bmpDisabled, 465 toggle ? wxITEM_CHECK : wxITEM_NORMAL, 466 shortHelp, longHelp, clientData, xPos, yPos); 467 } 468 469 wxToolBarToolBase *InsertTool(size_t pos, 470 int toolid, 471 const wxBitmap& bitmap, 472 const wxBitmap& bmpDisabled = wxNullBitmap, 473 bool toggle = false, 474 wxObject *clientData = NULL, 475 const wxString& shortHelp = wxEmptyString, 476 const wxString& longHelp = wxEmptyString) 477 { 478 return InsertTool(pos, toolid, wxEmptyString, bitmap, bmpDisabled, 479 toggle ? wxITEM_CHECK : wxITEM_NORMAL, 480 shortHelp, longHelp, clientData); 481 } 482 483 // event handlers 484 // -------------- 485 486 // NB: these functions are deprecated, use EVT_TOOL_XXX() instead! 487 488 // Only allow toggle if returns true. Call when left button up. 489 virtual bool OnLeftClick(int toolid, bool toggleDown); 490 491 // Call when right button down. 492 virtual void OnRightClick(int toolid, long x, long y); 493 494 // Called when the mouse cursor enters a tool bitmap. 495 // Argument is wxID_ANY if mouse is exiting the toolbar. 496 virtual void OnMouseEnter(int toolid); 497 498 // more deprecated functions 499 // ------------------------- 500 501 // use GetToolMargins() instead GetMargins()502 wxSize GetMargins() const { return GetToolMargins(); } 503 504 // implementation only from now on 505 // ------------------------------- 506 GetToolsCount()507 size_t GetToolsCount() const { return m_tools.GetCount(); } 508 509 // Do the toolbar button updates (check for EVT_UPDATE_UI handlers) 510 virtual void UpdateWindowUI(long flags = wxUPDATE_UI_NONE) ; 511 512 // don't want toolbars to accept the focus AcceptsFocus()513 virtual bool AcceptsFocus() const { return false; } 514 515 protected: 516 // to implement in derived classes 517 // ------------------------------- 518 519 // create a new toolbar tool and add it to the toolbar, this is typically 520 // implemented by just calling InsertTool() 521 virtual wxToolBarToolBase *DoAddTool 522 ( 523 int toolid, 524 const wxString& label, 525 const wxBitmap& bitmap, 526 const wxBitmap& bmpDisabled, 527 wxItemKind kind, 528 const wxString& shortHelp = wxEmptyString, 529 const wxString& longHelp = wxEmptyString, 530 wxObject *clientData = NULL, 531 wxCoord xPos = wxDefaultCoord, 532 wxCoord yPos = wxDefaultCoord 533 ); 534 535 // the tool is not yet inserted into m_tools list when this function is 536 // called and will only be added to it if this function succeeds 537 virtual bool DoInsertTool(size_t pos, wxToolBarToolBase *tool) = 0; 538 539 // the tool is still in m_tools list when this function is called, it will 540 // only be deleted from it if it succeeds 541 virtual bool DoDeleteTool(size_t pos, wxToolBarToolBase *tool) = 0; 542 543 // called when the tools enabled flag changes 544 virtual void DoEnableTool(wxToolBarToolBase *tool, bool enable) = 0; 545 546 // called when the tool is toggled 547 virtual void DoToggleTool(wxToolBarToolBase *tool, bool toggle) = 0; 548 549 // called when the tools "can be toggled" flag changes 550 virtual void DoSetToggle(wxToolBarToolBase *tool, bool toggle) = 0; 551 552 // the functions to create toolbar tools 553 virtual wxToolBarToolBase *CreateTool(int toolid, 554 const wxString& label, 555 const wxBitmap& bmpNormal, 556 const wxBitmap& bmpDisabled, 557 wxItemKind kind, 558 wxObject *clientData, 559 const wxString& shortHelp, 560 const wxString& longHelp) = 0; 561 562 virtual wxToolBarToolBase *CreateTool(wxControl *control) = 0; 563 564 // helper functions 565 // ---------------- 566 567 // call this from derived class ctor/Create() to ensure that we have either 568 // wxTB_HORIZONTAL or wxTB_VERTICAL style, there is a lot of existing code 569 // which randomly checks either one or the other of them and gets confused 570 // if neither is set (and making one of them 0 is not an option neither as 571 // then the existing tests would break down) 572 void FixupStyle(); 573 574 // un-toggle all buttons in the same radio group 575 void UnToggleRadioGroup(wxToolBarToolBase *tool); 576 577 // the list of all our tools 578 wxToolBarToolsList m_tools; 579 580 // the offset of the first tool 581 int m_xMargin; 582 int m_yMargin; 583 584 // the maximum number of toolbar rows/columns 585 int m_maxRows; 586 int m_maxCols; 587 588 // the tool packing and separation 589 int m_toolPacking, 590 m_toolSeparation; 591 592 // the size of the toolbar bitmaps 593 wxCoord m_defaultWidth, m_defaultHeight; 594 595 private: 596 DECLARE_EVENT_TABLE() 597 DECLARE_NO_COPY_CLASS(wxToolBarBase) 598 }; 599 600 // Helper function for creating the image for disabled buttons 601 bool wxCreateGreyedImage(const wxImage& in, wxImage& out) ; 602 603 #endif // wxUSE_TOOLBAR 604 605 #endif 606 // _WX_TBARBASE_H_ 607 608