]> git.saurik.com Git - wxWidgets.git/blob - contrib/include/wx/foldbar/captionbar.h
use WX_DEFINE_ARRAY_PTR for anarray of pointers (fixes Sun CC warning)
[wxWidgets.git] / contrib / include / wx / foldbar / captionbar.h
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 aligned 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 WXDLLIMPEXP_FOLDBAR 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