1 // options dialog, implementation
2 #include <wx/wx.h>
3 #include <wx/colordlg.h>
4 #include <crengine.h>
5 #include "cr3.h"
6 #include "optdlg.h"
7 
8 class CheckBoxOption : public PropOption {
9 private:
10     bool _defvalue;
11 public:
CheckBoxOption(wxCheckBox * control,const char * option,bool defvalue)12     CheckBoxOption( wxCheckBox * control, const char * option, bool defvalue )
13     : PropOption( control, option ), _defvalue(defvalue)
14     {
15     }
ControlToOption(CRPropRef props)16     virtual void ControlToOption( CRPropRef props )
17     {
18         props->setBool( _option, ((wxCheckBox*)_control)->IsChecked() );
19     }
OptionToControl(CRPropRef props)20     virtual void OptionToControl( CRPropRef props )
21     {
22         ((wxCheckBox*)_control)->SetValue( props->getBoolDef(_option, _defvalue) );
23     }
24 };
25 
26 class ComboBoxOption : public PropOption {
27 private:
28     int _defvalue;
29     wxArrayString _choices;
30     bool _storeStringValues;
31 public:
ComboBoxOption(wxComboBox * control,const char * option,int defvalue,const wxArrayString & choices,bool storeStringValues)32     ComboBoxOption( wxComboBox * control, const char * option, int defvalue, const wxArrayString & choices, bool storeStringValues )
33     : PropOption( control, option ), _defvalue(defvalue), _choices(choices), _storeStringValues(storeStringValues)
34     {
35     }
ControlToOption(CRPropRef props)36     virtual void ControlToOption( CRPropRef props )
37     {
38         wxString v = ((wxComboBox*)_control)->GetValue();
39         int tb = _defvalue;
40         for ( unsigned i=0; i<_choices.GetCount(); i++ )
41             if ( v==_choices[i] )
42                 tb = i;
43         if ( _storeStringValues ) {
44             props->setString( _option, wx2cr(_choices[tb]) );
45         } else {
46             props->setInt( _option, tb );
47         }
48     }
OptionToControl(CRPropRef props)49     virtual void OptionToControl( CRPropRef props )
50     {
51         unsigned tb = _defvalue;
52         if ( _storeStringValues ) {
53             lString8 s8 = lString8( _choices[_defvalue].utf8_str() );
54             lString32 s32 = props->getStringDef( _option, s8.c_str() );
55             wxString v = cr2wx(s32);
56             for ( unsigned i=0; i<_choices.GetCount(); i++ )
57                 if ( v==_choices[i] )
58                     tb = i;
59         } else {
60             tb = props->getIntDef( _option, _defvalue );
61             if ( tb<0 )
62                 tb = _defvalue;
63             if ( tb>=_choices.GetCount() )
64                 tb = _defvalue;
65         }
66         ((wxComboBox*)_control)->SetValue( _choices[tb] );
67     }
68 };
69 
70 class ColorOption : public PropOption {
71     private:
72         lvColor _value;
73         wxPanel _panel;
74         int _buttonId;
75     public:
ColorOption(wxPanel * control,const char * option,lUInt32 value,int buttonId)76         ColorOption( wxPanel * control, const char * option, lUInt32 value, int buttonId )
77         : PropOption( control, option ), _value(value), _buttonId(buttonId)
78         {
79         }
ControlToOption(CRPropRef props)80         virtual void ControlToOption( CRPropRef props )
81         {
82             props->setHex( _option, _value.get() );
83         }
OptionToControl(CRPropRef props)84         virtual void OptionToControl( CRPropRef props )
85         {
86             lvColor cl = props->getIntDef( _option, _value );
87             _value = cl;
88             _control->SetBackgroundColour( wxColor(cl.g(), cl.g(), cl.b()) );
89         }
getActionId()90         virtual int getActionId() { return _buttonId; }
onAction()91         virtual void onAction()
92         {
93             wxColourData data;
94             data.SetColour(wxColor(_value.g(), _value.g(), _value.b()));
95             wxColourDialog dlg(_control, &data);
96             if ( dlg.ShowModal()==wxID_OK ) {
97                 wxColourData & data = dlg.GetColourData();
98                 wxColor cl = data.GetColour();
99                 lvColor lvcl( cl.Red(), cl.Green(), cl.Blue() );
100                 _value = lvcl;
101                 _control->SetBackgroundColour( wxColor(_value.g(), _value.g(), _value.b()) );
102             }
103         }
104 };
105 
106 
107 
OptPanel()108 OptPanel::OptPanel()
109 : _sizer(NULL)
110 {
111 }
112 
Create(wxWindow * parent,wxWindowID id,wxString title)113 void OptPanel::Create( wxWindow * parent, wxWindowID id, wxString title )
114 {
115     wxPanel::Create( parent, id, wxDefaultPosition, wxSize( 350, 300 ),
116             wxTAB_TRAVERSAL, title );
117     _sizer = new wxStaticBoxSizer( wxVERTICAL, this, title );
118     CreateControls();
119     SetSizer( _sizer );
120     //InitDialog();
121 }
122 
AddColor(const char * option,wxString caption,lvColor defValue,int buttonId)123 wxPanel * OptPanel::AddColor( const char * option, wxString caption, lvColor defValue, int buttonId )
124 {
125     wxSizer * sizer = new wxBoxSizer( wxHORIZONTAL );
126     sizer->Add( new wxStaticText( this, wxID_ANY, caption ),
127                 0,                // make vertically unstretchable
128                 wxALIGN_LEFT | wxALL,
129                 4); // no border and centre horizontally
130     wxButton * btn = new wxButton( this, buttonId,
131                                    wxString(wxT("Change")));
132     sizer->Add( btn,
133                 0,                // make vertically unstretchable
134                 wxALIGN_RIGHT | wxALL,
135                 4); // no border and centre horizontally
136     wxPanel * control = new wxPanel( this );
137     sizer->Add(
138             control,
139     0,                // make vertically unstretchable
140     wxALIGN_LEFT | wxALL,
141     4); // no border and centre horizontally
142 
143     _sizer->Add(
144             sizer,
145     0,                // make vertically unstretchable
146     wxALIGN_LEFT | wxALL,
147     4); // no border and centre horizontally
148     _opts.add( new ColorOption( control, option, defValue, buttonId ) );
149     return control;
150 }
151 
AddFontFaceCombobox(const char * option,wxString caption)152 wxComboBox * OptPanel::AddFontFaceCombobox( const char * option, wxString caption )
153 {
154     lString32Collection list;
155     fontMan->getFaceList( list );
156     wxArrayString wxlist;// = new wxString[ list.length() + 1 ];
157     int arialIndex = -1;
158     for ( unsigned i=0; i<list.length(); i++ ) {
159         if (list[i] == "Arial")
160             arialIndex = i;
161         wxlist.Add( cr2wx(list[i]) );
162     }
163     if ( arialIndex<0 )
164         arialIndex = 0;
165     wxComboBox * res = AddCombobox( option, caption, wxlist, arialIndex, true );
166     //delete[] wxlist;
167     return res;
168 }
169 
AddCombobox(const char * option,wxString caption,const wxArrayString & options,int defValue,bool storeValues)170 wxComboBox * OptPanel::AddCombobox( const char * option, wxString caption, const wxArrayString & options, int defValue, bool storeValues )
171 {
172     wxSizer * sizer = new wxBoxSizer( wxHORIZONTAL );
173     sizer->Add( new wxStaticText( this, wxID_ANY, caption ),
174         0,                // make vertically unstretchable
175         wxALIGN_LEFT | wxALL,
176         4); // no border and centre horizontally
177     wxComboBox * control = new wxComboBox( this, wxID_ANY,
178         options[defValue],
179         wxDefaultPosition, wxDefaultSize, options,
180         wxCB_READONLY | wxCB_DROPDOWN );
181     sizer->Add(
182         control,
183         0,                // make vertically unstretchable
184         wxALIGN_LEFT | wxALL,
185         4); // no border and centre horizontally
186     _sizer->Add(
187         sizer,
188         0,                // make vertically unstretchable
189         wxALIGN_LEFT | wxALL,
190         4); // no border and centre horizontally
191     _opts.add( new ComboBoxOption( control, option, defValue, options, storeValues ) );
192     return control;
193 }
AddCheckbox(const char * option,wxString caption,bool defValue)194 wxCheckBox * OptPanel::AddCheckbox( const char * option, wxString caption, bool defValue )
195 {
196     wxCheckBox * control = new wxCheckBox( this, wxID_ANY, caption );
197     _sizer->Add(
198         control,
199         0,                // make vertically unstretchable
200         wxALIGN_LEFT | wxALL,
201         8); // no border and centre horizontally
202     _opts.add( new CheckBoxOption( control, option, defValue ) );
203     return control;
204 }
205 
206 static wxString choices_toolbar_size[] = {
207     wxT("Hide Toolbar"),
208     wxT("Small buttons"),
209     wxT("Medium buttons"),
210     wxT("Large buttons"),
211 };
212 
213 static wxString choices_toolbar_position[] = {
214     wxT("Top"),
215     wxT("Left"),
216     wxT("Right"),
217     wxT("Bottom"),
218 };
219 
220 class OptPanelWindow : public OptPanel {
221 public:
OptPanelWindow(wxWindow * parent)222     OptPanelWindow( wxWindow * parent )
223     {
224          OptPanel::Create( parent, ID_OPTIONS_WINDOW, wxT("Window options") );
225     }
CreateControls()226     virtual void CreateControls()
227     {
228         AddCombobox( PROP_WINDOW_TOOLBAR_SIZE, wxT("Toolbar size"), wxArrayString(4, choices_toolbar_size), 2 );
229         AddCombobox( PROP_WINDOW_TOOLBAR_POSITION, wxT("Toolbar position"), wxArrayString(4, choices_toolbar_position), 0 );
230         AddCheckbox( PROP_WINDOW_SHOW_MENU, wxT("Show menu"), true );
231         AddCheckbox( PROP_WINDOW_SHOW_STATUSBAR, wxT("Show statusbar"), true );
232     }
233 };
234 
235 class OptPanelApp : public OptPanel {
236 public:
OptPanelApp(wxWindow * parent)237     OptPanelApp( wxWindow * parent )
238     {
239          OptPanel::Create( parent, wxID_ANY, wxT("Application options") );
240     }
CreateControls()241     virtual void CreateControls()
242     {
243         AddCheckbox( PROP_APP_OPEN_LAST_BOOK, wxT("Open last book on start"), true );
244     }
245 };
246 
247 static wxString choices_font_antialiasing[] = {
248     wxT("No antialiasing"),
249     wxT("Use for large fonts only"),
250     wxT("Use always"),
251     wxString()
252 };
253 
254 static wxString choices_page[] = {
255     wxT("Scroll view"),
256     wxT("1 Book page"),
257     wxT("2 Book pages"),
258     wxString()
259 };
260 
261 class OptPanelPageHeader : public OptPanel {
262 public:
OptPanelPageHeader(wxWindow * parent)263     OptPanelPageHeader( wxWindow * parent ) {
264          OptPanel::Create( parent, wxID_ANY, wxT("Page header options") );
265     }
CreateControls()266     virtual void CreateControls()
267     {
268         AddCheckbox( PROP_PAGE_HEADER_ENABLED, wxT("Enable page header"), true );
269         AddCheckbox( PROP_PAGE_HEADER_TITLE, wxT("Show title"), true );
270         AddCheckbox( PROP_PAGE_HEADER_AUTHOR, wxT("Show author"), true );
271         AddCheckbox( PROP_PAGE_HEADER_PAGE_COUNT, wxT("Show page count"), true );
272         AddCheckbox( PROP_PAGE_HEADER_PAGE_NUMBER, wxT("Show page number"), true );
273         AddCheckbox( PROP_PAGE_HEADER_CLOCK, wxT("Show clock"), true );
274         AddCheckbox( PROP_PAGE_HEADER_BATTERY, wxT("Show battery indicator"), true );
275     }
276 };
277 
278 enum
279 {
280     Btn_View_Text_Color = OPTION_DIALOG_BUTTON_START,
281     Btn_View_Background_Color,
282 };
283 
BEGIN_EVENT_TABLE(OptPanel,wxPanel)284 BEGIN_EVENT_TABLE(OptPanel, wxPanel)
285         EVT_COMMAND_RANGE(Btn_View_Text_Color, Btn_View_Background_Color, wxEVT_COMMAND_BUTTON_CLICKED, OptPanel::OnButtonClicked)
286 END_EVENT_TABLE()
287 
288 
289 void OptPanel::OnButtonClicked( wxCommandEvent & event )
290 {
291     for ( int i=0; i<_opts.length(); i++ )
292         if ( _opts[i]->getActionId()==event.GetId() )
293             _opts[i]->onAction();
294 }
295 
296 class OptPanelView : public OptPanel {
297 public:
OptPanelView(wxWindow * parent)298     OptPanelView( wxWindow * parent ) {
299          OptPanel::Create( parent, wxID_ANY, wxT("View options") );
300     }
CreateControls()301     virtual void CreateControls()
302     {
303         AddCombobox( PROP_PAGE_VIEW_MODE, wxT("View mode"), wxArrayString(3, choices_page), 1 );
304         AddCombobox( PROP_FONT_ANTIALIASING, wxT("Font antialiasing"), wxArrayString(3, choices_font_antialiasing), 2 );
305         AddColor( PROP_FONT_COLOR, wxT("Text color"), 0x000000, Btn_View_Text_Color );
306         AddColor( PROP_BACKGROUND_COLOR, wxT("Background color"), 0xFFFFFF, Btn_View_Background_Color );
307         AddFontFaceCombobox( PROP_FONT_FACE, wxT("Font face") );
308     }
309 };
310 
CR3OptionsDialog(CRPropRef props)311 CR3OptionsDialog::CR3OptionsDialog(CRPropRef props)
312 : _notebook(NULL), _opt_window(NULL), _oldprops(props)
313 {
314     _props = _oldprops->clone();
315 }
316 
~CR3OptionsDialog()317 CR3OptionsDialog::~CR3OptionsDialog()
318 {
319     if ( _notebook ) {
320         delete _notebook;
321         _notebook = NULL;
322     }
323 }
324 
PropsToControls()325 void CR3OptionsDialog::PropsToControls()
326 {
327     for (unsigned i=0; i<_notebook->GetPageCount(); i++) {
328         OptPanel * page = (OptPanel *)_notebook->GetPage(i);
329         page->PropsToControls(_props);
330     }
331 }
332 
ControlsToProps()333 void CR3OptionsDialog::ControlsToProps()
334 {
335     for (unsigned i=0; i<_notebook->GetPageCount(); i++) {
336         OptPanel * page = (OptPanel *)_notebook->GetPage(i);
337         page->ControlsToProps(_props);
338     }
339 }
340 
Create(wxWindow * parent,wxWindowID id)341 bool CR3OptionsDialog::Create( wxWindow* parent, wxWindowID id )
342 {
343     bool res = wxDialog::Create( parent, id, wxString(wxT("CR3 Options")),
344         wxDefaultPosition, wxSize(450, 400),
345         wxRESIZE_BORDER|wxCLOSE_BOX|wxCAPTION, wxString(wxT("dialogBox")));
346     if ( res ) {
347 
348         _notebook = new wxTreebook( this, ID_OPTIONS_TREEBOOK );
349         _notebook->Hide();
350         wxSizer * btnSizer = CreateButtonSizer( wxOK | wxCANCEL );
351         wxBoxSizer * sizer = new wxBoxSizer( wxVERTICAL );
352         sizer->Add(
353             _notebook,
354             1,            // make vertically stretchable
355             wxEXPAND |    // make horizontally stretchable
356             wxALL,        //   and make border all around
357             10 );         // set border width to 10
358 
359         sizer->Add(
360             btnSizer,
361             0,                // make vertically unstretchable
362             wxALIGN_CENTER | wxALL,
363             4); // no border and centre horizontally
364 
365         _opt_window = new OptPanelWindow( _notebook );
366         _notebook->InsertPage(0, _opt_window, wxT("Window") );
367 
368         _opt_view = new OptPanelView( _notebook );
369         _notebook->InsertPage(1, _opt_view, wxT("View") );
370 
371         _opt_page = new OptPanelPageHeader( _notebook );
372         _notebook->InsertPage(2, _opt_page, wxT("Page header") );
373 
374         _opt_app = new OptPanelApp( _notebook );
375         _notebook->InsertPage(3, _opt_app, wxT("Application") );
376 
377         SetSizer( sizer );
378         PropsToControls();
379         _notebook->Show();
380         InitDialog();
381     }
382     return res;
383 }
384