2
* This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
3
* http://www.gnu.org/licenses/gpl-3.0.html
10
#include <wx/settings.h>
11
#include <wx/dcclient.h>
12
#include "cbauibook.h"
13
#include "notebookstyles.h"
15
// Some general constants:
18
const int c_vertical_border_padding = 4;
21
/******************************************************************************
22
* Renderer for Microsoft (tm) Visual Studio 7.1 like tabs *
23
******************************************************************************/
25
NbStyleVC71::NbStyleVC71() : wxAuiDefaultTabArt()
29
wxAuiTabArt* NbStyleVC71::Clone()
31
NbStyleVC71* clone = new NbStyleVC71();
33
clone->SetNormalFont(m_normal_font);
34
clone->SetSelectedFont(m_selected_font);
35
clone->SetMeasuringFont(m_measuring_font);
40
void NbStyleVC71::DrawTab(wxDC& dc, wxWindow* wnd,
41
const wxAuiNotebookPage& page,
42
const wxRect& in_rect, int close_button_state,
43
wxRect* out_tab_rect, wxRect* out_button_rect,
46
// Visual studio 7.1 style
47
// This code is based on the renderer included in wxFlatNotebook:
48
// http://svn.berlios.de/wsvn/codeblocks/trunk/src/sdk/wxFlatNotebook/src/wxFlatNotebook/renderer.cpp?rev=5106
50
// figure out the size of the tab
52
wxSize tab_size = GetTabSize(dc,
60
wxCoord tab_height = m_tab_ctrl_height - 3;
61
wxCoord tab_width = tab_size.x;
62
wxCoord tab_x = in_rect.x;
63
wxCoord tab_y = in_rect.y + in_rect.height - tab_height;
64
int clip_width = tab_width;
65
if (tab_x + clip_width > in_rect.x + in_rect.width - 4)
66
clip_width = (in_rect.x + in_rect.width) - tab_x - 4;
67
dc.SetClippingRegion(tab_x, tab_y, clip_width + 1, tab_height - 3);
68
if(m_flags & wxAUI_NB_BOTTOM)
71
dc.SetPen((page.active) ? wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT)) : wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)));
72
dc.SetBrush((page.active) ? wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)) : wxBrush(*wxTRANSPARENT_BRUSH));
76
// int tabH = (m_flags & wxAUI_NB_BOTTOM) ? tab_height - 5 : tab_height - 2;
77
int tabH = tab_height - 2;
79
dc.DrawRectangle(tab_x, tab_y, tab_width, tabH);
81
int rightLineY1 = (m_flags & wxAUI_NB_BOTTOM) ? c_vertical_border_padding - 2 : c_vertical_border_padding - 1;
82
int rightLineY2 = tabH + 3;
83
dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW)));
84
dc.DrawLine(tab_x + tab_width - 1, rightLineY1 + 1, tab_x + tab_width - 1, rightLineY2);
85
if(m_flags & wxAUI_NB_BOTTOM)
86
dc.DrawLine(tab_x + 1, rightLineY2 - 3 , tab_x + tab_width - 1, rightLineY2 - 3);
87
dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW)));
88
dc.DrawLine(tab_x + tab_width , rightLineY1 , tab_x + tab_width, rightLineY2);
89
if(m_flags & wxAUI_NB_BOTTOM)
90
dc.DrawLine(tab_x , rightLineY2 - 2 , tab_x + tab_width, rightLineY2 - 2);
95
// We dont draw a rectangle for non selected tabs, but only
96
// vertical line on the right
97
int blackLineY1 = (m_flags & wxAUI_NB_BOTTOM) ? c_vertical_border_padding + 2 : c_vertical_border_padding + 1;
98
int blackLineY2 = tab_height - 5;
99
dc.DrawLine(tab_x + tab_width, blackLineY1, tab_x + tab_width, blackLineY2);
102
wxPoint border_points[2];
103
if (m_flags & wxAUI_NB_BOTTOM)
105
border_points[0] = wxPoint(tab_x, tab_y);
106
border_points[1] = wxPoint(tab_x, tab_y + tab_height - 6);
108
else // if (m_flags & wxAUI_NB_TOP)
110
border_points[0] = wxPoint(tab_x, tab_y + tab_height - 4);
111
border_points[1] = wxPoint(tab_x, tab_y + 2);
114
int drawn_tab_yoff = border_points[1].y;
115
int drawn_tab_height = border_points[0].y - border_points[1].y;
117
int text_offset = tab_x + 8;
118
int close_button_width = 0;
119
if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN)
121
close_button_width = m_active_close_bmp.GetWidth();
125
int bitmap_offset = 0;
126
if (page.bitmap.IsOk())
128
bitmap_offset = tab_x + 8;
131
dc.DrawBitmap(page.bitmap,
133
drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2),
136
text_offset = bitmap_offset + page.bitmap.GetWidth();
137
text_offset += 3; // bitmap padding
141
text_offset = tab_x + 8;
145
// if the caption is empty, measure some temporary text
146
wxString caption = page.caption;
153
dc.SetFont(m_selected_font);
155
dc.SetFont(m_normal_font);
156
dc.GetTextExtent(caption, &textx, &texty);
158
dc.DrawText(page.caption, text_offset,
159
drawn_tab_yoff + drawn_tab_height / 2 - texty / 2 - 1);
161
// draw 'x' on tab (if enabled)
162
if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN)
164
int close_button_width = m_active_close_bmp.GetWidth();
165
wxBitmap bmp = m_disabled_close_bmp;
167
if ((close_button_state == wxAUI_BUTTON_STATE_HOVER) ||
168
(close_button_state == wxAUI_BUTTON_STATE_PRESSED))
169
bmp = m_active_close_bmp;
171
wxRect rect(tab_x + tab_width - close_button_width - 3,
172
drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2),
173
close_button_width, tab_height);
175
// Indent the button if it is pressed down:
176
if (close_button_state == wxAUI_BUTTON_STATE_PRESSED)
181
dc.DrawBitmap(bmp, rect.x, rect.y, true);
182
*out_button_rect = rect;
185
*out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height);
186
dc.DestroyClippingRegion();
189
int NbStyleVC71::GetBestTabCtrlSize(wxWindow* wnd,
190
const wxAuiNotebookPageArray& WXUNUSED(pages),
191
const wxSize& WXUNUSED(required_bmp_size))
193
// m_requested_tabctrl_height = -1;
194
// m_tab_ctrl_height = -1;
196
dc.SetFont(m_measuring_font);
198
wxSize s = GetTabSize(dc, wnd, wxT("ABCDEFGHIj"), wxNullBitmap, true,
199
wxAUI_BUTTON_STATE_HIDDEN, &x_ext);
203
NbStyleFF2::NbStyleFF2() : wxAuiDefaultTabArt()
207
wxAuiTabArt* NbStyleFF2::Clone()
209
NbStyleFF2* clone = new NbStyleFF2();
211
clone->SetNormalFont(m_normal_font);
212
clone->SetSelectedFont(m_selected_font);
213
clone->SetMeasuringFont(m_measuring_font);
218
void NbStyleFF2::DrawTab(wxDC& dc, wxWindow* wnd,
219
const wxAuiNotebookPage& page,
220
const wxRect& in_rect, int close_button_state,
221
wxRect* out_tab_rect, wxRect* out_button_rect,
227
// figure out the size of the tab
228
wxSize tab_size = GetTabSize(dc, wnd, page.caption, page.bitmap,
229
page.active, close_button_state, x_extent);
231
wxCoord tab_height = m_tab_ctrl_height - 2;
232
wxCoord tab_width = tab_size.x;
233
wxCoord tab_x = in_rect.x;
234
wxCoord tab_y = in_rect.y + in_rect.height - tab_height;
236
int clip_width = tab_width;
237
if (tab_x + clip_width > in_rect.x + in_rect.width - 4)
238
clip_width = (in_rect.x + in_rect.width) - tab_x - 4;
239
dc.SetClippingRegion(tab_x, tab_y, clip_width + 1, tab_height - 3);
241
wxPoint tabPoints[7];
248
tabPoints[0].x = tab_x + 3;
249
tabPoints[0].y = (m_flags & wxAUI_NB_BOTTOM) ? 3 : tab_height - 2;
251
tabPoints[1].x = tabPoints[0].x;
252
tabPoints[1].y = (m_flags & wxAUI_NB_BOTTOM) ? tab_height - (c_vertical_border_padding + 2) - adjust : (c_vertical_border_padding + 2) + adjust;
254
tabPoints[2].x = tabPoints[1].x+2;
255
tabPoints[2].y = (m_flags & wxAUI_NB_BOTTOM) ? tab_height - c_vertical_border_padding - adjust: c_vertical_border_padding + adjust;
257
tabPoints[3].x = tab_x +tab_width - 2;
258
tabPoints[3].y = tabPoints[2].y;
260
tabPoints[4].x = tabPoints[3].x + 2;
261
tabPoints[4].y = tabPoints[1].y;
263
tabPoints[5].x = tabPoints[4].x;
264
tabPoints[5].y = tabPoints[0].y;
266
tabPoints[6].x = tabPoints[0].x;
267
tabPoints[6].y = tabPoints[0].y;
269
// dc.SetBrush((page.active) ? wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)) : wxBrush(wxAuiStepColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE),85)));
270
dc.SetBrush((page.active) ? wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)) : wxBrush(*wxTRANSPARENT_BRUSH));
272
dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW)));
274
dc.DrawPolygon(7, tabPoints);
276
dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)));
279
dc.DrawLine(tabPoints[0].x + 1, tabPoints[0].y, tabPoints[5].x , tabPoints[0].y);
282
int drawn_tab_yoff = tabPoints[1].y;
283
int drawn_tab_height = tabPoints[0].y - tabPoints[2].y;
285
int text_offset = tab_x + 8;
286
int close_button_width = 0;
287
if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN)
289
close_button_width = m_active_close_bmp.GetWidth();
293
int bitmap_offset = 0;
294
if (page.bitmap.IsOk())
296
bitmap_offset = tab_x + 8;
299
dc.DrawBitmap(page.bitmap,
301
drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2),
304
text_offset = bitmap_offset + page.bitmap.GetWidth();
305
text_offset += 3; // bitmap padding
309
text_offset = tab_x + 8;
313
// if the caption is empty, measure some temporary text
314
wxString caption = page.caption;
321
dc.SetFont(m_selected_font);
323
dc.SetFont(m_normal_font);
324
dc.GetTextExtent(caption, &textx, &texty);
326
dc.DrawText(page.caption, text_offset,
327
drawn_tab_yoff + drawn_tab_height / 2 - texty / 2 - 1);
329
// draw 'x' on tab (if enabled)
330
if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN)
332
int close_button_width = m_active_close_bmp.GetWidth();
333
wxBitmap bmp = m_disabled_close_bmp;
335
if ((close_button_state == wxAUI_BUTTON_STATE_HOVER) ||
336
(close_button_state == wxAUI_BUTTON_STATE_PRESSED))
337
bmp = m_active_close_bmp;
339
wxRect rect(tab_x + tab_width - close_button_width - 3,
340
drawn_tab_yoff + (drawn_tab_height / 2) - (bmp.GetHeight() / 2),
341
close_button_width, tab_height);
343
// Indent the button if it is pressed down:
344
if (close_button_state == wxAUI_BUTTON_STATE_PRESSED)
349
dc.DrawBitmap(bmp, rect.x, rect.y, true);
350
*out_button_rect = rect;
353
*out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height);
354
dc.DestroyClippingRegion();
357
int NbStyleFF2::GetBestTabCtrlSize(wxWindow* wnd,
358
const wxAuiNotebookPageArray& WXUNUSED(pages),
359
const wxSize& WXUNUSED(required_bmp_size))
361
// m_requested_tabctrl_height = -1;
362
// m_tab_ctrl_height = -1;
364
dc.SetFont(m_measuring_font);
366
wxSize s = GetTabSize(dc, wnd, wxT("ABCDEFGHIj"), wxNullBitmap, true,
367
wxAUI_BUTTON_STATE_HIDDEN, &x_ext);