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" 
  41 // for themeing support 
  42 #include <Carbon/Carbon.h> 
  47 #include "wx/renderer.h" 
  51 // -- wxAuiDefaultDockArt class implementation -- 
  53 // wxAuiDefaultDockArt is an art provider class which does all of the drawing for 
  54 // wxAuiManager.  This allows the library caller to customize the dock art 
  55 // (probably by deriving from this class), or to completely replace all drawing 
  56 // with custom dock art (probably by writing a new stand-alone class derived 
  57 // from the wxAuiDockArt base class). The active dock art class can be set via 
  58 // wxAuiManager::SetDockArt() 
  61 // wxAuiBlendColour is used by wxAuiStepColour 
  62 unsigned char wxAuiBlendColour(unsigned char fg
, unsigned char bg
, double alpha
) 
  64     double result 
= bg 
+ (alpha 
* (fg 
- bg
)); 
  69     return (unsigned char)result
; 
  72 // wxAuiStepColour() it a utility function that simply darkens 
  73 // or lightens a color, based on the specified percentage 
  74 // ialpha of 0 would be completely black, 100 completely white 
  75 // an ialpha of 100 returns the same colour 
  76 wxColor 
wxAuiStepColour(const wxColor
& c
, int ialpha
) 
  81     unsigned char r 
= c
.Red(), 
  86     // ialpha is 0..200 where 0 is completely black 
  87     // and 200 is completely white and 100 is the same 
  88     // convert that to normal alpha 0.0 - 1.0 
  89     ialpha 
= wxMin(ialpha
, 200); 
  90     ialpha 
= wxMax(ialpha
, 0); 
  91     double alpha 
= ((double)(ialpha 
- 100.0))/100.0; 
  97         alpha 
= 1.0 - alpha
;  // 0 = transparent fg; 1 = opaque fg 
 103         alpha 
= 1.0 + alpha
;  // 0 = transparent fg; 1 = opaque fg 
 106     r 
= wxAuiBlendColour(r
, bg
, alpha
); 
 107     g 
= wxAuiBlendColour(g
, bg
, alpha
); 
 108     b 
= wxAuiBlendColour(b
, bg
, alpha
); 
 110     return wxColour(r
, g
, b
); 
 114 wxColor 
wxAuiLightContrastColour(const wxColour
& c
) 
 118     // if the color is especially dark, then 
 119     // make the contrast even lighter 
 120     if (c
.Red() < 128 && c
.Green() < 128 && c
.Blue() < 128) 
 123     return wxAuiStepColour(c
, amount
); 
 126 // wxAuiBitmapFromBits() is a utility function that creates a 
 127 // masked bitmap from raw bits (XBM format) 
 128 wxBitmap 
wxAuiBitmapFromBits(const unsigned char bits
[], int w
, int h
, 
 129                              const wxColour
& color
) 
 131     wxImage img 
= wxBitmap((const char*)bits
, w
, h
).ConvertToImage(); 
 132     img
.Replace(0,0,0,123,123,123); 
 133     img
.Replace(255,255,255,color
.Red(),color
.Green(),color
.Blue()); 
 134     img
