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