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/osx/private.h"
39 #include "wx/graphics.h"
40 #include "wx/dcgraph.h"
45 #include "wx/renderer.h"
46 #if GTK_CHECK_VERSION(2,0,0)
47 #include "wx/gtk/private/gtk2-compat.h"
49 #define gtk_widget_is_drawable GTK_WIDGET_DRAWABLE
54 // -- wxAuiDefaultDockArt class implementation --
56 // wxAuiDefaultDockArt is an art provider class which does all of the drawing for
57 // wxAuiManager. This allows the library caller to customize the dock art
58 // (probably by deriving from this class), or to completely replace all drawing
59 // with custom dock art (probably by writing a new stand-alone class derived
60 // from the wxAuiDockArt base class). The active dock art class can be set via
61 // wxAuiManager::SetDockArt()
62 wxColor
wxAuiLightContrastColour(const wxColour
& c
)
66 // if the color is especially dark, then
67 // make the contrast even lighter
68 if (c
.Red() < 128 && c
.Green() < 128 && c
.Blue() < 128)
71 return c
.ChangeLightness(amount
);
74 // wxAuiBitmapFromBits() is a utility function that creates a
75 // masked bitmap from raw bits (XBM format)
76 wxBitmap
wxAuiBitmapFromBits(const unsigned char bits
[], int w
, int h
,
77 const wxColour
& color
)
79 wxImage img
= wxBitmap((const char*)bits
, w
, h
).ConvertToImage();
80 img
.Replace(0,0,0,123,123,123);
81 img
.Replace(255,255,255,color
.Red(),color
.Green(),color
.Blue());
82 img
.SetMaskColour(123,123,123);
87 static void DrawGradientRectangle(wxDC
& dc
,
89 const wxColour
& start_color
,
90 const wxColour
& end_color
,
93 int rd
, gd
, bd
, high
= 0;
94 rd
= end_color
.Red() - start_color
.Red();
95 gd
= end_color
.Green() - start_color
.Green();
96 bd
= end_color
.Blue() - start_color
.Blue();
98 if (direction
== wxAUI_GRADIENT_VERTICAL
)
99 high
= rect
.GetHeight()-1;
101 high
= rect
.GetWidth()-1;
103 for (int i
= 0; i
<= high
; ++i
)
108 r
= start_color
.Red() + (high
<= 0 ? 0 : (((i
*rd
*100)/high
)/100));
109 g
= start_color
.Green() + (high
<= 0 ? 0 : (((i
*gd
*100)/high
)/100));
110 b
= start_color
.Blue() + (high
<= 0 ? 0 : (((i
*bd
*100)/high
)/100));
112 wxPen
p(wxColor((unsigned char)r
,
117 if (direction
== wxAUI_GRADIENT_VERTICAL
)
118 dc
.DrawLine(rect
.x
, rect
.y
+i
, rect
.x
+rect
.width
, rect
.y
+i
);
120 dc
.DrawLine(rect
.x
+i
, rect
.y
, rect
.x
+i
, rect
.y
+rect
.height
);
124 wxString
wxAuiChopText(wxDC
& dc
, const wxString
& text
, int max_size
)
128 // first check if the text fits with no problems
129 dc
.GetTextExtent(text
, &x
, &y
);
133 size_t i
, len
= text
.Length();
134 size_t last_good_length
= 0;
135 for (i
= 0; i
< len
; ++i
)
137 wxString s
= text
.Left(i
);
140 dc
.GetTextExtent(s
, &x
, &y
);
144 last_good_length
= i
;
147 wxString ret
= text
.Left(last_good_length
);
152 wxAuiDefaultDockArt::wxAuiDefaultDockArt()
154 #if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON
155 wxColor baseColour
= wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground
));
157 wxColor baseColour
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
);
160 // the baseColour is too pale to use as our base colour,
161 // so darken it a bit --
162 if ((255-baseColour
.Red()) +
163 (255-baseColour
.Green()) +
164 (255-baseColour
.Blue()) < 60)
166 baseColour
= baseColour
.ChangeLightness(92);
169 m_baseColour
= baseColour
;
170 wxColor darker1Colour
= baseColour
.ChangeLightness(85);
171 wxColor darker2Colour
= baseColour
.ChangeLightness(75);
172 wxColor darker3Colour
= baseColour
.ChangeLightness(60);
173 //wxColor darker4Colour = baseColour.ChangeLightness(50);
174 wxColor darker5Colour
= baseColour
.ChangeLightness(40);
176 m_activeCaptionColour
= wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT
);
177 m_activeCaptionGradientColour
= wxAuiLightContrastColour(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT
));
178 m_activeCaptionTextColour
= wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT
);
179 m_inactiveCaptionColour
= darker1Colour
;
180 m_inactiveCaptionGradientColour
= baseColour
.ChangeLightness(97);
181 m_inactiveCaptionTextColour
= *wxBLACK
;
183 m_sashBrush
= wxBrush(baseColour
);
184 m_backgroundBrush
= wxBrush(baseColour
);
185 m_gripperBrush
= wxBrush(baseColour
);
187 m_borderPen
= wxPen(darker2Colour
);
188 m_gripperPen1
= wxPen(darker5Colour
);
189 m_gripperPen2
= wxPen(darker3Colour
);
190 m_gripperPen3
= *wxWHITE_PEN
;
193 m_captionFont
= *wxSMALL_FONT
;
195 m_captionFont
= wxFont(8, wxDEFAULT
, wxNORMAL
, wxNORMAL
, FALSE
);
198 // default metric values
199 #if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON
201 GetThemeMetric( kThemeMetricSmallPaneSplitterHeight
, &height
);
203 #elif defined(__WXGTK__)
204 m_sashSize
= wxRendererNative::Get().GetSplitterParams(NULL
).widthSash
;
212 m_gradientType
= wxAUI_GRADIENT_VERTICAL
;
218 wxAuiDefaultDockArt::InitBitmaps ()
220 // some built in bitmaps
221 #if defined( __WXMAC__ )
222 static const unsigned char close_bits
[]={
223 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3,
224 0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3,
225 0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF };
226 #elif defined(__WXGTK__)
227 static const unsigned char close_bits
[]={
228 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8,
229 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef,
230 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
232 static const unsigned char close_bits
[]={
233 // reduced height, symmetric
234 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xf3, 0x9f, 0xf9,
235 0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xfc, 0x9f, 0xf9, 0xcf, 0xf3, 0xff, 0xff,
236 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
238 // same height as maximize/restore
239 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xe7, 0xcf, 0xf3, 0x9f, 0xf9,
240 0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xfc, 0x9f, 0xf9, 0xcf, 0xf3, 0xe7, 0xe7,
241 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
245 static const unsigned char maximize_bits
[] = {
246 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xf7, 0xf7, 0x07, 0xf0,
247 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0x07, 0xf0,
248 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
250 static const unsigned char restore_bits
[]={
251 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf0, 0x1f, 0xf0, 0xdf, 0xf7,
252 0x07, 0xf4, 0x07, 0xf4, 0xf7, 0xf5, 0xf7, 0xf1, 0xf7, 0xfd, 0xf7, 0xfd,
253 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
255 static const unsigned char pin_bits
[]={
256 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xdf,0xfc,0xdf,0xfc,
257 0xdf,0xfc,0xdf,0xfc,0xdf,0xfc,0x0f,0xf8,0x7f,0xff,0x7f,0xff,
258 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
261 m_inactiveCloseBitmap
= wxAuiBitmapFromBits(close_bits
, 16, 16, *wxWHITE
);
262 m_activeCloseBitmap
= wxAuiBitmapFromBits(close_bits
, 16, 16, *wxWHITE
);
264 m_inactiveCloseBitmap
= wxAuiBitmapFromBits(close_bits
, 16, 16, m_inactiveCaptionTextColour
);
265 m_activeCloseBitmap
= wxAuiBitmapFromBits(close_bits
, 16, 16, m_activeCaptionTextColour
);
269 m_inactiveMaximizeBitmap
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, *wxWHITE
);
270 m_activeMaximizeBitmap
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, *wxWHITE
);
272 m_inactiveMaximizeBitmap
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, m_inactiveCaptionTextColour
);
273 m_activeMaximizeBitmap
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, m_activeCaptionTextColour
);
277 m_inactiveRestoreBitmap
= wxAuiBitmapFromBits(restore_bits
, 16, 16, *wxWHITE
);
278 m_activeRestoreBitmap
= wxAuiBitmapFromBits(restore_bits
, 16, 16, *wxWHITE
);
280 m_inactiveRestoreBitmap
= wxAuiBitmapFromBits(restore_bits
, 16, 16, m_inactiveCaptionTextColour
);
281 m_activeRestoreBitmap
= wxAuiBitmapFromBits(restore_bits
, 16, 16, m_activeCaptionTextColour
);
284 m_inactivePinBitmap
= wxAuiBitmapFromBits(pin_bits
, 16, 16, m_inactiveCaptionTextColour
);
285 m_activePinBitmap
= wxAuiBitmapFromBits(pin_bits
, 16, 16, m_activeCaptionTextColour
);
288 int wxAuiDefaultDockArt::GetMetric(int id
)
292 case wxAUI_DOCKART_SASH_SIZE
: return m_sashSize
;
293 case wxAUI_DOCKART_CAPTION_SIZE
: return m_captionSize
;
294 case wxAUI_DOCKART_GRIPPER_SIZE
: return m_gripperSize
;
295 case wxAUI_DOCKART_PANE_BORDER_SIZE
: return m_borderSize
;
296 case wxAUI_DOCKART_PANE_BUTTON_SIZE
: return m_buttonSize
;
297 case wxAUI_DOCKART_GRADIENT_TYPE
: return m_gradientType
;
298 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
304 void wxAuiDefaultDockArt::SetMetric(int id
, int new_val
)
308 case wxAUI_DOCKART_SASH_SIZE
: m_sashSize
= new_val
; break;
309 case wxAUI_DOCKART_CAPTION_SIZE
: m_captionSize
= new_val
; break;
310 case wxAUI_DOCKART_GRIPPER_SIZE
: m_gripperSize
= new_val
; break;
311 case wxAUI_DOCKART_PANE_BORDER_SIZE
: m_borderSize
= new_val
; break;
312 case wxAUI_DOCKART_PANE_BUTTON_SIZE
: m_buttonSize
= new_val
; break;
313 case wxAUI_DOCKART_GRADIENT_TYPE
: m_gradientType
= new_val
; break;
314 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
318 wxColour
wxAuiDefaultDockArt::GetColour(int id
)
322 case wxAUI_DOCKART_BACKGROUND_COLOUR
: return m_backgroundBrush
.GetColour();
323 case wxAUI_DOCKART_SASH_COLOUR
: return m_sashBrush
.GetColour();
324 case wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR
: return m_inactiveCaptionColour
;
325 case wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR
: return m_inactiveCaptionGradientColour
;
326 case wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR
: return m_inactiveCaptionTextColour
;
327 case wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR
: return m_activeCaptionColour
;
328 case wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR
: return m_activeCaptionGradientColour
;
329 case wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR
: return m_activeCaptionTextColour
;
330 case wxAUI_DOCKART_BORDER_COLOUR
: return m_borderPen
.GetColour();
331 case wxAUI_DOCKART_GRIPPER_COLOUR
: return m_gripperBrush
.GetColour();
332 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
338 void wxAuiDefaultDockArt::SetColour(int id
, const wxColor
& colour
)
342 case wxAUI_DOCKART_BACKGROUND_COLOUR
: m_backgroundBrush
.SetColour(colour
); break;
343 case wxAUI_DOCKART_SASH_COLOUR
: m_sashBrush
.SetColour(colour
); break;
344 case wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR
: m_inactiveCaptionColour
= colour
; break;
345 case wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR
: m_inactiveCaptionGradientColour
= colour
; break;
346 case wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR
: m_inactiveCaptionTextColour
= colour
; break;
347 case wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR
: m_activeCaptionColour
= colour
; break;
348 case wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR
: m_activeCaptionGradientColour
= colour
; break;
349 case wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR
: m_activeCaptionTextColour
= colour
; break;
350 case wxAUI_DOCKART_BORDER_COLOUR
: m_borderPen
.SetColour(colour
); break;
351 case wxAUI_DOCKART_GRIPPER_COLOUR
:
352 m_gripperBrush
.SetColour(colour
);
353 m_gripperPen1
.SetColour(colour
.ChangeLightness(40));
354 m_gripperPen2
.SetColour(colour
.ChangeLightness(60));
356 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
362 void wxAuiDefaultDockArt::SetFont(int id
, const wxFont
& font
)
364 if (id
== wxAUI_DOCKART_CAPTION_FONT
)
365 m_captionFont
= font
;
368 wxFont
wxAuiDefaultDockArt::GetFont(int id
)
370 if (id
== wxAUI_DOCKART_CAPTION_FONT
)
371 return m_captionFont
;
375 void wxAuiDefaultDockArt::DrawSash(wxDC
& dc
, wxWindow
*window
, int orientation
, const wxRect
& rect
)
377 #if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON
379 wxUnusedVar(orientation
);
381 HIRect splitterRect
= CGRectMake( rect
.x
, rect
.y
, rect
.width
, rect
.height
);
382 CGContextRef cgContext
;
383 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
384 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext() ;
386 HIThemeSplitterDrawInfo drawInfo
;
387 drawInfo
.version
= 0 ;
388 drawInfo
.state
= kThemeStateActive
;
389 drawInfo
.adornment
= kHIThemeSplitterAdornmentNone
;
390 HIThemeDrawPaneSplitter( &splitterRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
) ;
392 #elif defined(__WXGTK__)
393 // clear out the rectangle first
394 dc
.SetPen(*wxTRANSPARENT_PEN
);
395 dc
.SetBrush(m_sashBrush
);
396 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
399 GdkRectangle gdk_rect
;
400 if (orientation
== wxVERTICAL
)
404 gdk_rect
.width
= m_sashSize
;
405 gdk_rect
.height
= rect
.height
;
411 gdk_rect
.width
= rect
.width
;
412 gdk_rect
.height
= m_sashSize
;
417 if (!window
->m_wxwindow
) return;
418 if (!gtk_widget_is_drawable(window
->m_wxwindow
)) return;
422 gtk_widget_get_style(window
->m_wxwindow
),
423 window
->GTKGetDrawingWindow(),
424 // flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL,
427 NULL
/* no clipping */,
434 (orientation
== wxVERTICAL
) ? GTK_ORIENTATION_VERTICAL
: GTK_ORIENTATION_HORIZONTAL
439 wxUnusedVar(orientation
);
440 dc
.SetPen(*wxTRANSPARENT_PEN
);
441 dc
.SetBrush(m_sashBrush
);
442 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
447 void wxAuiDefaultDockArt::DrawBackground(wxDC
& dc
, wxWindow
*WXUNUSED(window
), int, const wxRect
& rect
)
449 dc
.SetPen(*wxTRANSPARENT_PEN
);
451 // we have to clear first, otherwise we are drawing a light striped pattern
452 // over an already darker striped background
453 dc
.SetBrush(*wxWHITE_BRUSH
) ;
454 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
456 dc
.SetBrush(m_backgroundBrush
);
457 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
460 void wxAuiDefaultDockArt::DrawBorder(wxDC
& dc
, wxWindow
*WXUNUSED(window
), const wxRect
& _rect
,
463 dc
.SetPen(m_borderPen
);
464 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
467 int i
, border_width
= GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE
);
469 if (pane
.IsToolbar())
471 for (i
= 0; i
< border_width
; ++i
)
473 dc
.SetPen(*wxWHITE_PEN
);
474 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
+rect
.width
, rect
.y
);
475 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
, rect
.y
+rect
.height
);
476 dc
.SetPen(m_borderPen
);
477 dc
.DrawLine(rect
.x
, rect
.y
+rect
.height
-1,
478 rect
.x
+rect
.width
, rect
.y
+rect
.height
-1);
479 dc
.DrawLine(rect
.x
+rect
.width
-1, rect
.y
,
480 rect
.x
+rect
.width
-1, rect
.y
+rect
.height
);
486 for (i
= 0; i
< border_width
; ++i
)
488 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
495 void wxAuiDefaultDockArt::DrawCaptionBackground(wxDC
& dc
, const wxRect
& rect
, bool active
)
497 if (m_gradientType
== wxAUI_GRADIENT_NONE
)
500 dc
.SetBrush(wxBrush(m_activeCaptionColour
));
502 dc
.SetBrush(wxBrush(m_inactiveCaptionColour
));
504 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
);
510 // on mac the gradients are expected to become darker from the top
512 DrawGradientRectangle(dc
, rect
,
513 m_activeCaptionColour
,
514 m_activeCaptionGradientColour
,
517 // on other platforms, active gradients become lighter at the top
518 DrawGradientRectangle(dc
, rect
,
519 m_activeCaptionGradientColour
,
520 m_activeCaptionColour
,
527 // on mac the gradients are expected to become darker from the top
528 DrawGradientRectangle(dc
, rect
,
529 m_inactiveCaptionGradientColour
,
530 m_inactiveCaptionColour
,
533 // on other platforms, inactive gradients become lighter at the bottom
534 DrawGradientRectangle(dc
, rect
,
535 m_inactiveCaptionColour
,
536 m_inactiveCaptionGradientColour
,
544 void wxAuiDefaultDockArt::DrawCaption(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
545 const wxString
& text
,
549 dc
.SetPen(*wxTRANSPARENT_PEN
);
550 dc
.SetFont(m_captionFont
);
552 DrawCaptionBackground(dc
, rect
,
553 (pane
.state
& wxAuiPaneInfo::optionActive
)?true:false);
555 int caption_offset
= 0;
556 if ( pane
.icon
.IsOk() )
558 DrawIcon(dc
, rect
, pane
);
560 caption_offset
+= pane
.icon
.GetWidth() + 3;
563 if (pane
.state
& wxAuiPaneInfo::optionActive
)
564 dc
.SetTextForeground(m_activeCaptionTextColour
);
566 dc
.SetTextForeground(m_inactiveCaptionTextColour
);
570 dc
.GetTextExtent(wxT("ABCDEFHXfgkj"), &w
, &h
);
572 wxRect clip_rect
= rect
;
573 clip_rect
.width
-= 3; // text offset
574 clip_rect
.width
-= 2; // button padding
575 if (pane
.HasCloseButton())
576 clip_rect
.width
-= m_buttonSize
;
577 if (pane
.HasPinButton())
578 clip_rect
.width
-= m_buttonSize
;
579 if (pane
.HasMaximizeButton())
580 clip_rect
.width
-= m_buttonSize
;
582 wxString draw_text
= wxAuiChopText(dc
, text
, clip_rect
.width
);
584 dc
.SetClippingRegion(clip_rect
);
585 dc
.DrawText(draw_text
, rect
.x
+3 + caption_offset
, rect
.y
+(rect
.height
/2)-(h
/2)-1);
586 dc
.DestroyClippingRegion();
590 wxAuiDefaultDockArt::DrawIcon(wxDC
& dc
, const wxRect
& rect
, wxAuiPaneInfo
& pane
)
592 // Draw the icon centered vertically
593 dc
.DrawBitmap(pane
.icon
,
594 rect
.x
+2, rect
.y
+(rect
.height
-pane
.icon
.GetHeight())/2,
598 void wxAuiDefaultDockArt::DrawGripper(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
602 dc
.SetPen(*wxTRANSPARENT_PEN
);
603 dc
.SetBrush(m_gripperBrush
);
605 dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
,rect
.height
);
607 if (!pane
.HasGripperTop())
612 dc
.SetPen(m_gripperPen1
);
613 dc
.DrawPoint(rect
.x
+3, rect
.y
+y
);
614 dc
.SetPen(m_gripperPen2
);
615 dc
.DrawPoint(rect
.x
+3, rect
.y
+y
+1);
616 dc
.DrawPoint(rect
.x
+4, rect
.y
+y
);
617 dc
.SetPen(m_gripperPen3
);
618 dc
.DrawPoint(rect
.x
+5, rect
.y
+y
+1);
619 dc
.DrawPoint(rect
.x
+5, rect
.y
+y
+2);
620 dc
.DrawPoint(rect
.x
+4, rect
.y
+y
+2);
623 if (y
> rect
.GetHeight()-5)
632 dc
.SetPen(m_gripperPen1
);
633 dc
.DrawPoint(rect
.x
+x
, rect
.y
+3);
634 dc
.SetPen(m_gripperPen2
);
635 dc
.DrawPoint(rect
.x
+x
+1, rect
.y
+3);
636 dc
.DrawPoint(rect
.x
+x
, rect
.y
+4);
637 dc
.SetPen(m_gripperPen3
);
638 dc
.DrawPoint(rect
.x
+x
+1, rect
.y
+5);
639 dc
.DrawPoint(rect
.x
+x
+2, rect
.y
+5);
640 dc
.DrawPoint(rect
.x
+x
+2, rect
.y
+4);
643 if (x
> rect
.GetWidth()-5)
649 void wxAuiDefaultDockArt::DrawPaneButton(wxDC
& dc
, wxWindow
*WXUNUSED(window
),
661 case wxAUI_BUTTON_CLOSE
:
662 if (pane
.state
& wxAuiPaneInfo::optionActive
)
663 bmp
= m_activeCloseBitmap
;
665 bmp
= m_inactiveCloseBitmap
;
667 case wxAUI_BUTTON_PIN
:
668 if (pane
.state
& wxAuiPaneInfo::optionActive
)
669 bmp
= m_activePinBitmap
;
671 bmp
= m_inactivePinBitmap
;
673 case wxAUI_BUTTON_MAXIMIZE_RESTORE
:
674 if (pane
.IsMaximized())
676 if (pane
.state
& wxAuiPaneInfo::optionActive
)
677 bmp
= m_activeRestoreBitmap
;
679 bmp
= m_inactiveRestoreBitmap
;
683 if (pane
.state
& wxAuiPaneInfo::optionActive
)
684 bmp
= m_activeMaximizeBitmap
;
686 bmp
= m_inactiveMaximizeBitmap
;
695 rect
.y
= rect
.y
+ (rect
.height
/2) - (bmp
.GetHeight()/2);
696 rect
.height
= old_y
+ rect
.height
- rect
.y
- 1;
699 if (button_state
== wxAUI_BUTTON_STATE_PRESSED
)
705 if (button_state
== wxAUI_BUTTON_STATE_HOVER
||
706 button_state
== wxAUI_BUTTON_STATE_PRESSED
)
708 if (pane
.state
& wxAuiPaneInfo::optionActive
)
710 dc
.SetBrush(wxBrush(m_activeCaptionColour
.ChangeLightness(120)));
711 dc
.SetPen(wxPen(m_activeCaptionColour
.ChangeLightness(70)));
715 dc
.SetBrush(wxBrush(m_inactiveCaptionColour
.ChangeLightness(120)));
716 dc
.SetPen(wxPen(m_inactiveCaptionColour
.ChangeLightness(70)));
719 // draw the background behind the button
720 dc
.DrawRectangle(rect
.x
, rect
.y
, 15, 15);
724 // draw the button itself
725 dc
.DrawBitmap(bmp
, rect
.x
, rect
.y
, true);