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;