diff --git a/.gitattributes b/.gitattributes index ef652ae1be..0cabebd680 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3459,8 +3459,12 @@ components/onlinepackagemanager/opkman_const.pas svneol=native#text/pascal components/onlinepackagemanager/opkman_contributors.txt svneol=native#text/plain components/onlinepackagemanager/opkman_createjsonforupdates.lfm svneol=native#text/plain components/onlinepackagemanager/opkman_createjsonforupdates.pas svneol=native#text/pascal +components/onlinepackagemanager/opkman_createjsonforupdatesfrm.lfm svneol=native#text/plain +components/onlinepackagemanager/opkman_createjsonforupdatesfrm.pas svneol=native#text/pascal components/onlinepackagemanager/opkman_createrepositorypackage.lfm svneol=native#text/plain components/onlinepackagemanager/opkman_createrepositorypackage.pas svneol=native#text/pascal +components/onlinepackagemanager/opkman_createrepositorypackagefrm.lfm svneol=native#text/plain +components/onlinepackagemanager/opkman_createrepositorypackagefrm.pas svneol=native#text/pascal components/onlinepackagemanager/opkman_downloader.pas svneol=native#text/pascal components/onlinepackagemanager/opkman_fpcdef.inc svneol=native#text/pascal components/onlinepackagemanager/opkman_installer.pas svneol=native#text/pascal diff --git a/components/onlinepackagemanager/onlinepackagemanager.lpk b/components/onlinepackagemanager/onlinepackagemanager.lpk index 89690c03e6..6cfca930e3 100644 --- a/components/onlinepackagemanager/onlinepackagemanager.lpk +++ b/components/onlinepackagemanager/onlinepackagemanager.lpk @@ -83,8 +83,8 @@ - - + + @@ -100,8 +100,8 @@ - - + + diff --git a/components/onlinepackagemanager/onlinepackagemanager.pas b/components/onlinepackagemanager/onlinepackagemanager.pas index 760942595b..b9ba3f2c93 100644 --- a/components/onlinepackagemanager/onlinepackagemanager.pas +++ b/components/onlinepackagemanager/onlinepackagemanager.pas @@ -12,8 +12,8 @@ uses opkman_visualtree, opkman_serializablepackages, opkman_downloader, opkman_common, opkman_progressfrm, opkman_zipper, opkman_timer, opkman_installer, opkman_packagelistfrm, opkman_options, - opkman_createrepositorypackage, opkman_categoriesfrm, - opkman_packagedetailsfrm, opkman_updates, opkman_createjsonforupdates, + opkman_createrepositorypackagefrm, opkman_categoriesfrm, + opkman_packagedetailsfrm, opkman_updates, opkman_createjsonforupdatesfrm, opkman_uploader, opkman_repositories, LazarusPackageIntf; implementation diff --git a/components/onlinepackagemanager/opkman_const.pas b/components/onlinepackagemanager/opkman_const.pas index fd93f32594..a97b036c9f 100644 --- a/components/onlinepackagemanager/opkman_const.pas +++ b/components/onlinepackagemanager/opkman_const.pas @@ -349,6 +349,8 @@ resourcestring rsCreateRepositoryPackageFrm_bOptions_Hint = 'Open options dialog'; rsCreateRepositoryPackageFrm_bCreate_Caption = 'Create'; rsCreateRepositoryPackageFrm_bCreate_Hint = 'Create files locally'; + rsCreateRepositoryPackageFrm_bCreate_Caption1 = 'Add'; + rsCreateRepositoryPackageFrm_bCreate_Hint1 = 'Add package to repository'; rsCreateRepositoryPackageFrm_bSubmit_Caption = 'Submit'; rsCreateRepositoryPackageFrm_bSubmit_Hint = 'Submit files to remote server'; rsCreateRepositoryPackageFrm_bCancel_Caption = 'Cancel'; diff --git a/components/onlinepackagemanager/opkman_createjsonforupdatesfrm.lfm b/components/onlinepackagemanager/opkman_createjsonforupdatesfrm.lfm new file mode 100644 index 0000000000..428c2a9bfd --- /dev/null +++ b/components/onlinepackagemanager/opkman_createjsonforupdatesfrm.lfm @@ -0,0 +1,173 @@ +object CreateJSONForUpdatesFrm: TCreateJSONForUpdatesFrm + Left = 524 + Height = 304 + Top = 275 + Width = 580 + BorderIcons = [biSystemMenu] + Caption = 'CreateJSONForUpdatesFrm' + ClientHeight = 304 + ClientWidth = 580 + Constraints.MinHeight = 200 + Constraints.MinWidth = 300 + OnCreate = FormCreate + OnDestroy = FormDestroy + PopupMode = pmExplicit + Position = poOwnerFormCenter + LCLVersion = '1.9.0.0' + object pnButtons: TPanel + Left = 0 + Height = 41 + Top = 263 + Width = 580 + Align = alBottom + BevelOuter = bvNone + ClientHeight = 41 + ClientWidth = 580 + TabOrder = 1 + object bCreate: TButton + Left = 415 + Height = 26 + Top = 8 + Width = 75 + Anchors = [akTop, akRight] + Caption = 'Create' + OnClick = bCreateClick + TabOrder = 0 + end + object bClose: TButton + Left = 491 + Height = 26 + Top = 8 + Width = 75 + Anchors = [akTop, akRight] + Caption = 'Close' + ModalResult = 2 + TabOrder = 1 + end + object bHelp: TButton + Left = 339 + Height = 26 + Top = 8 + Width = 75 + Anchors = [akTop, akRight] + Caption = 'Help' + OnClick = bHelpClick + TabOrder = 2 + end + end + object pnTop: TPanel + Left = 0 + Height = 72 + Top = 0 + Width = 580 + Align = alTop + BevelOuter = bvNone + ClientHeight = 72 + ClientWidth = 580 + TabOrder = 0 + Visible = False + object lbLinkToZip: TLabel + Left = 15 + Height = 15 + Top = 16 + Width = 104 + Caption = 'Link to package zip:' + ParentColor = False + end + object edLinkToZip: TEdit + Left = 15 + Height = 23 + Top = 32 + Width = 498 + Anchors = [akTop, akLeft, akRight] + TabOrder = 0 + end + object bTest: TButton + Left = 516 + Height = 25 + Top = 31 + Width = 50 + Anchors = [akTop, akRight] + Caption = 'Test' + OnClick = bTestClick + TabOrder = 1 + end + end + object imTree: TImageList + left = 16 + top = 144 + Bitmap = { + 4C69020000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00E1F2F8007DC3DCFF76C0DCFFDCEFF700FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F0F9 + FC0099CEE00055B6D9FF9CD5EAFF88CCE7FF4DAFD6FF8FC7DD00ECF6FB00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FCFEFE00AFD8E60063BD + DBFF92CFE5FFE6F8FCFFE3F6FEFFAFDDF2FFB2E4F7FF72C0E1FF55ADD5FFA3CF + E100F8FCFD00FFFFFF00FFFFFF00FFFFFF00C7E4EE0076C4DEFF7EC6E0FFD1EE + F7FFF6FFFFFFF0FEFFFFCBEDFBFF50ADDAFF8BD7F7FFAAE1F9FF95D6F2FF62B2 + DBFF61AED4FFBAD9E800FFFFFF0089CADE004EB5D9FFA5D9EDFFD2EBF5FFBEDE + EDFF95C9DEFF89C3DBFF70B8D6FF69B9DDFF90D7F5FF7FCFF5FF9DDBF8FFAAE3 + FAFF84CAECFF51A6D5FF74B3D5004FB4D8FFE1F8FEFFCDEBF9FF92D2EDFF84CC + EBFF6FBFE5FF56B1DBFF3B94C8FFCEECFAFFD9F5FFFFB9EAFFFF95DFFEFF77D5 + FFFFA5E4FFFF84DCFBFF3193C9FF55B6D8FFE2F8FDFFD4F3FFFFB0E4FAFF86CF + F1FF7FD0F5FF78D0F5FF4CB1E4FFB0E4FAFFB6E9FFFF9BE1FFFF78D6FEFF40BD + F5FF3DB5E9FF90D5F1FF3895CAFF53B4D7FFE2F6FDFFDAF4FFFFD5F3FFFFBDEB + FFFF89D5F7FF69C9F5FF4CB4E9FF8DDAFBFF8CDCFFFF009600FF009600FF0096 + 00FF4FBBE8FF8CD0F0FF3693C9FF51B1D6FFE2F6FCFFD7F4FFFFCEF2FFFFC8EF + FFFFBAEBFFFF92DBFBFF56C1F1FF48C2F9FF3BBDF0FF009600FF00C000FF0096 + 00FF47B1E6FF88CAEEFF3490C8FF4EAED6FFE2F6FCFFD4F3FFFFC9F0FFFFBEED + FFFFB3EAFFFFADE7FFFF7CD9FEFF48C7EFFF43C4EAFF009600FF00C000FF0096 + 00FF40A7E1FF83C5ECFF328DC7FF45A9D3FFE7FBFEFFDDF6FFFFC1EFFFFFB7EB + FFFFABE8FFFFA4E4FFFF009600FF009600FF009600FF009600FF00C000FF0096 + 00FF009600FF009600FF009600FF6FB8D80077BDDCFFBFE5F6FFDBF6FFFFC1EE + FFFFA5E5FFFF9FE3FFFF009600FF00C000FF00C000FF00C000FF00C000FF00C0 + 00FF00C000FF00C000FF009600FFFAFDFE00AFD8EB0055ABD5FF7DC0E0FFC7EE + FCFFCCF2FFFFA8E8FFFF009600FF009600FF009600FF009600FF00C000FF0096 + 00FF009600FF009600FF009600FFFFFFFF00FFFFFF00ECF4F90093C9E3FF3F9C + CEFF82C4E5FFCCF4FFFFC4EFFFFF8BD2F1FF8ACEF0FF009600FF00C000FF0096 + 00FFD1E9E100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D7E9 + F20078B7DBFF2D8EC8FF8FCDEBFF6FB7E2FF408EC8FF009600FF00C000FF0096 + 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00BDD8E8005FA7D3FF56A2D0FFB5D3E500009600FF009600FF0096 + 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF004DB4D82B4BB2D8AF4AB0D7BC48AED631FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004EB6 + D9164DB4D8844BB2D7EF9CD5EAFF88CCE7FF45ACD5F344AAD48C42A7D31AFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004FB7DA054EB6D9654CB4 + D8DB92CFE5FFE6F8FCFFE3F6FEFFAFDDF2FFB2E4F7FF72C0E1FF3FA4D1E03DA2 + D06C3BA0CF09FFFFFF00FFFFFF00FFFFFF004FB7D9464EB5D9C27EC6E0FFD1EE + F7FFF6FFFFFFF0FEFFFFCBEDFBFF50ADDAFF8BD7F7FFAAE1F9FF95D6F2FF62B2 + DBFF399DCEC8369ACD4DFFFFFF004FB7D99F4DB5D9FEA5D9EDFFD2EBF5FFBEDE + EDFF95C9DEFF89C3DBFF70B8D6FF6ABADEFF90D7F5FF7FCFF5FF9DDBF8FFAAE3 + FAFF84CAECFF51A6D5FF3295CBA64DB4D8FBE1F8FEFFCDEBF9FF92D2EDFF84CC + EBFF6FBFE5FF56B1DBFF3B94C8FFCEECFAFFD9F5FFFFB9EAFFFF95DFFEFF77D5 + FFFFA5E4FFFF84DCFBFF2F92C9FB4BB2D7F0E2F8FDFFD4F3FFFFB0E4FAFF86CF + F1FF7FD0F5FF78D0F5FF4CB1E4FFB0E4FAFFB6E9FFFF9BE1FFFF78D6FEFF40BD + F5FF3DB5E9FF90D5F1FF2D8FC8F049B0D6F8DBF6F8FFD9F3FFFFD5F3FFFFBDEB + FFFF89D5F7FF69C9F5FF4CB4E9FF8DDAFBFF8CDCFFFF48C4F9FF38B6ECFF48BF + E8FF48B8E7FF90D3F1FF2B8DC7FA47ADD5FB92E7D4FF80E5D8FFC8F1FDFFC8EF + FFFFBAEBFFFF92DBFBFF56C1F1FF48C2F9FF3BBDF0FF47C5ECFF45BDE9FF43B5 + E6FF39ADD4FF88D2CCFF288AC6FF44AAD4F7A8EDE2FF41D6B3FF49D8BAFF8CE4 + E4FFB3EAFFFFADE7FFFF7CD9FEFF48C7EFFF43C4EAFF43BEE8FF3DB3DCFF2DAE + A9FF29B188FF85D3BBFF2687C5FE42A8D3F9E7FBFEFFD0F3F9FF46D7B8FF39D4 + AEFF50D9C3FF8EE2F2FF96E1FEFF48C6EBFF3FBCE3FF30AFB1FF24AC84FF24AD + 81FF67BFC2FF83C4ECFF2485C4F840A5D2BB77BDDCFFBFE5F6FFDBF6FFFF9EE8 + EBFF37D3ACFF37D2ACFF55D8D1FF37B8BCFF24AA85FF22AA7CFF4DB7A9FF86C6 + EBFF74B3E4FF4A90CAFF2283C3C13DA2D0063BA0CF65399DCEDB7DC0E0FFC7EE + FCFFCBF2FEFF65DDD0FF33D1A8FF22AA7CFF35B091FF89CBE8FF82C1EBFF5397 + D0FF2384C3E02282C26D2080C20AFFFFFF00FFFFFF00369ACD163498CC853295 + CBEF82C4E5FFCCF4FFFFBCEEFAFF88D1E4FF8ACEF0FF5FA4D7FF2586C4F32384 + C38D2182C21BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003093 + CA2B2E90C9A52C8EC8FE8FCDEBFF6FB7E2FF408EC8FF2485C4AC2383C331FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF002A8BC6462889C5BE2687C5C42485C44DFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00 + } + end + object SD: TSaveDialog + DefaultExt = '.json' + Filter = '*.json|*.json' + left = 75 + top = 145 + end +end diff --git a/components/onlinepackagemanager/opkman_createjsonforupdatesfrm.pas b/components/onlinepackagemanager/opkman_createjsonforupdatesfrm.pas new file mode 100644 index 0000000000..905ea33bc7 --- /dev/null +++ b/components/onlinepackagemanager/opkman_createjsonforupdatesfrm.pas @@ -0,0 +1,377 @@ +{ + *************************************************************************** + * * + * This source is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This code is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * A copy of the GNU General Public License is available on the World * + * Wide Web at . You can also * + * obtain it by writing to the Free Software Foundation, * + * Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. * + * * + *************************************************************************** + + Author: Balázs Székely +} + +unit opkman_createjsonforupdatesfrm; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, fpjson, + // LCL + Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, LCLIntf, + // OpkMan + opkman_serializablepackages, opkman_const, opkman_common, opkman_updates, + opkman_VirtualTrees, opkman_options; + +type + + { TCreateJSONForUpdatesFrm } + + TCreateJSONForUpdatesFrm = class(TForm) + bClose: TButton; + bCreate: TButton; + bHelp: TButton; + bTest: TButton; + edLinkToZip: TEdit; + imTree: TImageList; + lbLinkToZip: TLabel; + pnTop: TPanel; + pnButtons: TPanel; + SD: TSaveDialog; + procedure bCreateClick(Sender: TObject); + procedure bHelpClick(Sender: TObject); + procedure bTestClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + private + FVST: TVirtualStringTree; + FMetaPackage: TMetaPackage; + FSortCol: Integer; + FSortDir: opkman_VirtualTrees.TSortDirection; + procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; {%H-}TextType: TVSTTextType; var CellText: String); + procedure VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; + {%H-}Kind: TVTImageKind; Column: TColumnIndex; var {%H-}Ghosted: Boolean; + var ImageIndex: Integer); + procedure VSTCompareNodes(Sender: TBaseVirtualTree; Node1, + Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); + procedure VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); + procedure VSTHeaderClick(Sender: TVTHeader; Column: TColumnIndex; + Button: TMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer); + public + procedure PopluateTree; + end; + +var + CreateJSONForUpdatesFrm: TCreateJSONForUpdatesFrm; + +implementation + +{$R *.lfm} + +{ TCreateJSONForUpdatesFrm } + +type + PData = ^TData; + TData = record + FName: string; + FVersion: String; + FForceNotify: Boolean; + FInternalVersion: Integer; + FImageIndex: Integer; + end; + +procedure TCreateJSONForUpdatesFrm.FormCreate(Sender: TObject); +begin + if not Options.UseDefaultTheme then + Self.Color := clBtnFace; + Caption := rsCreateJSONForUpdatesFrm_Caption; + lbLinkToZip.Caption := rsCreateJSONForUpdatesFrm_lbLinkToZip_Caption; + bTest.Caption := rsCreateJSONForUpdatesFrm_bTest_Caption; + bCreate.Caption := rsCreateJSONForUpdatesFrm_bCreate_Caption; + bHelp.Caption := rsCreateJSONForUpdatesFrm_bHelp_Caption; + bClose.Caption := rsCreateJSONForUpdatesFrm_bClose_Caption; + + FVST := TVirtualStringTree.Create(nil); + with FVST do + begin + Parent := Self; + Align := alClient; + Anchors := [akLeft, akTop, akRight]; + Images := imTree; + if not Options.UseDefaultTheme then + Color := clBtnFace; + DefaultNodeHeight := 25; + Indent := 0; + TabOrder := 1; + DefaultText := ''; + Header.AutoSizeIndex := 0; + Header.Height := 25; + Colors.BorderColor := clBlack; + BorderSpacing.Top := 15; + BorderSpacing.Left := 15; + BorderSpacing.Right := 15; + BorderSpacing.Bottom := 0; + with Header.Columns.Add do + begin + Position := 0; + Width := 250; + Text := rsCreateJSONForUpdatesFrm_Column0_Text; + end; + with Header.Columns.Add do + begin + Position := 1; + Width := 75; + Text := rsCreateJSONForUpdatesFrm_Column1_Text; + Alignment := taCenter; + end; + with Header.Columns.Add do + begin + Position := 2; + Width := 100; + Text := rsCreateJSONForUpdatesFrm_Column2_Text; + Alignment := taCenter; + Options := Options - [coVisible]; + end; + with Header.Columns.Add do + begin + Position := 3; + Width := 100; + Text := rsCreateJSONForUpdatesFrm_Column3_Text; + Alignment := taCenter; + Options := Options - [coVisible]; + end; + Header.Options := [hoAutoResize, hoRestrictDrag, hoShowSortGlyphs, hoAutoSpring, hoVisible]; + Header.SortColumn := 0; + TabOrder := 2; + TreeOptions.MiscOptions := [toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning, toCheckSupport, toEditable]; + TreeOptions.PaintOptions := [toHideFocusRect, toPopupMode, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]; + TreeOptions.SelectionOptions := [toFullRowSelect, toRightClickSelect]; + TreeOptions.AutoOptions := [toAutoTristateTracking]; + OnGetText := @VSTGetText; + OnGetImageIndex := @VSTGetImageIndex; + OnCompareNodes := @VSTCompareNodes; + OnHeaderClick := @VSTHeaderClick; + OnFreeNode := @VSTFreeNode; + end; + FVST.NodeDataSize := SizeOf(TData); +end; + +procedure TCreateJSONForUpdatesFrm.FormDestroy(Sender: TObject); +begin + FVST.Free; +end; + +procedure TCreateJSONForUpdatesFrm.bTestClick(Sender: TObject); +begin + if Trim(edLinkToZip.Text) = '' then + begin + MessageDlgEx(rsCreateJSONForUpdatesFrm_Message2, mtInformation, [mbOk], Self); + edLinkToZip.SetFocus; + Exit; + end; + OpenURL(edLinkToZip.Text); +end; + +procedure TCreateJSONForUpdatesFrm.bCreateClick(Sender: TObject); +var + UpdatePkg: TUpdatePackage; + UpdateLazPkgs: TUpdateLazPackages; + JSON: TJSONStringType; + Ms: TMemoryStream; + Node: PVirtualNode; + Data: PData; + CanClose: Boolean; + ErrMsg: String; +begin + if FVST.CheckedCount = 0 then + begin + MessageDlgEx(rsCreateJSONForUpdatesFrm_Message3, mtInformation, [mbOk], Self); + Exit; + end; + CanClose := False; + if FMetaPackage.DisplayName <> '' then + SD.FileName := 'update_' + FMetaPackage.DisplayName + else + SD.FileName := 'update_' + FMetaPackage.Name; + if SD.Execute then + begin + UpdatePkg := TUpdatePackage.Create; + try + UpdatePkg.UpdatePackageData.Name := FMetaPackage.Name; + UpdatePkg.UpdatePackageData.DownloadZipURL := edLinkToZip.Text; + + Node := FVST.GetFirst; + while Assigned(Node) do + begin + if FVST.CheckState[Node] = csCheckedNormal then + begin + Data := FVST.GetNodeData(Node); + UpdateLazPkgs := TUpdateLazPackages(UpdatePkg.UpdateLazPackages.Add); + UpdateLazPkgs.Name := Data^.FName; + UpdateLazPkgs.Version := Data^.FVersion; + UpdateLazPkgs.ForceNotify := Data^.FForceNotify; + UpdateLazPkgs.InternalVersion := Data^.FInternalVersion; + end; + Node := FVST.GetNext(Node); + end; + JSON := ''; + if UpdatePkg.SaveToJSON(JSON) then + begin + JSON := StringReplace(JSON, '\/', '/', [rfReplaceAll]); + Ms := TMemoryStream.Create; + try + Ms.Write(Pointer(JSON)^, Length(JSON)); + Ms.Position := 0; + Ms.SaveToFile(SD.FileName); + finally + MS.Free; + end; + CanClose := True; + MessageDlgEx(rsCreateJSONForUpdatesFrm_Message4, mtInformation, [mbOk], Self); + end + else + begin + ErrMsg := StringReplace(UpdatePkg.LastError, '"', '', [rfReplaceAll]); + MessageDlgEx(rsCreateJSONForUpdatesFrm_Error1 + sLineBreak + '"' + ErrMsg + '"', mtError, [mbOk], Self); + end; + finally + UpdatePkg.Free; + end; + end; + if CanClose then + Close +end; + +procedure TCreateJSONForUpdatesFrm.bHelpClick(Sender: TObject); +begin + OpenURL(cHelpPage_CreateExternalJSON); +end; + +procedure TCreateJSONForUpdatesFrm.VSTGetText(Sender: TBaseVirtualTree; + Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; + var CellText: String); +var + Data: PData; +begin + Data := FVST.GetNodeData(Node); + case Column of + 0: CellText := Data^.FName; + 1: CellText := Data^.FVersion; + 2: CellText := BoolToStr(Data^.FForceNotify, True); + 3: CellText := IntToStr(Data^.FInternalVersion); + end; +end; + +procedure TCreateJSONForUpdatesFrm.VSTGetImageIndex(Sender: TBaseVirtualTree; + Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; + var Ghosted: Boolean; var ImageIndex: Integer); +var + Data: PData; +begin + Data := FVST.GetNodeData(Node); + if Column = 0 then + ImageIndex := Data^.FImageIndex; +end; + +procedure TCreateJSONForUpdatesFrm.VSTCompareNodes(Sender: TBaseVirtualTree; + Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); +var + Data1: PData; + Data2: PData; +begin + Data1 := Sender.GetNodeData(Node1); + Data2 := Sender.GetNodeData(Node2); + case Column of + 0: Result := CompareText(Data1^.FName, Data2^.FName); + 1: Result := CompareText(Data1^.FVersion, Data2^.FVersion); + end; +end; + +procedure TCreateJSONForUpdatesFrm.VSTFreeNode(Sender: TBaseVirtualTree; + Node: PVirtualNode); +var + Data: PData; +begin + Data := FVST.GetNodeData(Node); + Finalize(Data^) +end; + +procedure TCreateJSONForUpdatesFrm.VSTHeaderClick(Sender: TVTHeader; + Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +begin + if Column > 1 then + Exit; + if Button = mbLeft then + begin + with Sender, Treeview do + begin + if (SortColumn = NoColumn) or (SortColumn <> Column) then + begin + SortColumn := Column; + SortDirection := opkman_VirtualTrees.sdAscending; + end + else + begin + if SortDirection = opkman_VirtualTrees.sdAscending then + SortDirection := opkman_VirtualTrees.sdDescending + else + SortDirection := opkman_VirtualTrees.sdAscending; + FSortDir := SortDirection; + end; + SortTree(SortColumn, SortDirection, False); + FSortCol := Sender.SortColumn; + end; + end; + +end; + +procedure TCreateJSONForUpdatesFrm.PopluateTree; +var + I, J: Integer; + Node: PVirtualNode; + Data: PData; + LazarusPkg: TLazarusPackage; +begin + for I := 0 to SerializablePackages.Count - 1 do + begin + FMetaPackage := SerializablePackages.Items[I]; + if FMetaPackage.Checked then + begin + Caption := Caption + ' "' + FMetaPackage.DisplayName +'"'; + for J := 0 to FMetaPackage.LazarusPackages.Count - 1 do + begin + LazarusPkg := TLazarusPackage(FMetaPackage.LazarusPackages.Items[J]); + if LazarusPkg.Checked then + begin + Node := FVST.AddChild(nil); + Node^.CheckType := ctTriStateCheckBox; + FVST.CheckState[Node] := csCheckedNormal; + Data := FVST.GetNodeData(Node); + Data^.FName := LazarusPkg.Name; + Data^.FVersion := LazarusPkg.VersionAsString; + Data^.FForceNotify := False; + Data^.FInternalVersion := 1; + Data^.FImageIndex := 1; + end; + end; + Break; + end; + end; +end; + + +end. + diff --git a/components/onlinepackagemanager/opkman_createrepositorypackagefrm.lfm b/components/onlinepackagemanager/opkman_createrepositorypackagefrm.lfm new file mode 100644 index 0000000000..8fd6dc53cf --- /dev/null +++ b/components/onlinepackagemanager/opkman_createrepositorypackagefrm.lfm @@ -0,0 +1,739 @@ +object CreateRepositoryPackagesFrm: TCreateRepositoryPackagesFrm + Left = 550 + Height = 500 + Top = 254 + Width = 750 + BorderIcons = [biSystemMenu] + Caption = 'CreateRepositoryPackagesFrm' + ClientHeight = 500 + ClientWidth = 750 + Constraints.MinHeight = 450 + Constraints.MinWidth = 650 + OnCreate = FormCreate + OnDestroy = FormDestroy + PopupMode = pmExplicit + Position = poOwnerFormCenter + object pnMessage: TPanel + Left = 247 + Height = 402 + Top = 57 + Width = 503 + Align = alClient + BevelOuter = bvNone + Caption = 'No items to show' + Font.CharSet = ANSI_CHARSET + Font.Color = clBlack + Font.Height = -16 + Font.Name = 'Verdana' + Font.Pitch = fpVariable + Font.Quality = fqDraft + Font.Style = [fsBold] + ParentFont = False + TabOrder = 0 + Visible = False + end + object pnPackages: TPanel + Left = 0 + Height = 402 + Top = 57 + Width = 245 + Align = alLeft + BevelOuter = bvNone + TabOrder = 1 + end + object pnBrowse: TPanel + Left = 0 + Height = 57 + Top = 0 + Width = 750 + Align = alTop + BevelOuter = bvNone + ClientHeight = 57 + ClientWidth = 750 + TabOrder = 2 + object lbPackagedir: TLabel + AnchorSideLeft.Control = pnBrowse + AnchorSideTop.Control = pnBrowse + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 15 + Top = 21 + Width = 68 + Alignment = taRightJustify + BorderSpacing.Left = 6 + Caption = 'lbPackagedir' + ParentColor = False + end + object Bevel1: TBevel + Left = 0 + Height = 2 + Top = 55 + Width = 750 + Align = alBottom + end + object edPackageDir: TDirectoryEdit + AnchorSideLeft.Control = lbPackagedir + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = lbPackagedir + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = pnBrowse + AnchorSideRight.Side = asrBottom + Left = 80 + Height = 23 + Top = 17 + Width = 664 + OnAcceptDirectory = edPackageDirAcceptDirectory + ShowHidden = False + ButtonWidth = 50 + NumGlyphs = 1 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Around = 6 + MaxLength = 0 + TabOrder = 0 + OnButtonClick = edPackageDirButtonClick + end + end + object pnData: TPanel + Left = 247 + Height = 402 + Top = 57 + Width = 503 + Align = alClient + BevelOuter = bvNone + ClientHeight = 402 + ClientWidth = 503 + TabOrder = 3 + object pnPackageData: TPanel + Left = 0 + Height = 213 + Top = 189 + Width = 503 + Align = alClient + BevelOuter = bvNone + BorderStyle = bsSingle + ClientHeight = 209 + ClientWidth = 499 + TabOrder = 1 + Visible = False + object edSupportedWidgetset: TEdit + Left = 170 + Height = 23 + Top = 80 + Width = 300 + Anchors = [akTop, akLeft, akRight] + TabOrder = 2 + end + object lbLazCompatibility: TLabel + Left = 9 + Height = 15 + Top = 14 + Width = 99 + Caption = 'lbLazCompatibility' + ParentColor = False + end + object lbFPCCompatibility: TLabel + Left = 9 + Height = 15 + Top = 50 + Width = 103 + Caption = 'lbFPCCompatibility' + ParentColor = False + end + object edLazCompatibility: TEdit + Left = 170 + Height = 23 + Top = 8 + Width = 300 + Anchors = [akTop, akLeft, akRight] + TabOrder = 0 + end + object edFPCCompatibility: TEdit + Left = 170 + Height = 23 + Top = 45 + Width = 300 + Anchors = [akTop, akLeft, akRight] + TabOrder = 1 + end + object lbSupportedWidgetSet: TLabel + Left = 9 + Height = 15 + Top = 85 + Width = 119 + Caption = 'lbSupportedWidgetSet' + ParentColor = False + end + object lbOF1: TLabel + Left = 474 + Height = 15 + Top = 14 + Width = 5 + Anchors = [akTop, akRight] + Caption = '*' + Font.Color = clRed + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lbOF3: TLabel + Left = 474 + Height = 15 + Top = 50 + Width = 5 + Anchors = [akTop, akRight] + Caption = '*' + Font.Color = clRed + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lbOF4: TLabel + Left = 474 + Height = 15 + Top = 85 + Width = 5 + Anchors = [akTop, akRight] + Caption = '*' + Font.Color = clRed + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + end + object pnCategory: TPanel + Left = 0 + Height = 189 + Top = 0 + Width = 503 + Align = alTop + BevelOuter = bvNone + BorderStyle = bsSingle + ClientHeight = 185 + ClientWidth = 499 + TabOrder = 0 + Visible = False + object lbCategory: TLabel + Left = 9 + Height = 15 + Top = 14 + Width = 58 + Caption = 'lbCategory' + ParentColor = False + end + object lbOF2: TLabel + Left = 474 + Height = 15 + Top = 14 + Width = 5 + Anchors = [akTop, akRight] + Caption = '*' + Font.Color = clRed + Font.Style = [fsBold] + ParentColor = False + ParentFont = False + end + object lbHomePageURL: TLabel + Left = 9 + Height = 15 + Top = 87 + Width = 90 + Caption = 'lbHomePageURL' + ParentColor = False + end + object lbDownloadURL: TLabel + Left = 9 + Height = 15 + Top = 123 + Width = 85 + Caption = 'lbDownloadURL' + ParentColor = False + end + object edHomePageURL: TEdit + Left = 170 + Height = 23 + Top = 83 + Width = 300 + Anchors = [akTop, akLeft, akRight] + TabOrder = 2 + end + object edDownloadURL: TEdit + Left = 170 + Height = 23 + Top = 118 + Width = 300 + Anchors = [akTop, akLeft, akRight] + TabOrder = 3 + end + object lbSVNURL: TLabel + Left = 9 + Height = 15 + Top = 154 + Width = 53 + Caption = 'lbSVNURL' + ParentColor = False + Visible = False + end + object edSVNURL: TEdit + Left = 170 + Height = 23 + Top = 152 + Width = 300 + Anchors = [akTop, akLeft, akRight] + TabOrder = 4 + Visible = False + end + object lbDisplayName: TLabel + Left = 9 + Height = 15 + Top = 53 + Width = 80 + Caption = 'lbDisplayName' + ParentColor = False + end + object edDisplayName: TEdit + Left = 170 + Height = 23 + Top = 48 + Width = 300 + Anchors = [akTop, akLeft, akRight] + TabOrder = 1 + end + object pnCategories: TPanel + Left = 170 + Height = 23 + Top = 9 + Width = 301 + Anchors = [akTop, akLeft, akRight] + AutoSize = True + BevelOuter = bvNone + ClientHeight = 23 + ClientWidth = 301 + ParentColor = False + TabOrder = 0 + object spCategories: TSpeedButton + Left = 251 + Height = 23 + Top = 0 + Width = 50 + Align = alRight + Caption = '...' + OnClick = spCategoriesClick + ShowHint = True + ParentShowHint = False + end + object edCategories: TEdit + Left = 0 + Height = 23 + Top = 0 + Width = 251 + Align = alClient + AutoSize = False + ParentShowHint = False + ReadOnly = True + ShowHint = True + TabOrder = 0 + end + end + end + end + object spMain: TSplitter + Left = 245 + Height = 402 + Top = 57 + Width = 2 + AutoSnap = False + Color = 14671839 + MinSize = 150 + ParentColor = False + end + object pnButtons: TPanel + Left = 0 + Height = 41 + Top = 459 + Width = 750 + Align = alBottom + BevelOuter = bvNone + BorderStyle = bsSingle + ClientHeight = 37 + ClientWidth = 746 + TabOrder = 5 + object cbJSONForUpdates: TCheckBox + AnchorSideLeft.Control = pnButtons + AnchorSideTop.Control = pnButtons + AnchorSideTop.Side = asrCenter + Left = 6 + Height = 19 + Top = 9 + Width = 148 + BorderSpacing.Left = 6 + Caption = 'Create JSON for updates' + TabOrder = 0 + end + object pnB: TPanel + AnchorSideTop.Control = pnButtons + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = pnButtons + AnchorSideRight.Side = asrBottom + Left = 312 + Height = 29 + Top = 4 + Width = 428 + Anchors = [akTop, akRight] + BorderSpacing.Around = 6 + BorderSpacing.InnerBorder = 1 + BevelOuter = bvNone + ClientHeight = 29 + ClientWidth = 428 + TabOrder = 1 + object bCancel: TButton + Left = 325 + Height = 27 + Top = 1 + Width = 80 + Align = alLeft + AutoSize = True + BorderSpacing.Around = 1 + Caption = 'Cancel' + Constraints.MinWidth = 80 + Enabled = False + ModalResult = 2 + OnClick = bCancelClick + ParentShowHint = False + ShowHint = True + TabOrder = 4 + end + object bCreate: TButton + Left = 163 + Height = 27 + Top = 1 + Width = 80 + Align = alLeft + AutoSize = True + BorderSpacing.Around = 1 + Caption = 'Create' + Constraints.MinWidth = 80 + Enabled = False + OnClick = bCreateClick + ParentShowHint = False + ShowHint = True + TabOrder = 2 + Visible = False + end + object bSubmit: TButton + Left = 244 + Height = 27 + Top = 1 + Width = 80 + Align = alLeft + AutoSize = True + BorderSpacing.Around = 1 + Caption = 'Submit' + Constraints.MinWidth = 80 + Enabled = False + OnClick = bSubmitClick + ParentShowHint = False + ShowHint = True + TabOrder = 3 + end + object bOptions: TButton + Left = 82 + Height = 27 + Top = 1 + Width = 80 + Align = alLeft + AutoSize = True + BorderSpacing.Around = 1 + Caption = 'Options' + Constraints.MinWidth = 80 + Enabled = False + OnClick = bOptionsClick + ParentShowHint = False + ShowHint = True + TabOrder = 1 + end + object bHelp: TButton + Left = 1 + Height = 27 + Top = 1 + Width = 80 + Align = alLeft + AutoSize = True + BorderSpacing.Around = 1 + Caption = 'Help' + Constraints.MinWidth = 80 + Enabled = False + OnClick = bHelpClick + ParentShowHint = False + ShowHint = True + TabOrder = 0 + end + end + end + object imTree: TImageList + left = 48 + top = 88 + Bitmap = { + 4C69080000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00E1F2F8007DC3DCFF76C0DCFFDCEFF700FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F0F9 + FC0099CEE00055B6D9FF9CD5EAFF88CCE7FF4DAFD6FF8FC7DD00ECF6FB00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FCFEFE00AFD8E60063BD + DBFF92CFE5FFE6F8FCFFE3F6FEFFAFDDF2FFB2E4F7FF72C0E1FF55ADD5FFA3CF + E100F8FCFD00FFFFFF00FFFFFF00FFFFFF00C7E4EE0076C4DEFF7EC6E0FFD1EE + F7FFF6FFFFFFF0FEFFFFCBEDFBFF50ADDAFF8BD7F7FFAAE1F9FF95D6F2FF62B2 + DBFF61AED4FFBAD9E800FFFFFF0089CADE004EB5D9FFA5D9EDFFD2EBF5FFBEDE + EDFF95C9DEFF89C3DBFF70B8D6FF69B9DDFF90D7F5FF7FCFF5FF9DDBF8FFAAE3 + FAFF84CAECFF51A6D5FF74B3D5004FB4D8FFE1F8FEFFCDEBF9FF92D2EDFF84CC + EBFF6FBFE5FF56B1DBFF3B94C8FFCEECFAFFD9F5FFFFB9EAFFFF95DFFEFF77D5 + FFFFA5E4FFFF84DCFBFF3193C9FF55B6D8FFE2F8FDFFD4F3FFFFB0E4FAFF86CF + F1FF7FD0F5FF78D0F5FF4CB1E4FFB0E4FAFFB6E9FFFF9BE1FFFF78D6FEFF40BD + F5FF3DB5E9FF90D5F1FF3895CAFF53B4D7FFE2F6FDFFDAF4FFFFD5F3FFFFBDEB + FFFF89D5F7FF69C9F5FF4CB4E9FF8DDAFBFF8CDCFFFF009600FF009600FF0096 + 00FF4FBBE8FF8CD0F0FF3693C9FF51B1D6FFE2F6FCFFD7F4FFFFCEF2FFFFC8EF + FFFFBAEBFFFF92DBFBFF56C1F1FF48C2F9FF3BBDF0FF009600FF00C000FF0096 + 00FF47B1E6FF88CAEEFF3490C8FF4EAED6FFE2F6FCFFD4F3FFFFC9F0FFFFBEED + FFFFB3EAFFFFADE7FFFF7CD9FEFF48C7EFFF43C4EAFF009600FF00C000FF0096 + 00FF40A7E1FF83C5ECFF328DC7FF45A9D3FFE7FBFEFFDDF6FFFFC1EFFFFFB7EB + FFFFABE8FFFFA4E4FFFF009600FF009600FF009600FF009600FF00C000FF0096 + 00FF009600FF009600FF009600FF6FB8D80077BDDCFFBFE5F6FFDBF6FFFFC1EE + FFFFA5E5FFFF9FE3FFFF009600FF00C000FF00C000FF00C000FF00C000FF00C0 + 00FF00C000FF00C000FF009600FFFAFDFE00AFD8EB0055ABD5FF7DC0E0FFC7EE + FCFFCCF2FFFFA8E8FFFF009600FF009600FF009600FF009600FF00C000FF0096 + 00FF009600FF009600FF009600FFFFFFFF00FFFFFF00ECF4F90093C9E3FF3F9C + CEFF82C4E5FFCCF4FFFFC4EFFFFF8BD2F1FF8ACEF0FF009600FF00C000FF0096 + 00FFD1E9E100FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D7E9 + F20078B7DBFF2D8EC8FF8FCDEBFF6FB7E2FF408EC8FF009600FF00C000FF0096 + 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00BDD8E8005FA7D3FF56A2D0FFB5D3E500009600FF009600FF0096 + 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF004DB4D82B4BB2D8AF4AB0D7BC48AED631FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004EB6 + D9164DB4D8844BB2D7EF9CD5EAFF88CCE7FF45ACD5F344AAD48C42A7D31AFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004FB7DA054EB6D9654CB4 + D8DB92CFE5FFE6F8FCFFE3F6FEFFAFDDF2FFB2E4F7FF72C0E1FF3FA4D1E03DA2 + D06C3BA0CF09FFFFFF00FFFFFF00FFFFFF004FB7D9464EB5D9C27EC6E0FFD1EE + F7FFF6FFFFFFF0FEFFFFCBEDFBFF50ADDAFF8BD7F7FFAAE1F9FF95D6F2FF62B2 + DBFF399DCEC8369ACD4DFFFFFF004FB7D99F4DB5D9FEA5D9EDFFD2EBF5FFBEDE + EDFF95C9DEFF89C3DBFF70B8D6FF6ABADEFF90D7F5FF7FCFF5FF9DDBF8FFAAE3 + FAFF84CAECFF51A6D5FF3295CBA64DB4D8FBE1F8FEFFCDEBF9FF92D2EDFF84CC + EBFF6FBFE5FF56B1DBFF3B94C8FFCEECFAFFD9F5FFFFB9EAFFFF95DFFEFF77D5 + FFFFA5E4FFFF84DCFBFF2F92C9FB4BB2D7F0E2F8FDFFD4F3FFFFB0E4FAFF86CF + F1FF7FD0F5FF78D0F5FF4CB1E4FFB0E4FAFFB6E9FFFF9BE1FFFF78D6FEFF40BD + F5FF3DB5E9FF90D5F1FF2D8FC8F049B0D6F8DBF6F8FFD9F3FFFFD5F3FFFFBDEB + FFFF89D5F7FF69C9F5FF4CB4E9FF8DDAFBFF8CDCFFFF48C4F9FF38B6ECFF48BF + E8FF48B8E7FF90D3F1FF2B8DC7FA47ADD5FB92E7D4FF80E5D8FFC8F1FDFFC8EF + FFFFBAEBFFFF92DBFBFF56C1F1FF48C2F9FF3BBDF0FF47C5ECFF45BDE9FF43B5 + E6FF39ADD4FF88D2CCFF288AC6FF44AAD4F7A8EDE2FF41D6B3FF49D8BAFF8CE4 + E4FFB3EAFFFFADE7FFFF7CD9FEFF48C7EFFF43C4EAFF43BEE8FF3DB3DCFF2DAE + A9FF29B188FF85D3BBFF2687C5FE42A8D3F9E7FBFEFFD0F3F9FF46D7B8FF39D4 + AEFF50D9C3FF8EE2F2FF96E1FEFF48C6EBFF3FBCE3FF30AFB1FF24AC84FF24AD + 81FF67BFC2FF83C4ECFF2485C4F840A5D2BB77BDDCFFBFE5F6FFDBF6FFFF9EE8 + EBFF37D3ACFF37D2ACFF55D8D1FF37B8BCFF24AA85FF22AA7CFF4DB7A9FF86C6 + EBFF74B3E4FF4A90CAFF2283C3C13DA2D0063BA0CF65399DCEDB7DC0E0FFC7EE + FCFFCBF2FEFF65DDD0FF33D1A8FF22AA7CFF35B091FF89CBE8FF82C1EBFF5397 + D0FF2384C3E02282C26D2080C20AFFFFFF00FFFFFF00369ACD163498CC853295 + CBEF82C4E5FFCCF4FFFFBCEEFAFF88D1E4FF8ACEF0FF5FA4D7FF2586C4F32384 + C38D2182C21BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003093 + CA2B2E90C9A52C8EC8FE8FCDEBFF6FB7E2FF408EC8FF2485C4AC2383C331FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF002A8BC6462889C5BE2687C5C42485C44DFFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF0074A7C9FF1796FFFF1996FFFF1A96FFFF1A96 + FFFF1A96FFFF1A96FFFF1A96FFFF1A96FFFF1A96FFFF1A96FFFF1A96FFFF1A96 + FFFF1996FFFF1796FFFF74A7C9FF1A98FFFFAFDBFFFFADD9FFFFADDAFFFFADDA + FFFFADDAFFFFADDAFFFFADDAFFFFADDAFFFFADDAFFFFADDAFFFFADDAFFFFADDA + FFFFADD9FFFFAFDBFFFF1A98FFFF1A9BFFFF7DC6FFFF2A9EFFFF2B9EFFFF2C9E + FFFF2C9EFFFF2C9EFFFF2C9EFFFF2C9EFFFF2C9EFFFF2C9EFFFF2C9EFFFF2B9E + FFFF2A9EFFFF7DC6FFFF1A9BFFFFE3AA56FFFFFFF1FFFFFAD0FFFFFAD0FFFFFB + D1FFFFFBD1FFFFFBD1FFFFFBD1FFFFFBD1FFFFFBD1FFFFFBD1FFFFFBD1FFFFFB + D1FFFFFAD0FFFFFFF1FFE2AA56FFD3A459FFFFFFFAFFC4BEB4FFFFFCDEFFC4C2 + BAFFFFFFE4FFC4C3BDFFFFFFE5FFC4C3BDFFFFFFE5FFC4C3BDFFFFFFE5FFC3C2 + BCFFFFFBE0FFFFFFFBFFD2A45AFFCEA053FFFFFFFDFFC2BEB7FFC2C1BDFFD690 + 52FFD59257FFD69358FFD59357FFD69358FFD59357FFD69358FFD59357FFD592 + 56FFD28C4FFFFFFFFFFFCEA054FFCB9D4CFFFFFFFFFFC9C9C5FFFFFFF7FFD89B + 60FFFFE5A5FFD89D65FFFFE6A5FFD89D65FFFFE6A5FFD89D65FFFFE6A5FFD79C + 63FFFFDF9BFFFFFFFFFFCA9D4CFFC89945FFFFFFFFFFDA9D5EFFDAA165FFDAA4 + 6BFFDAA46CFFDAA56DFFDAA46CFFDAA56DFFDAA46CFFDAA56DFFDAA46CFFDAA3 + 6BFFD79E62FFFFFFFFFFC89945FFC6963EFFFFFFFFFFDBA66AFFFFECBAFFDCAA + 72FFFFEDBCFFDCAA72FFFFEDBCFFDCAA72FFFFEDBBFFDCAA71FFFFEDBBFFDCA9 + 6FFFFFE7B2FFFFFFFFFFC6953DFFC39236FFFFFFFFFFDEAD71FFDEB076FFDEB1 + 78FFDEB078FFDEB178FFDEB077FFDFB077FFDFAF73FFDFAF72FFDFAE71FFDFAE + 70FFDCAA6AFFFFFFFFFFC29235FFC08E2EFFFFFFFFFFE0B275FFFFF5D0FFE0B5 + 7BFFFFF6D1FFE0B57BFFFFF5D1FFE1B477FFFFFFFFFFD3D5D6FFFFFFFFFFD3D4 + D5FFFFFFFEFFFFFFFFFFC08D2DFFBE8A25FFFFFFFFFFE2B979FFE2BA7BFFE3BB + 7DFFE3BB7CFFE3BB7DFFE3BB7CFFE4BA78FFD1D3D3FFD2D2CFFFD2D1CEFFD2D1 + CEFFCFCFCEFFFFFFFFFFBE8924FFBB851FFFFFFFFFFFD6D8DCFFFFFFFFFFD6D8 + DCFFFFFFFFFFD6D8DCFFFFFFFFFFD6D7DAFFFFFFFFFFD7D6D5FFFFFFFFFFD6D5 + D4FFFFFFFFFFFFFFFFFFBB851EFFBA851BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFBA851BFFAC7C1CC0B88113FFB77F0EFFB67E0EFFB77E + 0EFFB67E0EFFB77E0EFFB67E0EFFB77E0EFFB67E0EFFB77E0EFFB67E0EFFB67E + 0EFFB77F0EFFB88113FFAC7B1CC0000000000000003300000033000000330000 + 0033000000330000003300000033000000330000003300000033000000330000 + 0033000000330000003300000000000000000000000000000000000000000000 + 0000000000000000000000000000C8E6F240C6E5F04000000000000000001CA7 + 1D6014AB26BF1FB438FF19AA23FF00000000000000000000000000000000C9E7 + F220C2E7F4CFB3E6F9FFACE1F9FFADE1F8FFAEE1F7FFAEE1F6FFADDFF5FF90D8 + DCFF77E294FF98EDAAFF5BC962FF000000000000000000000000C9E7F230BFE8 + F6EFADE7FCFFABE3F9FFA3DEF8FFA9E1FAFFB0E4F9FFB7E7F9FFB6E7F9FFA7DE + F5FFB8F4C3FFB6F4B7FF5AC65BFF0000000000000000C9E7F230B6E7F8EFA4E0 + F8FFA5E1F9FF95D6F3FFB0E4F7FFA6DFF8FFA4DFFAFFA5DFFAFFACE2F9FFA7DF + F6FF7BD296FF67CC67FF2EB02EFFD1BDA9FFC9BAA7FFAFD4DAFFA2DEF5FF98D7 + F1FF9AD8F3FFA0DEF6FF97D8F4FFA5DEF5FFAEE3F9FF9FDCF8FF8CD3F3FF75C6 + EDFF3CAA82FF20A921FF0DA00DFFD1BDA9FFCAEBF5FFA8E0F4FF8DCEE8FFA0DD + F6FF92D2EDFF9BD9F3FF78BFDDFF9BDAF7FF89D0F0FF79C9EFFF61BEE9FF57B8 + E4FF299058FF15A415FF10A110FFD1BDA9FFC2E5F1FF99D0E4FFAAE4FBFF87CA + E6FFA4DFF8FF79C0DDFF9CDBF4FF7FC1DCFF6399ABFF5A91A4FF48656BFF91B2 + BE8F19A02460029A0280059B0550D1BDA9FFEEF7FAFFC1E8F3FF90CFE8FFA4DE + F4FF86C9E6FF98D7F1FF85C4DFFF6E7F7FFF9A8A7BFFC1B5ABFF77604EFFDCD5 + D030000000000000000000000000D1BDA9FFF5FAFCFFB3D5DFFF8CC6DDFFAEE0 + F0FF96CFE4FFA3DBF1FF739DA9FFB7ADA0FFF2EBE4FFFFFFFFFF8F7966FF0000 + 0000000000000000000000000000D1BDA9FFFFFFFFFFFBF5EEFFE1E6E4FFB6D0 + D7FF99C6D5FF87BBCDFFC4CAC6FFF7F1EAFFFBF5EEFFFFFFFFFF8F7966FF0000 + 0000000000000000000000000000D1BDA9FFFFFFFFFFFAF2EAFFFAF2EAFFFAF2 + EAFFFAF2EAFFF3EEE8FFFAF2EAFFFAF2EAFFFAF2EAFFFFFFFFFF8F7966FF0000 + 0000000000000000000000000000D1BDA9FFFFFFFFFFF9F0E7FFF9F0E7FFF9F0 + E7FFF9F0E7FFF9F0E7FFF9F0E7FFF9F0E7FFF9F0E7FFFFFFFFFF8F7966FF0000 + 0000000000000000000000000000C9B4A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F7966FF0000 + 0000000000000000000000000000927C69FF8F7966FF8F7966FF8F7966FF8F79 + 66FF8F7966FF8F7966FF8F7966FF8F7966FF8F7966FF8F7966FF8F7966FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004D46 + 45114D4645DD4D4645FF4C4544EC4B4444B5494544D545403F4F000000000000 + 0000000000000000000000000000000000000000000000000000000000004A44 + 42E647423FFF464140FF3C3230FF352725FF392C2AFF413C3BFF3F3A393A0000 + 0000000000000000000000000000000000000000000000000000413C3A15413D + 3BFF423C3AFF301F1BFF5D7270FF719798FF464D4CFF2E1E1AFF3B3735750000 + 00000000000000000000000000000000000000000000000000003B39391E3024 + 21FF2D1B13FF343031FF99EAF2FFB6FFFFFFA7FDFFFF4A585DFF291F1A740000 + 00000000000000000000000000000000000000000000000000003519001B667B + 81FF74B8D9FF95E7FFFF9AE8FFFF8BD5FCFF9AF4FFFF84C6CFFF2713055E0000 + 00000000000000000000000000000000000000000000000000000C3CA51DACEF + FFFF8CE8FFFF74D0FFFF5BC4FBFF56C3FAFF59CEFFFF4FAFE9FF223F853C0000 + 00000000000000000000000000000000000000000000000000000000000086D0 + FFFF49B9F9FF3AB0F8FF3EB3FAFF40B3F9FF47C3FFFF37A1F2FF0D35BE240000 + 0000000000000000000000000000000000000000000000000000000000002D80 + EAD14CBFFFFF2BA6FCFF3AAAFAFF3AABFAFF27AEFFFF0B4496BB000000000000 + 0000000000000000000000000000000000000000000000000000180400317278 + 89E77BC3FFFF198AF0FF0A87FDFF0281F4FF55A9FDFF9B939DFF332A14760000 + 000000000000000000000000000000000000000000001F1B1963736F6DFFFFFF + FFFFFDFEFFFFCAD8F6FFA4BBD5FFBACFEDFFFFFFFFFFFFFFFFFF50494AFF221E + 1CB500000000000000000000000000000000191614467A7576FF7F7B7AFF7D79 + 78FFFFFFFFFFFFECC2FFFFCE56FFFFF4BEFFF5F8FFFF989392FF322A29FF433E + 3DFF282423950000000000000000191615483C3736CC9A9696FF352F2FFF2A25 + 24FF706E71FFFFFFFFFFEBC170FFFFFFFFFF969396FF211A1AFF45403FFF4944 + 43FF302B2AFF221F1F4C0000000033302EB47A7674FF5C5654FF373330FF322C + 2AFF575355FFFFFFFCFFE4AF55FFFFFFFAFF807F84FF272221FF403B39FF423D + 3BFF3A3734FF23201EC400000000474342D27E7976FF3E3836FF393533FF3630 + 2EFF3B3D43FFFDEFD4FFD4901DFFFFF9D4FF63666CFF241E1BFF3E3836FF3E39 + 37FF3F3D39FF211E1CE6000000003A3835CD555351FF35312FFF383432FF3C36 + 34FF272B38FFFFEEC6FFEB8B00FFFFEA9AFF6D7587FF25201BFF383432FF332F + 2DFF2E2A29FF1F1B1AE500000000100D0C000F0D0C38171312971A1817CE1E1A + 18F6131218F3625847F3563100F3685030F32C2F39F7120E0EDF1C1817B01512 + 1286150F104B1816152100000000170B0B166952246F53411C59453418493B2F + 1340392B113A32291237332512363325123632291237392B113A3B2F13404335 + 18484E3C1B545F4B20654031164340311643EFBB52FFEFBB52FFEFBB52FFDCAC + 4BEBD5A648E4EFBB52FFECB952FFEBB952FFECB952FFE2B14DF2CB9E46D9EFBB + 52FFEFBB52FFEFBB52FF8D6F3097624C1F68EEBA51FFEEBA51FF7A5F2A83FFFF + FF00FFFFFF00E2B14EFAE7B550FFE8B651FFEDB951FF43351548FFFFFF00342B + 113ADCAD4BEDEEBA51FF9F7D35AB84682C90ECB84FFF6F562579FFFFFF00FFFF + FF00FFFFFF00D7A84BF5E3B24EFFEBB74FFFECB84FFF372A113CFFFFFF00FFFF + FF003B2F1340E9B54FFEAC863BBFAB8537BBA58036B3FFFFFF00FFFFFF00FFFF + FF00FFFFFF00D7A84AF5EAB64DFFEBB74DFFEBB74DFF372A113CFFFFFF00FFFF + FF00FFFFFF0084692D99BF9540D4BB913CCD261F0C28FFFFFF00FFFFFF00FFFF + FF00FFFFFF00DEAC49F4EAB64CFFEAB64CFFEAB64CFF372A113CFFFFFF00FFFF + FF00FFFFFF002621162BBC923ED2FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00DDAC47F4E8B44AFFE8B44AFFE8B44AFF372A113CFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00DCAB46F4E7B349FFE7B349FFE7B349FF372B123DFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00DBA943F4E5B147FFE5B147FFE4B047FF392F1B46FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00DAA842F4E4B046FFE3AF46FFDCAA46FF39301C48FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00D8A640F4E1AD44FFDAA944FFD8A844FF352F1B46FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00D6A53EF4D9A842FFD7A742FFD9A842FF332B123DFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00CE9F3EF6D5A541FFD7A641FFDEAA41FF3629103DFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000004044 + 440224251F25D5A43FFFD6A53FFFDDA93FFFDEAA3FFF513E155EFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000141505107159 + 238CB98E37DED7A53EFFDBA83EFFDCA83EFFDCA83EFFD19F3AF3826325972B20 + 0A2FFFFFFF00FFFFFF00FFFFFF00000000000000000040444401191A0E156951 + 2081644D1D785C46196C55411965563F166459431869634B1A736A501C7C2C22 + 0A34FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0078CF82D475CD80FF73CA7DFE70C77AB4FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0077CF + 821278CD82FF9CD9A7FF98D8A2FF6DC476ECFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0072C97CF497D8A2FF8DD297FF69C072BEFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0079D083FF76CE81FF74CB7EFF71C9 + 7BFF6FC678FE97D7A1FF93D59DFF65BC6EF062B86AED5FB567EF5BB163EFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0076CE80FF9BD9A6FF99D8A4FF98D7 + A2FF96D7A1FF95D59EFF93D49CFF8FD198FF8CD095FF8ACF94FF57AD5EFFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0073CB7DFF99D8A3FF97D7A1FF79CB + 87FF69C377FF65C273FF64C171FF67C273FF66C071FF8BCF94FF53A95AFFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0070C77AFF6DC477FF7CC985FF93D4 + 9CFF65C172FF62C06FFF5FBE6CFF5DBD69FF5ABB66FF88CF90FF66B56DFF4CA1 + 52FF489D4EFF45994AFFFFFFFF00FFFFFF00FFFFFF00FFFFFF0066BD6FFF90D2 + 99FF60BF6DFF5EBD6AFF5BBC68FF59BB64FF56BA61FF65BF6FFF83CC8BFF82CA + 89FF80CA88FF419646FFFFFFFF00FFFFFF00FFFFFF00FFFFFF0063B96BFF8DD1 + 96FF5DBC69FF5ABB66FF58BA63FF55B960FF52B75DFF62BD6BFF81CA88FF7EC8 + 85FF7EC884FF3E9242FFFFFFFF00FFFFFF0065BC6EFF62B86AFF72C07AFF8BCF + 93FF58BB64FF56BA61FF53B85FFF51B65BFF4FB559FF80CA87FF5CAC62FF4094 + 45F93D9142FF3A8E3FFFFFFFFF00FFFFFF0062B86AFF8BCF95FF8ACF92FF69C1 + 72FF86CD8EFF84CC8CFF83CB8AFF81CA88FF5DBB66FF7EC884FF409445FFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005EB465FF88CF91FF56B961FF85CD + 8DFF65B56CFF4CA152FF499E4FFF5DAD63FF7CC783FF7BC681FF3C9041FFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005AAF61FF86CD8EFF84CC8CFF83CA + 89FF4CA152FFFFFFFF00FFFFFF00429647FF7AC681FF76C37CFF398D3DFFFFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0056AB5DFF52A759FF4FA455FF4BA0 + 51FF489C4DF7FFFFFF00FFFFFF003E9243FD3B8F40FD398C3DF4368A3AE6FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF0036BAEC4438BBECF23FBDEDF33CBCEDF238BBECF236BAEC3FFFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0036B7 + E9836ACBEFF6ABE4F8FBC6EFFCFDC3EEFCFDAAE3F8FB5DC6EEF536B7E980FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0036B3E58E7ED0 + F0F7C7F1FEFEBEF1FFFFB6EFFFFFB6EFFFFFBFF1FFFFC8F1FEFE7ACFEFF736B3 + E58EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0036AFE14769C5EAF6C4F2 + FFFFABECFFFF88D8F4FF66BFE5FF65BFE4FF84D5F1FFACECFFFFC5F2FFFF5FC1 + E8F536AFE139FFFFFF00FFFFFF00FFFFFF0036ABDD093CAEDEF299DBF4FBA5EA + FFFF81D5F3FF54AFDAFF51B2DDFF50B3DEFF53AED9FF7BCFEFFFA6EAFFFF97DA + F3FA3AADDEF236ABDD06FFFFFF00FFFFFF0036A7D9093CAADAF29AE0F8FC91E5 + FFFF5FB7DEFF4CACD9FF48C0EEFF48C0EEFF4CAFDCFF5BB2DAFF92E5FFFF9ADF + F7FC3CAADAF236A7D909FFFFFF00FFFFFF0036A2D4063AA4D5F294DEF8FD86E2 + FFFF59B0D9FF49A7D4FF48C0EEFF48C0EEFF49ABD8FF56ABD5FF87E3FFFF90DC + F7FC38A3D5F236A2D403FFFFFF00FFFFFF00FFFFFF00369DCF9D7CCEEFFA80DF + FFFF6CCAEFFF4695C3FF46A1CFFF46A4D2FF4595C3FF68C4EAFF81E0FFFF7ACD + EDFA369DCF97FFFFFF00FFFFFF00FFFFFF00FFFFFF003698CA3945A3D1F479D9 + FAFE73DCFFFF63C4EBFF50A6D0FF50A5D0FF60C0E7FF73DCFFFF78D9FAFE41A0 + CFF33698CA33FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003693C57858B1 + DBF76ED6FBFE6CD9FFFF6BD9FFFF6BD9FFFF6CD9FFFF6ED5FAFE56AFD9F63693 + C575FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00368EC0644096 + C5F365C0E7FE64D5FDFF64D7FFFF64D7FFFF66D7FEFF65C0E7FE3A91C2F2368E + C041FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00368ABC614493C2F396D9 + F4FD66C3EBFF4FADD8FF49A1CEFD4AA2CFFD4FACD8FF68C3E9FF8ACDEBFB368A + BCA5368ABC17FFFFFF00FFFFFF00FFFFFF003686B811428EBDF39EDAF2FD86DF + FFFF65D7FFFF59BCE7FA3787B9F23989BBF25DC5EFFC68D7FFFF90E2FFFF7EBC + DDF93686B87AFFFFFF00FFFFFF00FFFFFF003682B41A458EBCF383D7F7FE63D6 + FFFF56B9E5FA3783B5F23682B4393682B4553B88B9F35BC8F2FD6AD8FFFF91DA + F7FE3B86B7F23682B409FFFFFF00FFFFFF00FFFFFF00367EB0754590BFF456B1 + DDF9377FB1F2367EB036FFFFFF00FFFFFF00367EB0643E88B9F360C7F1FD458F + BEF4367EB075FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00367BAD2B367B + AD86367BAD22FFFFFF00FFFFFF00FFFFFF00FFFFFF00367BAD61367BADC4367B + AD61FFFFFF00FFFFFF00FFFFFF00 + } + end + object SDD: TSelectDirectoryDialog + left = 88 + top = 88 + end +end diff --git a/components/onlinepackagemanager/opkman_createrepositorypackagefrm.pas b/components/onlinepackagemanager/opkman_createrepositorypackagefrm.pas new file mode 100644 index 0000000000..06bba77716 --- /dev/null +++ b/components/onlinepackagemanager/opkman_createrepositorypackagefrm.pas @@ -0,0 +1,1133 @@ +unit opkman_createrepositorypackagefrm; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, md5, fpjson, + // LCL + Forms, Controls, ExtCtrls, StdCtrls, Dialogs, Graphics, Buttons, EditBtn, + LCLIntf, + // LazUtils + FileUtil, LazFileUtils, Laz2_XMLCfg, + // OpkMan + opkman_VirtualTrees, opkman_serializablepackages, opkman_zipper, opkman_uploader; + +type + PPackageData = ^TData; + TData = record + FPackageRelativePath: String; + FPackageBaseDir: String; + FFullPath: String; + FDataType: Integer; + FName: String; + FDisplayName: String; + FPackageType: TPackageType; + FAuthor: String; + FDescription: String; + FLicense: String; + FVersionAsString: String; + FDependenciesAsString: String; + FCategory: String; + FLazCompatibility: String; + FFPCCompatibility: String; + FSupportedWidgetSet: String; + FHomePageURL: String; + FDownloadURL: String; + FSVNURL: String; + end; + + TPackageOperation = (poCreate, poSubmit); + + { TCreateRepositoryPackagesFrm } + + TCreateRepositoryPackagesFrm = class(TForm) + bCancel: TButton; + bCreate: TButton; + Bevel1: TBevel; + bHelp: TButton; + bOptions: TButton; + bSubmit: TButton; + cbJSONForUpdates: TCheckBox; + edCategories: TEdit; + edPackageDir: TDirectoryEdit; + edDownloadURL: TEdit; + edDisplayName: TEdit; + edSVNURL: TEdit; + edFPCCompatibility: TEdit; + edHomePageURL: TEdit; + edLazCompatibility: TEdit; + edSupportedWidgetset: TEdit; + imTree: TImageList; + lbCategory: TLabel; + lbDownloadURL: TLabel; + lbDisplayName: TLabel; + lbSVNURL: TLabel; + lbFPCCompatibility: TLabel; + lbHomePageURL: TLabel; + lbLazCompatibility: TLabel; + lbOF1: TLabel; + lbOF2: TLabel; + lbOF3: TLabel; + lbOF4: TLabel; + lbPackagedir: TLabel; + lbSupportedWidgetSet: TLabel; + pnB: TPanel; + pnButtons: TPanel; + pnCategories: TPanel; + pnPackageData: TPanel; + pnBrowse: TPanel; + pnCategory: TPanel; + pnMessage: TPanel; + pnPackages: TPanel; + pnData: TPanel; + SDD: TSelectDirectoryDialog; + spCategories: TSpeedButton; + spMain: TSplitter; + procedure bCancelClick(Sender: TObject); + procedure bCreateClick(Sender: TObject); + procedure bHelpClick(Sender: TObject); + procedure bOptionsClick(Sender: TObject); + procedure bSubmitClick(Sender: TObject); + procedure edPackageDirAcceptDirectory(Sender: TObject; Var Value: String); + procedure edPackageDirButtonClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure spCategoriesClick(Sender: TObject); + private + FVSTPackages: TVirtualStringTree; + FVSTPackageData: TVirtualStringTree; + FPackageZipper: TPackageZipper; + FPackageDir: String; + FPackageName: String; + FPackageFile: String; + FDestDir: String; + FPackageOperation: TPackageOperation; + procedure VSTPackagesGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; {%H-}TextType: TVSTTextType; var CellText: String); + procedure VSTPackagesGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; + {%H-}Kind: TVTImageKind; Column: TColumnIndex; var {%H-}Ghosted: Boolean; + var ImageIndex: Integer); + procedure VSTPackagesFocusChanging(Sender: TBaseVirtualTree; OldNode, {%H-}NewNode: PVirtualNode; + {%H-}OldColumn, {%H-}NewColumn: TColumnIndex; var Allowed: Boolean); + procedure VSTPackagesFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; {%H-}Column: TColumnIndex); + procedure VSTPackagesChecked(Sender: TBaseVirtualTree; {%H-}Node: PVirtualNode); + procedure VSTPackagesFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); + procedure VSTPackageDataGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; + Column: TColumnIndex; {%H-}TextType: TVSTTextType; var CellText: String); + procedure VSTPackageDataGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; + {%H-}Kind: TVTImageKind; Column: TColumnIndex; var {%H-}Ghosted: Boolean; + var ImageIndex: Integer); + procedure VSTCompareNodes(Sender: TBaseVirtualTree; Node1, + Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); + procedure VSTPackageDataFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); + procedure DoOnZippError(Sender: TObject; AZipFile: String; const AErrMsg: String); + procedure DoOnZipCompleted(Sender: TObject); + function LoadPackageData(const APath: String; AData: PPackageData): Boolean; + procedure ShowHideControls(const AType: Integer); + procedure EnableDisableControls(const AEnable: Boolean); + procedure SaveExtraInfo(const ANode: PVirtualNode); + function TranslateCategories(const AStr: String): String; + function CanCreate: Boolean; + function CreateJSON(var AErrMsg: String): Boolean; + function CreateJSONForUpdates(var AErrMsg: String): Boolean; + procedure DoOnUploadProgress(Sender: TObject; AFileName: String); + procedure DoOnUploadError(Sender: TObject; AErrMsg: String); + procedure DoOnUploadCompleted(Sender: TObject); + public + procedure SetType(const ATyp: Integer); + end; + +var + CreateRepositoryPackagesFrm: TCreateRepositoryPackagesFrm; + +implementation + +uses opkman_const, opkman_common, opkman_options, opkman_categoriesfrm, + opkman_mainfrm, opkman_updates; + +{$R *.lfm} + +{ TCreateRepositoryPackagesFrm } + +procedure TCreateRepositoryPackagesFrm.FormCreate(Sender: TObject); +begin + Caption := rsCreateRepositoryPackageFrm_Caption; + lbPackagedir.Caption := rsCreateRepositoryPackageFrm_lbPackageDir_Caption; + pnMessage.Caption := rsCreateRepositoryPackageFrm_pnMessage_Caption; + edCategories.Text := ''; + lbLazCompatibility.Caption := rsCreateRepositoryPackageFrm_lbLazCompatibility_Caption; + lbFPCCompatibility.Caption := rsCreateRepositoryPackageFrm_lbFPCCompatibility_Caption; + lbSupportedWidgetSet.Caption := rsCreateRepositoryPackageFrm_lbSupportedWidgetset_Caption; + lbCategory.Caption := rsCreateRepositoryPackageFrm_lbCategory_Caption; + lbDisplayName.Caption := rsCreateRepositoryPackageFrm_lbDisplayName_Caption; + lbHomePageURL.Caption := rsCreateRepositoryPackageFrm_lbHomePageURL_Caption; + lbDownloadURL.Caption := rsCreateRepositoryPackageFrm_lbDownloadURL_Caption; + lbSVNURL.Caption := rsCreateRepositoryPackageFrm_lbSVNURL_Caption; + bHelp.Caption := rsCreateRepositoryPackageFrm_bHelp_Caption; + bHelp.Hint := rsCreateRepositoryPackageFrm_bHelp_Hint; + bOptions.Caption := rsCreateRepositoryPackageFrm_bOptions_Caption; + bOptions.Hint := rsCreateRepositoryPackageFrm_bOptions_Hint; + bCreate.Caption := rsCreateRepositoryPackageFrm_bCreate_Caption; + bCreate.Hint := rsCreateRepositoryPackageFrm_bCreate_Hint; + bSubmit.Caption := rsCreateRepositoryPackageFrm_bSubmit_Caption; + bSubmit.Hint := rsCreateRepositoryPackageFrm_bSubmit_Hint; + bCancel.Caption := rsCreateRepositoryPackageFrm_bCancel_Caption; + bCancel.Hint := rsCreateRepositoryPackageFrm_bCancel_Hint; + if not Options.UseDefaultTheme then + Self.Color := clBtnFace; + + FVSTPackages := TVirtualStringTree.Create(nil); + with FVSTPackages do + begin + Parent := pnPackages; + Align := alClient; + Anchors := [akLeft, akTop, akRight]; + Images := imTree; + if not Options.UseDefaultTheme then + Color := clBtnFace; + DefaultNodeHeight := 25; + Indent := 15; + TabOrder := 1; + DefaultText := ''; + Header.AutoSizeIndex := 0; + Header.Height := 25; + Colors.BorderColor := clBlack; + with Header.Columns.Add do begin + Position := 0; + Width := 250; + Text := rsCreateRepositoryPackageFrm_pnCaption_Caption0; + end; + Header.Options := [hoAutoResize, hoColumnResize, hoRestrictDrag, hoVisible, hoAutoSpring]; + Header.SortColumn := 0; + TabOrder := 2; + TreeOptions.MiscOptions := [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning]; + TreeOptions.PaintOptions := [toHideFocusRect, toPopupMode, toShowButtons, toShowDropmark, toShowRoot, toThemeAware, toUseBlendedImages]; + TreeOptions.SelectionOptions := [toRightClickSelect]; + TreeOptions.AutoOptions := [toAutoTristateTracking]; + OnGetText := @VSTPackagesGetText; + OnGetImageIndex := @VSTPackagesGetImageIndex; + OnChecked := @VSTPackagesChecked; + OnFocusChanging := @VSTPackagesFocusChanging; + OnFocusChanged := @VSTPackagesFocusChanged; + OnFreeNode := @VSTPackagesFreeNode; + end; + FVSTPackages.NodeDataSize := SizeOf(TData); + + FVSTPackageData := TVirtualStringTree.Create(nil); + with FVSTPackageData do + begin + Parent := pnData; + Align := alTop; + Height := 200; + Anchors := [akLeft, akTop, akRight]; + Images := imTree; + if not Options.UseDefaultTheme then + Color := clBtnFace; + DefaultNodeHeight := 25; + Indent := 15; + TabOrder := 1; + DefaultText := ''; + Header.AutoSizeIndex := 1; + Header.Height := 25; + Colors.BorderColor := clBlack; + with Header.Columns.Add do begin + Position := 0; + Width := 150; + Text := rsCreateRepositoryPackageFrm_pnCaption_Caption1; + end; + with Header.Columns.Add do begin + Position := 1; + Width := 250; + Text := rsCreateRepositoryPackageFrm_pnCaption_Caption2; + end; + Header.Options := [hoAutoResize, hoColumnResize, hoRestrictDrag, hoVisible, hoAutoSpring]; + Header.SortColumn := 0; + TabOrder := 2; + TreeOptions.MiscOptions := [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning]; + TreeOptions.PaintOptions := [toHideFocusRect, toPopupMode, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]; + TreeOptions.SelectionOptions := [toRightClickSelect, toFullRowSelect]; + TreeOptions.AutoOptions := [toAutoTristateTracking]; + OnGetText := @VSTPackageDataGetText; + OnGetImageIndex := @VSTPackageDataGetImageIndex; + OnFreeNode := @VSTPackageDataFreeNode; + end; + FVSTPackageData.NodeDataSize := SizeOf(TData); + ShowHideControls(0); + EnableDisableControls(True); +end; + +procedure TCreateRepositoryPackagesFrm.FormDestroy(Sender: TObject); +begin + if Uploader <> nil then + begin + pnMessage.Caption := rsCreateRepositoryPackageFrm_Message10; + pnMessage.Invalidate; + Application.ProcessMessages; + Uploader.StopUpload; + Uploader.WaitFor; + Uploader := nil; + end; + FVSTPackages.Clear; + FVSTPackages.Free; + FVSTPackageData.Clear; + FVSTPackageData.Free; +end; + +function TCreateRepositoryPackagesFrm.LoadPackageData(const APath: String; + AData: PPackageData): Boolean; + + function PackageTypeIdentToType(const AStr: String): TPackageType; + begin + for Result := Low(TPackageType) to High(TPackageType) do + if SysUtils.CompareText(AStr, PackageTypeIdents[Result]) = 0 then + Exit; + Result := ptRunTime; + end; + + function VersionBound(const AVersion: Integer): Integer; + begin + if AVersion > 9999 then + Result := 9999 + else if AVersion < 0 then + Result := 0 + else + Result := AVersion; + end; + + function GetVersion(const AXMLConfig: TXMLConfig; const APath: String): String; + var + Major, Minor, Release, Build: Integer; + begin + Major := VersionBound(AXMLConfig.GetValue(APath + '/Major', 0)); + Minor := VersionBound(AXMLConfig.GetValue(APath + '/Minor', 0)); + Release := VersionBound(AXMLConfig.GetValue(APath + '/Release', 0)); + Build := VersionBound(AXMLConfig.GetValue(APath + '/Build', 0)); + Result := IntToStr(Major) + '.' + IntToStr(Minor) + '.' + IntToStr(Release) + '.' + IntToStr(Build); + end; + +var + XMLConfig: TXMLConfig; + BasePath, Path: String; + I, DepCount: Integer; + PackageName: String; + MinVer, MaxVer: String; +begin + Result := False; + BasePath := 'Package/'; + XMLConfig := TXMLConfig.Create(APath); + try + AData^.FPackageType := PackageTypeIdentToType(XMLConfig.GetValue(BasePath + 'Type/Value', PackageTypeIdents[ptRunTime])); + AData^.FDescription := String(XMLConfig.GetValue(BasePath + 'Description/Value', '')); + AData^.FAuthor := String(XMLConfig.GetValue(BasePath + 'Author/Value', '')); + AData^.FLicense := String(XMLConfig.GetValue(BasePath + 'License/Value', '')); + AData^.FVersionAsString := GetVersion(XMLConfig, BasePath + 'Version'); + DepCount := XMLConfig.GetValue(BasePath + 'RequiredPkgs/Count', 0); + for I := 0 to DepCount - 1 do + begin + MinVer := ''; + MaxVer := ''; + Path := BasePath + 'RequiredPkgs/Item' + IntToStr(I + 1) + '/'; + PackageName := XMLConfig.GetValue(Path + 'PackageName/Value', ''); + if XMLConfig.GetValue(Path + 'MinVersion/Valid', False) then + begin + MinVer := GetVersion(XMLConfig, Path + 'MinVersion'); + PackageName := PackageName + '(' + MinVer + ')'; + end; + if XMLConfig.GetValue(Path + 'MaxVersion/Valid', False) then + begin + MaxVer := GetVersion(XMLConfig, Path + 'MaxVersion'); + if MinVer = '' then + PackageName := PackageName + '(0.0.0.0)' + '(' + MaxVer + ')' + else + PackageName := PackageName + '(' + MaxVer + ')'; + end; + if AData^.FDependenciesAsString = '' then + AData^.FDependenciesAsString := PackageName + else + AData^.FDependenciesAsString := AData^.FDependenciesAsString + ', ' + PackageName; + end; + Result := True; + finally + XMLConfig.Free; + end; +end; + +procedure TCreateRepositoryPackagesFrm.ShowHideControls(const AType: Integer); +var + Node: PVirtualNode; +begin + case AType of + 0: begin + pnPackages.Visible := False; + pnData.Visible := False; + pnMessage.Visible := False; + end; + 1: begin + pnPackages.Visible := False; + pnData.Visible := False; + pnMessage.Visible := True; + end; + 2: begin + pnPackages.Visible := True; + pnData.Visible := True; + pnMessage.Visible := False; + Node := FVSTPackages.GetFirstSelected; + if Node <> nil then + case FVSTPackages.GetNodeLevel(Node) of + 0: begin + FVSTPackageData.Visible := False; + pnPackageData.Visible := False; + pnCategory.Visible := True; + end; + 1: begin + FVSTPackageData.Visible := True; + pnPackageData.Visible := True; + pnCategory.Visible := False; + end; + end; + end; + end; +end; + +procedure TCreateRepositoryPackagesFrm.EnableDisableControls(const AEnable: Boolean); +begin + pnBrowse.Enabled := AEnable; + cbJSONForUpdates.Enabled := AEnable; + bHelp.Enabled := AEnable; + bOptions.Enabled := AEnable; + bCreate.Enabled := (AEnable) and (FVSTPackages.CheckedCount > 0); + bSubmit.Enabled := (AEnable) and (FVSTPackages.CheckedCount > 0); + bCancel.Enabled := AEnable; +end; + +procedure TCreateRepositoryPackagesFrm.edPackageDirAcceptDirectory( + Sender: TObject; Var Value: String); +var + PackageList: TStringList; + I: Integer; + Node, RootNode: PVirtualNode; + Data, RootData: PPackageData; + CanGo: Boolean; +begin + CanGo := False; + ShowHideControls(1); + Application.ProcessMessages; + try + FPackageDir := Value; + Options.LastPackageDirSrc := FPackageDir; + Options.Changed := True; + PackageList := TStringList.Create; + try + FindPackages(FPackageDir, PackageList); + if PackageList.Count > 0 then + begin + FVSTPackages.Clear; + FVSTPackages.NodeDataSize := SizeOf(TData); + FVSTPackageData.Clear; + FVSTPackageData.NodeDataSize := SizeOf(TData); + RootNode := FVSTPackages.AddChild(nil); + RootNode^.CheckType := ctTriStateCheckBox; + RootData := FVSTPackages.GetNodeData(RootNode); + RootData^.FName := TPackageData(PackageList.Objects[0]).FPackageBaseDir; + RootData^.FCategory := ''; + RootData^.FDisplayName := ''; + RootData^.FHomePageURL := ''; + RootData^.FDownloadURL := ''; + RootData^.FSVNURL := ''; + RootData^.FDataType := 0; + FPackageName := RootData^.FName; + for I := 0 to PackageList.Count - 1 do + begin + Node := FVSTPackages.AddChild(RootNode); + Node^.CheckType := ctTriStateCheckBox; + Data := FVSTPackages.GetNodeData(Node); + Data^.FName := TPackageData(PackageList.Objects[I]).FName; + Data^.FPackageBaseDir := TPackageData(PackageList.Objects[I]).FPackageBaseDir; + RootData^.FPackageBaseDir := Data^.FPackageBaseDir; + Data^.FPackageRelativePath := TPackageData(PackageList.Objects[I]).FPackageRelativePath; + Data^.FFullPath := TPackageData(PackageList.Objects[I]).FFullPath; + if not LoadPackageData(Data^.FFullPath, Data) then + MessageDlgEx(rsCreateRepositoryPackageFrm_Error0, mtError, [mbOk], TForm(Self.Parent)); + Data^.FLazCompatibility := '1.6, 1.8, Trunk'; + Data^.FFPCCompatibility := '2.6.4, 3.0.0, 3.0.2, 3.0.4'; + Data^.FSupportedWidgetSet := 'win32/64, gtk2, carbon'; + Data^.FDataType := 1; + end; + FVSTPackages.FullExpand; + RootNode := FVSTPackages.GetFirst; + if RootNode <> nil then + begin + FVSTPackages.FocusedNode := RootNode; + FVSTPackages.Selected[RootNode] := True; + CanGo := True; + end; + FVSTPackages.SortTree(0, opkman_VirtualTrees.sdAscending); + end + else + MessageDlgEx(rsCreateRepositoryPackageFrm_NoPackage, mtInformation, [mbOk], TForm(Self.Parent)); + finally + for I := PackageList.Count - 1 downto 0 do + PackageList.Objects[I].Free; + PackageList.Free; + end; + finally + if CanGo then + ShowHideControls(2) + else + ShowHideControls(0) + end; +end; + +procedure TCreateRepositoryPackagesFrm.edPackageDirButtonClick(Sender: TObject); +begin + edPackageDir.DialogTitle := rsCreateRepositoryPackageFrm_SDDTitleSrc; + edPackageDir.Directory := Options.LastPackagedirSrc; +end; + +procedure TCreateRepositoryPackagesFrm.spCategoriesClick(Sender: TObject); +begin + CategoriesFrm := TCategoriesFrm.Create(Self.Parent); + try + CategoriesFrm.SetupControls; + CategoriesFrm.CategoriesCSV := edCategories.Text; + CategoriesFrm.PopulateTree; + if CategoriesFrm.ShowModal = mrOK then + edCategories.Text := CategoriesFrm.CategoriesCSV; + finally + CategoriesFrm.Free; + end; +end; + +function TCreateRepositoryPackagesFrm.CanCreate: Boolean; + procedure SelectAndFocusNode(const ANode: PVirtualNode); + begin + FVSTPackages.Selected[ANode ] := True; + FVSTPackages.FocusedNode := ANode; + end; + +var + Node: PVirtualNode; + Data: PPackageData; +begin + Result := False; + Node := FVSTPackages.GetFirstSelected; + if Node <> nil then + SaveExtraInfo(Node); + Node := FVSTPackages.GetFirst; + while Assigned(Node) do + begin + Data := FVSTPackages.GetNodeData(Node); + if ((FVSTPackages.CheckState[Node] = csCheckedNormal) or (FVSTPackages.CheckState[Node] = csMixedNormal)) and (FVSTPackages.GetNodeLevel(Node) = 0) then + begin + ShowHideControls(2); + if Data^.FCategory = '' then + begin + SelectAndFocusNode(Node); + MessageDlgEx(rsCreateRepositoryPackageFrm_Message0 + ' "' + Data^.FName + '".', mtInformation, [mbOk], TForm(Self.Parent)); + edCategories.SetFocus; + Exit; + end; + end; + if (FVSTPackages.CheckState[Node] = csCheckedNormal) and (FVSTPackages.GetNodeLevel(Node) = 1) then + begin + ShowHideControls(2); + if Trim(Data^.FLazCompatibility) = '' then + begin + SelectAndFocusNode(Node); + MessageDlgEx(rsCreateRepositoryPackageFrm_Message1 + ' "' + Data^.FName + '".', mtInformation, [mbOk], TForm(Self.Parent)); + edLazCompatibility.SetFocus; + Exit; + end; + if Trim(Data^.FFPCCompatibility) = '' then + begin + SelectAndFocusNode(Node); + MessageDlgEx(rsCreateRepositoryPackageFrm_Message2 + ' "' + Data^.FName + '".', mtInformation, [mbOk], TForm(Self.Parent)); + edFPCCompatibility.SetFocus; + Exit; + end; + if Trim(Data^.FSupportedWidgetSet) = '' then + begin + SelectAndFocusNode(Node); + MessageDlgEx(rsCreateRepositoryPackageFrm_Message3 + ' "' + Data^.FName + '".', mtInformation, [mbOk], TForm(Self.Parent)); + edSupportedWidgetset.SetFocus; + Exit; + end; + end; + Node := FVSTPackages.GetNext(Node); + end; + Result := True; +end; + +procedure TCreateRepositoryPackagesFrm.bCreateClick(Sender: TObject); +var + RootNode: PVirtualNode; + RootData: PPackageData; +begin + if not CanCreate then + Exit; + SDD.Title := rsCreateRepositoryPackageFrm_SDDTitleDst; + SDD.InitialDir := Options.LastPackagedirDst; + EnableDisableControls(False); + if SDD.Execute then + begin + FPackageOperation := poCreate; + Screen.Cursor := crHourGlass; + ShowHideControls(1); + FPackageZipper := TPackageZipper.Create; + FPackageZipper.OnZipError := @DoOnZippError; + FPackageZipper.OnZipCompleted := @DoOnZipCompleted; + FDestDir := AppendPathDelim(SDD.FileName); + Options.LastPackagedirDst := SDD.FileName; + Options.Changed := True; + RootNode := FVSTPackages.GetFirst; + RootData := FVSTPackages.GetNodeData(RootNode); + if RootData^.FDisplayName <> '' then + FPackageName := StringReplace(RootData^.FDisplayName, ' ', '', [rfReplaceAll]) + else + FPackageName := StringReplace(RootData^.FName, ' ', '', [rfReplaceAll]); + FPackageFile := FDestDir + FPackageName + '.zip'; + pnMessage.Caption := rsCreateRepositoryPackageFrm_Message4; + fPackageZipper.StartZip(FPackageDir, FPackageFile); + end + else + EnableDisableControls(True); +end; + +procedure TCreateRepositoryPackagesFrm.bSubmitClick(Sender: TObject); +var + RootNode: PVirtualNode; + RootData: PPackageData; +begin + if not CanCreate then + Exit; + FPackageOperation := poSubmit; + EnableDisableControls(False); + ShowHideControls(1); + Screen.Cursor := crHourGlass; + fPackageZipper := TPackageZipper.Create; + fPackageZipper.OnZipError := @DoOnZippError; + fPackageZipper.OnZipCompleted := @DoOnZipCompleted; + FDestDir := Options.LocalRepositoryUpdate; + RootNode := FVSTPackages.GetFirst; + RootData := FVSTPackages.GetNodeData(RootNode); + if RootData^.FDisplayName <> '' then + FPackageName := StringReplace(RootData^.FDisplayName, ' ', '', [rfReplaceAll]) + else + FPackageName := StringReplace(RootData^.FName, ' ', '', [rfReplaceAll]); + FPackageFile := FDestDir + FPackageName + '.zip'; + pnMessage.Caption := rsCreateRepositoryPackageFrm_Message4; + fPackageZipper.StartZip(FPackageDir, FPackageFile); +end; + +procedure TCreateRepositoryPackagesFrm.bHelpClick(Sender: TObject); +begin + OpenURL(cHelpPage_CreateRepositoryPackage); +end; + +procedure TCreateRepositoryPackagesFrm.bOptionsClick(Sender: TObject); +begin + MainFrm.ShowOptions(3); +end; + +procedure TCreateRepositoryPackagesFrm.bCancelClick(Sender: TObject); +begin + if Assigned(FPackageZipper) then + FPackageZipper.Terminate; + TForm(Self.Parent).ModalResult := mrCancel; + TForm(Self.Parent).Close; +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackagesGetText( + Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; + TextType: TVSTTextType; var CellText: String); +var + Data: PPackageData; +begin + Data := FVSTPackages.GetNodeData(Node); + if Column = 0 then + CellText := Data^.FName; +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackagesGetImageIndex( + Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; + Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); +begin + if Column = 0 then + ImageIndex := FVSTPackages.GetNodeLevel(Node); +end; + +procedure TCreateRepositoryPackagesFrm.SaveExtraInfo(const ANode: PVirtualNode); +var + Data: PPackageData; +begin + Data := FVSTPackages.GetNodeData(ANode); + case FVSTPackages.GetNodeLevel(ANode) of + 0: begin + Data^.FCategory := edCategories.Text; + Data^.FDisplayName := edDisplayName.Text; + Data^.FHomePageURL := edHomePageURL.Text; + Data^.FDownloadURL := edDownloadURL.Text; + Data^.FSVNURL := edSVNURL.Text; + end; + 1: begin + Data^.FLazCompatibility := edLazCompatibility.Text; + Data^.FFPCCompatibility := edFPCCompatibility.Text; + Data^.FSupportedWidgetSet := edSupportedWidgetset.Text; + end; + end; +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackagesFocusChanging( + Sender: TBaseVirtualTree; OldNode, NewNode: PVirtualNode; OldColumn, + NewColumn: TColumnIndex; var Allowed: Boolean); +begin + if (OldNode = nil) or (NewNode = nil) or (OldNode = NewNode) then + Exit; + SaveExtraInfo(OldNode); + edCategories.Text := ''; + edLazCompatibility.Text := ''; + edFPCCompatibility.Text := ''; + edSupportedWidgetset.Text := ''; + edDisplayName.Text := ''; + edHomePageURL.Text := ''; + edDownloadURL.Text := ''; + edSVNURL.Text := ''; + Allowed := True; +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackagesFocusChanged( + Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex); +var + Data: PPackageData; + PDNode: PVirtualNode; + PDData: PPackageData; + Level: Integer; +begin + if Node = nil then + Exit; + Level := FVSTPackages.GetNodeLevel(Node); + Data := FVSTPackages.GetNodeData(Node); + if Level = 0 then + begin + edCategories.Text := Data^.FCategory; + edDisplayName.Text := Data^.FDisplayName; + edHomePageURL.Text := Data^.FHomePageURL; + edDownloadURL.Text := Data^.FDownloadURL; + edSVNURL.Text := Data^.FSVNURL; + end + else if Level = 1 then + begin + FVSTPackageData.Clear; + + PDNode := FVSTPackageData.AddChild(nil); + PDData := FVSTPackageData.GetNodeData(PDNode); + PDData^.FVersionAsString := Data^.FVersionAsString; + PDData^.FDataType := 2; + + PDNode := FVSTPackageData.AddChild(nil); + PDData := FVSTPackageData.GetNodeData(PDNode); + PDData^.FDescription := Trim(Data^.FDescription); + PDData^.FDataType := 3; + + PDNode := FVSTPackageData.AddChild(nil); + PDData := FVSTPackageData.GetNodeData(PDNode); + PDData^.FAuthor := Data^.FAuthor; + PDData^.FDataType := 4; + + PDNode := FVSTPackageData.AddChild(nil); + PDData := FVSTPackageData.GetNodeData(PDNode); + PDData^.FPackageType := Data^.FPackageType; + PDData^.FDataType := 5; + + PDNode := FVSTPackageData.AddChild(nil); + PDData := FVSTPackageData.GetNodeData(PDNode); + PDData^.FDependenciesAsString := Data^.FDependenciesAsString; + PDData^.FDataType := 6; + + PDNode := FVSTPackageData.AddChild(nil); + PDData := FVSTPackageData.GetNodeData(PDNode); + PDData^.FLicense := Trim(Data^.FLicense); + PDData^.FDataType := 7; + + edLazCompatibility.Text := Data^.FLazCompatibility; + edFPCCompatibility.Text := Data^.FFPCCompatibility; + edSupportedWidgetset.Text := Data^.FSupportedWidgetSet; + end; + ShowHideControls(2); +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackagesChecked( + Sender: TBaseVirtualTree; Node: PVirtualNode); +begin + EnableDisableControls(True); +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackagesFreeNode( + Sender: TBaseVirtualTree; Node: PVirtualNode); +var + Data: PPackageData; +begin + Data := FVSTPackages.GetNodeData(Node); + Finalize(Data^); +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackageDataGetText( + Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; + TextType: TVSTTextType; var CellText: String); +var + Data: PPackageData; +begin + Data := FVSTPackageData.GetNodeData(Node); + case Column of + 0: case Data^.FDataType of + 2: CellText := rsMainFrm_VSTText_Version; + 3: CellText := rsMainFrm_VSTText_Description; + 4: CellText := rsMainFrm_VSTText_Author; + 5: CellText := rsMainFrm_VSTText_Packagetype; + 6: CellText := rsMainFrm_VSTText_Dependecies; + 7: CellText := rsMainFrm_VSTText_License; + end; + 1: case Data^.FDataType of + 2: CellText := Data^.FVersionAsString; + 3: CellText := Data^.FDescription; + 4: CellText := Data^.FAuthor; + 5: case Data^.FPackageType of + ptRunAndDesignTime: CellText := rsMainFrm_VSTText_PackageType0; + ptDesignTime: CellText := rsMainFrm_VSTText_PackageType1; + ptRunTime: CellText := rsMainFrm_VSTText_PackageType2; + ptRunTimeOnly: CellText := rsMainFrm_VSTText_PackageType3; + end; + 6: CellText := Data^.FDependenciesAsString; + 7: CellText := Data^.FLicense; + end; + end; +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackageDataGetImageIndex( + Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; + Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); +var + Data: PPackageData; +begin + if Column = 0 then + begin + Data := FVSTPackageData.GetNodeData(Node); + ImageIndex := Data^.FDataType; + end; +end; + +procedure TCreateRepositoryPackagesFrm.VSTCompareNodes( + Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; + var Result: Integer); +var + Data1: PPackageData; + Data2: PPackageData; +begin + Data1 := Sender.GetNodeData(Node1); + Data2 := Sender.GetNodeData(Node2); + if Column = 0 then + begin + if (Data1^.FDataType = 1) and (Data1^.FDataType = 1) then + Result := CompareText(Data1^.FName, Data2^.FName); + if (Data1^.FDataType < Data2^.FDataType) then + Result := 0 + else if (Data1^.FDataType > Data2^.FDataType) then + Result := 1 + end; +end; + +procedure TCreateRepositoryPackagesFrm.VSTPackageDataFreeNode( + Sender: TBaseVirtualTree; Node: PVirtualNode); +var + Data: PPackageData; +begin + Data := FVSTPackageData.GetNodeData(Node); + Finalize(Data^); +end; + +procedure TCreateRepositoryPackagesFrm.DoOnZippError(Sender: TObject; + AZipFile: String; const AErrMsg: String); +begin + Screen.Cursor := crDefault; + MessageDlgEx(rsCreateRepositoryPackageFrm_Error1 + ' "' + AZipFile + '". ' + rsProgressFrm_Error1 + sLineBreak + + AErrMsg, mtError, [mbOk], TForm(Self.Parent)); + ShowHideControls(2); + EnableDisableControls(True); +end; + +function TCreateRepositoryPackagesFrm.TranslateCategories(const AStr: String + ): String; +var + SL: TStringList; + I, J: Integer; + Str: String; +begin + if Categories[0] = CategoriesEng[0] then + begin + Result := AStr; + Exit; + end; + Result := ''; + SL := TStringList.Create; + try + SL.Delimiter := ','; + SL.StrictDelimiter := True; + SL.DelimitedText := AStr; + for I := 0 to SL.Count - 1 do + begin + Str := Trim(SL.Strings[I]); + for J := 0 to MaxCategories - 1 do + begin + if Str = Categories[J] then + begin + if Result = '' then + Result := CategoriesEng[J] + else + Result := Result + ', ' + CategoriesEng[J]; + Break; + end; + end; + end; + finally + SL.Free; + end; + if Result = '' then + Result := AStr; +end; + +function TCreateRepositoryPackagesFrm.CreateJSONForUpdates(var AErrMsg: String + ): Boolean; +var + RootNode, Node: PVirtualNode; + RootData, Data: PPackageData; + JSON: TJSONStringType; + Ms: TMemoryStream; + UpdatePackage: TUpdatePackage; + UpdateLazPkgs: TUpdateLazPackages; +begin + Result := False; + pnMessage.Caption := rsCreateRepositoryPackageFrm_Message6; + pnMessage.Invalidate; + Application.ProcessMessages; + Sleep(2000); + UpdatePackage := TUpdatePackage.Create; + try + RootNode := FVSTPackages.GetFirst; + if RootNode <> nil then + begin + RootData := FVSTPackages.GetNodeData(RootNode); + UpdatePackage.UpdatePackageData.Name := RootData^.FName; + UpdatePackage.UpdatePackageData.DownloadZipURL := RootData^.FDownloadURL; + Node := FVSTPackages.GetFirstChild(RootNode); + while Assigned(Node) do + begin + if FVSTPackages.CheckState[Node] = csCheckedNormal then + begin + Data := FVSTPackages.GetNodeData(Node); + UpdateLazPkgs := TUpdateLazPackages(UpdatePackage.UpdateLazPackages.Add); + UpdateLazPkgs.Name := Data^.FName; + UpdateLazPkgs.Version := Data^.FVersionAsString; + UpdateLazPkgs.ForceNotify := False; + UpdateLazPkgs.InternalVersion := 1; + end; + Node := FVSTPackages.GetNextSibling(Node); + end; + end; + JSON := ''; + if UpdatePackage.SaveToJSON(JSON) then + begin + JSON := StringReplace(JSON, '\/', '/', [rfReplaceAll]); + Ms := TMemoryStream.Create; + try + Ms.Write(Pointer(JSON)^, Length(JSON)); + Ms.Position := 0; + Ms.SaveToFile(FDestDir + 'update_' + FPackageName + '.json'); + finally + MS.Free; + end; + Result := True; + end + else + AErrMsg := rsCreateJSONForUpdatesFrm_Error1 + sLineBreak + '"' + StringReplace(UpdatePackage.LastError, '"', '', [rfReplaceAll]) + '"'; + finally + UpdatePackage.Free; + end; +end; + +function TCreateRepositoryPackagesFrm.CreateJSON(var AErrMsg: String): Boolean; +var + SerializablePackages: TSerializablePackages; + MetaPkg: TMetaPackage; + LazarusPkg: TLazarusPackage; + RootNode, Node: PVirtualNode; + RootData, Data: PPackageData; + JSON: TJSONStringType; + MS: TMemoryStream; +begin + Result := False; + pnMessage.Caption := rsCreateRepositoryPackageFrm_Message5; + pnMessage.Invalidate; + Application.ProcessMessages; + Sleep(2000); + SerializablePackages := TSerializablePackages.Create; + try + RootNode := FVSTPackages.GetFirst; + if RootNode <> nil then + begin + RootData := FVSTPackages.GetNodeData(RootNode); + MetaPkg := SerializablePackages.AddMetaPackage(RootData^.FName); + MetaPkg.Category := TranslateCategories(RootData^.FCategory); + MetaPkg.RepositoryFileName := ExtractFileName(FPackageFile); + MetaPkg.RepositoryFileSize := FileUtil.FileSize(FPackageFile); + MetaPkg.RepositoryFileHash := MD5Print(MD5File(FPackageFile)); + MetaPkg.RepositoryDate := Trunc(now); + MetaPkg.PackageBaseDir := RootData^.FPackageBaseDir; + MetaPkg.DisplayName := RootData^.FDisplayName; + MetaPkg.HomePageURL := RootData^.FHomePageURL; + MetaPkg.DownloadURL := RootData^.FDownloadURL; + MetaPkg.SVNURL := RootData^.FSVNURL; + Node := FVSTPackages.GetFirstChild(RootNode); + while Assigned(Node) do + begin + if FVSTPackages.CheckState[Node] = csCheckedNormal then + begin + Data := FVSTPackages.GetNodeData(Node); + LazarusPkg := TLazarusPackage(MetaPkg.LazarusPackages.Add); + LazarusPkg.Name := Data^.FName; + LazarusPkg.PackageRelativePath := Data^.FPackageRelativePath; + LazarusPkg.Version := TPackageVersion.Create; + LazarusPkg.Version.AsString := Data^.FVersionAsString; + LazarusPkg.Description := Data^.FDescription; + LazarusPkg.Author := Data^.FAuthor; + LazarusPkg.LazCompatibility := Data^.FLazCompatibility; + LazarusPkg.FPCCompatibility := Data^.FFPCCompatibility; + LazarusPkg.SupportedWidgetSet := Data^.FSupportedWidgetSet; + LazarusPkg.PackageType := Data^.FPackageType; + LazarusPkg.Dependencies := TPackageDependencies.Create(TPackageDependency); + LazarusPkg.Dependencies.SetDependenciesAsString(Data^.FDependenciesAsString); + LazarusPkg.License := Data^.FLicense; + end; + Node := FVSTPackages.GetNextSibling(Node); + end; + end; + if SerializablePackages.Count > 0 then + begin + JSON := ''; + if SerializablePackages.PackagesToJSON(JSON) then + begin + MS := TMemoryStream.Create; + try + MS.Write(Pointer(JSON)^, Length(JSON)); + MS.Position := 0; + MS.SaveToFile(FDestDir + FPackageName + '.json'); + Result := True; + finally + MS.Free; + end; + end + else + AErrMsg := rsCreateRepositoryPackageFrm_Error2 + sLineBreak + '"' + StringReplace(SerializablePackages.LastError, '"', '', [rfReplaceAll]) + '"' + end; + finally + SerializablePackages.Free; + end; +end; + +procedure TCreateRepositoryPackagesFrm.DoOnZipCompleted(Sender: TObject); +var + ErrMsg, JsonUpd: String; +begin + ErrMsg := ''; + if not CreateJSON(ErrMsg) then + begin + MessageDlgEx(ErrMsg, mtError, [mbOk], TForm(Self.Parent)); + Exit; + end; + + if cbJSONForUpdates.Checked then + begin + ErrMsg := ''; + if not CreateJSONForUpdates(ErrMsg) then + begin + MessageDlgEx(ErrMsg, mtError, [mbOk], TForm(Self.Parent)); + Exit; + end; + end; + + case FPackageOperation of + poCreate: + begin + Screen.Cursor := crDefault; + ShowHideControls(2); + EnableDisableControls(True); + MessageDlgEx(rsCreateRepositoryPackageFrm_Message7, mtInformation, [mbOk], TForm(Self.Parent)); + TForm(Self.Parent).ModalResult := mrOk; + TForm(Self.Parent).Close; + end; + poSubmit: + begin + Uploader := TUploader.Create; + Uploader.OnUploadProgress := @DoOnUploadProgress; + Uploader.OnUploadError := @DoOnUploadError; + Uploader.OnUploadCompleted := @DoOnUploadCompleted; + if cbJSONForUpdates.Checked then + JsonUpd := FDestDir + 'update_' + FPackageName + '.json' + else + JsonUpd := ''; + Uploader.StartUpload(cSubmitURL_Zip, cSubmitURL_JSON, FPackageFile, + FDestDir + FPackageName + '.json', JsonUpd); + end; + end; +end; + +procedure TCreateRepositoryPackagesFrm.DoOnUploadProgress(Sender: TObject; + AFileName: String); +begin + pnMessage.Caption := Format(rsCreateRepositoryPackageFrm_Message8, [AFileName]); + pnMessage.Invalidate; + Application.ProcessMessages; +end; + +procedure TCreateRepositoryPackagesFrm.DoOnUploadError(Sender: TObject; + AErrMsg: String); +begin + Screen.Cursor := crDefault; + ShowHideControls(2); + EnableDisableControls(True); + MessageDlgEx(AErrMsg, mtError, [mbOk], TForm(Self.Parent)); +end; + +procedure TCreateRepositoryPackagesFrm.DoOnUploadCompleted(Sender: TObject); +begin + Screen.Cursor := crDefault; + ShowHideControls(2); + EnableDisableControls(True); + Uploader := nil; + if FileExists(FPackageFile) then + DeleteFile(FPackageFile); + if FileExists(FDestDir + FPackageName + '.json') then + DeleteFile(FDestDir + FPackageName + '.json'); + if FileExists(FDestDir + 'update_' + FPackageName + '.json') then + DeleteFile(FDestDir + 'update_' + FPackageName + '.json'); + MessageDlgEx(rsCreateRepositoryPackageFrm_Message9, mtInformation, [mbOk], TForm(Self.Parent)); + TForm(Self.Parent).ModalResult := mrOk; + TForm(Self.Parent).Close; +end; + +procedure TCreateRepositoryPackagesFrm.SetType(const ATyp: Integer); +begin + bSubmit.Visible := ATyp = 0; + cbJSONForUpdates.Visible := ATyp = 0; + bCreate.Visible := True; + if ATyp = 1 then + begin + bCreate.Caption := rsCreateRepositoryPackageFrm_bCreate_Caption1; + bCreate.Hint := rsCreateRepositoryPackageFrm_bCreate_Hint1; + end; + +end; + +end. + diff --git a/components/onlinepackagemanager/opkman_mainfrm.pas b/components/onlinepackagemanager/opkman_mainfrm.pas index 017b764af1..04c5370fdf 100644 --- a/components/onlinepackagemanager/opkman_mainfrm.pas +++ b/components/onlinepackagemanager/opkman_mainfrm.pas @@ -41,8 +41,8 @@ uses opkman_VirtualTrees, opkman_downloader, opkman_installer, opkman_serializablepackages, opkman_visualtree, opkman_const, opkman_common, opkman_progressfrm, opkman_zipper, opkman_packagelistfrm, opkman_options, - opkman_optionsfrm, opkman_createrepositorypackage, opkman_updates, - opkman_createjsonforupdates; + opkman_optionsfrm, opkman_createrepositorypackagefrm, opkman_updates, + opkman_createjsonforupdatesfrm; type @@ -983,6 +983,7 @@ procedure TMainFrm.miCreateRepositoryPackageClick(Sender: TObject); begin CreateRepositoryPackagesFrm := TCreateRepositoryPackagesFrm.Create(MainFrm); try + CreateRepositoryPackagesFrm.SetType(0); CreateRepositoryPackagesFrm.ShowModal; finally CreateRepositoryPackagesFrm.Free;