mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 07:21:32 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			405 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			405 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| unit PJSProjectOptions;
 | |
| 
 | |
| {$mode objfpc}{$H+}
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   Classes, SysUtils, Math,
 | |
|   // LCL
 | |
|   StdCtrls, Spin,
 | |
|   // LazUtils
 | |
|   LazLoggerBase, LazFileUtils, LazUTF8,
 | |
|   // IdeIntf
 | |
|   LazIDEIntf, ProjectIntf, CompOptsIntf, IDEOptionsIntf, IDEOptEditorIntf,
 | |
|   // pas2js
 | |
|   PJSDsgnOptions, PJSController, StrPas2JSDesign;
 | |
| 
 | |
| type
 | |
| 
 | |
|   { TPas2JSProjectOptionsFrame }
 | |
| 
 | |
|   TPas2JSProjectOptionsFrame = class(TAbstractIDEOptionsEditor)
 | |
|     BMakePas2jsPoject: TButton;
 | |
|     BResetRunCommand: TButton;
 | |
|     BResetCompileCommand: TButton;
 | |
|     CBLocation: TComboBox;
 | |
|     CBRunOnReady: TCheckBox;
 | |
|     CBServerURL: TComboBox;
 | |
|     CBUseBrowserConsole: TCheckBox;
 | |
|     CBWebProject: TCheckBox;
 | |
|     CBHTMLFile: TComboBox;
 | |
|     CBMaintainHTMLFile: TCheckBox;
 | |
|     ComboBoxRunLocation: TComboBox;
 | |
|     LCBProjectHTMLFile: TLabel;
 | |
|     RBLocation: TRadioButton;
 | |
|     RBRunDefault: TRadioButton;
 | |
|     RBStartServerAt: TRadioButton;
 | |
|     RBUseURL: TRadioButton;
 | |
|     RunGroupBox: TGroupBox;
 | |
|     SEPort: TSpinEdit;
 | |
|     procedure BMakePas2jsPojectClick(Sender: TObject);
 | |
|     procedure BResetCompileCommandClick(Sender: TObject);
 | |
|     procedure BResetRunCommandClick(Sender: TObject);
 | |
|     procedure CBMaintainHTMLFileChange(Sender: TObject);
 | |
|     procedure CBWebProjectChange(Sender: TObject);
 | |
|     procedure RBLocationChange(Sender: TObject);
 | |
|     procedure RBStartServerAtChange(Sender: TObject);
 | |
|     procedure RBUseURLChange(Sender: TObject);
 | |
|   private
 | |
|     procedure CheckAllControls(aEnabled: Boolean);
 | |
|     procedure UpdateHTMLControls;
 | |
|     function FillFilesCombo(PRJ: TLazProject): Integer;
 | |
|     procedure UpdateRunControls;
 | |
|   public
 | |
|     function GetTitle: string; override;
 | |
|     procedure Setup({%H-}ADialog: TAbstractOptionsEditorDialog); override;
 | |
|     procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
 | |
|     procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
 | |
|     class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
 | |
|   end;
 | |
| 
 | |
| Procedure SetDefaultWebRunParams(RunParams : TAbstractRunParamsOptionsMode);
 | |
| Procedure SetDefaultServiceWorkerRunParams(RunParams : TAbstractRunParamsOptionsMode);
 | |
| Procedure SetDefaultNodeRunParams(RunParams : TAbstractRunParamsOptionsMode);
 | |
| Procedure SetDefaultWebCompileOptions(CompOpts: TLazCompilerOptions);
 | |
| Procedure SetDefaultNodeJSCompileOptions(CompOpts: TLazCompilerOptions);
 | |
| Procedure SetDefaultModuleCompileOptions(CompOpts: TLazCompilerOptions);
 | |
| 
 | |
| 
 | |
| implementation
 | |
| 
 | |
| {$R *.lfm}
 | |
| 
 | |
| Procedure ResetRunParams(RunParams : TAbstractRunParamsOptionsMode);
 | |
| 
 | |
| begin
 | |
