Opkman: Private repositories(step1).

git-svn-id: trunk@55799 -
This commit is contained in:
balazs 2017-09-08 10:04:05 +00:00
parent 2c0f3660a0
commit 520a347095
9 changed files with 767 additions and 62 deletions

2
.gitattributes vendored
View File

@ -3477,6 +3477,8 @@ components/onlinepackagemanager/opkman_progressfrm.lfm svneol=native#text/plain
components/onlinepackagemanager/opkman_progressfrm.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_repositories.lfm -text svneol=native#plain/text
components/onlinepackagemanager/opkman_repositories.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_repositorydetailsfrm.lfm svneol=native#text/plain
components/onlinepackagemanager/opkman_repositorydetailsfrm.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_serializablepackages.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_timer.pas svneol=native#text/pascal
components/onlinepackagemanager/opkman_updates.pas svneol=native#text/pascal

View File

@ -20,7 +20,7 @@
<Description Value="Online package manger"/>
<License Value="GPL"/>
<Version Major="1"/>
<Files Count="22">
<Files Count="23">
<Item1>
<Filename Value="onlinepackagemanagerintf.pas"/>
<HasRegisterProc Value="True"/>
@ -115,6 +115,10 @@
<Filename Value="opkman_createrepositoryfrm.pas"/>
<UnitName Value="opkman_createrepositoryfrm"/>
</Item22>
<Item23>
<Filename Value="opkman_repositorydetailsfrm.pas"/>
<UnitName Value="opkman_repositorydetailsfrm"/>
</Item23>
</Files>
<i18n>
<EnableI18N Value="True"/>

View File

@ -15,7 +15,7 @@ uses
opkman_createrepositorypackagefrm, opkman_categoriesfrm,
opkman_packagedetailsfrm, opkman_updates, opkman_createjsonforupdatesfrm,
opkman_uploader, opkman_repositories, opkman_createrepositoryfrm,
LazarusPackageIntf;
opkman_repositorydetailsfrm, LazarusPackageIntf;
implementation

View File

@ -406,7 +406,12 @@ resourcestring
rsCreateRepositoryFrm_bDelete_Hint = 'Delete package from the current repository';
rsCreateRepositoryFrm_bCancel_Caption = 'Cancel';
rsCreateRepositoryFrm_bCancel_Hint = 'Close this dialog';
rsCreateRepositoryFrm_VSTPackages_Column0 = 'Repository/Packages';
rsCreateRepositoryFrm_VSTDetails_Column0 = 'Description';
rsCreateRepositoryFrm_VSTDetails_Column1 = 'Data';
rsCreateRepositoryFrm_Error1 = 'Cannot open private repository. Error message: ' + sLineBreak + '"%s"';
rsCreateRepositoryFrm_Error2 = 'File ' + cRemoteJSONFile + ' not found.';
rsCreateRepositoryFrm_Error3 = 'Cannot save private repository. Error message: ' + sLineBreak + '"%s"';
implementation

View File

