1 /*
2 FXiTe - The Free eXtensIble Text Editor
3 Copyright (c) 2009-2011 Jeffrey Pohlmeyer <yetanothergeek@gmail.com>
4
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License version 3 as
7 published by the Free Software Foundation.
8
9 This software is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include <fx.h>
20 #include "intl.h"
21
22 #include "compat.h"
23
24 #include "theme.h"
25
26
27 typedef struct _AppColors {
28 const FXchar* name;
29 FXColor base;
30 FXColor border;
31 FXColor back;
32 FXColor fore;
33 FXColor selback;
34 FXColor selfore;
35 FXColor tipback;
36 FXColor tipfore;
37 FXColor selmenuback;
38 FXColor selmenutext;
39 } AppColors;
40
41
42 static const AppColors ColorThemes[]={
43 //| Name | Base | Border | Back | Fore | Selback | Selfore | Tipback | Tipfore | Menuback | Menufore |
44 //|----------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
45 {"FOX", FXRGB(0xD4,0xD0,0xC8),FXRGB(0x00,0x00,0x00),FXRGB(0xFF,0xFF,0xFF),FXRGB(0x00,0x00,0x00),FXRGB(0x0A,0x24,0x6A),FXRGB(0xFF,0xFF,0xFF),FXRGB(0xFF,0xFF,0xE1),FXRGB(0x00,0x00,0x00),FXRGB(0x0A,0x24,0x6A),FXRGB(0xFF,0xFF,0xFF)},
46 {"Dark Blue", FXRGB(0x42,0x67,0x94),FXRGB(0x00,0x00,0x00),FXRGB(0x00,0x2A,0x4E),FXRGB(0xFF,0xFF,0xFF),FXRGB(0x5C,0xB3,0xFF),FXRGB(0x00,0x00,0x00),FXRGB(0xFF,0xFF,0xE1),FXRGB(0x00,0x00,0x00),FXRGB(0x5C,0xB3,0xFF),FXRGB(0x00,0x00,0x00)},
47 {"Desert FOX", FXRGB(0xD6,0xCD,0xBB),FXRGB(0x00,0x00,0x00),FXRGB(0xFF,0xFF,0xFF),FXRGB(0x00,0x00,0x00),FXRGB(0x80,0x00,0x00),FXRGB(0xFF,0xFF,0xFF),FXRGB(0xFF,0xFF,0xE1),FXRGB(0x00,0x00,0x00),FXRGB(0x80,0x00,0x00),FXRGB(0xFF,0xFF,0xFF)},
48 {"Plastik", FXRGB(0xEF,0xEF,0xEF),FXRGB(0x00,0x00,0x00),FXRGB(0xFF,0xFF,0xFF),FXRGB(0x00,0x00,0x00),FXRGB(0x67,0x8D,0xB2),FXRGB(0xFF,0xFF,0xFF),FXRGB(0xFF,0xFF,0xE1),FXRGB(0x00,0x00,0x00),FXRGB(0x67,0x8D,0xB2),FXRGB(0xFF,0xFF,0xFF)},
49 {"Pumpkin", FXRGB(0xEE,0xD8,0xAE),FXRGB(0x00,0x00,0x00),FXRGB(0xFF,0xFF,0xFF),FXRGB(0x00,0x00,0x00),FXRGB(0xCD,0x85,0x3F),FXRGB(0xFF,0xFF,0xFF),FXRGB(0xFF,0xFF,0xE1),FXRGB(0x00,0x00,0x00),FXRGB(0xCD,0x85,0x3F),FXRGB(0xFF,0xFF,0xFF)},
50 {"Storm", FXRGB(0xC0,0xC0,0xC0),FXRGB(0x00,0x00,0x00),FXRGB(0xFF,0xFF,0xFF),FXRGB(0x00,0x00,0x00),FXRGB(0x8B,0x00,0x8B),FXRGB(0xFF,0xFF,0xFF),FXRGB(0xFF,0xFF,0xE1),FXRGB(0x00,0x00,0x00),FXRGB(0x8B,0x00,0x8B),FXRGB(0xFF,0xFF,0xFF)},
51 {"Sea Sky", FXRGB(0xA5,0xB2,0xC6),FXRGB(0x00,0x00,0x00),FXRGB(0xFF,0xFF,0xFF),FXRGB(0x00,0x00,0x00),FXRGB(0x31,0x65,0x9C),FXRGB(0xFF,0xFF,0xFF),FXRGB(0xFF,0xFF,0xE1),FXRGB(0x00,0x00,0x00),FXRGB(0x31,0x65,0x9C),FXRGB(0xFF,0xFF,0xFF)},
52 };
53
54 static const FXint numthemes=ARRAYNUMBER(ColorThemes);
55
56 static AppColors system_colors={"System"};
57 static const char*colors_sect="CustomColors";
58 static AppColors custom_colors={"User Defined"};
59
60 static FXString current_theme="System";
61 static bool use_system_colors=false;
62 static FXuint what_changed=ThemeUnchanged;
63
64 static FXString system_font="Sans,90";
65 static FXString current_font="Sans,90";
66
GetActualFont(FXFont * fnt)67 static const FXString GetActualFont(FXFont*fnt)
68 {
69 FXString dst=fnt->getFont().section(',',1,5);
70 dst.prepend(',');
71 dst.prepend(fnt->getActualName());
72 return dst;
73 }
74
75
76
RegToApp()77 static void RegToApp()
78 {
79 FXApp*a=FXApp::instance();
80 current_theme=a->reg().readStringEntry(colors_sect, "CurrentTheme", current_theme.text());
81 use_system_colors=a->reg().readBoolEntry(colors_sect, "UseSystemColors",use_system_colors);
82 if (use_system_colors) { return; }
83 a->setBackColor(a->reg().readColorEntry(colors_sect,"Back",a->getBackColor()));
84 a->setBaseColor(a->reg().readColorEntry(colors_sect,"Base",a->getBaseColor()));
85 a->setBorderColor(a->reg().readColorEntry(colors_sect,"Border",a->getBorderColor()));
86 a->setForeColor(a->reg().readColorEntry(colors_sect,"Fore",a->getForeColor()));
87 a->setHiliteColor(a->reg().readColorEntry(colors_sect,"Hilite",a->getHiliteColor()));
88 a->setSelMenuBackColor(a->reg().readColorEntry(colors_sect,"SelMenuBack",a->getSelMenuBackColor()));
89 a->setSelMenuTextColor(a->reg().readColorEntry(colors_sect,"SelMenuText",a->getSelMenuTextColor()));
90 a->setSelbackColor(a->reg().readColorEntry(colors_sect,"Selback",a->getSelbackColor()));
91 a->setSelforeColor(a->reg().readColorEntry(colors_sect,"Selfore",a->getSelforeColor()));
92 a->setShadowColor(a->reg().readColorEntry(colors_sect,"Shadow",a->getShadowColor()));
93 a->setTipbackColor(a->reg().readColorEntry(colors_sect,"Tipback",a->getTipbackColor()));
94 a->setTipforeColor(a->reg().readColorEntry(colors_sect,"Tipfore",a->getTipforeColor()));
95 current_font=a->reg().readStringEntry(colors_sect,"Font",system_font.text());
96 if (current_font!=system_font) {
97 a->getNormalFont()->destroy();
98 a->getNormalFont()->setFont(current_font);
99 a->getNormalFont()->create();
100 current_font=GetActualFont(a->getNormalFont());
101 }
102 }
103
104
105
AppToReg()106 static void AppToReg()
107 {
108 FXApp*a=FXApp::instance();
109 a->reg().writeColorEntry(colors_sect,"Back",a->getBackColor());
110 a->reg().writeColorEntry(colors_sect,"Base",a->getBaseColor());
111 a->reg().writeColorEntry(colors_sect,"Border",a->getBorderColor());
112 a->reg().writeColorEntry(colors_sect,"Fore",a->getForeColor());
113 a->reg().writeColorEntry(colors_sect,"Hilite",a->getHiliteColor());
114 a->reg().writeColorEntry(colors_sect,"SelMenuBack",a->getSelMenuBackColor());
115 a->reg().writeColorEntry(colors_sect,"SelMenuText",a->getSelMenuTextColor());
116 a->reg().writeColorEntry(colors_sect,"Selback",a->getSelbackColor());
117 a->reg().writeColorEntry(colors_sect,"Selfore",a->getSelforeColor());
118 a->reg().writeColorEntry(colors_sect,"Shadow",a->getShadowColor());
119 a->reg().writeColorEntry(colors_sect,"Tipback",a->getTipbackColor());
120 a->reg().writeColorEntry(colors_sect,"Tipfore",a->getTipforeColor());
121 a->reg().writeStringEntry(colors_sect,"Font", GetActualFont(a->getNormalFont()).text());
122 }
123
124
125
GetColorsFromApp(AppColors * c)126 static void GetColorsFromApp(AppColors *c)
127 {
128 FXApp*a=FXApp::instance();
129 c->base=a->getBaseColor();
130 c->border=a->getBorderColor();
131 c->back=a->getBackColor();
132 c->fore=a->getForeColor();
133 c->selback=a->getSelbackColor();
134 c->selfore=a->getSelforeColor();
135 c->tipfore=a->getTipforeColor();
136 c->tipback=a->getTipbackColor();
137 c->selmenuback=a->getSelMenuBackColor();
138 c->selmenutext=a->getSelMenuTextColor();
139 }
140
141
142
ApplyColorsToApp(const AppColors * c)143 static void ApplyColorsToApp(const AppColors *c)
144 {
145 FXApp*a=FXApp::instance();
146 a->setBaseColor(c->base);
147 a->setBorderColor(c->border);
148 a->setBackColor(c->back);
149 a->setForeColor(c->fore);
150 a->setSelbackColor(c->selback);
151 a->setSelforeColor(c->selfore);
152 a->setTipbackColor(c->tipback);
153 a->setTipforeColor(c->tipfore);
154 a->setSelMenuBackColor(c->selmenuback);
155 a->setSelMenuTextColor(c->selmenutext);
156 a->setHiliteColor(makeHiliteColor(c->base));
157 a->setShadowColor(makeShadowColor(c->base));
158 }
159
160
161
162 #define IfIs(t,dst,src) t*dst=dynamic_cast<t*>(src); if (dst)
163
164 #define SetColor(t,f) IfIs(t,a##t,w) { a##t->f(c); return; }
165
166 #define BackColor(t) SetColor(t,setBackColor)
SetBackColor(FXWindow * w)167 static void SetBackColor(FXWindow*w)
168 {
169 FXColor c=w->getApp()->getBackColor();
170 BackColor(FXComboBox);
171 BackColor(FXListBox);
172 BackColor(FXList);
173 BackColor(FXTextField);
174 c=w->getApp()->getBaseColor();
175 BackColor(FXWindow);
176 }
177
178
179
180 #define BaseColor(t) SetColor(t,setBaseColor)
SetBaseColor(FXWindow * w)181 static void SetBaseColor(FXWindow*w)
182 {
183 FXColor c=w->getApp()->getBaseColor();
184 BaseColor(FXFrame);
185 BaseColor(FXMDIChild);
186 BaseColor(FXPacker);
187 BaseColor(FXPopup);
188 BaseColor(FXTable);
189 BaseColor(FXToolBarShell);
190 }
191
192
193 #define TextColor(t) SetColor(t,setTextColor)
SetTextColor(FXWindow * w)194 static void SetTextColor(FXWindow*w)
195 {
196 FXColor c=w->getApp()->getForeColor();
197 TextColor(FXComboBox);
198 TextColor(FXFoldingList);
199 TextColor(FXGroupBox);
200 TextColor(FXHeader);
201 TextColor(FXIconList);
202 TextColor(FXLabel);
203 TextColor(FXList);
204 TextColor(FXListBox);
205 TextColor(FXMenuCaption);
206 TextColor(FXProgressBar);
207 TextColor(FXRealSpinner);
208 TextColor(FXRuler);
209 TextColor(FXSpinner);
210 TextColor(FXText);
211 TextColor(FXTextField);
212 TextColor(FXToolTip);
213 TextColor(FXTreeList);
214 }
215
216
217
218 #define SelTextColor(t) SetColor(t,setSelTextColor)
SetSelTextColor(FXWindow * w)219 static void SetSelTextColor(FXWindow*w)
220 {
221 FXColor c=w->getApp()->getSelforeColor();
222 SelTextColor(FXComboBox);
223 SelTextColor(FXFoldingList);
224 SelTextColor(FXIconList);
225 SelTextColor(FXList);
226 SelTextColor(FXListBox);
227 SelTextColor(FXMenuCaption);
228 SelTextColor(FXOption);
229 SelTextColor(FXRealSpinner);
230 SelTextColor(FXSpinner);
231 SelTextColor(FXTable);
232 SelTextColor(FXText);
233 SelTextColor(FXTextField);
234 SelTextColor(FXTreeList);
235 }
236
237
238 #define SelBackColor(t) SetColor(t,setSelBackColor)
SetSelBackColor(FXWindow * w)239 static void SetSelBackColor(FXWindow*w)
240 {
241 FXColor c=w->getApp()->getSelbackColor();
242 SelBackColor(FXComboBox);
243 SelBackColor(FXFoldingList);
244 SelBackColor(FXIconList);
245 SelBackColor(FXList);
246 SelBackColor(FXListBox);
247 SelBackColor(FXMenuCaption);
248 SelBackColor(FXOption);
249 SelBackColor(FXRealSpinner);
250 SelBackColor(FXSpinner);
251 SelBackColor(FXTable);
252 SelBackColor(FXText);
253 SelBackColor(FXTextField);
254 SelBackColor(FXTreeList);
255 }
256
257
258 #define ShadowColor(t) SetColor(t,setShadowColor)
SetShadowColor(FXWindow * w)259 static void SetShadowColor(FXWindow*w)
260 {
261 FXColor c=w->getApp()->getShadowColor();
262 ShadowColor(FXDragCorner);
263 ShadowColor(FXFrame);
264 ShadowColor(FXMDIChild);
265 ShadowColor(FXMenuCaption);
266 ShadowColor(FXMenuSeparator);
267 ShadowColor(FXPacker);
268 ShadowColor(FXPopup);
269 ShadowColor(FXScrollBar);
270 ShadowColor(FXTable);
271 ShadowColor(FXToolBarShell);
272 }
273
274
275
276 #define HiliteColor(t) SetColor(t,setHiliteColor)
SetHiliteColor(FXWindow * w)277 static void SetHiliteColor(FXWindow*w)
278 {
279 FXColor c=w->getApp()->getHiliteColor();
280 HiliteColor(FXDragCorner);
281 HiliteColor(FXFrame);
282 HiliteColor(FXMDIChild);
283 HiliteColor(FXMenuCaption);
284 HiliteColor(FXMenuSeparator);
285 HiliteColor(FXPacker);
286 HiliteColor(FXPopup);
287 HiliteColor(FXScrollBar);
288 HiliteColor(FXTable);
289 HiliteColor(FXToolBarShell);
290 }
291
292
293
294 #define BorderColor(t) SetColor(t,setBorderColor)
SetBorderColor(FXWindow * w)295 static void SetBorderColor(FXWindow*w)
296 {
297 FXColor c=w->getApp()->getBorderColor();
298 BorderColor(FXFrame);
299 BorderColor(FXMDIChild);
300 BorderColor(FXPacker);
301 BorderColor(FXPopup);
302 BorderColor(FXScrollBar);
303 BorderColor(FXTable);
304 BorderColor(FXToolBarShell);
305 }
306
307
308
309 #define BoxColor(t) SetColor(t,setBoxColor)
SetBoxColor(FXWindow * w)310 static void SetBoxColor(FXWindow*w)
311 {
312 FXColor c=w->getApp()->getBackColor();
313 BoxColor(FXCheckButton);
314 BoxColor(FXMenuCheck);
315 }
316
317
318
319 #define ArrowColor(t) SetColor(t,setArrowColor)
SetArrowColor(FXWindow * w)320 static void SetArrowColor(FXWindow*w)
321 {
322 FXColor c=w->getApp()->getForeColor();
323 ArrowColor(FXArrowButton);
324 ArrowColor(FXScrollBar);
325 }
326
327
328
329 #define CheckColor(t) SetColor(t,setCheckColor)
SetCheckColor(FXWindow * w)330 static void SetCheckColor(FXWindow*w)
331 {
332 FXColor c=w->getApp()->getForeColor();
333 CheckColor(FXCheckButton);
334 }
335
336
337
338 #define DiskColor(t) SetColor(t,setDiskColor)
SetDiskColor(FXWindow * w)339 static void SetDiskColor(FXWindow*w)
340 {
341 FXColor c=w->getApp()->getBackColor();
342 DiskColor(FXRadioButton);
343 }
344
345
346
347 #define CursorColor(t) SetColor(t,setCursorColor)
SetCursorColor(FXWindow * w)348 static void SetCursorColor(FXWindow*w)
349 {
350 FXColor c=w->getApp()->getForeColor();
351 CursorColor(FXRealSpinner);
352 CursorColor(FXSpinner);
353 CursorColor(FXText);
354 CursorColor(FXTextField);
355 }
356
357
358
init()359 void Theme::init()
360 {
361 GetColorsFromApp(&system_colors);
362 FXFont *fnt=FXApp::instance()->getNormalFont();
363 fnt->create();
364 system_font=GetActualFont(fnt);
365 current_font=system_font;
366 memcpy(&custom_colors.base,&system_colors.base,sizeof(AppColors)-sizeof(char*));
367 RegToApp();
368 }
369
370
371
done()372 void Theme::done()
373 {
374 FXApp*a=FXApp::instance();
375 a->reg().writeBoolEntry(colors_sect, "UseSystemColors",use_system_colors);
376 a->reg().writeStringEntry(colors_sect, "CurrentTheme",current_theme.text());
377 if (!use_system_colors) { AppToReg(); }
378 ApplyColorsToApp(&system_colors);
379 }
380
381
382
changed()383 FXuint Theme::changed()
384 {
385 return what_changed;
386 }
387
388
389
apply(FXWindow * win)390 void Theme::apply(FXWindow*win)
391 {
392 if (win) {
393 for (FXWindow*w=win; w; w=w->getNext()) {
394 SetBackColor(w);
395 SetBaseColor(w);
396 SetTextColor(w);
397 SetSelBackColor(w);
398 SetSelTextColor(w);
399 SetHiliteColor(w);
400 SetShadowColor(w);
401 SetBorderColor(w);
402 SetBoxColor(w);
403 SetArrowColor(w);
404 SetCheckColor(w);
405 SetDiskColor(w);
406 SetCursorColor(w);
407 w->update();
408 apply(w->getFirst());
409 }
410 }
411 }
412
413
414
415 class ThemeGUI: public FXHorizontalFrame {
416 private:
417 FXDECLARE(ThemeGUI)
ThemeGUI()418 ThemeGUI() {}
419 protected:
420 FXLabel*list_hdr;
421 FXList*list;
422 FXMatrix* mtx;
423 FXButton*font_btn;
424 FXColorWell *cw_base;
425 FXColorWell *cw_bord;
426 FXColorWell *cw_fore;
427 FXColorWell *cw_back;
428 FXColorWell *cw_self;
429 FXColorWell *cw_selb;
430 FXColorWell *cw_menf;
431 FXColorWell *cw_menb;
432 FXColorWell *cw_tipf;
433 FXColorWell *cw_tipb;
434
435 FXTabBook *demo_tabs;
436 FXTabItem *demo_tab;
437 FXVerticalFrame *demo_frame;
438 FXVerticalFrame *menuframe;
439 FXHorizontalFrame *frm_focused;
440 FXHorizontalFrame *frm_unfocus;
441 FXHorizontalFrame *demo_top_frm;
442 FXHorizontalFrame *demo_btm_frm;
443 FXGroupBox *mnu_grp;
444 FXGroupBox *tip_grp;
445 FXLabel *label1;
446 FXLabel *tip_txt;
447 FXLabel *txt_focused;
448 FXLabel *txt_unfocus;
449 FXLabel *menulabels[5];
450 FXTextField *textfield1;
451 FXSeparator *demo_sep;
452 FXSeparator *menu_sep;
453 void SetDemoColors();
454 void SetFont(const FXString &fontname);
455 void FillThemeList();
456 public:
457 ThemeGUI(FXComposite*p);
458 ~ThemeGUI();
459 long onToggleEnabled(FXObject*o, FXSelector sel, void*p);
460 long onSetGUIColor(FXObject*o, FXSelector sel, void*p);
461 long onSelectTheme(FXObject*o, FXSelector sel, void*p);
462 long onChooseFont(FXObject*o, FXSelector sel, void*p);
463 enum {
464 ID_TOGGLE_ENABLED=FXTabItem::ID_LAST,
465 ID_COLOR_BASE,
466 ID_COLOR_BORD,
467 ID_COLOR_FORE,
468 ID_COLOR_BACK,
469 ID_COLOR_SELF,
470 ID_COLOR_SELB,
471 ID_COLOR_MENF,
472 ID_COLOR_MENB,
473 ID_COLOR_TIPF,
474 ID_COLOR_TIPB,
475 ID_SELECT_THEME,
476 ID_CHOOSE_FONT,
477 ID_LAST
478 };
479 };
480
481
482
483 FXDEFMAP(ThemeGUI) ThemeTabMap[]={
484 FXMAPFUNC(SEL_COMMAND, ThemeGUI::ID_TOGGLE_ENABLED, ThemeGUI::onToggleEnabled),
485 FXMAPFUNCS(SEL_CHANGED, ThemeGUI::ID_COLOR_BASE, ThemeGUI::ID_COLOR_TIPB, ThemeGUI::onSetGUIColor),
486 FXMAPFUNCS(SEL_COMMAND, ThemeGUI::ID_COLOR_BASE, ThemeGUI::ID_COLOR_TIPB, ThemeGUI::onSetGUIColor),
487 FXMAPFUNC(SEL_COMMAND, ThemeGUI::ID_SELECT_THEME, ThemeGUI::onSelectTheme),
488 FXMAPFUNC(SEL_COMMAND, ThemeGUI::ID_CHOOSE_FONT, ThemeGUI::onChooseFont),
489 };
490
491
492 FXIMPLEMENT(ThemeGUI,FXHorizontalFrame,ThemeTabMap,ARRAYNUMBER(ThemeTabMap));
493
494
495
SetDemoColors()496 void ThemeGUI::SetDemoColors()
497 {
498 AppColors*ac=&custom_colors;
499
500 FXColor shadow=makeShadowColor(ac->base);
501 FXColor hilite=makeHiliteColor(ac->base);
502
503 demo_tabs->setBorderColor(ac->border);
504 demo_tabs->setBaseColor(ac->base);
505 demo_tabs->setBackColor(ac->base);
506 demo_tabs->setShadowColor(shadow);
507 demo_tabs->setHiliteColor(hilite);
508
509 demo_tab->setBorderColor(ac->border);
510 demo_tab->setBaseColor(ac->base);
511 demo_tab->setBackColor(ac->base);
512 demo_tab->setTextColor(ac->fore);
513 demo_tab->setShadowColor(shadow);
514 demo_tab->setHiliteColor(hilite);
515
516 demo_frame->setBorderColor(ac->border);
517 demo_frame->setBaseColor(ac->base);
518 demo_frame->setBackColor(ac->base);
519 demo_frame->setShadowColor(shadow);
520 demo_frame->setHiliteColor(hilite);
521
522 demo_top_frm->setBorderColor(ac->border);
523 demo_top_frm->setBaseColor(ac->base);
524 demo_top_frm->setBackColor(ac->base);
525 demo_top_frm->setShadowColor(shadow);
526 demo_top_frm->setHiliteColor(hilite);
527
528 demo_btm_frm->setBorderColor(ac->border);
529 demo_btm_frm->setBaseColor(ac->base);
530 demo_btm_frm->setBackColor(ac->base);
531 demo_btm_frm->setShadowColor(shadow);
532 demo_btm_frm->setHiliteColor(hilite);
533
534 menuframe->setBorderColor(ac->border);
535 menuframe->setBaseColor(ac->base);
536 menuframe->setBackColor(ac->base);
537 menuframe->setShadowColor(shadow);
538 menuframe->setHiliteColor(hilite);
539
540 mnu_grp->setBorderColor(ac->border);
541 mnu_grp->setBaseColor(ac->base);
542 mnu_grp->setBackColor(ac->base);
543 mnu_grp->setShadowColor(shadow);
544 mnu_grp->setHiliteColor(hilite);
545 mnu_grp->setTextColor(ac->fore);
546
547 tip_grp->setBorderColor(ac->border);
548 tip_grp->setBaseColor(ac->base);
549 tip_grp->setBackColor(ac->base);
550 tip_grp->setShadowColor(shadow);
551 tip_grp->setHiliteColor(hilite);
552 tip_grp->setTextColor(ac->fore);
553
554 demo_sep->setBorderColor(ac->border);
555 demo_sep->setBaseColor(ac->base);
556 demo_sep->setBackColor(ac->base);
557 demo_sep->setShadowColor(shadow);
558 demo_sep->setHiliteColor(hilite);
559
560 menu_sep->setBorderColor(ac->border);
561 menu_sep->setBaseColor(ac->base);
562 menu_sep->setBackColor(ac->base);
563 menu_sep->setShadowColor(shadow);
564 menu_sep->setHiliteColor(hilite);
565
566 frm_focused->setBorderColor(ac->border);
567 frm_focused->setBaseColor(ac->base);
568 frm_focused->setBackColor(ac->base);
569 frm_focused->setShadowColor(shadow);
570 frm_focused->setHiliteColor(hilite);
571
572 frm_unfocus->setBorderColor(ac->border);
573 frm_unfocus->setBaseColor(ac->base);
574 frm_unfocus->setBackColor(ac->base);
575 frm_unfocus->setShadowColor(shadow);
576 frm_unfocus->setHiliteColor(hilite);
577
578 label1->setBorderColor(ac->border);
579 label1->setBaseColor(ac->base);
580 label1->setBackColor(ac->base);
581 label1->setTextColor(ac->fore);
582 label1->setShadowColor(shadow);
583 label1->setHiliteColor(hilite);
584
585 txt_focused->setBorderColor(ac->border);
586 txt_focused->setBaseColor(ac->base);
587 txt_focused->setBackColor(ac->selback);
588 txt_focused->setTextColor(ac->selfore);
589 txt_focused->setShadowColor(shadow);
590 txt_focused->setHiliteColor(hilite);
591
592 txt_unfocus->setBorderColor(ac->border);
593 txt_unfocus->setBaseColor(ac->base);
594 txt_unfocus->setBackColor(ac->base);
595 txt_unfocus->setTextColor(ac->fore);
596 txt_unfocus->setShadowColor(shadow);
597 txt_unfocus->setHiliteColor(hilite);
598
599 for (FXint i=0; i<5; i++) {
600 menulabels[i]->setBorderColor(ac->border);
601 menulabels[i]->setBaseColor(ac->base);
602 menulabels[i]->setBackColor(ac->base);
603 menulabels[i]->setTextColor(ac->fore);
604 menulabels[i]->setShadowColor(shadow);
605 menulabels[i]->setHiliteColor(hilite);
606 }
607
608 menulabels[3]->setBorderColor(ac->border);
609 menulabels[3]->setBaseColor(ac->selmenuback);
610 menulabels[3]->setBackColor(ac->selmenuback);
611 menulabels[3]->setTextColor(ac->selmenutext);
612 menulabels[3]->setShadowColor(shadow);
613 menulabels[3]->setHiliteColor(hilite);
614
615 frm_focused->setBorderColor(ac->border);
616 frm_focused->setBaseColor(ac->base);
617 frm_focused->setBackColor(ac->back);
618 frm_focused->setShadowColor(shadow);
619 frm_focused->setHiliteColor(hilite);
620
621 frm_unfocus->setBorderColor(ac->border);
622 frm_unfocus->setBaseColor(ac->base);
623 frm_unfocus->setBackColor(ac->back);
624 frm_unfocus->setShadowColor(shadow);
625 frm_unfocus->setHiliteColor(hilite);
626
627 textfield1->setBorderColor(ac->border);
628 textfield1->setBackColor(ac->back);
629 textfield1->setBaseColor(ac->base);
630 textfield1->setTextColor(ac->fore);
631 textfield1->setSelTextColor(ac->selfore);
632 textfield1->setSelBackColor(ac->selback);
633 textfield1->setCursorColor(ac->fore);
634 textfield1->setShadowColor(shadow);
635 textfield1->setHiliteColor(hilite);
636
637 tip_txt->setBackColor(ac->tipback);
638 tip_txt->setTextColor(ac->tipfore);
639
640 }
641
642
643
onSelectTheme(FXObject * o,FXSelector sel,void * p)644 long ThemeGUI::onSelectTheme(FXObject*o, FXSelector sel, void*p)
645 {
646 AppColors*ac=(AppColors*)(list->getItemData((FXint)((FXival)p)));
647 cw_base->setRGBA(ac->base,true);
648 cw_bord->setRGBA(ac->border,true);
649 cw_fore->setRGBA(ac->fore,true);
650 cw_back->setRGBA(ac->back,true);
651 cw_self->setRGBA(ac->selfore,true);
652 cw_selb->setRGBA(ac->selback,true);
653 cw_menf->setRGBA(ac->selmenutext,true);
654 cw_menb->setRGBA(ac->selmenuback,true);
655 cw_tipf->setRGBA(ac->tipfore,true);
656 cw_tipb->setRGBA(ac->tipback,true);
657 if (&custom_colors!=ac) {
658 memcpy(&custom_colors.base,&ac->base,sizeof(AppColors)-sizeof(char*));
659 }
660 current_theme=ac->name;
661 SetDemoColors();
662 if (id()) {
663 what_changed |= ThemeChangedColors;
664 }
665 return 1;
666 }
667
668
669
onSetGUIColor(FXObject * o,FXSelector sel,void * p)670 long ThemeGUI::onSetGUIColor(FXObject*o, FXSelector sel, void*p)
671 {
672 FXColor c=(FXColor)((FXival)p);
673 switch (FXSELID(sel)) {
674 case ID_COLOR_BASE: {
675 custom_colors.base=c;
676 break;
677 }
678 case ID_COLOR_BORD: {
679 custom_colors.border=c;
680 break;
681 }
682 case ID_COLOR_FORE: {
683 custom_colors.fore=c;
684 break;
685 }
686 case ID_COLOR_BACK: {
687 custom_colors.back=c;
688 break;
689 }
690 case ID_COLOR_SELF: {
691 custom_colors.selfore=c;
692 break;
693 }
694 case ID_COLOR_SELB: {
695 custom_colors.selback=c;
696 break;
697 }
698 case ID_COLOR_MENF: {
699 custom_colors.selmenutext=c;
700 break;
701 }
702 case ID_COLOR_MENB: {
703 custom_colors.selmenuback=c;
704 break;
705 }
706 case ID_COLOR_TIPF: {
707 custom_colors.tipfore=c;
708 break;
709 }
710 case ID_COLOR_TIPB: {
711 custom_colors.tipback=c;
712 break;
713 }
714 }
715 // Select "User defined" theme if any colors changed
716 if ((FXSELTYPE(sel)==SEL_CHANGED) && shown()) {
717 what_changed |= ThemeChangedColors;
718 if (list->getCurrentItem()!=numthemes+1) {
719 list->setCurrentItem(numthemes+1);
720 list->selectItem(numthemes+1);
721 list->makeItemVisible(numthemes+1);
722 current_theme=list->getItem(numthemes+1)->getText();
723 }
724 }
725 SetDemoColors();
726 return 1;
727 }
728
729
730
SetFont(const FXString & fontname)731 void ThemeGUI::SetFont(const FXString &fontname)
732 {
733 if (getApp()->getNormalFont()->getFont()!=fontname) {
734 what_changed |= ThemeChangedFont;
735 getApp()->getNormalFont()->destroy();
736 getApp()->getNormalFont()->setFont(fontname);
737 getApp()->getNormalFont()->create();
738 FXint i=list->getCurrentItem();
739 list->destroy();
740 FillThemeList();
741 list->setCurrentItem(i);
742 list->makeItemVisible(i);
743 if (id()) { list->create(); }
744 recalc();
745 update();
746 layout();
747 }
748 }
749
750
751
752 #ifdef FOX_1_6
DlgGetFont(const FXFontDialog & dlg,FXString & dst)753 static void DlgGetFont(const FXFontDialog &dlg, FXString&dst)
754 {
755 FXFontDesc fd;
756 dlg.getFontSelection(fd);
757 FXFont f(FXApp::instance(),fd);
758 f.create();
759 dst=GetActualFont(&f);
760 f.destroy();
761 }
762
763
764
DlgSetFont(FXFontDialog & dlg,const FXString & src)765 static void DlgSetFont(FXFontDialog &dlg, const FXString&src)
766 {
767 FXFont f(FXApp::instance(),src);
768 f.create();
769 FXFontDesc fd;
770 f.getFontDesc(fd);
771 dlg.setFontSelection(fd);
772 f.destroy();
773 }
774 #else
775
776 # define DlgSetFont(d,f) d.setFont(f)
777 # define DlgGetFont(d,f) f=d.getFont()
778
779 #endif
780
781
782
onChooseFont(FXObject * o,FXSelector sel,void * p)783 long ThemeGUI::onChooseFont(FXObject*o, FXSelector sel, void*p)
784 {
785 FXFontDialog dlg(((FXWindow*)o)->getShell(), _("Select Font"), 0);
786 DlgSetFont(dlg,current_font);
787 if (dlg.execute(PLACEMENT_SCREEN)) {
788 DlgGetFont(dlg,current_font);
789 SetFont(current_font);
790 }
791 return 1;
792 }
793
794
795
onToggleEnabled(FXObject * o,FXSelector sel,void * p)796 long ThemeGUI::onToggleEnabled(FXObject*o, FXSelector sel, void*p)
797 {
798 use_system_colors=(bool)((FXival)p);
799 if (use_system_colors) {
800 SetFont(system_font);
801 current_font=system_font;
802 for (FXWindow*w=mtx->getFirst(); w; w=w->getNext()) {
803 w->disable();
804 }
805 font_btn->disable();
806 list->disable();
807 list_hdr->disable();
808 list->selectItem(numthemes, true);
809 list->makeItemVisible(numthemes);
810 onSelectTheme(NULL,0,(void*)(FXival)numthemes);
811 } else {
812 for (FXWindow*w=mtx->getFirst(); w; w=w->getNext()) {
813 w->enable();
814 }
815 font_btn->enable();
816 list->enable();
817 list_hdr->enable();
818 }
819 return 1;
820 }
821
822
823
FillThemeList()824 void ThemeGUI::FillThemeList()
825 {
826 list->clearItems();
827 for (FXint i=0; i<numthemes; i++) {
828 list->appendItem(ColorThemes[i].name, NULL, (void*)&ColorThemes[i]);
829 }
830 list->appendItem(system_colors.name, NULL, (void*)&system_colors);
831 list->appendItem(custom_colors.name, NULL, (void*)&custom_colors);
832 list->setNumVisible(3);
833
834 }
835
836 #define CW_STYLE COLORWELL_OPAQUEONLY|COLORWELL_NORMAL|LAYOUT_FIX_WIDTH
837
ThemeGUI(FXComposite * p)838 ThemeGUI::ThemeGUI(FXComposite*p):FXHorizontalFrame(p,FRAME_RAISED|LAYOUT_FILL) {
839 GetColorsFromApp(&custom_colors);
840 what_changed=ThemeUnchanged;
841 FXVerticalFrame* left_column=new FXVerticalFrame(this,FRAME_SUNKEN|LAYOUT_FILL);
842 FXVerticalFrame* right_column=new FXVerticalFrame(this,FRAME_SUNKEN|LAYOUT_FILL,0,0,0,0,8,8,8,8);
843 right_column->setBackColor(FXRGB(0xA0,0xC8,0xB0));
844 FXCheckButton *who_chk=new FXCheckButton(left_column,_("Let FOX manage these settings"),this,ID_TOGGLE_ENABLED);
845 list_hdr=new FXLabel(left_column,_("Preset themes:"),NULL,LAYOUT_CENTER_Y);
846 FXHorizontalFrame*list_frm=new FXHorizontalFrame(left_column,FRAME_SUNKEN|LAYOUT_FILL,0,0,0,0,0,0,0,0);
847 list=new FXList(list_frm,this,ID_SELECT_THEME,LAYOUT_FILL|LIST_BROWSESELECT);
848 FillThemeList();
849
850 mtx=new FXMatrix(left_column,3,LAYOUT_FILL|MATRIX_BY_COLUMNS,0,0,0,0,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,1,1);
851
852 new FXLabel(mtx,_("Custom Colors:"),NULL,LAYOUT_CENTER_Y);
853 new FXLabel(mtx,_("FG"),NULL,LAYOUT_CENTER_X|LAYOUT_CENTER_Y);
854 new FXLabel(mtx,_("BG"),NULL,LAYOUT_CENTER_X|LAYOUT_CENTER_Y);
855
856 new FXLabel(mtx,_("Border/Base"),NULL,LAYOUT_CENTER_Y);
857 cw_bord=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_BORD,CW_STYLE,0,0,32);
858 cw_base=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_BASE,CW_STYLE,0,0,32);
859
860 new FXLabel(mtx,_("Default"),NULL,LAYOUT_CENTER_Y);
861 cw_fore=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_FORE,CW_STYLE,0,0,32);
862 cw_back=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_BACK,CW_STYLE,0,0,32);
863
864 new FXLabel(mtx,_("Selection"),NULL,LAYOUT_CENTER_Y);
865 cw_self=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_SELF,CW_STYLE,0,0,32);
866 cw_selb=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_SELB,CW_STYLE,0,0,32);
867
868 new FXLabel(mtx,_("Active Menu"),NULL,LAYOUT_CENTER_Y);
869 cw_menf=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_MENF,CW_STYLE,0,0,32);
870 cw_menb=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_MENB,CW_STYLE,0,0,32);
871
872 new FXLabel(mtx,_("Tooltip"),NULL,LAYOUT_CENTER_Y);
873 cw_tipf=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_TIPF,CW_STYLE,0,0,32);
874 cw_tipb=new FXColorWell(mtx,FXRGB(0,0,255),this,ID_COLOR_TIPB,CW_STYLE,0,0,32);
875
876 font_btn=new FXButton(left_column," Normal &Font... ",NULL,this,ID_CHOOSE_FONT);
877
878
879 demo_tabs=new FXTabBook(right_column,NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0);
880 demo_tab=new FXTabItem(demo_tabs,_(" Preview "));
881 demo_frame=new FXVerticalFrame(demo_tabs,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_THICK|FRAME_RAISED);
882
883 textfield1=new FXTextField(demo_frame,30,NULL,0,LAYOUT_FILL_X|FRAME_THICK|FRAME_SUNKEN);
884 textfield1->setText(_("Select this text, to see selection colors"));
885
886 demo_top_frm=new FXHorizontalFrame(demo_frame,FRAME_NONE|LAYOUT_FILL,0,0,0,0,0,0,0,0);
887 frm_focused=new FXHorizontalFrame(demo_top_frm,FRAME_THICK|FRAME_SUNKEN,0,0,0,0,2,2,2,2,0,0);
888 txt_focused=new FXLabel(frm_focused,_("Selected Text (focused)"),NULL,LAYOUT_FILL_X,0,0,0,0,1,1,1,1);
889
890 label1=new FXLabel(demo_top_frm,_(" Label with Text"),NULL);
891
892 frm_unfocus=new FXHorizontalFrame(demo_frame,FRAME_THICK|FRAME_SUNKEN,0,0,0,0,2,2,2,2,0,0);
893 txt_unfocus=new FXLabel(frm_unfocus,_("Selected Text (no focus)"),NULL,LAYOUT_FILL_X,0,0,0,0,1,1,1,1);
894
895 demo_sep=new FXSeparator(demo_frame,LAYOUT_FILL_X|SEPARATOR_LINE);
896 demo_btm_frm=new FXHorizontalFrame(demo_frame,LAYOUT_FILL_X|LAYOUT_FILL_Y);
897 mnu_grp=new FXGroupBox(demo_btm_frm,_("Sample Menu"),FRAME_GROOVE|LAYOUT_FILL_Y|LAYOUT_FILL_X);
898 menuframe=new FXVerticalFrame(mnu_grp,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y,0,0,0,0,0,0,0,0,0,0);
899 menulabels[0]=new FXLabel(menuframe,_("&Open"),NULL,LABEL_NORMAL,0,0,0,0,16,4);
900 menulabels[1]=new FXLabel(menuframe,_("S&ave"),NULL,LABEL_NORMAL,0,0,0,0,16,4);
901 menu_sep=new FXSeparator(menuframe,LAYOUT_FILL_X|SEPARATOR_GROOVE);
902 menulabels[2]=new FXLabel(menuframe,_("I&mport"),NULL,LABEL_NORMAL,0,0,0,0,16,4);
903 menulabels[3]=new FXLabel(menuframe,_("Active Menu Item "),NULL,LABEL_NORMAL,0,0,0,0,16,4);
904 menulabels[4]=new FXLabel(menuframe,_("&Quit"),NULL,LABEL_NORMAL,0,0,0,0,16,4);
905
906 tip_grp=new FXGroupBox(demo_btm_frm,_("Tooltips"),FRAME_GROOVE|LAYOUT_FILL_Y|LAYOUT_FILL_X);
907 tip_txt=new FXLabel(tip_grp,_(" Sample Tooltip "),NULL,FRAME_LINE|LAYOUT_CENTER_X);
908 int i=0;
909 while (i<=numthemes+1) {
910 if (strcmp(list->getItem(i)->getText().text(),current_theme.text())==0) {
911 list->selectItem(i,true);
912 list->setCurrentItem(i,true);
913 list->makeItemVisible(i);
914 onSelectTheme(NULL,0,(void*)((FXival)i));
915 break;
916 }
917 i++;
918 }
919 who_chk->setCheck(use_system_colors,true);
920 }
921
922
~ThemeGUI()923 ThemeGUI::~ThemeGUI()
924 {
925 ApplyColorsToApp(&custom_colors);
926 }
927
928
929
MakeThemeGUI(FXComposite * o)930 FXHorizontalFrame* Theme::MakeThemeGUI(FXComposite*o)
931 {
932 return (FXHorizontalFrame*)(new ThemeGUI(o));
933 }
934
935