|   RunParams.HostApplicationFilename:='';
 | |
|   RunParams.CmdLineParams:='';
 | |
|   RunParams.UseLaunchingApplication:=True;
 | |
| end;
 | |
| 
 | |
| Procedure SetDefaultWebRunParams(RunParams : TAbstractRunParamsOptionsMode);
 | |
| 
 | |
| begin
 | |
|   ResetRunParams(RunParams);
 | |
|   RunParams.LaunchingApplicationPathPlusParams:='"$(Pas2JSBrowser)" "$(Pas2JSProjectURL)"';
 | |
| end;
 | |
| 
 | |
| procedure SetDefaultServiceWorkerRunParams(
 | |
|   RunParams: TAbstractRunParamsOptionsMode);
 | |
| begin
 | |
|   RunParams.HostApplicationFilename:='';
 | |
|   RunParams.CmdLineParams:='';
 | |
|   RunParams.UseLaunchingApplication:=False;
 | |
| end;
 | |
| 
 | |
| Procedure SetDefaultNodeRunParams(RunParams : TAbstractRunParamsOptionsMode);
 | |
| 
 | |
| begin
 | |
|   ResetRunParams(RunParams);
 | |
|   RunParams.LaunchingApplicationPathPlusParams:='"$(Pas2JSNodeJS)" "$MakeDir($(ProjPath))$NameOnly($(ProjFile)).js"';
 | |
| end;
 | |
| 
 | |
| Procedure SetPasJSCompileOptions(CompOpts: TLazCompilerOptions;
 | |
|   TargetOS, CustomOpts : String);
 | |
| 
 | |
| Var
 | |
|   Compiler : String;
 | |
| 
 | |
| begin
 | |
|   //DebugLn(['SetPasJSCompileOptions START']);
 | |
|   CompOpts.UnitOutputDirectory:='js';
 | |
| 
 | |
|   CompOpts.TargetFileExt:='.js';
 | |
|   CompOpts.TargetOS:=TargetOS;
 | |
| 
 | |
|   CompOpts.AllowLabel:=false;
 | |
|   CompOpts.UseAnsiStrings:=false;
 | |
|   CompOpts.CPPInline:=false;
 | |
| 
 | |
|   CompOpts.IOChecks:=false;
 | |
|   CompOpts.StackChecks:=false;
 | |
|   CompOpts.SmartLinkUnit:=false;
 | |
| 
 | |
|   CompOpts.GenerateDebugInfo:=false;
 | |
|   CompOpts.DebugInfoType:=dsAuto;
 | |
|   CompOpts.UseLineInfoUnit:=false;
 | |
|   CompOpts.UseHeaptrc:=false;
 | |
|   CompOpts.Win32GraphicApp:=false;
 | |
| 
 | |
|   CompOpts.WriteFPCLogo:=true;
 | |
|   CompOpts.CustomOptions:=CustomOpts;
 | |
| 
 | |
|   Compiler:='$(pas2js)';
 | |
|   CompOpts.CompilerPath:=Compiler;
 | |
|   debugln(['Hint: (lazarus) [pjsprojectoptions.SetPasJSCompileOptions] Compiler=',CompOpts.CompilerPath,' TargetOS=',CompOpts.TargetOS,' Custom="',CompOpts.CustomOptions,'"']);
 | |
| end;
 | |
| 
 | |
| Procedure SetDefaultWebCompileOptions(CompOpts: TLazCompilerOptions);
 | |
| 
 | |
| begin
 | |
|   SetPasJSCompileOptions(CompOpts,'browser','-Jeutf-8 -Jirtl.js -Jc -Jminclude');
 | |
| end;
 | |
| 
 | |
| Procedure SetDefaultNodeJSCompileOptions(CompOpts: TLazCompilerOptions);
 | |
| 
 | |
| begin
 | |
|   SetPasJSCompileOptions(CompOpts,'nodejs','-Jeutf-8 -Jminclude');
 | |
| end;
 | |
| 
 | |
| Procedure SetDefaultModuleCompileOptions(CompOpts: TLazCompilerOptions);
 | |
