| 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$ |
| 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 alligned from the right filled with space |
| 28 | |
| 29 | enum |
| 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 | */ |
| 55 | class wxCaptionBarStyle |
| 56 | { |
| 57 | private: |
| 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 | |
| 70 | public: |
| 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 | |
| 253 | class WXDLLIMPEXP_FOLDBAR wxCaptionBar: public wxWindow |
| 254 | { |
| 255 | private: |
| 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 | |
| 284 | public: |
| 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 | |
| 383 | private: |
| 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 | |
| 396 | protected: |
| 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 | |
| 408 | class WXDLLIMPEXP_FOLDBAR wxCaptionBarEvent : public wxCommandEvent |
| 409 | { |
| 410 | |
| 411 | private: |
| 412 | bool m_collapsed; |
| 413 | wxCaptionBar *m_captionBar; |
| 414 | void *m_tag; |
| 415 | |
| 416 | public: |
| 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 | |
| 461 | BEGIN_DECLARE_EVENT_TYPES() |
| 462 | DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_FOLDBAR, wxEVT_CAPTIONBAR, 7777) |
| 463 | END_DECLARE_EVENT_TYPES() |
| 464 | |
| 465 | typedef 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 |