1///////////////////////////////////////////////////////////////////////////// 2// Name: captionbar.h 3// Purpose: wxFoldPanel 4// Author: Jorgen Bodde 5// Modified by: ABX - 19/12/2004 : possibility of horizontal orientation 6// : wxWidgets coding standards 7// Created: 22/06/2004 8// RCS-ID: $Id: captionbar.h 34972 2005-07-28 23:23:27Z VZ $ 9// Copyright: (c) Jorgen Bodde 10// Licence: wxWindows licence 11///////////////////////////////////////////////////////////////////////////// 12 13#ifndef __FOLDPANELBAR_H__ 14#define __FOLDPANELBAR_H__ 15 16#ifdef WXMAKINGDLL_FOLDBAR 17 #define WXDLLIMPEXP_FOLDBAR WXEXPORT 18#elif defined(WXUSINGDLL) 19 #define WXDLLIMPEXP_FOLDBAR WXIMPORT 20#else // not making nor using DLL 21 #define WXDLLIMPEXP_FOLDBAR 22#endif 23 24 25#define wxFPB_EXTRA_X 10 26#define wxFPB_EXTRA_Y 4 27#define wxFPB_BMP_RIGHTSPACE 2 // pixels of the bmp to be aligned from the right filled with space 28 29enum 30{ 31 /** Specifies the bars as gradient vertical filled caption bars going from top to bottom. The gradient 32 starts with first colour, and ends with second colour */ 33 wxCAPTIONBAR_GRADIENT_V = 1, 34 /** Specifies the gradient going from left to right. The gradient starts with first colour, and 35 ends with second colour on the right */ 36 wxCAPTIONBAR_GRADIENT_H, 37 /** Fills the captionbar with a single colour. The first colour is used for this fill */ 38 wxCAPTIONBAR_SINGLE, 39 /** Draws a rectangle only using the second colour. The first colour is not used*/ 40 wxCAPTIONBAR_RECTANGLE, 41 /** Fills the captionbar with a single colour (first colour) and draws a rectangle around it 42 using the second colour. */ 43 wxCAPTIONBAR_FILLED_RECTANGLE 44}; 45 46/** \class wxCaptionBarStyle 47 This class encapsulates the styles you wish to set for the wxCaptionBar (this is the part of the wxFoldPanel 48 where the caption is displayed). It can either be applied at creation time be reapplied when styles need to 49 be changed. 50 51 At construction time, all styles are set to their default transparency. This means none of the styles will be 52 applied to the wxCaptionBar in question, meaning it will be created using the default internals. When setting i.e 53 the color, font or panel style, these styles become active to be used. 54*/ 55class WXDLLIMPEXP_FOLDBAR wxCaptionBarStyle 56{ 57private: 58 // boolean flags for default transparency on styles 59 bool m_firstColourUsed, 60 m_secondColourUsed, 61 m_textColourUsed, 62 m_captionFontUsed, 63 m_captionStyleUsed; 64 65 wxFont m_captionFont; 66 wxColour m_firstColour, m_secondColour, m_textColour; 67 68 int m_captionStyle; 69 70public: 71 /** Default constructor for this class */ 72 wxCaptionBarStyle() { 73 ResetDefaults(); 74 }; 75 76 ~wxCaptionBarStyle() { 77 78 }; 79 80 void ResetDefaults() { 81 m_firstColourUsed = false; 82 m_secondColourUsed = false; 83 m_textColourUsed = false; 84 m_captionFontUsed = false; 85 m_captionStyleUsed = false; 86 m_captionStyle = wxCAPTIONBAR_GRADIENT_V; 87 }; 88 89 /** Copy operator. Only the styles in use in the source object are being copied to the destination object. All other 90 styles are not copied */ 91 void operator=(const wxCaptionBarStyle &s) { 92 if(s.m_captionStyleUsed) 93 { 94 m_captionStyleUsed = true; 95 m_captionStyle = s.m_captionStyle; 96 } 97 if(s.m_captionFontUsed) 98 { 99 m_captionFontUsed = true; 100 m_captionFont = s.m_captionFont; 101 } 102 if(s.m_firstColourUsed) 103 { 104 m_firstColourUsed = true; 105 m_firstColour = s.m_firstColour; 106 } 107 if(s.m_secondColourUsed) 108 { 109 m_secondColourUsed = true; 110 m_secondColour = s.m_secondColour; 111 } 112 if(s.m_textColourUsed) 113 { 114 m_textColourUsed = true; 115 m_textColour = s.m_textColour; 116 } 117 }; 118 119 // ------- CaptionBar Font ------- 120 121 /** Set font for the caption bar. If this is not set, the font property is undefined 122 and will not be used. Use CaptionFontUsed() to check if this style is used */ 123 void SetCaptionFont(const wxFont &font) { 124 m_captionFont = font; 125 m_captionFontUsed = true; 126 }; 127 128 /** Checks if the caption bar font is set */ 129 bool CaptionFontUsed() const { 130 return m_captionFontUsed; 131 }; 132 133 /** Returns the font for the caption bar. Please be warned this will result in an assertion failure when 134 this property is not previously set 135 \sa SetCaptionFont(), CaptionFontUsed() */ 136 wxFont GetCaptionFont() const { 137 wxASSERT(m_captionFontUsed); 138 return m_captionFont; 139 }; 140 141 // ------- FirstColour ------- 142 143 /** Set first colour for the caption bar. If this is not set, the colour property is 144 undefined and will not be used. Use FirstColourUsed() to check if this 145 style is used */ 146 void SetFirstColour(const wxColour &col) { 147 m_firstColour = col; 148 m_firstColourUsed = true; 149 }; 150 151 /** Checks if the first colour of the caption bar is set */ 152 bool FirstColourUsed() const { 153 return m_firstColourUsed; 154 }; 155 156 /** Returns the first colour for the caption bar. Please be warned this will 157 result in an assertion failure when this property is not previously set. 158 \sa SetCaptionFirstColour(), CaptionFirstColourUsed() */ 159 wxColour GetFirstColour() const { 160 wxASSERT(m_firstColourUsed); 161 return m_firstColour; 162 }; 163 164 // ------- SecondColour ------- 165 166 /** Set second colour for the caption bar. If this is not set, the colour property is undefined and 167 will not be used. Use SecondColourUsed() to check if this style is used */ 168 void SetSecondColour(const wxColour &col) { 169 m_secondColour = col; 170 m_secondColourUsed = true; 171 }; 172 173 /** Checks if the second colour of the caption bar is set */ 174 bool SecondColourUsed() const { 175 return m_secondColourUsed; 176 }; 177 178 /** Returns the second colour for the caption bar. Please be warned this will result in 179 an assertion failure when this property is not previously set. 180 \sa SetSecondColour(), SecondColourUsed() */ 181 wxColour GetSecondColour() const { 182 wxASSERT(m_secondColourUsed); 183 return m_secondColour; 184 }; 185 186 // ------- Caption Text Colour ------- 187 188 /** Set caption colour for the caption bar. If this is not set, the colour property is 189 undefined and will not be used. Use CaptionColourUsed() to check if this style is used */ 190 void SetCaptionColour(const wxColour &col) { 191 m_textColour = col; 192 m_textColourUsed = true; 193 }; 194 195 /** Checks if the caption colour of the caption bar is set */ 196 bool CaptionColourUsed() const { 197 return m_textColourUsed; 198 }; 199 200 /** Returns the caption colour for the caption bar. Please be warned this will 201 result in an assertion failure when this property is not previously set. 202 \sa SetCaptionColour(), CaptionColourUsed() */ 203 wxColour GetCaptionColour() const { 204 wxASSERT(m_textColourUsed); 205 return m_textColour; 206 }; 207 208 // ------- CaptionStyle ------- 209 210 /** Set caption style for the caption bar. If this is not set, the property is 211 undefined and will not be used. Use CaptionStyleUsed() to check if this style is used. 212 The following styles can be applied: 213 - wxCAPTIONBAR_GRADIENT_V: Draws a vertical gradient from top to bottom 214 - wxCAPTIONBAR_GRADIENT_H: Draws a horizontal gradient from left to right 215 - wxCAPTIONBAR_SINGLE: Draws a single filled rectangle to draw the caption 216 - wxCAPTIONBAR_RECTANGLE: Draws a single colour with a rectangle around the caption 217 - wxCAPTIONBAR_FILLED_RECTANGLE: Draws a filled rectangle and a border around it 218 */ 219 void SetCaptionStyle(int style) { 220 m_captionStyle = style; 221 m_captionStyleUsed = true; 222 }; 223 224 /** Checks if the caption style of the caption bar is set */ 225 bool CaptionStyleUsed() const { 226 return m_captionStyleUsed; 227 }; 228 229 /** Returns the caption style for the caption bar. Please be warned this will 230 result in an assertion failure when this property is not previously set. 231 \sa SetCaptionStyle(), CaptionStyleUsed() */ 232 int GetCaptionStyle() const { 233 wxASSERT(m_captionStyleUsed); 234 return m_captionStyle; 235 }; 236}; 237 238#ifndef _NO_CAPTIONBAR_ 239 240/** \class wxCaptionBar 241 This class is a graphical caption component that consists of a caption and a clickable arrow. 242 243 The wxCaptionBar fires an event EVT_CAPTIONBAR which is a wxCaptionBarEvent. This event can be caught 244 and the parent window can act upon the collapsed or expanded state of the bar (which is actually just 245 the icon which changed). The parent panel can reduce size or expand again. 246*/ 247 248#include <wx/imaglist.h> 249 250/** Defines an empty captionbar style */ 251#define wxEmptyCaptionBarStyle wxCaptionBarStyle() 252 253class WXDLLIMPEXP_FOLDBAR wxCaptionBar: public wxWindow 254{ 255private: 256 wxString m_caption; 257 wxImageList *m_foldIcons; 258 wxSize m_oldSize; 259 //wxFont m_captionFont; 260 int m_rightIndent; 261 int m_iconWidth, m_iconHeight; 262 //int m_captionStyle; 263 264 //wxColour m_firstColour, m_secondColour, m_textColour; 265 266 /** True when the caption is in collapsed state (means at the bottom of the wxFoldPanel */ 267 bool m_collapsed; 268 269 wxCaptionBarStyle m_captionStyle; 270 271 /** Fills the background of the caption with either a gradient, or a solid color */ 272 void FillCaptionBackground(wxPaintDC &dc); 273 274 /* Draw methods */ 275 void DrawHorizontalGradient(wxDC &dc, const wxRect &rect ); 276 void DrawVerticalGradient(wxDC &dc, const wxRect &rect ); 277 void DrawSingleColour(wxDC &dc, const wxRect &rect ); 278 void DrawSingleRectangle(wxDC &dc, const wxRect &rect ); 279 280 void RedrawIconBitmap(); 281 282 void ApplyCaptionStyle(const wxCaptionBarStyle &cbstyle, bool applyDefault); 283 284public: 285 /** Constructor of wxCaptionBar. To create a wxCaptionBar with the arrow images, simply pass an image list 286 which contains at least two bitmaps. The bitmaps contain the expanded and collapsed icons needed to 287 represent it's state. If you don't want images, simply pass a null pointer and the bitmap is disabled. */ 288 wxCaptionBar(wxWindow* parent, const wxString &caption, wxImageList *images, 289 wxWindowID id = wxID_ANY, const wxCaptionBarStyle &cbstyle = wxEmptyCaptionBarStyle, 290 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxNO_BORDER); 291 292 ~wxCaptionBar(); 293 294 /** Set wxCaptionBar styles with wxCapionBarSyle class. All styles that are actually set, are applied. If you 295 set applyDefault to true, all other (not defined) styles will be set to default. If it is false, 296 the styles which are not set in the wxCaptionBarStyle will be ignored */ 297 void SetCaptionStyle(bool applyDefault, wxCaptionBarStyle style = wxEmptyCaptionBarStyle) { 298 ApplyCaptionStyle(style, applyDefault); 299 Refresh(); 300 }; 301 302 /** Returns the current style of the captionbar in a wxCaptionBarStyle class. This can be used to change and set back the 303 changes. */ 304 wxCaptionBarStyle GetCaptionStyle() { 305 return m_captionStyle; 306 }; 307 308 bool IsVertical() const; 309 310#if 0 311 /** Sets a pointer to an image list resource (a non owned pointer) to the collapsed and expand icon bitmap. 312 The reason why it will be assigned a pointer is that it is very likely that multiple caption bars will 313 be used and if they all have their own bitmap resources it will eat up more memory then needed. It will 314 also ease the use of shared icon change, when there is any need to. 315 316 If no wxImageList is assigned, there will be no fold icons and only the doubleclick on the panel 317 will work to collapse / expand. 318 319 The image list must contain 2 bitmaps. Index 0 will be the expanded state, and index 1 will be the 320 collapsed state of the bitmap. The size of the bitmap is taken in account when the minimal height and 321 widht is calculated. 322 323 The bitmaps must be the second thing to be done before using it (SetRightIndent should be the first thing), 324 make sure if the icons are larger than the font, that the parent of this window gets a Fit call to resize 325 all the windows accordingly */ 326 327 void SetFoldIcons(wxImageList *images) { 328 m_foldIcons = images; 329 m_iconWidth = m_iconHeight = 0; 330 if(m_foldIcons) 331 m_foldIcons->GetSize(0, m_iconWidth, m_iconHeight); 332 333 Refresh(); 334 }; 335 336#endif 337 338 /** Returns wether the status of the bar is expanded or collapsed */ 339 bool IsCollapsed() const { 340 return m_collapsed; 341 }; 342 343 /** Sets the amount of pixels on the right from which the bitmap is trailing. If this is 0, it will be 344 drawn all the way to the right, default is equal to wxFPB_BMP_RIGHTSPACE. Assign this before 345 assigning an image list to prevent a redraw */ 346 347 void SetRightIndent(int pixels) { 348 wxCHECK2(pixels >= 0, return); 349 m_rightIndent = pixels; 350 // issue a refresh (if we have a bmp) 351 if(m_foldIcons) 352 Refresh(); 353 }; 354 355 356 /** Return the best size for this panel, based upon the font assigned to this window, and the 357 caption string */ 358 wxSize DoGetBestSize() const; 359 360 /** This sets the internal state / representation to collapsed. This does not trigger a wxCaptionBarEvent 361 to be sent to the parent */ 362 void Collapse() { 363 m_collapsed = true; 364 RedrawIconBitmap(); 365 }; 366 367 /** This sets the internal state / representation to expanded. This does not trigger a wxCaptionBarEvent 368 to be sent to the parent */ 369 void Expand() { 370 m_collapsed = false; 371 RedrawIconBitmap(); 372 }; 373 374 void SetBoldFont() { 375 GetFont().SetWeight(wxBOLD); 376 }; 377 378 void SetNormalFont() { 379 GetFont().SetWeight(wxNORMAL); 380 }; 381 382 383private: 384 /** The paint event for flat or gradient fill */ 385 void OnPaint(wxPaintEvent& event); 386 387 /** For clicking the icon, the mouse event must be intercepted */ 388 void OnMouseEvent(wxMouseEvent& event); 389 390 /** Maybe when focus (don't know how yet) a cursor left or backspace will collapse or expand */ 391 void OnChar(wxKeyEvent& event); 392 393 void OnSize(wxSizeEvent &event); 394 395 396protected: 397 DECLARE_NO_COPY_CLASS(wxCaptionBar) 398 DECLARE_EVENT_TABLE() 399}; 400 401/***********************************************************************************************************/ 402 403/** \class wxCaptionBarEvent 404 This event will be sent when a EVT_CAPTIONBAR is mapped in the parent. It is to notify the parent 405 that the bar is now in collapsed or expanded state. The parent should re-arrange the associated 406 windows accordingly */ 407 408class WXDLLIMPEXP_FOLDBAR wxCaptionBarEvent : public wxCommandEvent 409{ 410 411private: 412 bool m_collapsed; 413 wxCaptionBar *m_captionBar; 414 void *m_tag; 415 416public: 417 wxCaptionBarEvent(wxEventType commandType = wxEVT_NULL, int id = 0) 418 : wxCommandEvent(commandType, id) 419 , m_collapsed(false) 420 , m_captionBar(NULL) 421 , m_tag(0) 422 { } 423 424 /** Constructor for clone copy */ 425 wxCaptionBarEvent(const wxCaptionBarEvent &event); 426 427 /** Clone function */ 428 virtual wxEvent *Clone() const { 429 return new wxCaptionBarEvent(*this); 430 }; 431 432 /** Returns wether the bar is expanded or collapsed. True means expanded */ 433 bool GetFoldStatus() const { 434 wxCHECK(m_captionBar, false); 435 return !m_captionBar->IsCollapsed(); 436 }; 437 438 /** Returns the bar associated with this event */ 439 wxCaptionBar *GetCaptionBar() const { 440 return m_captionBar; 441 }; 442 443 void SetTag(void *tag) { 444 m_tag = tag; 445 }; 446 447 void *GetTag() const { 448 return m_tag; 449 }; 450 451 /** Sets the bar associated with this event, should not used 452 by any other then the originator of the event */ 453 void SetCaptionBar(wxCaptionBar *bar) { 454 m_captionBar = bar; 455 }; 456 457 DECLARE_DYNAMIC_CLASS(wxCaptionBarEvent) 458 459}; 460 461BEGIN_DECLARE_EVENT_TYPES() 462 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_FOLDBAR, wxEVT_CAPTIONBAR, 7777) 463END_DECLARE_EVENT_TYPES() 464 465typedef void (wxEvtHandler::*wxCaptionBarEventFunction)(wxCaptionBarEvent&); 466 467#define EVT_CAPTIONBAR(id, fn) \ 468 DECLARE_EVENT_TABLE_ENTRY( \ 469 wxEVT_CAPTIONBAR, id, wxID_ANY, \ 470 (wxObjectEventFunction)(wxEventFunction) wxStaticCastEvent(wxCaptionBarEventFunction, & fn), \ 471 (wxObject *) NULL \ 472 ), 473 474#endif // _NO_CAPTIONBAR_ 475 476#endif 477