| 
 | |
| begin
 | |
|   SetPasJSCompileOptions(CompOpts,'module','-Jeutf-8 -Jirtl.js -Jc -Jminclude');
 | |
| end;
 | |
| 
 | |
| { TPas2JSProjectOptionsFrame }
 | |
| 
 | |
| function TPas2JSProjectOptionsFrame.GetTitle: string;
 | |
| begin
 | |
|   Result:=pjsdWebProjectPas2js;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
 | |
| begin
 | |
|   CBWebProject.Caption:=pjsdProjectIsAWebBrowserPas2jsProject;
 | |
|   LCBProjectHTMLFile.Caption:=pjsdProjectHTMLPage;
 | |
|   CBMaintainHTMLFile.Caption:=pjsdMaintainHTMLPage;
 | |
|   CBUseBrowserConsole.Caption:=pjsdUseBrowserConsoleUnitToDisplayWritelnOutput;
 | |
|   CBRunOnReady.Caption:=pjsdRunRTLWhenAllPageResourcesAreFullyLoaded;
 | |
| 
 | |
|   RunGroupBox.Caption:=pjsdRun;
 | |
|   RBLocation.Caption:=pjsdLocationOnSimpleWebServer;
 | |
|   RBLocation.Hint:=pjsdTheSimpleWebServerIsAutomaticallyStartedOnRunTheLo;
 | |
|   RBStartServerAt.Caption:=pjsdStartHTTPServerOnPort;
 | |
|   RBUseURL.Caption:=pjsdUseThisURLToStartApplication;
 | |
|   RBUseURL.Hint:=pjsdUseThisWhenYouStartYourOwnHttpServer;
 | |
|   RBRunDefault.Caption:=pjsExecuteRunParameters;
 | |
| 
 | |
|   BResetRunCommand.Caption:=pjsdResetRunCommand;
 | |
|   BResetCompileCommand.Caption:=pjsdResetCompileCommand;
 | |
|   BMakePas2jsPoject.Caption:=pjsMakePas2jsProject;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.CBWebProjectChange(Sender: TObject);
 | |
| begin
 | |
|   CheckAllControls(CBWebProject.Checked);
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.RBLocationChange(Sender: TObject);
 | |
| begin
 | |
|   UpdateRunControls;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.RBStartServerAtChange(Sender: TObject);
 | |
| begin
 | |
|   UpdateRunControls;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.RBUseURLChange(Sender: TObject);
 | |
| begin
 | |
|   UpdateRunControls;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.CBMaintainHTMLFileChange(Sender: TObject);
 | |
| begin
 | |
|   UpdateHTMLControls;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.BResetRunCommandClick(Sender: TObject);
 | |
| 
 | |
| Var
 | |
|   Prj : TLazProject;
 | |
| 
 | |
| begin
 | |
|   PRJ:=LazarusIDE.ActiveProject;
 | |
|   SetDefaultWebRunParams(Prj.RunParameters.GetOrCreate('Default'));
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.BResetCompileCommandClick(Sender: TObject);
 | |
| 
 | |
| Var
 | |
|   Prj : TLazProject;
 | |
| 
 | |
| begin
 | |
|   PRJ:=LazarusIDE.ActiveProject;
 | |
|   SetDefaultWebCompileOptions(PRJ.LazBuildModes.BuildModes[0].LazCompilerOptions);
 | |
|   SetDefaultWebCompileOptions(PRJ.LazCompilerOptions);
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.BMakePas2jsPojectClick(Sender: TObject);
 | |
| Var
 | |
|   Prj : TLazProject;
 | |
| 
 | |
| begin
 | |
|   PRJ:=LazarusIDE.ActiveProject;
 | |
|   PRJ.CustomData.Values[PJSProject]:='1';
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.UpdateHTMLControls;
 | |
| begin
 | |
|   CBUseBrowserConsole.Enabled:=CBWebProject.Enabled and CBMaintainHTMLFile.Enabled;
 | |
