diff --git a/components/pas2js/frmpas2jsatompackagesettings.lfm b/components/pas2js/frmpas2jsatompackagesettings.lfm index e73398b3e0..ea8354ff05 100644 --- a/components/pas2js/frmpas2jsatompackagesettings.lfm +++ b/components/pas2js/frmpas2jsatompackagesettings.lfm @@ -1,20 +1,20 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm - Left = 357 - Height = 546 - Top = 159 + Left = 352 + Height = 580 + Top = 171 Width = 588 Caption = 'New Atom Package' - ClientHeight = 546 + ClientHeight = 580 ClientWidth = 588 + LCLVersion = '3.99.0.0' OnShow = FormShow - LCLVersion = '2.1.0.0' object edtDescription: TEdit AnchorSideLeft.Control = dePackage AnchorSideTop.Control = dePackage AnchorSideTop.Side = asrBottom Left = 120 - Height = 27 - Top = 43 + Height = 32 + Top = 48 Width = 446 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 @@ -25,8 +25,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Side = asrCenter AnchorSideRight.Control = edtDescription Left = 24 - Height = 16 - Top = 48 + Height = 15 + Top = 57 Width = 88 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -40,21 +40,21 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Control = edtDescription AnchorSideTop.Side = asrBottom Left = 120 - Height = 27 - Top = 78 + Height = 32 + Top = 88 Width = 280 BorderSpacing.Top = 8 + TabOrder = 1 OnEditingDone = edtNameEditingDone OnKeyPress = edtNameKeyPress - TabOrder = 1 end object lblName: TLabel AnchorSideTop.Control = edtName AnchorSideTop.Side = asrCenter AnchorSideRight.Control = edtName Left = 16 - Height = 16 - Top = 83 + Height = 15 + Top = 97 Width = 96 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -69,8 +69,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Side = asrBottom Left = 120 Height = 23 - Top = 149 - Width = 173 + Top = 169 + Width = 160 BorderSpacing.Top = 8 Caption = 'Link in Atom package dir' TabOrder = 2 @@ -81,7 +81,7 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Side = asrBottom Left = 120 Height = 112 - Top = 180 + Top = 200 Width = 446 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 @@ -102,8 +102,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm end object ButtonPanel1: TButtonPanel Left = 6 - Height = 38 - Top = 502 + Height = 56 + Top = 518 Width = 576 OKButton.Name = 'OKButton' OKButton.DefaultCaption = True @@ -121,8 +121,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Side = asrCenter AnchorSideRight.Control = edtLicense Left = 56 - Height = 16 - Top = 305 + Height = 15 + Top = 329 Width = 56 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -136,8 +136,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Control = vleCommands AnchorSideTop.Side = asrBottom Left = 120 - Height = 27 - Top = 300 + Height = 32 + Top = 320 Width = 184 BorderSpacing.Top = 8 TabOrder = 5 @@ -146,8 +146,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Control = vleCommands AnchorSideRight.Control = vleCommands Left = 32 - Height = 16 - Top = 180 + Height = 15 + Top = 200 Width = 80 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -161,8 +161,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Side = asrCenter AnchorSideRight.Control = edtKeywords Left = 44 - Height = 16 - Top = 341 + Height = 15 + Top = 370 Width = 68 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -176,8 +176,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Control = edtLicense AnchorSideTop.Side = asrBottom Left = 120 - Height = 27 - Top = 336 + Height = 32 + Top = 361 Width = 445 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 9 @@ -187,8 +187,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Control = vleActivationCommands AnchorSideRight.Control = vleActivationCommands Left = 23 - Height = 32 - Top = 371 + Height = 30 + Top = 401 Width = 89 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -203,7 +203,7 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Side = asrBottom Left = 120 Height = 112 - Top = 371 + Top = 401 Width = 445 Anchors = [akTop, akLeft, akRight] BorderSpacing.Top = 8 @@ -224,7 +224,7 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm end object dePackage: TDirectoryEdit Left = 120 - Height = 27 + Height = 32 Top = 8 Width = 447 ShowHidden = False @@ -239,8 +239,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Side = asrCenter AnchorSideRight.Control = dePackage Left = 34 - Height = 16 - Top = 13 + Height = 15 + Top = 17 Width = 78 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -254,8 +254,8 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Side = asrCenter AnchorSideRight.Control = edtClassName Left = 32 - Height = 16 - Top = 119 + Height = 15 + Top = 138 Width = 79 Alignment = taRightJustify Anchors = [akTop, akLeft, akRight] @@ -269,11 +269,11 @@ object AtomPackageSettingsForm: TAtomPackageSettingsForm AnchorSideTop.Control = edtName AnchorSideTop.Side = asrBottom Left = 120 - Height = 27 - Top = 114 + Height = 32 + Top = 129 Width = 280 BorderSpacing.Top = 9 - OnKeyPress = edtClassNameKeyPress TabOrder = 9 + OnKeyPress = edtClassNameKeyPress end end diff --git a/components/pas2js/frmpas2jsbrowserprojectoptions.lfm b/components/pas2js/frmpas2jsbrowserprojectoptions.lfm index 0e1d91503f..fcd04a8dc6 100644 --- a/components/pas2js/frmpas2jsbrowserprojectoptions.lfm +++ b/components/pas2js/frmpas2jsbrowserprojectoptions.lfm @@ -1,14 +1,14 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm Left = 381 - Height = 490 + Height = 512 Top = 232 Width = 632 Caption = 'Pas2JS Browser project options' - ClientHeight = 490 + ClientHeight = 512 ClientWidth = 632 - OnCreate = FormCreate Position = poScreenCenter - LCLVersion = '2.3.0.0' + LCLVersion = '3.99.0.0' + OnCreate = FormCreate object CBCreateHTML: TCheckBox AnchorSideLeft.Control = Owner AnchorSideTop.Control = Owner @@ -20,9 +20,9 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm BorderSpacing.Top = 6 Caption = 'Create initial HTML page' Checked = True - OnChange = CBCreateHTMLChange State = cbChecked TabOrder = 0 + OnChange = CBCreateHTMLChange end object CBUseBrowserApp: TCheckBox AnchorSideLeft.Control = CBCreateHTML @@ -34,8 +34,8 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm Width = 198 BorderSpacing.Top = 6 Caption = 'Use Browser Application object' - OnChange = CBUseBrowserAppChange TabOrder = 1 + OnChange = CBUseBrowserAppChange end object CBUseBrowserConsole: TCheckBox AnchorSideLeft.Control = CBCreateHTML @@ -52,8 +52,8 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm end object BPHelpOptions: TButtonPanel Left = 6 - Height = 40 - Top = 444 + Height = 56 + Top = 450 Width = 620 OKButton.Name = 'OKButton' OKButton.DefaultCaption = True @@ -126,7 +126,7 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 70 - Height = 30 + Height = 32 Top = 209 Width = 556 Anchors = [akTop, akLeft, akRight] @@ -143,12 +143,12 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideTop.Side = asrBottom Left = 6 Height = 23 - Top = 245 + Top = 247 Width = 272 BorderSpacing.Top = 6 Caption = 'Create a javascript module instead of a script' - OnChange = CBUseHTTPServerChange TabOrder = 9 + OnChange = CBUseHTTPServerChange end object RunGroupBox: TGroupBox AnchorSideLeft.Control = Owner @@ -157,14 +157,14 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideRight.Control = Owner AnchorSideRight.Side = asrBottom Left = 6 - Height = 159 - Top = 274 + Height = 165 + Top = 276 Width = 620 Anchors = [akTop, akLeft, akRight] AutoSize = True BorderSpacing.Around = 6 Caption = 'Run' - ClientHeight = 143 + ClientHeight = 149 ClientWidth = 618 TabOrder = 10 object RBRunServerAt: TRadioButton @@ -173,13 +173,13 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideTop.Side = asrCenter Left = 6 Height = 23 - Top = 46 + Top = 49 Width = 168 BorderSpacing.Left = 6 BorderSpacing.Top = 6 Caption = 'Start HTTP Server on port' - OnChange = RBRunServerAtChange TabOrder = 4 + OnChange = RBRunServerAtChange end object SERunPort: TSpinEdit AnchorSideLeft.Control = RBRunServerAt @@ -187,8 +187,8 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideTop.Control = CBRunLocationOnSWS AnchorSideTop.Side = asrBottom Left = 180 - Height = 30 - Top = 42 + Height = 32 + Top = 44 Width = 76 BorderSpacing.Left = 6 BorderSpacing.Top = 6 @@ -203,11 +203,11 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideTop.Side = asrCenter Left = 6 Height = 23 - Top = 82 + Top = 87 Width = 138 Caption = 'Use URL to start app' - OnChange = RBRunBrowserWithURLChange TabOrder = 1 + OnChange = RBRunBrowserWithURLChange end object CBRunServerURL: TComboBox AnchorSideLeft.Control = RBRunBrowserWithURL @@ -217,8 +217,8 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideRight.Control = RunGroupBox AnchorSideRight.Side = asrBottom Left = 150 - Height = 30 - Top = 78 + Height = 32 + Top = 82 Width = 462 Anchors = [akTop, akLeft, akRight] BorderSpacing.Left = 6 @@ -233,14 +233,14 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideTop.Side = asrBottom Left = 6 Height = 23 - Top = 114 + Top = 120 Width = 162 BorderSpacing.Left = 6 BorderSpacing.Top = 6 BorderSpacing.Bottom = 6 Caption = 'Execute Run Parameters' - OnChange = RBRunDefaultChange TabOrder = 3 + OnChange = RBRunDefaultChange end object RBRunLocationOnSWS: TRadioButton AnchorSideLeft.Control = RunGroupBox @@ -248,14 +248,14 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideTop.Side = asrCenter Left = 6 Height = 23 - Top = 10 + Top = 11 Width = 196 BorderSpacing.Left = 6 Caption = 'Location on Simple Web Server' Checked = True - OnChange = RBRunLocationOnSWSChange TabOrder = 6 TabStop = True + OnChange = RBRunLocationOnSWSChange end object CBRunLocationOnSWS: TComboBox AnchorSideLeft.Control = RBRunLocationOnSWS @@ -264,7 +264,7 @@ object WebBrowserProjectOptionsForm: TWebBrowserProjectOptionsForm AnchorSideRight.Control = RunGroupBox AnchorSideRight.Side = asrBottom Left = 208 - Height = 30 + Height = 32 Top = 6 Width = 404 Anchors = [akTop, akLeft, akRight] diff --git a/components/pas2js/frmpas2jsinstaller.lfm b/components/pas2js/frmpas2jsinstaller.lfm new file mode 100644 index 0000000000..bc6593c320 --- /dev/null +++ b/components/pas2js/frmpas2jsinstaller.lfm @@ -0,0 +1,320 @@ +object Pas2jsInstallerDialog: TPas2jsInstallerDialog + Left = 317 + Height = 547 + Top = 243 + Width = 574 + Caption = 'Pas2jsInstallerDialog' + ClientHeight = 547 + ClientWidth = 574 + Position = poWorkAreaCenter + LCLVersion = '3.99.0.0' + OnCreate = FormCreate + object BtnPanel: TPanel + Left = 0 + Height = 45 + Top = 502 + Width = 574 + Align = alBottom + AutoSize = True + ClientHeight = 45 + ClientWidth = 574 + TabOrder = 0 + object CloseButton: TButton + AnchorSideRight.Control = BtnPanel + AnchorSideRight.Side = asrBottom + Left = 488 + Height = 31 + Top = 7 + Width = 75 + Anchors = [akTop, akRight] + AutoSize = True + BorderSpacing.Top = 6 + BorderSpacing.Right = 10 + BorderSpacing.Bottom = 6 + Caption = 'Close' + Constraints.MinWidth = 75 + TabOrder = 0 + OnClick = CloseButtonClick + end + object ApplyButton: TButton + AnchorSideTop.Control = BtnPanel + AnchorSideRight.Control = CloseButton + AnchorSideBottom.Control = BtnPanel + AnchorSideBottom.Side = asrBottom + Left = 401 + Height = 31 + Top = 7 + Width = 75 + Anchors = [akTop, akRight, akBottom] + AutoSize = True + BorderSpacing.Right = 6 + BorderSpacing.Around = 6 + Caption = 'Apply' + Constraints.MinWidth = 75 + TabOrder = 1 + end + end + object Pas2jsSrcDirGroupBox: TGroupBox + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Pas2jsExeGroupBox + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 81 + Top = 73 + Width = 562 + Anchors = [akTop, akLeft, akRight] + AutoSize = True + BorderSpacing.Around = 6 + Caption = 'Pas2js Source Directory' + ClientHeight = 65 + ClientWidth = 560 + TabOrder = 1 + object Pas2jsSrcDirComboBox: TComboBox + AnchorSideLeft.Control = Pas2jsSrcDirGroupBox + AnchorSideTop.Control = Pas2jsSrcDirGroupBox + AnchorSideRight.Control = Pas2jsSrcDirBrowseBtn + Left = 6 + Height = 32 + Top = 6 + Width = 523 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + ItemHeight = 0 + TabOrder = 0 + Text = 'Pas2jsSrcDir' + end + object Pas2jsSrcVersionLabel: TLabel + AnchorSideLeft.Control = Pas2jsSrcDirGroupBox + AnchorSideTop.Control = Pas2jsSrcDirComboBox + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 15 + Top = 44 + Width = 74 + BorderSpacing.Around = 6 + Caption = 'Version: 0.0.0' + end + object Pas2jsSrcDirBrowseBtn: TButton + AnchorSideTop.Control = Pas2jsSrcDirComboBox + AnchorSideRight.Control = Pas2jsSrcDirGroupBox + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Pas2jsSrcDirComboBox + AnchorSideBottom.Side = asrBottom + Left = 529 + Height = 32 + Top = 6 + Width = 25 + Anchors = [akTop, akRight, akBottom] + AutoSize = True + BorderSpacing.Right = 6 + Caption = '...' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + end + end + object FPCGroupBox: TGroupBox + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Pas2jsSrcDirGroupBox + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 161 + Top = 160 + Width = 562 + Anchors = [akTop, akLeft, akRight] + AutoSize = True + BorderSpacing.Around = 6 + Caption = 'Free Pascal Compiler used for compiling tools and pas2js itself' + ClientHeight = 145 + ClientWidth = 560 + Enabled = False + TabOrder = 2 + object FPCExeComboBox: TComboBox + AnchorSideLeft.Control = FPCGroupBox + AnchorSideTop.Control = FPCExeLabel + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = FPCExeBrowseButton + Left = 6 + Height = 32 + Top = 27 + Width = 523 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + ItemHeight = 0 + TabOrder = 0 + Text = 'FPCExe' + end + object FPCExeBrowseButton: TButton + AnchorSideTop.Control = FPCExeComboBox + AnchorSideRight.Control = FPCGroupBox + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = FPCExeComboBox + AnchorSideBottom.Side = asrBottom + Left = 529 + Height = 32 + Top = 27 + Width = 25 + Anchors = [akTop, akRight, akBottom] + AutoSize = True + BorderSpacing.Right = 6 + Caption = '...' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + end + object FPCSrcDirVersionLabel: TLabel + AnchorSideLeft.Control = FPCGroupBox + AnchorSideTop.Control = FPCSrcDirComboBox + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 15 + Top = 124 + Width = 74 + BorderSpacing.Around = 6 + Caption = 'Version: 0.0.0' + end + object FPCSrcDirComboBox: TComboBox + AnchorSideLeft.Control = FPCGroupBox + AnchorSideTop.Control = FPCSrcDirLabel + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = FPCSrcDirBrowseButton + Left = 6 + Height = 32 + Top = 86 + Width = 523 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + BorderSpacing.Bottom = 6 + ItemHeight = 0 + TabOrder = 2 + Text = 'FPCSrcDir' + end + object FPCSrcDirBrowseButton: TButton + AnchorSideTop.Control = FPCSrcDirComboBox + AnchorSideRight.Control = FPCGroupBox + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = FPCSrcDirComboBox + AnchorSideBottom.Side = asrBottom + Left = 529 + Height = 32 + Top = 86 + Width = 25 + Anchors = [akTop, akRight, akBottom] + AutoSize = True + BorderSpacing.Right = 6 + Caption = '...' + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object FPCExeLabel: TLabel + AnchorSideTop.Control = FPCGroupBox + Left = 6 + Height = 15 + Top = 6 + Width = 87 + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + Caption = 'FPC executable:' + end + object FPCSrcDirLabel: TLabel + AnchorSideLeft.Control = FPCGroupBox + AnchorSideTop.Control = FPCExeComboBox + AnchorSideTop.Side = asrBottom + Left = 6 + Height = 15 + Top = 65 + Width = 117 + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + Caption = 'FPC source directory:' + end + end + object DetailsGroupBox: TGroupBox + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = FPCGroupBox + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = BtnPanel + Left = 6 + Height = 169 + Top = 327 + Width = 562 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Around = 6 + Caption = 'Details' + ClientHeight = 153 + ClientWidth = 560 + TabOrder = 3 + object DetailsMemo: TMemo + Left = 6 + Height = 141 + Top = 6 + Width = 548 + Align = alClient + BorderSpacing.Around = 6 + Lines.Strings = ( + 'DetailsMemo1' + ) + TabOrder = 0 + end + end + object Pas2jsExeGroupBox: TGroupBox + AnchorSideLeft.Control = Owner + AnchorSideTop.Control = Owner + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 6 + Height = 61 + Top = 6 + Width = 562 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Around = 6 + Caption = 'Pas2js Command Executable' + ClientHeight = 45 + ClientWidth = 560 + TabOrder = 4 + object Pas2jsExeComboBox: TComboBox + AnchorSideLeft.Control = Pas2jsExeGroupBox + AnchorSideTop.Control = Pas2jsExeGroupBox + AnchorSideRight.Control = Pas2jsExeBrowseButton + Left = 6 + Height = 32 + Top = 6 + Width = 523 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + ItemHeight = 0 + TabOrder = 0 + Text = 'Pas2jsExe' + end + object Pas2jsExeBrowseButton: TButton + AnchorSideTop.Control = Pas2jsExeComboBox + AnchorSideRight.Control = Pas2jsExeGroupBox + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Pas2jsExeComboBox + AnchorSideBottom.Side = asrBottom + Left = 529 + Height = 32 + Top = 6 + Width = 25 + Anchors = [akTop, akRight, akBottom] + AutoSize = True + BorderSpacing.Right = 6 + Caption = '...' + ParentShowHint = False + ShowHint = True + TabOrder = 1 + OnClick = Pas2jsExeBrowseButtonClick + end + end +end diff --git a/components/pas2js/frmpas2jsinstaller.lrj b/components/pas2js/frmpas2jsinstaller.lrj new file mode 100644 index 0000000000..8f5b6e0223 --- /dev/null +++ b/components/pas2js/frmpas2jsinstaller.lrj @@ -0,0 +1,3 @@ +{"version":1,"strings":[ +{"hash":5073155,"name":"tform3.caption","sourcebytes":[70,111,114,109,51],"value":"Form3"} +]} diff --git a/components/pas2js/frmpas2jsinstaller.pas b/components/pas2js/frmpas2jsinstaller.pas new file mode 100644 index 0000000000..bc04e7588e --- /dev/null +++ b/components/pas2js/frmpas2jsinstaller.pas @@ -0,0 +1,197 @@ +unit FrmPas2jsInstaller; + +{$mode ObjFPC}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, + StrPas2JSDesign, PJSDsgnOptions, IDEUtils, LazFileUtils; + +type + + { TPas2jsInstallerDialog } + + TPas2jsInstallerDialog = class(TForm) + ApplyButton: TButton; + BtnPanel: TPanel; + FPCExeLabel: TLabel; + FPCSrcDirBrowseButton: TButton; + CloseButton: TButton; + DetailsGroupBox: TGroupBox; + DetailsMemo: TMemo; + FPCExeBrowseButton: TButton; + FPCExeComboBox: TComboBox; + FPCSrcDirComboBox: TComboBox; + FPCGroupBox: TGroupBox; + FPCSrcDirLabel: TLabel; + FPCSrcDirVersionLabel: TLabel; + Pas2jsExeBrowseButton: TButton; + Pas2jsExeComboBox: TComboBox; + Pas2jsExeGroupBox: TGroupBox; + Pas2jsSrcDirBrowseBtn: TButton; + Pas2jsSrcDirComboBox: TComboBox; + Pas2jsSrcDirGroupBox: TGroupBox; + Pas2jsSrcVersionLabel: TLabel; + procedure CloseButtonClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure Pas2jsExeBrowseButtonClick(Sender: TObject); + private + FLastCheckedPas2jsExe: String; + FLastCheckedPas2jsSrcDir: String; + FLastCheckedPas2js: boolean; + FOldPas2jsExe: string; + FOldPas2jsSrcDir: string; + FOldFPCExe: string; + FOldFPCSrcDir: string; + procedure UpdateButtons; + function NeedsApply: boolean; + function CheckPas2js: boolean; + public + procedure Init; + end; + +var + Pas2jsInstallerDialog: TPas2jsInstallerDialog; + +function ShowPas2jsInstallerDialog: boolean; // returns true if pas2js looks ok and user did not cancel + +implementation + +function ShowPas2jsInstallerDialog: boolean; +begin + Pas2jsInstallerDialog:=TPas2jsInstallerDialog.Create(nil); + try + Pas2jsInstallerDialog.Init; + Result:=Pas2jsInstallerDialog.ShowModal=mrOk; + finally + Pas2jsInstallerDialog.Free; + end; +end; + +{$R *.lfm} + +{ TPas2jsInstallerDialog } + +procedure TPas2jsInstallerDialog.FormCreate(Sender: TObject); +begin + Caption:='Pas2js Installer'; + + Pas2jsExeGroupBox.Caption:='Pas2js executable'; + Pas2jsExeBrowseButton.Hint:='Browse'; + + Pas2jsSrcDirComboBox.Caption:='Pas2js source directory'; + Pas2jsSrcDirBrowseBtn.Hint:='Browse'; + + FPCGroupBox.Caption:='Free Pascal Compiler used for compiling tools and pas2js itself'; + FPCExeLabel.Caption:='FPC executable:'; + FPCExeBrowseButton.Hint:='Browse'; + FPCSrcDirLabel.Caption:='FPC source directory:'; + FPCSrcDirBrowseButton.Hint:='Browse'; + + DetailsGroupBox.Caption:='Details'; + DetailsMemo.Clear; + + ApplyButton.Caption:='Apply'; + CloseButton.Caption:='Close'; +end; + +procedure TPas2jsInstallerDialog.CloseButtonClick(Sender: TObject); +begin + // restore options + PJSOptions.CompilerFilename:=FOldPas2jsExe; + PJSOptions.Pas2jsSrcDir:=FOldPas2jsSrcDir; + PJSOptions.FPCExe:=FOldFPCExe; + PJSOptions.FPCSrcDir:=FOldFPCSrcDir; + + if NeedsApply then + ModalResult:=mrCancel + else if CheckPas2js then + ModalResult:=mrOk + else + ModalResult:=mrCancel; +end; + +procedure TPas2jsInstallerDialog.Pas2jsExeBrowseButtonClick(Sender: TObject); +var + OpenDialog: TOpenDialog; + AFilename: String; +begin + OpenDialog:=TOpenDialog.Create(nil); + try + //InputHistories.ApplyFileDialogSettings(OpenDialog); + OpenDialog.Options:=OpenDialog.Options+[ofPathMustExist]; + OpenDialog.Title:=pjsdSelectPas2jsExecutable; + if OpenDialog.Execute then begin + AFilename:=CleanAndExpandFilename(OpenDialog.Filename); + SetComboBoxText(Pas2jsExeComboBox,AFilename,cstFilename,30); + // ToDo CheckCompiler([mbOk]); + end; + finally + OpenDialog.Free; + end; +end; + +procedure TPas2jsInstallerDialog.UpdateButtons; +begin + if NeedsApply then + begin + ApplyButton.Enabled:=true; + CloseButton.Caption:='Cancel'; + end else begin + ApplyButton.Enabled:=false; + CloseButton.Caption:='Close'; + end; +end; + +function TPas2jsInstallerDialog.NeedsApply: boolean; +var + CurPas2jsExe, CurPas2jsSrcDir, CurFPCExe, CurFPCSrcDir: TCaption; +begin + CurPas2jsExe:=Pas2jsExeComboBox.Text; + CurPas2jsSrcDir:=Pas2jsSrcDirComboBox.Text; + CurFPCExe:=FPCExeComboBox.Text; + CurFPCSrcDir:=FPCSrcDirComboBox.Text; + Result:=(CurPas2jsExe<>FOldPas2jsExe) + or (CurPas2jsSrcDir<>FOldPas2jsSrcDir) + or (CurFPCExe<>FOldFPCExe) + or (CurFPCSrcDir<>FOldFPCSrcDir); +end; + +function TPas2jsInstallerDialog.CheckPas2js: boolean; +var + NewPas2jsExe, NewPas2jsSrcDir: String; +begin + NewPas2jsExe:=PJSOptions.GetParsedCompilerFilename; + NewPas2jsSrcDir:=PJSOptions.GetParsedPas2jsSrcDir; + if (NewPas2jsExe<>FLastCheckedPas2jsExe) + or (NewPas2jsSrcDir<>FLastCheckedPas2jsSrcDir) then + begin + FLastCheckedPas2js:=false; + FLastCheckedPas2jsExe:=NewPas2jsExe; + FLastCheckedPas2jsSrcDir:=NewPas2jsSrcDir; + if (NewPas2jsExe='') or not FileExistsUTF8(NewPas2jsExe) then + else if not FileIsExecutable(NewPas2jsExe) then + else + FLastCheckedPas2js:=true; + end; + Result:=FLastCheckedPas2js; +end; + +procedure TPas2jsInstallerDialog.Init; +begin + FOldPas2jsExe:=PJSOptions.CompilerFilename; + FOldPas2jsSrcDir:=PJSOptions.Pas2jsSrcDir; + FOldFPCExe:=PJSOptions.FPCExe; + FOldFPCSrcDir:=PJSOptions.FPCSrcDir; + + SetComboBoxText(Pas2jsExeComboBox,PJSOptions.CompilerFilename,cstFilename,30); + SetComboBoxText(Pas2jsSrcDirComboBox,PJSOptions.Pas2jsSrcDir,cstFilename,30); + SetComboBoxText(FPCExeComboBox,PJSOptions.FPCExe,cstFilename,30); + SetComboBoxText(FPCSrcDirComboBox,PJSOptions.FPCSrcDir,cstFilename,30); + + UpdateButtons; +end; + +end. + diff --git a/components/pas2js/languages/strpas2jsdesign.fr.po b/components/pas2js/languages/strpas2jsdesign.fr.po index f24a52b731..7eeb5f3d6f 100644 --- a/components/pas2js/languages/strpas2jsdesign.fr.po +++ b/components/pas2js/languages/strpas2jsdesign.fr.po @@ -158,6 +158,11 @@ msgstr "URL du projet en cours Pas2JS" msgid "Pas2JS executable" msgstr "Exécutable Pas2JS" +#: strpas2jsdesign.pjsdpas2jsisnotexecutableat +#, object-pascal-format +msgid "pas2js is not executable at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdpas2jsselectedbrowserexecutable msgid "Pas2JS selected browser executable" msgstr "Exécutable du navigateur sélectionné de Pas2JS" @@ -236,6 +241,10 @@ msgstr "Sélectionner le répertoire du modèle de paquet Atom" msgid "Select browser executable" msgstr "Sélectionner l'exécutable du navigateur" +#: strpas2jsdesign.pjsdselectelectronexecutable +msgid "Select Electron executable" +msgstr "" + #: strpas2jsdesign.pjsdselectnodejsexecutable msgid "Select Node.js executable" msgstr "Sélectionner l'exécutable Node.js" @@ -270,10 +279,20 @@ msgstr "" msgid "Start HTTP Server on port" msgstr "Démarrer le serveur HTTP sur le port" +#: strpas2jsdesign.pjsdthepas2jsexecutablefilenamedoesnotlooklikepas2js +#, object-pascal-format +msgid "The pas2js executable filename \"%s\" does not look like pas2js" +msgstr "" + #: strpas2jsdesign.pjsdthesimplewebserverisautomaticallystartedonrunthelo msgid "The Simple Web Server is automatically started on Run. The location is like a subfolder in the URL serving the disk folder of the HTML file." msgstr "" +#: strpas2jsdesign.pjsdunabletofindpas2jsat +#, object-pascal-format +msgid "Unable to find pas2js at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdusebrowserapplicationobject msgid "Use Browser Application object" msgstr "Utiliser l'objet application du navigateur" @@ -304,6 +323,10 @@ msgstr "" msgid "Visual Studio Code extension template directory" msgstr "Répertoire des modèles d'extension de code Visual Studio" +#: strpas2jsdesign.pjsdwarning +msgid "Warning" +msgstr "" + #: strpas2jsdesign.pjsdwebappdescription msgid "A pas2js program running in the browser." msgstr "Un programme pas2js en cours d'exécution dans le navigateur." diff --git a/components/pas2js/languages/strpas2jsdesign.hu.po b/components/pas2js/languages/strpas2jsdesign.hu.po index a04d38ae1b..e6c4b17eff 100644 --- a/components/pas2js/languages/strpas2jsdesign.hu.po +++ b/components/pas2js/languages/strpas2jsdesign.hu.po @@ -160,6 +160,11 @@ msgstr "Pas2JS aktuális projekt URL" msgid "Pas2JS executable" msgstr "Pas2JS alkalmazás" +#: strpas2jsdesign.pjsdpas2jsisnotexecutableat +#, object-pascal-format +msgid "pas2js is not executable at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdpas2jsselectedbrowserexecutable msgid "Pas2JS selected browser executable" msgstr "Pas2JS kiválasztott böngésző alkalmazás" @@ -238,6 +243,10 @@ msgstr "" msgid "Select browser executable" msgstr "A böngésző alkalmazás kiválasztása" +#: strpas2jsdesign.pjsdselectelectronexecutable +msgid "Select Electron executable" +msgstr "" + #: strpas2jsdesign.pjsdselectnodejsexecutable msgid "Select Node.js executable" msgstr "A Node.js alkalmazás kiválasztása" @@ -272,10 +281,20 @@ msgstr "" msgid "Start HTTP Server on port" msgstr "HTTP kiszolgáló indítása ezen a porton" +#: strpas2jsdesign.pjsdthepas2jsexecutablefilenamedoesnotlooklikepas2js +#, object-pascal-format +msgid "The pas2js executable filename \"%s\" does not look like pas2js" +msgstr "" + #: strpas2jsdesign.pjsdthesimplewebserverisautomaticallystartedonrunthelo msgid "The Simple Web Server is automatically started on Run. The location is like a subfolder in the URL serving the disk folder of the HTML file." msgstr "" +#: strpas2jsdesign.pjsdunabletofindpas2jsat +#, object-pascal-format +msgid "Unable to find pas2js at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdusebrowserapplicationobject msgid "Use Browser Application object" msgstr "Webböngésző alkalmazásobjektum használata" @@ -306,6 +325,10 @@ msgstr "" msgid "Visual Studio Code extension template directory" msgstr "" +#: strpas2jsdesign.pjsdwarning +msgid "Warning" +msgstr "" + #: strpas2jsdesign.pjsdwebappdescription #, fuzzy #| msgid "A pas2js program running in the browser" diff --git a/components/pas2js/languages/strpas2jsdesign.pot b/components/pas2js/languages/strpas2jsdesign.pot index f68b89884e..c03f0a350c 100644 --- a/components/pas2js/languages/strpas2jsdesign.pot +++ b/components/pas2js/languages/strpas2jsdesign.pot @@ -148,6 +148,11 @@ msgstr "" msgid "Pas2JS executable" msgstr "" +#: strpas2jsdesign.pjsdpas2jsisnotexecutableat +#, object-pascal-format +msgid "pas2js is not executable at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdpas2jsselectedbrowserexecutable msgid "Pas2JS selected browser executable" msgstr "" @@ -226,6 +231,10 @@ msgstr "" msgid "Select browser executable" msgstr "" +#: strpas2jsdesign.pjsdselectelectronexecutable +msgid "Select Electron executable" +msgstr "" + #: strpas2jsdesign.pjsdselectnodejsexecutable msgid "Select Node.js executable" msgstr "" @@ -260,10 +269,20 @@ msgstr "" msgid "Start HTTP Server on port" msgstr "" +#: strpas2jsdesign.pjsdthepas2jsexecutablefilenamedoesnotlooklikepas2js +#, object-pascal-format +msgid "The pas2js executable filename \"%s\" does not look like pas2js" +msgstr "" + #: strpas2jsdesign.pjsdthesimplewebserverisautomaticallystartedonrunthelo msgid "The Simple Web Server is automatically started on Run. The location is like a subfolder in the URL serving the disk folder of the HTML file." msgstr "" +#: strpas2jsdesign.pjsdunabletofindpas2jsat +#, object-pascal-format +msgid "Unable to find pas2js at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdusebrowserapplicationobject msgid "Use Browser Application object" msgstr "" @@ -292,6 +311,10 @@ msgstr "" msgid "Visual Studio Code extension template directory" msgstr "" +#: strpas2jsdesign.pjsdwarning +msgid "Warning" +msgstr "" + #: strpas2jsdesign.pjsdwebappdescription msgid "A pas2js program running in the browser." msgstr "" diff --git a/components/pas2js/languages/strpas2jsdesign.pt_BR.po b/components/pas2js/languages/strpas2jsdesign.pt_BR.po index 9f558aa04e..8bc14f4827 100644 --- a/components/pas2js/languages/strpas2jsdesign.pt_BR.po +++ b/components/pas2js/languages/strpas2jsdesign.pt_BR.po @@ -163,6 +163,11 @@ msgstr "URL atual de projeto Pas2JS" msgid "Pas2JS executable" msgstr "Executável Pas2JS" +#: strpas2jsdesign.pjsdpas2jsisnotexecutableat +#, object-pascal-format +msgid "pas2js is not executable at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdpas2jsselectedbrowserexecutable msgid "Pas2JS selected browser executable" msgstr "Executável selecionado do navegador Pas2JS" @@ -241,6 +246,10 @@ msgstr "Selecionar diretório de modelos de pacote do Atom" msgid "Select browser executable" msgstr "Selecionar executável do navegador" +#: strpas2jsdesign.pjsdselectelectronexecutable +msgid "Select Electron executable" +msgstr "" + #: strpas2jsdesign.pjsdselectnodejsexecutable msgid "Select Node.js executable" msgstr "Selecionar executável Node.js" @@ -274,10 +283,20 @@ msgstr "Um programa pas2js executando como cache para um app web. Ele não execu msgid "Start HTTP Server on port" msgstr "Iniciar servidor HTTP na porta" +#: strpas2jsdesign.pjsdthepas2jsexecutablefilenamedoesnotlooklikepas2js +#, object-pascal-format +msgid "The pas2js executable filename \"%s\" does not look like pas2js" +msgstr "" + #: strpas2jsdesign.pjsdthesimplewebserverisautomaticallystartedonrunthelo msgid "The Simple Web Server is automatically started on Run. The location is like a subfolder in the URL serving the disk folder of the HTML file." msgstr "Um Servidor Web Simples é automaticamente iniciado no Executar. A localização é como um subpasta na URL servindo a pasta no disco do arquivo HTML." +#: strpas2jsdesign.pjsdunabletofindpas2jsat +#, object-pascal-format +msgid "Unable to find pas2js at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdusebrowserapplicationobject msgid "Use Browser Application object" msgstr "Usar objeto \"Browser Application\"" @@ -306,6 +325,10 @@ msgstr "Executar programa WebAssembly:" msgid "Visual Studio Code extension template directory" msgstr "Diretório de modelos de extensão de código do Visual Studio" +#: strpas2jsdesign.pjsdwarning +msgid "Warning" +msgstr "" + #: strpas2jsdesign.pjsdwebappdescription msgctxt "strpas2jsdesign.pjsdwebappdescription" msgid "A pas2js program running in the browser." diff --git a/components/pas2js/languages/strpas2jsdesign.ru.po b/components/pas2js/languages/strpas2jsdesign.ru.po index 93fd8ae3eb..efa3b31cac 100644 --- a/components/pas2js/languages/strpas2jsdesign.ru.po +++ b/components/pas2js/languages/strpas2jsdesign.ru.po @@ -161,6 +161,11 @@ msgstr "Адрес текущего проекта Pas2JS" msgid "Pas2JS executable" msgstr "Исполнимый файл Pas2JS" +#: strpas2jsdesign.pjsdpas2jsisnotexecutableat +#, object-pascal-format +msgid "pas2js is not executable at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdpas2jsselectedbrowserexecutable msgid "Pas2JS selected browser executable" msgstr "Выбранный исполнимый файл браузера для Pas2JS" @@ -239,6 +244,10 @@ msgstr "Выберите каталог шаблона пакета Atom" msgid "Select browser executable" msgstr "Выберите исполнимый файл браузера" +#: strpas2jsdesign.pjsdselectelectronexecutable +msgid "Select Electron executable" +msgstr "" + #: strpas2jsdesign.pjsdselectnodejsexecutable msgid "Select Node.js executable" msgstr "Выберите исполнимый файл Node.js" @@ -273,10 +282,20 @@ msgstr "Программа pas2js, использующаяся в качест msgid "Start HTTP Server on port" msgstr "Запускать сервер HTTP на порту" +#: strpas2jsdesign.pjsdthepas2jsexecutablefilenamedoesnotlooklikepas2js +#, object-pascal-format +msgid "The pas2js executable filename \"%s\" does not look like pas2js" +msgstr "" + #: strpas2jsdesign.pjsdthesimplewebserverisautomaticallystartedonrunthelo msgid "The Simple Web Server is automatically started on Run. The location is like a subfolder in the URL serving the disk folder of the HTML file." msgstr "Простой веб-сервер вызывается автоматически при запуске. Расположение по поведению похоже на подкаталог в адресе, соответствующий каталогу файла HTML на диске." +#: strpas2jsdesign.pjsdunabletofindpas2jsat +#, object-pascal-format +msgid "Unable to find pas2js at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdusebrowserapplicationobject msgid "Use Browser Application object" msgstr "Использовать объект приложения для браузера" @@ -305,6 +324,10 @@ msgstr "Запускать программу WebAssembly:" msgid "Visual Studio Code extension template directory" msgstr "Каталог шаблона расширения Visual Studio Code" +#: strpas2jsdesign.pjsdwarning +msgid "Warning" +msgstr "" + #: strpas2jsdesign.pjsdwebappdescription msgid "A pas2js program running in the browser." msgstr "Программа pas2js, запускаемая в браузере." diff --git a/components/pas2js/languages/strpas2jsdesign.tr.po b/components/pas2js/languages/strpas2jsdesign.tr.po index c5467d3853..ef70c70d47 100644 --- a/components/pas2js/languages/strpas2jsdesign.tr.po +++ b/components/pas2js/languages/strpas2jsdesign.tr.po @@ -160,6 +160,11 @@ msgstr "" msgid "Pas2JS executable" msgstr "" +#: strpas2jsdesign.pjsdpas2jsisnotexecutableat +#, object-pascal-format +msgid "pas2js is not executable at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdpas2jsselectedbrowserexecutable msgid "Pas2JS selected browser executable" msgstr "" @@ -238,6 +243,10 @@ msgstr "" msgid "Select browser executable" msgstr "" +#: strpas2jsdesign.pjsdselectelectronexecutable +msgid "Select Electron executable" +msgstr "" + #: strpas2jsdesign.pjsdselectnodejsexecutable msgid "Select Node.js executable" msgstr "" @@ -272,10 +281,20 @@ msgstr "" msgid "Start HTTP Server on port" msgstr "" +#: strpas2jsdesign.pjsdthepas2jsexecutablefilenamedoesnotlooklikepas2js +#, object-pascal-format +msgid "The pas2js executable filename \"%s\" does not look like pas2js" +msgstr "" + #: strpas2jsdesign.pjsdthesimplewebserverisautomaticallystartedonrunthelo msgid "The Simple Web Server is automatically started on Run. The location is like a subfolder in the URL serving the disk folder of the HTML file." msgstr "" +#: strpas2jsdesign.pjsdunabletofindpas2jsat +#, object-pascal-format +msgid "Unable to find pas2js at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdusebrowserapplicationobject msgid "Use Browser Application object" msgstr "" @@ -304,6 +323,10 @@ msgstr "" msgid "Visual Studio Code extension template directory" msgstr "" +#: strpas2jsdesign.pjsdwarning +msgid "Warning" +msgstr "" + #: strpas2jsdesign.pjsdwebappdescription #, fuzzy #| msgid "A pas2js program running in the browser" diff --git a/components/pas2js/languages/strpas2jsdesign.uk.po b/components/pas2js/languages/strpas2jsdesign.uk.po index 1a55e5bb83..4257c284f9 100644 --- a/components/pas2js/languages/strpas2jsdesign.uk.po +++ b/components/pas2js/languages/strpas2jsdesign.uk.po @@ -163,6 +163,11 @@ msgstr "URL поточного проєкту Pas2JS" msgid "Pas2JS executable" msgstr "Виконуваний файл Pas2JS" +#: strpas2jsdesign.pjsdpas2jsisnotexecutableat +#, object-pascal-format +msgid "pas2js is not executable at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdpas2jsselectedbrowserexecutable msgid "Pas2JS selected browser executable" msgstr "Виконуваний файл вибраного оглядача Pas2JS" @@ -241,6 +246,10 @@ msgstr "Виберіть теку шаблонів пакунка Atom" msgid "Select browser executable" msgstr "Вибрати виконуваний файл оглядача" +#: strpas2jsdesign.pjsdselectelectronexecutable +msgid "Select Electron executable" +msgstr "" + #: strpas2jsdesign.pjsdselectnodejsexecutable msgid "Select Node.js executable" msgstr "Вибрати виконуваний файл Node.js" @@ -275,10 +284,20 @@ msgstr "Програма на pas2js, що працює як кеш для ве msgid "Start HTTP Server on port" msgstr "Запустити HTTP-сервер на порті" +#: strpas2jsdesign.pjsdthepas2jsexecutablefilenamedoesnotlooklikepas2js +#, object-pascal-format +msgid "The pas2js executable filename \"%s\" does not look like pas2js" +msgstr "" + #: strpas2jsdesign.pjsdthesimplewebserverisautomaticallystartedonrunthelo msgid "The Simple Web Server is automatically started on Run. The location is like a subfolder in the URL serving the disk folder of the HTML file." msgstr "Простий вебсервер автоматично стартує під час запуску. Розташування схоже на вкладену теку в URL-адресі, яка обслуговує дискову теку файлу HTML." +#: strpas2jsdesign.pjsdunabletofindpas2jsat +#, object-pascal-format +msgid "Unable to find pas2js at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdusebrowserapplicationobject msgid "Use Browser Application object" msgstr "Використати об'єкт програми-оглядача" @@ -307,6 +326,10 @@ msgstr "Запустити програму WebAssembly:" msgid "Visual Studio Code extension template directory" msgstr "Теку шаблонів розширень Visual Studio Code" +#: strpas2jsdesign.pjsdwarning +msgid "Warning" +msgstr "" + #: strpas2jsdesign.pjsdwebappdescription msgid "A pas2js program running in the browser." msgstr "Програма pas2js, що запускається в оглядачі." diff --git a/components/pas2js/languages/strpas2jsdesign.zh_CN.po b/components/pas2js/languages/strpas2jsdesign.zh_CN.po index 9c701af7b6..8fd3369dac 100644 --- a/components/pas2js/languages/strpas2jsdesign.zh_CN.po +++ b/components/pas2js/languages/strpas2jsdesign.zh_CN.po @@ -162,6 +162,11 @@ msgstr "Pas2JS 当前项目 URL" msgid "Pas2JS executable" msgstr "Pas2JS 可执行文件" +#: strpas2jsdesign.pjsdpas2jsisnotexecutableat +#, object-pascal-format +msgid "pas2js is not executable at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdpas2jsselectedbrowserexecutable msgid "Pas2JS selected browser executable" msgstr "Pas2JS 所选浏览器可执行文件" @@ -240,6 +245,10 @@ msgstr "选择 Atom 软件包模板目录" msgid "Select browser executable" msgstr "选择浏览器可执行文件" +#: strpas2jsdesign.pjsdselectelectronexecutable +msgid "Select Electron executable" +msgstr "" + #: strpas2jsdesign.pjsdselectnodejsexecutable msgid "Select Node.js executable" msgstr "选择 Node.js 可执行文件" @@ -274,10 +283,20 @@ msgstr "作为网页应用程序缓存运行的 pas2js 程序。它不能独立 msgid "Start HTTP Server on port" msgstr "启动 HTTP 服务器在端口" +#: strpas2jsdesign.pjsdthepas2jsexecutablefilenamedoesnotlooklikepas2js +#, object-pascal-format +msgid "The pas2js executable filename \"%s\" does not look like pas2js" +msgstr "" + #: strpas2jsdesign.pjsdthesimplewebserverisautomaticallystartedonrunthelo msgid "The Simple Web Server is automatically started on Run. The location is like a subfolder in the URL serving the disk folder of the HTML file." msgstr "运行时会自动启动简易网站服务器。路径就像 URL 中的一个子文件夹,为 HTML 文件的磁盘文件夹提供服务。" +#: strpas2jsdesign.pjsdunabletofindpas2jsat +#, object-pascal-format +msgid "Unable to find pas2js at \"%s\"" +msgstr "" + #: strpas2jsdesign.pjsdusebrowserapplicationobject msgid "Use Browser Application object" msgstr "使用浏览器应用程序对象" @@ -306,6 +325,10 @@ msgstr "运行 WebAssembly 程序:" msgid "Visual Studio Code extension template directory" msgstr "Visual Studio Code 扩展模板目录" +#: strpas2jsdesign.pjsdwarning +msgid "Warning" +msgstr "" + #: strpas2jsdesign.pjsdwebappdescription msgid "A pas2js program running in the browser." msgstr "在浏览器中运行的 pas2js 程序。" diff --git a/components/pas2js/pas2jsdsgn.lpk b/components/pas2js/pas2jsdsgn.lpk index a5f2f47ec0..00643bc83a 100644 --- a/components/pas2js/pas2jsdsgn.lpk +++ b/components/pas2js/pas2jsdsgn.lpk @@ -14,11 +14,14 @@ + + + - + @@ -102,6 +105,11 @@ + + + + + diff --git a/components/pas2js/pjsdsgnoptions.pas b/components/pas2js/pjsdsgnoptions.pas index 84bbc69fb5..f3be9ca786 100644 --- a/components/pas2js/pjsdsgnoptions.pas +++ b/components/pas2js/pjsdsgnoptions.pas @@ -21,6 +21,9 @@ uses const PJSDsgnOptsFile = 'pas2jsdsgnoptions.xml'; PJSDefaultCompiler = '$MakeExe(IDE,pas2js)'; + PJSDefaultPas2jsSrcDir = ''; + PJSDefaultFPCSrcDir = '$(Pas2jsSrcDir)/compiler'; + PJSDefaultFPCExe= ''; PJSDefaultDTS2Pas = '$MakeExe(IDE,dts2pas)'; PJSDefaultDTS2PasService = 'https://www.freepascal.org/~michael/service/dts2pas.cgi'; PJSDefaultStartAtPort = 3000; // compileserver default port @@ -32,6 +35,9 @@ const Type TPas2jsCachedOption = ( p2jcoCompilerFilename, + p2jcoPas2jsSrcDir, + p2jcoFPCSrcDir, // fpc source directory used for compiling tools and pas2js + p2jcoFPCExe, // fpc used for compiling tools p2jcoNodeJSFilename, p2jcoElectronFilename, p2jcoAtomTemplateDir, @@ -44,12 +50,17 @@ Type const p2jcoFilenames = [ p2jcoCompilerFilename, + p2jcoFPCExe, p2jcoNodeJSFilename, p2jcoElectronFilename, p2jcoAtomTemplateDir, p2jcoVSCodeTemplateDir, p2jcoDTSToPas ]; + p2jcoDirectories = [ + p2jcoPas2jsSrcDir, + p2jcoFPCSrcDir + ]; type TPas2jsCachedValue = record @@ -74,6 +85,9 @@ type function GetDTS2Pas: String; function GetDTS2PasService: String; function GetElectronFileName: string; + function GetFPCExe: string; + function GetFPCSrcDir: string; + function GetPas2jsSrcDir: string; function GetVSCodeTemplateDir: String; function GetModified: boolean; function GetNodeJSFileName: string; @@ -82,6 +96,9 @@ type procedure SetDTS2Pas(AValue: String); procedure SetDTS2PasService(AValue: String); procedure SetElectronFileName(AValue: string); + procedure SetFPCExe(AValue: string); + procedure SetFPCSrcDir(AValue: string); + procedure SetPas2jsSrcDir(AValue: string); procedure SetVSCodeTemplateDir(AValue: String); procedure SetModified(AValue: boolean); procedure SetCompilerFilename(AValue: string); @@ -95,6 +112,7 @@ type procedure Load; procedure Save; function GetParsedCompilerFilename: string; + function GetParsedPas2jsSrcDir: string; function GetParsedNodeJSFilename: string; function GetParsedElectronExe: string; procedure LoadFromConfig(Cfg: TConfigStorage); @@ -103,6 +121,9 @@ type property ChangeStamp: int64 read FChangeStamp; property Modified: boolean read GetModified write SetModified; property CompilerFilename: string read GetCompilerFilename write SetCompilerFilename; + property Pas2jsSrcDir: string read GetPas2jsSrcDir write SetPas2jsSrcDir; // with trailing pathdelim + property FPCSrcDir: string read GetFPCSrcDir write SetFPCSrcDir; // used for compiling tools and pas2js, with trailing pathdelim + property FPCExe: string read GetFPCExe write SetFPCExe; // used for compiling tools property NodeJSFileName : string Read GetNodeJSFileName Write SetNodeJSFileName; property ElectronFileName : string Read GetElectronFileName Write SetElectronFileName; property AtomTemplateDir : String Read GetAtomTemplateDir Write SetAtomTemplateDir; @@ -218,6 +239,21 @@ begin Result:=FCachedOptions[p2jcoElectronFilename].RawValue; end; +function TPas2jsOptions.GetFPCExe: string; +begin + Result:=FCachedOptions[p2jcoFPCExe].RawValue; +end; + +function TPas2jsOptions.GetFPCSrcDir: string; +begin + Result:=FCachedOptions[p2jcoFPCSrcDir].RawValue; +end; + +function TPas2jsOptions.GetPas2jsSrcDir: string; +begin + Result:=FCachedOptions[p2jcoPas2jsSrcDir].RawValue; +end; + function TPas2jsOptions.GetVSCodeTemplateDir: String; begin Result:=FCachedOptions[p2jcoVSCodeTemplateDir].RawValue; @@ -292,6 +328,9 @@ end; Const KeyCompiler = 'compiler/value'; + KeyPas2jsSrcDir = 'sources/value'; + KeyFPCSrcDir = 'fpcsrcdir/value'; + KeyFPCExe= 'fpc/value'; KeyHTTPServer = 'webserver/value'; KeyBrowser = 'webbrowser/value'; KeyNodeJS = 'nodejs/value'; @@ -306,6 +345,9 @@ procedure TPas2jsOptions.LoadFromConfig(Cfg: TConfigStorage); begin CompilerFilename:=Cfg.GetValue(KeyCompiler,PJSDefaultCompiler); + Pas2jsSrcDir:=Cfg.GetValue(KeyPas2jsSrcDir,PJSDefaultPas2jsSrcDir); + FPCSrcDir:=Cfg.GetValue(KeyFPCSrcDir,PJSDefaultFPCSrcDir); + FPCExe:=Cfg.GetValue(KeyFPCExe,PJSDefaultFPCExe); NodeJSFileName:=Cfg.GetValue(KeyNodeJS,PJSDefaultNodeJS); ElectronFileName:=Cfg.GetValue(KeyElectronExe,PJSDefaultElectronExe); AtomTemplateDir:=Cfg.GetValue(KeyAtomTemplate,''); @@ -325,6 +367,9 @@ procedure TPas2jsOptions.SaveToConfig(Cfg: TConfigStorage); begin Cfg.SetDeleteValue(KeyCompiler,CompilerFilename,PJSDefaultCompiler); + Cfg.SetDeleteValue(KeyPas2jsSrcDir,Pas2jsSrcDir,PJSDefaultPas2jsSrcDir); + Cfg.SetDeleteValue(KeyFPCSrcDir,FPCSrcDir,PJSDefaultFPCSrcDir); + Cfg.SetDeleteValue(KeyFPCExe,FPCExe,PJSDefaultFPCExe); Cfg.SetDeleteValue(KeyStartPortAt,StartAtPort,PJSDefaultStartAtPort); Cfg.SetDeleteValue(KeyNodeJS,NodeJSFileName,PJSDefaultNodeJS); Cfg.SetDeleteValue(KeyElectronExe,ElectronFileName,PJSDefaultElectronExe); @@ -345,6 +390,11 @@ begin Result:=GetParsedOptionValue(p2jcoCompilerFilename); end; +function TPas2jsOptions.GetParsedPas2jsSrcDir: string; +begin + Result:=GetParsedOptionValue(p2jcoPas2jsSrcDir); +end; + function TPas2jsOptions.GetParsedNodeJSFilename: string; begin Result:=GetParsedOptionValue(p2jcoNodeJSFilename); @@ -359,7 +409,7 @@ function TPas2jsOptions.GetParsedOptionValue(Option: TPas2jsCachedOption ): string; var p: PPas2jsCachedValue; - IsFilename: Boolean; + IsFilename, IsDirectory: Boolean; begin p:=@FCachedOptions[Option]; if p^.Stamp<>IDEMacros.BaseTimeStamp then @@ -368,6 +418,7 @@ begin p^.ParsedValue:=p^.RawValue; IDEMacros.SubstituteMacros(p^.ParsedValue); IsFilename:=Option in p2jcoFilenames; + IsDirectory:=Option in p2jcoDirectories; if IsFilename then begin p^.ParsedValue:=TrimFilename(p^.ParsedValue); @@ -380,6 +431,15 @@ begin p^.ParsedValue:=''; // not found end; end; + if IsDirectory then + begin + p^.ParsedValue:=TrimFilename(p^.ParsedValue); + if (p^.ParsedValue<>'') + and not FilenameIsAbsolute(p^.ParsedValue) then + begin + p^.ParsedValue:=''; // not found + end; + end; if p^.ParsedValue='' then begin case Option of @@ -423,6 +483,24 @@ begin SetCachedOption(p2jcoElectronFilename,AValue); end; +procedure TPas2jsOptions.SetFPCExe(AValue: string); +begin + AValue:=TrimFilename(AValue); + SetCachedOption(p2jcoFPCExe,AValue); +end; + +procedure TPas2jsOptions.SetFPCSrcDir(AValue: string); +begin + AValue:=AppendPathDelim(TrimFilename(AValue)); + SetCachedOption(p2jcoFPCSrcDir,AValue); +end; + +procedure TPas2jsOptions.SetPas2jsSrcDir(AValue: string); +begin + AValue:=AppendPathDelim(TrimFilename(AValue)); + SetCachedOption(p2jcoPas2jsSrcDir,AValue); +end; + procedure TPas2jsOptions.SetVSCodeTemplateDir(AValue: String); begin AValue:=TrimFilename(AValue); diff --git a/components/pas2js/pjsdsgnoptsframe.pas b/components/pas2js/pjsdsgnoptsframe.pas index b5b7d32d9b..b8e6e6210d 100644 --- a/components/pas2js/pjsdsgnoptsframe.pas +++ b/components/pas2js/pjsdsgnoptsframe.pas @@ -130,7 +130,7 @@ begin try InitIDEFileDialog(OpenDialog); OpenDialog.Options:=OpenDialog.Options+[ofPathMustExist]; - OpenDialog.Title:='Select Electron executable'; + OpenDialog.Title:=pjsdSelectElectronExecutable; if OpenDialog.Execute then begin AFilename:=CleanAndExpandFilename(OpenDialog.Filename); SetComboBoxText(ElectronExeComboBox,AFilename,cstFilename,30); @@ -175,19 +175,21 @@ begin PJSOptions.CompilerFilename:=NewExe; NewExe:=PJSOptions.GetParsedCompilerFilename; if (NewExe='') or not FileExistsUTF8(NewExe) then - ErrMsg:='Unable to find pas2js at "'+PJSOptions.CompilerFilename+'"' + ErrMsg:=Format(pjsdUnableToFindPas2jsAt, [PJSOptions.CompilerFilename]) else if not FileIsExecutable(NewExe) then - ErrMsg:='pas2js is not executable at "'+PJSOptions.CompilerFilename+'"' + ErrMsg:=Format(pjsdPas2jsIsNotExecutableAt, [PJSOptions.CompilerFilename]) else ErrMsg:=''; if ErrMsg<>'' then begin - IDEMessageDialog('Error',ErrMsg,mtError,[mbOk]); + IDEMessageDialog(pjsdError, ErrMsg, mtError, [mbOk]); exit(false); end; if PosI('pas2js',ExtractFileNameOnly(NewExe))<1 then begin - IDEMessageDialog('Warning','The pas2js executable filename "'+NewExe+'" does not look like pas2js',mtWarning,[mbOk]); + IDEMessageDialog(pjsdWarning, Format( + pjsdThePas2jsExecutableFilenameDoesNotLookLikePas2js, [NewExe]), + mtWarning, [mbOk]); exit(true); end; // todo: run and check if this pas2js returns macros diff --git a/components/pas2js/pjsdsgnregister.pas b/components/pas2js/pjsdsgnregister.pas index a300fe2087..d55117ddc6 100644 --- a/components/pas2js/pjsdsgnregister.pas +++ b/components/pas2js/pjsdsgnregister.pas @@ -18,9 +18,9 @@ uses IDEDialogs, ProjectGroupIntf, IDEExternToolIntf, MacroIntf, PackageIntf, // Pas2js idehtml2class, PJSDsgnOptions, PJSDsgnOptsFrame, idedtstopas, - frmpas2jsnodejsprojectoptions, - frmpas2jsbrowserprojectoptions, PJSProjectOptions, idehtmltools, - frmhtmltoform, PJSController, StrPas2JSDesign, ProjectGroup; + frmpas2jsnodejsprojectoptions, frmpas2jsbrowserprojectoptions, + PJSProjectOptions, idehtmltools, frmhtmltoform, PJSController, + StrPas2JSDesign, FrmPas2jsInstaller, ProjectGroup; const ProjDescNamePas2JSWebApp = 'Web Application'; @@ -314,6 +314,7 @@ Type Procedure OnRefreshProjHTMLFormAllContext(Sender : TObject); virtual; Procedure OnSrcEditPopup(Sender : TObject); virtual; Procedure OnPrjInspPopup(Sender : TObject); virtual; + Procedure OnInstallPas2js(Sender : TObject); virtual; end; Var @@ -350,7 +351,7 @@ begin {$IFDEF EnablePas2jsInstall} // register menu item - RegisterIDEMenuCommand(itmCustomTools,'Pas2jsInstall','Install/Update Pas2js',@OnInstallPas2js); + RegisterIDEMenuCommand(itmOptionsDialogs,'Pas2jsInstall','Install/Update Pas2js',@Pas2JSHandler.OnInstallPas2js); {$ENDIF} // register new-project items @@ -1859,6 +1860,11 @@ begin PrjMnuItemAll.Visible:=AnyOK; end; +procedure TPas2JSHandler.OnInstallPas2js(Sender: TObject); +begin + ShowPas2jsInstallerDialog; +end; + function TPas2JSHandler.AskUserFile(aUnitName,aHTMLFileName: String): string; Var diff --git a/components/pas2js/strpas2jsdesign.pp b/components/pas2js/strpas2jsdesign.pp index ee2ffbbf48..1f06dd71c5 100644 --- a/components/pas2js/strpas2jsdesign.pp +++ b/components/pas2js/strpas2jsdesign.pp @@ -16,6 +16,9 @@ Resourcestring +'using Electron to run as desktop application.'; pjsdOverwrite = 'Overwrite?'; pjsdError = 'Error'; + pjsdWarning = 'Warning'; + pjsdThePas2jsExecutableFilenameDoesNotLookLikePas2js = 'The pas2js ' + +'executable filename "%s" does not look like pas2js'; pjsdNewProjectFile = 'New project file'; pjsdProjectPascalFile = 'Project Pascal file'; pjsdPleaseChooseAFileWithFullPath = 'Please choose a file with full path.'; @@ -36,8 +39,11 @@ Resourcestring pjsdSelectPas2jsExecutable = 'Select pas2js executable'; pjsdSelectXExecutable = 'Select %s executable'; pjsdSelectNodeJSExecutable = 'Select Node.js executable'; + pjsdUnableToFindPas2jsAt = 'Unable to find pas2js at "%s"'; + pjsdPas2jsIsNotExecutableAt = 'pas2js is not executable at "%s"'; pjsdSelectBrowserExecutable = 'Select browser executable'; pjsdSelectAtomTemplateDir = 'Select Atom package template directory'; + pjsdSelectElectronExecutable = 'Select Electron executable'; pjsdSelectVSCodeTemplateDir = 'Select Visual Studio Code extension template directory'; pjsdYouCanUseIDEMacrosLikeMakeExeWithoutAFullPathIsSea = 'You can use IDE ' +'macros like $MakeExe(). Without a full path, %s is searched in PATH.';