From cf32cfa6ee69ab3bca7139b7b12b2a1528a19591 Mon Sep 17 00:00:00 2001 From: mattias Date: Mon, 11 Apr 2022 00:36:22 +0200 Subject: [PATCH] pas2jsdsgn: open project url --- .../pas2js/frmpas2jsbrowserprojectoptions.pp | 1 - components/pas2js/frmpas2jswebservers.lfm | 188 ---------- components/pas2js/frmpas2jswebservers.pp | 167 --------- .../pas2js/languages/strpas2jsdesign.fr.po | 46 --- .../pas2js/languages/strpas2jsdesign.hu.po | 46 --- .../pas2js/languages/strpas2jsdesign.pot | 46 --- .../pas2js/languages/strpas2jsdesign.pt_BR.po | 46 --- .../pas2js/languages/strpas2jsdesign.ru.po | 46 --- .../pas2js/languages/strpas2jsdesign.tr.po | 48 --- .../pas2js/languages/strpas2jsdesign.uk.po | 46 --- .../pas2js/languages/strpas2jsdesign.zh_CN.po | 48 --- components/pas2js/pas2jsdsgn.pas | 10 +- components/pas2js/pjscontroller.pp | 330 +++++------------- components/pas2js/pjsdsgnregister.pas | 33 +- components/pas2js/pjsprojectoptions.pp | 2 +- components/pas2js/strpas2jsdesign.pp | 17 - .../simplewebservergui/simplewebsrvadd.pas | 2 +- .../simplewebsrvcontroller.pas | 69 +++- .../simplewebservergui/simplewebsrvutils.pas | 35 +- 19 files changed, 174 insertions(+), 1052 deletions(-) delete mode 100644 components/pas2js/frmpas2jswebservers.lfm delete mode 100644 components/pas2js/frmpas2jswebservers.pp diff --git a/components/pas2js/frmpas2jsbrowserprojectoptions.pp b/components/pas2js/frmpas2jsbrowserprojectoptions.pp index 05e5b35959..d2a7f9c9d3 100644 --- a/components/pas2js/frmpas2jsbrowserprojectoptions.pp +++ b/components/pas2js/frmpas2jsbrowserprojectoptions.pp @@ -156,7 +156,6 @@ begin else Result:=False; end; -// Writeln('Reporting ',AIndex,' : ',Result); end; function TWebBrowserProjectOptionsForm.GetServerPort: Word; diff --git a/components/pas2js/frmpas2jswebservers.lfm b/components/pas2js/frmpas2jswebservers.lfm deleted file mode 100644 index 6964c761ff..0000000000 --- a/components/pas2js/frmpas2jswebservers.lfm +++ /dev/null @@ -1,188 +0,0 @@ -object PasJSWebserverProcessesForm: TPasJSWebserverProcessesForm - Left = 560 - Height = 245 - Top = 270 - Width = 644 - Caption = 'Web server processes' - ClientHeight = 245 - ClientWidth = 644 - OnClose = FormClose - OnCreate = FormCreate - OnDestroy = FormDestroy - OnShow = FormShow - LCLVersion = '2.1.0.0' - object LCount: TLabel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = Owner - Left = 6 - Height = 15 - Top = 6 - Width = 171 - BorderSpacing.Left = 6 - BorderSpacing.Top = 6 - Caption = 'Number of webserver processes:' - ParentColor = False - end - object LVProcesses: TListView - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = SBrefresh - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = Owner - AnchorSideBottom.Side = asrBottom - Left = 6 - Height = 195 - Top = 44 - Width = 632 - Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Around = 6 - Columns = < - item - Caption = 'Port' - end - item - Caption = 'Status' - Width = 80 - end - item - Caption = 'Root Directory' - Width = 200 - end - item - Caption = 'Project' - Width = 200 - end - item - AutoSize = True - Caption = 'Additional info' - Width = 94 - end> - SmallImages = ILProcesses - StateImages = ILProcesses - TabOrder = 0 - ViewStyle = vsReport - end - object SBrefresh: TSpeedButton - AnchorSideTop.Control = Owner - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 606 - Height = 32 - Top = 6 - Width = 32 - Anchors = [akTop, akRight] - AutoSize = True - BorderSpacing.Around = 6 - Constraints.MinHeight = 32 - Constraints.MinWidth = 32 - Glyph.Data = { - 36040000424D3604000000000000360000002800000010000000100000000100 - 2000000000000004000064000000640000000000000000000000FFFFFF00A465 - 34A2A4653401FFFFFF00FFFFFF00A4653405A4653453A76A3ABEA66938E9A466 - 35FAA76A3AE4A76B3BAAA4653424FFFFFF00FFFFFF00FFFFFF00FFFFFF00A465 - 34FFA5673693FFFFFF00A4653454A66737EEB58055F3CEA684FFD8B697FFDBB9 - 99FFD3AC8AFFC2946DFCA66838F6A466355BFFFFFF00FFFFFF00FFFFFF00A567 - 37FEB7845BF7A56736D4B17A4EF4E3CAB4FFECDAC9FFE7D1BCFFE3C9B0FFDEBE - A0FFD2AB88FFCEA582FFD3AE8EFFA66838F5A465342AFFFFFF00FFFFFF00A668 - 38FDF1E4D8FFD4B295FEF4E9E0FFF3E8DDFFEDDCCCFFD2AD8FFEB0784CF5A566 - 35FBA66939FFA66939FEA96D3DFFB0784CFFA76A3AA8FFFFFF00FFFFFF00A567 - 37FDF6EEE6FFF5ECE3FFF5EDE4FFE6D2C1FFB0794DF5A66938CAA4653436FFFF - FF00A465346AA96B3CEDB67C4FFFA76A3AFEA56837FAFFFFFF00FFFFFF00A466 - 35FCF6EEE6FFEBD7C4FFEAD9C9FFA46534FEA465346AFFFFFF00FFFFFF00FFFF - FF00A465340BA56635E9C9956C8DB77F53C2A46534FFA4653405FFFFFF00A465 - 34FCF5EDE5FFF6EDE5FFF5ECE4FFD7B79CFDA66837E0A4653410FFFFFF00FFFF - FF00FFFFFF00FFFFFF00D5A47E1ACD997239A46534FCA465340CFFFFFF00A465 - 34F9A46534FEA46534FEA46534FDA46534FCA46534FBA46534B9A465341DA465 - 3418A4653418A4653418A4653418A4653418A465341CFFFFFF00FFFFFF00A465 - 340DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A46534A0A465 - 34FFAD7447F8AF774CF7AF774CF7AF784CF7A46534FFA4653408FFFFFF00A465 - 34FCB3794C7ECF9D762BBB835713A4653402FFFFFF00FFFFFF00A4653404A668 - 38C4D0AC8FFAF6EEE7FFF2E6DBFFF6EEE6FFA66A3AFBA4653409FFFFFF00A465 - 35FEA76A3AFBC791689DA56737E6A4653423FFFFFF00FFFFFF00FFFFFF00A465 - 3460A46635FFE9D7C7FFEBD8C6FFF5ECE3FFA66A3AFAA465340AFFFFFF00A668 - 38F3AB7041FFA96C3CFEA76A3AF5A4653475A4653419A4653445A66938CDB988 - 61F5EBDBCDFFF5EBE2FFF6EEE6FFF6EEE6FFA76A3AFAA465340BFFFFFF00A769 - 399BC09069FDC59872FFA86B3CFFA46635FFA76A3AFCB7855DF3D9BBA1FEF1E4 - D8FFF2E6DBFFF3E8DDFFCEA788FDEAD8C8FFA76A3AF9A465340DFFFFFF00A465 - 3429A66939F5D3AD8CFFDCBD9DFFDDBEA1FFE5CBB4FFE9D3BFFFEEDDCCFFF0E2 - D5FFE7D2BFFFAF774BF5A56736C0AB7143F7A46635FCA465340EFFFFFF00FFFF - FF00A4653550A66838F6C09068FAD3B08FFFDFC2A8FFDEC1A8FFD4B193FFB987 - 5FF4A56737F0A4653458FFFFFF00A4663566A46534FFA465340FFFFFFF00FFFF - FF00FFFFFF00A465341DA7693A9FA76A3ADEA56736F6A76939E5A76A3ABCA465 - 3453A4653405FFFFFF00FFFFFF00FFFFFF00A4653479A4653410 - } - OnClick = SBrefreshClick - end - object ILProcesses: TImageList - left = 146 - top = 107 - Bitmap = { - 4C69020000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF003DBFEC033CBCEBD43ABAEAC339B8E803FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF003CBCEB9585D4F1FF82D1F0FF37B5E769FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF003CBCEB123ABAE9F2F1FAFDFFD5EFFAFF35B2E6ED33AFE412FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF003AB9E9B494D8F2FFF3FCFEFFE7FAFEFF8FD3F0FF31ACE396FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003AB9 - E93038B7E8FDF9FDFFFF94E9F9FF9EEBFAFFECFAFEFF2FA9E1FC2DA6E030FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B7 - E8D4A9DFF4FFEDF9FDFF3EA3D6FF3EA3D6FFD4F5FCFFA2D7F1FF2BA3DEC3FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B6E85A71C8 - EDFFF9FEFFFF5EDCF4FF3EA2D5FF3EA2D5FF5CD9F4FFEDFBFEFF68BBE5FF269C - DB5AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B6E80C36B4E6ECC8EA - F7FFE6FAFDFF5DDAF4FF3DA1D5FF3DA1D5FF57D7F2FFC7F3FCFFC0E3F4FF2499 - D9E42296D80CFFFFFF00FFFFFF00FFFFFF00FFFFFF0036B3E6AA8CD2F0FFEAFB - FEFF94E6F8FF5CDAF4FF47B1DDFF3DA1D5FF56D7F2FF5CDBF5FFDEF8FDFF7DC0 - E7FF1D8ED487FFFFFF00FFFFFF00FFFFFF0036B3E62434B1E5FBF3FBFEFFC3F2 - FBFF5CDCF6FF5CDAF4FF64DFF6FF57CBEBFF55D6F2FF54D9F5FF94E7F8FFE3F4 - FBFF1787D0F91380CD24FFFFFF00FFFFFF0034B0E5CA9DD7F1FFE7F9FDFF8BE5 - F8FF5ADBF6FF5BDAF4FF3DA1D5FF3DA1D5FF54D6F2FF52D8F5FF50D6F4FFD8F6 - FCFF88BFE5FF0E79C9B4FFFFFF0034B0E54B62BFE8FFF4FCFEFFB5EFFAFF58DA - F5FF58DAF5FF57D8F3FF58D7F2FF58D6F2FF57D9F4FF51D8F5FF4ED7F4FF62DA - F6FFEAFBFEFF4493D2FF066DC34B31ADE3E3BEE3F5FFF4FCFEFFEFFBFEFFEEFB - FEFFEEFBFEFFEFFCFEFFEFFCFEFFEFFBFEFFEEFBFEFFEDFBFEFFEDFBFEFFECFB - FEFFF2FCFEFFABCEEBFF0368C1D82FAAE2A22DA7E0FF2BA4DFFF29A1DDFF279E - DCFF259BDAFF2398D9FF2093D6FF1B8CD3FF1685CFFF117ECCFF0D77C9FF0971 - C6FF066CC3FF0368C1FF0064BFA2FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000031D6FFFF52A5FFFF527BC6FF000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000031D6FFFF42DE - FFFF10D6FFFF5AA5FFFF527BC6FF000000000000000000000000000000000000 - 00000000000000000000000000000000000031D6FFFF00F7FFFF00EFFFFF00AD - FFFF00A5FFFF527BC6FF00000000000000000000000000000000000000000000 - 0000000000000000000031D6FFFF08F7FFFF00FFFFFF00F7FFFF00D6FFFF00B5 - FFFF527BC6FF0000000000000000000000000000000000000000000000000000 - 000008C6FFFF39E7FFFF4AEFFFFF42F7FFFF18FFFFFF00FFFFFF00FFFFFF08FF - FFFF21FFFFFF527BC6FF000000000000000000000000000000000000000039A5 - FFFF00C6FFFF00EFFFFF00F7FFFF00EFFFFF00DEFFFF00FFFFFF00FFFFFF39EF - FFFF08C6FFFF527BC6FF000000000000000000000000000000000000000029AD - FFFF00C6FFFF00EFFFFF00F7FFFF00F7FFFF00FFFFFF4AEFFFFF18CEFFFF00A5 - FFFF527BC6FF000000000000000000000000000000000000000000000000527B - C6FF527BC6FF527BC6FF00C6FFFF08FFFFFF31F7FFFF10BDFFFF00ADFFFF527B - C6FF527BC6FF0000000000000000000000000000000000000000000000000000 - 0000000000000000000000B5FFFF08BDFFFF00ADFFFF009CFFFF527BC6FF0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000B5FFFF08C6FFFF009CFFFF009CFFFF527BC6FF000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000B5FFFF008CFFFF0094FFFF527BC6FF527BC6FF00000000000000000000 - 000000000000000000000000000000000000000000000000000000000000009C - FFFF008CFFFF008CFFFF527BC6FF000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000397BE7FF007B - FFFF0073F7FF527BC6FF00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000317BEFFF527B - C6FF296BC6FF0000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000527BC6FF0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000 - } - end -end diff --git a/components/pas2js/frmpas2jswebservers.pp b/components/pas2js/frmpas2jswebservers.pp deleted file mode 100644 index fb4f8a0130..0000000000 --- a/components/pas2js/frmpas2jswebservers.pp +++ /dev/null @@ -1,167 +0,0 @@ -unit frmpas2jswebservers; - -{$mode objfpc}{$H+} - -interface - -uses - Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, - ComCtrls, Buttons, pjscontroller; - -type - - { TPasJSWebserverProcessesForm } - - TPasJSWebserverProcessesForm = class(TForm) - ILProcesses: TImageList; - LCount: TLabel; - LVProcesses: TListView; - SBrefresh: TSpeedButton; - procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); - procedure FormCreate(Sender: TObject); - procedure FormDestroy(Sender: TObject); - procedure FormShow(Sender: TObject); - procedure SBrefreshClick(Sender: TObject); - private - Class Var - TheForm : TPasJSWebserverProcessesForm; - procedure DoControllerRefresh(Sender: TObject); - procedure Localize; - procedure ServerInstanceToListItem(LI: TListItem; SI: TServerInstance); - public - Class Function Instance : TPasJSWebserverProcessesForm; - Procedure RefreshList; - end; - - -implementation - -uses strpas2jsdesign; - -{$R *.lfm} - -Const - iiStopped = 0; - iiRunning = 1; - -{ TPasJSWebserverProcessesForm } - -procedure TPasJSWebserverProcessesForm.FormShow(Sender: TObject); -begin - TPJSController.Instance.OnRefresh:=@DoControllerRefresh; - RefreshList; -end; - -procedure TPasJSWebserverProcessesForm.SBrefreshClick(Sender: TObject); -begin - RefreshList; -end; - -procedure TPasJSWebserverProcessesForm.FormClose(Sender: TObject; - var CloseAction: TCloseAction); -begin - CloseAction:=caFree; -end; - -procedure TPasJSWebserverProcessesForm.FormCreate(Sender: TObject); -begin - Localize; -end; - -procedure TPasJSWebserverProcessesForm.Localize; - -begin - LCount.Caption:=SafeFormat(SWebserversCount, ['0']); - Caption:=SWebserversCaption; - With LVProcesses do - begin - Column[0].Caption:=SWebserversPort; - Column[1].Caption:=SWebserversStatus; - Column[2].Caption:=SWebserversBaseDir; - Column[3].Caption:=SWebserversProject; - Column[4].Caption:=SWebserversExtra; - end; -end; - -procedure TPasJSWebserverProcessesForm.FormDestroy(Sender: TObject); -begin - TPJSController.Instance.OnRefresh:=Nil; - if (Self=TheForm) then - TheForm:=Nil; -end; - -procedure TPasJSWebserverProcessesForm.ServerInstanceToListItem(LI : TListItem;SI : TServerInstance); - -Var - S,SError : String; - -begin - LI.Caption:=IntToStr(SI.Port); - If SI.Running then - begin - LI.ImageIndex:=iiRunning; - S:=SStatusRunning; - end - else if (SI.RunError<>'') then - begin - S:=SStatusError; - SError:=SI.RunError; - end - else - begin - LI.ImageIndex:=iiStopped; - S:=SStatusStopped; - end; - LI.SubItems.Add(S); - LI.SubItems.Add(SI.BaseDir); - LI.SubItems.Add(SI.LastProject); - LI.SubItems.Add(SError); - LI.Data:=SI; -end; - -procedure TPasJSWebserverProcessesForm.DoControllerRefresh(Sender: TObject); -begin - RefreshList; -end; - -class function TPasJSWebserverProcessesForm.Instance: TPasJSWebserverProcessesForm; -begin - if TheForm=Nil then - TheForm:=TPasJSWebserverProcessesForm.Create(Application); - Result:=TheForm; -end; - -procedure TPasJSWebserverProcessesForm.RefreshList; - -Var - C : TPJSController; - I : integer; - LI : TListItem; - SI : TServerInstance; - -begin - C:=TPJSController.Instance; - if (C=Nil) or (C.ServerInstances=Nil) or (C.ServerInstances.Count=0) then - begin - LVProcesses.Items.Clear; - LCount.Caption:=SafeFormat(SWebserversCount, ['0']); - exit; - end; - LCount.Caption:=SafeFormat(SWebserversCount, [IntToStr(C.ServerInstances.Count)]); - With LVProcesses.Items do - try - BeginUpdate; - Clear; - For I:=0 to C.ServerInstances.Count-1 do - begin - SI:=C.ServerInstances[i]; - LI:=Add; - ServerInstanceToListItem(LI,SI); - end; - finally - EndUpdate; - end; -end; - -end. - diff --git a/components/pas2js/languages/strpas2jsdesign.fr.po b/components/pas2js/languages/strpas2jsdesign.fr.po index 220c198bb9..496c077f8c 100644 --- a/components/pas2js/languages/strpas2jsdesign.fr.po +++ b/components/pas2js/languages/strpas2jsdesign.fr.po @@ -331,49 +331,3 @@ msgstr "" msgid "HTML request to service URL %s failed: %s" msgstr "" -#: strpas2jsdesign.spasjswebservercaption -msgctxt "strpas2jsdesign.spasjswebservercaption" -msgid "Pas2JS WebServers" -msgstr "WebServers Pas2JS" - -#: strpas2jsdesign.sstatuserror -msgid "Error starting" -msgstr "Erreur au démarrage" - -#: strpas2jsdesign.sstatusrunning -msgid "Running" -msgstr "Processus en cours" - -#: strpas2jsdesign.sstatusstopped -msgid "Stopped" -msgstr "Exécution interrompue" - -#: strpas2jsdesign.swebserversbasedir -msgid "Root directory" -msgstr "Répertoire racine" - -#: strpas2jsdesign.swebserverscaption -msgid "Web server processes" -msgstr "Processus serveur Web" - -#: strpas2jsdesign.swebserverscount -#, object-pascal-format -msgid "Number of webserver processes: %s" -msgstr "Nombre de processus serveur Web : %s" - -#: strpas2jsdesign.swebserversextra -msgid "Additional info" -msgstr "Informations supplémentaires" - -#: strpas2jsdesign.swebserversport -msgid "Port" -msgstr "Port" - -#: strpas2jsdesign.swebserversproject -msgid "Project" -msgstr "Projet" - -#: strpas2jsdesign.swebserversstatus -msgid "Status" -msgstr "Statut" - diff --git a/components/pas2js/languages/strpas2jsdesign.hu.po b/components/pas2js/languages/strpas2jsdesign.hu.po index a1a82e4b2a..d3f8a602cd 100644 --- a/components/pas2js/languages/strpas2jsdesign.hu.po +++ b/components/pas2js/languages/strpas2jsdesign.hu.po @@ -335,49 +335,3 @@ msgstr "" msgid "HTML request to service URL %s failed: %s" msgstr "" -#: strpas2jsdesign.spasjswebservercaption -msgctxt "strpas2jsdesign.spasjswebservercaption" -msgid "Pas2JS WebServers" -msgstr "Pas2JS webkiszolgálók" - -#: strpas2jsdesign.sstatuserror -msgid "Error starting" -msgstr "Hiba az indításkor" - -#: strpas2jsdesign.sstatusrunning -msgid "Running" -msgstr "Fut" - -#: strpas2jsdesign.sstatusstopped -msgid "Stopped" -msgstr "Leállítva" - -#: strpas2jsdesign.swebserversbasedir -msgid "Root directory" -msgstr "Gyökérkönyvtár" - -#: strpas2jsdesign.swebserverscaption -msgid "Web server processes" -msgstr "Webkiszolgáló folyamatai" - -#: strpas2jsdesign.swebserverscount -#, object-pascal-format -msgid "Number of webserver processes: %s" -msgstr "Webkiszolgáló folyamatainak száma: %s" - -#: strpas2jsdesign.swebserversextra -msgid "Additional info" -msgstr "További infó" - -#: strpas2jsdesign.swebserversport -msgid "Port" -msgstr "Port" - -#: strpas2jsdesign.swebserversproject -msgid "Project" -msgstr "Projekt" - -#: strpas2jsdesign.swebserversstatus -msgid "Status" -msgstr "Állapot" - diff --git a/components/pas2js/languages/strpas2jsdesign.pot b/components/pas2js/languages/strpas2jsdesign.pot index 357ba30f1f..afdf00408b 100644 --- a/components/pas2js/languages/strpas2jsdesign.pot +++ b/components/pas2js/languages/strpas2jsdesign.pot @@ -321,49 +321,3 @@ msgstr "" msgid "HTML request to service URL %s failed: %s" msgstr "" -#: strpas2jsdesign.spasjswebservercaption -msgctxt "strpas2jsdesign.spasjswebservercaption" -msgid "Pas2JS WebServers" -msgstr "" - -#: strpas2jsdesign.sstatuserror -msgid "Error starting" -msgstr "" - -#: strpas2jsdesign.sstatusrunning -msgid "Running" -msgstr "" - -#: strpas2jsdesign.sstatusstopped -msgid "Stopped" -msgstr "" - -#: strpas2jsdesign.swebserversbasedir -msgid "Root directory" -msgstr "" - -#: strpas2jsdesign.swebserverscaption -msgid "Web server processes" -msgstr "" - -#: strpas2jsdesign.swebserverscount -#, object-pascal-format -msgid "Number of webserver processes: %s" -msgstr "" - -#: strpas2jsdesign.swebserversextra -msgid "Additional info" -msgstr "" - -#: strpas2jsdesign.swebserversport -msgid "Port" -msgstr "" - -#: strpas2jsdesign.swebserversproject -msgid "Project" -msgstr "" - -#: strpas2jsdesign.swebserversstatus -msgid "Status" -msgstr "" - diff --git a/components/pas2js/languages/strpas2jsdesign.pt_BR.po b/components/pas2js/languages/strpas2jsdesign.pt_BR.po index 0a788fc106..3e66bbc604 100644 --- a/components/pas2js/languages/strpas2jsdesign.pt_BR.po +++ b/components/pas2js/languages/strpas2jsdesign.pt_BR.po @@ -334,49 +334,3 @@ msgstr "" msgid "HTML request to service URL %s failed: %s" msgstr "" -#: strpas2jsdesign.spasjswebservercaption -msgctxt "strpas2jsdesign.spasjswebservercaption" -msgid "Pas2JS WebServers" -msgstr "Servidores web Pas2JS" - -#: strpas2jsdesign.sstatuserror -msgid "Error starting" -msgstr "Erro ao iniciar" - -#: strpas2jsdesign.sstatusrunning -msgid "Running" -msgstr "Executando" - -#: strpas2jsdesign.sstatusstopped -msgid "Stopped" -msgstr "Parado" - -#: strpas2jsdesign.swebserversbasedir -msgid "Root directory" -msgstr "Diretório raiz" - -#: strpas2jsdesign.swebserverscaption -msgid "Web server processes" -msgstr "Processos servidores web" - -#: strpas2jsdesign.swebserverscount -#, object-pascal-format -msgid "Number of webserver processes: %s" -msgstr "Número de processos servidores web: %s" - -#: strpas2jsdesign.swebserversextra -msgid "Additional info" -msgstr "Info adicional" - -#: strpas2jsdesign.swebserversport -msgid "Port" -msgstr "Porta" - -#: strpas2jsdesign.swebserversproject -msgid "Project" -msgstr "Projeto" - -#: strpas2jsdesign.swebserversstatus -msgid "Status" -msgstr "Estado" - diff --git a/components/pas2js/languages/strpas2jsdesign.ru.po b/components/pas2js/languages/strpas2jsdesign.ru.po index d5949df94d..8d1e83f255 100644 --- a/components/pas2js/languages/strpas2jsdesign.ru.po +++ b/components/pas2js/languages/strpas2jsdesign.ru.po @@ -334,49 +334,3 @@ msgstr "Средство DTS2pas не создало файл вывода." msgid "HTML request to service URL %s failed: %s" msgstr "Запрос HTML по адресу сервиса %s завершился с ошибкой: %s" -#: strpas2jsdesign.spasjswebservercaption -msgctxt "strpas2jsdesign.spasjswebservercaption" -msgid "Pas2JS WebServers" -msgstr "Веб-серверы Pas2JS" - -#: strpas2jsdesign.sstatuserror -msgid "Error starting" -msgstr "Ошибка запуска" - -#: strpas2jsdesign.sstatusrunning -msgid "Running" -msgstr "Запущен" - -#: strpas2jsdesign.sstatusstopped -msgid "Stopped" -msgstr "Остановлен" - -#: strpas2jsdesign.swebserversbasedir -msgid "Root directory" -msgstr "Корневой каталог" - -#: strpas2jsdesign.swebserverscaption -msgid "Web server processes" -msgstr "Процессы веб-серверов" - -#: strpas2jsdesign.swebserverscount -#, object-pascal-format -msgid "Number of webserver processes: %s" -msgstr "Количество процессов веб-серверов: %s" - -#: strpas2jsdesign.swebserversextra -msgid "Additional info" -msgstr "Дополнительные сведения" - -#: strpas2jsdesign.swebserversport -msgid "Port" -msgstr "Порт" - -#: strpas2jsdesign.swebserversproject -msgid "Project" -msgstr "Проект" - -#: strpas2jsdesign.swebserversstatus -msgid "Status" -msgstr "Состояние" - diff --git a/components/pas2js/languages/strpas2jsdesign.tr.po b/components/pas2js/languages/strpas2jsdesign.tr.po index 7f6c3b0c77..cbdf0c2b0f 100644 --- a/components/pas2js/languages/strpas2jsdesign.tr.po +++ b/components/pas2js/languages/strpas2jsdesign.tr.po @@ -335,51 +335,3 @@ msgstr "" msgid "HTML request to service URL %s failed: %s" msgstr "" -#: strpas2jsdesign.spasjswebservercaption -#, fuzzy -msgctxt "strpas2jsdesign.spasjswebservercaption" -msgid "Pas2JS WebServers" -msgstr "Pas2JS Web Sunucuları" - -#: strpas2jsdesign.sstatuserror -msgid "Error starting" -msgstr "Başlarken hata" - -#: strpas2jsdesign.sstatusrunning -msgid "Running" -msgstr "Çalışıyor" - -#: strpas2jsdesign.sstatusstopped -msgid "Stopped" -msgstr "Durduruldu" - -#: strpas2jsdesign.swebserversbasedir -msgid "Root directory" -msgstr "Kök dizini" - -#: strpas2jsdesign.swebserverscaption -msgid "Web server processes" -msgstr "Web sunucusu işlemleri" - -#: strpas2jsdesign.swebserverscount -#, object-pascal-format, fuzzy, badformat -#| msgid "Number of webserver processes:" -msgid "Number of webserver processes: %s" -msgstr "Web sunucusu işlemlerinin sayısı:" - -#: strpas2jsdesign.swebserversextra -msgid "Additional info" -msgstr "İlave bilgi" - -#: strpas2jsdesign.swebserversport -msgid "Port" -msgstr "Port" - -#: strpas2jsdesign.swebserversproject -msgid "Project" -msgstr "Proje" - -#: strpas2jsdesign.swebserversstatus -msgid "Status" -msgstr "Durum" - diff --git a/components/pas2js/languages/strpas2jsdesign.uk.po b/components/pas2js/languages/strpas2jsdesign.uk.po index d6227ca305..838ee6dcde 100644 --- a/components/pas2js/languages/strpas2jsdesign.uk.po +++ b/components/pas2js/languages/strpas2jsdesign.uk.po @@ -333,49 +333,3 @@ msgstr "" msgid "HTML request to service URL %s failed: %s" msgstr "" -#: strpas2jsdesign.spasjswebservercaption -msgctxt "strpas2jsdesign.spasjswebservercaption" -msgid "Pas2JS WebServers" -msgstr "Веб-сервери Pas2JS" - -#: strpas2jsdesign.sstatuserror -msgid "Error starting" -msgstr "Помилка запуску" - -#: strpas2jsdesign.sstatusrunning -msgid "Running" -msgstr "Запущено" - -#: strpas2jsdesign.sstatusstopped -msgid "Stopped" -msgstr "Зупинено" - -#: strpas2jsdesign.swebserversbasedir -msgid "Root directory" -msgstr "Корневий каталог" - -#: strpas2jsdesign.swebserverscaption -msgid "Web server processes" -msgstr "Процеси веб-серверів" - -#: strpas2jsdesign.swebserverscount -#, object-pascal-format -msgid "Number of webserver processes: %s" -msgstr "Кількість процесів веб-серверів: %s" - -#: strpas2jsdesign.swebserversextra -msgid "Additional info" -msgstr "Додаткові відомості" - -#: strpas2jsdesign.swebserversport -msgid "Port" -msgstr "Порт" - -#: strpas2jsdesign.swebserversproject -msgid "Project" -msgstr "Проєкт" - -#: strpas2jsdesign.swebserversstatus -msgid "Status" -msgstr "Стан" - diff --git a/components/pas2js/languages/strpas2jsdesign.zh_CN.po b/components/pas2js/languages/strpas2jsdesign.zh_CN.po index 75655557f4..48d66c6baf 100644 --- a/components/pas2js/languages/strpas2jsdesign.zh_CN.po +++ b/components/pas2js/languages/strpas2jsdesign.zh_CN.po @@ -336,51 +336,3 @@ msgstr "" msgid "HTML request to service URL %s failed: %s" msgstr "" -#: strpas2jsdesign.spasjswebservercaption -#, fuzzy -msgctxt "strpas2jsdesign.spasjswebservercaption" -msgid "Pas2JS WebServers" -msgstr "Pas2JS Web服务器(WebServers)" - -#: strpas2jsdesign.sstatuserror -msgid "Error starting" -msgstr "错误开始(starting)" - -#: strpas2jsdesign.sstatusrunning -msgid "Running" -msgstr "运行" - -#: strpas2jsdesign.sstatusstopped -msgid "Stopped" -msgstr "停止" - -#: strpas2jsdesign.swebserversbasedir -msgid "Root directory" -msgstr "Root目录" - -#: strpas2jsdesign.swebserverscaption -msgid "Web server processes" -msgstr "Web服务器进程(server processes)" - -#: strpas2jsdesign.swebserverscount -#, object-pascal-format, fuzzy, badformat -#| msgid "Number of webserver processes:" -msgid "Number of webserver processes: %s" -msgstr "Web服务器进程(server processes)的数量" - -#: strpas2jsdesign.swebserversextra -msgid "Additional info" -msgstr "附加信息" - -#: strpas2jsdesign.swebserversport -msgid "Port" -msgstr "端口" - -#: strpas2jsdesign.swebserversproject -msgid "Project" -msgstr "工程" - -#: strpas2jsdesign.swebserversstatus -msgid "Status" -msgstr "状态" - diff --git a/components/pas2js/pas2jsdsgn.pas b/components/pas2js/pas2jsdsgn.pas index 4cd873fde4..1064f68a20 100644 --- a/components/pas2js/pas2jsdsgn.pas +++ b/components/pas2js/pas2jsdsgn.pas @@ -9,11 +9,11 @@ interface uses PJSDsgnRegister, PJSDsgnOptsFrame, frmpas2jsbrowserprojectoptions, - PJSDsgnOptions, frmpas2jsnodejsprojectoptions, pjscontroller, - frmpas2jswebservers, strpas2jsdesign, pjsprojectoptions, - frmPas2jsAtomPackageSettings, regpas2jsatom, regpas2jsvscode, - frmPas2jsVSCodeExtensionSettings, frmhtmltoform, idehtml2class, frmdtstopas, - idedtstopas, idehtmltools, LazarusPackageIntf; + PJSDsgnOptions, frmpas2jsnodejsprojectoptions, PJSController, + StrPas2JSDesign, PJSProjectOptions, frmPas2jsAtomPackageSettings, + regpas2jsatom, regpas2jsvscode, frmPas2jsVSCodeExtensionSettings, + frmhtmltoform, idehtml2class, frmdtstopas, idedtstopas, idehtmltools, + LazarusPackageIntf; implementation diff --git a/components/pas2js/pjscontroller.pp b/components/pas2js/pjscontroller.pp index e9c4a839d7..f482b8f075 100644 --- a/components/pas2js/pjscontroller.pp +++ b/components/pas2js/pjscontroller.pp @@ -1,4 +1,4 @@ -unit pjscontroller; +unit PJSController; {$mode objfpc}{$H+} @@ -9,7 +9,7 @@ uses // LazUtils LazLoggerBase, LazUtilities, FileUtil, LazFileUtils, // LCL - Forms, Controls, + Forms, Controls, LazHelpIntf, // IdeIntf MacroIntf, MacroDefIntf, ProjectIntf, CompOptsIntf, LazIDEIntf, // pas2js @@ -18,49 +18,11 @@ uses Type - { TServerInstance } - - TServerInstance = Class(TCollectionItem) - private - FlastProject: String; - FPort: Word; - FProcess: TProcess; - FRunError: String; - FServerName: String; - FString: String; - function GetRunning: Boolean; - Protected - Property Process : TProcess Read FProcess; - Public - Destructor Destroy; override; - Procedure StartServer; - Procedure StopServer; - Property Port : Word Read FPort Write FPort; - Property BaseDir : String Read FString Write FString; - Property ServerName : String Read FServerName Write FServerName; - Property Running : Boolean Read GetRunning; - Property RunError : String Read FRunError; - Property LastProject : String Read FlastProject Write Flastproject; - end; - - { TServerInstanceList } - - TServerInstanceList = Class(TCollection) - private - function GetInstance(AIndex : Integer): TServerInstance; - Public - Function IndexOfPort(APort: Word) : integer; - Function FindByPort(Aindex : Integer) : TServerInstance; - Function AddInstance(aPort : Word; Const ABaseURL, aServerName : String) : TServerInstance; - Property Instances [AIndex : Integer] : TServerInstance Read GetInstance; default; - end; - { TPJSController } TPJSController = Class Private FOnRefresh: TNotifyEvent; - FServerInstances: TServerInstanceList; function GetPas2JSPath(const s: string; const {%H-}Data: PtrInt; var Abort: boolean): string; function GetPas2JSWebServerPath(const s: string; const {%H-}Data: PtrInt; var Abort: boolean): string; function GetPas2JSWebServerPort(const s: string; const {%H-}Data: PtrInt; var Abort: boolean): string; @@ -71,8 +33,6 @@ Type function OnRunDebugInit(Sender: TObject; var Handled: boolean ): TModalResult; function OnRunWithoutDebugInit(Sender: TObject; var Handled: boolean): TModalResult; - function GetHTMLFilename(aProject: TLazProject; UseTestDir: boolean): string; - function GetWebDir(aProject: TLazProject): string; function RunProject(Sender: TObject; WithDebug: boolean; var Handled: boolean): TModalResult; function SaveHTMLFileToTestDir(aProject: TLazProject): boolean; Public @@ -82,8 +42,9 @@ Type Class Function instance : TPJSController; Procedure Hook; virtual; Procedure UnHook; virtual; - Procedure RefreshView; - Property ServerInstances : TServerInstanceList Read FServerInstances; + function GetHTMLFilename(aProject: TLazProject; UseTestDir: boolean): string; virtual; + function GetWebDir(aProject: TLazProject): string; virtual; + function GetProjectURL(aProject: TLazProject): string; virtual; Property OnRefresh : TNotifyEvent Read FOnRefresh Write FonRefresh; end; @@ -95,7 +56,7 @@ Const PJSProjectNodeJS = 'PJSProjectNodeJS'; // NodeJS project PJSProjectModule = 'PJSProjectModule'; // Module project PJSProjectVSCode = 'PJSProjectVSCode'; // VS Code project - PJSProjectAtom = 'PJSProjectAtom'; // Atom project + PJSProjectAtom = 'PJSProjectAtom'; // Atom project PJSProjectHTMLFile = 'PasJSHTMLFile'; PJSIsProjectHTMLFile = 'PasJSIsProjectHTMLFile'; PJSProjectMaintainHTML = 'MaintainHTML'; @@ -112,109 +73,20 @@ implementation Var ctrl : TPJSController; -{ TServerInstanceList } - -function TServerInstanceList.GetInstance(AIndex : Integer): TServerInstance; -begin - Result:=Items[AIndex] as TServerInstance; -end; - -function TServerInstanceList.IndexOfPort(APort: Word): integer; -begin - Result:=Count-1; - While (Result>=0) and (GetInstance(Result).Port<>APort) do Dec(Result); -end; - -function TServerInstanceList.FindByPort(Aindex: Integer): TServerInstance; - -Var - I : Integer; - -begin - I:=IndexOfPort(Aindex); - If I=-1 then - Result:=nil - else - Result:=GetInstance(I); -end; - -function TServerInstanceList.AddInstance(aPort: Word; const ABaseURL, - aServerName: String): TServerInstance; -begin - Result:=Add as TServerInstance; - Result.Port:=aPort; - Result.BaseDir:=ABaseURL; - Result.ServerName:=aServerName; -end; - -{ TServerInstance } - -function TServerInstance.GetRunning: Boolean; -begin - Result:=Assigned(FProcess); - if Result then - Result:=Process.Running; -end; - -destructor TServerInstance.Destroy; -begin - StopServer; - FreeAndNil(FProcess); - inherited; -end; - -procedure TServerInstance.StartServer; -begin - if Running then - exit; - If not Assigned(FProcess) then - FProcess:=TProcess.Create(Nil); - FProcess.Executable:=ServerName; - FProcess.Parameters.Add('-q'); - FProcess.Parameters.Add('-p'); - FProcess.Parameters.Add(IntToStr(Port)); - FProcess.Parameters.AddStrings(PJSOptions.HTTPServerOpts); - {$IFDEF WINDOWS} - FProcess.Options:=[poNoConsole]; - {$ENDIF} - if ConsoleVerbosity>=0 then - DebugLN(['Starting server from Directory : ',BaseDir]); - FProcess.CurrentDirectory:=BaseDir; - try - FProcess.Execute; - except - On E : Exception do - begin - FRunError:=E.Message; - Raise; - end; - end; - TPJSController.Instance.RefreshView; -end; - -procedure TServerInstance.StopServer; -begin - if Running then - FProcess.Terminate(0); - TPJSController.Instance.RefreshView; -end; +{ TPJSController } class procedure TPJSController.DoneInstance; - begin FreeAndNil(Ctrl) end; class function TPJSController.instance: TPJSController; - begin - if ctrl=Nil then + if Ctrl=Nil then Ctrl:=TPJSController.Create; Result:=Ctrl; end; -{ TPJSController } - function TPJSController.GetPas2JSPath(const s: string; const Data: PtrInt; var Abort: boolean): string; begin @@ -271,39 +143,21 @@ begin end; function TPJSController.GetPas2jsProjectURL(const s: string; const Data: PtrInt; var Abort: boolean): string; - Var - FN : String; - + aProject: TLazProject; begin if (s<>'') and (ConsoleVerbosity>=0) then debugln(['Hint: (lazarus) [TPJSController.GetPas2jsProjectURL] ignoring macro Pas2JSProjectURL parameter "',s,'"']); + aProject:=LazarusIDE.ActiveProject; if ConsoleVerbosity>0 then - DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectWebBrowser]: ',LazarusIDE.ActiveProject.CustomData[PJSProjectWebBrowser]]); - Abort:=LazarusIDE.ActiveProject.CustomData[PJSProjectWebBrowser]<>'1'; + DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectWebBrowser]: ',aProject.CustomData[PJSProjectWebBrowser]]); + Abort:=aProject.CustomData[PJSProjectWebBrowser]<>'1'; if Abort then exit; if ConsoleVerbosity>0 then - DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectURL]: ',LazarusIDE.ActiveProject.CustomData[PJSProjectURL]]); - Result:=LazarusIDE.ActiveProject.CustomData[PJSProjectURL]; - if (Result='') then - begin - FN:=LazarusIDE.ActiveProject.CustomData[PJSProjectHTMLFile]; - if ConsoleVerbosity>0 then - DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectHTMLFile]: ',LazarusIDE.ActiveProject.CustomData[PJSProjectHTMLFile]]); - if (FN='') then - FN:=ChangeFileExt(ExtractFileName(LazarusIDE.ActiveProject.ProjectInfoFile),'.html'); - Result:=LazarusIDE.ActiveProject.CustomData[PJSProjectPort]; - if (Result<>'') and (Result<>'0') then - Result:=Format('http://localhost:%s/%s',[Result,FN]) - else - {$IFDEF WINDOWS} - Result:=Format('file:///%s',[ExtractFilePath(LazarusIDE.ActiveProject.ProjectInfoFile)+FN]); - {$ELSE} - Result:=Format('file://%s',[ExtractFilePath(LazarusIDE.ActiveProject.ProjectInfoFile)+FN]); - {$ENDIF} - end; + DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectURL]: ',aProject.CustomData[PJSProjectURL]]); + Result:=GetProjectURL(aProject); Abort:=(Result=''); if ConsoleVerbosity>0 then DebugLN(['GetPas2jsProjectURL : ',Result]); @@ -315,7 +169,6 @@ var begin Result:=mrOk; aProject:=LazarusIDE.ActiveProject; - debugln(['AAA1 TPJSController.OnProjectBuilding ']); if aProject=nil then exit; if aProject.IsVirtual then begin @@ -327,58 +180,12 @@ end; function TPJSController.OnRunDebugInit(Sender: TObject; var Handled: boolean ): TModalResult; begin - debugln(['AAA2 TPJSController.OnRunDebugInit ']); Result:=RunProject(Sender,true,Handled); end; function TPJSController.OnRunWithoutDebugInit(Sender: TObject; var Handled: boolean): TModalResult; - -Var - ServerPort : Word; - WebProject : Boolean; - BaseDir : String; - aInstance : TServerInstance; - begin - debugln(['AAA3 TPJSController.OnRunWithoutDebugInit ']); - Result:=mrOK; - With LazarusIDE.ActiveProject do - begin - if ConsoleVerbosity>=0 then - begin - DebugLn(['Info: WebProject=',CustomData[PJSProjectWebBrowser]]); - DebugLn(['Info: ServerPort=',CustomData[PJSProjectPort]]); - DebugLn(['Info: BaseDir=',ProjectInfoFile]); - end; - WebProject:=CustomData[PJSProjectWebBrowser]='1'; - ServerPort:=StrToIntDef(CustomData[PJSProjectPort],0); - BaseDir:=ExtractFilePath(ProjectInfoFile); - end; - // Exit if we don't need to do anything - if Not (WebProject and (ServerPort>0)) then - Exit; - aInstance:=ServerInstances.FindByPort(ServerPort); - If Ainstance<>Nil then - begin - if ConsoleVerbosity>=0 then - DebugLn(['Info: Have instance running on port ',ServerPort]); - if Not SameFileName(BaseDir,aInstance.BaseDir) then - begin - if ConsoleVerbosity>=0 then - DebugLN(['Info: Instance on port ',ServerPort,' serves different directory: ',aInstance.BaseDir]); - // We should ask the user what to do ? - If aInstance.Running then - aInstance.StopServer; - end; - end - else - begin - Debugln(['Info: No instance running on port ',ServerPort, 'allocating it']); - aInstance:=ServerInstances.AddInstance(ServerPort,BaseDir,PJSOptions.GetParsedWebServerFilename); - end; - aInstance.LastProject:=LazarusIDE.ActiveProject.ProjectInfoFile; - aInstance.StartServer; - Handled:=False; + Result:=RunProject(Sender,false,Handled); end; function TPJSController.GetHTMLFilename(aProject: TLazProject; @@ -425,53 +232,111 @@ begin Result:=ExtractFilePath(aProject.ProjectInfoFile); end; +function TPJSController.GetProjectURL(aProject: TLazProject): string; +Var + HTMLFilename, WebDir: String; + Port: LongInt; +begin + if aProject=nil then + exit(''); + Result:=aProject.CustomData[PJSProjectURL]; + if Result<>'' then + IDEMacros.SubstituteMacros(Result); + + if Result='' then + begin + Port:=StrToIntDef(aProject.CustomData[PJSProjectPort],-1); + HTMLFilename:=GetHTMLFilename(aProject,true); + if HTMLFilename='' then + begin + if Port<=0 then + HTMLFilename:=ChangeFileExt(aProject.ProjectInfoFile,'.html') + else + HTMLFilename:=ExtractFileNameOnly(aProject.ProjectInfoFile)+'.html'; + end + else if Port>0 then + begin + WebDir:=GetWebDir(aProject); + HTMLFilename:=CreateRelativePath(HTMLFilename,WebDir); + end; + HTMLFilename:=FilenameToURLPath(HTMLFilename); + if Port<=0 then + Result:='file://'+HTMLFilename + else + Result:='http://127.0.0.1:'+IntToStr(Port)+'/'+HTMLFilename; + end; +end; + function TPJSController.RunProject(Sender: TObject; WithDebug: boolean; var Handled: boolean): TModalResult; var aProject: TLazProject; IsWebProject: Boolean; ServerPort: Integer; - WebDir, HTMLFilename: String; + WebDir, HTMLFilename, URL, WorkDir: String; aServer: TSWSInstance; begin Result:=mrOk; if Sender=nil then ; - if WithDebug then ; aProject:=LazarusIDE.ActiveProject; if aProject=nil then exit; + if not WithDebug then + exit; // compile normally and run the run parameters + IsWebProject:=aProject.CustomData[PJSProjectWebBrowser]='1'; - ServerPort:=StrToIntDef(aProject.CustomData[PJSProjectPort],-1); - if not IsWebProject or (ServerPort<0) then + if not IsWebProject then exit; + ServerPort:=StrToIntDef(aProject.CustomData[PJSProjectPort],-1); + URL:=aProject.CustomData[PJSProjectURL]; + if (ServerPort<0) and (URL='') then + exit; + + // Run webproject with Debug: build, start webserver, open browser + Handled:=true; // compile Result:=LazarusIDE.DoBuildProject(crRun,[]); if Result<>mrOk then exit; - // start web server - WebDir:=GetWebDir(aProject); - if WebDir='' then + if ServerPort>=0 then begin - debugln(['Warning: TPJSController.RunProject missing webdir']); - exit(mrCancel); - end; - aServer:=SimpleWebServerController.AddProjectServer(aProject,ServerPort,WebDir,true); - if aServer=nil then - exit(mrCancel); + // start web server + WebDir:=GetWebDir(aProject); + if WebDir='' then + begin + debugln(['Warning: TPJSController.RunProject missing webdir']); + exit(mrCancel); + end; + aServer:=SimpleWebServerController.AddProjectServer(aProject,ServerPort,WebDir,true); + if aServer=nil then + exit(mrCancel); - // start browser - HTMLFilename:=GetHTMLFilename(aProject,true); - if HTMLFilename='' then + // start browser + HTMLFilename:=GetHTMLFilename(aProject,true); + if HTMLFilename='' then + begin + debugln(['Info: TPJSController.RunProject missing htmlfile']); + exit(mrCancel); + end; + if not SimpleWebServerController.OpenBrowserWithServer(aServer,HTMLFilename) then + exit(mrCancel); + + end + else begin - debugln(['Info: TPJSController.RunProject missing htmlfile']); - exit(mrCancel); + // start browser with user URL + URL:=GetProjectURL(aProject); + if aProject.IsVirtual then + WorkDir:=LazarusIDE.GetTestBuildDirectory + else + WorkDir:=ExtractFilePath(aProject.ProjectInfoFile); + if not SimpleWebServerController.OpenBrowserWithURL(URL,WorkDir) then + exit(mrCancel); end; - if not SimpleWebServerController.OpenBrowserWithServer(aServer,HTMLFilename) then - exit(mrCancel); end; function TPJSController.SaveHTMLFileToTestDir(aProject: TLazProject): boolean; @@ -483,7 +348,6 @@ begin // if project has a pas2js html filename, save it to the test directory Result:=false; HTMLFilename:=aProject.CustomData.Values[PJSProjectHTMLFile]; - debugln(['AAA7 TPJSController.SaveHTMLFileToTestDir ',HTMLFilename]); if (HTMLFilename='') then exit(true); if FilenameIsAbsolute(HTMLFilename) then @@ -519,13 +383,11 @@ end; constructor TPJSController.Create; begin // Nothing for the moment - FServerInstances:=TServerInstanceList.Create(TServerInstance); end; destructor TPJSController.Destroy; begin Unhook; - FreeAndNil(FServerInstances); inherited Destroy; end; @@ -553,12 +415,6 @@ begin // Nothing for the moment end; -procedure TPJSController.RefreshView; -begin - If Assigned(FOnRefresh) then - FOnRefresh(Self); -end; - finalization TPJSController.DoneInstance; end. diff --git a/components/pas2js/pjsdsgnregister.pas b/components/pas2js/pjsdsgnregister.pas index 9bd3f64e19..128f6d8199 100644 --- a/components/pas2js/pjsdsgnregister.pas +++ b/components/pas2js/pjsdsgnregister.pas @@ -13,14 +13,14 @@ uses // codetools CodeToolManager, CodeCache, // IdeIntf - IDECommands, ToolbarIntf, MenuIntf, ProjectIntf, CompOptsIntf, LazIDEIntf, + IDECommands, MenuIntf, ProjectIntf, CompOptsIntf, LazIDEIntf, IDEOptionsIntf, IDEOptEditorIntf, ComponentEditors, SrcEditorIntf, IDEMsgIntf, IDEDialogs, IDEExternToolIntf, MacroIntf, PackageIntf, // Pas2js idehtml2class, PJSDsgnOptions, PJSDsgnOptsFrame, idedtstopas, - frmpas2jswebservers, frmpas2jsnodejsprojectoptions, - frmpas2jsbrowserprojectoptions, pjsprojectoptions, idehtmltools, - frmhtmltoform, pjscontroller, StrPas2JSDesign; + frmpas2jsnodejsprojectoptions, + frmpas2jsbrowserprojectoptions, PJSProjectOptions, idehtmltools, + frmhtmltoform, PJSController, StrPas2JSDesign; const ProjDescNamePas2JSWebApp = 'Web Application'; @@ -231,12 +231,6 @@ implementation Var SrcMnuItem,PrjMnuItem,PrjMnuItemAll : TIDEmenuCommand; -procedure ShowServerDialog(Sender: TObject); -begin - TPasJSWebserverProcessesForm.Instance.Show; - TPasJSWebserverProcessesForm.Instance.BringToFront; -end; - Type { TPas2JSHandler } @@ -254,22 +248,15 @@ Type Procedure OnPrjInspPopup(Sender : TObject); virtual; end; -Const - sPas2JSWebserverName = 'Pas2JSWebservers'; - Var Pas2JSHTMLClassDef : TPas2JSHTMLClassDef; Pas2JSDTSToPasUnitDef : TPas2JSDTSToPasUnitDef; Pas2JSHandler : TPas2JSHandler; procedure Register; - Var - ViewCategory : TIDECommandCategory; - IDECommand : TIDECommand; SrvWorker: TProjectPas2JSServiceWorker; PWA: TProjectPas2JSProgressiveWebApp; - begin Pas2JSHandler:=TPas2JSHandler.Create; if Assigned(Pas2JSHandler) then; // Silence compiler warning @@ -294,15 +281,6 @@ begin // add IDE options frame PJSOptionsFrameID:=RegisterIDEOptionsEditor(GroupEnvironment,TPas2jsOptionsFrame, PJSOptionsFrameID)^.Index; - ViewCategory := IDECommandList.FindCategoryByName(CommandCategoryViewName); - if ViewCategory <> nil then - begin - IDECommand := RegisterIDECommand(ViewCategory,sPas2JSWebserverName,SPasJSWebserverCaption, - CleanIDEShortCut,CleanIDEShortCut,Nil,@ShowServerDialog); - if IDECommand <> nil then - RegisterIDEButtonCommand(IDECommand); - end; - RegisterIdeMenuCommand(itmViewDebugWindows,sPas2JSWebserverName,SPasJSWebserverCaption,nil,@ShowServerDialog); // Add project options frame RegisterIDEOptionsEditor(GroupProject,TPas2JSProjectOptionsFrame, Pas2JSOptionsIndex); @@ -1438,12 +1416,11 @@ begin SO(ShowUncaughtExceptions,baoShowException); SO(UseWASI,baoUseWASI); SO(UseModule,baoUseModule); - SO(StartHTTPServer,baoStartServer); Self.ProjectPort:=ServerPort; SO(UseURL,baoUseURL); if baoStartServer in FOptions then begin - DebugLN(['Info: Start server port: ', Self.ProjectPort,'from: ',ServerPort]); + DebugLN(['Info: Start server port: ', Self.ProjectPort,' from: ',ServerPort]); end else begin diff --git a/components/pas2js/pjsprojectoptions.pp b/components/pas2js/pjsprojectoptions.pp index e4e0774c3e..391a5a33f2 100644 --- a/components/pas2js/pjsprojectoptions.pp +++ b/components/pas2js/pjsprojectoptions.pp @@ -1,4 +1,4 @@ -unit pjsprojectoptions; +unit PJSProjectOptions; {$mode objfpc}{$H+} diff --git a/components/pas2js/strpas2jsdesign.pp b/components/pas2js/strpas2jsdesign.pp index 3bfec6dbdf..7fd7e87daa 100644 --- a/components/pas2js/strpas2jsdesign.pp +++ b/components/pas2js/strpas2jsdesign.pp @@ -23,23 +23,6 @@ Resourcestring pjsdNewVSCodeExtension = 'Visual Studio Code extension'; pjsdNewVSCodeExtensionDescr = 'A pas2js program running as Visual Studio Code extension.'; - // menu item - SPasJSWebserverCaption = 'Pas2JS WebServers'; - - // Static texts webservers form - SWebserversStatus = 'Status'; - SWebserversPort = 'Port'; - SWebserversBaseDir = 'Root directory'; - SWebserversProject = 'Project'; - SWebserversExtra = 'Additional info'; - SWebserversCount = 'Number of webserver processes: %s'; - SWebserversCaption = 'Web server processes'; - - // Dynamic texts webservers form - SStatusRunning = 'Running'; - SStatusStopped = 'Stopped'; - SStatusError = 'Error starting'; - // IDE options frame pjsdSelectPas2jsExecutable = 'Select pas2js executable'; pjsdSelectXExecutable = 'Select %s executable'; diff --git a/components/simplewebservergui/simplewebsrvadd.pas b/components/simplewebservergui/simplewebsrvadd.pas index 59d188500f..3025994cc1 100644 --- a/components/simplewebservergui/simplewebsrvadd.pas +++ b/components/simplewebservergui/simplewebsrvadd.pas @@ -364,7 +364,7 @@ begin end; if (p=0) and ResolvePort0 then - p:=Controller.FindFreePort(Interactive); + p:=Controller.FindFreePort(Interactive,false); aPort:=IntToStr(p); diff --git a/components/simplewebservergui/simplewebsrvcontroller.pas b/components/simplewebservergui/simplewebsrvcontroller.pas index 1f55c520aa..249d02dada 100644 --- a/components/simplewebservergui/simplewebsrvcontroller.pas +++ b/components/simplewebservergui/simplewebsrvcontroller.pas @@ -42,7 +42,7 @@ unit SimpleWebSrvController; interface uses - Math, Classes, SysUtils, process, Pipes, Contnrs, fpjson, fphttpclient, + Math, Types, Classes, SysUtils, process, Pipes, Contnrs, fpjson, fphttpclient, Sockets, // lazutils LazLoggerBase, FileUtil, LazUTF8, LazFileUtils, LazMethodList, LazUtilities, @@ -238,13 +238,14 @@ type Path: string; Interactive: boolean): TSWSInstance; virtual; function FindServerWithPort(Port: word): TSWSInstance; virtual; function FindServerWithOrigin(Origin: string): TSWSInstance; virtual; - function FindFreePort(Interactive: boolean; aStartPort: word = 0): word; virtual; + function FindFreePort(Interactive, CheckServers: boolean; aStartPort: word = 0): word; virtual; function StopServer(Instance: TSWSInstance; Interactive: boolean): boolean; virtual; function SubstitutePortMacro(aValue, aPort: string): string; function SubstituteURLMacro(aValue, AnURL: string): string; function GetDefaultServerExe: string; virtual; // browser function GetURLWithServer(aServer: TSWSInstance; HTMLFilename: string): string; virtual; + function OpenBrowserWithURL(URL, WorkDir: string): boolean; virtual; function OpenBrowserWithServer(aServer: TSWSInstance; HTMLFilename: string): boolean; virtual; function FindBrowserFile(ShortFilename: string): string; virtual; function FindBrowserPath(Filenames: array of string; URL: string; Params: TStrings): string; virtual; @@ -497,7 +498,7 @@ begin exit; mrRetry: begin - NewPort:=FindFreePort(true); + NewPort:=FindFreePort(true,false); if NewPort=0 then NewPort:=GetNextIPPort(MainSrvInstance.Port); FMainSrvInstance.Port:=NewPort; @@ -1537,7 +1538,7 @@ begin Result:=nil; try if Port=0 then - Port:=FindFreePort(Interactive); + Port:=FindFreePort(Interactive,true); if FindServerWithPort(Port)<>nil then raise ESimpleWebServerException.Create('port '+IntToStr(Port)+' already in use'); @@ -1580,6 +1581,7 @@ var var Exe, Origin: String; Params: TStringList; + ConflictServer: TSWSInstance; begin Result:=nil; @@ -1589,6 +1591,9 @@ begin Origin:=aProject.ProjectInfoFile; aServer:=FindServerWithOrigin(Origin); + if (aServer=nil) and not aProject.IsVirtual then + aServer:=FindServerWithOrigin(SWSTestprojectOrigin); + if (aServer<>nil) and (aServer.Path<>Path) then if not StopOldServer(20220410145323,'Path changed') then exit; @@ -1604,7 +1609,11 @@ begin if aServer<>nil then Port:=aServer.Port // keep port else - Port:=FindFreePort(Interactive); + Port:=FindFreePort(Interactive,true); + end else begin + ConflictServer:=FindServerWithPort(Port); + if (ConflictServer<>aServer) then + Port:=FindFreePort(Interactive,true); end; Params:=TStringList.Create; @@ -1618,7 +1627,10 @@ begin if not StopOldServer(20220410145559,'Params changed') then exit; if aServer<>nil then + begin + aServer.Origin:=Origin; exit(aServer); + end; Result:=AddServer(Port,Exe,Params,Path,Origin,false,Interactive); finally @@ -1647,12 +1659,23 @@ begin Result:=nil; end; -function TSimpleWebServerController.FindFreePort(Interactive: boolean; - aStartPort: word): word; +function TSimpleWebServerController.FindFreePort(Interactive, + CheckServers: boolean; aStartPort: word): word; +var + AvoidPorts: TWordDynArray; + i: Integer; begin if aStartPort=0 then aStartPort:=MainSrvPort; - Result:=FUtility.FindFreePort(aStartPort,Interactive); + if CheckServers then + begin + Setlength(AvoidPorts,ServerCount); + for i:=0 to ServerCount-1 do + AvoidPorts[i]:=Servers[i].Port; + end else + AvoidPorts:=nil; + + Result:=FUtility.FindFreePort(aStartPort,Interactive,AvoidPorts); end; function TSimpleWebServerController.StopServer(Instance: TSWSInstance; @@ -1711,20 +1734,13 @@ begin Result:='http://127.0.0.1:'+IntToStr(aServer.Port)+'/'+Result; end; -function TSimpleWebServerController.OpenBrowserWithServer( - aServer: TSWSInstance; HTMLFilename: string): boolean; +function TSimpleWebServerController.OpenBrowserWithURL(URL, WorkDir: string + ): boolean; var - URL, Cmd, Exe: String; Params: TStringList; + Cmd, Exe: String; Tool: TIDEExternalToolOptions; begin - if aServer=nil then - raise Exception.Create('TSimpleWebServerController.OpenBrowserWithServer 20220410185207'); - if not FilenameIsAbsolute(HTMLFilename) then - raise Exception.Create('TSimpleWebServerController.OpenBrowserWithServer 20220410185208'); - - URL:=GetURLWithServer(aServer,HTMLFilename); - Params:=TStringList.Create; try case Options.BrowserKind of @@ -1770,7 +1786,7 @@ begin Tool.Title:='Browser('+ExtractFileName(Exe)+')'; Tool.Executable:=Exe; Tool.CmdLineParams:=MergeCmdLineParams(Params); - Tool.WorkingDirectory:=ExtractFilePath(HTMLFilename); + Tool.WorkingDirectory:=WorkDir; Tool.MaxIdleInMS:=1000; Result:=RunExternalTool(Tool); finally @@ -1778,6 +1794,21 @@ begin end; end; +function TSimpleWebServerController.OpenBrowserWithServer( + aServer: TSWSInstance; HTMLFilename: string): boolean; +var + URL: String; +begin + if aServer=nil then + raise Exception.Create('TSimpleWebServerController.OpenBrowserWithServer 20220410185207'); + if not FilenameIsAbsolute(HTMLFilename) then + raise Exception.Create('TSimpleWebServerController.OpenBrowserWithServer 20220410185208'); + + URL:=GetURLWithServer(aServer,HTMLFilename); + + Result:=OpenBrowserWithURL(URL,ExtractFilePath(HTMLFilename)); +end; + function TSimpleWebServerController.FindBrowserFile(ShortFilename: string ): string; begin diff --git a/components/simplewebservergui/simplewebsrvutils.pas b/components/simplewebservergui/simplewebsrvutils.pas index 174ef41af9..6b250cdd93 100644 --- a/components/simplewebservergui/simplewebsrvutils.pas +++ b/components/simplewebservergui/simplewebsrvutils.pas @@ -16,7 +16,7 @@ uses {$IFDEF Unix} BaseUnix, Errors, {$ENDIF} - Classes, SysUtils, Sockets, Process, + Classes, SysUtils, Types, Sockets, Process, LazLoggerBase, FileUtil, Dialogs, IDEDialogs; @@ -31,22 +31,22 @@ type {$IFDEF Darwin} function FindProcessListeningOnPortMac(const IPAddr: in_addr; aPort: word; out aDesc: string; out aPID: integer): boolean; function KillProcessMac(aPID: integer): boolean; - function FindFreePortMac(aStartPort: word): word; + function FindFreePortMac(aStartPort: word; AvoidPorts: TWordDynArray): word; {$ENDIF} {$IFDEF Linux} function FindProcessListeningOnPortLinux(const IPAddr: in_addr; aPort: word; out aDesc: string; out aPID: integer): boolean; function KillProcessLinux(aPID: integer): boolean; - function FindFreePortLinux(aStartPort: word): word; + function FindFreePortLinux(aStartPort: word; AvoidPorts: TWordDynArray): word; {$ENDIF} {$IFDEF MSWindows} function FindProcessListeningOnPortWin(const IPAddr: in_addr; aPort: word; out aDesc: string; out aPID: integer): boolean; function KillProcessWin(aPID: integer): boolean; - function FindFreePortWin(aStartPort: word): word; + function FindFreePortWin(aStartPort: word; AvoidPorts: TWordDynArray): word; {$ENDIF} public function FindProcessListeningOnPort(const IPAddr: in_addr; aPort: word; out aDesc: string; out aPID: integer): boolean; function KillProcess(aPID: integer): boolean; - function FindFreePort(aStartPort: word; Interactive: boolean): word; + function FindFreePort(aStartPort: word; Interactive: boolean; AvoidPorts: TWordDynArray): word; function SameInAddr(const A,B: in_addr): boolean; property ViewCaption: string read FViewCaption write FViewCaption; end; @@ -165,18 +165,18 @@ begin end; function TSimpleWebServerUtility.FindFreePort(aStartPort: word; - Interactive: boolean): word; + Interactive: boolean; AvoidPorts: TWordDynArray): word; begin Result:=0; try {$IFDEF Darwin} - Result:=FindFreePortMac(aStartPort); + Result:=FindFreePortMac(aStartPort,AvoidPorts); {$ENDIF} {$IFDEF Linux} - Result:=FindFreePortLinux(aStartPort); + Result:=FindFreePortLinux(aStartPort,AvoidPorts); {$ENDIF} {$IFDEF MSWindows} - Result:=FindFreePortWin(aStartPort); + Result:=FindFreePortWin(aStartPort,AvoidPorts); {$ENDIF} except on E: Exception do begin @@ -367,7 +367,8 @@ begin Result:=false; end; -function TSimpleWebServerUtility.FindFreePortMac(aStartPort: word): word; +function TSimpleWebServerUtility.FindFreePortMac(aStartPort: word; + AvoidPorts: TWordDynArray): word; const lsofparams = '-nPi4'; var @@ -396,7 +397,7 @@ begin exit; end; - Ports:=[]; + Ports:=copy(AvoidPorts); sl:=TStringList.Create; try sl.Text:=OutStr; @@ -576,7 +577,8 @@ begin Result:=false; end; -function TSimpleWebServerUtility.FindFreePortLinux(aStartPort: word): word; +function TSimpleWebServerUtility.FindFreePortLinux(aStartPort: word; + AvoidPorts: TWordDynArray): word; const NetstatParams = '-nlptu4'; var ExePath, OutStr, Line, CurLocalAddr: String; @@ -584,7 +586,7 @@ var i: Integer; LocalAddrPos, ForeignAddrPos, p, l: SizeInt; CurPort: LongInt; - Ports: array of word; + Ports: TWordDynArray; begin Result:=0; // query netstat to find the IPv4 tcp/udp ports @@ -606,7 +608,7 @@ begin exit; end; - Ports:=[]; + Ports:=copy(AvoidPorts); sl:=TStringList.Create; try sl.Text:=OutStr; @@ -733,7 +735,8 @@ begin end; end; -function TSimpleWebServerUtility.FindFreePortWin(aStartPort: word): word; +function TSimpleWebServerUtility.FindFreePortWin(aStartPort: word; + AvoidPorts: TWordDynArray): word; var pTCPTable: PMIB_TCPTABLE2; aSize, r: DWord; @@ -757,8 +760,8 @@ begin r:=GetTcpTable2(pTCPTable,aSize,true); if r<>NO_ERROR then exit; + Ports:=copy(AvoidPorts); {$R-} - Ports:=[]; for i:=0 to pTCPTable^.dwNumEntries-1 do begin LocalPort:=NToHs(word(pTCPTable^.table[i].dwLocalPort));