.SetMaskColour(123,123,123); 
 135     return wxBitmap(img
); 
 139 static void DrawGradientRectangle(wxDC
& dc
, 
 141                                   const wxColour
& start_color
, 
 142                                   const wxColour
& end_color
, 
 145     int rd
, gd
, bd
, high 
= 0; 
 146     rd 
= end_color
.Red() - start_color
.Red(); 
 147     gd 
= end_color
.Green() - start_color
.Green(); 
 148     bd 
= end_color
.Blue() - start_color
.Blue(); 
 150     if (direction 
== wxAUI_GRADIENT_VERTICAL
) 
 151         high 
= rect
.GetHeight()-1; 
 153         high 
= rect
.GetWidth()-1; 
 155     for (int i 
= 0; i 
<= high
; ++i
) 
 160         r 
= start_color
.Red() + (high 
<= 0 ? 0 : (((i
*rd
*100)/high
)/100)); 
 161         g 
= start_color
.Green() + (high 
<= 0 ? 0 : (((i
*gd
*100)/high
)/100)); 
 162         b 
= start_color
.Blue() + (high 
<= 0 ? 0 : (((i
*bd
*100)/high
)/100)); 
 164         wxPen 
p(wxColor((unsigned char)r
, 
 169         if (direction 
== wxAUI_GRADIENT_VERTICAL
) 
 170             dc
.DrawLine(rect
.x
, rect
.y
+i
, rect
.x
+rect
.width
, rect
.y
+i
); 
 172             dc
.DrawLine(rect
.x
+i
, rect
.y
, rect
.x
+i
, rect
.y
+rect
.height
); 
 176 wxString 
wxAuiChopText(wxDC
& dc
, const wxString
& text
, int max_size
) 
 180     // first check if the text fits with no problems 
 181     dc
.GetTextExtent(text
, &x
, &y
); 
 185     size_t i
, len 
= text
.Length(); 
 186     size_t last_good_length 
= 0; 
 187     for (i 
= 0; i 
< len
; ++i
) 
 189         wxString s 
= text
.Left(i
); 
 192         dc
.GetTextExtent(s
, &x
, &y
); 
 196         last_good_length 
= i
; 
 199     wxString ret 
= text
.Left(last_good_length
); 
 204 wxAuiDefaultDockArt::wxAuiDefaultDockArt() 
 206 #if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON 
 207     wxColor base_colour 
= wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground
)); 
 209     wxColor base_colour 
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
); 
 212     // the base_colour is too pale to use as our base colour, 
 213     // so darken it a bit -- 
 214     if ((255-base_colour
.Red()) + 
 215         (255-base_colour
.Green()) + 
 216         (255-base_colour
.Blue()) < 60) 
 218         base_colour 
= wxAuiStepColour(base_colour
, 92); 
 221     m_base_colour 
= base_colour
; 
 222     wxColor darker1_colour 
= wxAuiStepColour(base_colour
, 85); 
 223     wxColor darker2_colour 
= wxAuiStepColour(base_colour
, 75); 
 224     wxColor darker3_colour 
= wxAuiStepColour(base_colour
, 60); 
 225     //wxColor darker4_colour = wxAuiStepColour(base_colour, 50); 
 226     wxColor darker5_colour 
= wxAuiStepColour(base_colour
, 40); 
 228     m_active_caption_colour 
= wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT
); 
 229     m_active_caption_gradient_colour 
= wxAuiLightContrastColour(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT
)); 
 230     m_active_caption_text_colour 
= wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT
); 
 231     m_inactive_caption_colour 
= darker1_colour
; 
 232     m_inactive_caption_gradient_colour 
= wxAuiStepColour(base_colour
, 97); 
 233     m_inactive_caption_text_colour 
= *wxBLACK
; 
 235     m_sash_brush 
= wxBrush(base_colour
); 
 236     m_background_brush 
= wxBrush(base_colour
); 
 237     m_gripper_brush 
= wxBrush(base_colour
); 
 239     m_border_pen 
= wxPen(darker2_colour
); 
 240     m_gripper_pen1 
= wxPen(darker5_colour
); 
 241     m_gripper_pen2 
= wxPen(darker3_colour
); 
 242     m_gripper_pen3 
= *wxWHITE_PEN
; 
 245     m_caption_font 
= *wxSMALL_FONT
; 
 247     m_caption_font 
= wxFont(8, wxDEFAULT
, wxNORMAL
, wxNORMAL
, FALSE
); 
 250     // some built in bitmaps 
 251 #if defined( __WXMAC__ ) 
 252      static unsigned char close_bits
[]={ 
 253          0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3, 
 254          0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3, 
 255          0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF }; 
 256 #elif defined(__WXGTK__) 
 257      static unsigned char close_bits
