source: trunk/Core.pas

Last change on this file was 184, checked in by chronos, 6 months ago
  • Fixed: Data directories detection on Linux.
File size: 10.3 KB
Line 
1unit Core;
2
3interface
4
5uses
6 Classes, SysUtils, FileUtil, ApplicationInfo, LastOpenedList, Project,
7 Translator, Target, RegistryEx, Registry, Graphics, Controls, ScaleDPI,
8 PersistentForm, Theme, BFTarget, Forms;
9
10type
11
12 { TCore }
13
14 TCore = class(TDataModule)
15 ApplicationInfo: TApplicationInfo;
16 Translator: TTranslator;
17 ImageListMain: TImageList;
18 LastOpenedList: TLastOpenedList;
19 PersistentForm1: TPersistentForm;
20 ScaleDPI1: TScaleDPI;
21 ThemeManager: TThemeManager;
22 procedure DataModuleCreate(Sender: TObject);
23 procedure DataModuleDestroy(Sender: TObject);
24 procedure TranslatorTranslate(Sender: TObject);
25 private
26 FOnCurrentTargetChange: TNotifyEvent;
27 FOnTargetChangeState: TNotifyEvent;
28 FOnTargetLog: TLogEvent;
29 FormMain: TForm;
30 FCurrentTarget: TTarget;
31 StoredDimension: TControlDimension;
32 RecentFileRegistryContext: TRegistryContext;
33 procedure InitTargets;
34 procedure SetCurrentTarget(AValue: TTarget);
35 procedure ScaleDPI;
36 procedure TargetChangeStateExecute(Sender: TObject);
37 procedure TargetLogExecute(Lines: TStrings);
38 procedure TargetMessageExecute(Text: string);
39 public
40 BaseDir: string;
41 ExamplesDir: string;
42 Project: TProject;
43 Targets: TTargets;
44 Messages: TMessages;
45 OpenProjectOnStart: Boolean;
46 OptimizationLevel: TCompilerOptimization;
47 CellSize: Integer;
48 MemorySize: Integer;
49 DebugEnabled: Boolean;
50 OptionsFormTabIndex: Integer;
51 Optimizations: TOptimizations;
52 ShowToolbar: Boolean;
53 procedure Init;
54 procedure AddItemToLastOpenedList(FileName: string);
55 procedure LoadFromRegistry(Context: TRegistryContext);
56 procedure SaveToRegistry(Context: TRegistryContext);
57 property CurrentTarget: TTarget read FCurrentTarget write SetCurrentTarget;
58 property OnTargetLog: TLogEvent read FOnTargetLog write FOnTargetLog;
59 property OnTargetChangeState: TNotifyEvent read FOnTargetChangeState
60 write FOnTargetChangeState;
61 property OnCurrentTargetChange: TNotifyEvent read FOnCurrentTargetChange
62 write FOnCurrentTargetChange;
63 end;
64
65var
66 Core: TCore;
67
68const
69 ExamplesDirName = 'Examples';
70 LanguagesDirName = 'Languages';
71
72
73implementation
74
75{$R *.lfm}
76
77uses
78 LazFileUtils, FormMain, FormEx,
79 // Targets
80 TargetInterpreter, TargetFPC, TargetJava, TargetDelphi, TargetJavascript,
81 TargetPHP, TargetC, TargetPython, TargetCSharp, TargetRust, TargetRuby,
82 TargetLua;
83
84const
85 RecentFilesRegKey = 'RecentFiles';
86
87{ TCore }
88
89procedure TCore.AddItemToLastOpenedList(FileName: string);
90begin
91 with LastOpenedList do begin
92 LoadFromRegistry(RecentFileRegistryContext);
93 AddItem(FileName);
94 SaveToRegistry(RecentFileRegistryContext);
95 end;
96end;
97
98procedure TCore.DataModuleCreate(Sender: TObject);
99{$IFDEF UNIX}
100const
101 LinuxDataDir = '../share/LazFuck';
102var
103 NewDir: string;
104{$ENDIF}
105begin
106 BaseDir := ExcludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)));
107 Translator.POFilesFolder := BaseDir + DirectorySeparator + LanguagesDirName;
108 ExamplesDir := BaseDir + DirectorySeparator + ExamplesDirName;
109
110 {$IFDEF UNIX}
111 // If installed in Linux system then use installation directory for po files
112 NewDir := ExpandFileName(BaseDir + DirectorySeparator + LinuxDataDir +
113 DirectorySeparator + LanguagesDirName);
114 if not DirectoryExists(Translator.POFilesFolder) and DirectoryExists(NewDir) then
115 Translator.POFilesFolder := NewDir;
116
117 // If installed in Linux system then use installation directory for po files
118 NewDir := ExpandFileName(BaseDir + DirectorySeparator + LinuxDataDir +
119 DirectorySeparator + ExamplesDirName);
120 if not DirectoryExists(ExamplesDir) and DirectoryExists(NewDir) then
121 ExamplesDir := NewDir;
122 {$ENDIF}
123
124 Project := TProject.Create;
125 Targets := TTargets.Create;
126 Messages := TMessages.Create;
127
128 StoredDimension := TControlDimension.Create;
129 InitTargets;
130 RecentFileRegistryContext := TRegistryContext.Create(ApplicationInfo.RegistryRoot,
131 ApplicationInfo.RegistryKey + '\' + RecentFilesRegKey);
132 LoadFromRegistry(Core.ApplicationInfo.GetRegistryContext);
133
134 TFormEx.ScaleDPI := ScaleDPI1;
135 TFormEx.Translator := Translator;
136 TFormEx.ThemeManager := ThemeManager;
137 TFormEx.PersistentForm := PersistentForm1;
138
139 Application.CreateForm(TFormMain, FormMain);
140 FormMain.Show;
141end;
142
143procedure TCore.DataModuleDestroy(Sender: TObject);
144begin
145 SaveToRegistry(Core.ApplicationInfo.GetRegistryContext);
146 FreeAndNil(Messages);
147 FreeAndNil(Targets);
148 FreeAndNil(Project);
149 FreeAndNil(StoredDimension);
150end;
151
152procedure TCore.TranslatorTranslate(Sender: TObject);
153begin
154 Target.UpdateTranslation;
155end;
156
157procedure TCore.InitTargets;
158var
159 I: Integer;
160begin
161 with Targets do begin
162 Clear;
163 Add(TTargetInterpreter.Create);
164 Add(TTargetC.Create);
165 Add(TTargetCSharp.Create);
166 Add(TTargetDelphi.Create);
167 Add(TTargetFPC.Create);
168 Add(TTargetJava.Create);
169 Add(TTargetJavascript.Create);
170 Add(TTargetLua.Create);
171 Add(TTargetPHP.Create);
172 Add(TTargetPython.Create);
173 Add(TTargetRuby.Create);
174 Add(TTargetRust.Create);
175 for I := 0 to Count - 1 do
176 Items[I].OnMessage := TargetMessageExecute;
177 end;
178end;
179
180procedure TCore.LoadFromRegistry(Context: TRegistryContext);
181var
182 TargetName: string;
183begin
184 with TRegistryEx.Create do
185 try
186 CurrentContext := Context;
187 Optimizations.AddSub := ReadBoolWithDefault('OptimizationAddSubEnabled', True);
188 Optimizations.SetZero := ReadBoolWithDefault('OptimizationSetZeroEnabled', True);
189 Optimizations.Merge := ReadBoolWithDefault('OptimizationMerge', True);
190 Optimizations.CopyMultiply := ReadBoolWithDefault('OptimizationCopyMultiplyEnabled', True);
191 Optimizations.RelativeIndexes := ReadBoolWithDefault('OptimizationRelativeIndexesEnabled', True);
192 OpenProjectOnStart := ReadBoolWithDefault('OpenProjectOnStart', True);
193 if ValueExists('LanguageCode') then
194 Translator.Language := Translator.Languages.SearchByCode(ReadStringWithDefault('LanguageCode', ''))
195 else Translator.Language := Translator.Languages.SearchByCode('');
196 ScaleDPI1.DPI := Point(ReadIntegerWithDefault('DPIX', 96),
197 ReadIntegerWithDefault('DPIY', 96));
198 ScaleDPI1.AutoDetect := ReadBoolWithDefault('DPIAuto', True);
199 ShowToolbar := ReadBoolWithDefault('ShowToolbar', True);
200 OptimizationLevel := TCompilerOptimization(ReadIntegerWithDefault('OptimizationLevel', Integer(coNormal)));
201 MemorySize := ReadIntegerWithDefault('MemorySize', 30000);
202 CellSize := ReadIntegerWithDefault('CellSize', 256);
203 DebugEnabled := ReadBoolWithDefault('DebugEnabled', True);
204 OptionsFormTabIndex := ReadIntegerWithDefault('OptionsFormTabIndex', 0);
205 ThemeManager.Theme := ThemeManager.Themes.FindByName(ReadStringWithDefault('Theme', 'System'));
206
207 TargetName := ReadStringWithDefault('TargetName', 'Interpreter');
208 CurrentTarget := Targets.FindByName(TargetName);
209 if not Assigned(CurrentTarget) then
210 CurrentTarget := TTarget(Core.Targets[0]);
211 finally
212 Free;
213 end;
214 Targets.LoadFromRegistry(TRegistryContext.Create(Context.RootKey, Context.Key + '\Compiler'));
215 LastOpenedList.LoadFromRegistry(RecentFileRegistryContext);
216 PersistentForm1.RegistryContext := Context;
217end;
218
219procedure TCore.SaveToRegistry(Context: TRegistryContext);
220begin
221 Targets.SaveToRegistry(TRegistryContext.Create(Context.RootKey, Context.Key + '\Compiler'));
222 with TRegistryEx.Create do
223 try
224 CurrentContext := Context;
225 WriteString('TargetName', Core.CurrentTarget.Name);
226 WriteBool('OptimizationAddSubEnabled', Optimizations.AddSub);
227 WriteBool('OptimizationSetZeroEnabled', Optimizations.SetZero);
228 WriteBool('OptimizationMerge', Optimizations.Merge);
229 WriteBool('OptimizationCopyMultiplyEnabled', Optimizations.CopyMultiply);
230 WriteBool('OptimizationRelativeIndexesEnabled', Optimizations.RelativeIndexes);
231 WriteBool('OpenProjectOnStart', OpenProjectOnStart);
232 WriteBool('DPIAuto', ScaleDPI1.AutoDetect);
233 WriteBool('ShowToolbar', ShowToolbar);
234 WriteInteger('DPIX', ScaleDPI1.DPI.X);
235 WriteInteger('DPIY', ScaleDPI1.DPI.Y);
236 WriteInteger('OptimizationLevel', Integer(OptimizationLevel));
237 WriteInteger('MemorySize', MemorySize);
238 WriteInteger('CellSize', CellSize);
239 WriteBool('DebugEnabled', DebugEnabled);
240 WriteInteger('OptionsFormTabIndex', OptionsFormTabIndex);
241 if Assigned(Translator.Language) and (Translator.Language.Code <> '') then
242 WriteString('LanguageCode', Translator.Language.Code)
243 else DeleteValue('LanguageCode');
244 WriteString('Theme', ThemeManager.Theme.Name);
245 finally
246 Free;
247 end;
248end;
249
250procedure TCore.SetCurrentTarget(AValue: TTarget);
251var
252 I: Integer;
253begin
254 if FCurrentTarget = AValue then Exit;
255 FCurrentTarget := AValue;
256 for I := 0 to Targets.Count - 1 do
257 Targets[I].OnChangeState := nil;
258 if Assigned(FCurrentTarget) then begin
259 FCurrentTarget.OnChangeState := TargetChangeStateExecute;
260 FCurrentTarget.OnLog := TargetLogExecute;
261 FCurrentTarget.OptimizationLevel := OptimizationLevel;
262 if FCurrentTarget is TBFTarget then begin
263 TBFTarget(FCurrentTarget).MemorySize := MemorySize;
264 TBFTarget(FCurrentTarget).CellSize := CellSize;
265 end;
266 end;
267 if Assigned(OnCurrentTargetChange) then
268 FOnCurrentTargetChange(Self);
269end;
270
271procedure TCore.TargetChangeStateExecute(Sender: TObject);
272begin
273 if Assigned(FOnTargetChangeState) then
274 FOnTargetChangeState(Sender);
275end;
276
277procedure TCore.TargetLogExecute(Lines: TStrings);
278begin
279end;
280
281procedure TCore.ScaleDPI;
282var
283 I: Integer;
284begin
285 with ScaleDPI1 do begin
286 //DesignDPI := Point(144, 144);
287 if (DesignDPI.X <> DPI.X) or (DesignDPI.Y <> DPI.Y) then begin
288 //ApplyToAll(DesignDPI);
289 {for I := 0 to Screen.FormCount - 1 do
290 if (Screen.Forms[I].WindowState = wsNormal) or
291 (Screen.Forms[I].WindowState = wsMinimized) then begin
292 StoreDimensions(Screen.Forms[I], StoredDimension);
293 ScaleDimensions(Screen.Forms[I], StoredDimension);
294 end;
295 }
296 ScaleImageList(ImageListMain, DesignDPI);
297 end;
298 end;
299end;
300
301procedure TCore.TargetMessageExecute(Text: string);
302begin
303 Messages.AddMessage(Text);
304end;
305
306procedure TCore.Init;
307begin
308 ScaleDPI;
309 Translator.Translate;
310end;
311
312end.
313
Note: See TracBrowser for help on using the repository browser.