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