[]={ 
 258          0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8, 
 259          0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef, 
 260          0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 
 262     static unsigned char close_bits
[]={ 
 263          // reduced height, symmetric 
 264          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xf3, 0x9f, 0xf9,  
 265          0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xfc, 0x9f, 0xf9, 0xcf, 0xf3, 0xff, 0xff,  
 266          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 
 268          // same height as maximize/restore 
 269          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xe7, 0xcf, 0xf3, 0x9f, 0xf9,  
 270          0x3f, 0xfc, 0x7f, 0xfe, 0x3f, 0xfc, 0x9f, 0xf9, 0xcf, 0xf3, 0xe7, 0xe7,  
 271          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 
 275     static unsigned char maximize_bits
[] = { 
 276         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xf7, 0xf7, 0x07, 0xf0, 
 277         0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0x07, 0xf0, 
 278         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 
 280     static unsigned char restore_bits
[]={ 
 281         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xf0, 0x1f, 0xf0, 0xdf, 0xf7, 
 282         0x07, 0xf4, 0x07, 0xf4, 0xf7, 0xf5, 0xf7, 0xf1, 0xf7, 0xfd, 0xf7, 0xfd, 
 283         0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 
 285     static unsigned char pin_bits
[]={ 
 286         0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xdf,0xfc,0xdf,0xfc, 
 287         0xdf,0xfc,0xdf,0xfc,0xdf,0xfc,0x0f,0xf8,0x7f,0xff,0x7f,0xff, 
 288         0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; 
 291     m_inactive_close_bitmap 
= wxAuiBitmapFromBits(close_bits
, 16, 16, *wxWHITE
); 
 292     m_active_close_bitmap 
= wxAuiBitmapFromBits(close_bits
, 16, 16, *wxWHITE 
); 
 294     m_inactive_close_bitmap 
= wxAuiBitmapFromBits(close_bits
, 16, 16, m_inactive_caption_text_colour
); 
 295     m_active_close_bitmap 
= wxAuiBitmapFromBits(close_bits
, 16, 16, m_active_caption_text_colour
); 
 299     m_inactive_maximize_bitmap 
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, *wxWHITE
); 
 300     m_active_maximize_bitmap 
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, *wxWHITE 
); 
 302     m_inactive_maximize_bitmap 
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, m_inactive_caption_text_colour
); 
 303     m_active_maximize_bitmap 
= wxAuiBitmapFromBits(maximize_bits
, 16, 16, m_active_caption_text_colour
); 
 307     m_inactive_restore_bitmap 
= wxAuiBitmapFromBits(restore_bits
, 16, 16, *wxWHITE
); 
 308     m_active_restore_bitmap 
= wxAuiBitmapFromBits(restore_bits
, 16, 16, *wxWHITE 
); 
 310     m_inactive_restore_bitmap 
= wxAuiBitmapFromBits(restore_bits
, 16, 16, m_inactive_caption_text_colour
); 
 311     m_active_restore_bitmap 
= wxAuiBitmapFromBits(restore_bits
, 16, 16, m_active_caption_text_colour
); 
 314     m_inactive_pin_bitmap 
= wxAuiBitmapFromBits(pin_bits
, 16, 16, m_inactive_caption_text_colour
); 
 315     m_active_pin_bitmap 
= wxAuiBitmapFromBits(pin_bits
, 16, 16, m_active_caption_text_colour
); 
 317     // default metric values 
 318 #if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON 
 320     GetThemeMetric( kThemeMetricSmallPaneSplitterHeight 
, &height 
); 
 321     m_sash_size 
= height
; 
 322 #elif defined(__WXGTK__) 
 323     m_sash_size 
= wxRendererNative::Get().GetSplitterParams(NULL
).widthSash
; 
 331     m_gradient_type 
= wxAUI_GRADIENT_VERTICAL
; 
 334 int wxAuiDefaultDockArt::GetMetric(int id
) 
 338         case wxAUI_DOCKART_SASH_SIZE
:          return m_sash_size
; 
 339         case wxAUI_DOCKART_CAPTION_SIZE
:       return m_caption_size
; 
 340         case wxAUI_DOCKART_GRIPPER_SIZE
:       return m_gripper_size
; 
 341         case wxAUI_DOCKART_PANE_BORDER_SIZE
:   return m_border_size
; 
 342         case wxAUI_DOCKART_PANE_BUTTON_SIZE
:   return m_button_size
; 
 343         case wxAUI_DOCKART_GRADIENT_TYPE
:      return m_gradient_type
; 
 344         default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break; 
 350 void wxAuiDefaultDockArt::SetMetric(int id
, int new_val
) 
 354         case wxAUI_DOCKART_SASH_SIZE
:          m_sash_size 
= new_val
; break; 
 355         case wxAUI_DOCKART_CAPTION_SIZE
:       m_caption_size 
= new_val
; break; 
 356         case wxAUI_DOCKART_GRIPPER_SIZE
:       m_gripper_size 
= new_val
; break; 
 357         case wxAUI_DOCKART_PANE_BORDER_SIZE
:   m_border_size 
= new_val
; break; 
 358         case wxAUI_DOCKART_PANE_BUTTON_SIZE
:   m_button_size 
= new_val
; break; 
 359         case wxAUI_DOCKART_GRADIENT_TYPE
:      m_gradient_type 
= new_val
; break; 
 360         default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break; 
 364 wxColour 
wxAuiDefaultDockArt::GetColour(int id
) 
 368         case wxAUI_DOCKART_BACKGROUND_COLOUR
:                return m_background_brush
.GetColour(); 
 369         case wxAUI_DOCKART_SASH_COLOUR
:                      return m_sash_brush
.GetColour(); 
 370         case wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR
:          return m_inactive_caption_colour
; 
 371         case wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR
: return m_inactive_caption_gradient_colour
; 
 372         case wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR
:     return m_inactive_caption_text_colour
; 
 373         case wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR
:            return m_active_caption_colour
; 
 374         case wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR
:   return m_active_caption_gradient_colour
; 
 375         case wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR
:       return m_active_caption_text_colour
; 
 376         case wxAUI_DOCKART_BORDER_COLOUR
:                    return m_border_pen
.GetColour(); 
 377         case wxAUI_DOCKART_GRIPPER_COLOUR
:                   return m_gripper_brush
.GetColour(); 
 378         default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break; 
 384 void wxAuiDefaultDockArt::SetColour(int id
, const wxColor
& colour
) 
 388         case wxAUI_DOCKART_BACKGROUND_COLOUR
:                m_background_brush
.SetColour(colour
); break; 
 389         case wxAUI_DOCKART_SASH_COLOUR
:                      m_sash_brush
.SetColour(colour
); break; 
 390         case wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR
:          m_inactive_caption_colour 
= colour
; break; 
 391         case wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR
: m_inactive_caption_gradient_colour 
= colour
; break; 
 392         case wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR
:     m_inactive_caption_text_colour 
= colour
; break; 
 393         case wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR
:            m_active_caption_colour 
= colour
; break; 
 394         case wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR
:   m_active_caption_gradient_colour 
= colour
; break; 
 395         case wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR
:       m_active_caption_text_colour 
= colour
; break; 
 396         case wxAUI_DOCKART_BORDER_COLOUR
:                    m_border_pen
.SetColour(colour
); break; 
 397         case wxAUI_DOCKART_GRIPPER_COLOUR
: 
 398             m_gripper_brush
.SetColour(colour
); 
 399             m_gripper_pen1
.SetColour(wxAuiStepColour(colour
, 40)); 
 400             m_gripper_pen2
.SetColour(wxAuiStepColour(colour
, 60)); 
 402         default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break; 
 406 void wxAuiDefaultDockArt::SetFont(int id
, const wxFont
& font
) 
 408     if (id 
== wxAUI_DOCKART_CAPTION_FONT
) 
 409         m_caption_font 
= font
; 
 412 wxFont 
wxAuiDefaultDockArt::GetFont(int id
) 
 414     if (id 
== wxAUI_DOCKART_CAPTION_FONT
) 
 415         return m_caption_font
; 
 419 void wxAuiDefaultDockArt::DrawSash(wxDC
& dc
, wxWindow 
*window
, int orientation
, const wxRect
& rect
) 
 421 #if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON 
 423     wxUnusedVar(orientation
); 
 425     HIRect splitterRect 
= CGRectMake( rect
.x 
, rect
.y 
, rect
.width 
, rect
.height 
); 
 426     CGContextRef cgContext 
; 
 427     wxGCDCImpl 
*impl 
= (wxGCDCImpl
*) dc
.GetImpl(); 
 428     cgContext 
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext() ; 
 430     HIThemeSplitterDrawInfo drawInfo 
; 
 431     drawInfo
.version 
= 0 ; 
 432     drawInfo
.state 
= kThemeStateActive 
; 
 433     drawInfo
.adornment 
= kHIThemeSplitterAdornmentNone 
; 
 434     HIThemeDrawPaneSplitter( &splitterRect 
, &drawInfo 
, cgContext 
, kHIThemeOrientationNormal 
) ; 
 436 #elif defined(__WXGTK__) 
 437     // clear out the rectangle first 
 438     dc
.SetPen(*wxTRANSPARENT_PEN
); 
 439     dc
.SetBrush(m_sash_brush
); 
 440     dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
); 
 443     GdkRectangle gdk_rect
; 
 444     if (orientation 
== wxVERTICAL 
) 
 448         gdk_rect
.width 
= m_sash_size
; 
 449         gdk_rect
.height 
= rect
.height
; 
 455         gdk_rect
.width 
= rect
.width
; 
 456         gdk_rect
.height 
= m_sash_size
; 
 461     if (!window
->m_wxwindow
) return; 
 462     if (!GTK_WIDGET_DRAWABLE(window
->m_wxwindow
)) return; 
 466         window
->m_wxwindow
->style
, 
 467         window
->GTKGetDrawingWindow(), 
 468         // flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, 
 471         NULL 
/* no clipping */, 
 478         (orientation 
== wxVERTICAL
) ? GTK_ORIENTATION_VERTICAL 
: GTK_ORIENTATION_HORIZONTAL
 
 483     wxUnusedVar(orientation
); 
 484     dc
.SetPen(*wxTRANSPARENT_PEN
); 
 485     dc
.SetBrush(m_sash_brush
); 
 486     dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
); 
 491 void wxAuiDefaultDockArt::DrawBackground(wxDC
& dc
, wxWindow 
*WXUNUSED(window
), int, const wxRect
& rect
) 
 493     dc