|   CBRunOnReady.Enabled:=CBUseBrowserConsole.Enabled;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.CheckAllControls(aEnabled : Boolean);
 | |
| 
 | |
| begin
 | |
|   CBHTMLFile.Enabled:=aEnabled;
 | |
| 
 | |
|   CBMaintainHTMLFile.Enabled:=aEnabled;
 | |
|   CBUseBrowserConsole.Enabled:=aEnabled;
 | |
|   CBRunOnReady.Enabled:=aEnabled;
 | |
| 
 | |
|   RBStartServerAt.Enabled:=aEnabled;
 | |
|   SEPort.Enabled:=aEnabled and RBStartServerAt.Checked;
 | |
|   RBUseURL.Enabled:=aEnabled;
 | |
|   CBServerURL.Enabled:=aEnabled and RBUseURL.Checked;
 | |
|   RBRunDefault.Enabled:=aEnabled;
 | |
| 
 | |
|   BResetRunCommand.enabled:=aEnabled;
 | |
|   BResetCompileCommand.Enabled:=aEnabled;
 | |
| end;
 | |
| 
 | |
| // Fill combo with HTM(L) files.
 | |
| // Return index of file that has IsProjectHTMLFile set.
 | |
| function TPas2JSProjectOptionsFrame.FillFilesCombo(PRJ: TLazProject): Integer;
 | |
| 
 | |
| Var
 | |
|   I : integer;
 | |
|   HPF,PF : TLazProjectFile;
 | |
|   L : TStringListUTF8Fast;
 | |
| 
 | |
| begin
 | |
|   Result:=-1;
 | |
|   HPF:=Nil;
 | |
|   L:=TStringListUTF8Fast.Create;
 | |
|   try
 | |
|     For I:=0 to PRJ.FileCount-1 do
 | |
|       begin
 | |
|       PF:=PRJ.Files[i];
 | |
|       if FilenameExtIs(PF.Filename,'html') then
 | |
|         begin
 | |
|         L.AddObject(PF.FileName,PF);
 | |
|         If PF.CustomData[PJSIsProjectHTMLFile]='1' then
 | |
|           HPF:=PF;
 | |
|         end;
 | |
|       end;
 | |
|     L.Sort;
 | |
|     CBHTMLFile.Items:=L;
 | |
|   finally
 | |
|     L.Free;
 | |
|   end;
 | |
|   if (HPF<>Nil) then
 | |
|     Result:=CBHTMLFile.Items.IndexOfObject(HPF);
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.UpdateRunControls;
 | |
| begin
 | |
|   CBLocation.Enabled:=CBWebProject.Enabled and RBLocation.Enabled and RBLocation.Checked;
 | |
|   SEPort.Enabled:=CBWebProject.Enabled and RBStartServerAt.Enabled and RBStartServerAt.Checked;
 | |
|   CBServerURL.Enabled:=CBWebProject.Enabled and RBUseURL.Enabled and RBUseURL.Checked;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
 | |
| 
 | |
| Var
 | |
|   Prj : TLazProject;
 | |
|   HFN : String;
 | |
|   HTMLIdx : Integer;
 | |
|   Port : Word;
 | |
|   URL , Location: String;
 | |
| 
 | |
| begin
 | |
|   if AOptions=nil then ;
 | |
|   Prj:=LazarusIDE.ActiveProject;
 | |
|   HTMLIdx:=FillFilesCombo(Prj);
 | |
|   CBWebProject.Checked:=Prj.CustomData[PJSProjectWebBrowser]='1';
 | |
|   if HTMLIdx=-1 then
 | |
|     begin
 | |
|     HFN:=TPJSController.GetProjectHTMLFilename(Prj);
 | |
|     HTMLIdx:=CBHTMLFile.Items.IndexOf(HFN);
 | |
|     end;
 | |
|   CBHTMLFile.ItemIndex:=HTMLIdx;
 | |
| 
 | |
|   CBMaintainHTMLFile.Checked:=Prj.CustomData[PJSProjectMaintainHTML]='1';
 | |
