1{$ifdef nnnn}begin end;{$endif}
2
3procedure DoApplyThemeToCustomDialog(F: TFormDummy);
4var
5  C: TComponent;
6  i: integer;
7begin
8  for i:= 0 to F.ComponentCount-1 do
9  begin
10    C:= F.Components[i];
11
12    {
13    if C is TATListbox then
14      if (C as TATListbox).ThemedColors then
15        DoApplyThemeToListbox(C as ATListbox.TATListbox);
16        }
17
18    if C is TATSynEdit then
19      if TATSynEdit(C).OptThemed then
20        EditorApplyTheme(TATSynEdit(C));
21
22    if C is TAppTreeContainer then
23      if TAppTreeContainer(C).Themed then
24        DoApplyThemeToTreeview(TAppTreeContainer(C).Tree, true, false);
25
26    if C is TATFlatToolbar then
27      if TATFlatToolbar(C).Themed then
28        DoApplyThemeToToolbar(TATFlatToolbar(C));
29  end;
30end;
31
32
33procedure TfmMain.DoApplyThemeToGroups(G: TATGroups);
34begin
35  G.SetTabOption(tabColorText, GetAppColor(apclTabFont));
36  G.SetTabOption(tabColorTextActive, GetAppColor(apclTabFontActive));
37  G.SetTabOption(tabColorTextModified, GetAppColor(apclTabFontMod));
38  G.SetTabOption(tabColorBg, GetAppColor(apclTabBg));
39  G.SetTabOption(tabColorBgActive, GetAppColor(apclTabActive));
40  G.SetTabOption(tabColorBgPassive, GetAppColor(apclTabPassive));
41  G.SetTabOption(tabColorBgPassiveOver, GetAppColor(apclTabOver));
42  G.SetTabOption(tabColorBorderActive, GetAppColor(apclTabBorderActive));
43  G.SetTabOption(tabColorBorderPassive, GetAppColor(apclTabBorderPassive));
44  G.SetTabOption(tabColorSeparator, GetAppColor(apclTabBorderActive));
45  G.SetTabOption(tabColorArrow, GetAppColor(apclTabArrow));
46  G.SetTabOption(tabColorArrowOver, GetAppColor(apclTabArrowOver));
47  G.SetTabOption(tabColorCloseBg, GetAppColor(apclTabCloseBg));
48  G.SetTabOption(tabColorCloseBgOver, GetAppColor(apclTabCloseBgOver));
49  G.SetTabOption(tabColorCloseBorderOver, GetAppColor(apclTabCloseBorderOver));
50  G.SetTabOption(tabColorCloseX, GetAppColor(apclTabCloseX));
51  G.SetTabOption(tabColorCloseXOver, GetAppColor(apclTabCloseXOver));
52  G.SetTabOption(tabColorActiveMark, GetAppColor(apclTabActiveMark));
53  G.SetTabOption(tabColorSpecMarks, GetAppColor(apclTabMarks));
54  G.Invalidate;
55end;
56
57procedure TfmMain.DoApplyTheme;
58var
59  id: TAppPanelId;
60  NColor: TColor;
61  i: integer;
62begin
63  with ATScrollbarTheme do
64  begin
65    ColorBG:= GetAppColor(apclScrollBack);
66    ColorBorder:= ColorBG;
67    ColorThumbBorder:= GetAppColor(apclScrollRect);
68    ColorThumbFill:= GetAppColor(apclScrollFill);
69    ColorThumbFillOver:= ColorThumbFill;
70    ColorThumbFillPressed:= ColorThumbFill;
71    ColorThumbDecor:= ColorThumbBorder;
72    ColorArrowBorder:= ColorBG;
73    ColorArrowFill:= ColorBG;
74    ColorArrowFillOver:= ColorArrowFill;
75    ColorArrowFillPressed:= ColorArrowFill;
76    ColorArrowSign:= GetAppColor(apclScrollArrow);
77    ColorScrolled:= GetAppColor(apclScrollScrolled);
78  end;
79
80  EditorApplyTheme(fmOutput.Ed);
81  EditorApplyTheme(fmValidate.Ed);
82
83  EditorApplyTheme(CodeTreeFilterInput);
84  if Assigned(fmConsole) then
85  begin
86    EditorApplyTheme(fmConsole.EdInput);
87    EditorApplyTheme(fmConsole.EdMemo);
88    fmConsole.Invalidate;
89  end;
90
91  ToolbarMain.Color:= GetAppColor(apclTabBg);
92  Self.Color:= ToolbarMain.Color;
93
94  PanelCodeTreeTop.Color:= ToolbarMain.Color;
95  ToolbarSideTop.Color:= GetAppColor(apclSideBg);
96  ToolbarSideLow.Color:= ToolbarSideTop.Color;
97  ToolbarSideMid.Color:= ToolbarSideTop.Color;
98
99  //floating side-panel and bottom-panel
100  for id in TAppPanelId do
101    if id<>cPaneNone then
102      with AppPanels[id] do
103      begin
104        PanelTitle.Color:= ToolbarMain.Color;
105        PanelTitle.Font.Color:= GetAppColor(apclTabFont);
106        Splitter.Color:= GetAppColor(apclSplitMain);
107        Splitter.Invalidate;
108        if Assigned(FormFloat) then
109          FormFloat.Invalidate;
110      end;
111
112  NColor:= GetAppColor(apclStatusBg);
113  if NColor=clNone then
114    NColor:= GetAppColor(apclTabBg);
115  Status.Color:= NColor;
116
117  Status.ColorBorderTop:= GetAppColor(apclButtonBorderPassive);
118  Status.ColorBorderR:= GetAppColor(apclButtonBorderPassive);
119
120  ATFlatTheme.ColorFont:= GetAppColor(apclButtonFont);
121  ATFlatTheme.ColorFontDisabled:= GetAppColor(apclButtonFontDisabled);
122  ATFlatTheme.ColorFontOverlay:= GetAppColor(apclSideBadgeFont);
123  ATFlatTheme.ColorBgPassive:= GetAppColor(apclButtonBgPassive);
124  ATFlatTheme.ColorBgOver:= GetAppColor(apclButtonBgOver);
125  ATFlatTheme.ColorBgChecked:= GetAppColor(apclButtonBgChecked);
126  ATFlatTheme.ColorBgDisabled:= GetAppColor(apclButtonBgDisabled);
127  ATFlatTheme.ColorBorderPassive:= GetAppColor(apclButtonBorderPassive);
128  ATFlatTheme.ColorArrows:= GetAppColor(apclTabArrow);
129  ATFlatTheme.ColorArrowsOver:= GetAppColor(apclTabArrowOver);
130  ATFlatTheme.ColorSeparators:= GetAppColor(apclTabBorderActive);
131  ATFlatTheme.ColorBorderOver:= GetAppColor(apclButtonBorderOver);
132  ATFlatTheme.ColorBorderFocused:= GetAppColor(apclButtonBorderFocused);
133  ATFlatTheme.ColorFontListbox:= GetAppColor(apclListFont);
134  ATFlatTheme.ColorFontListboxSel:= GetAppColor(apclListSelFont);
135  ATFlatTheme.ColorFontListboxHeader:= GetAppColor(apclListFont);
136  ATFlatTheme.ColorBgListbox:= GetAppColor(apclListBg);
137  ATFlatTheme.ColorBgListboxSel:= GetAppColor(apclListSelBg);
138  ATFlatTheme.ColorBgListboxHottrack:= ColorBlendHalf(ATFlatTheme.ColorBgListbox, ATFlatTheme.ColorBgListboxSel);
139  ATFlatTheme.ColorBgListboxHeader:= GetAppColor(apclButtonBgDisabled);
140  ATFlatTheme.ColorBgOverlay:= GetAppColor(apclSideBadgeBg);
141  //maybe use border colors from editor, not from buttons?
142  ATFlatTheme.ColorListboxBorderPassive:= GetAppColor(apclEdBorder);
143  ATFlatTheme.ColorListboxBorderFocused:= GetAppColor(apclEdBorderFocused);
144  //ATFlatTheme.ColorListboxBorderPassive:= GetAppColor(apclButtonBorderPassive);
145  //ATFlatTheme.ColorListboxBorderFocused:= GetAppColor(apclButtonBorderFocused);
146
147  UpdateThemeStatusbar;
148
149  AppApiFlatTheme:= ATFlatTheme;
150  AppApiFlatTheme.ColorBgListbox:= GetAppColor(apclTreeBg);
151  AppApiFlatTheme.ColorBgListboxSel:= GetAppColor(apclTreeSelBg);
152  AppApiFlatTheme.ColorFontListbox:= GetAppColor(apclTreeFont);
153  AppApiFlatTheme.ColorFontListboxSel:= GetAppColor(apclTreeSelFont);
154
155  DoApplyThemeToGroups(Groups);
156  if FloatGroups then
157  begin
158    DoApplyThemeToGroups(GroupsF1);
159    DoApplyThemeToGroups(GroupsF2);
160    DoApplyThemeToGroups(GroupsF3);
161  end;
162
163  if Assigned(fmFind) then
164  begin
165    fmFind.Color:= GetAppColor(apclTabBg);
166    EditorApplyTheme(fmFind.edFind);
167    EditorApplyTheme(fmFind.edRep);
168    fmFind.Invalidate;
169  end;
170
171  DoApplyThemeToTreeview(CodeTree.Tree, true, true);
172  CodeTree.Invalidate;
173
174  //proc_sidepanel_add_dialog
175  for i:= 0 to CustomDialogs.Count-1 do
176    DoApplyThemeToCustomDialog(TFormDummy(CustomDialogs[i]));
177
178  //apply AppTheme to all frames
179  DoApplyLexerStylesMapsToFrames(true);
180
181  Groups.SplitterColor:= GetAppColor(apclSplitGroups);
182
183  CompletionOps.ColorFontPrefix:= GetAppColor(apclListCompletePrefix);
184  CompletionOps.ColorFontParams:= GetAppColor(apclListCompleteParams);
185
186  DoApplyTheme_ThemedMainMenu;
187end;
188
189
190procedure TfmMain.DoApplyTheme_ThemedMainMenu;
191{$ifdef windows}
192var
193  NColor: TColor;
194{$endif}
195begin
196  {$ifdef windows}
197  MenuStylerTheme.FontName:= UiOps.ThemedMainMenuFontName;
198  MenuStylerTheme.FontSize:= UiOps.ThemedMainMenuFontSize;
199
200  NColor:= GetAppColor(apclMenuBg);
201  if NColor=clNone then
202    NColor:= GetAppColor(apclTabBg);
203  MenuStylerTheme.ColorBk:= NColor;
204
205  NColor:= GetAppColor(apclMenuSelBg);
206  if NColor=clNone then
207    NColor:= GetAppColor(apclTabOver);
208  MenuStylerTheme.ColorBkSelected:= NColor;
209
210  NColor:= GetAppColor(apclMenuFont);
211  if NColor=clNone then
212    NColor:= GetAppColor(apclTabFont);
213  MenuStylerTheme.ColorFont:= NColor;
214
215  NColor:= GetAppColor(apclMenuFontDisabled);
216  if NColor=clNone then
217    NColor:= GetAppColor(apclTabBorderPassive);
218  MenuStylerTheme.ColorFontDisabled:= NColor;
219
220  NColor:= GetAppColor(apclMenuFontHotkey);
221  if NColor=clNone then
222    NColor:= GetAppColor(apclMenuFont);
223  if NColor=clNone then
224    NColor:= GetAppColor(apclTabFontMod);
225  MenuStylerTheme.ColorFontShortcut:= NColor;
226
227  MenuStylerTheme.CharSubmenu:= '>'; //old Win don't have triangle char in default font
228  UpdateMenuTheming_MainMenu(true);
229  {$endif}
230end;
231
232procedure TfmMain.DoDialogMenuThemes_ThemeUiSelect(const AStr: string);
233begin
234  ThemeUi:= AStr;
235end;
236
237procedure TfmMain.DoDialogMenuThemes_ThemeSyntaxSelect(const AStr: string);
238begin
239  ThemeSyntax:= AStr;
240end;
241
242procedure TfmMain.DoDialogMenuThemes;
243var
244  Form: TfmChooseTheme;
245  OldThemeUi, OldThemeSyntax: string;
246begin
247  Form:= TfmChooseTheme.Create(Self);
248  try
249    OldThemeUi:= UiOps.ThemeUi;
250    OldThemeSyntax:= UiOps.ThemeSyntax;
251    Form.ThemeUiSetter:= @DoDialogMenuThemes_ThemeUiSelect;
252    Form.ThemeSyntaxSetter:= @DoDialogMenuThemes_ThemeSyntaxSelect;
253
254    if Form.ShowModal=mrOK then
255      DoOps_SaveThemes
256    else
257    begin
258      ThemeUi:= OldThemeUi;
259      ThemeSyntax:= OldThemeSyntax;
260    end;
261  finally
262    Form.Free;
263  end;
264end;
265
266procedure TfmMain.SetThemeUi(const AValue: string);
267var
268  SName: string;
269begin
270  UiOps.ThemeUi:= AValue;
271
272  if UiOps.ThemeUi='' then
273  begin
274    SName:= UiOps.ThemeSyntax;
275    AppThemeInit(AppTheme); //resets UI+Syntax
276    if SName<>'' then
277      SetThemeSyntax(SName);
278  end
279  else
280    AppThemeLoadFromFile(
281      AppDir_DataThemes+DirectorySeparator+UiOps.ThemeUi+AppExtensionThemeUi,
282      AppTheme,
283      true
284      );
285
286  DoClearLexersAskedList;
287  DoApplyTheme;
288
289  DoPyEvent_AppState(APPSTATE_THEME_UI);
290end;
291
292procedure TfmMain.SetThemeSyntax(const AValue: string);
293var
294  SName: string;
295begin
296  UiOps.ThemeSyntax:= AValue;
297
298  if UiOps.ThemeSyntax='' then
299  begin
300    SName:= UiOps.ThemeUi;
301    AppThemeInit(AppTheme); //resets UI+Syntax
302    if SName<>'' then
303      SetThemeUi(SName);
304  end
305  else
306    AppThemeLoadFromFile(
307      AppDir_DataThemes+DirectorySeparator+UiOps.ThemeSyntax+AppExtensionThemeSyntax,
308      AppTheme,
309      false
310      );
311
312  DoClearLexersAskedList;
313  DoApplyTheme;
314
315  DoPyEvent_AppState(APPSTATE_THEME_SYNTAX);
316end;
317
318
319function TfmMain.IsThemeNameExist(const AName: string; AThemeUI: boolean): boolean;
320var
321  Ext: string;
322begin
323  if AThemeUI then
324    Ext:= AppExtensionThemeUi
325  else
326    Ext:= AppExtensionThemeSyntax;
327
328  Result:= FileExists(AppDir_DataThemes+DirectorySeparator+AName+Ext);
329end;
330
331procedure TfmMain.mnuEditClick(Sender: TObject);
332var
333  Ed: TATSynEdit;
334  bSel: boolean;
335begin
336  Ed:= CurrentEditor;
337  if Ed=nil then exit;
338
339  bSel:= Ed.Carets.IsSelection;
340
341  if Assigned(mnuEditUndo) then
342    mnuEditUndo.Enabled:= not Ed.Strings.UndoEmpty;
343
344  if Assigned(mnuEditRedo) then
345    mnuEditRedo.Enabled:= not Ed.Strings.RedoEmpty;
346
347  if Assigned(mnuEditPaste) then
348    mnuEditPaste.Enabled:= Clipboard.HasFormat(CF_Text);
349
350  if Assigned(mnuEditCopy) then
351    mnuEditCopy.Enabled:= Ed.OptCopyLinesIfNoSel or bSel;
352
353  if Assigned(mnuEditCut) then
354    mnuEditCut.Enabled:= Ed.OptCutLinesIfNoSel or bSel;
355
356  if Assigned(mnuEditDel) then
357    mnuEditDel.Enabled:= bSel;
358
359  if Assigned(mnuEditCopyAppend) then
360    mnuEditCopyAppend.Enabled:= bSel;
361end;
362
363procedure TfmMain.DoDialogTheme(AThemeUI: boolean);
364var
365  Str, StrName, StrExt: string;
366begin
367  if AThemeUI then
368  begin
369    StrName:= UiOps.ThemeUi;
370    StrExt:= AppExtensionThemeUi;
371  end
372  else
373  begin
374    if not UiOps.LexerThemes then
375      MsgBox(msgStatusSyntaxThemesOff, MB_OK or MB_ICONWARNING);
376
377    StrName:= UiOps.ThemeSyntax;
378    StrExt:= AppExtensionThemeSyntax;
379  end;
380
381  if DoDialogConfigTheme(AppTheme, AThemeUI) then
382  begin
383    DoApplyTheme;
384
385    if Msgbox(msgConfirmSaveColorsToFile, MB_OKCANCEL or MB_ICONQUESTION)=ID_OK then
386    begin
387      Str:= Trim(InputBox(msgTitle, msgThemeName, StrName));
388      if Str='' then exit;
389      Str:= AppDir_DataThemes+DirectorySeparator+Str+StrExt;
390
391      AppThemeSaveToFile(Str, AppTheme, AThemeUI);
392    end;
393
394    if AThemeUI then
395      DoPyEvent_AppState(APPSTATE_THEME_UI)
396    else
397      DoPyEvent_AppState(APPSTATE_THEME_SYNTAX)
398  end;
399end;
400
401function TfmMain.DoDialogConfigTheme(var AData: TAppTheme; AThemeUI: boolean): boolean;
402var
403  Form: TfmColorSetup;
404begin
405  Form:= TfmColorSetup.Create(nil);
406  try
407    Form.PanelUi.Visible:= AThemeUI;
408    Form.PanelSyntax.Visible:= not AThemeUI;
409
410    Form.OnApply:= @FormColorsApply;
411    Form.Data:= AData;
412    Result:= Form.ShowModal=mrOk;
413
414    if Result then
415    begin
416      AData:= Form.Data;
417      DoApplyLexerStylesMapsToFrames(false);
418    end;
419  finally
420    FreeAndNil(Form);
421  end;
422end;
423
424
425