.SetPen(*wxTRANSPARENT_PEN
); 
 495     // we have to clear first, otherwise we are drawing a light striped pattern 
 496     // over an already darker striped background 
 497     dc
.SetBrush(*wxWHITE_BRUSH
) ; 
 498     dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
); 
 500     dc
.SetBrush(m_background_brush
); 
 501     dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
); 
 504 void wxAuiDefaultDockArt::DrawBorder(wxDC
& dc
, wxWindow 
*WXUNUSED(window
), const wxRect
& _rect
, 
 507     dc
.SetPen(m_border_pen
); 
 508     dc
.SetBrush(*wxTRANSPARENT_BRUSH
); 
 511     int i
, border_width 
= GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE
); 
 513     if (pane
.IsToolbar()) 
 515         for (i 
= 0; i 
< border_width
; ++i
) 
 517             dc
.SetPen(*wxWHITE_PEN
); 
 518             dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
+rect
.width
, rect
.y
); 
 519             dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
, rect
.y
+rect
.height
); 
 520             dc
.SetPen(m_border_pen
); 
 521             dc
.DrawLine(rect
.x
, rect
.y
+rect
.height
-1, 
 522                         rect
.x
+rect
.width
, rect
.y
+rect
.height
-1); 
 523             dc
.DrawLine(rect
.x
+rect
.width
-1, rect
.y
, 
 524                         rect
.x
+rect
.width
-1, rect
.y
+rect
.height
); 
 530         for (i 
= 0; i 
< border_width
; ++i
) 
 532             dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
); 
 539 void wxAuiDefaultDockArt::DrawCaptionBackground(wxDC
& dc
, const wxRect
& rect
, bool active
) 
 541     if (m_gradient_type 
== wxAUI_GRADIENT_NONE
) 
 544             dc
