]> git.saurik.com Git - wxWidgets.git/blame - src/aui/dockart.cpp
Change wxNotebook selection before sending page changed event in wxMSW.
[wxWidgets.git] / src / aui / dockart.cpp
CommitLineData
50acee04 1///////////////////////////////////////////////////////////////////////////////
be66f18e 2// Name: src/aui/dockart.cpp
50acee04
JS
3// Purpose: wxaui: wx advanced user interface - docking window manager
4// Author: Benjamin I. Williams
5// Modified by:
6// Created: 2005-05-17
be66f18e 7// RCS-ID: $Id$
50acee04
JS
8// Copyright: (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved
9// Licence: wxWindows Library Licence, Version 3.1
10///////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20#include "wx/wxprec.h"
21
22#ifdef __BORLANDC__
23 #pragma hdrstop
24#endif
25
26#if wxUSE_AUI
27
50acee04
JS
28#include "wx/aui/framemanager.h"
29#include "wx/aui/dockart.h"
30
31#ifndef WX_PRECOMP
be66f18e
WS
32 #include "wx/settings.h"
33 #include "wx/dcclient.h"
155ecd4c 34 #include "wx/image.h"
50acee04
JS
35#endif
36
d618ed9b 37#ifdef __WXMAC__
d20db501 38#include "wx/osx/private.h"
8acd14d1 39#include "wx/graphics.h"
530a427a 40#include "wx/dcgraph.h"
d618ed9b
RD
41#endif
42
32205ebb
RR
43#ifdef __WXGTK__
44#include <gtk/gtk.h>
32205ebb 45#include "wx/renderer.h"
655e246b
JJ
46#if GTK_CHECK_VERSION(2,0,0)
47 #include "wx/gtk/private/gtk2-compat.h"
48#else
49 #define gtk_widget_is_drawable GTK_WIDGET_DRAWABLE
50#endif
32205ebb
RR
51#endif
52
53
a3a5df9d 54// -- wxAuiDefaultDockArt class implementation --
50acee04 55
a3a5df9d
BW
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
50acee04
JS
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
a3a5df9d
BW
60// from the wxAuiDockArt base class). The active dock art class can be set via
61// wxAuiManager::SetDockArt()
a500c7ed 62wxColor wxAuiLightContrastColour(const wxColour& c)
50acee04
JS
63{
64 int amount = 120;
65
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)
69 amount = 160;
70
a310c91c 71 return c.ChangeLightness(amount);
50acee04
JS
72}
73
a500c7ed 74// wxAuiBitmapFromBits() is a utility function that creates a
50acee04 75// masked bitmap from raw bits (XBM format)
a500c7ed
BW
76wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h,
77 const wxColour& color)
50acee04
JS
78{
79 wxImage img = wxBitmap((const char*)bits, w, h).ConvertToImage();
c4d39711
RR
80 img.Replace(0,0,0,123,123,123);
81 img.Replace(255,255,255,color.Red(),color.Green(),color.Blue());
50acee04
JS
82 img.SetMaskColour(123,123,123);
83 return wxBitmap(img);
84}
cedd7b22 85
50acee04
JS
86
87static void DrawGradientRectangle(wxDC& dc,
88 const wxRect& rect,
89 const wxColour& start_color,
90 const wxColour& end_color,
91 int direction)
92{
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();
97
98 if (direction == wxAUI_GRADIENT_VERTICAL)
99 high = rect.GetHeight()-1;
cedd7b22 100 else
50acee04
JS
101 high = rect.GetWidth()-1;
102
103 for (int i = 0; i <= high; ++i)
104 {
dadacb5e 105 int r,g,b;
cedd7b22
PC
106
107
a6b7a521
VZ
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));
50acee04 111
be66f18e
WS
112 wxPen p(wxColor((unsigned char)r,
113 (unsigned char)g,
114 (unsigned char)b));
50acee04
JS
115 dc.SetPen(p);
116
117 if (direction == wxAUI_GRADIENT_VERTICAL)
118 dc.DrawLine(rect.x, rect.y+i, rect.x+rect.width, rect.y+i);
cedd7b22 119 else
50acee04
JS
120 dc.DrawLine(rect.x+i, rect.y, rect.x+i, rect.y+rect.height);
121 }
50acee04
JS
122}
123
a500c7ed 124wxString wxAuiChopText(wxDC& dc, const wxString& text, int max_size)
50d5ad7d
BW
125{
126 wxCoord x,y;
cedd7b22 127
50d5ad7d
BW
128 // first check if the text fits with no problems
129 dc.GetTextExtent(text, &x, &y);
130 if (x <= max_size)
131 return text;
cedd7b22 132
50d5ad7d
BW
133 size_t i, len = text.Length();
134 size_t last_good_length = 0;
135 for (i = 0; i < len; ++i)
136 {
137 wxString s = text.Left(i);
138 s += wxT("...");
cedd7b22 139
50d5ad7d
BW
140 dc.GetTextExtent(s, &x, &y);
141 if (x > max_size)
142 break;
cedd7b22 143
50d5ad7d
BW
144 last_good_length = i;
145 }
146
147 wxString ret = text.Left(last_good_length);
148 ret += wxT("...");
149 return ret;
150}
151
a3a5df9d 152wxAuiDefaultDockArt::wxAuiDefaultDockArt()
50acee04 153{
efdea9c3 154#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON
4ae3fe39 155 wxColor base_colour = wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground));
50acee04 156#else
b826c7dc 157 wxColor base_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
50acee04 158#endif
be66f18e 159
3f7fce73
BW
160 // the base_colour is too pale to use as our base colour,
161 // so darken it a bit --
162 if ((255-base_colour.Red()) +
163 (255-base_colour.Green()) +
164 (255-base_colour.Blue()) < 60)
165 {
a310c91c 166 base_colour = base_colour.ChangeLightness(92);
3f7fce73 167 }
cedd7b22 168
b826c7dc 169 m_base_colour = base_colour;
a310c91c
VZ
170 wxColor darker1_colour = base_colour.ChangeLightness(85);
171 wxColor darker2_colour = base_colour.ChangeLightness(75);
172 wxColor darker3_colour = base_colour.ChangeLightness(60);
173 //wxColor darker4_colour = base_colour.ChangeLightness(50);
174 wxColor darker5_colour = base_colour.ChangeLightness(40);
50acee04 175
dadacb5e 176 m_active_caption_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
a500c7ed 177 m_active_caption_gradient_colour = wxAuiLightContrastColour(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT));
50acee04 178 m_active_caption_text_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
dadacb5e 179 m_inactive_caption_colour = darker1_colour;
a310c91c 180 m_inactive_caption_gradient_colour = base_colour.ChangeLightness(97);
50acee04
JS
181 m_inactive_caption_text_colour = *wxBLACK;
182
b826c7dc
BW
183 m_sash_brush = wxBrush(base_colour);
184 m_background_brush = wxBrush(base_colour);
185 m_gripper_brush = wxBrush(base_colour);
4ae3fe39 186
b826c7dc
BW
187 m_border_pen = wxPen(darker2_colour);
188 m_gripper_pen1 = wxPen(darker5_colour);
189 m_gripper_pen2 = wxPen(darker3_colour);
50acee04
JS
190 m_gripper_pen3 = *wxWHITE_PEN;
191
192#ifdef __WXMAC__
193 m_caption_font = *wxSMALL_FONT;
194#else
195 m_caption_font = wxFont(8, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE);
196#endif
197
cae374ef
VZ
198 // default metric values
199#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON
200 SInt32 height;
201 GetThemeMetric( kThemeMetricSmallPaneSplitterHeight , &height );
202 m_sash_size = height;
203#elif defined(__WXGTK__)
204 m_sash_size = wxRendererNative::Get().GetSplitterParams(NULL).widthSash;
205#else
206 m_sash_size = 4;
207#endif
208 m_caption_size = 17;
209 m_border_size = 1;
210 m_button_size = 14;
211 m_gripper_size = 9;
212 m_gradient_type = wxAUI_GRADIENT_VERTICAL;
213
214 InitBitmaps();
215}
216
217void
218wxAuiDefaultDockArt::InitBitmaps ()
219{
50acee04 220 // some built in bitmaps
ff03f567 221#if defined( __WXMAC__ )
a243da29 222 static const unsigned char close_bits[]={
50acee04
JS
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 };
cedd7b22 226#elif defined(__WXGTK__)
a243da29 227 static const unsigned char close_bits[]={
cedd7b22
PC
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 };
50acee04 231#else
a243da29 232 static const unsigned char close_bits[]={
7ba40044 233 // reduced height, symmetric
03647350
VZ
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,
7ba40044
VZ
236 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
237 /*
238 // same height as maximize/restore
03647350
VZ
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,
7ba40044 241 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
03647350 242 */
50acee04
JS
243#endif
244
a243da29 245 static const unsigned char maximize_bits[] = {
37106ab2
BW
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};
249
a243da29 250 static const unsigned char restore_bits[]={
37106ab2
BW
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};
cedd7b22 254
a243da29 255 static const unsigned char pin_bits[]={
50acee04
JS
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};
be66f18e 259
50acee04 260#ifdef __WXMAC__
a500c7ed
BW
261 m_inactive_close_bitmap = wxAuiBitmapFromBits(close_bits, 16, 16, *wxWHITE);
262 m_active_close_bitmap = wxAuiBitmapFromBits(close_bits, 16, 16, *wxWHITE );
50acee04 263#else
a500c7ed
BW
264 m_inactive_close_bitmap = wxAuiBitmapFromBits(close_bits, 16, 16, m_inactive_caption_text_colour);
265 m_active_close_bitmap = wxAuiBitmapFromBits(close_bits, 16, 16, m_active_caption_text_colour);
50acee04 266#endif
37106ab2 267
50acee04 268#ifdef __WXMAC__
a500c7ed
BW
269 m_inactive_maximize_bitmap = wxAuiBitmapFromBits(maximize_bits, 16, 16, *wxWHITE);
270 m_active_maximize_bitmap = wxAuiBitmapFromBits(maximize_bits, 16, 16, *wxWHITE );
50acee04 271#else
a500c7ed
BW
272 m_inactive_maximize_bitmap = wxAuiBitmapFromBits(maximize_bits, 16, 16, m_inactive_caption_text_colour);
273 m_active_maximize_bitmap = wxAuiBitmapFromBits(maximize_bits, 16, 16, m_active_caption_text_colour);
50acee04 274#endif
37106ab2
BW
275
276#ifdef __WXMAC__
a500c7ed
BW
277 m_inactive_restore_bitmap = wxAuiBitmapFromBits(restore_bits, 16, 16, *wxWHITE);
278 m_active_restore_bitmap = wxAuiBitmapFromBits(restore_bits, 16, 16, *wxWHITE );
37106ab2 279#else
a500c7ed
BW
280 m_inactive_restore_bitmap = wxAuiBitmapFromBits(restore_bits, 16, 16, m_inactive_caption_text_colour);
281 m_active_restore_bitmap = wxAuiBitmapFromBits(restore_bits, 16, 16, m_active_caption_text_colour);
37106ab2
BW
282#endif
283
a500c7ed
BW
284 m_inactive_pin_bitmap = wxAuiBitmapFromBits(pin_bits, 16, 16, m_inactive_caption_text_colour);
285 m_active_pin_bitmap = wxAuiBitmapFromBits(pin_bits, 16, 16, m_active_caption_text_colour);
50acee04
JS
286}
287
a3a5df9d 288int wxAuiDefaultDockArt::GetMetric(int id)
50acee04
JS
289{
290 switch (id)
291 {
254a3429
BW
292 case wxAUI_DOCKART_SASH_SIZE: return m_sash_size;
293 case wxAUI_DOCKART_CAPTION_SIZE: return m_caption_size;
294 case wxAUI_DOCKART_GRIPPER_SIZE: return m_gripper_size;
295 case wxAUI_DOCKART_PANE_BORDER_SIZE: return m_border_size;
296 case wxAUI_DOCKART_PANE_BUTTON_SIZE: return m_button_size;
297 case wxAUI_DOCKART_GRADIENT_TYPE: return m_gradient_type;
50acee04
JS
298 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
299 }
300
301 return 0;
302}
303
a3a5df9d 304void wxAuiDefaultDockArt::SetMetric(int id, int new_val)
50acee04
JS
305{
306 switch (id)
307 {
254a3429
BW
308 case wxAUI_DOCKART_SASH_SIZE: m_sash_size = new_val; break;
309 case wxAUI_DOCKART_CAPTION_SIZE: m_caption_size = new_val; break;
310 case wxAUI_DOCKART_GRIPPER_SIZE: m_gripper_size = new_val; break;
311 case wxAUI_DOCKART_PANE_BORDER_SIZE: m_border_size = new_val; break;
312 case wxAUI_DOCKART_PANE_BUTTON_SIZE: m_button_size = new_val; break;
313 case wxAUI_DOCKART_GRADIENT_TYPE: m_gradient_type = new_val; break;
50acee04
JS
314 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
315 }
316}
317
a3a5df9d 318wxColour wxAuiDefaultDockArt::GetColour(int id)
50acee04
JS
319{
320 switch (id)
321 {
254a3429
BW
322 case wxAUI_DOCKART_BACKGROUND_COLOUR: return m_background_brush.GetColour();
323 case wxAUI_DOCKART_SASH_COLOUR: return m_sash_brush.GetColour();
324 case wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR: return m_inactive_caption_colour;
325 case wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR: return m_inactive_caption_gradient_colour;
326 case wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR: return m_inactive_caption_text_colour;
327 case wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR: return m_active_caption_colour;
328 case wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR: return m_active_caption_gradient_colour;
329 case wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR: return m_active_caption_text_colour;
330 case wxAUI_DOCKART_BORDER_COLOUR: return m_border_pen.GetColour();
331 case wxAUI_DOCKART_GRIPPER_COLOUR: return m_gripper_brush.GetColour();
50acee04
JS
332 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
333 }
334
335 return wxColour();
336}
337
a3a5df9d 338void wxAuiDefaultDockArt::SetColour(int id, const wxColor& colour)
50acee04
JS
339{
340 switch (id)
341 {
254a3429
BW
342 case wxAUI_DOCKART_BACKGROUND_COLOUR: m_background_brush.SetColour(colour); break;
343 case wxAUI_DOCKART_SASH_COLOUR: m_sash_brush.SetColour(colour); break;
344 case wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR: m_inactive_caption_colour = colour; break;
345 case wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR: m_inactive_caption_gradient_colour = colour; break;
346 case wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR: m_inactive_caption_text_colour = colour; break;
347 case wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR: m_active_caption_colour = colour; break;
348 case wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR: m_active_caption_gradient_colour = colour; break;
349 case wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR: m_active_caption_text_colour = colour; break;
350 case wxAUI_DOCKART_BORDER_COLOUR: m_border_pen.SetColour(colour); break;
351 case wxAUI_DOCKART_GRIPPER_COLOUR:
50acee04 352 m_gripper_brush.SetColour(colour);
a310c91c
VZ
353 m_gripper_pen1.SetColour(colour.ChangeLightness(40));
354 m_gripper_pen2.SetColour(colour.ChangeLightness(60));
50acee04
JS
355 break;
356 default: wxFAIL_MSG(wxT("Invalid Metric Ordinal")); break;
357 }
cae374ef
VZ
358
359 InitBitmaps();
50acee04
JS
360}
361
a3a5df9d 362void wxAuiDefaultDockArt::SetFont(int id, const wxFont& font)
50acee04 363{
254a3429 364 if (id == wxAUI_DOCKART_CAPTION_FONT)
50acee04
JS
365 m_caption_font = font;
366}
367
a3a5df9d 368wxFont wxAuiDefaultDockArt::GetFont(int id)
50acee04 369{
254a3429 370 if (id == wxAUI_DOCKART_CAPTION_FONT)
50acee04
JS
371 return m_caption_font;
372 return wxNullFont;
373}
374
a3a5df9d 375void wxAuiDefaultDockArt::DrawSash(wxDC& dc, wxWindow *window, int orientation, const wxRect& rect)
50acee04 376{
efdea9c3 377#if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON
8a088306
VZ
378 wxUnusedVar(window);
379 wxUnusedVar(orientation);
380
50acee04
JS
381 HIRect splitterRect = CGRectMake( rect.x , rect.y , rect.width , rect.height );
382 CGContextRef cgContext ;
888dde65
RR
383 wxGCDCImpl *impl = (wxGCDCImpl*) dc.GetImpl();
384 cgContext = (CGContextRef) impl->GetGraphicsContext()->GetNativeContext() ;
be66f18e 385
50acee04
JS
386 HIThemeSplitterDrawInfo drawInfo ;
387 drawInfo.version = 0 ;
388 drawInfo.state = kThemeStateActive ;
389 drawInfo.adornment = kHIThemeSplitterAdornmentNone ;
be66f18e
WS
390 HIThemeDrawPaneSplitter( &splitterRect , &drawInfo , cgContext , kHIThemeOrientationNormal ) ;
391
32205ebb 392#elif defined(__WXGTK__)
8e367bbf
BW
393 // clear out the rectangle first
394 dc.SetPen(*wxTRANSPARENT_PEN);
395 dc.SetBrush(m_sash_brush);
396 dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
32205ebb 397
cedd7b22 398#if 0
32205ebb
RR
399 GdkRectangle gdk_rect;
400 if (orientation == wxVERTICAL )
401 {
402 gdk_rect.x = rect.x;
403 gdk_rect.y = rect.y;
404 gdk_rect.width = m_sash_size;
405 gdk_rect.height = rect.height;
406 }
407 else
408 {
409 gdk_rect.x = rect.x;
410 gdk_rect.y = rect.y;
411 gdk_rect.width = rect.width;
412 gdk_rect.height = m_sash_size;
413 }
cedd7b22 414#endif
32205ebb
RR
415
416 if (!window) return;
417 if (!window->m_wxwindow) return;
fc9ab22a 418 if (!gtk_widget_is_drawable(window->m_wxwindow)) return;
32205ebb
RR
419
420 gtk_paint_handle
421 (
385e8575 422 gtk_widget_get_style(window->m_wxwindow),
08f53168 423 window->GTKGetDrawingWindow(),
32205ebb
RR
424 // flags & wxCONTROL_CURRENT ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL,
425 GTK_STATE_NORMAL,
426 GTK_SHADOW_NONE,
427 NULL /* no clipping */,
428 window->m_wxwindow,
429 "paned",
430 rect.x,
431 rect.y,
432 rect.width,
433 rect.height,
434 (orientation == wxVERTICAL) ? GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL
435 );
436
50acee04 437#else
eec7f412
WS
438 wxUnusedVar(window);
439 wxUnusedVar(orientation);
50acee04
JS
440 dc.SetPen(*wxTRANSPARENT_PEN);
441 dc.SetBrush(m_sash_brush);
442 dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
443#endif
444}
445
446
a3a5df9d 447void wxAuiDefaultDockArt::DrawBackground(wxDC& dc, wxWindow *WXUNUSED(window), int, const wxRect& rect)
50acee04
JS
448{
449 dc.SetPen(*wxTRANSPARENT_PEN);
450#ifdef __WXMAC__
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);
455#endif
456 dc.SetBrush(m_background_brush);
457 dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
458}
459
a3a5df9d
BW
460void wxAuiDefaultDockArt::DrawBorder(wxDC& dc, wxWindow *WXUNUSED(window), const wxRect& _rect,
461 wxAuiPaneInfo& pane)
50acee04
JS
462{
463 dc.SetPen(m_border_pen);
464 dc.SetBrush(*wxTRANSPARENT_BRUSH);
465
466 wxRect rect = _rect;
254a3429 467 int i, border_width = GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE);
50acee04
JS
468
469 if (pane.IsToolbar())
470 {
471 for (i = 0; i < border_width; ++i)
472 {
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);
be66f18e 476 dc.SetPen(m_border_pen);
50acee04
JS
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);
481 rect.Deflate(1);
482 }
483 }
696978ee 484 else
50acee04
JS
485 {
486 for (i = 0; i < border_width; ++i)
487 {
488 dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
489 rect.Deflate(1);
490 }
491 }
492}
493
494
a3a5df9d 495void wxAuiDefaultDockArt::DrawCaptionBackground(wxDC& dc, const wxRect& rect, bool active)
50acee04
JS
496{
497 if (m_gradient_type == wxAUI_GRADIENT_NONE)
498 {
499 if (active)
500 dc.SetBrush(wxBrush(m_active_caption_colour));
cedd7b22 501 else
50acee04
JS
502 dc.SetBrush(wxBrush(m_inactive_caption_colour));
503
504 dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
505 }
696978ee 506 else
50acee04
JS
507 {
508 if (active)
509 {
510 // on mac the gradients are expected to become darker from the top
511#ifdef __WXMAC__
512 DrawGradientRectangle(dc, rect,
50acee04 513 m_active_caption_colour,
dadacb5e 514 m_active_caption_gradient_colour,
50acee04
JS
515 m_gradient_type);
516#else
dadacb5e 517 // on other platforms, active gradients become lighter at the top
50acee04 518 DrawGradientRectangle(dc, rect,
50acee04 519 m_active_caption_gradient_colour,
dadacb5e 520 m_active_caption_colour,
50acee04
JS
521 m_gradient_type);
522#endif
523 }
cedd7b22 524 else
50acee04 525 {
50acee04 526#ifdef __WXMAC__
dadacb5e 527 // on mac the gradients are expected to become darker from the top
50acee04
JS
528 DrawGradientRectangle(dc, rect,
529 m_inactive_caption_gradient_colour,
530 m_inactive_caption_colour,
531 m_gradient_type);
532#else
dadacb5e 533 // on other platforms, inactive gradients become lighter at the bottom
50acee04
JS
534 DrawGradientRectangle(dc, rect,
535 m_inactive_caption_colour,
536 m_inactive_caption_gradient_colour,
537 m_gradient_type);
538#endif
539 }
540 }
541}
542
543
a3a5df9d 544void wxAuiDefaultDockArt::DrawCaption(wxDC& dc, wxWindow *WXUNUSED(window),
50acee04
JS
545 const wxString& text,
546 const wxRect& rect,
a3a5df9d 547 wxAuiPaneInfo& pane)
50acee04
JS
548{
549 dc.SetPen(*wxTRANSPARENT_PEN);
550 dc.SetFont(m_caption_font);
551
552 DrawCaptionBackground(dc, rect,
a3a5df9d 553 (pane.state & wxAuiPaneInfo::optionActive)?true:false);
50acee04 554
4254f672
VZ
555 int caption_offset = 0;
556 if ( pane.icon.IsOk() )
557 {
558 DrawIcon(dc, rect, pane);
559
560 caption_offset += pane.icon.GetWidth() + 3;
561 }
562
a3a5df9d 563 if (pane.state & wxAuiPaneInfo::optionActive)
50acee04 564 dc.SetTextForeground(m_active_caption_text_colour);
696978ee 565 else
50acee04
JS
566 dc.SetTextForeground(m_inactive_caption_text_colour);
567
568
569 wxCoord w,h;
570 dc.GetTextExtent(wxT("ABCDEFHXfgkj"), &w, &h);
571
50d5ad7d
BW
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_button_size;
577 if (pane.HasPinButton())
cedd7b22 578 clip_rect.width -= m_button_size;
50d5ad7d 579 if (pane.HasMaximizeButton())
cedd7b22 580 clip_rect.width -= m_button_size;
50d5ad7d 581
a500c7ed 582 wxString draw_text = wxAuiChopText(dc, text, clip_rect.width);
50d5ad7d
BW
583
584 dc.SetClippingRegion(clip_rect);
4254f672 585 dc.DrawText(draw_text, rect.x+3 + caption_offset, rect.y+(rect.height/2)-(h/2)-1);
50acee04
JS
586 dc.DestroyClippingRegion();
587}
588
4254f672
VZ
589void
590wxAuiDefaultDockArt::DrawIcon(wxDC& dc, const wxRect& rect, wxAuiPaneInfo& pane)
591{
592 // Draw the icon centered vertically
593 dc.DrawBitmap(pane.icon,
594 rect.x+2, rect.y+(rect.height-pane.icon.GetHeight())/2,
595 true);
596}
597
a3a5df9d 598void wxAuiDefaultDockArt::DrawGripper(wxDC& dc, wxWindow *WXUNUSED(window),
50acee04 599 const wxRect& rect,
a3a5df9d 600 wxAuiPaneInfo& pane)
50acee04
JS
601{
602 dc.SetPen(*wxTRANSPARENT_PEN);
603 dc.SetBrush(m_gripper_brush);
604
605 dc.DrawRectangle(rect.x, rect.y, rect.width,rect.height);
606
607 if (!pane.HasGripperTop())
608 {
609 int y = 5;
610 while (1)
611 {
612 dc.SetPen(m_gripper_pen1);
613 dc.DrawPoint(rect.x+3, rect.y+y);
614 dc.SetPen(m_gripper_pen2);
615 dc.DrawPoint(rect.x+3, rect.y+y+1);
616 dc.DrawPoint(rect.x+4, rect.y+y);
617 dc.SetPen(m_gripper_pen3);
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);
621
622 y += 4;
623 if (y > rect.GetHeight()-5)
624 break;
625 }
626 }
627 else
628 {
629 int x = 5;
630 while (1)
631 {
632 dc.SetPen(m_gripper_pen1);
633 dc.DrawPoint(rect.x+x, rect.y+3);
634 dc.SetPen(m_gripper_pen2);
635 dc.DrawPoint(rect.x+x+1, rect.y+3);
636 dc.DrawPoint(rect.x+x, rect.y+4);
637 dc.SetPen(m_gripper_pen3);
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);
641
642 x += 4;
643 if (x > rect.GetWidth()-5)
644 break;
645 }
646 }
647}
648
a3a5df9d 649void wxAuiDefaultDockArt::DrawPaneButton(wxDC& dc, wxWindow *WXUNUSED(window),
50acee04
JS
650 int button,
651 int button_state,
652 const wxRect& _rect,
a3a5df9d 653 wxAuiPaneInfo& pane)
50acee04 654{
2b4b6ded 655 wxBitmap bmp;
cedd7b22
PC
656 if (!(&pane))
657 return;
2b4b6ded
BW
658 switch (button)
659 {
660 default:
661 case wxAUI_BUTTON_CLOSE:
662 if (pane.state & wxAuiPaneInfo::optionActive)
663 bmp = m_active_close_bitmap;
cedd7b22 664 else
2b4b6ded
BW
665 bmp = m_inactive_close_bitmap;
666 break;
667 case wxAUI_BUTTON_PIN:
668 if (pane.state & wxAuiPaneInfo::optionActive)
669 bmp = m_active_pin_bitmap;
cedd7b22 670 else
2b4b6ded
BW
671 bmp = m_inactive_pin_bitmap;
672 break;
673 case wxAUI_BUTTON_MAXIMIZE_RESTORE:
674 if (pane.IsMaximized())
675 {
676 if (pane.state & wxAuiPaneInfo::optionActive)
677 bmp = m_active_restore_bitmap;
cedd7b22 678 else
2b4b6ded
BW
679 bmp = m_inactive_restore_bitmap;
680 }
cedd7b22 681 else
2b4b6ded
BW
682 {
683 if (pane.state & wxAuiPaneInfo::optionActive)
684 bmp = m_active_maximize_bitmap;
cedd7b22 685 else
2b4b6ded
BW
686 bmp = m_inactive_maximize_bitmap;
687 }
688 break;
689 }
690
691
50acee04
JS
692 wxRect rect = _rect;
693
2b4b6ded
BW
694 int old_y = rect.y;
695 rect.y = rect.y + (rect.height/2) - (bmp.GetHeight()/2);
696 rect.height = old_y + rect.height - rect.y - 1;
697
698
50acee04
JS
699 if (button_state == wxAUI_BUTTON_STATE_PRESSED)
700 {
701 rect.x++;
702 rect.y++;
703 }
704
705 if (button_state == wxAUI_BUTTON_STATE_HOVER ||
706 button_state == wxAUI_BUTTON_STATE_PRESSED)
707 {
a3a5df9d 708 if (pane.state & wxAuiPaneInfo::optionActive)
50acee04 709 {
a310c91c
VZ
710 dc.SetBrush(wxBrush(m_active_caption_colour.ChangeLightness(120)));
711 dc.SetPen(wxPen(m_active_caption_colour.ChangeLightness(70)));
50acee04 712 }
cedd7b22 713 else
50acee04 714 {
a310c91c
VZ
715 dc.SetBrush(wxBrush(m_inactive_caption_colour.ChangeLightness(120)));
716 dc.SetPen(wxPen(m_inactive_caption_colour.ChangeLightness(70)));
50acee04
JS
717 }
718
719 // draw the background behind the button
720 dc.DrawRectangle(rect.x, rect.y, 15, 15);
721 }
722
50acee04
JS
723
724 // draw the button itself
725 dc.DrawBitmap(bmp, rect.x, rect.y, true);
726}
727
728
729#endif // wxUSE_AUI