1
///////////////////////////////////////////////////////////////////////////////
2
// Name: fnb_customize_dlg.cpp
3
// Purpose: customise dialog used by wxFlatNotebook
4
// Author: Eran Ifrah <eran.ifrah@gmail.com>
6
// Modified: 01/01/2006
7
// Copyright: Eran Ifrah (c)
8
// Licence: wxWindows license <http://www.wxwidgets.org/licence3.txt>
9
///////////////////////////////////////////////////////////////////////////////
10
#include "wx/wxFlatNotebook/fnb_customize_dlg.h"
11
#include "wx/wxFlatNotebook/wxFlatNotebook.h"
13
#include <wx/radiobox.h>
14
#include <wx/checkbox.h>
16
///////////////////////////////////////////////////////////////////////////
18
wxFNBCustomizeDialog::wxFNBCustomizeDialog( wxWindow* parent, long options, int id, wxString title, wxPoint pos, wxSize size, int style )
19
: wxDialog( parent, id, title, pos, size, style )
22
wxBoxSizer* mainSizer;
23
mainSizer = new wxBoxSizer( wxVERTICAL );
24
SetSizer( mainSizer );
26
mainSizer->Add( CreateOptionsPage(), 1, wxEXPAND | wxALL, 5 );
28
m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
29
mainSizer->Add( m_staticline2, 0, wxALL|wxEXPAND, 5 );
32
btnSizer = new wxBoxSizer( wxHORIZONTAL );
34
m_close = new wxButton( this, wxID_ANY, wxT("&Close"), wxDefaultPosition, wxDefaultSize, 0 );
35
btnSizer->Add( m_close, 0, wxALL, 5 );
37
mainSizer->Add( btnSizer, 0, wxALIGN_CENTER, 5 );
40
GetSizer()->Fit(this);
45
void wxFNBCustomizeDialog::ConnectEvents()
47
m_close->Connect(wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnClose), NULL, this);
49
// Connect all checkbox & radiobox controls to the same handler
51
m_styles->Connect(wxID_ANY, wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
54
m_navigationStyle->Connect(wxID_ANY, wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
56
m_tabVPosition->Connect(wxID_ANY, wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
59
m_tabBorder->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
60
m_hideCloseButton->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
61
m_mouseMiddleCloseTab->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
62
m_xButtonOnTab->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
63
m_dlbClickCloseTab->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
64
m_smartTabbing->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
66
if( m_allowDragAndDrop ){
67
m_allowDragAndDrop->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
71
m_foreignDnD->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
74
m_gradient->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
75
m_colorfulTab->Connect(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(wxFNBCustomizeDialog::OnStyle), NULL, this);
78
wxPanel *wxFNBCustomizeDialog::CreateOptionsPage()
80
wxPageContainer *pc = static_cast<wxPageContainer*>(GetParent());
82
wxPanel *page = new wxPanel(this);
83
wxBoxSizer* mainSizer;
84
mainSizer = new wxBoxSizer( wxVERTICAL );
85
page->SetSizer( mainSizer );
87
wxString m_stylesChoices[] = { wxT("Default"), wxT("Visual Studio 8.0"), wxT("Visual Studio 7.10"), wxT("Fancy Tabs"), wxT("Firefox 2") };
88
int m_stylesNChoices = sizeof( m_stylesChoices ) / sizeof( wxString );
90
// Set the selected tabs' style
92
bool enableGrad = false, enableColorTab = false;
94
if (pc->HasFlag(wxFNB_FF2) ){
96
enableGrad = true; enableColorTab = false;
97
} else if( pc->HasFlag(wxFNB_VC71) ){
99
enableGrad = false; enableColorTab = false;
100
}else if( pc->HasFlag(wxFNB_VC8) ){
102
enableGrad = true; enableColorTab = true;
103
}else if( pc->HasFlag(wxFNB_FANCY_TABS) ){
105
enableGrad = false; enableColorTab = false;
108
enableGrad = false; enableColorTab = false;
111
// can we customize the tab's style?
112
if( m_options & wxFNB_CUSTOM_TAB_LOOK ){
113
m_styles = new wxRadioBox( page, wxID_ANY, wxT("Visual Style:"), wxDefaultPosition, wxDefaultSize, m_stylesNChoices, m_stylesChoices, 3, wxRA_SPECIFY_COLS );
114
m_styles->SetSelection(selection);
115
mainSizer->Add( m_styles, 0, wxALL|wxEXPAND, 5 );
120
// can we customize the tab's orientation?
121
if( m_options & wxFNB_CUSTOM_ORIENTATION ){
122
wxString m_tabVPositionChoices[] = { wxT("Upper Tabs"), wxT("Bottom Tabs") };
123
int m_tabVPositionNChoices = sizeof( m_tabVPositionChoices ) / sizeof( wxString );
124
m_tabVPosition = new wxRadioBox( page, wxID_ANY, wxT("Tab Positioning:"), wxDefaultPosition, wxDefaultSize, m_tabVPositionNChoices, m_tabVPositionChoices, 2, wxRA_SPECIFY_COLS );
125
m_tabVPosition->SetSelection(pc->HasFlag(wxFNB_BOTTOM) ? 1 : 0);
126
mainSizer->Add( m_tabVPosition, 0, wxALL|wxEXPAND, 5 );
128
m_tabVPosition = NULL;
131
// there is no harm in showing this always
132
wxString navigationStyle [] = { wxT("Rotation Arrows"), wxT("Drop Down Tab List"), wxT("None") };
133
int nChoices = sizeof( navigationStyle ) / sizeof( wxString );
134
m_navigationStyle = new wxRadioBox( page, wxID_ANY, wxT("Navigation Style:"), wxDefaultPosition, wxDefaultSize, nChoices, navigationStyle, 3, wxRA_SPECIFY_COLS );
136
if(pc->HasFlag(wxFNB_DROPDOWN_TABS_LIST)){
137
m_navigationStyle->SetSelection(1);
138
} else if(pc->HasFlag(wxFNB_NO_NAV_BUTTONS) && !pc->HasFlag(wxFNB_DROPDOWN_TABS_LIST)){
139
m_navigationStyle->SetSelection(2);
141
m_navigationStyle->SetSelection(0);
144
mainSizer->Add( m_navigationStyle, 0, wxALL|wxEXPAND, 5 );
146
wxStaticBoxSizer* sbSizer2;
147
sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( page, -1, wxT("General:") ), wxVERTICAL );
149
wxGridSizer* gSizer1;
150
gSizer1 = new wxGridSizer( 3, 2, 0, 0 );
152
m_tabBorder = new wxCheckBox( page, wxID_ANY, wxT("Draw Thin Border Around Tab Area"), wxDefaultPosition, wxDefaultSize, 0 );
153
m_tabBorder->SetValue(pc->HasFlag(wxFNB_TABS_BORDER_SIMPLE));
154
gSizer1->Add( m_tabBorder, 0, wxALL, 5 );
156
// do we allow customizing close button options? ( in all forms: dclick, middle click, on tab and right side)
157
m_hideCloseButton = new wxCheckBox( page, wxID_ANY, wxT("Hide Close Button"), wxDefaultPosition, wxDefaultSize, 0 );
158
m_hideCloseButton->SetValue(pc->HasFlag(wxFNB_NO_X_BUTTON));
159
m_hideCloseButton->Enable(m_options & wxFNB_CUSTOM_CLOSE_BUTTON ? true : false);
160
gSizer1->Add( m_hideCloseButton, 0, wxALL, 5 );
162
m_mouseMiddleCloseTab = new wxCheckBox( page, wxID_ANY, wxT("Mouse Middle Button Closes Tab"), wxDefaultPosition, wxDefaultSize, 0 );
163
m_mouseMiddleCloseTab->SetValue(pc->HasFlag(wxFNB_MOUSE_MIDDLE_CLOSES_TABS));
164
m_mouseMiddleCloseTab->Enable(m_options & wxFNB_CUSTOM_CLOSE_BUTTON ? true : false);
165
gSizer1->Add( m_mouseMiddleCloseTab, 0, wxALL, 5 );
167
m_xButtonOnTab = new wxCheckBox( page, wxID_ANY, wxT("Place Close Button On Active Tab"), wxDefaultPosition, wxDefaultSize, 0 );
168
m_xButtonOnTab->SetValue(pc->HasFlag(wxFNB_X_ON_TAB));
169
m_xButtonOnTab->Enable(m_options & wxFNB_CUSTOM_CLOSE_BUTTON ? true : false);
170
gSizer1->Add( m_xButtonOnTab, 0, wxALL, 5 );
172
m_dlbClickCloseTab = new wxCheckBox( page, wxID_ANY, wxT("Double Click Closes Tab"), wxDefaultPosition, wxDefaultSize, 0 );
173
m_dlbClickCloseTab->SetValue(pc->HasFlag(wxFNB_DCLICK_CLOSES_TABS));
174
m_dlbClickCloseTab->Enable(m_options & wxFNB_CUSTOM_CLOSE_BUTTON ? true : false);
175
gSizer1->Add( m_dlbClickCloseTab, 0, wxALL, 5 );
177
m_smartTabbing = new wxCheckBox( page, wxID_ANY, wxT("Enable Smart Tabbing"), wxDefaultPosition, wxDefaultSize, 0 );
178
m_smartTabbing->SetValue(pc->HasFlag(wxFNB_SMART_TABS));
179
gSizer1->Add( m_smartTabbing, 0, wxALL, 5 );
181
sbSizer2->Add( gSizer1, 0, wxEXPAND, 5 );
183
mainSizer->Add( sbSizer2, 0, wxALL|wxEXPAND, 5 );
185
if(m_options & wxFNB_CUSTOM_LOCAL_DRAG){
186
wxStaticBoxSizer* sbSizer4;
187
sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( page, -1, wxT("Drag And Drop:") ), wxHORIZONTAL );
188
m_allowDragAndDrop = new wxCheckBox( page, wxID_ANY, wxT("Enable Drag And Drop"), wxDefaultPosition, wxDefaultSize, 0 );
189
m_allowDragAndDrop->SetValue(!pc->HasFlag(wxFNB_NODRAG));
191
sbSizer4->Add( m_allowDragAndDrop, 0, wxALL, 5 );
193
m_foreignDnD = new wxCheckBox( page, wxID_ANY, wxT("Allow Drag And Drop from other notebooks"), wxDefaultPosition, wxDefaultSize, 0 );
194
m_foreignDnD->SetValue(pc->HasFlag(wxFNB_ALLOW_FOREIGN_DND));
195
m_foreignDnD->Enable(m_allowDragAndDrop->IsChecked() && m_options & wxFNB_CUSTOM_FOREIGN_DRAG);
196
sbSizer4->Add( m_foreignDnD, 0, wxALL, 5 );
197
mainSizer->Add( sbSizer4, 0, wxALL|wxEXPAND, 5 );
200
m_allowDragAndDrop = NULL;
204
wxStaticBoxSizer* sbSizer5;
205
sbSizer5 = new wxStaticBoxSizer( new wxStaticBox( page, -1, wxT("Effects:") ), wxHORIZONTAL );
207
m_gradient = new wxCheckBox( page, wxID_ANY, wxT("Use Gradient painting for tabs area"), wxDefaultPosition, wxDefaultSize, 0 );
208
m_gradient->SetValue(pc->HasFlag(wxFNB_BACKGROUND_GRADIENT));
209
sbSizer5->Add( m_gradient, 0, wxALL, 5 );
211
m_colorfulTab = new wxCheckBox( page, wxID_ANY, wxT("Set Random Colour for Tabs"), wxDefaultPosition, wxDefaultSize, 0 );
212
m_colorfulTab->SetValue(pc->HasFlag(wxFNB_COLORFUL_TABS));
213
sbSizer5->Add( m_colorfulTab, 0, wxALL, 5 );
215
mainSizer->Add( sbSizer5, 0, wxALL|wxEXPAND, 5 );
216
m_colorfulTab->Enable(enableColorTab);
217
m_gradient->Enable(enableGrad);
222
//---------------------------------------------------------
224
//---------------------------------------------------------
226
void wxFNBCustomizeDialog::OnClose(wxCommandEvent &event)
232
void wxFNBCustomizeDialog::OnStyle(wxCommandEvent &event)
234
wxObject *obj = event.GetEventObject();
235
wxPageContainer *pc = static_cast<wxPageContainer*>(GetParent());
237
wxFlatNotebook *bookWin = static_cast<wxFlatNotebook*>( pc->GetParent() );
238
long style = bookWin->GetWindowStyleFlag();
241
if( obj == m_styles ){
242
style &= ~(wxFNB_VC71);
243
style &= ~(wxFNB_VC8);
244
style &= ~(wxFNB_FF2);
245
style &= ~(wxFNB_FANCY_TABS);
247
if(event.GetSelection() == 1){ // vc8
248
// remove bottom flag if exist
250
m_gradient->Enable(true);
251
m_colorfulTab->Enable(true);
252
} else if(event.GetSelection() == 2){ //vc71
254
m_gradient->Enable(false);
255
m_colorfulTab->Enable(false);
256
} else if(event.GetSelection() == 3){ // fancy
257
style |= wxFNB_FANCY_TABS;
258
m_gradient->Enable(false);
259
m_colorfulTab->Enable(false);
260
} else if(event.GetSelection() == 4){ // ff2
262
m_gradient->Enable(true);
263
m_colorfulTab->Enable(false);
265
// by default this two options are not available
266
m_gradient->Enable(false);
267
m_colorfulTab->Enable(false);
271
// Handle tab postioninig
272
if( obj == m_tabVPosition ){
273
if(event.GetSelection() == 0){ // Top
274
// remove bottom flag if exist
275
style &= ~(wxFNB_BOTTOM);
277
style |= wxFNB_BOTTOM;
281
// Handle navigation style
282
if( obj == m_navigationStyle ){
283
if(event.GetSelection() == 0){ // Arrows
284
style &= ~wxFNB_DROPDOWN_TABS_LIST;
285
style &= ~wxFNB_NO_NAV_BUTTONS;
286
} else if(event.GetSelection() == 1){ // list
287
style |= wxFNB_NO_NAV_BUTTONS;
288
style |= wxFNB_DROPDOWN_TABS_LIST;
291
style |= wxFNB_NO_NAV_BUTTONS;
292
style &= ~wxFNB_DROPDOWN_TABS_LIST;
296
// Simple tab border around tab area
297
if(obj == m_tabBorder){
298
if(event.IsChecked()){
299
style |= wxFNB_TABS_BORDER_SIMPLE;
301
style &= ~(wxFNB_TABS_BORDER_SIMPLE);
306
if(obj == m_hideCloseButton){
307
if(event.IsChecked()){
308
style |= wxFNB_NO_X_BUTTON;
310
style &= ~(wxFNB_NO_X_BUTTON);
314
if(obj == m_mouseMiddleCloseTab){
315
if(event.IsChecked()){
316
style |= wxFNB_MOUSE_MIDDLE_CLOSES_TABS;
318
style &= ~(wxFNB_MOUSE_MIDDLE_CLOSES_TABS);
322
if(obj == m_xButtonOnTab){
323
if(event.IsChecked()){
324
style |= wxFNB_X_ON_TAB;
326
style &= ~(wxFNB_X_ON_TAB);
330
if(obj == m_dlbClickCloseTab){
331
if(event.IsChecked()){
332
style |= wxFNB_DCLICK_CLOSES_TABS;
334
style &= ~(wxFNB_DCLICK_CLOSES_TABS);
338
if(obj == m_smartTabbing){
339
if(event.IsChecked()){
340
style |= wxFNB_SMART_TABS;
342
style &= ~(wxFNB_SMART_TABS);
346
if(obj == m_allowDragAndDrop){
347
if(event.IsChecked()){
348
m_foreignDnD->Enable(m_options & wxFNB_CUSTOM_FOREIGN_DRAG ? true : false);
349
style &= ~wxFNB_NODRAG;
351
m_foreignDnD->Enable(false);
352
style |= wxFNB_NODRAG;
356
if(obj == m_foreignDnD){
357
if(event.IsChecked()){
358
style |= wxFNB_ALLOW_FOREIGN_DND;
360
style &= ~wxFNB_ALLOW_FOREIGN_DND;
364
if(obj == m_gradient){
365
if(event.IsChecked()){
366
style |= wxFNB_BACKGROUND_GRADIENT;
368
style &= ~wxFNB_BACKGROUND_GRADIENT;
372
if(obj == m_colorfulTab){
373
if(event.IsChecked()){
374
style |= wxFNB_COLORFUL_TABS;
376
style &= ~wxFNB_COLORFUL_TABS;
380
bookWin->SetWindowStyleFlag(style);