.SetBrush(wxBrush(m_active_caption_colour
)); 
 546             dc
.SetBrush(wxBrush(m_inactive_caption_colour
)); 
 548         dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
, rect
.height
); 
 554             // on mac the gradients are expected to become darker from the top 
 556             DrawGradientRectangle(dc
, rect
, 
 557                                  m_active_caption_colour
, 
 558                                  m_active_caption_gradient_colour
, 
 561             // on other platforms, active gradients become lighter at the top 
 562             DrawGradientRectangle(dc
, rect
, 
 563                                  m_active_caption_gradient_colour
, 
 564                                  m_active_caption_colour
, 
 571             // on mac the gradients are expected to become darker from the top 
 572             DrawGradientRectangle(dc
, rect
, 
 573                                  m_inactive_caption_gradient_colour
, 
 574                                  m_inactive_caption_colour
, 
 577             // on other platforms, inactive gradients become lighter at the bottom 
 578             DrawGradientRectangle(dc
, rect
, 
 579                                  m_inactive_caption_colour
, 
 580                                  m_inactive_caption_gradient_colour
, 
 588 void wxAuiDefaultDockArt::DrawCaption(wxDC
& dc
, wxWindow 
*WXUNUSED(window
), 
 589                                    const wxString
& text
, 
 593     dc
.SetPen(*wxTRANSPARENT_PEN
); 
 594     dc
.SetFont(m_caption_font
); 
 596     DrawCaptionBackground(dc
, rect
, 
 597                           (pane
.state 
& wxAuiPaneInfo::optionActive
)?true:false); 
 599     if (pane
.state 
& wxAuiPaneInfo::optionActive
) 
 600         dc
.SetTextForeground(m_active_caption_text_colour
); 
 602         dc
.SetTextForeground(m_inactive_caption_text_colour
); 
 606     dc
.GetTextExtent(wxT("ABCDEFHXfgkj"), &w
, &h
); 
 608     wxRect clip_rect 
= rect
; 
 609     clip_rect
.width 
-= 3; // text offset 
 610     clip_rect
.width 
-= 2; // button padding 
 611     if (pane
.HasCloseButton()) 
 612         clip_rect
.width 
-= m_button_size
; 
 613     if (pane
.HasPinButton()) 
 614         clip_rect
.width 
-= m_button_size
; 
 615     if (pane
.HasMaximizeButton()) 
 616         clip_rect
.width 
-= m_button_size
; 
 618     wxString draw_text 
= wxAuiChopText(dc
, text
, clip_rect
.width
); 
 620     dc
.SetClippingRegion(clip_rect
); 
 621     dc
.DrawText(draw_text
, rect
.x
+3, rect
.y
+(rect
.height
/2)-(h
/2)-1); 
 622     dc
.DestroyClippingRegion(); 
 625 void wxAuiDefaultDockArt::DrawGripper(wxDC
& dc
, wxWindow 
*WXUNUSED(window
), 
 629     dc
.SetPen(*wxTRANSPARENT_PEN
); 
 630     dc
.SetBrush(m_gripper_brush
); 
 632     dc
.DrawRectangle(rect
.x
, rect
.y
, rect
.width
,rect
.height
); 
 634     if (!pane
.HasGripperTop()) 
 639             dc
.SetPen(m_gripper_pen1
); 
 640             dc
.DrawPoint(rect
.x
+3, rect
.y
+y
); 
 641             dc
.SetPen(m_gripper_pen2
); 
 642             dc
.DrawPoint(rect
.x
+3, rect
.y
+y
+1); 
 643             dc
.DrawPoint(rect
.x
+4, rect
.y
+y
); 
 644             dc
.SetPen(m_gripper_pen3
); 
 645             dc
.DrawPoint(rect
.x
+5, rect
.y
+y
+1); 
 646             dc
.DrawPoint(rect
.x
+5, rect
.y
+y
+2); 
 647             dc
.DrawPoint(rect
.x
+4, rect
.y
+y
+2); 
 650             if (y 
> rect
.GetHeight()-5) 
 659             dc
.SetPen(m_gripper_pen1
); 
 660             dc
.DrawPoint(rect
.x
+x
, rect
.y
+3); 
 661             dc
.SetPen(m_gripper_pen2
); 
 662             dc
.DrawPoint(rect
.x
+x
+1, rect
.y
+3); 
 663             dc
.DrawPoint(rect
.x
+x
, rect
.y
+4); 
 664             dc
.SetPen(m_gripper_pen3
); 
 665             dc
.DrawPoint(rect
.x
+x
+1, rect
.y
+5); 
 666             dc
.DrawPoint(rect
.x
+x
+2, rect
.y
+5); 
 667             dc
.DrawPoint(rect
.x
+x
+2, rect
.y
+4); 
 670             if (x 
> rect
.GetWidth()-5) 
 676 void wxAuiDefaultDockArt::DrawPaneButton(wxDC
& dc
, wxWindow 
*WXUNUSED(window
), 
 688         case wxAUI_BUTTON_CLOSE
: 
 689             if (pane
.state 
& wxAuiPaneInfo::optionActive
) 
 690                 bmp 
= m_active_close_bitmap
; 
 692                 bmp 
= m_inactive_close_bitmap
; 
 694         case wxAUI_BUTTON_PIN
: 
 695             if (pane
.state 
& wxAuiPaneInfo::optionActive
) 
 696                 bmp 
= m_active_pin_bitmap
; 
 698                 bmp 
= m_inactive_pin_bitmap
; 
 700         case wxAUI_BUTTON_MAXIMIZE_RESTORE
: 
 701             if (pane
.IsMaximized()) 
 703                 if (pane
.state 
& wxAuiPaneInfo::optionActive
) 
 704                     bmp 
= m_active_restore_bitmap
; 
 706                     bmp 
= m_inactive_restore_bitmap
; 
 710                 if (pane
.state 
& wxAuiPaneInfo::optionActive
) 
 711                     bmp 
= m_active_maximize_bitmap
; 
 713                     bmp 
= m_inactive_maximize_bitmap
; 
 722     rect
.y 
= rect
.y 
+ (rect
.height
/2) - (bmp
.GetHeight()/2); 
 723     rect
.height 
= old_y 
+ rect
.height 
- rect
.y 
- 1; 
 726     if (button_state 
== wxAUI_BUTTON_STATE_PRESSED
) 
 732     if (button_state 
== wxAUI_BUTTON_STATE_HOVER 
|| 
 733         button_state 
== wxAUI_BUTTON_STATE_PRESSED
) 
 735         if (pane
.state 
& wxAuiPaneInfo::optionActive
) 
 737             dc
.SetBrush(wxBrush(wxAuiStepColour(m_active_caption_colour
, 120))); 
 738             dc
.SetPen(wxPen(wxAuiStepColour(m_active_caption_colour
, 70))); 
 742             dc
.SetBrush(wxBrush(wxAuiStepColour(m_inactive_caption_colour
, 120))); 
 743             dc
.SetPen(wxPen(wxAuiStepColour(m_inactive_caption_colour
, 70))); 
 746         // draw the background behind the button 
 747         dc
.DrawRectangle(rect
.x
, rect
.y
, 15, 15); 
 751     // draw the button itself 
 752     dc
.DrawBitmap(bmp
, rect
.x
, rect
.y
, true);