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