source: trunk/Forms/FormMain.pas

Last change on this file was 184, checked in by chronos, 6 months ago
  • Fixed: Data directories detection on Linux.
File size: 25.3 KB
Line 
1unit FormMain;
2
3interface
4
5uses
6 Classes, SysUtils, FileUtil, Forms, Controls, FormCPU, FormInput,
7 Graphics, Dialogs, Menus, ActnList, ComCtrls, ExtCtrls, Target,
8 LazFileUtils, FormOptions, FormMessages, FormTargets, FormCompileMultiple,
9 FormOutput, FormMemory, FormSourceCode, FormTargetCode, FormLog, FormEx,
10 FormKeyShortcuts;
11
12type
13
14 { TFormMain }
15
16 TFormMain = class(TFormEx)
17 AKeyShortcuts: TAction;
18 AFullScreen: TAction;
19 AProgramCompileMultiple: TAction;
20 AViewLog: TAction;
21 AProgramShowExecutionPoint: TAction;
22 AShowSourcePosition: TAction;
23 AShowTargetPosition: TAction;
24 AProgramCompile: TAction;
25 AAbout: TAction;
26 ABreakpointToggle: TAction;
27 AViewCompilers: TAction;
28 AOptions: TAction;
29 AProgramStepOut: TAction;
30 AProgramRunToCursor: TAction;
31 AProgramStepOver: TAction;
32 AProgramStepInto: TAction;
33 AProgramPause: TAction;
34 AProgramStop: TAction;
35 AHelp: TAction;
36 AProgramRun: TAction;
37 AProjectNew: TAction;
38 AExit: TAction;
39 AProjectSaveAs: TAction;
40 AProjectClose: TAction;
41 AProjectSave: TAction;
42 AProjectOpen: TAction;
43 ActionList1: TActionList;
44 MainMenu1: TMainMenu;
45 MenuItem1: TMenuItem;
46 MenuItem10: TMenuItem;
47 MenuItem11: TMenuItem;
48 MenuItem12: TMenuItem;
49 MenuItem13: TMenuItem;
50 MenuItem14: TMenuItem;
51 MenuItem15: TMenuItem;
52 MenuItem16: TMenuItem;
53 MenuItem17: TMenuItem;
54 MenuItem18: TMenuItem;
55 MenuItem19: TMenuItem;
56 MenuItem2: TMenuItem;
57 MenuItem20: TMenuItem;
58 MenuItem21: TMenuItem;
59 MenuItem22: TMenuItem;
60 MenuItem23: TMenuItem;
61 MenuItem24: TMenuItem;
62 MenuItem25: TMenuItem;
63 MenuItem26: TMenuItem;
64 MenuItem27: TMenuItem;
65 MenuItem28: TMenuItem;
66 MenuItem29: TMenuItem;
67 MenuItem30: TMenuItem;
68 MenuItem31: TMenuItem;
69 MenuItem32: TMenuItem;
70 MenuItem33: TMenuItem;
71 MenuItem34: TMenuItem;
72 MenuItem35: TMenuItem;
73 MenuItemViewToolbar: TMenuItem;
74 MenuItemOpenRecent: TMenuItem;
75 MenuItemTarget: TMenuItem;
76 MenuItem3: TMenuItem;
77 MenuItem4: TMenuItem;
78 MenuItem5: TMenuItem;
79 MenuItem6: TMenuItem;
80 MenuItem7: TMenuItem;
81 MenuItem8: TMenuItem;
82 MenuItem9: TMenuItem;
83 OpenDialog1: TOpenDialog;
84 PageControlMain: TPageControl;
85 PageControlRight: TPageControl;
86 PageControlBottom: TPageControl;
87 PanelLeft: TPanel;
88 PanelMemory: TPanel;
89 PanelCPU: TPanel;
90 PanelOutput: TPanel;
91 PanelInput: TPanel;
92 PopupMenuTargets: TPopupMenu;
93 PopupMenuRecentFiles: TPopupMenu;
94 SaveDialog1: TSaveDialog;
95 Splitter1: TSplitter;
96 Splitter2: TSplitter;
97 Splitter3: TSplitter;
98 Splitter4: TSplitter;
99 Splitter5: TSplitter;
100 StatusBarMain: TStatusBar;
101 TabSheetMessages: TTabSheet;
102 TabSheetDebug: TTabSheet;
103 TabSheetSource: TTabSheet;
104 TabSheetTarget: TTabSheet;
105 TimerRefresh: TTimer;
106 ToolBarMain: TToolBar;
107 ToolButton1: TToolButton;
108 ToolButton10: TToolButton;
109 ToolButton11: TToolButton;
110 ToolButton12: TToolButton;
111 ToolButton13: TToolButton;
112 ToolButton14: TToolButton;
113 ToolButton15: TToolButton;
114 ToolButtonTarget: TToolButton;
115 ToolButton2: TToolButton;
116 ToolButton3: TToolButton;
117 ToolButton4: TToolButton;
118 ToolButton5: TToolButton;
119 ToolButton6: TToolButton;
120 ToolButton7: TToolButton;
121 ToolButton8: TToolButton;
122 ToolButton9: TToolButton;
123 procedure AAboutExecute(Sender: TObject);
124 procedure ABreakpointToggleExecute(Sender: TObject);
125 procedure AExitExecute(Sender: TObject);
126 procedure AFullScreenExecute(Sender: TObject);
127 procedure AHelpExecute(Sender: TObject);
128 procedure AKeyShortcutsExecute(Sender: TObject);
129 procedure AOptionsExecute(Sender: TObject);
130 procedure AProgramCompileExecute(Sender: TObject);
131 procedure AProgramCompileMultipleExecute(Sender: TObject);
132 procedure AProgramPauseExecute(Sender: TObject);
133 procedure AProgramRunToCursorExecute(Sender: TObject);
134 procedure AProgramRunExecute(Sender: TObject);
135 procedure AProgramShowExecutionPointExecute(Sender: TObject);
136 procedure AProgramStepIntoExecute(Sender: TObject);
137 procedure AProgramStepOutExecute(Sender: TObject);
138 procedure AProgramStepOverExecute(Sender: TObject);
139 procedure AProgramStopExecute(Sender: TObject);
140 procedure AProjectCloseExecute(Sender: TObject);
141 procedure AProjectNewExecute(Sender: TObject);
142 procedure AProjectOpenExecute(Sender: TObject);
143 procedure AProjectSaveAsExecute(Sender: TObject);
144 procedure AProjectSaveExecute(Sender: TObject);
145 procedure AShowSourcePositionExecute(Sender: TObject);
146 procedure AShowTargetPositionExecute(Sender: TObject);
147 procedure AViewCompilersExecute(Sender: TObject);
148 procedure AViewInterpreterExecute(Sender: TObject);
149 procedure AViewLogExecute(Sender: TObject);
150 procedure FormActivate(Sender: TObject);
151 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
152 procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
153 procedure FormCreate(Sender: TObject);
154 procedure FormDestroy(Sender: TObject);
155 procedure FormShow(Sender: TObject);
156 procedure MenuItemViewToolbarClick(Sender: TObject);
157 procedure TimerRefreshTimer(Sender: TObject);
158 private
159 FormCPU: TFormCPU;
160 FormInput: TFormInput;
161 FormLog: TFormLog;
162 FormMemory: TFormMemory;
163 FormMessages: TFormMessages;
164 FormOutput: TFormOutput;
165 FormSourceCode: TFormSourceCode;
166 FormTargetCode: TFormTargetCode;
167 FormKeyShortcuts: TFormKeyShortcuts;
168 procedure AProjectOpenRecentExecute(Sender: TObject);
169 procedure MenuItemTargetClick(Sender: TObject);
170 procedure ProjectOpen(FileName: string);
171 procedure UpdateToolBarHints;
172 procedure DockForm(Form: TForm; DockSite: TWinControl);
173 procedure DockInit;
174 procedure LastOpenedListChange(Sender: TObject);
175 procedure CurrentTargetChangeExecute(Sender: TObject);
176 procedure UpdateStatusBarExecute(Sender: TObject);
177 procedure UpdateInterfaceExecute(Sender: TObject);
178 public
179 procedure MessagesChanged(Sender: TObject);
180 procedure TargetLogExecute(Lines: TStrings);
181 procedure TargetStateChanged(Sender: TObject);
182 procedure UpdateInterface;
183 procedure UpdateStatusBar;
184 procedure UpdateTargetList;
185 end;
186
187
188implementation
189
190{$R *.lfm}
191
192uses
193 Core, TargetInterpreter, BFTarget, Common, FormAbout, FormHelp;
194
195resourcestring
196 SProgramStarted = 'Program started';
197 SProgramStopped = 'Program stopped';
198 SNewProject = 'New project';
199 SCompileStart = 'Compiling...';
200 SDone = 'Done';
201 SChanged = 'Changed';
202 SUnsavedChanges = 'Unsaved changes';
203 SDoYouWantToSaveProject = 'There are unsaved changes in project. Do you want to save them?';
204 SCloseProjectFirst = 'Project need to be closed before it can be openned';
205 SError = 'Error';
206 SFileNotFound = 'File %s not found.';
207
208{ TFormMain }
209
210procedure TFormMain.FormShow(Sender: TObject);
211begin
212 Core.Core.Init;
213 PageControlMain.TabIndex := 0;
214 try
215 if Core.Core.LastOpenedList.Items.Count = 0 then
216 Core.Core.LastOpenedList.Items.Add(Core.Core.ExamplesDir +
217 DirectorySeparator + 'Sierpinski.b');
218
219 if Core.Core.OpenProjectOnStart and (Core.Core.LastOpenedList.Items.Count > 0) and
220 FileExists(Core.Core.LastOpenedList.Items[0]) then
221 ProjectOpen(Core.Core.LastOpenedList.Items[0])
222 else AProjectNew.Execute;
223 finally
224 LastOpenedListChange(nil);
225 UpdateInterface;
226 UpdateToolBarHints;
227 UpdateTargetList;
228 DockInit;
229 FormSourceCode.UpdateTheme;
230 end;
231 Core.Core.Messages.OnChange := MessagesChanged;
232end;
233
234procedure TFormMain.MenuItemViewToolbarClick(Sender: TObject);
235begin
236 Core.Core.ShowToolbar := MenuItemViewToolbar.Checked;
237 UpdateInterface;
238end;
239
240procedure TFormMain.TimerRefreshTimer(Sender: TObject);
241begin
242 FormCPU.Reload;
243 FormOutput.Reload;
244 FormMemory.Reload;
245end;
246
247procedure TFormMain.TargetLogExecute(Lines: TStrings);
248begin
249 if Assigned(FormLog) then
250 FormLog.Memo1.Lines.AddStrings(Lines);
251end;
252
253procedure TFormMain.TargetStateChanged(Sender: TObject);
254begin
255 UpdateInterface;
256 if Core.Core.CurrentTarget.State = rsPaused then
257 AProgramShowExecutionPoint.Execute;
258 if Core.Core.CurrentTarget.State = rsStopped then
259 Core.Core.Messages.AddMessage(SProgramStopped);
260end;
261
262procedure TFormMain.MessagesChanged(Sender: TObject);
263begin
264 FormMessages.Reload;
265end;
266
267procedure TFormMain.MenuItemTargetClick(Sender: TObject);
268var
269 I: Integer;
270begin
271 if Sender is TMenuItem then
272 with TMenuItem(Sender) do begin
273 Core.Core.CurrentTarget := Core.Core.Targets[MenuIndex];
274 Checked := True;
275 for I := 0 to Parent.Count - 1 do
276 if Parent.Items[I].MenuIndex <> MenuIndex then Parent.Items[I].Checked := False;
277 end;
278end;
279
280procedure TFormMain.ProjectOpen(FileName: string);
281begin
282 with Core.Core do begin
283 if Project.Openned then
284 raise Exception.Create(SCloseProjectFirst);
285 FormSourceCode.SynEditSource.Lines.LoadFromFile(FileName);
286 AddItemToLastOpenedList(FileName);
287 Project.FileName := FileName;
288 Project.Openned := True;
289 CurrentTarget.Compiled := False;
290 end;
291 UpdateInterface;
292end;
293
294procedure TFormMain.UpdateToolBarHints;
295var
296 I: Integer;
297begin
298 for I := 0 to ToolBarMain.ControlCount - 1 do
299 ToolBarMain.Controls[I].Hint := ToolBarMain.Controls[I].Caption;
300end;
301
302procedure TFormMain.DockForm(Form: TForm; DockSite: TWinControl);
303begin
304 Form.ManualDock(DockSite, nil, alClient);
305 Form.Align := alClient;
306 Form.Show;
307end;
308
309procedure TFormMain.DockInit;
310begin
311 DockForm(FormSourceCode, TabSheetSource);
312 DockForm(FormTargetCode, TabSheetTarget);
313 DockForm(FormCPU, PanelCPU);
314 DockForm(FormInput, PanelInput);
315 DockForm(FormOutput, PanelOutput);
316 DockForm(FormMemory, PanelMemory);
317 DockForm(FormMessages, TabSheetMessages);
318 PageControlRight.Width := Width div 3;
319 PageControlBottom.Height := Height div 5;
320end;
321
322procedure TFormMain.LastOpenedListChange(Sender: TObject);
323begin
324 Core.Core.LastOpenedList.LoadToMenuItem(MenuItemOpenRecent, AProjectOpenRecentExecute);
325 Core.Core.LastOpenedList.LoadToMenuItem(PopupMenuRecentFiles.Items, AProjectOpenRecentExecute);
326end;
327
328procedure TFormMain.CurrentTargetChangeExecute(Sender: TObject);
329begin
330 UpdateTargetList;
331 UpdateInterface;
332end;
333
334procedure TFormMain.UpdateStatusBarExecute(Sender: TObject);
335begin
336 UpdateStatusBar;
337end;
338
339procedure TFormMain.UpdateInterfaceExecute(Sender: TObject);
340begin
341 UpdateInterface;
342end;
343
344procedure TFormMain.UpdateInterface;
345var
346 Title: string;
347 CanDebug: Boolean;
348begin
349 Title := '';
350 with Core.Core do begin
351 if Project.FileName <> '' then Title := Project.FileName;
352 if Project.Modified then Title := Title + ' (' + SChanged + ')';
353 Title:= Title + ' - ' + ApplicationInfo.AppName;
354 Caption := Title;
355 AProjectSave.Enabled := Project.Modified;
356 FormSourceCode.SynEditSource.Enabled := Project.Openned;
357 AProjectClose.Enabled := Project.Openned;
358 AProjectSaveAs.Enabled := Project.Openned;
359 AProgramRun.Enabled := (tcRun in CurrentTarget.Capabilities) and
360 Project.Openned and (CurrentTarget.State = rsStopped) or (CurrentTarget.State = rsPaused);
361 AProgramPause.Enabled := (tcPause in CurrentTarget.Capabilities) and
362 Project.Openned and (CurrentTarget.State = rsRunning);
363 AProgramStop.Enabled := (tcStop in CurrentTarget.Capabilities) and
364 Project.Openned and (CurrentTarget.State <> rsStopped);
365 AProgramCompile.Enabled := (tcCompile in CurrentTarget.Capabilities) and
366 Project.Openned;
367 CanDebug := DebugEnabled and Project.Openned and
368 ((CurrentTarget.State = rsPaused) or (CurrentTarget.State = rsStopped));
369 AProgramStepInto.Enabled := CanDebug and (tcStepInto in CurrentTarget.Capabilities);
370 AProgramStepOut.Enabled := CanDebug and (tcStepOut in CurrentTarget.Capabilities);
371 AProgramRunToCursor.Enabled := CanDebug and (tcRunToCursor in CurrentTarget.Capabilities);
372 AProgramStepOver.Enabled := CanDebug and (tcStepOver in CurrentTarget.Capabilities);
373 AProgramShowExecutionPoint.Enabled := CanDebug and (tcPause in CurrentTarget.Capabilities) and
374 (CurrentTarget.State = rsPaused);
375 AShowSourcePosition.Enabled := CurrentTarget.Compiled;
376 AShowTargetPosition.Enabled := CurrentTarget.Compiled;
377 AFullScreen.Checked := FullScreen;
378 MenuItemViewToolbar.Checked := Core.Core.ShowToolbar;
379 ToolBarMain.Visible := Core.Core.ShowToolbar;
380 end;
381 UpdateStatusBar;
382end;
383
384procedure TFormMain.UpdateStatusBar;
385begin
386 StatusBarMain.Panels[0].Text := IntToStr(FormSourceCode.SynEditSource.CaretXY.X) +
387 ', ' + IntToStr(FormSourceCode.SynEditSource.CaretXY.Y);
388end;
389
390procedure TFormMain.UpdateTargetList;
391var
392 I: Integer;
393begin
394 Core.Core.Targets.LoadToMenuItem(MenuItemTarget, MenuItemTargetClick, Core.Core.CurrentTarget);
395 Core.Core.Targets.LoadToMenuItem(PopupMenuTargets.Items, MenuItemTargetClick, Core.Core.CurrentTarget);
396
397 // Update toolbutton
398 I := Core.Core.Targets.IndexOf(Core.Core.CurrentTarget);
399 if I <> -1 then
400 with TTarget(Core.Core.Targets[I]) do begin
401 ToolButtonTarget.ImageIndex := ImageIndex;
402 ToolButtonTarget.Caption := Name;
403 ToolButtonTarget.OnClick := MenuItemTargetClick();
404 end;
405end;
406
407procedure TFormMain.FormCreate(Sender: TObject);
408begin
409 FormSourceCode := TFormSourceCode.Create(nil);
410 FormSourceCode.OnUpdateStatusBar := UpdateStatusBarExecute;
411 FormSourceCode.OnUpdateInterface := UpdateInterfaceExecute;
412 FormCPU := TFormCPU.Create(nil);
413 FormInput := TFormInput.Create(nil);
414 FormLog := TFormLog.Create(nil);
415 FormMemory := TFormMemory.Create(nil);
416 FormMessages := TFormMessages.Create(nil);
417 FormOutput := TFormOutput.Create(nil);
418 FormTargetCode := TFormTargetCode.Create(nil);
419
420 UpdateTargetList;
421 with Core.Core do begin
422 LastOpenedList.OnChange := LastOpenedListChange;
423 OnCurrentTargetChange := CurrentTargetChangeExecute;
424 OnTargetChangeState := TargetStateChanged;
425 OnTargetLog := TargetLogExecute;
426 end;
427end;
428
429procedure TFormMain.FormDestroy(Sender: TObject);
430begin
431 FreeAndNil(FormSourceCode);
432 FreeAndNil(FormCPU);
433 FreeAndNil(FormInput);
434 FreeAndNil(FormLog);
435 FreeAndNil(FormMemory);
436 FreeAndNil(FormMessages);
437 FreeAndNil(FormOutput);
438 FreeAndNil(FormTargetCode);
439 if Assigned(FormKeyShortcuts) then FreeAndNil(FormKeyShortcuts);
440end;
441
442procedure TFormMain.AProgramRunExecute(Sender: TObject);
443begin
444 if Core.Core.CurrentTarget is TTargetInterpreter then
445 TTargetInterpreter(Core.Core.CurrentTarget).Input := FormInput.MemoInput.Lines.Text;
446 if not Core.Core.CurrentTarget.Compiled then AProgramCompile.Execute;
447 Core.Core.CurrentTarget.Run;
448 Core.Core.Messages.AddMessage(SProgramStarted);
449end;
450
451procedure TFormMain.AShowSourcePositionExecute(Sender: TObject);
452var
453 DebugStep: TDebugStep;
454begin
455 DebugStep := Core.Core.CurrentTarget.DebugSteps.SearchByTargetPos(FormTargetCode.SynEditTarget.SelStart - 1);
456 if Assigned(DebugStep) then begin
457 FormSourceCode.SynEditSource.SelStart := DebugStep.SourcePosition + 1;
458 PageControlMain.TabIndex := 0;
459 end;
460end;
461
462procedure TFormMain.AShowTargetPositionExecute(Sender: TObject);
463var
464 DebugStep: TDebugStep;
465begin
466 DebugStep := Core.Core.CurrentTarget.DebugSteps.SearchBySourcePos(FormSourceCode.SynEditSource.SelStart - 1);
467 if Assigned(DebugStep) then begin
468 FormTargetCode.SynEditTarget.SelStart := DebugStep.TargetPosition + 1;
469 PageControlMain.TabIndex := 1;
470 end;
471end;
472
473procedure TFormMain.AViewCompilersExecute(Sender: TObject);
474begin
475 with TFormTargets.Create(nil) do
476 try
477 ShowModal;
478 finally
479 Free;
480 end;
481end;
482
483procedure TFormMain.AViewInterpreterExecute(Sender: TObject);
484begin
485 FormCPU.Show;
486end;
487
488procedure TFormMain.AViewLogExecute(Sender: TObject);
489begin
490 if not Assigned(FormLog) then FormLog := TFormLog.Create(Self);
491 FormLog.Show;
492end;
493
494procedure TFormMain.FormActivate(Sender: TObject);
495begin
496 AFullScreen.Checked := FullScreen;
497end;
498
499procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
500begin
501 Application.Terminate;
502end;
503
504procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
505begin
506 if Core.Core.Project.Modified then begin
507 AProjectClose.Execute;
508 if Core.Core.Project.Openned then CanClose := False;
509 end;
510end;
511
512procedure TFormMain.AExitExecute(Sender: TObject);
513begin
514 Close;
515end;
516
517procedure TFormMain.AFullScreenExecute(Sender: TObject);
518begin
519 FullScreen := not FullScreen;
520 AFullScreen.Checked := FullScreen;
521 TFormEx.PersistentForm.Save(Self);
522 TFormEx.PersistentForm.SetFullScreen(FullScreen);
523 UpdateInterface;
524end;
525
526procedure TFormMain.AHelpExecute(Sender: TObject);
527var
528 FormHelp: TFormHelp;
529begin
530 FormHelp := TFormHelp.Create(nil);
531 try
532 FormHelp.ShowModal;
533 finally
534 FormHelp.Free;
535 end;
536end;
537
538procedure TFormMain.AKeyShortcutsExecute(Sender: TObject);
539begin
540 if not Assigned(FormKeyShortcuts) then FormKeyShortcuts := TFormKeyShortcuts.Create(nil);
541 FormKeyShortcuts.ImageList := Core.Core.ImageListMain;
542 FormKeyShortcuts.MainForm := Self;
543 FormKeyShortcuts.SourceComponents.Clear;
544 FormKeyShortcuts.SourceComponents.Add(Self);
545 FormKeyShortcuts.Show;
546end;
547
548procedure TFormMain.AOptionsExecute(Sender: TObject);
549var
550 FormOptions: TFormOptions;
551begin
552 FormOptions := TFormOptions.Create(nil);
553 try
554 FormOptions.Load;
555 if FormOptions.ShowModal = mrOK then begin
556 FormOptions.Save;
557 if Assigned(Core.Core.CurrentTarget) then begin
558 Core.Core.CurrentTarget.OptimizationLevel := Core.Core.OptimizationLevel;
559 if Core.Core.CurrentTarget is TBFTarget then begin
560 TBFTarget(Core.Core.CurrentTarget).CellSize := Core.Core.CellSize;
561 TBFTarget(Core.Core.CurrentTarget).MemorySize := Core.Core.MemorySize;
562 end;
563 end;
564 Core.Core.ThemeManager.UseTheme(Self);
565 FormSourceCode.UpdateTheme;
566 Core.Core.SaveToRegistry(Core.Core.ApplicationInfo.GetRegistryContext);
567 end;
568 finally
569 FormOptions.Free;
570 end;
571end;
572
573procedure TFormMain.AProgramCompileExecute(Sender: TObject);
574begin
575 with Core.Core, CurrentTarget do
576 try
577 Messages.Clear;
578 AProgramStop.Execute;
579 SourceCode := FormSourceCode.SynEditSource.Text;
580 ProjectFileName := Project.FileName;
581 ProgramName := ExtractFileNameOnly(Project.FileName);
582 if CurrentTarget is TBFTarget then
583 TBFTarget(CurrentTarget).Optimizations := Optimizations;
584 DebugEnabled := Core.Core.DebugEnabled;
585 Messages.AddMessage(SCompileStart);
586 Application.ProcessMessages;
587 Compile;
588 Messages.AppendMessage(SDone);
589 FormTargetCode.SynEditTarget.Text := TargetCode;
590 FormTargetCode.SetHighlighter(CurrentTarget.SourceExtension);
591 UpdateInterface;
592 except
593 on E: Exception do
594 MessageDlg(SError, E.Message, mtError, [mbOk], 0);
595 end;
596end;
597
598procedure TFormMain.AProgramCompileMultipleExecute(Sender: TObject);
599var
600 I: Integer;
601begin
602 AProgramStop.Execute;
603 with TFormCompileMultiple.Create(nil) do
604 try
605 Targets := Core.Core.Targets;
606 if ShowModal = mrOk then begin
607 Core.Core.Messages.Clear;
608 for I := 0 to Targets.Count - 1 do
609 with Targets[I] do
610 if Selected then
611 try
612 AProgramStop.Execute;
613 SourceCode := FormSourceCode.SynEditSource.Text;
614 ProjectFileName := Core.Core.Project.FileName;
615 ProgramName := ExtractFileNameOnly(Core.Core.Project.FileName);
616 if Targets[I] is TBFTarget then
617 TBFTarget(Targets[I]).Optimizations := Core.Core.Optimizations;
618 DebugEnabled := Core.Core.DebugEnabled;
619 Core.Core.Messages.AddMessage(Name + ' ' + SCompileStart);
620 Application.ProcessMessages;
621 Compile;
622 Core.Core.Messages.AppendMessage(SDone);
623 FormTargetCode.SynEditTarget.Text := TargetCode;
624 FormTargetCode.SetHighlighter(Core.Core.CurrentTarget.SourceExtension);
625 UpdateInterface;
626 except
627 on E: Exception do
628 MessageDlg(SError, E.Message, mtError, [mbOk], 0);
629 end;
630 end;
631 finally
632 Free;
633 end;
634end;
635
636procedure TFormMain.ABreakpointToggleExecute(Sender: TObject);
637var
638 DebugStep: TDebugStep;
639 BreakPoint: TBreakPoint;
640begin
641 DebugStep := Core.Core.CurrentTarget.DebugSteps.SearchBySourcePos(FormSourceCode.SynEditSource.SelStart - 1);
642 if Assigned(DebugStep) then begin
643 BreakPoint := Core.Core.CurrentTarget.BreakPoints.SearchByTargetPos(DebugStep.ProgramPosition);
644 if Assigned(BreakPoint) then
645 Core.Core.CurrentTarget.BreakPoints.Delete(Core.Core.CurrentTarget.BreakPoints.IndexOf(BreakPoint))
646 else Core.Core.CurrentTarget.BreakPoints.AddItem(DebugStep.ProgramPosition);
647 end;
648end;
649
650procedure TFormMain.AAboutExecute(Sender: TObject);
651var
652 FormAbout: TFormAbout;
653begin
654 FormAbout := TFormAbout.Create(nil);
655 FormAbout.ApplicationInfo := Core.Core.ApplicationInfo;
656 try
657 FormAbout.ShowModal;
658 finally
659 FormAbout.Free;
660 end;
661end;
662
663procedure TFormMain.AProgramPauseExecute(Sender: TObject);
664begin
665 Core.Core.CurrentTarget.Pause;
666end;
667
668procedure TFormMain.AProgramRunToCursorExecute(Sender: TObject);
669var
670 DebugStep: TDebugStep;
671begin
672 if Core.Core.CurrentTarget.State = rsStopped then begin
673 if not Core.Core.CurrentTarget.Compiled then AProgramCompile.Execute;
674 DebugStep := Core.Core.CurrentTarget.DebugSteps.SearchBySourcePos(FormSourceCode.SynEditSource.SelStart - 1);
675 Core.Core.CurrentTarget.BreakPoints.SetSystem(DebugStep.ProgramPosition);
676 AProgramRun.Execute;
677 end else begin
678 DebugStep := Core.Core.CurrentTarget.DebugSteps.SearchBySourcePos(FormSourceCode.SynEditSource.SelStart - 1);
679 Core.Core.CurrentTarget.RunToCursor(DebugStep.ProgramPosition);
680 end;
681end;
682
683procedure TFormMain.AProgramShowExecutionPointExecute(Sender: TObject);
684var
685 DebugStep: TDebugStep;
686begin
687 DebugStep := Core.Core.CurrentTarget.DebugSteps.SearchByProgramPos(
688 Core.Core.CurrentTarget.ExecutionPosition);
689 if Assigned(DebugStep) then begin
690 FormSourceCode.SynEditSource.SelStart := DebugStep.SourcePosition + 1;
691 FormTargetCode.SynEditTarget.SelStart := DebugStep.TargetPosition + 1;
692 if PageControlMain.TabIndex = 0 then FormSourceCode.SynEditSource.SetFocus;
693 if PageControlMain.TabIndex = 1 then FormTargetCode.SynEditTarget.SetFocus;
694 end;
695end;
696
697procedure TFormMain.AProgramStepIntoExecute(Sender: TObject);
698begin
699 if Core.Core.CurrentTarget.State = rsStopped then begin
700 if not Core.Core.CurrentTarget.Compiled then AProgramCompile.Execute;
701 Core.Core.CurrentTarget.BreakPoints.SetSystem(
702 Core.Core.CurrentTarget.DebugSteps.First.ProgramPosition);
703 AProgramRun.Execute;
704 end else Core.Core.CurrentTarget.StepInto;
705end;
706
707procedure TFormMain.AProgramStepOutExecute(Sender: TObject);
708begin
709 Core.Core.CurrentTarget.StepOut;
710end;
711
712procedure TFormMain.AProgramStepOverExecute(Sender: TObject);
713begin
714 if Core.Core.CurrentTarget.State = rsStopped then begin
715 if not Core.Core.CurrentTarget.Compiled then AProgramCompile.Execute;
716 Core.Core.CurrentTarget.BreakPoints.SetSystem(
717 TDebugStep(Core.Core.CurrentTarget.DebugSteps.First).ProgramPosition);
718 AProgramRun.Execute;
719 end else Core.Core.CurrentTarget.StepOver;
720end;
721
722procedure TFormMain.AProgramStopExecute(Sender: TObject);
723begin
724 Core.Core.CurrentTarget.Stop;
725end;
726
727procedure TFormMain.AProjectCloseExecute(Sender: TObject);
728var
729 DialogResult: TModalResult;
730begin
731 DialogResult := mrNo;
732 if Core.Core.Project.Modified then begin
733 DialogResult := MessageDlg(SUnsavedChanges, SDoYouWantToSaveProject, mtConfirmation, [mbYes, mbNo, mbCancel], 0);
734 if DialogResult = mrYes then begin
735 AProjectSave.Execute;
736 end;
737 end;
738 if (DialogResult = mrNo) or (DialogResult = mrYes) then begin
739 AProgramStop.Execute;
740 Core.Core.Project.Openned := False;
741 FormSourceCode.SynEditSource.Clear;
742 UpdateInterface;
743 end;
744end;
745
746procedure TFormMain.AProjectNewExecute(Sender: TObject);
747begin
748 AProjectClose.Execute;
749 if Core.Core.Project.Openned then Exit;
750 Core.Core.Project.FileName := SNewProject + '.b';
751 Core.Core.Project.Openned := True;
752 FormSourceCode.SynEditSource.Clear;
753 Core.Core.CurrentTarget.Compiled := False;
754 UpdateInterface;
755end;
756
757procedure TFormMain.AProjectOpenRecentExecute(Sender: TObject);
758var
759 FileName: string;
760begin
761 FileName := Core.Core.LastOpenedList.Items[TMenuItem(Sender).MenuIndex];
762 if FileExists(FileName) then begin
763 AProjectClose.Execute;
764 if Core.Core.Project.Openned then Exit;
765 ProjectOpen(FileName);
766 end else ShowMessage(Format(SFileNotFound, [FileName]));
767end;
768
769procedure TFormMain.AProjectOpenExecute(Sender: TObject);
770var
771 FileName: string;
772begin
773 if Core.Core.LastOpenedList.Items.Count > 0 then
774 FileName := Core.Core.LastOpenedList.Items[0];
775 OpenDialog1.InitialDir := ExtractFileDir(FileName);
776 OpenDialog1.FileName := ExtractFileName(FileName);
777 if OpenDialog1.Execute then begin
778 AProjectClose.Execute;
779 if Core.Core.Project.Openned then Exit;
780 ProjectOpen(OpenDialog1.FileName);
781 end;
782end;
783
784procedure TFormMain.AProjectSaveAsExecute(Sender: TObject);
785begin
786 SaveDialog1.InitialDir := ExtractFileDir(Core.Core.Project.FileName);
787 SaveDialog1.FileName := ExtractFileName(Core.Core.Project.FileName);
788 if SaveDialog1.Execute then begin
789 FormSourceCode.SynEditSource.Lines.SaveToFile(SaveDialog1.FileName);
790 Core.Core.Project.FileName := SaveDialog1.FileName;
791 Core.Core.AddItemToLastOpenedList(SaveDialog1.FileName);
792 Core.Core.Project.Modified := False;
793 UpdateInterface;
794 end;
795end;
796
797procedure TFormMain.AProjectSaveExecute(Sender: TObject);
798begin
799 if Core.Core.Project.Modified and FileExists(Core.Core.Project.FileName) then begin
800 FormSourceCode.SynEditSource.Lines.SaveToFile(Core.Core.Project.FileName);
801 Core.Core.AddItemToLastOpenedList(Core.Core.Project.FileName);
802 Core.Core.Project.Modified := False;
803 UpdateInterface;
804 end else AProjectSaveAs.Execute;
805end;
806
807end.
808
Note: See TracBrowser for help on using the repository browser.