1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/aui/dockart.cpp
3 // Purpose: wxaui: wx advanced user interface - docking window manager
4 // Author: Benjamin I. Williams
8 // Copyright: (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved
9 // Licence: wxWindows Library Licence, Version 3.1
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 #include "wx/wxprec.h"
28 #include "wx/aui/framemanager.h"
29 #include "wx/aui/dockart.h"
32 #include "wx/settings.h"
33 #include "wx/dcclient.h"
38 #include "wx/mac/private.h"
39 #include "wx/graphics.h"
44 #include "wx/renderer.h"
48 // -- wxAuiDefaultDockArt class implementation --
50 // wxAuiDefaultDockArt is an art provider class which does all of the drawing for
51 // wxAuiManager. This allows the library caller to customize the dock art
52 // (probably by deriving from this class), or to completely replace all drawing
53 // with custom dock art (probably by writing a new stand-alone class derived
54 // from the wxAuiDockArt base class). The active dock art class can be set via
55 // wxAuiManager::SetDockArt()
58 // wxAuiBlendColour is used by wxAuiStepColour
59 double wxAuiBlendColour(double fg
, double bg
, double alpha
)
61 double result
= bg
+ (alpha
* (fg
- bg
));
69 // wxAuiStepColour() it a utility function that simply darkens
70 // or lightens a color, based on the specified percentage
71 // ialpha of 0 would be completely black, 100 completely white
72 // an ialpha of 100 returns the same colour
73 wxColor
wxAuiStepColour(const wxColor
& c
, int ialpha
)
78 double r
= c
.Red(), g
= c
.Green(), b
= c
.Blue();
81 // ialpha is 0..200 where 0 is completely black
82 // and 200 is completely white and 100 is the same
83 // convert that to normal alpha 0.0 - 1.0
84 ialpha
= wxMin(ialpha
, 200);
85 ialpha
= wxMax(ialpha
, 0);
86 double alpha
= ((double)(ialpha
- 100.0))/100.0;
92 alpha
= 1.0 - alpha
; // 0 = transparent fg; 1 = opaque fg
98 alpha
= 1.0 + alpha
; // 0 = transparent fg; 1 = opaque fg
101 r
= wxAuiBlendColour(r
, bg
, alpha
);
102 g
= wxAuiBlendColour(g
, bg
, alpha
);
103 b
= wxAuiBlendColour(b
, bg
, alpha
);
105 return wxColour((unsigned char)r
, (unsigned char)g
, (unsigned char)b
);
109 wxColor
wxAuiLightContrastColour(const wxColour
& c
)
113 // if the color is especially dark, then
114 // make the contrast even lighter
115 if (c
.Red() < 128 && c
.Green() < 128 && c
.Blue() < 128)
118 return wxAuiStepColour(c
, amount
);
121 // wxAuiBitmapFromBits() is a utility function that creates a
122 // masked bitmap from raw bits (XBM format)
123 wxBitmap
wxAuiBitmapFromBits(const unsigned char bits
[], int w
, int h
,
124 const wxColour
& color
)
126 wxImage img
= wxBitmap((const char*)bits
, w
, h
).ConvertToImage();
127 img
.Replace(0,0,0,123,123,123);
128 img
.Replace(255,255,255,color
.Red(),color
.Green(),color
.Blue());
129 img
.SetMaskColour(123,123,123);
130 return wxBitmap(img
);
134 static void DrawGradientRectangle(wxDC
& dc
,
136 const wxColour
& start_color
,
137 const wxColour
& end_color
,
140 int rd
, gd
, bd
, high
= 0;
141 rd
= end_color
.Red() - start_color
.Red();
142 gd
= end_color
.Green() - start_color
.Green();
143 bd
= end_color
.Blue() - start_color
.Blue();
145 if (direction
== wxAUI_GRADIENT_VERTICAL
)
146 high
= rect
.GetHeight()-1;
148 high
= rect
.GetWidth()-1;
150 for (int i
= 0; i
<= high
; ++i
)
155 r
= start_color
.Red() + (high
<= 0 ? 0 : (((i
*rd
*100)/high
)/100));
156 g
= start_color
.Green() + (high
<= 0 ? 0 : (((i
*gd
*100)/high
)/100));
157 b
= start_color
.Blue() + (high
<= 0 ? 0 : (((i
*bd
*100)/high
)/100));
159 wxPen
p(wxColor((unsigned char)r
,
164 if (direction
== wxAUI_GRADIENT_VERTICAL
)
165 dc
.DrawLine(rect
.x
, rect
.y
+i
, rect
.x
+rect
.width
, rect
.y
+i
);
167 dc
.DrawLine(rect
.x
+i
, rect
.y
, rect
.x
+i
, rect
.y
+rect
.height
);
171 wxString
wxAuiChopText(wxDC
& dc
, const wxString
& text
, int max_size
)
175 // first check if the text fits with no problems
176 dc
.GetTextExtent(text
, &x
, &y
);
180 size_t i
, len
= text
.Length();
181 size_t last_good_length
= 0;
182 for (i
= 0; i
< len
; ++i
)
184 wxString s
= text
.Left(i
);
187 dc
.GetTextExtent(s
, &x
, &y
);
191 last_good_length
= i
;
194 wxString ret
= text
.Left(last_good_length
);
199 wxAuiDefaultDockArt::wxAuiDefaultDockArt()
202 wxBrush toolbarbrush
;
203 toolbarbrush
.MacSetTheme( kThemeBrushToolbarBackground
);
204 wxColor base_colour
= toolbarbrush
.GetColour();
206 wxColor base_colour
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
);
209 // the base_colour is too pale to use as our base colour,
210 // so darken it a bit --
211 if ((255-base_colour
.Red()) +
212 (255-base_colour
.Green()) +
213 (255-base_colour
.Blue()) < 60)
215 base_colour
= wxAuiStepColour(base_colour
, 92);
218 m_base_colour
= base_colour
;
219 wxColor darker1_colour
= wxAuiStepColour(base_colour
, 85);
220 wxColor darker2_colour
= wxAuiStepColour(base_colour
, 75);
221 wxColor darker3_colour
= wxAuiStepColour(base_colour
, 60);
222 //wxColor darker4_colour = wxAuiStepColour(base_colour, 50);
223 wxColor darker5_colour
= wxAuiStepColour(base_colour
, 40);
225 m_active_caption_colour
= wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT
);
226 m_active_caption_gradient_colour
= wxAuiLightContrastColour(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT
));
227 m_active_caption_text_colour
= wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT
);
228 m_inactive_caption_colour
= darker1_colour
;
229 m_inactive_caption_gradient_colour
= wxAuiStepColour(base_colour
, 97);
230 m_inactive_caption_text_colour
= *wxBLACK
;
233 m_sash_brush
= toolbarbrush
;
234 m_background_brush
= toolbarbrush
;
235 m_gripper_brush
= toolbarbrush
;
237 m_sash_brush
= wxBrush(base_colour
);
238 m_background_brush
= wxBrush(base_colour
);
239 m_gripper_brush
= wxBrush(base_colour
);
241 m_border_pen
= wxPen(darker2_colour
);
242 m_gripper_pen1
= wxPen(darker5_colour
);
243 m_gripper_pen2
= wxPen(darker3_colour
);
244 m_gripper_pen3
= *wxWHITE_PEN
;
247 m_caption_font
= *wxSMALL_FONT
;
249 m_caption_font
= wxFont(8, wxDEFAULT
, wxNORMAL
, wxNORMAL
, FALSE
);
252 // some built in bitmaps
253 #if defined( __WXMAC__ )
254 static unsigned char close_bits
[]={
255 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3,
256 0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3,
257 0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF };
258 #elif defined(__WXGTK__)
259 static unsigned char close_bits
[]={
260 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8,
261 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef,
262 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
264 static unsigned char close_bits
[]={
265 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf3, 0xcf, 0xf9,
266 0x9f, 0xfc, 0x3f, 0xfe, 0x3f, 0xfe, 0x9f, 0xfc, 0xcf, 0xf9, 0xe7, 0xf3,
267 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
270 static unsigned char maximize_bits
[] = {
271 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xf7, 0xf7, 0x07, 0xf0,
272 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0x07, 0xf0,
273 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
275 static unsigned char restore_bits
[]={
276 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf0, 0x1f, 0xf0, 0xdf, 0xf7,
277 0x07, 0xf4, 0x07, 0xf4, 0xf7, 0xf5, 0xf7, 0xf1, 0xf7, 0xfd, 0xf7, 0xfd,
278 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
280 static unsigned char pin_bits
[]={
281 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xdf,0xfc,0xdf,0xfc,
282 0xdf,0xfc,0xdf,0xfc,0xdf,0xfc,0x0f,0xf8,0x7f,0xff,0x7f,0xff,
283 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
286 m_inactive_close_bitmap
= wxAuiBitmapFromBits(close_bits
, 16, 16, *wxWHITE
);
287 m_active_close_bitmap
= wxAuiBitmapFromBits(close_bits
, 16, 16, *wxWHITE
);
289 m_inactive_close_bitmap
= wxAuiBitmapFromBits(close_bits
, 16, 16, m_inactive_caption_text_colour
);
290 m_active_close_bitmap
= wxAuiBitmapFromBits(close_bits
, 16, 16, m_active_caption_text_colour
);
294 m_inactive_maximize_bitmap
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, *wxWHITE
);
295 m_active_maximize_bitmap
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, *wxWHITE
);
297 m_inactive_maximize_bitmap
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, m_inactive_caption_text_colour
);
298 m_active_maximize_bitmap
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, m_active_caption_text_colour
);
302 m_inactive_restore_bitmap
= wxAuiBitmapFromBits(restore_bits
, 16, 16, *wxWHITE
);
303 m_active_restore_bitmap
= wxAuiBitmapFromBits(restore_bits
, 16, 16, *wxWHITE
);
305 m_inactive_restore_bitmap
= wxAuiBitmapFromBits(restore_bits
, 16, 16, m_inactive_caption_text_colour
);
306 m_active_restore_bitmap
= wxAuiBitmapFromBits(restore_bits
, 16, 16, m_active_caption_text_colour
);
309 m_inactive_pin_bitmap
= wxAuiBitmapFromBits(pin_bits
, 16, 16, m_inactive_caption_text_colour
);
310 m_active_pin_bitmap
= wxAuiBitmapFromBits(pin_bits
, 16, 16, m_active_caption_text_colour
);
312 // default metric values
313 #if defined(__WXMAC__)
315 GetThemeMetric( kThemeMetricSmallPaneSplitterHeight
, &height
);
316 m_sash_size
= height
;
317 #elif defined(__WXGTK__)
318 m_sash_size
= wxRendererNative::Get().GetSplitterParams(NULL
).widthSash
;
326 m_gradient_type
= wxAUI_GRADIENT_VERTICAL
;
329 int wxAuiDefaultDockArt::GetMetric(int id
)
333 case wxAUI_DOCKART_SASH_SIZE
: return m_sash_size
;
334 case wxAUI_DOCKART_CAPTION_SIZE
: return m_caption_size
;
335 case wxAUI_DOCKART_GRIPPER_SIZE
: return m_gripper_size
;
336 case wxAUI_DOCKART_PANE_BORDER_SIZE
: return m_border_size
;
337 case wxAUI_DOCKART_PANE_BUTTON_SIZE
: return m_button_size
;
338 case wxAUI_DOCKART_GRADIENT_TYPE
: return m_gradient_type
;
339 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
345 void wxAuiDefaultDockArt::SetMetric(int id
, int new_val
)
349 case wxAUI_DOCKART_SASH_SIZE
: m_sash_size
= new_val
; break;
350 case wxAUI_DOCKART_CAPTION_SIZE
: m_caption_size
= new_val
; break;
351 case wxAUI_DOCKART_GRIPPER_SIZE
: m_gripper_size
= new_val
; break;
352 case wxAUI_DOCKART_PANE_BORDER_SIZE
: m_border_size
= new_val
; break;
353 case wxAUI_DOCKART_PANE_BUTTON_SIZE
: m_button_size
= new_val
; break;
354 case wxAUI_DOCKART_GRADIENT_TYPE
: m_gradient_type
= new_val
; break;
355 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
359 wxColour
wxAuiDefaultDockArt::GetColour(int id
)
363 case wxAUI_DOCKART_BACKGROUND_COLOUR
: return m_background_brush
.GetColour();
364 case wxAUI_DOCKART_SASH_COLOUR
: return m_sash_brush
.GetColour();
365 case wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR
: return m_inactive_caption_colour
;
366 case wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR
: return m_inactive_caption_gradient_colour
;
367 case wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR
: return m_inactive_caption_text_colour
;
368 case wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR
: return m_active_caption_colour
;
369 case wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR
: return m_active_caption_gradient_colour
;
370 case wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR
: return m_active_caption_text_colour
;
371 case wxAUI_DOCKART_BORDER_COLOUR
: return m_border_pen
.GetColour();
372 case wxAUI_DOCKART_GRIPPER_COLOUR
: return m_gripper_brush
.GetColour();
373 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
379 void wxAuiDefaultDockArt::SetColour(int id
, const wxColor
& colour
)
383 case wxAUI_DOCKART_BACKGROUND_COLOUR
: m_background_brush
.SetColour(colour
); break;
384 case wxAUI_DOCKART_SASH_COLOUR
: m_sash_brush
.SetColour(colour
); break;
385 case wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR
: m_inactive_caption_colour
= colour
; break;
386 case wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR
: m_inactive_caption_gradient_colour
= colour
; break;
387 case wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR
: m_inactive_caption_text_colour
= colour
; break;
388 case wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR
: m_active_caption_colour
= colour
; break;
389 case wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR
: m_active_caption_gradient_colour
= colour
; break;
390 case wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR
: m_active_caption_text_colour
= colour
; break;
391 case wxAUI_DOCKART_BORDER_COLOUR
: m_border_pen
.SetColour(colour
); break;
392 case wxAUI_DOCKART_GRIPPER_COLOUR
:
393 m_gripper_brush
.SetColour(colour
);
394 m_gripper_pen1
.SetColour(wxAuiStepColour(colour
, 40));
395 m_gripper_pen2
.SetColour(wxAuiStepColour(colour
, 60));
397 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
401 void wxAuiDefaultDockArt::SetFont(int id
, const wxFont
& font
)
403 if (id
== wxAUI_DOCKART_CAPTION_FONT
)
404 m_caption_font
= font
;
407 wxFont
wxAuiDefaultDockArt::GetFont(int id
)
409 if (id
== wxAUI_DOCKART_CAPTION_FONT
)
410 return m_caption_font
;
414 void wxAuiDefaultDockArt::DrawSash(wxDC
& dc
, wxWindow
*window
, int orientation
, const wxRect
& rect
)
416 #if defined(__WXMAC__)
418 wxUnusedVar(orientation
);
420 HIRect splitterRect
= CGRectMake( rect
.x
, rect
.y
, rect
.width
, rect
.height
);
421 CGContextRef cgContext
;
422 #if wxMAC_USE_CORE_GRAPHICS
423 cgContext
= (CGContextRef
) dc
.GetGraphicsContext()->GetNativeContext() ;
426 GetPortBounds( (CGrafPtr
) dc
.m_macPort
, &bounds
) ;
427 QDBeginCGContext( (CGrafPtr
) dc
.m_macPort
, &cgContext
) ;
428 CGContextTranslateCTM( cgContext
, 0 , bounds
.bottom
- bounds
.top
) ;
429 CGContextScaleCTM( cgContext
, 1 , -1 ) ;
432 HIThemeSplitterDrawInfo drawInfo
;
433 drawInfo
.version
= 0 ;
434 drawInfo
.state
= kThemeStateActive
;
435 drawInfo
.adornment
= kHIThemeSplitterAdornmentNone
;
436 HIThemeDrawPaneSplitter( &splitterRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
) ;
438 #if wxMAC_USE_CORE_GRAPHICS
440 QDEndCGContext( (CGrafPtr
) dc
.m_macPort
, &cgContext
) ;
443 #elif defined(__WXGTK__)
444 // clear out the rectangle first
445 dc
.SetPen(*wxTRANSPARENT_PEN
);
446 dc
.SetBrush(m_sash_brush
);
447 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
450 GdkRectangle gdk_rect
;
451 if (orientation
== wxVERTICAL
)
455 gdk_rect
.width
= m_sash_size
;
456 gdk_rect
.height
= rect
.height
;
462 gdk_rect
.width
= rect
.width
;
463 gdk_rect
.height
= m_sash_size
;
468 if (!window
->m_wxwindow
) return;
469 if (!GTK_WIDGET_DRAWABLE(window
->m_wxwindow
)) return;
473 window
->m_wxwindow
->style
,
474 window
->GTKGetDrawingWindow(),
475 // flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL,
478 NULL
/* no clipping */,
485 (orientation
== wxVERTICAL
) ? GTK_ORIENTATION_VERTICAL
: GTK_ORIENTATION_HORIZONTAL
490 wxUnusedVar(orientation
);
491 dc
.SetPen(*wxTRANSPARENT_PEN
);
492 dc
.SetBrush(m_sash_brush
);
493 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
498 void wxAuiDefaultDockArt::DrawBackground(wxDC
& dc
, wxWindow
*WXUNUSED(window
), int, const wxRect
& rect
)
500 dc
.SetPen(*wxTRANSPARENT_PEN
);
502 // we have to clear first, otherwise we are drawing a light striped pattern
503 // over an already darker striped background
504 dc
.SetBrush(*wxWHITE_BRUSH
) ;
505 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
507 dc
.SetBrush(m_background_brush
);
508 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
511 void wxAuiDefaultDockArt::DrawBorder(wxDC
& dc
, wxWindow
*WXUNUSED(window
), const wxRect
& _rect
,
514 dc
.SetPen(m_border_pen
);
515 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
518 int i
, border_width
= GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE
);
520 if (pane
.IsToolbar())
522 for (i
= 0; i
< border_width
; ++i
)
524 dc
.SetPen(*wxWHITE_PEN
);
525 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
+rect
.width
, rect
.y
);
526 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
, rect
.y
+rect
.height
);
527 dc
.SetPen(m_border_pen
);
528 dc
.DrawLine(rect
.x
, rect
.y
+rect
.height
-1,
529 rect
.x
+rect
.width
, rect
.y
+rect
.height
-1);
530 dc
.DrawLine(rect
.x
+rect
.width
-1, rect
.y
,
531 rect
.x
+rect
.width
-1, rect
.y
+rect
.height
);
537 for (i
= 0; i
< border_width
; ++i
)
539 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
546 void wxAuiDefaultDockArt::DrawCaptionBackground(wxDC
& dc
, const wxRect
& rect
, bool active
)
548 if (m_gradient_type
== wxAUI_GRADIENT_NONE
)
551 dc
.SetBrush(wxBrush(m_active_caption_colour
));
553 dc
.SetBrush(wxBrush(m_inactive_caption_colour
));
555 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
561 // on mac the gradients are expected to become darker from the top
563 DrawGradientRectangle(dc
, rect
,
564 m_active_caption_colour
,
565 m_active_caption_gradient_colour
,
568 // on other platforms, active gradients become lighter at the top
569 DrawGradientRectangle(dc
, rect
,
570 m_active_caption_gradient_colour
,
571 m_active_caption_colour
,
578 // on mac the gradients are expected to become darker from the top
579 DrawGradientRectangle(dc
, rect
,
580 m_inactive_caption_gradient_colour
,
581 m_inactive_caption_colour
,
584 // on other platforms, inactive gradients become lighter at the bottom
585 DrawGradientRectangle(dc
, rect
,
586 m_inactive_caption_colour
,
587 m_inactive_caption_gradient_colour
,
595 void wxAuiDefaultDockArt::DrawCaption(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
596 const wxString
& text
,
600 dc
.SetPen(*wxTRANSPARENT_PEN
);
601 dc
.SetFont(m_caption_font
);
603 DrawCaptionBackground(dc
, rect
,
604 (pane
.state
& wxAuiPaneInfo::optionActive
)?true:false);
606 if (pane
.state
& wxAuiPaneInfo::optionActive
)
607 dc
.SetTextForeground(m_active_caption_text_colour
);
609 dc
.SetTextForeground(m_inactive_caption_text_colour
);
613 dc
.GetTextExtent(wxT("ABCDEFHXfgkj"), &w
, &h
);
615 wxRect clip_rect
= rect
;
616 clip_rect
.width
-= 3; // text offset
617 clip_rect
.width
-= 2; // button padding
618 if (pane
.HasCloseButton())
619 clip_rect
.width
-= m_button_size
;
620 if (pane
.HasPinButton())
621 clip_rect
.width
-= m_button_size
;
622 if (pane
.HasMaximizeButton())
623 clip_rect
.width
-= m_button_size
;
625 wxString draw_text
= wxAuiChopText(dc
, text
, clip_rect
.width
);
627 dc
.SetClippingRegion(clip_rect
);
628 dc
.DrawText(draw_text
, rect
.x
+3, rect
.y
+(rect
.height
/2)-(h
/2)-1);
629 dc
.DestroyClippingRegion();
632 void wxAuiDefaultDockArt::DrawGripper(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
636 dc
.SetPen(*wxTRANSPARENT_PEN
);
637 dc
.SetBrush(m_gripper_brush
);
639 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
,rect
.height
);
641 if (!pane
.HasGripperTop())
646 dc
.SetPen(m_gripper_pen1
);
647 dc
.DrawPoint(rect
.x
+3, rect
.y
+y
);
648 dc
.SetPen(m_gripper_pen2
);
649 dc
.DrawPoint(rect
.x
+3, rect
.y
+y
+1);
650 dc
.DrawPoint(rect
.x
+4, rect
.y
+y
);
651 dc
.SetPen(m_gripper_pen3
);
652 dc
.DrawPoint(rect
.x
+5, rect
.y
+y
+1);
653 dc
.DrawPoint(rect
.x
+5, rect
.y
+y
+2);
654 dc
.DrawPoint(rect
.x
+4, rect
.y
+y
+2);
657 if (y
> rect
.GetHeight()-5)
666 dc
.SetPen(m_gripper_pen1
);
667 dc
.DrawPoint(rect
.x
+x
, rect
.y
+3);
668 dc
.SetPen(m_gripper_pen2
);
669 dc
.DrawPoint(rect
.x
+x
+1, rect
.y
+3);
670 dc
.DrawPoint(rect
.x
+x
, rect
.y
+4);
671 dc
.SetPen(m_gripper_pen3
);
672 dc
.DrawPoint(rect
.x
+x
+1, rect
.y
+5);
673 dc
.DrawPoint(rect
.x
+x
+2, rect
.y
+5);
674 dc
.DrawPoint(rect
.x
+x
+2, rect
.y
+4);
677 if (x
> rect
.GetWidth()-5)
683 void wxAuiDefaultDockArt::DrawPaneButton(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
695 case wxAUI_BUTTON_CLOSE
:
696 if (pane
.state
& wxAuiPaneInfo::optionActive
)
697 bmp
= m_active_close_bitmap
;
699 bmp
= m_inactive_close_bitmap
;
701 case wxAUI_BUTTON_PIN
:
702 if (pane
.state
& wxAuiPaneInfo::optionActive
)
703 bmp
= m_active_pin_bitmap
;
705 bmp
= m_inactive_pin_bitmap
;
707 case wxAUI_BUTTON_MAXIMIZE_RESTORE
:
708 if (pane
.IsMaximized())
710 if (pane
.state
& wxAuiPaneInfo::optionActive
)
711 bmp
= m_active_restore_bitmap
;
713 bmp
= m_inactive_restore_bitmap
;
717 if (pane
.state
& wxAuiPaneInfo::optionActive
)
718 bmp
= m_active_maximize_bitmap
;
720 bmp
= m_inactive_maximize_bitmap
;
729 rect
.y
= rect
.y
+ (rect
.height
/2) - (bmp
.GetHeight()/2);
730 rect
.height
= old_y
+ rect
.height
- rect
.y
- 1;
733 if (button_state
== wxAUI_BUTTON_STATE_PRESSED
)
739 if (button_state
== wxAUI_BUTTON_STATE_HOVER
||
740 button_state
== wxAUI_BUTTON_STATE_PRESSED
)
742 if (pane
.state
& wxAuiPaneInfo::optionActive
)
744 dc
.SetBrush(wxBrush(wxAuiStepColour(m_active_caption_colour
, 120)));
745 dc
.SetPen(wxPen(wxAuiStepColour(m_active_caption_colour
, 70)));
749 dc
.SetBrush(wxBrush(wxAuiStepColour(m_inactive_caption_colour
, 120)));
750 dc
.SetPen(wxPen(wxAuiStepColour(m_inactive_caption_colour
, 70)));
753 // draw the background behind the button
754 dc
.DrawRectangle(rect
.x
, rect
.y
, 15, 15);
758 // draw the button itself
759 dc
.DrawBitmap(bmp
, rect
.x
, rect
.y
, true);