|   CBUseBrowserConsole.Checked:=Prj.CustomData[PJSProjectUseBrowserConsole]='1';
 | |
|   CBRunOnReady.Checked:=Prj.CustomData[PJSProjectRunAtReady]='1';
 | |
| 
 | |
|   Location:=Prj.CustomData[PJSProjectLocation];
 | |
|   Port:=StrToIntDef(Prj.CustomData[PJSProjectPort],0);
 | |
|   URL:=Prj.CustomData[PJSProjectURL];
 | |
|   CBLocation.AddHistoryItem(Location,10,True,False);
 | |
|   SEPort.Value:=Min(Max(0,Port),65535);
 | |
|   CBServerURL.AddHistoryItem(URL,10,True,False);
 | |
|   if Prj.CustomData.Contains(PJSProjectLocation) then
 | |
|     RBLocation.Checked:=true
 | |
|   else if Prj.CustomData.Contains(PJSProjectPort) then
 | |
|     RBStartServerAt.Checked:=true
 | |
|   else if Prj.CustomData.Contains(PJSProjectURL) then
 | |
|     RBUseURL.Checked:=true
 | |
|   else
 | |
|     RBRunDefault.Checked:=true;
 | |
| 
 | |
|   UpdateHTMLControls;
 | |
|   UpdateRunControls;
 | |
| end;
 | |
| 
 | |
| procedure TPas2JSProjectOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
 | |
| Var
 | |
|   Prj : TLazProject;
 | |
| 
 | |
|   Procedure DoBool(N : String; AValue : Boolean);
 | |
|   begin
 | |
|     if AValue then
 | |
|       Prj.CustomData[N]:='1';
 | |
|   end;
 | |
| 
 | |
| begin
 | |
|   if AOptions=nil then ;
 | |
|   Prj:=LazarusIDE.ActiveProject;
 | |
|   // Clear everything
 | |
|   With Prj.CustomData do
 | |
|     begin
 | |
|     Remove(PJSProject);
 | |
|     Remove(PJSProjectWebBrowser);
 | |
|     Remove(PJSProjectMaintainHTML);
 | |
|     Remove(PJSProjectUseBrowserConsole);
 | |
|     Remove(PJSProjectRunAtReady);
 | |
|     Remove(PJSProjectLocation);
 | |
|     Remove(PJSProjectPort);
 | |
|     Remove(PJSProjectURL);
 | |
|     end;
 | |
|   // Set what is needed
 | |
|   if CBWebProject.Checked then
 | |
|     begin
 | |
|     Prj.CustomData[PJSProject]:='1';
 | |
|     Prj.CustomData[PJSProjectWebBrowser]:='1';
 | |
| 
 | |
|     With CBHTMLFile do
 | |
|       if ItemIndex<>-1 then
 | |
|         (Items.Objects[ItemIndex] as TLazProjectFile).CustomData[PJSIsProjectHTMLFile]:='1';
 | |
| 
 | |
|     DoBool(PJSProjectMaintainHTML,CBMaintainHTMLFile.Checked);
 | |
|     DoBool(PJSProjectUseBrowserConsole,CBUseBrowserConsole.Checked);
 | |
|     DoBool(PJSProjectRunAtReady,CBRunOnReady.Checked);
 | |
| 
 | |
|     if RBLocation.Checked and (CBLocation.Text<>'') then
 | |
|       Prj.CustomData[PJSProjectLocation]:=CBLocation.Text
 | |
|     else if RBStartServerAt.Checked and (SEPort.Value>=0) then
 | |
|       Prj.CustomData[PJSProjectPort]:=IntToStr(SEPort.Value)
 | |
|     else if RBUseURL.Checked and (CBServerURL.Text<>'') then
 | |
|       Prj.CustomData[PJSProjectURL]:=CBServerURL.Text;
 | |
| 
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| class function TPas2JSProjectOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
 | |
| begin
 | |
|   Result:=TAbstractIDEProjectOptions;
 | |
| end;
 | |
| 
 | |
| end.
 | |
| 
 | 
