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/gtk/win_gtk.h"
45 #include "wx/renderer.h"
49 // -- wxAuiDefaultDockArt class implementation --
51 // wxAuiDefaultDockArt is an art provider class which does all of the drawing for
52 // wxAuiManager. This allows the library caller to customize the dock art
53 // (probably by deriving from this class), or to completely replace all drawing
54 // with custom dock art (probably by writing a new stand-alone class derived
55 // from the wxAuiDockArt base class). The active dock art class can be set via
56 // wxAuiManager::SetDockArt()
59 // StepColour() it a utility function that simply darkens
60 // or lightens a color, based on the specified percentage
61 static wxColor
StepColour(const wxColor
& c
, int percent
)
63 int r
= c
.Red(), g
= c
.Green(), b
= c
.Blue();
64 return wxColour((unsigned char)wxMin((r
*percent
)/100,255),
65 (unsigned char)wxMin((g
*percent
)/100,255),
66 (unsigned char)wxMin((b
*percent
)/100,255));
69 static wxColor
LightContrastColour(const wxColour
& c
)
73 // if the color is especially dark, then
74 // make the contrast even lighter
75 if (c
.Red() < 128 && c
.Green() < 128 && c
.Blue() < 128)
78 return StepColour(c
, amount
);
81 // BitmapFromBits() is a utility function that creates a
82 // masked bitmap from raw bits (XBM format)
83 static wxBitmap
BitmapFromBits(const unsigned char bits
[], int w
, int h
,
84 const wxColour
& color
)
86 wxImage img
= wxBitmap((const char*)bits
, w
, h
).ConvertToImage();
87 img
.Replace(0,0,0,123,123,123);
88 img
.Replace(255,255,255,color
.Red(),color
.Green(),color
.Blue());
89 img
.SetMaskColour(123,123,123);
94 static void DrawGradientRectangle(wxDC
& dc
,
96 const wxColour
& start_color
,
97 const wxColour
& end_color
,
100 int rd
, gd
, bd
, high
= 0;
101 rd
= end_color
.Red() - start_color
.Red();
102 gd
= end_color
.Green() - start_color
.Green();
103 bd
= end_color
.Blue() - start_color
.Blue();
105 if (direction
== wxAUI_GRADIENT_VERTICAL
)
106 high
= rect
.GetHeight()-1;
108 high
= rect
.GetWidth()-1;
110 for (int i
= 0; i
<= high
; ++i
)
115 r
= start_color
.Red() + ((i
*rd
*100)/high
)/100;
116 g
= start_color
.Green() + ((i
*gd
*100)/high
)/100;
117 b
= start_color
.Blue() + ((i
*bd
*100)/high
)/100;
119 wxPen
p(wxColor((unsigned char)r
,
124 if (direction
== wxAUI_GRADIENT_VERTICAL
)
125 dc
.DrawLine(rect
.x
, rect
.y
+i
, rect
.x
+rect
.width
, rect
.y
+i
);
127 dc
.DrawLine(rect
.x
+i
, rect
.y
, rect
.x
+i
, rect
.y
+rect
.height
);
132 static wxString
ChopText(wxDC
& dc
, const wxString
& text
, int max_size
)
136 // first check if the text fits with no problems
137 dc
.GetTextExtent(text
, &x
, &y
);
141 size_t i
, len
= text
.Length();
142 size_t last_good_length
= 0;
143 for (i
= 0; i
< len
; ++i
)
145 wxString s
= text
.Left(i
);
148 dc
.GetTextExtent(s
, &x
, &y
);
152 last_good_length
= i
;
155 wxString ret
= text
.Left(last_good_length
);
160 wxAuiDefaultDockArt
::wxAuiDefaultDockArt()
163 wxBrush toolbarbrush
;
164 toolbarbrush
.MacSetTheme( kThemeBrushToolbarBackground
);
165 wxColor base_colour
= toolbarbrush
.GetColour();
167 wxColor base_colour
= wxSystemSettings
::GetColour(wxSYS_COLOUR_3DFACE
);
170 m_base_colour
= base_colour
;
171 wxColor darker1_colour
= StepColour(base_colour
, 85);
172 wxColor darker2_colour
= StepColour(base_colour
, 70);
173 wxColor darker3_colour
= StepColour(base_colour
, 60);
174 wxColor darker4_colour
= StepColour(base_colour
, 50);
175 wxColor darker5_colour
= StepColour(base_colour
, 40);
177 m_active_caption_colour
= wxSystemSettings
::GetColour(wxSYS_COLOUR_HIGHLIGHT
);
178 m_active_caption_gradient_colour
= LightContrastColour(wxSystemSettings
::GetColour(wxSYS_COLOUR_HIGHLIGHT
));
179 m_active_caption_text_colour
= wxSystemSettings
::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT
);
180 m_inactive_caption_colour
= darker1_colour
;
181 m_inactive_caption_gradient_colour
= StepColour(base_colour
, 97);
182 m_inactive_caption_text_colour
= *wxBLACK
;
185 m_sash_brush
= toolbarbrush
;
186 m_background_brush
= toolbarbrush
;
187 m_gripper_brush
= toolbarbrush
;
189 m_sash_brush
= wxBrush(base_colour
);
190 m_background_brush
= wxBrush(base_colour
);
191 m_gripper_brush
= wxBrush(base_colour
);
193 m_border_pen
= wxPen(darker2_colour
);
194 m_gripper_pen1
= wxPen(darker5_colour
);
195 m_gripper_pen2
= wxPen(darker3_colour
);
196 m_gripper_pen3
= *wxWHITE_PEN
;
199 m_caption_font
= *wxSMALL_FONT
;
201 m_caption_font
= wxFont(8, wxDEFAULT
, wxNORMAL
, wxNORMAL
, FALSE
);
204 // some built in bitmaps
205 #if defined( __WXMAC__ )
206 static unsigned char close_bits
[]={
207 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3,
208 0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3,
209 0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF };
211 static unsigned char close_bits
[]={
212 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf3, 0xcf, 0xf9,
213 0x9f, 0xfc, 0x3f, 0xfe, 0x3f, 0xfe, 0x9f, 0xfc, 0xcf, 0xf9, 0xe7, 0xf3,
214 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
217 static unsigned char maximize_bits
[] = {
218 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xf7, 0xf7, 0x07, 0xf0,
219 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0x07, 0xf0,
220 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
222 static unsigned char restore_bits
[]={
223 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf0, 0x1f, 0xf0, 0xdf, 0xf7,
224 0x07, 0xf4, 0x07, 0xf4, 0xf7, 0xf5, 0xf7, 0xf1, 0xf7, 0xfd, 0xf7, 0xfd,
225 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
227 static unsigned char pin_bits
[]={
228 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xdf,0xfc,0xdf,0xfc,
229 0xdf,0xfc,0xdf,0xfc,0xdf,0xfc,0x0f,0xf8,0x7f,0xff,0x7f,0xff,
230 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
233 m_inactive_close_bitmap
= BitmapFromBits(close_bits
, 16, 16, *wxWHITE
);
234 m_active_close_bitmap
= BitmapFromBits(close_bits
, 16, 16, *wxWHITE
);
236 m_inactive_close_bitmap
= BitmapFromBits(close_bits
, 16, 16, m_inactive_caption_text_colour
);
237 m_active_close_bitmap
= BitmapFromBits(close_bits
, 16, 16, m_active_caption_text_colour
);
241 m_inactive_maximize_bitmap
= BitmapFromBits(maximize_bits
, 16, 16, *wxWHITE
);
242 m_active_maximize_bitmap
= BitmapFromBits(maximize_bits
, 16, 16, *wxWHITE
);
244 m_inactive_maximize_bitmap
= BitmapFromBits(maximize_bits
, 16, 16, m_inactive_caption_text_colour
);
245 m_active_maximize_bitmap
= BitmapFromBits(maximize_bits
, 16, 16, m_active_caption_text_colour
);
249 m_inactive_restore_bitmap
= BitmapFromBits(restore_bits
, 16, 16, *wxWHITE
);
250 m_active_restore_bitmap
= BitmapFromBits(restore_bits
, 16, 16, *wxWHITE
);
252 m_inactive_restore_bitmap
= BitmapFromBits(restore_bits
, 16, 16, m_inactive_caption_text_colour
);
253 m_active_restore_bitmap
= BitmapFromBits(restore_bits
, 16, 16, m_active_caption_text_colour
);
256 m_inactive_pin_bitmap
= BitmapFromBits(pin_bits
, 16, 16, m_inactive_caption_text_colour
);
257 m_active_pin_bitmap
= BitmapFromBits(pin_bits
, 16, 16, m_active_caption_text_colour
);
259 // default metric values
260 #if defined(__WXMAC__)
262 GetThemeMetric( kThemeMetricSmallPaneSplitterHeight
, &height
);
263 m_sash_size
= height
;
264 #elif defined(__WXGTK__)
265 m_sash_size
= wxRendererNative
::Get().GetSplitterParams(NULL
).widthSash
;
273 m_gradient_type
= wxAUI_GRADIENT_VERTICAL
;
276 int wxAuiDefaultDockArt
::GetMetric(int id
)
280 case wxAUI_ART_SASH_SIZE
: return m_sash_size
;
281 case wxAUI_ART_CAPTION_SIZE
: return m_caption_size
;
282 case wxAUI_ART_GRIPPER_SIZE
: return m_gripper_size
;
283 case wxAUI_ART_PANE_BORDER_SIZE
: return m_border_size
;
284 case wxAUI_ART_PANE_BUTTON_SIZE
: return m_button_size
;
285 case wxAUI_ART_GRADIENT_TYPE
: return m_gradient_type
;
286 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
292 void wxAuiDefaultDockArt
::SetMetric(int id
, int new_val
)
296 case wxAUI_ART_SASH_SIZE
: m_sash_size
= new_val
; break;
297 case wxAUI_ART_CAPTION_SIZE
: m_caption_size
= new_val
; break;
298 case wxAUI_ART_GRIPPER_SIZE
: m_gripper_size
= new_val
; break;
299 case wxAUI_ART_PANE_BORDER_SIZE
: m_border_size
= new_val
; break;
300 case wxAUI_ART_PANE_BUTTON_SIZE
: m_button_size
= new_val
; break;
301 case wxAUI_ART_GRADIENT_TYPE
: m_gradient_type
= new_val
; break;
302 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
306 wxColour wxAuiDefaultDockArt
::GetColour(int id
)
310 case wxAUI_ART_BACKGROUND_COLOUR
: return m_background_brush
.GetColour();
311 case wxAUI_ART_SASH_COLOUR
: return m_sash_brush
.GetColour();
312 case wxAUI_ART_INACTIVE_CAPTION_COLOUR
: return m_inactive_caption_colour
;
313 case wxAUI_ART_INACTIVE_CAPTION_GRADIENT_COLOUR
: return m_inactive_caption_gradient_colour
;
314 case wxAUI_ART_INACTIVE_CAPTION_TEXT_COLOUR
: return m_inactive_caption_text_colour
;
315 case wxAUI_ART_ACTIVE_CAPTION_COLOUR
: return m_active_caption_colour
;
316 case wxAUI_ART_ACTIVE_CAPTION_GRADIENT_COLOUR
: return m_active_caption_gradient_colour
;
317 case wxAUI_ART_ACTIVE_CAPTION_TEXT_COLOUR
: return m_active_caption_text_colour
;
318 case wxAUI_ART_BORDER_COLOUR
: return m_border_pen
.GetColour();
319 case wxAUI_ART_GRIPPER_COLOUR
: return m_gripper_brush
.GetColour();
320 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
326 void wxAuiDefaultDockArt
::SetColour(int id
, const wxColor
& colour
)
330 case wxAUI_ART_BACKGROUND_COLOUR
: m_background_brush
.SetColour(colour
); break;
331 case wxAUI_ART_SASH_COLOUR
: m_sash_brush
.SetColour(colour
); break;
332 case wxAUI_ART_INACTIVE_CAPTION_COLOUR
: m_inactive_caption_colour
= colour
; break;
333 case wxAUI_ART_INACTIVE_CAPTION_GRADIENT_COLOUR
: m_inactive_caption_gradient_colour
= colour
; break;
334 case wxAUI_ART_INACTIVE_CAPTION_TEXT_COLOUR
: m_inactive_caption_text_colour
= colour
; break;
335 case wxAUI_ART_ACTIVE_CAPTION_COLOUR
: m_active_caption_colour
= colour
; break;
336 case wxAUI_ART_ACTIVE_CAPTION_GRADIENT_COLOUR
: m_active_caption_gradient_colour
= colour
; break;
337 case wxAUI_ART_ACTIVE_CAPTION_TEXT_COLOUR
: m_active_caption_text_colour
= colour
; break;
338 case wxAUI_ART_BORDER_COLOUR
: m_border_pen
.SetColour(colour
); break;
339 case wxAUI_ART_GRIPPER_COLOUR
:
340 m_gripper_brush
.SetColour(colour
);
341 m_gripper_pen1
.SetColour(StepColour(colour
, 40));
342 m_gripper_pen2
.SetColour(StepColour(colour
, 60));
344 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
348 void wxAuiDefaultDockArt
::SetFont(int id
, const wxFont
& font
)
350 if (id
== wxAUI_ART_CAPTION_FONT
)
351 m_caption_font
= font
;
354 wxFont wxAuiDefaultDockArt
::GetFont(int id
)
356 if (id
== wxAUI_ART_CAPTION_FONT
)
357 return m_caption_font
;
361 void wxAuiDefaultDockArt
::DrawSash(wxDC
& dc
, wxWindow
*window
, int orientation
, const wxRect
& rect
)
363 #if defined(__WXMAC__)
364 HIRect splitterRect
= CGRectMake( rect
.x
, rect
.y
, rect
.width
, rect
.height
);
365 CGContextRef cgContext
;
366 #if wxMAC_USE_CORE_GRAPHICS
367 cgContext
= (CGContextRef
) dc
.GetGraphicsContext()->GetNativeContext() ;
370 GetPortBounds( (CGrafPtr
) dc
.m_macPort
, &bounds
) ;
371 QDBeginCGContext( (CGrafPtr
) dc
.m_macPort
, &cgContext
) ;
372 CGContextTranslateCTM( cgContext
, 0 , bounds
.bottom
- bounds
.top
) ;
373 CGContextScaleCTM( cgContext
, 1 , -1 ) ;
376 HIThemeSplitterDrawInfo drawInfo
;
377 drawInfo
.version
= 0 ;
378 drawInfo
.state
= kThemeStateActive
;
379 drawInfo
.adornment
= kHIThemeSplitterAdornmentNone
;
380 HIThemeDrawPaneSplitter( &splitterRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
) ;
382 #if wxMAC_USE_CORE_GRAPHICS
384 QDEndCGContext( (CGrafPtr
) dc
.m_macPort
, &cgContext
) ;
387 #elif defined(__WXGTK__)
389 GdkRectangle gdk_rect
;
390 if (orientation
== wxVERTICAL
)
394 gdk_rect
.width
= m_sash_size
;
395 gdk_rect
.height
= rect
.height
;
401 gdk_rect
.width
= rect
.width
;
402 gdk_rect
.height
= m_sash_size
;
406 if (!window
->m_wxwindow
) return;
407 if (!GTK_PIZZA(window
->m_wxwindow
)->bin_window
) return;
411 window
->m_wxwindow
->style
,
412 GTK_PIZZA(window
->m_wxwindow
)->bin_window
,
413 // flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL,
416 NULL
/* no clipping */,
423 (orientation
== wxVERTICAL
) ? GTK_ORIENTATION_VERTICAL
: GTK_ORIENTATION_HORIZONTAL
428 wxUnusedVar(orientation
);
429 dc
.SetPen(*wxTRANSPARENT_PEN
);
430 dc
.SetBrush(m_sash_brush
);
431 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
436 void wxAuiDefaultDockArt
::DrawBackground(wxDC
& dc
, wxWindow
*WXUNUSED(window
), int, const wxRect
& rect
)
438 dc
.SetPen(*wxTRANSPARENT_PEN
);
440 // we have to clear first, otherwise we are drawing a light striped pattern
441 // over an already darker striped background
442 dc
.SetBrush(*wxWHITE_BRUSH
) ;
443 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
445 dc
.SetBrush(m_background_brush
);
446 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
449 void wxAuiDefaultDockArt
::DrawBorder(wxDC
& dc
, wxWindow
*WXUNUSED(window
), const wxRect
& _rect
,
452 dc
.SetPen(m_border_pen
);
453 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
456 int i
, border_width
= GetMetric(wxAUI_ART_PANE_BORDER_SIZE
);
458 if (pane
.IsToolbar())
460 for (i
= 0; i
< border_width
; ++i
)
462 dc
.SetPen(*wxWHITE_PEN
);
463 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
+rect
.width
, rect
.y
);
464 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
, rect
.y
+rect
.height
);
465 dc
.SetPen(m_border_pen
);
466 dc
.DrawLine(rect
.x
, rect
.y
+rect
.height
-1,
467 rect
.x
+rect
.width
, rect
.y
+rect
.height
-1);
468 dc
.DrawLine(rect
.x
+rect
.width
-1, rect
.y
,
469 rect
.x
+rect
.width
-1, rect
.y
+rect
.height
);
475 for (i
= 0; i
< border_width
; ++i
)
477 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
484 void wxAuiDefaultDockArt
::DrawCaptionBackground(wxDC
& dc
, const wxRect
& rect
, bool active
)
486 if (m_gradient_type
== wxAUI_GRADIENT_NONE
)
489 dc
.SetBrush(wxBrush(m_active_caption_colour
));
491 dc
.SetBrush(wxBrush(m_inactive_caption_colour
));
493 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
499 // on mac the gradients are expected to become darker from the top
501 DrawGradientRectangle(dc
, rect
,
502 m_active_caption_colour
,
503 m_active_caption_gradient_colour
,
506 // on other platforms, active gradients become lighter at the top
507 DrawGradientRectangle(dc
, rect
,
508 m_active_caption_gradient_colour
,
509 m_active_caption_colour
,
516 // on mac the gradients are expected to become darker from the top
517 DrawGradientRectangle(dc
, rect
,
518 m_inactive_caption_gradient_colour
,
519 m_inactive_caption_colour
,
522 // on other platforms, inactive gradients become lighter at the bottom
523 DrawGradientRectangle(dc
, rect
,
524 m_inactive_caption_colour
,
525 m_inactive_caption_gradient_colour
,
533 void wxAuiDefaultDockArt
::DrawCaption(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
534 const wxString
& text
,
538 dc
.SetPen(*wxTRANSPARENT_PEN
);
539 dc
.SetFont(m_caption_font
);
541 DrawCaptionBackground(dc
, rect
,
542 (pane
.state
& wxAuiPaneInfo
::optionActive
)?
true:false);
544 if (pane
.state
& wxAuiPaneInfo
::optionActive
)
545 dc
.SetTextForeground(m_active_caption_text_colour
);
547 dc
.SetTextForeground(m_inactive_caption_text_colour
);
551 dc
.GetTextExtent(wxT("ABCDEFHXfgkj"), &w
, &h
);
553 wxRect clip_rect
= rect
;
554 clip_rect
.width
-= 3; // text offset
555 clip_rect
.width
-= 2; // button padding
556 if (pane
.HasCloseButton())
557 clip_rect
.width
-= m_button_size
;
558 if (pane
.HasPinButton())
559 clip_rect
.width
-= m_button_size
;
560 if (pane
.HasMaximizeButton())
561 clip_rect
.width
-= m_button_size
;
563 wxString draw_text
= ChopText(dc
, text
, clip_rect
.width
);
565 dc
.SetClippingRegion(clip_rect
);
566 dc
.DrawText(draw_text
, rect
.x
+3, rect
.y
+(rect
.height
/2)-(h
/2)-1);
567 dc
.DestroyClippingRegion();
570 void wxAuiDefaultDockArt
::DrawGripper(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
574 dc
.SetPen(*wxTRANSPARENT_PEN
);
575 dc
.SetBrush(m_gripper_brush
);
577 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
,rect
.height
);
579 if (!pane
.HasGripperTop())
584 dc
.SetPen(m_gripper_pen1
);
585 dc
.DrawPoint(rect
.x
+3, rect
.y
+y
);
586 dc
.SetPen(m_gripper_pen2
);
587 dc
.DrawPoint(rect
.x
+3, rect
.y
+y
+1);
588 dc
.DrawPoint(rect
.x
+4, rect
.y
+y
);
589 dc
.SetPen(m_gripper_pen3
);
590 dc
.DrawPoint(rect
.x
+5, rect
.y
+y
+1);
591 dc
.DrawPoint(rect
.x
+5, rect
.y
+y
+2);
592 dc
.DrawPoint(rect
.x
+4, rect
.y
+y
+2);
595 if (y
> rect
.GetHeight()-5)
604 dc
.SetPen(m_gripper_pen1
);
605 dc
.DrawPoint(rect
.x
+x
, rect
.y
+3);
606 dc
.SetPen(m_gripper_pen2
);
607 dc
.DrawPoint(rect
.x
+x
+1, rect
.y
+3);
608 dc
.DrawPoint(rect
.x
+x
, rect
.y
+4);
609 dc
.SetPen(m_gripper_pen3
);
610 dc
.DrawPoint(rect
.x
+x
+1, rect
.y
+5);
611 dc
.DrawPoint(rect
.x
+x
+2, rect
.y
+5);
612 dc
.DrawPoint(rect
.x
+x
+2, rect
.y
+4);
615 if (x
> rect
.GetWidth()-5)
621 void wxAuiDefaultDockArt
::DrawPaneButton(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
629 if (button_state
== wxAUI_BUTTON_STATE_PRESSED
)
635 if (button_state
== wxAUI_BUTTON_STATE_HOVER
||
636 button_state
== wxAUI_BUTTON_STATE_PRESSED
)
638 if (pane
.state
& wxAuiPaneInfo
::optionActive
)
640 dc
.SetBrush(wxBrush(StepColour(m_active_caption_colour
, 120)));
641 dc
.SetPen(wxPen(StepColour(m_active_caption_colour
, 70)));
645 dc
.SetBrush(wxBrush(StepColour(m_inactive_caption_colour
, 120)));
646 dc
.SetPen(wxPen(StepColour(m_inactive_caption_colour
, 70)));
649 // draw the background behind the button
650 dc
.DrawRectangle(rect
.x
, rect
.y
, 15, 15);
657 case wxAUI_BUTTON_MAXIMIZE_RESTORE
:
658 if (pane
.IsMaximized()) {
659 if (pane
.state
& wxAuiPaneInfo
::optionActive
)
660 bmp
= m_active_restore_bitmap
;
662 bmp
= m_inactive_restore_bitmap
;
664 if (pane
.state
& wxAuiPaneInfo
::optionActive
)
665 bmp
= m_active_maximize_bitmap
;
667 bmp
= m_inactive_maximize_bitmap
;
670 case wxAUI_BUTTON_CLOSE
:
671 if (pane
.state
& wxAuiPaneInfo
::optionActive
)
672 bmp
= m_active_close_bitmap
;
674 bmp
= m_inactive_close_bitmap
;
676 case wxAUI_BUTTON_PIN
:
677 if (pane
.state
& wxAuiPaneInfo
::optionActive
)
678 bmp
= m_active_pin_bitmap
;
680 bmp
= m_inactive_pin_bitmap
;
684 // draw the button itself
685 dc
.DrawBitmap(bmp
, rect
.x
, rect
.y
, true);