@ -12,7 +12,9 @@ object CreateRepositoryFrm: TCreateRepositoryFrm
OnCreate = FormCreate
OnDestroy = FormDestroy
PopupMode = pmExplicit
PopupParent = MainFrm.Owner
Position = poOwnerFormCenter
LCLVersion = '1.9.0.0'
object pnButtons: TPanel
Left = 0
Height = 41
@ -23,27 +25,29 @@ object CreateRepositoryFrm: TCreateRepositoryFrm
BorderStyle = bsSingle
ClientHeight = 37
ClientWidth = 796
TabOrder = 0
TabOrder = 2
OnResize = pnButtonsResize
object bOpen: TButton
Left = 6
Left = 96
Height = 27
Top = 4
Width = 80
Caption = 'Open'
OnClick = bOpenClick
ParentShowHint = False
ShowHint = True
TabOrder = 0
TabOrder = 1
end
object bCreate: TButton
Left = 87
Left = 16
Height = 27
Top = 4
Width = 80
Caption = 'Create'
OnClick = bCreateClick
ParentShowHint = False
ShowHint = True
TabOrder = 1
TabOrder = 0
end
object bAdd: TButton
Left = 368
@ -58,7 +62,7 @@ object CreateRepositoryFrm: TCreateRepositoryFrm
TabOrder = 2
end
object bDelete: TButton
Left = 449
Left = 448
Height = 27
Top = 4
Width = 80
@ -70,7 +74,7 @@ object CreateRepositoryFrm: TCreateRepositoryFrm
TabOrder = 3
end
object bCancel: TButton
Left = 705
Left = 702
Height = 27
Top = 4
Width = 80
@ -84,4 +88,167 @@ object CreateRepositoryFrm: TCreateRepositoryFrm
TabOrder = 4
end
end
object pnPackages: TPanel
Left = 0
Height = 559
Top = 0
Width = 285
Align = alLeft
BevelOuter = bvNone
TabOrder = 0
end
object pnDetails: TPanel
Left = 287
Height = 559
Top = 0
Width = 513
Align = alClient
BevelOuter = bvNone
TabOrder = 1
end
object spMain: TSplitter
Left = 285
Height = 559
Top = 0
Width = 2
AutoSnap = False
Color = 14671839
MinSize = 150
ParentColor = False
end
object pnMessage: TPanel
Left = 287
Height = 559
Top = 0
Width = 513
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 = 3
Visible = False
end
object imTree: TImageList
left = 40
top = 24
Bitmap = {
4C69030000001000000010000000A38D780095806C12B3A18B9FC5B49FFEC6B5
A0FFC6B5A0FFC6B5A0FFC6B5A1FFBEAD98E3A5917C4BFFFFFF00988674000000
0000000000000000000000000000FFEAD300AC9A886AD5C9BBF9E3D9CBFFE2D9
CAFFE2D9CAFFE2D9CAFFE3D9CAFFE0D6C8FFC3B4A4CB84715C189B8874000000
0000000000000000000000000000FFFFFF00AE9F8E87E5DBCEFFE7DDCFFFE8DE
D2FFE8DED2FFE8DED2FFE8DED2FFE8DED0FFD1C5B7E67563502492806B000000
0000000000000000000000000000FFFFFF00AC9C8B87DED2C2FFCBB69BFFC9B4
99FFC9B499FFC9B499FFC8B398FFD6C5B0FFCEC1B3E673614E24907D69000000
0000000000000000000000000000FFFFFF00AA9A8887DED3C4FFE0D3C4FFE1D5
C6FFE1D5C6FFE1D5C6FFE1D5C6FFE1D5C5FFCBBEAFE672604E248E7C68000000
0000000000000000000000000000FFFFFF00A8988687DACDBDFFCBB69CFFC9B4
9AFFCAB49AFFCAB49AFFC9B499FFD4C4AEFFC9BCADE6715F4C248D7B67000000
0000000000000000000000000000FFFFFF00A6958387D9CEBEFFDED2C2FFDFD3
C4FFDFD3C4FFDFD3C4FFDFD3C4FFDED2C2FFC7B8A7E574614D238E7A65000000
0000000000000000000000000000FFFFFF00A4938187D5C8B7FFCAB69BFFC9B4
99FFC9B599FFC9B599FFC8B499FFC9BBA6FFC0B6A8F3B2AA9E92BCB6AB7FBAB4
A87CB0AA9F489D968B09A39D9100FFFFFF00A2917E87D4C8B8FFDBD0C0FFDCD2
C2FFDCD1C2FFDDD3C3FFCCC1B2FFCFC6BBFFDDD5CBFFDFD6CCFFDED5CBFFDCD4
CAFFD1C9BEEFADA69B5FF1E8D900FFFFFF00A08F7C87D0C3B0FFCAB79CFFC9B5
9AFFCAB69BFFCEB79CFFBEB09DFFDBD4CCFFE9E2D9FFEAE3DBFFEAE3DBFFE9E2
D9FFDCD5CCFFA8A19686FFFFFF00FFFFFF009E8D7987CEC1AEFFCDBFA9FFCDBF
A9FFC7BDA6FF95B08AFFB5AE9CFFC4BCB3FFDAD1C8FFE8DED7FFE8DED8FFDBD2
CAFFC6BEB5FF9D968B84FFFFFF00FFFFFF009C8B7687CCC1ADFFD7CDBAFFD7CD
BAFFD6CCB9FFC8CAB2FFC5BCACFFC7BFB6FFD1C9C0FFDCD2CAFFDCD3CBFFD2CA
C2FFC8C1B8FC978F8570FFFFFF00FFFFFF009A887487CBBFABFFE0D7C6FFE1D8
C8FFE1D8C8FFE4DBCAFFC3BAACFFCCC5BCFFE1DAD2FFEAE2DAFFEAE2DBFFE2DB
D3FFCFC8BEFF9B918683FFFFFF00FFFFFF008C7B6773AD9E89ECB1A28EECB1A2
8DECB1A28DECB1A28DEBA69A8AF2C3BAB1FED9D0C7FFE7DDD5FFE9DED7FFDAD1
C9FFC4BCB3FF938A7E84FFFFFF00000000003830271A3F352A3C3D33283E3D33
283E3D33283E3B30263D5951485B948C82BAB0A69CE7BAAFA6EABBB0A7EAB0A7
9CE7958C82BB675F563EFFFFFF00000000000000000000000000000000000000
000000000000000000000000000625221D2638322C4336312A4636312A463832
2C4325211D26000000061F181300FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
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 = '.opkman'
Filter = '*.opkman|*.opkman'
Options = [ofOverwritePrompt, ofEnableSizing, ofViewDetail]
left = 41
top = 83
end
object OD: TOpenDialog
DefaultExt = '.opkman'
Filter = '*.opkman|*.opkman'
left = 88
top = 84
end
end

View File

@ -31,12 +31,23 @@ uses
Classes, SysUtils, FileUtil,
// LCL
Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls,
StdCtrls, Buttons,
// LazUtils
LazFileUtils,
// OpkMan
opkman_VirtualTrees;
type
PRepository = ^TRepository;
TRepository = record
FName: String;
FPath: String;
FAddress: String;
FDescription: String;
end;
{ TCreateRepositoryFrm }
TCreateRepositoryFrm = class(TForm)
@ -45,14 +56,46 @@ type
bDelete: TButton;
bOpen: TButton;
bCreate: TButton;
imTree: TImageList;
OD: TOpenDialog;
pnButtons: TPanel;
pnMessage: TPanel;
pnPackages: TPanel;
pnDetails: TPanel;
SD: TSaveDialog;
spMain: TSplitter;
procedure bCreateClick(Sender: TObject);
procedure bOpenClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure pnButtonsResize(Sender: TObject);
private
FVST: TVirtualStringTree;
FRepository: String;
FVSTPackages: TVirtualStringTree;
FVSTDetails: TVirtualStringTree;
FRepository: TRepository;
procedure EnableDisableButtons(const AEnable: Boolean);
procedure ShowHideControls(const AType: Integer);
function LoadRepository(const AFileName: String; out AErrMsg: String): Boolean;
function SaveRepository(const AFileName: String; out AErrMsg: String): Boolean;
procedure VSTPackagesGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
{%H-}Column: TColumnIndex; {%H-}TextType: TVSTTextType; var CellText: String);
procedure VSTPackagesGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
{%H-}Kind: TVTImageKind; {%H-}Column: TColumnIndex; var {%H-}Ghosted: Boolean;
var ImageIndex: Integer);
procedure VSTPackagesHeaderClick(Sender: TVTHeader; {%H-}Column: TColumnIndex;
Button: TMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
procedure VSTPackagesCompareNodes(Sender: TBaseVirtualTree; Node1,
Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
procedure VSTPackagesFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode;
{%H-}Column: TColumnIndex);
procedure VSTPackagesFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure VSTDetailsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
{%H-}Column: TColumnIndex; {%H-}TextType: TVSTTextType; var CellText: String);
procedure VSTDetailsGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
{%H-}Kind: TVTImageKind; {%H-}Column: TColumnIndex; var {%H-}Ghosted: Boolean;
var ImageIndex: Integer);
procedure VSTDetailsFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
public
end;
@ -61,12 +104,44 @@ var
CreateRepositoryFrm: TCreateRepositoryFrm;
implementation
uses opkman_const;
uses opkman_common, opkman_const, opkman_options, opkman_serializablepackages,
opkman_repositorydetailsfrm;
{$R *.lfm}
{ TCreateRepositoryFrm }
type
PMetaData = ^TMetaData;
TMetaData = record
FDataType: Integer;
FName: String;
end;
PDetails = ^TDetails;
TDetails = 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;
procedure TCreateRepositoryFrm.FormCreate(Sender: TObject);
begin
Caption := rsCreateRepositoryFrm_Caption;
@ -81,28 +156,330 @@ begin
bCancel.Caption := rsCreateRepositoryFrm_bCancel_Caption;
bCancel.Hint := rsCreateRepositoryFrm_bCancel_Hint;
EnableDisableButtons(True);
FVST := TVirtualStringTree.Create(nil);
ShowHideControls(0);
//continue
EnableDisableButtons(False);
pnMessage.Caption := 'Not yet implemented!';
pnMessage.Visible := True;
FVSTPackages := TVirtualStringTree.Create(nil);
with FVSTPackages do
begin
NodeDataSize := SizeOf(TMetaData);
Parent := pnPackages;
Align := alClient;
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 := rsCreateRepositoryFrm_VSTPackages_Column0;
end;
Header.Options := [hoAutoResize, hoColumnResize, hoRestrictDrag, hoVisible, hoAutoSpring];
Header.SortColumn := 0;
TabOrder := 0;
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;
OnHeaderClick := @VSTPackagesHeaderClick;
OnCompareNodes := @VSTPackagesCompareNodes;
OnFocusChanged := @VSTPackagesFocusChanged;
OnFreeNode := @VSTPackagesFreeNode;
end;
FVSTDetails := TVirtualStringTree.Create(nil);
with FVSTDetails do
begin
NodeDataSize := SizeOf(TDetails);
Parent := pnDetails;
Align := alClient;
Images := imTree;
if not Options.UseDefaultTheme then
Color := clBtnFace;
DefaultNodeHeight := 25;
Indent := 15;
TabOrder := 0;
DefaultText := '';
Header.AutoSizeIndex := 1;
Header.Height := 25;
Colors.BorderColor := clBlack;
with Header.Columns.Add do begin
Position := 0;
Width := 150;
Text := rsCreateRepositoryFrm_VSTDetails_Column0;
end;
with Header.Columns.Add do begin
Position := 1;
Width := 250;
Text := rsCreateRepositoryFrm_VSTDetails_Column1;
end;
Header.Options := [hoAutoResize, hoColumnResize, hoRestrictDrag, hoVisible, hoAutoSpring];
Header.SortColumn := 0;
TreeOptions.MiscOptions := [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning];
TreeOptions.PaintOptions := [toHideFocusRect, toPopupMode, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages];
TreeOptions.SelectionOptions := [toRightClickSelect, toFullRowSelect];
TreeOptions.AutoOptions := [toAutoTristateTracking];
OnGetText := @VSTDetailsGetText;
OnGetImageIndex := @VSTDetailsGetImageIndex;
OnFreeNode := @VSTDetailsFreeNode;
end;
end;
procedure TCreateRepositoryFrm.bCreateClick(Sender: TObject);
var
ErrMsg: String;
RepositoryDetailsFrm: TRepositoryDetailsFrm;
begin
RepositoryDetailsFrm := TRepositoryDetailsFrm.Create(Self);
try
RepositoryDetailsFrm.ShowModal;
if RepositoryDetailsFrm.ModalResult = mrOk then
begin
FRepository.FName := RepositoryDetailsFrm.edName.Text;
FRepository.FAddress := RepositoryDetailsFrm.edAddress.Text;
FRepository.FDescription := RepositoryDetailsFrm.mDescription.Text;
if SD.Execute then
begin
if not SaveRepository(SD.FileName, ErrMsg) then
MessageDlgEx(ErrMsg, mtError, [mbOk], Self);
end;
end;
finally
RepositoryDetailsFrm.Free;
end;
end;
procedure TCreateRepositoryFrm.bOpenClick(Sender: TObject);
var
ErrMsg: String;
begin
if OD.Execute then
if not LoadRepository(OD.FileName, ErrMsg) then
MessageDlgEx(ErrMsg, mtError, [mbOk], Self);
end;
procedure TCreateRepositoryFrm.FormDestroy(Sender: TObject);
begin
FVST.Free;
FVSTPackages.Free;
FVSTDetails.Free;
end;
procedure TCreateRepositoryFrm.pnButtonsResize(Sender: TObject);
begin
bAdd.Left := (pnButtons.Width - (bAdd.Width + bDelete.Width)) div 2;
bDelete.Left := bAdd.Left + bAdd.Width + 3;
bDelete.Left := bAdd.Left + bAdd.Width + 1;
end;
procedure TCreateRepositoryFrm.EnableDisableButtons(const AEnable: Boolean);
begin
bOpen.Enabled := AEnable;
bCreate.Enabled := AEnable;
bAdd.Enabled := AEnable and FileExists(Trim(FRepository));
bDelete.Enabled := AEnable and FileExists(Trim(FRepository)) and (FVST.RootNodeCount > 0);
bAdd.Enabled := AEnable and FileExists(Trim(FRepository.FPath));
bDelete.Enabled := AEnable and FileExists(Trim(FRepository.FPath)) and (FVSTPackages.RootNodeCount > 0);
bCancel.Enabled := AEnable;
end;
procedure TCreateRepositoryFrm.ShowHideControls(const AType: Integer);
begin
case AType of
0: begin
pnPackages.Visible := False;
pnDetails.Visible := False;
pnMessage.Visible := False;
end;
1: begin
pnPackages.Visible := False;
pnDetails.Visible := False;
pnMessage.Visible := True;
end;
2: begin
pnPackages.Visible := True;
pnDetails.Visible := True;
pnMessage.Visible := False;
end;
end;
end;
function TCreateRepositoryFrm.LoadRepository(const AFileName: String;
out AErrMsg: String): Boolean;
var
FS: TFileStream;
procedure ReadString(out AString: String);
var
Len: Integer;
begin
FS.Read(Len, SizeOf(Integer));
SetLength(AString, Len div SizeOf(Char));
FS.Read(Pointer(AString)^, Len);
end;
begin
Result := False;
FS := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
try
try
ReadString(FRepository.FName);
ReadString(FRepository.FAddress);
ReadString(FRepository.FDescription);
FRepository.FPath := AFileName;
except
on E: Exception do
begin
AErrMsg := Format(rsCreateRepositoryFrm_Error1, [E.Message]);
Exit;
end;
end;
Result := FileExists(AppendPathDelim(ExtractFilePath(AFileName)) + cRemoteJSONFile);
if not Result then
AErrMsg := Format(rsCreateRepositoryFrm_Error1, [rsCreateRepositoryFrm_Error2])
finally
FS.Free;
end;
end;
function TCreateRepositoryFrm.SaveRepository(const AFileName: String;
out AErrMsg: String): Boolean;
var
FS: TFileStream;
procedure WriteString(const AString: String);
var
Len: Integer;
begin
Len := Length(AString)*SizeOf(Char);
FS.Write(Len, SizeOf(Integer));
FS.Write(Pointer(AString)^, Len);
end;
begin
Result := False;
FS := TFileStream.Create(AFileName, fmCreate or fmOpenWrite or fmShareDenyWrite);
try
try
WriteString(FRepository.FName);
WriteString(FRepository.FAddress);
WriteString(FRepository.FDescription);
Result := True;
except
on E: Exception do
begin
AErrMsg := Format(rsCreateRepositoryFrm_Error3, [E.Message]);
Exit;
end;
end;
finally
FS.Free;
end;
end;
procedure TCreateRepositoryFrm.VSTPackagesGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: String);
var
Data: PMetaData;
begin
Data := FVSTPackages.GetNodeData(Node);
case Data^.FDataType of
0: CellText := FRepository.FName;
1: CellText := Data^.FName;
end;
end;
procedure TCreateRepositoryFrm.VSTPackagesGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
var
Data: PMetaData;
begin
Data := FVSTPackages.GetNodeData(Node);
ImageIndex := Data^.FDataType;
end;
procedure TCreateRepositoryFrm.VSTPackagesHeaderClick(Sender: TVTHeader;
Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
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;
end;
SortTree(SortColumn, SortDirection, False);
end;
end;
end;
procedure TCreateRepositoryFrm.VSTPackagesCompareNodes(Sender: TBaseVirtualTree; Node1,
Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
Data1: PMetaData;
Data2: PMetaData;
begin
Data1 := Sender.GetNodeData(Node1);
Data2 := Sender.GetNodeData(Node2);
case Column of
0: begin
if (Data1^.FDataType < Data2^.FDataType) then
Result := 0
else
Result := CompareText(Data1^.FName, Data2^.FName)
end;
end;
end;
procedure TCreateRepositoryFrm.VSTPackagesFocusChanged(
Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex);
begin
//
end;
procedure TCreateRepositoryFrm.VSTPackagesFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
Data: PMetaData;
begin
Data := FVSTPackages.GetNodeData(Node);
Finalize(Data^);
end;
procedure TCreateRepositoryFrm.VSTDetailsGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: String);
begin
end;
procedure TCreateRepositoryFrm.VSTDetailsGetImageIndex(
Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind;
Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer);
begin
end;
procedure TCreateRepositoryFrm.VSTDetailsFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
begin
end;
end.

View File

@ -38,33 +38,9 @@ uses
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;
@ -147,7 +123,7 @@ type
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;
// function LoadPackageData(const APath: String; AData: PData): Boolean;
procedure ShowHideControls(const AType: Integer);
procedure EnableDisableControls(const AEnable: Boolean);
procedure SaveExtraInfo(const ANode: PVirtualNode);
@ -174,6 +150,30 @@ uses opkman_const, opkman_common, opkman_options, opkman_categoriesfrm,
{ TCreateRepositoryPackagesFrm }
type
PData = ^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;
procedure TCreateRepositoryPackagesFrm.FormCreate(Sender: TObject);
begin
Caption := rsCreateRepositoryPackageFrm_Caption;
@ -298,8 +298,7 @@ begin
FVSTPackageData.Free;
end;
function TCreateRepositoryPackagesFrm.LoadPackageData(const APath: String;
AData: PPackageData): Boolean;
function LoadPackageData(const APath: String; AData: PData): Boolean;
function PackageTypeIdentToType(const AStr: String): TPackageType;
begin
@ -431,7 +430,7 @@ var
PackageList: TStringList;
I: Integer;
Node, RootNode: PVirtualNode;
Data, RootData: PPackageData;
Data, RootData: PData;
CanGo: Boolean;
begin
CanGo := False;
@ -532,7 +531,7 @@ function TCreateRepositoryPackagesFrm.CanCreate: Boolean;
var
Node: PVirtualNode;
Data: PPackageData;
Data: PData;
begin
Result := False;
Node := FVSTPackages.GetFirstSelected;
@ -586,7 +585,7 @@ end;
procedure TCreateRepositoryPackagesFrm.bCreateClick(Sender: TObject);
var
RootNode: PVirtualNode;
RootData: PPackageData;
RootData: PData;
begin
if not CanCreate then
Exit;
@ -621,7 +620,7 @@ end;
procedure TCreateRepositoryPackagesFrm.bSubmitClick(Sender: TObject);
var
RootNode: PVirtualNode;
RootData: PPackageData;
RootData: PData;
begin
if not CanCreate then
Exit;
@ -666,7 +665,7 @@ procedure TCreateRepositoryPackagesFrm.VSTPackagesGetText(
Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType; var CellText: String);
var
Data: PPackageData;
Data: PData;
begin
Data := FVSTPackages.GetNodeData(Node);
if Column = 0 then
@ -683,7 +682,7 @@ end;
procedure TCreateRepositoryPackagesFrm.SaveExtraInfo(const ANode: PVirtualNode);
var
Data: PPackageData;
Data: PData;
begin
Data := FVSTPackages.GetNodeData(ANode);
case FVSTPackages.GetNodeLevel(ANode) of
@ -723,9 +722,9 @@ end;
procedure TCreateRepositoryPackagesFrm.VSTPackagesFocusChanged(
Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex);
var
Data: PPackageData;
Data: PData;
PDNode: PVirtualNode;
PDData: PPackageData;
PDData: PData;
Level: Integer;
begin
if Node = nil then
@ -790,7 +789,7 @@ end;
procedure TCreateRepositoryPackagesFrm.VSTPackagesFreeNode(
Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PPackageData;
Data: PData;
begin
Data := FVSTPackages.GetNodeData(Node);
Finalize(Data^);
@ -800,7 +799,7 @@ procedure TCreateRepositoryPackagesFrm.VSTPackageDataGetText(
Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType; var CellText: String);
var
Data: PPackageData;
Data: PData;
begin
Data := FVSTPackageData.GetNodeData(Node);
case Column of
@ -832,7 +831,7 @@ procedure TCreateRepositoryPackagesFrm.VSTPackageDataGetImageIndex(
Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind;
Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer);
var
Data: PPackageData;
Data: PData;
begin
if Column = 0 then
begin
@ -845,8 +844,8 @@ procedure TCreateRepositoryPackagesFrm.VSTCompareNodes(
Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex;
var Result: Integer);
var
Data1: PPackageData;
Data2: PPackageData;
Data1: PData;
Data2: PData;
begin
Data1 := Sender.GetNodeData(Node1);
Data2 := Sender.GetNodeData(Node2);
@ -864,7 +863,7 @@ end;
procedure TCreateRepositoryPackagesFrm.VSTPackageDataFreeNode(
Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: PPackageData;
Data: PData;
begin
Data := FVSTPackageData.GetNodeData(Node);
Finalize(Data^);
@ -924,7 +923,7 @@ function TCreateRepositoryPackagesFrm.CreateJSONForUpdates(var AErrMsg: String
): Boolean;
var
RootNode, Node: PVirtualNode;
RootData, Data: PPackageData;
RootData, Data: PData;
JSON: TJSONStringType;
Ms: TMemoryStream;
UpdatePackage: TUpdatePackage;
@ -985,7 +984,7 @@ var
MetaPkg: TMetaPackage;
LazarusPkg: TLazarusPackage;
RootNode, Node: PVirtualNode;
RootData, Data: PPackageData;
RootData, Data: PData;
JSON: TJSONStringType;
MS: TMemoryStream;
begin

View File

@ -0,0 +1,103 @@
object RepositoryDetailsFrm: TRepositoryDetailsFrm
Left = 389
Height = 315
Top = 243
Width = 387
Anchors = [akTop, akLeft, akBottom]
Caption = 'Repository details'
ClientHeight = 315
ClientWidth = 387
Constraints.MinHeight = 315
Constraints.MinWidth = 300
OnCreate = FormCreate
PopupMode = pmExplicit
Position = poOwnerFormCenter
LCLVersion = '1.9.0.0'
object pnButtons: TPanel
Left = 0
Height = 35
Top = 280
Width = 387
Align = alBottom
BevelOuter = bvNone
ClientHeight = 35
ClientWidth = 387
TabOrder = 3
object bOk: TButton
Left = 217
Height = 25
Top = 4
Width = 75
Anchors = [akTop, akRight]
Caption = 'Ok'
TabOrder = 0
end
object bCancel: TButton
Left = 294
Height = 25
Top = 4
Width = 75
Anchors = [akTop, akRight]
Caption = 'Cancel'
ModalResult = 2
TabOrder = 1
end
end
object lbName: TLabel
Left = 19
Height = 15
Top = 13
Width = 89
Caption = 'Repository name'
ParentColor = False
end
object edName: TEdit
Left = 19
Height = 23
Top = 31
Width = 350
Anchors = [akTop, akLeft, akRight]
TabOrder = 1
end
object lbAddress: TLabel
Left = 19
Height = 15
Top = 69
Width = 99
Caption = 'Repository address'
ParentColor = False
end
object edAddress: TEdit
Left = 18
Height = 23
Top = 87
Width = 351
Anchors = [akTop, akLeft, akRight]
TabOrder = 0
end
object lbDescription: TLabel
Left = 19
Height = 15
Top = 126
Width = 118
Caption = 'Repository description'
ParentColor = False
end
object mDescription: TMemo
Left = 19
Height = 81
Top = 141
Width = 350
Anchors = [akTop, akLeft, akRight, akBottom]
TabOrder = 2
end
object cbAddToRepositories: TCheckBox
Left = 19
Height = 19
Top = 232
Width = 175
Anchors = [akTop]
Caption = 'Add to available repositoy list'
TabOrder = 4
end
end

View File

@ -0,0 +1,48 @@
unit opkman_repositorydetailsfrm;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ButtonPanel,
ExtCtrls, StdCtrls;
type
{ TRepositoryDetailsFrm }
TRepositoryDetailsFrm = class(TForm)
bOk: TButton;
bCancel: TButton;
cbAddToRepositories: TCheckBox;
edName: TEdit;
edAddress: TEdit;
lbName: TLabel;
lbAddress: TLabel;
lbDescription: TLabel;
mDescription: TMemo;
pnButtons: TPanel;
procedure FormCreate(Sender: TObject);
private
public
end;
var
RepositoryDetailsFrm: TRepositoryDetailsFrm;
implementation
{$R *.lfm}
{ TRepositoryDetailsFrm }
procedure TRepositoryDetailsFrm.FormCreate(Sender: TObject);
begin
end;
end.