From 8ae4ddbc2b344d72e581140efddf2997fc9f68fc Mon Sep 17 00:00:00 2001 From: Matthias Heunecke Date: Wed, 3 Mar 2021 21:25:10 +0000 Subject: [PATCH 1/2] Feature/GitLabSupport --- DN.Character.pas | 14 + DN.Package.Gitlab.pas | 61 + DN.PackageProvider.Folder.pas | 156 +++ DN.PackageProvider.GitLab.State.pas | 68 + DN.PackageProvider.GitLab.pas | 631 ++++++++++ DN.PackageProvider.MultiSource.pas | 105 ++ DN.PackageSource.ConfigPage.Folder.dfm | 25 + DN.PackageSource.ConfigPage.Folder.pas | 52 + DN.PackageSource.ConfigPage.Github.dfm | 50 + DN.PackageSource.ConfigPage.Github.pas | 86 ++ DN.PackageSource.ConfigPage.Gitlab.dfm | 87 ++ DN.PackageSource.ConfigPage.Gitlab.pas | 191 +++ DN.PackageSource.ConfigPage.Intf.pas | 21 + DN.PackageSource.ConfigPage.pas | 58 + DN.PackageSource.Folder.pas | 50 + DN.PackageSource.Github.pas | 60 + DN.PackageSource.Gitlab.pas | 61 + DN.PackageSource.Intf.pas | 22 + DN.PackageSource.Registry.Intf.pas | 20 + DN.PackageSource.Registry.pas | 67 + DN.PackageSource.Settings.Field.Intf.pas | 24 + DN.PackageSource.Settings.Field.pas | 57 + DN.PackageSource.Settings.Folder.pas | 29 + DN.PackageSource.Settings.Github.pas | 29 + DN.PackageSource.Settings.Gitlab.pas | 38 + DN.PackageSource.Settings.Intf.pas | 24 + DN.PackageSource.Settings.pas | 93 ++ DN.PackageSource.pas | 22 + DN.Settings.Intf.pas | 6 + DN.Settings.pas | 155 ++- Icons/Add.ico | Bin 0 -> 4286 bytes Packages/DelphiX-Berlin/Delphinus.Theming.pas | 42 + Packages/DelphiX-Berlin/Delphinus.dpk | 194 +++ Packages/DelphiX-Berlin/Delphinus.dproj | 704 +++++++++++ Packages/DelphiX-Berlin/Delphinus.res | Bin 0 -> 32 bytes Packages/DelphiX-Berlin/DelphinusImages.res | Bin 0 -> 112664 bytes Packages/DelphiX-Rio/Delphinus.Theming.pas | 42 + Packages/DelphiX-Rio/Delphinus.dpk | 193 +++ Packages/DelphiX-Rio/Delphinus.dproj | 1120 +++++++++++++++++ Packages/DelphiX-Rio/Delphinus.res | Bin 0 -> 32 bytes Packages/DelphiX-Rio/DelphinusImages.res | Bin 0 -> 112664 bytes Packages/DelphiX-Sydney/Delphinus.Theming.pas | 42 + Packages/DelphiX-Sydney/Delphinus.dpk | 194 +++ Packages/DelphiX-Sydney/Delphinus.dproj | 899 +++++++++++++ Packages/DelphiX-Sydney/Delphinus.res | Bin 0 -> 32 bytes Packages/DelphiX-Sydney/DelphinusImages.res | Bin 0 -> 112664 bytes Packages/DelphiX-Tokyo/Delphinus.Theming.pas | 42 + Packages/DelphiX-Tokyo/Delphinus.dpk | 194 +++ Packages/DelphiX-Tokyo/Delphinus.dproj | 704 +++++++++++ Packages/DelphiX-Tokyo/Delphinus.res | Bin 0 -> 32 bytes Packages/DelphiX-Tokyo/DelphinusImages.res | Bin 0 -> 112664 bytes Packages/DelphiXE/Delphinus.dpk | 192 +-- Packages/DelphiXE/Delphinus.dproj | 211 ++-- Packages/DelphiXE6/Delphinus.dpk | 22 +- Packages/DelphiXE6/Delphinus.dproj | 409 +++++- Packages/DelphiXE6/Delphinus.res | Bin 0 -> 32 bytes Packages/DelphiXE6/DelphinusImages.res | Bin 0 -> 108304 bytes Packages/Delphinus.CategoryFilterView.dfm | 1 - Packages/Delphinus.CategoryFilterView.pas | 87 +- Packages/Delphinus.Dialog.dfm | 1 + Packages/Delphinus.Dialog.pas | 98 +- Packages/Delphinus.LicenseDialog.pas | 3 +- .../Delphinus.OptionsDialog.TypeSelection.dfm | 73 ++ .../Delphinus.OptionsDialog.TypeSelection.pas | 95 ++ Packages/Delphinus.OptionsDialog.dfm | 114 +- Packages/Delphinus.OptionsDialog.pas | 168 ++- Packages/Delphinus.Resources.Names.pas | 1 + Packages/DelphinusImages.rc | 1 + Tools/Commandline/DN.DPM.pas | 30 +- Tools/WebSetup/Delphinus.WebSetup.Dialog.dfm | 14 +- Tools/WebSetup/Delphinus.WebSetup.Dialog.pas | 32 +- 71 files changed, 7993 insertions(+), 291 deletions(-) create mode 100644 DN.Character.pas create mode 100644 DN.Package.Gitlab.pas create mode 100644 DN.PackageProvider.Folder.pas create mode 100644 DN.PackageProvider.GitLab.State.pas create mode 100644 DN.PackageProvider.GitLab.pas create mode 100644 DN.PackageProvider.MultiSource.pas create mode 100644 DN.PackageSource.ConfigPage.Folder.dfm create mode 100644 DN.PackageSource.ConfigPage.Folder.pas create mode 100644 DN.PackageSource.ConfigPage.Github.dfm create mode 100644 DN.PackageSource.ConfigPage.Github.pas create mode 100644 DN.PackageSource.ConfigPage.Gitlab.dfm create mode 100644 DN.PackageSource.ConfigPage.Gitlab.pas create mode 100644 DN.PackageSource.ConfigPage.Intf.pas create mode 100644 DN.PackageSource.ConfigPage.pas create mode 100644 DN.PackageSource.Folder.pas create mode 100644 DN.PackageSource.Github.pas create mode 100644 DN.PackageSource.Gitlab.pas create mode 100644 DN.PackageSource.Intf.pas create mode 100644 DN.PackageSource.Registry.Intf.pas create mode 100644 DN.PackageSource.Registry.pas create mode 100644 DN.PackageSource.Settings.Field.Intf.pas create mode 100644 DN.PackageSource.Settings.Field.pas create mode 100644 DN.PackageSource.Settings.Folder.pas create mode 100644 DN.PackageSource.Settings.Github.pas create mode 100644 DN.PackageSource.Settings.Gitlab.pas create mode 100644 DN.PackageSource.Settings.Intf.pas create mode 100644 DN.PackageSource.Settings.pas create mode 100644 DN.PackageSource.pas create mode 100644 Icons/Add.ico create mode 100644 Packages/DelphiX-Berlin/Delphinus.Theming.pas create mode 100644 Packages/DelphiX-Berlin/Delphinus.dpk create mode 100644 Packages/DelphiX-Berlin/Delphinus.dproj create mode 100644 Packages/DelphiX-Berlin/Delphinus.res create mode 100644 Packages/DelphiX-Berlin/DelphinusImages.res create mode 100644 Packages/DelphiX-Rio/Delphinus.Theming.pas create mode 100644 Packages/DelphiX-Rio/Delphinus.dpk create mode 100644 Packages/DelphiX-Rio/Delphinus.dproj create mode 100644 Packages/DelphiX-Rio/Delphinus.res create mode 100644 Packages/DelphiX-Rio/DelphinusImages.res create mode 100644 Packages/DelphiX-Sydney/Delphinus.Theming.pas create mode 100644 Packages/DelphiX-Sydney/Delphinus.dpk create mode 100644 Packages/DelphiX-Sydney/Delphinus.dproj create mode 100644 Packages/DelphiX-Sydney/Delphinus.res create mode 100644 Packages/DelphiX-Sydney/DelphinusImages.res create mode 100644 Packages/DelphiX-Tokyo/Delphinus.Theming.pas create mode 100644 Packages/DelphiX-Tokyo/Delphinus.dpk create mode 100644 Packages/DelphiX-Tokyo/Delphinus.dproj create mode 100644 Packages/DelphiX-Tokyo/Delphinus.res create mode 100644 Packages/DelphiX-Tokyo/DelphinusImages.res create mode 100644 Packages/DelphiXE6/Delphinus.res create mode 100644 Packages/DelphiXE6/DelphinusImages.res create mode 100644 Packages/Delphinus.OptionsDialog.TypeSelection.dfm create mode 100644 Packages/Delphinus.OptionsDialog.TypeSelection.pas diff --git a/DN.Character.pas b/DN.Character.pas new file mode 100644 index 0000000..8440ec3 --- /dev/null +++ b/DN.Character.pas @@ -0,0 +1,14 @@ +unit DN.Character; + +interface + +uses + Character; + +{$Warnings off} +type + TCharacter = Character.TCharacter; + +implementation + +end. diff --git a/DN.Package.Gitlab.pas b/DN.Package.Gitlab.pas new file mode 100644 index 0000000..9fce31a --- /dev/null +++ b/DN.Package.Gitlab.pas @@ -0,0 +1,61 @@ +{ +######################################################### +# Author: Matthias Heunecke, Navimatix # +# This unit is part of the Delphinus project hosted on # +# https://github.com/Memnarch/Delphinus # +######################################################### +} +unit DN.Package.Gitlab; + +interface + +uses + Classes, + Types, + DN.Types, + DN.Package; + +type + TDNGitLabPackage = class; + + TGetLicenseCallback = function(const APackage: TDNGitLabPackage; const ALicense: TDNLicense): string of object; + + TDNGitLabPackage = class(TDNPackage) + private + FRepoID: string; + FRepoReleases: string; + FDefaultBranch: string; + FRepositoryName: string; + FOnGetLicense: TGetLicenseCallback; + FRepositoryType: string; + FRepository: string; + FRepositoryUser: string; + protected + function GetLicenseText(const AValue: TDNLicense): string; override; + public + property RepoID: string read FRepoID write FRepoID; + property RepoReleases: string read FRepoReleases write FRepoReleases; + property DefaultBranch: string read FDefaultBranch write FDefaultBranch; + property RepositoryName: string read FRepositoryName write FRepositoryName; + property RepositoryType: string read FRepositoryType write FRepositoryType; + property RepositoryUser: string read FRepositoryUser write FRepositoryUser; + property Repository: string read FRepository write FRepository; + property OnGetLicense: TGetLicenseCallback read FOnGetLicense write FOnGetLicense; + end; + +implementation + +{ TDNGitLabPackage } + +function TDNGitLabPackage.GetLicenseText(const AValue: TDNLicense): string; +begin + Result := inherited; + if (Result = '') and not FLicenseTexts.ContainsKey(AValue.LicenseFile) and Assigned(FOnGetLicense) then + begin + Result := FOnGetLicense(Self, AValue); + LicenseText[AValue] := Result; + end; +end; + +end. + diff --git a/DN.PackageProvider.Folder.pas b/DN.PackageProvider.Folder.pas new file mode 100644 index 0000000..aeaeb80 --- /dev/null +++ b/DN.PackageProvider.Folder.pas @@ -0,0 +1,156 @@ +unit DN.PackageProvider.Folder; + +interface + +uses + DN.Package.Intf, + DN.PackageProvider; + +type + TDNFolderPackageProvider = class(TDNPackageProvider) + private + FPath: string; + procedure ProcessPackagesOfAuthor(const APath, AAuthor: string); + procedure ProcessPackage(const APath, AAuthor, APackage: string); + public + constructor Create(const APath: string); + function Reload: Boolean; override; + function Download(const APackage: IDNPackage; const AVersion: string; const AFolder: string; out AContentFolder: string): Boolean; override; + end; + +implementation + +uses + IOUtils, + SysUtils, + Classes, + DN.Types, + DN.Version, + DN.Package, + DN.Package.Version, + DN.Package.Dependency, + DN.JsonFile.Info; + +const + CNoVersionDir = 'HEAD'; + +{ TDNFolderPackageProvider } + +constructor TDNFolderPackageProvider.Create(const APath: string); +begin + inherited Create(); + FPath := APath; +end; + +function TDNFolderPackageProvider.Download(const APackage: IDNPackage; + const AVersion, AFolder: string; out AContentFolder: string): Boolean; +var + LPath: string; +begin + LPath := TPath.Combine(TPath.Combine(FPath, APackage.Author), APackage.Name); + if AVersion <> '' then + LPath := TPath.Combine(LPath, AVersion) + else + LPath := TPath.Combine(LPath, CNoVersionDir); + + Result := TDirectory.Exists(LPath); + if Result then + begin + TDirectory.Copy(LPath, AFolder); + AContentFolder := AFolder; + end; +end; + +procedure TDNFolderPackageProvider.ProcessPackage(const APath, AAuthor, + APackage: string); +var + LVersionPath, LVersionText, LInfoPath: string; + LPackage: TDNPackage; + LPackageVersion: TDNPackageVersion; + LVersion, LHighestVersion: TDNVersion; + LInfo: TInfoFile; + LDependency: TInfoDependency; + LPictureFile: string; + LLicense, LLicenseCopy: TDNLicense; +begin + LHighestVersion := TDNVersion.Create(); + LPackage := TDNPackage.Create(); + try + LPackage.Author := AAuthor; + LPackage.Name := APackage; + for LVersionPath in TDirectory.GetDirectories(APath) do + begin + LVersionText := ExtractFileName(LVersionPath); + LInfoPath := TPath.Combine(LVersionPath, CInfoFile); + if TDNVersion.TryParse(LVersionText, LVersion) and TFile.Exists(LInfoPath) then + begin + LInfo := TInfoFile.Create(); + try + LInfo.LoadFromFile(LInfoPath); + LPackageVersion := TDNPackageVersion.Create(); + try + LPackageVersion.Name := LVersion.ToString; + LPackageVersion.Value := LVersion; + LPackageVersion.CompilerMin := LInfo.CompilerMin; + LPackageVersion.CompilerMax := LInfo.CompilerMax; + for LDependency in LInfo.Dependencies do + LPackageVersion.Dependencies.Add(TDNPackageDependency.Create(LDependency.ID, LDependency.Version)); + if LHighestVersion.IsEmpty or (LVersion > LHighestVersion) then + begin + LHighestVersion := LVersion; + LPackage.ID := LInfo.ID; + LPackage.CompilerMin := LInfo.CompilerMin; + LPackage.CompilerMax := LInfo.CompilerMax; + LPackage.Platforms := LInfo.Platforms; + for LLicense in LInfo.Licenses do + begin + LLicenseCopy := LLicense; + LLicenseCopy.LicenseFile := TPath.Combine(LVersionPath, LLicense.LicenseFile); + LPackage.Licenses.Add(LLicenseCopy); + if TFile.Exists(LLicenseCopy.LicenseFile) then + LPackage.LicenseText[LLicenseCopy] := TFile.ReadAllText(LLicenseCopy.LicenseFile); + end; + LPictureFile := TPath.Combine(LVersionPath, LInfo.Picture); + end; + finally + LPackage.Versions.Add(LPackageVersion); + end; + finally + LInfo.Free; + end; + end; + end; + if TFile.Exists(LPictureFile) then + LPackage.Picture.LoadFromFile(LPictureFile); + finally + if LPackage.ID <> TGuid.Empty then + Packages.Add(LPackage) + else + LPackage.Free; + end; +end; + +procedure TDNFolderPackageProvider.ProcessPackagesOfAuthor(const APath, + AAuthor: string); +var + LDir: string; +begin + for LDir in TDirectory.GetDirectories(APath) do + ProcessPackage(LDir, AAuthor, ExtractFileName(LDir)); +end; + +function TDNFolderPackageProvider.Reload: Boolean; +var + LDir: string; +begin + Result := False; + Packages.Clear; + if TDirectory.Exists(FPath) then + begin + for LDir in TDirectory.GetDirectories(FPath) do + ProcessPackagesOfAuthor(LDir, ExtractFileName(LDir)); + Result := True; + end; +end; + +end. diff --git a/DN.PackageProvider.GitLab.State.pas b/DN.PackageProvider.GitLab.State.pas new file mode 100644 index 0000000..8297da6 --- /dev/null +++ b/DN.PackageProvider.GitLab.State.pas @@ -0,0 +1,68 @@ +{ +######################################################### +# Author: Matthias Heunecke, Navimatix # +# This unit is part of the Delphinus project hosted on # +# https://github.com/Memnarch/Delphinus # +######################################################### +} +unit DN.PackageProvider.GitLab.State; + +interface + +uses + DN.PackageProvider.State, + DN.PackageProvider.State.Intf, + DN.HttpClient.Intf; + +type + TDNGitlabPackageProviderState = class(TDNPackageProviderState) + private + FClient: IDNHttpClient; + protected + function GetStatisticCount: Integer; override; + function GetStatisticName(const AIndex: Integer): string; override; + function GetStatisticValue(const AIndex: Integer): string; override; + public + constructor Create(const AClient: IDNHttpClient); + end; + +implementation + +{ TDNGitlabPackageProviderState } + +constructor TDNGitlabPackageProviderState.Create(const AClient: IDNHttpClient); +begin + inherited Create; + FClient := AClient; +end; + +function TDNGitlabPackageProviderState.GetStatisticCount: Integer; +begin + Result := 3; +end; + +function TDNGitlabPackageProviderState.GetStatisticName( + const AIndex: Integer): string; +begin + case AIndex of + 0: Result := 'Ratelimit'; + 1: Result := 'RateLimit-Remaining'; + 2: Result := 'RateLimit-Reset'; + else + Result := ''; + end; +end; + +function TDNGitlabPackageProviderState.GetStatisticValue( + const AIndex: Integer): string; +begin + case AIndex of + 0: Result := FClient.ResponseHeader['X-RateLimit-Limit']; + 1: Result := FClient.ResponseHeader['X-RateLimit-Remaining']; + 2: Result := FClient.ResponseHeader['X-RateLimit-Reset']; + else + Result := ''; + end; +end; + +end. diff --git a/DN.PackageProvider.GitLab.pas b/DN.PackageProvider.GitLab.pas new file mode 100644 index 0000000..a46b784 --- /dev/null +++ b/DN.PackageProvider.GitLab.pas @@ -0,0 +1,631 @@ +{ +######################################################### +# Author: Matthias Heunecke, Navimatix # +# This unit is part of the Delphinus project hosted on # +# https://github.com/Memnarch/Delphinus # +######################################################### +} +unit DN.PackageProvider.GitLab; + +interface + +uses + Classes, + Types, + Graphics, + SysUtils, + SyncObjs, + Generics.Collections, + DN.Types, + DN.Package.Gitlab, + DN.Package.Intf, + DN.PackageProvider, + DN.JSonFile.CacheInfo, + DN.Progress.Intf, + DN.HttpClient.Intf, + DN.JSon, + DN.JSOnFile.Info, + DN.PackageProvider.State.Intf, + DN.Package.Version.Intf; + +type + TDNGitLabPackageProvider = class(TDNPackageProvider, IDNProgress, IDNPackageProviderState) + private + FBaseURL: String; + FProgress: IDNProgress; + FPushDates: TDictionary; + FExistingIDs: TDictionary; + FDateMutex: TMutex; + FState: IDNPackageProviderState; + FLoadPictures: Boolean; + + function GetFileStream(const aURL: string; AFile: TStream): Boolean; + function GetGitlabFileText(const aRepoID, aFilePath, aRef : string; out AText: string): Boolean; + function GetLicense(const APackage: TDNGitLabPackage; const ALicense: TDNLicense): string; + function GetInfoFile(const aRepoID, aRef: string; AInfo: TInfoFile): Boolean; + function GetReleaseText(const ARepositoryID: string; out AReleases: string): Boolean; + procedure RegisterReleases(const APackage: IDNPackage; const aRepoID, aReleases : string); + function getRelease(aReleases, aRelease: string) : TJSonObject; + function getReleaseAssetDownload(aRelease : TJSonObject) : string; + procedure LoadPicture(APicture: TPicture; aURL : String); + procedure AddDependencies(const AVersion: IDNPackageVersion; AInf: TInfoFile); + procedure AddPackageFromJSon(AJSon: TJSONObject); + function CreatePackageWithMetaInfo(AItem: TJSONObject; out APackage: IDNPackage): Boolean; + procedure HandleDownloadProgress(AProgress, AMax: Int64); + procedure CheckRateLimit; + procedure setBaseURL(aValue : String); + protected + FClient: IDNHttpClient; + function GetPushDateFile: string; + function GetRepoList(out ARepos: TJSONArray): Boolean; virtual; + procedure SavePushDates; + procedure LoadPushDates; + //properties for interfaceredirection + property Progress: IDNProgress read FProgress implements IDNProgress; + property State: IDNPackageProviderState read FState implements IDNPackageProviderState; + public + constructor Create(const AClient: IDNHttpClient; ALoadPictures: Boolean = True); + destructor Destroy(); override; + function Reload(): Boolean; override; + function Download(const APackage: IDNPackage; const AVersion: string; const AFolder: string; out AContentFolder: string): Boolean; override; + + property BaseURL : String read FBaseURL write setBaseURL; + end; + +const + + CGitlabOAuthAuthentication = 'Bearer %s'; + +implementation + +uses + IOUtils, + DateUtils, + DN.IOUtils, + StrUtils, + jpeg, + pngimage, + DN.Version, + DN.Package, + DN.Zip, + DN.Package.Version, + DN.Package.Dependency, + DN.Package.Dependency.Intf, + DN.Progress, + DN.Environment, + DN.Graphics.Loader, + DN.PackageProvider.GitLab.State; + +const + + CGitlab = 'Gitlab'; + CGitRepoSearch = '%0:sapi/v4/projects?scope=projects&search=delphinus-support'; + CGitRepoSearchTK = '%0:sapi/v4/projects?scope=projects&search=delphinus-support&private_token=%1:s'; + CGitRepoGetFile = '%0:sapi/v4/projects/%1:s/repository/files/%2:s/raw?ref=%3:s'; + CGitRepoDownload = '%0:sapi/v4/projects/%1:s/repository/archive.zip'; + CGitRepoReleases = '%0:sapi/v4/projects/%1:s/releases'; + CMediaTypeRaw = ''; + CPushDates = 'PushDates.ini'; + +type + EGitlabProviderException = EAbort; + ERateLimitException = EGitlabProviderException; + EInvalidProviderSetup = EGitlabProviderException; + +{ TDCPMPackageProvider } + +procedure TDNGitLabPackageProvider.AddDependencies( + const AVersion: IDNPackageVersion; AInf: TInfoFile); +var + LInfDependency: TInfoDependency; + LDependency: IDNPackageDependency; +begin + for LInfDependency in AInf.Dependencies do + begin + LDependency := TDNPackageDependency.Create(LInfDependency.ID, LInfDependency.Version); + AVersion.Dependencies.Add(LDependency); + end; +end; + +procedure TDNGitLabPackageProvider.AddPackageFromJSon(AJSon: TJSONObject); +var + LPackage: IDNPackage; +begin + if CreatePackageWithMetaInfo(AJSon, LPackage) then + begin + Packages.Add(LPackage); + end; +end; + +procedure TDNGitLabPackageProvider.CheckRateLimit; +var + LUnixTime: Int64; + LResetTime: TDateTime; +begin + if FClient.ResponseHeader['X-RateLimit-Remaining'] = '0' then + begin + LUnixTime := StrToInt64Def(FClient.ResponseHeader['X-RateLimit-Reset'], 0); + LResetTime := TTimeZone.Local.ToLocalTime(UnixToDateTime(LUnixTime)); + raise ERateLimitException.Create('Ratelimit exceeded. Wait for reset. Reset is at ' + DateTimeToStr(LResetTime)); + end; +end; + +procedure TDNGitLabPackageProvider.setBaseURL(aValue : String); +begin + if aValue <> FBaseURL then + begin + FBaseURL := aValue; + if length(FBaseURL) > 0 then + begin + if FBaseURL.Chars[length(FBaseURL)-1] <> '/' then + begin + FBaseURL := FBaseURL + '/'; + end; + end; + end; +end; + +constructor TDNGitLabPackageProvider.Create; +var + LKey: string; +begin + inherited Create(); + FClient := AClient; + FProgress := TDNProgress.Create(); + FPushDates := TDictionary.Create(); + FExistingIDs := TDictionary.Create(); + LKey := StringReplace(GetPushDateFile(), '\', '/', [rfReplaceAll]); + FDateMutex := TMutex.Create(nil, False, LKey); + FState := TDNGitlabPackageProviderState.Create(FClient); + FLoadPictures := ALoadPictures; +end; + +function TDNGitLabPackageProvider.CreatePackageWithMetaInfo(AItem: TJSONObject; + out APackage: IDNPackage): Boolean; +var + LPackage: TDNGitLabPackage; + LName, LAuthor, LDefaultBranch, LReleases, LWebURL: string; + LFullName, LRepoID, LPushDate, LOldPushDate, LAvatatURL: string; + LHeadInfo: TInfoFile; + LHomePage: TJSONValue; + LHeadVersion: TDNPackageVersion; +begin + Result := False; + + LRepoID := AItem.GetValue('id').Value; + LName := AItem.GetValue('name').Value; + LFullName := AItem.GetValue('path_with_namespace').Value; + LPushDate := AItem.GetValue('last_activity_at').Value; + LAuthor := TJSonObject(AItem.GetValue('namespace')).GetValue('name').Value; + LDefaultBranch := AItem.GetValue('default_branch').Value; + LWebURL := AItem.GetValue('web_url').Value; + LAvatatURL := AItem.GetValue('avatar_url').Value; + + GetReleaseText(LRepoID, LReleases); + + //if nothing was pushed or released since last refresh, we can go fullcache and not contact the server + FClient.IgnoreCacheExpiration := (LPushDate = LOldPushDate) and (FClient.LastResponseSource = rsCache); + LHeadInfo := TInfoFile.Create(); + try + if GetInfoFile(LRepoID, LDefaultBranch, LHeadInfo) and not FExistingIDs.ContainsKey(LHeadInfo.ID) then + begin + FExistingIDs.Add(LHeadInfo.ID, 0); + LPackage := TDNGitLabPackage.Create(); + LPackage.RepoID := LRepoID; + LPackage.RepoReleases := LReleases; + LPackage.OnGetLicense := GetLicense; + if not AItem.GetValue('description').Null then + LPackage.Description := AItem.GetValue('description').Value; + LPackage.DownloadLoaction := Format(CGitRepoDownload, [FBaseURL, LRepoID]); + LPackage.Author := LAuthor; + LPackage.RepositoryName := LName; + LPackage.DefaultBranch := LDefaultBranch; + + LPackage.ProjectUrl := LWebURL; + LHomePage := AItem.GetValue('web_url'); + if LHomePage is TJSONString then + LPackage.HomepageUrl := LHomePage.Value; + + if LHeadInfo.RepositoryRedirectIssues then + LPackage.ReportUrl := LWebURL; + if LHeadInfo.ReportUrl <> '' then + LPackage.ReportUrl := LHeadInfo.ReportUrl; + + if LHeadInfo.Name <> '' then + LPackage.Name := LHeadInfo.Name + else + LPackage.Name := LName; + LPackage.ID := LHeadInfo.ID; + LPackage.CompilerMin := LHeadInfo.PackageCompilerMin; + LPackage.CompilerMax := LHeadInfo.PackageCompilerMax; + LPackage.Licenses.AddRange(LHeadInfo.Licenses); + LPackage.Platforms := LHeadInfo.Platforms; + LPackage.RepositoryType := LHeadInfo.RepositoryType; + LPackage.RepositoryUser := LHeadInfo.RepositoryUser; + LPackage.Repository := LHeadInfo.Repository; + APackage := LPackage; + if FLoadPictures then + begin + try + LoadPicture(APackage.Picture, LAvatatURL); + except + end; + end; + RegisterReleases(APackage, LRepoID, LReleases); + LHeadVersion := TDNPackageVersion.Create(); + LHeadVersion.Name := 'HEAD'; + LHeadVersion.Value := TDNVersion.Create(); + LHeadVersion.CompilerMin := LHeadInfo.CompilerMin; + LHeadVersion.CompilerMax := LHeadInfo.CompilerMax; + AddDependencies(LHeadVersion, LHeadInfo); + APackage.Versions.Add(LHeadVersion); + FPushDates.AddOrSetValue(LFullName, LPushDate); + Result := True; + end; + finally + LHeadInfo.Free; + FClient.IgnoreCacheExpiration := False; + end; +end; + +destructor TDNGitLabPackageProvider.Destroy; +begin + FDateMutex.Free(); + FPushDates.Free(); + FExistingIDs.Free(); + FClient := nil; + FProgress := nil; + inherited; +end; + +function ExtractAndDeleteArchive(const AArchive: string; ARootDir: string): string; +var + LFolder: string; + LDirs: TStringDynArray; +begin + Result := ''; + LFolder := TPath.Combine(ARootDir, TGuid.NewGuid.ToString); + if ForceDirectories(LFolder) and ShellUnzip(AArchive, LFolder) then + begin + LDirs := TDirectory.GetDirectories(LFolder); + if Length(LDirs) = 1 then + Result := LDirs[0]; + end; + TFile.Delete(AArchive); +end; + +function TDNGitLabPackageProvider.GetFileStream(const aURL: string; AFile: TStream): Boolean; +begin + FClient.Accept := CMediaTypeRaw; + try + Result := FClient.Get(aURL, AFile) = HTTPErrorOk; + if not Result then + CheckRateLimit(); + finally + FClient.Accept := ''; + end; +end; + +function TDNGitLabPackageProvider.GetGitlabFileText(const aRepoID, aFilePath, aRef : string; out AText: string): Boolean; +var url : string; +begin + FClient.Accept := CMediaTypeRaw; + try + url := Format(CGitRepoGetFile, [FBaseURL, aRepoID, aFilePath, aRef]); + Result := FClient.GetText(url, AText) = HTTPErrorOk; + if not Result then + CheckRateLimit(); + finally + FClient.Accept := ''; + end; +end; + +function TDNGitLabPackageProvider.GetLicense(const APackage: TDNGitLabPackage; const ALicense: TDNLicense): string; +var crepoid, cref : string; +begin + Result := 'No Licensefile has been provided.' + sLineBreak + 'Contact the Packageauthor to fix this issue by using the report-button.'; + if (ALicense.LicenseFile <> '') then + begin + crepoid := (APackage as TDNGitLabPackage).RepoID; + cref := (APackage as TDNGitLabPackage).DefaultBranch; + if GetGitlabFileText(crepoid, ALicense.LicenseFile, cref, result) then + begin + //if we do not detect a single Windows-Linebreak, we assume Posix-LineBreaks and convert + if not ContainsStr(Result, sLineBreak) then + Result := StringReplace(Result, #10, sLineBreak, [rfReplaceAll]); + end + else + begin + Result := 'An error occured while downloading the license information.' + sLineBreak + 'The file might be missing.'; + end; + end; +end; + +function TDNGitLabPackageProvider.GetInfoFile(const aRepoID, aRef: string; AInfo: TInfoFile): Boolean; +var + LResponse: string; +begin + FClient.Accept := CMediaTypeRaw; + try + Result := GetGitlabFileText(aRepoID, CInfoFile, aRef, LResponse) + and AInfo.LoadFromString(LResponse); + if not Result then + CheckRateLimit(); + finally + FClient.Accept := ''; + end; +end; + +function TDNGitLabPackageProvider.GetReleaseText(const ARepositoryID: string; out AReleases: string): Boolean; +begin + Result := FClient.GetText(Format(CGitRepoReleases, [FBaseURL, ARepositoryID]), AReleases) = HTTPErrorOk; + if not Result then + CheckRateLimit(); +end; + +function TDNGitLabPackageProvider.Download(const APackage: IDNPackage; + const AVersion: string; const AFolder: string; out AContentFolder: string): Boolean; +var + LArchiveFile, LProviderFolder, LProviderUrl: string; + LGitlabPackage: TDNGitLabPackage; + LRelease : TJSONObject; +const + CNamePrefix = 'filename='; +begin + FProgress.SetTasks(['Downloading']); + LArchiveFile := TPath.Combine(AFolder, 'Package.zip'); + FClient.OnProgress := HandleDownloadProgress; + if AVersion = 'HEAD' then + begin + LProviderUrl := APackage.DownloadLoaction; + end else + begin + LRelease := getRelease((APackage as TDNGitLabPackage).RepoReleases, AVersion); + if LRelease <> nil then + begin + try + LProviderUrl := getReleaseAssetDownload(LRelease); + finally + FreeAndNil(LRelease); + end; + end; + end; + Result := FClient.Download(APackage.DownloadLoaction, LArchiveFile) = HTTPErrorOk; + if Result then + begin + AContentFolder := ExtractAndDeleteArchive(LArchiveFile, AFolder); + if APackage is TDNGitLabPackage then + begin + LGitlabPackage := APackage as TDNGitLabPackage; + if LGitlabPackage.RepositoryType <> '' then + begin + Result := FClient.Download(LProviderUrl, LArchiveFile) = HTTPErrorOk; + if Result then + begin + LProviderFolder := ExtractAndDeleteArchive(LArchiveFile, AFolder); + TDirectory.Copy(AContentFolder, LProviderFolder); + AContentFolder := LProviderFolder; + end; + end; + end; + end; + FClient.OnProgress := nil; +end; + +procedure TDNGitLabPackageProvider.LoadPicture(APicture: TPicture; aURL : String); +var + LPicStream: TMemoryStream; +begin + LPicStream := TMemoryStream.Create(); + try + if GetFileStream(aURL, LPicStream) then + begin + LPicStream.Position := 0; + TGraphicLoader.TryLoadPictureFromStream(LPicStream, '.png', APicture); + end; + finally + LPicStream.Free; + end; +end; + +procedure TDNGitLabPackageProvider.RegisterReleases(const APackage: IDNPackage; const aRepoID, aReleases : string); +var + LArray: TJSONArray; + LObject: TJSonObject; + i: Integer; + LVersionName: string; + LInfo: TInfoFile; + LVersion: IDNPackageVersion; +begin + LInfo := TInfoFile.Create(); + try + LArray := TJSOnObject.ParseJSONValue(AReleases) as TJSONArray; + try + for i := 0 to LArray.Count - 1 do + begin + LObject := LArray.Items[i] as TJSonObject; + LVersionName := LObject.GetValue('tag_name').Value; + if GetInfoFile(aRepoID, LVersionName, LInfo) then + begin + LVersion := TDNPackageVersion.Create(); + LVersion.Name := LVersionName; + LVersion.CompilerMin := LInfo.CompilerMin; + LVersion.CompilerMax := LInfo.CompilerMax; + AddDependencies(LVersion, LInfo); + APackage.Versions.Add(LVersion); + end; + end; + finally + LArray.Free; + end; + finally + LInfo.Free; + end; +end; + +function TDNGitLabPackageProvider.getRelease(aReleases, aRelease: string) : TJSonObject; +var + LArray: TJSONArray; + LObject: TJSonObject; + i: Integer; + LVersionName: string; +begin + result := nil; + LArray := TJSOnObject.ParseJSONValue(AReleases) as TJSONArray; + try + for i := 0 to LArray.Count - 1 do + begin + LObject := LArray.Items[i] as TJSonObject; + LVersionName := LObject.GetValue('tag_name').Value; + if LVersionName = aRelease then + begin + result := TJSOnObject.ParseJSONValue(LObject.ToString) as TJSOnObject; + break; + end; + end; + finally + LArray.Free; + end; +end; + +function TDNGitLabPackageProvider.getReleaseAssetDownload(aRelease : TJSonObject) : string; +var cvassets : TJSONValue; + coassets, + cosource : TJSONObject; + casources : TJSONArray; + i : Integer; +begin + result := ''; + if aRelease <> nil then + begin + cvassets := aRelease.GetValue('assets'); + if cvassets is TJSONObject then + begin + coassets := TJSONObject(cvassets); + casources := coassets.GetValue('sources') as TJSONArray; + for i := 0 to casources.Count - 1 do + begin + cosource := casources.Items[i] as TJSONObject; + if cosource.GetValue('format').Value = 'zip' then + begin + result := cosource.GetValue('url').Value; + break; + end; + end; + end; + end; +end; + +function TDNGitLabPackageProvider.GetPushDateFile: string; +begin + Result := TPath.Combine(GetDelphinusTempFolder(), CPushDates); +end; + +function TDNGitLabPackageProvider.GetRepoList(out ARepos: TJSONArray): Boolean; +var + LRoot: TJSONArray; + LSearchResponse: string; + BSearchResponse: TArray; +begin + Result := FClient.GetText(Format(CGitRepoSearch, [FBaseURL]), LSearchResponse) = HTTPErrorOk; + if Result then + begin + BSearchResponse := TEncoding.UTF8.GetBytes(LSearchResponse); + LRoot := TJSONObject.ParseJSONValue(BSearchResponse, 0, Length(BSearchResponse), + [ TJSONObject.TJSONParseOption.IsUTF8, + TJSONObject.TJSONParseOption.UseBool]) as TJSONArray; + ARepos := LRoot; + ARepos.Owned := False; + end; +end; + +procedure TDNGitLabPackageProvider.HandleDownloadProgress(AProgress, + AMax: Int64); +begin + FProgress.SetTaskProgress('Archive', AProgress, AMax); +end; + +procedure TDNGitLabPackageProvider.LoadPushDates; +var + LDates: TStringList; + i: Integer; +begin + FDateMutex.Acquire(); + FPushDates.Clear; + + if not TFile.Exists(GetPushDateFile()) then + Exit; + + LDates := TStringList.Create(); + try + LDates.LoadFromFile(GetPushDateFile()); + for i := 0 to LDates.Count - 1 do + FPushDates.Add(LDates.Names[i], LDates.ValueFromIndex[i]); + finally + LDates.Free; + end; +end; + +function TDNGitLabPackageProvider.Reload: Boolean; +var + LRepo: TJSONObject; + LRepos: TJSONArray; + i: Integer; +begin + Result := False; + try + (FState as TDNGitlabPackageProviderState).Reset(); + FProgress.SetTasks(['Reolading']); + try + LoadPushDates(); + FClient.BeginWork(); + try + if GetRepoList(LRepos) then + begin + try + Packages.Clear(); + FExistingIDs.Clear(); + for i := 0 to LRepos.Count - 1 do + begin + LRepo := LRepos.Items[i] as TJSONObject; + FProgress.SetTaskProgress(LRepo.GetValue('name').Value, i, LRepos.Count); + AddPackageFromJSon(LRepo); + end; + FProgress.Completed(); + Result := True; + finally + LRepos.Free; + end; + end; + finally + FClient.EndWork(); + end; + finally + SavePushDates(); + end; + except + on E: ERateLimitException do + (FState as TDNGitlabPackageProviderState).SetError(E.Message) + end; +end; + +procedure TDNGitLabPackageProvider.SavePushDates; +var + LDates: TStringList; + LKeys, LValues: TArray; + i: Integer; +begin + LDates := TStringList.Create(); + try + LKeys := FPushDates.Keys.ToArray(); + LValues := FPushDates.Values.ToArray(); + for i := 0 to FPushDates.Count - 1 do + LDates.Add(LKeys[i] + '=' + LValues[i]); + LDates.SaveToFile(GetPushDateFile()); + finally + LDates.Free; + FDateMutex.Release(); + end; +end; + +end. diff --git a/DN.PackageProvider.MultiSource.pas b/DN.PackageProvider.MultiSource.pas new file mode 100644 index 0000000..3620cfe --- /dev/null +++ b/DN.PackageProvider.MultiSource.pas @@ -0,0 +1,105 @@ +unit DN.PackageProvider.MultiSource; + +interface + +uses + DN.Package.Intf, + DN.PackageProvider, + DN.PackageProvider.Intf, + DN.Progress.Intf; + +type + TDNMultiSourceProvider = class(TDNPackageProvider, IDNProgress) + private + FSources: TArray; + FProgress: IDNProgress; + procedure HandleProgress(const Task, Item: string; Progress, Max: Int64); + function TryGetSourceForPackage(const APackage: IDNPackage; out ASource: IDNPackageProvider): Boolean; + property Progress: IDNProgress read FProgress implements IDNProgress; + public + constructor Create(const ASources: TArray); + function Reload: Boolean; override; + function Download(const APackage: IDNPackage; const AVersion: string; const AFolder: string; out AContentFolder: string): Boolean; override; + end; + +implementation + +uses + SysUtils, + Generics.Collections, + DN.Progress; + +{ TDNMultiSourceProvider } + +constructor TDNMultiSourceProvider.Create( + const ASources: TArray); +var + LSource: IDNPackageProvider; + LProgress: IDNProgress; +begin + inherited Create(); + FSources := ASources; + FProgress := TDNProgress.Create(); + for LSource in FSources do + if Supports(LSource, IDNProgress, LProgress) then + LProgress.OnProgress := HandleProgress; +end; + +function TDNMultiSourceProvider.Download(const APackage: IDNPackage; + const AVersion, AFolder: string; out AContentFolder: string): Boolean; +var + LSource: IDNPackageProvider; +begin + Result := TryGetSourceForPackage(APackage, LSource); + if Result then + Result := LSource.Download(APackage, AVersion, AFolder, AContentFolder); +end; + +procedure TDNMultiSourceProvider.HandleProgress(const Task, Item: string; + Progress, Max: Int64); +begin + FProgress.SetTaskProgress(Item, Progress, Max); +end; + +function TDNMultiSourceProvider.Reload: Boolean; +var + LSource: IDNPackageProvider; + LExisting: TDictionary; + LPackage: IDNPackage; +begin + Result := False; + LExisting := TDictionary.Create(); + try + Packages.Clear; + FProgress.SetTasks(['Reloading']); + for LSource in FSources do + begin + Result := LSource.Reload or Result; + for LPackage in LSource.Packages do + if not LExisting.ContainsKey(LPackage.ID.ToString) then + begin + LExisting.Add(LPackage.ID.ToString, ''); + Packages.Add(LPackage); + end; + end; + FProgress.Completed; + finally + LExisting.Free; + end; +end; + +function TDNMultiSourceProvider.TryGetSourceForPackage( + const APackage: IDNPackage; out ASource: IDNPackageProvider): Boolean; +var + LSource: IDNPackageProvider; +begin + for LSource in FSources do + if LSource.Packages.IndexOf(APackage) > -1 then + begin + ASource := LSource; + Exit(True); + end; + Result := False; +end; + +end. diff --git a/DN.PackageSource.ConfigPage.Folder.dfm b/DN.PackageSource.ConfigPage.Folder.dfm new file mode 100644 index 0000000..9498fc5 --- /dev/null +++ b/DN.PackageSource.ConfigPage.Folder.dfm @@ -0,0 +1,25 @@ +object DNFolderConfigPage: TDNFolderConfigPage + Left = 0 + Top = 0 + Width = 320 + Height = 240 + TabOrder = 0 + DesignSize = ( + 320 + 240) + object Label1: TLabel + Left = 0 + Top = 0 + Width = 26 + Height = 13 + Caption = 'Path:' + end + object edPath: TEdit + Left = 0 + Top = 16 + Width = 320 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + end +end diff --git a/DN.PackageSource.ConfigPage.Folder.pas b/DN.PackageSource.ConfigPage.Folder.pas new file mode 100644 index 0000000..757f4bb --- /dev/null +++ b/DN.PackageSource.ConfigPage.Folder.pas @@ -0,0 +1,52 @@ +unit DN.PackageSource.ConfigPage.Folder; + +interface + +uses + Windows, + Messages, + SysUtils, + Variants, + Classes, + Graphics, + Controls, + Forms, + Dialogs, + DN.PackageSource.ConfigPage, + DN.PackageSource.Settings.Intf, + StdCtrls; + +type + TDNFolderConfigPage = class(TFrame) + Label1: TLabel; + edPath: TEdit; + private + { Private declarations } + public + { Public declarations } + procedure Load(const ASettings: IDNPackageSourceSettings); override; + procedure Save(const ASettings: IDNPackageSourceSettings); override; + end; + +implementation + +uses + DN.PackageSource.Settings.Folder; + +{$R *.dfm} + +{ TDNFolderConfigPage } + +procedure TDNFolderConfigPage.Load(const ASettings: IDNPackageSourceSettings); +begin + inherited; + edPath.Text := ASettings[TDNFolderSourceSettings.Path].Value.ToString; +end; + +procedure TDNFolderConfigPage.Save(const ASettings: IDNPackageSourceSettings); +begin + inherited; + ASettings[TDNFolderSourceSettings.Path].Value := edPath.Text; +end; + +end. diff --git a/DN.PackageSource.ConfigPage.Github.dfm b/DN.PackageSource.ConfigPage.Github.dfm new file mode 100644 index 0000000..09b3147 --- /dev/null +++ b/DN.PackageSource.ConfigPage.Github.dfm @@ -0,0 +1,50 @@ +object DNGithubSourceConfigPage: TDNGithubSourceConfigPage + Left = 0 + Top = 0 + Width = 320 + Height = 240 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + DesignSize = ( + 320 + 240) + object Label1: TLabel + Left = 3 + Top = 3 + Width = 75 + Height = 16 + Caption = 'OAuthToken:' + end + object lbResponse: TLabel + Left = 3 + Top = 54 + Width = 314 + Height = 16 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + end + object edOAuthToken: TEdit + Left = 3 + Top = 24 + Width = 233 + Height = 24 + Anchors = [akLeft, akTop, akRight] + PasswordChar = '*' + TabOrder = 0 + end + object btnTest: TButton + Left = 242 + Top = 24 + Width = 75 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Test' + TabOrder = 1 + OnClick = btnTestClick + end +end diff --git a/DN.PackageSource.ConfigPage.Github.pas b/DN.PackageSource.ConfigPage.Github.pas new file mode 100644 index 0000000..bc71945 --- /dev/null +++ b/DN.PackageSource.ConfigPage.Github.pas @@ -0,0 +1,86 @@ +unit DN.PackageSource.ConfigPage.Github; + +interface + +uses + Windows, + Messages, + SysUtils, + Variants, + Classes, + Graphics, + Controls, + Forms, + Dialogs, + DN.PackageSource.ConfigPage, + DN.PackageSource.Settings.Intf, + StdCtrls; + +type + TDNGithubSourceConfigPage = class(TFrame) + edOAuthToken: TEdit; + Label1: TLabel; + btnTest: TButton; + lbResponse: TLabel; + procedure btnTestClick(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure Load(const ASettings: IDNPackageSourceSettings); override; + procedure Save(const ASettings: IDNPackageSourceSettings); override; + end; + +implementation + +uses + DN.PackageProvider.GitHub, + DN.JSon, + DN.HttpClient.Intf, + DN.HttpClient.WinHttp, + DN.PackageSource.Settings.GitHub; + +{$R *.dfm} + +{ TGithubSourceConfigPage } + +procedure TDNGithubSourceConfigPage.btnTestClick(Sender: TObject); +var + LClient: IDNHttpClient; + LResult: Integer; + LResponse: string; + LJSon: TJSONObject; +begin + LClient := TDNWinHttpClient.Create(); + LClient.Authentication := Format(CGithubOAuthAuthentication, [Trim(edOAuthToken.Text)]); + LResult := LClient.GetText('https://api.github.com/user', LResponse); + if LResult = HTTPErrorOk then + begin + LJSon := TJSonObject.ParseJSONValue(LResponse) as TJSonObject; + try + lbResponse.Caption := 'Authenticated as ' + LJSon.GetValue('login').Value; + finally + LJSon.Free; + end; + end + else + begin + lbResponse.Caption := 'Failed with ResponseCode ' + IntToStr(LResult); + end; +end; + +procedure TDNGithubSourceConfigPage.Load( + const ASettings: IDNPackageSourceSettings); +begin + inherited; + edOAuthToken.Text := ASettings.Field[TDNGithubPackageSourceSettings.OAuthToken].Value.AsString; +end; + +procedure TDNGithubSourceConfigPage.Save( + const ASettings: IDNPackageSourceSettings); +begin + inherited; + ASettings.Field[TDNGithubPackageSourceSettings.OAuthToken].Value := edOAuthToken.Text; +end; + +end. diff --git a/DN.PackageSource.ConfigPage.Gitlab.dfm b/DN.PackageSource.ConfigPage.Gitlab.dfm new file mode 100644 index 0000000..3b8471d --- /dev/null +++ b/DN.PackageSource.ConfigPage.Gitlab.dfm @@ -0,0 +1,87 @@ +object DNGitlabSourceConfigPage: TDNGitlabSourceConfigPage + Left = 0 + Top = 0 + Width = 320 + Height = 214 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + TabOrder = 0 + DesignSize = ( + 320 + 214) + object lblInfoToken: TLabel + Left = 3 + Top = 95 + Width = 75 + Height = 16 + Caption = 'OAuthToken:' + end + object lbResponse: TLabel + Left = 3 + Top = 147 + Width = 314 + Height = 58 + Anchors = [akLeft, akTop, akRight] + AutoSize = False + WordWrap = True + end + object lblInfoBaseURL: TLabel + Left = 3 + Top = 10 + Width = 58 + Height = 16 + Caption = 'Base URL:' + end + object imgAvatar: TImage + Left = 242 + Top = 63 + Width = 75 + Height = 78 + Anchors = [akTop, akRight] + Stretch = True + end + object edtOAuthToken: TEdit + Left = 3 + Top = 117 + Width = 233 + Height = 24 + Anchors = [akLeft, akTop, akRight] + PasswordChar = '*' + TabOrder = 0 + end + object edtBaseURL: TEdit + Left = 3 + Top = 32 + Width = 233 + Height = 24 + Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = True + TabOrder = 1 + TextHint = 'https://gitlab.com' + OnChange = edtBaseURLChange + end + object btnTestURL: TButton + Left = 242 + Top = 32 + Width = 75 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Test' + TabOrder = 2 + OnClick = btnTestTokenClick + end + object btnSetURLGitLabCom: TButton + Left = 2 + Top = 56 + Width = 103 + Height = 25 + Caption = 'GitLab.com' + TabOrder = 3 + OnClick = btnSetURLGitLabComClick + end +end diff --git a/DN.PackageSource.ConfigPage.Gitlab.pas b/DN.PackageSource.ConfigPage.Gitlab.pas new file mode 100644 index 0000000..27e27f6 --- /dev/null +++ b/DN.PackageSource.ConfigPage.Gitlab.pas @@ -0,0 +1,191 @@ +{ +######################################################### +# Author: Matthias Heunecke, Navimatix # +# This unit is part of the Delphinus project hosted on # +# https://github.com/Memnarch/Delphinus # +######################################################### +} +unit DN.PackageSource.ConfigPage.Gitlab; + +interface + +uses + Windows, + Messages, + SysUtils, + Variants, + Classes, + Graphics, + Controls, + Forms, + Dialogs, + DN.PackageSource.ConfigPage, + DN.PackageSource.Settings.Intf, + StdCtrls, Vcl.ExtCtrls; + +type + TDNGitlabSourceConfigPage = class(TFrame) + edtOAuthToken: TEdit; + lblInfoToken: TLabel; + lbResponse: TLabel; + edtBaseURL: TEdit; + lblInfoBaseURL: TLabel; + btnTestURL: TButton; + btnSetURLGitLabCom: TButton; + imgAvatar: TImage; + procedure btnSetURLGitLabComClick(Sender: TObject); + procedure btnTestTokenClick(Sender: TObject); + procedure edtBaseURLChange(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + procedure Load(const ASettings: IDNPackageSourceSettings); override; + procedure Save(const ASettings: IDNPackageSourceSettings); override; + end; + +implementation + +uses + DN.PackageProvider.GitLab, + DN.JSon, + DN.HttpClient.Intf, + DN.HttpClient.WinHttp, + DN.PackageSource.Settings.GitLab + {$IF RTLVersion < 32.0} + , PngImage, Jpeg + {$ENDIF} + ; + +{$R *.dfm} + +{ TGitlabSourceConfigPage } + +procedure TDNGitlabSourceConfigPage.btnSetURLGitLabComClick(Sender: TObject); +begin + edtBaseURL.Text := 'https://gitlab.com'; +end; + +procedure TDNGitlabSourceConfigPage.btnTestTokenClick(Sender: TObject); +var + LClient: IDNHttpClient; + LResult: Integer; + LResponse: string; + LJSon: TJSONObject; + zs : string; + avatarstream : TMemoryStream; + {$IF RTLVersion < 32.0} + cgfx : TGraphic; + {$ENDIF} +begin + lbResponse.Caption := Format('Checking (%0:s)...', [DateTimeToStr(Now)]); + Application.ProcessMessages; + LClient := TDNWinHttpClient.Create(); + LClient.Authentication := Format(CGitlabOAuthAuthentication, [Trim(edtOAuthToken.Text)]); + zs := Format('%0:s/api/v4/user?private_token=%1:s', [edtBaseURL.Text, Trim(edtOAuthToken.Text)]); + try + LResult := LClient.GetText(zs, LResponse); + except + on e : exception do + begin + lbResponse.Caption := Format('No connection "%0:s"', [e.Message]); + exit; + end; + end; + if LResult = HTTPErrorOk then + begin + LJSon := TJSonObject.ParseJSONValue(LResponse) as TJSonObject; + try + if LJSon <> nil then + begin + lbResponse.Caption := Format('You are: %0:s (%1:s)', [LJSon.GetValue('username').Value, LJSon.GetValue('name').Value]); + try + avatarstream := TMemoryStream.Create; + try + LResult := LClient.Get(LJSon.GetValue('avatar_url').Value, avatarstream); + if LResult = HTTPErrorOk then + begin + avatarstream.Position := 0; + {$IF RTLVersion >= 32.0} + imgAvatar.Picture.LoadFromStream(avatarstream); + {$ELSE} + cgfx := nil; + // try PNG... + if cgfx = nil then + begin + cgfx := TPngImage.Create; + try + cgfx.LoadFromStream(avatarstream); + imgAvatar.Picture.Graphic := cgfx; + except + FreeAndNil(cgfx); + end; + end; + // try JPG... + if cgfx = nil then + begin + cgfx := TJpegImage.Create; + try + cgfx.LoadFromStream(avatarstream); + imgAvatar.Picture.Graphic := cgfx; + except + FreeAndNil(cgfx); + end; + end; + // try BMP... + if cgfx = nil then + begin + cgfx := TBitmap.Create; + try + cgfx.LoadFromStream(avatarstream); + imgAvatar.Picture.Graphic := cgfx; + except + FreeAndNil(cgfx); + end; + end; + {$ENDIF} + end; + finally + FreeAndNil(avatarstream); + end; + except + on e : exception do + begin + // only a missing picture + end; + end; + end else + begin + lbResponse.Caption := 'Unexpected result, there is no API answer'; + end; + finally + LJSon.Free; + end; + end else + begin + lbResponse.Caption := 'Authentication failed with ResponseCode ' + IntToStr(LResult); + end; +end; + +procedure TDNGitlabSourceConfigPage.edtBaseURLChange(Sender: TObject); +begin + edtBaseURL.Hint := edtBaseURL.Text; +end; + +procedure TDNGitlabSourceConfigPage.Load( + const ASettings: IDNPackageSourceSettings); +begin + inherited; + edtOAuthToken.Text := ASettings.Field[TDNGitlabPackageSourceSettings.OAuthToken].Value.AsString; + edtBaseURL.Text := ASettings.Field[TDNGitlabPackageSourceSettings.BaseURL].Value.AsString; +end; + +procedure TDNGitlabSourceConfigPage.Save( + const ASettings: IDNPackageSourceSettings); +begin + inherited; + ASettings.Field[TDNGitlabPackageSourceSettings.OAuthToken].Value := edtOAuthToken.Text; + ASettings.Field[TDNGitlabPackageSourceSettings.BaseURL].Value := edtBaseURL.Text; +end; + +end. diff --git a/DN.PackageSource.ConfigPage.Intf.pas b/DN.PackageSource.ConfigPage.Intf.pas new file mode 100644 index 0000000..8c55b9d --- /dev/null +++ b/DN.PackageSource.ConfigPage.Intf.pas @@ -0,0 +1,21 @@ +unit DN.PackageSource.ConfigPage.Intf; + +interface + +uses + Controls, + DN.PackageSource.Settings.Intf; + +type + IDNPackageSourceConfigPage = interface + ['{56F8FA24-FEA1-4FF5-91FF-06EF005161A5}'] + function GetParent: TWinControl; + procedure SetParent(const AValue: TWinControl); + procedure Load(const ASettings: IDNPackageSourceSettings); + procedure Save(const ASettings: IDNPackageSourceSettings); + property Parent: TWinControl read GetParent write SetParent; + end; + +implementation + +end. diff --git a/DN.PackageSource.ConfigPage.pas b/DN.PackageSource.ConfigPage.pas new file mode 100644 index 0000000..212b6cd --- /dev/null +++ b/DN.PackageSource.ConfigPage.pas @@ -0,0 +1,58 @@ +unit DN.PackageSource.ConfigPage; + +interface + +uses + Controls, + Forms, + DN.PackageSource.Settings.Intf, + DN.PackageSource.ConfigPage.Intf; + +type + TDNSourceConfigPage = class(TFrame, IInterface, IDNPackageSourceConfigPage) + private + FRefCount: Integer; + protected + function _AddRef: Integer; stdcall; + function _Release: Integer; stdcall; + function GetParent: TWinControl; + procedure SetParent(const AValue: TWinControl); reintroduce; + public + procedure Load(const ASettings: IDNPackageSourceSettings); virtual; abstract; + procedure Save(const ASettings: IDNPackageSourceSettings); virtual; abstract; + end; + + //Make designer happy + TFrame = TDNSourceConfigPage; + +implementation + +uses + SyncObjs; + +{ TDNSourceConfigPage } + +function TDNSourceConfigPage.GetParent: TWinControl; +begin + Result := Parent; +end; + +procedure TDNSourceConfigPage.SetParent(const AValue: TWinControl); +begin + Align := alClient; + Parent := AValue; +end; + +function TDNSourceConfigPage._AddRef: Integer; +begin + Result := TInterlocked.Increment(FRefCount); +end; + +function TDNSourceConfigPage._Release: Integer; +begin + Result := TInterlocked.Decrement(FRefCount); + if Result = 0 then + Self.Free; +end; + +end. diff --git a/DN.PackageSource.Folder.pas b/DN.PackageSource.Folder.pas new file mode 100644 index 0000000..bc03e94 --- /dev/null +++ b/DN.PackageSource.Folder.pas @@ -0,0 +1,50 @@ +unit DN.PackageSource.Folder; + +interface + +uses + DN.PackageSource, + DN.PackageSource.ConfigPage.Intf, + DN.PackageSource.Settings.Intf, + DN.PackageProvider.Intf; + +type + TDNFolderPackageSource = class(TDNPackageSource) + public + function GetName: string; override; + function NewConfigPage: IDNPackageSourceConfigPage; override; + function NewProvider(const ASettings: IDNPackageSourceSettings): IDNPackageProvider; override; + function NewSettings: IDNPackageSourceSettings; override; + end; + +implementation + +uses + DN.PackageProvider.Folder, + DN.PackageSource.Settings.Folder, + DN.PackageSource.ConfigPage.Folder; + +{ TDNFolderPackageSource } + +function TDNFolderPackageSource.GetName: string; +begin + Result := 'Folder'; +end; + +function TDNFolderPackageSource.NewConfigPage: IDNPackageSourceConfigPage; +begin + Result := TDNFolderConfigPage.Create(nil); +end; + +function TDNFolderPackageSource.NewProvider( + const ASettings: IDNPackageSourceSettings): IDNPackageProvider; +begin + Result := TDNFolderPackageProvider.Create(ASettings[TDNFolderSourceSettings.Path].Value.ToString); +end; + +function TDNFolderPackageSource.NewSettings: IDNPackageSourceSettings; +begin + Result := TDNFolderSourceSettings.Create(GetName()); +end; + +end. diff --git a/DN.PackageSource.Github.pas b/DN.PackageSource.Github.pas new file mode 100644 index 0000000..12c2bb0 --- /dev/null +++ b/DN.PackageSource.Github.pas @@ -0,0 +1,60 @@ +unit DN.PackageSource.Github; + +interface + +uses + DN.PackageSource, + DN.PackageProvider.Intf, + DN.PackageSource.Settings.Intf, + DN.PackageSource.ConfigPage.Intf; + +type + TDNGithubPackageSource = class(TDNPackageSource) + public + function GetName: string; override; + function NewProvider(const ASettings: IDNPackageSourceSettings): IDNPackageProvider; override; + function NewSettings: IDNPackageSourceSettings; override; + function NewConfigPage: IDNPackageSourceConfigPage; override; + end; + +implementation + +uses + SysUtils, + DN.PackageSource.Settings.GitHub, + DN.PackageSource.ConfigPage.Github, + DN.PackageProvider.Github, + DN.HttpClient.Intf, + DN.HttpClient.WinHttp; + +{ TGithubPackageSource } + +function TDNGithubPackageSource.GetName: string; +begin + Result := 'GitHub'; +end; + +function TDNGithubPackageSource.NewConfigPage: IDNPackageSourceConfigPage; +begin + Result := TDNGithubSourceConfigPage.Create(nil); +end; + +function TDNGithubPackageSource.NewProvider( + const ASettings: IDNPackageSourceSettings): IDNPackageProvider; +var + LClient: IDNHttpClient; + LOAuthToken: string; +begin + LClient := TDNWinHttpClient.Create(); + LOAuthToken := ASettings.Field[TDNGithubPackageSourceSettings.OAuthToken].Value.ToString; + if LOAuthToken <> '' then + LClient.Authentication := Format(CGithubOAuthAuthentication, [LOAuthToken]); + Result := TDNGitHubPackageProvider.Create(LClient); +end; + +function TDNGithubPackageSource.NewSettings: IDNPackageSourceSettings; +begin + Result := TDNGithubPackageSourceSettings.Create(GetName); +end; + +end. diff --git a/DN.PackageSource.Gitlab.pas b/DN.PackageSource.Gitlab.pas new file mode 100644 index 0000000..280fb79 --- /dev/null +++ b/DN.PackageSource.Gitlab.pas @@ -0,0 +1,61 @@ +unit DN.PackageSource.Gitlab; + +interface + +uses + DN.PackageSource, + DN.PackageProvider.Intf, + DN.PackageSource.Settings.Intf, + DN.PackageSource.ConfigPage.Intf; + +type + TDNGitlabPackageSource = class(TDNPackageSource) + public + function GetName: string; override; + function NewProvider(const ASettings: IDNPackageSourceSettings): IDNPackageProvider; override; + function NewSettings: IDNPackageSourceSettings; override; + function NewConfigPage: IDNPackageSourceConfigPage; override; + end; + +implementation + +uses + SysUtils, + DN.PackageSource.Settings.GitLab, + DN.PackageSource.ConfigPage.Gitlab, + DN.PackageProvider.Gitlab, + DN.HttpClient.Intf, + DN.HttpClient.WinHttp; + +{ TGitlabPackageSource } + +function TDNGitlabPackageSource.GetName: string; +begin + Result := 'GitLab'; +end; + +function TDNGitlabPackageSource.NewConfigPage: IDNPackageSourceConfigPage; +begin + Result := TDNGitlabSourceConfigPage.Create(nil); +end; + +function TDNGitlabPackageSource.NewProvider( + const ASettings: IDNPackageSourceSettings): IDNPackageProvider; +var + LClient: IDNHttpClient; + LOAuthToken: string; +begin + LClient := TDNWinHttpClient.Create(); + LOAuthToken := ASettings.Field[TDNGitlabPackageSourceSettings.OAuthToken].Value.ToString; + if LOAuthToken <> '' then + LClient.Authentication := Format(CGitlabOAuthAuthentication, [LOAuthToken]); + Result := TDNGitLabPackageProvider.Create(LClient); + TDNGitLabPackageProvider(Result).BaseURL := ASettings.Field[TDNGitlabPackageSourceSettings.BaseURL].Value.ToString; +end; + +function TDNGitlabPackageSource.NewSettings: IDNPackageSourceSettings; +begin + Result := TDNGitlabPackageSourceSettings.Create(GetName); +end; + +end. diff --git a/DN.PackageSource.Intf.pas b/DN.PackageSource.Intf.pas new file mode 100644 index 0000000..9fb988e --- /dev/null +++ b/DN.PackageSource.Intf.pas @@ -0,0 +1,22 @@ +unit DN.PackageSource.Intf; + +interface + +uses + DN.PackageProvider.Intf, + DN.PackageSource.Settings.Intf, + DN.PackageSource.ConfigPage.Intf; + +type + IDNPackageSource = interface + ['{DBC78301-EE5B-4CD3-98F8-A00413905077}'] + function GetName: string; + function NewSettings: IDNPackageSourceSettings; + function NewProvider(const ASettings: IDNPackageSourceSettings): IDNPackageProvider; + function NewConfigPage: IDNPackageSourceConfigPage; + property Name: string read GetName; + end; + +implementation + +end. diff --git a/DN.PackageSource.Registry.Intf.pas b/DN.PackageSource.Registry.Intf.pas new file mode 100644 index 0000000..4da251e --- /dev/null +++ b/DN.PackageSource.Registry.Intf.pas @@ -0,0 +1,20 @@ +unit DN.PackageSource.Registry.Intf; + +interface + +uses + DN.PackageSource.Intf; + +type + IDNPackageSourceRegistry = interface + ['{A8F4ACA8-09FE-40E9-8951-512C375C85C3}'] + function GetSources: TArray; + procedure RegisterSource(const ASource: IDNPackageSource); + procedure UnregisterSource(const ASource: IDNPackageSource); + function TryGetSource(const AName: string; out ASource: IDNPackageSource): Boolean; + property Sources: TArray read GetSources; + end; + +implementation + +end. diff --git a/DN.PackageSource.Registry.pas b/DN.PackageSource.Registry.pas new file mode 100644 index 0000000..876053d --- /dev/null +++ b/DN.PackageSource.Registry.pas @@ -0,0 +1,67 @@ +unit DN.PackageSource.Registry; + +interface + +uses + Generics.Collections, + DN.PackageSource.Intf, + DN.PackageSource.Registry.Intf; + +type + TDNPackageSourceRegistry = class(TInterfacedObject, IDNPackageSourceRegistry) + private + FSources: TDictionary; + function GetSources: TArray; + procedure RegisterSource(const ASource: IDNPackageSource); + function TryGetSource(const AName: string; + out ASource: IDNPackageSource): Boolean; + procedure UnregisterSource(const ASource: IDNPackageSource); + public + constructor Create; + destructor Destroy; override; + end; + + +implementation + +uses + DN.Character; + +{ TDNPackageSourceRegistry } + +constructor TDNPackageSourceRegistry.Create; +begin + inherited; + FSources := TDictionary.Create(); +end; + +destructor TDNPackageSourceRegistry.Destroy; +begin + FSources.Free; + inherited; +end; + +function TDNPackageSourceRegistry.GetSources: TArray; +begin + Result := FSources.Values.ToArray; +end; + +procedure TDNPackageSourceRegistry.RegisterSource( + const ASource: IDNPackageSource); +begin + FSources.Add(TCharacter.ToLower(ASource.Name), ASource); +end; + +function TDNPackageSourceRegistry.TryGetSource(const AName: string; + out ASource: IDNPackageSource): Boolean; +begin + Result := FSources.TryGetValue(TCharacter.ToLower(AName), ASource); +end; + +procedure TDNPackageSourceRegistry.UnregisterSource( + const ASource: IDNPackageSource); +begin + FSources.Remove(TCharacter.ToLower(ASource.Name)); +end; + +end. diff --git a/DN.PackageSource.Settings.Field.Intf.pas b/DN.PackageSource.Settings.Field.Intf.pas new file mode 100644 index 0000000..87db2eb --- /dev/null +++ b/DN.PackageSource.Settings.Field.Intf.pas @@ -0,0 +1,24 @@ +unit DN.PackageSource.Settings.Field.Intf; + +interface + +uses + RTTI; + +type + TFieldValueType = (ftString, ftInteger); + + IDNPackageSourceSettingsField = interface + ['{DC0FBD64-173E-4569-B1B3-C76D824AD7B8}'] + function GetValue: TValue; + procedure SetValue(const Value: TValue); + function GetValueType: TFieldValueType; + function GetName: string; + property Name: string read GetName; + property Value: TValue read GetValue write SetValue; + property ValueType: TFieldValueType read GetValueType; + end; + +implementation + +end. diff --git a/DN.PackageSource.Settings.Field.pas b/DN.PackageSource.Settings.Field.pas new file mode 100644 index 0000000..45986b2 --- /dev/null +++ b/DN.PackageSource.Settings.Field.pas @@ -0,0 +1,57 @@ +unit DN.PackageSource.Settings.Field; + +interface + +uses + DN.PackageSource.Settings.Field.Intf, + RTTI; + +type + TDNPackageSourceSettingsField = class(TInterfacedObject, IDNPackageSourceSettingsField) + private + FName: string; + FValue: TValue; + FValueType: TFieldValueType; + function GetValue: TValue; + procedure SetValue(const Value: TValue); + function GetValueType: TFieldValueType; + function GetName: string; + public + constructor Create(const AName: string; AType: TFieldValueType); + property Name: string read GetName; + property Value: TValue read GetValue write SetValue; + property ValueType: TFieldValueType read GetValueType; + end; + +implementation + +{ TDNPackageSourceSettingsField } + +constructor TDNPackageSourceSettingsField.Create(const AName: string; AType: TFieldValueType); +begin + inherited Create(); + FName := AName; + FValueType := AType; +end; + +function TDNPackageSourceSettingsField.GetName: string; +begin + Result := FName; +end; + +function TDNPackageSourceSettingsField.GetValue: TValue; +begin + Result := FValue; +end; + +function TDNPackageSourceSettingsField.GetValueType: TFieldValueType; +begin + Result := FValueType; +end; + +procedure TDNPackageSourceSettingsField.SetValue(const Value: TValue); +begin + FValue := Value; +end; + +end. diff --git a/DN.PackageSource.Settings.Folder.pas b/DN.PackageSource.Settings.Folder.pas new file mode 100644 index 0000000..a97209e --- /dev/null +++ b/DN.PackageSource.Settings.Folder.pas @@ -0,0 +1,29 @@ +unit DN.PackageSource.Settings.Folder; + +interface + +uses + DN.PackageSource.Settings; + +type + TDNFolderSourceSettings = class(TDNPackageSourceSettings) + protected + procedure InitFields; override; + public + const Path = 'Path'; + end; + +implementation + +uses + DN.PackageSource.Settings.Field.Intf; + +{ TDNFolderSourceSettings } + +procedure TDNFolderSourceSettings.InitFields; +begin + inherited; + DeclareField(Path, ftString); +end; + +end. diff --git a/DN.PackageSource.Settings.Github.pas b/DN.PackageSource.Settings.Github.pas new file mode 100644 index 0000000..355a20f --- /dev/null +++ b/DN.PackageSource.Settings.Github.pas @@ -0,0 +1,29 @@ +unit DN.PackageSource.Settings.Github; + +interface + +uses + DN.PackageSource.Settings; + +type + TDNGithubPackageSourceSettings = class(TDNPackageSourceSettings) + protected + procedure InitFields; override; + public + const OAuthToken = 'OAuthToken'; + end; + +implementation + +uses + DN.PackageSource.Settings.Field.Intf; + +{ TDNGithubPackageSourceSettings } + +procedure TDNGithubPackageSourceSettings.InitFields; +begin + inherited; + DeclareField(OAuthToken, ftString); +end; + +end. diff --git a/DN.PackageSource.Settings.Gitlab.pas b/DN.PackageSource.Settings.Gitlab.pas new file mode 100644 index 0000000..719432e --- /dev/null +++ b/DN.PackageSource.Settings.Gitlab.pas @@ -0,0 +1,38 @@ +{ +######################################################### +# Author: Matthias Heunecke, Navimatix # +# This unit is part of the Delphinus project hosted on # +# https://github.com/Memnarch/Delphinus # +######################################################### +} +unit DN.PackageSource.Settings.Gitlab; + +interface + +uses + DN.PackageSource.Settings; + +type + TDNGitlabPackageSourceSettings = class(TDNPackageSourceSettings) + protected + procedure InitFields; override; + public + const OAuthToken = 'OAuthToken'; + const BaseURL = 'BaseURL'; + end; + +implementation + +uses + DN.PackageSource.Settings.Field.Intf; + +{ TDNGitlabPackageSourceSettings } + +procedure TDNGitlabPackageSourceSettings.InitFields; +begin + inherited; + DeclareField(OAuthToken, ftString); + DeclareField(BaseURL, ftString); +end; + +end. diff --git a/DN.PackageSource.Settings.Intf.pas b/DN.PackageSource.Settings.Intf.pas new file mode 100644 index 0000000..d7a74a3 --- /dev/null +++ b/DN.PackageSource.Settings.Intf.pas @@ -0,0 +1,24 @@ +unit DN.PackageSource.Settings.Intf; + +interface + +uses + DN.PackageSource.Settings.Field.Intf; + +type + IDNPackageSourceSettings = interface + ['{F26601A3-7C4E-4E2B-981D-057C80F85D94}'] + function GetField(const AName: string): IDNPackageSourceSettingsField; + function GetFields: TArray; + function GetName: string; + function GetSourceName: string; + procedure SetName(const Value: string); + property Name: string read GetName write SetName; + property SourceName: string read GetSourceName; + property Field[const AName: string]: IDNPackageSourceSettingsField read GetField; default; + property Fields: TArray read GetFields; + end; + +implementation + +end. diff --git a/DN.PackageSource.Settings.pas b/DN.PackageSource.Settings.pas new file mode 100644 index 0000000..59a3157 --- /dev/null +++ b/DN.PackageSource.Settings.pas @@ -0,0 +1,93 @@ +unit DN.PackageSource.Settings; + +interface + +uses + Generics.Collections, + DN.PackageSource.Settings.Field.Intf, + DN.PackageSource.Settings.Intf; + +type + TDNPackageSourceSettings = class(TInterfacedObject, IDNPackageSourceSettings) + private + FName: string; + FSourceName: string; + FFields: TDictionary; + function GetField(const AName: string): IDNPackageSourceSettingsField; + function GetFields: TArray; + function GetName: string; + function GetSourceName: string; + procedure SetName(const Value: string); + protected + function DeclareField(const AName: string; AType: TFieldValueType): IDNPackageSourceSettingsField; + procedure InitFields; virtual; + public + constructor Create(const ASourceName: string); + destructor Destroy; override; + property Name: string read GetName write SetName; + property SourceName: string read GetSourceName; + property Field[const AName: string]: IDNPackageSourceSettingsField read GetField; + property Fields: TArray read GetFields; + end; + +implementation + +uses + DN.Character, + DN.PackageSource.Settings.Field; + +{ TDNPackageSourceSettings } + +constructor TDNPackageSourceSettings.Create(const ASourceName: string); +begin + inherited Create(); + FFields := TDictionary.Create(); + FSourceName := ASourceName; + InitFields(); +end; + +function TDNPackageSourceSettings.DeclareField( + const AName: string; AType: TFieldValueType): IDNPackageSourceSettingsField; +begin + Result := TDNPackageSourceSettingsField.Create(AName, AType); + FFields.Add(TCharacter.ToLower(AName), Result); +end; + +destructor TDNPackageSourceSettings.Destroy; +begin + FFields.Free; + inherited; +end; + +function TDNPackageSourceSettings.GetField( + const AName: string): IDNPackageSourceSettingsField; +begin + Result := FFields[TCharacter.ToLower(AName)]; +end; + +function TDNPackageSourceSettings.GetFields: TArray; +begin + Result := FFields.Values.ToArray; +end; + +function TDNPackageSourceSettings.GetName: string; +begin + Result := FName; +end; + +function TDNPackageSourceSettings.GetSourceName: string; +begin + Result := FSourceName; +end; + +procedure TDNPackageSourceSettings.InitFields; +begin + +end; + +procedure TDNPackageSourceSettings.SetName(const Value: string); +begin + FName := Value; +end; + +end. diff --git a/DN.PackageSource.pas b/DN.PackageSource.pas new file mode 100644 index 0000000..b09926b --- /dev/null +++ b/DN.PackageSource.pas @@ -0,0 +1,22 @@ +unit DN.PackageSource; + +interface + +uses + DN.PackageSource.Settings.Intf, + DN.PackageProvider.Intf, + DN.PackageSource.Intf, + DN.PackageSource.ConfigPage.Intf; + +type + TDNPackageSource = class(TInterfacedObject, IDNPackageSource) + public + function GetName: string; virtual; abstract; + function NewProvider(const ASettings: IDNPackageSourceSettings): IDNPackageProvider; virtual; abstract; + function NewSettings: IDNPackageSourceSettings; virtual; abstract; + function NewConfigPage: IDNPackageSourceConfigPage; virtual; abstract; + end; + +implementation + +end. diff --git a/DN.Settings.Intf.pas b/DN.Settings.Intf.pas index c92d5e3..5d72740 100644 --- a/DN.Settings.Intf.pas +++ b/DN.Settings.Intf.pas @@ -2,6 +2,9 @@ interface +uses + DN.PackageSource.Settings.Intf; + type IDNSettings = interface ['{AEF92172-BD4F-44BA-B3F2-479533B00285}'] @@ -9,11 +12,14 @@ interface function GetOAuthToken: string; function GetVersion: string; function GetInstallDate: TDateTime; + function GetSourceSettings: TArray; + procedure SetSourceSettings(const Value: TArray); procedure SetOAuthToken(const Value: string); property InstallationDirectory: string read GetInstallationDirectory; property OAuthToken: string read GetOAuthToken write SetOAuthToken; property Version: string read GetVersion; property InstallDate: TDateTime read GetInstallDate; + property SourceSettings: TArray read GetSourceSettings write SetSourceSettings; end; IDNElevatedSettings = interface(IDNSettings) diff --git a/DN.Settings.pas b/DN.Settings.pas index 641a6cb..ba09141 100644 --- a/DN.Settings.pas +++ b/DN.Settings.pas @@ -3,11 +3,17 @@ interface uses - DN.Settings.Intf; + Generics.Collections, + DN.Settings.Intf, + DN.PackageSource.Settings.Intf; type + TDNPackageSourceSettingsFactory = reference to function(const ASourceName: string; out ASettings: IDNPackageSourceSettings): Boolean; + TDNSettings = class(TInterfacedObject, IDNSettings, IDNElevatedSettings) private + FSourceSettings: TList; + FSettingsFactory: TDNPackageSourceSettingsFactory; function ReadString(const AValueName: string): string; procedure WriteString(const AValueName, AContent: string); function GetInstallationDirectory: string; @@ -18,22 +24,33 @@ TDNSettings = class(TInterfacedObject, IDNSettings, IDNElevatedSettings) procedure SetVersion(const Value: string); function GetInstallDate: TDateTime; procedure SetInstallDate(const Value: TDateTime); + function GetSourceSettings: TArray; + procedure CreateDefaultSource; + procedure LoadSources; + procedure SaveSources; + procedure SetSourceSettings(const Value: TArray); public + constructor Create(const ASettingsFactory: TDNPackageSourceSettingsFactory); + destructor Destroy; override; procedure Clear(); property InstallationDirectory: string read GetInstallationDirectory write SetInstallationDirectory; property OAuthToken: string read GetOAuthToken write SetOAuthToken; property Version: string read GetVersion write SetVersion; property InstallDate: TDateTime read GetInstallDate write SetInstallDate; + property SourceSettings: TArray read GetSourceSettings write SetSourceSettings; end; implementation uses + Classes, Windows, Registry, SysUtils, DateUtils, - StrUtils; + StrUtils, + IOUtils, + DN.PackageSource.Settings.Field.Intf; const CInstallationDirectory = 'InstallationDirectory'; @@ -41,12 +58,14 @@ implementation CVersion = 'Version'; CInstallDate = 'InstallDate'; CDelphinusKey = 'Software\Delphinus'; + CDelphinusSourcesKey = CDelphinusKey + '\Sources'; CRootKey = HKEY_CURRENT_USER; CDateFormat = 'yyyy-mm-dd'; CDateSeperator = '-'; CTimeFormat = 'hh:nn:ss:zzz'; CTimeSeperator = ':'; CDateTimeFormat = CDateFormat + ' ' + CTimeFormat; + CSourceType = 'SourceType'; { TDNSettings } @@ -63,6 +82,31 @@ procedure TDNSettings.Clear; end; end; +constructor TDNSettings.Create(const ASettingsFactory: TDNPackageSourceSettingsFactory); +begin + inherited Create(); + FSourceSettings := TList.Create(); + FSettingsFactory := ASettingsFactory; +end; + +procedure TDNSettings.CreateDefaultSource; +var + LSetting: IDNPackageSourceSettings; +begin + if FSettingsFactory('GitHub', LSetting) then + begin + LSetting.Name := 'GitHub'; + LSetting.Field['OAuthToken'].Value := OAuthToken; + FSourceSettings.Add(LSetting); + end; +end; + +destructor TDNSettings.Destroy; +begin + FSourceSettings.Free(); + inherited; +end; + function TDNSettings.GetInstallationDirectory: string; begin Result := ReadString(CInstallationDirectory) @@ -92,11 +136,70 @@ function TDNSettings.GetOAuthToken: string; Result := ReadString(COAuthToken); end; +function TDNSettings.GetSourceSettings: TArray; +begin + if FSourceSettings.Count = 0 then + LoadSources(); + if FSourceSettings.Count = 0 then + CreateDefaultSource(); + Result := FSourceSettings.ToArray; +end; + function TDNSettings.GetVersion: string; begin Result := ReadString(CVersion); end; +procedure TDNSettings.LoadSources; +var + LRegistry: TRegistry; + LKeys: TStringList; + LKey, LSourceType: string; + LSettings: IDNPackageSourceSettings; + LField: IDNPackageSourceSettingsField; +begin + FSourceSettings.Clear(); + LRegistry := TRegistry.Create(); + try + LRegistry.RootKey := CRootKey; + if LRegistry.OpenKeyReadOnly(CDelphinusSourcesKey) then + begin + LKeys := TStringList.Create(); + try + LRegistry.GetKeyNames(LKeys); + LRegistry.CloseKey; + for LKey in LKeys do + begin + if LRegistry.OpenKeyReadOnly(CDelphinusSourcesKey + '\' + LKey) and LRegistry.ValueExists(CSourceType) then + begin + LSourceType := LRegistry.ReadString(CSourceType); + if FSettingsFactory(LSourceType, LSettings) then + begin + LSettings.Name := LKey; + for LField in LSettings.Fields do + begin + if LRegistry.ValueExists(LField.Name) then + begin + case LField.ValueType of + ftString: LField.Value := LRegistry.ReadString(LField.Name); + ftInteger: LField.Value := LRegistry.ReadInteger(LField.Name); + end; + end; + end; + FSourceSettings.Add(LSettings); + end; + LRegistry.CloseKey; + end; + end; + finally + LKeys.Free(); + end; + end; + finally + LRegistry.Free; + end; +end; + function TDNSettings.ReadString(const AValueName: string): string; var LRegistry: TRegistry; @@ -115,6 +218,46 @@ function TDNSettings.ReadString(const AValueName: string): string; end; end; +procedure TDNSettings.SaveSources; +var + LRegistry: TRegistry; + LSetting: IDNPackageSourceSettings; + LField: IDNPackageSourceSettingsField; + LPath: string; +begin + LRegistry := TRegistry.Create(); + try + LRegistry.RootKey := CRootKey; + if (not LRegistry.KeyExists(CDelphinusSourcesKey) or LRegistry.DeleteKey(CDelphinusSourcesKey)) then + begin + for LSetting in FSourceSettings do + begin + LPath := TPath.Combine(CDelphinusSourcesKey, LSetting.Name); + if LRegistry.OpenKey(LPath, True) then + begin + try + LRegistry.WriteString(CSourceType, LSetting.SourceName); + for LField in LSetting.Fields do + begin + if not LField.Value.IsEmpty then + begin + case LField.ValueType of + ftString: LRegistry.WriteString(LField.Name, LField.Value.AsString); + ftInteger: LRegistry.WriteInteger(LField.Name, LField.Value.AsInteger); + end; + end; + end; + finally + LRegistry.CloseKey(); + end; + end; + end; + end; + finally + LRegistry.Free; + end; +end; + procedure TDNSettings.SetInstallationDirectory(const Value: string); begin WriteString(CInstallationDirectory, Value); @@ -130,6 +273,14 @@ procedure TDNSettings.SetOAuthToken(const Value: string); WriteString(COAuthToken, Value); end; +procedure TDNSettings.SetSourceSettings( + const Value: TArray); +begin + FSourceSettings.Clear(); + FSourceSettings.AddRange(Value); + SaveSources(); +end; + procedure TDNSettings.SetVersion(const Value: string); begin WriteString(CVersion, Value); diff --git a/Icons/Add.ico b/Icons/Add.ico new file mode 100644 index 0000000000000000000000000000000000000000..9fdc2402812ef65a478772b1a8a35c5734e3c02f GIT binary patch literal 4286 zcmeHKy>1gh5FV5QDNU%7kRncrWU9PCkU&J{ZtXh<0gr(MqU8yY=)zw^LIDE*grtZ> zfggZZh{OvdaY+%feBb)!w27Sa+9%>BYmH~TyYqd!v$H=IxrWcmitt-L-w>G>ky{W{ z$sGvmugc^Rh>!LSUx{dnRa8eKD=bfPyNmvWBMo6Xh(rlLIjnmDY`FSBc0*G4x^zl}-ICbu4w8ml7{JCb}X3WdX z`wVx61}5;{G%FJ4M%@8ac3iE>AAZA?CRj+M#}k^CzFvw>Q2;|NZ=p_so*d zskYuf*qiS|<}%s+6TKy0(OV>Kn+5P6g^Xd0KD^5haknn$e2a9m6>p4z9klk~PK!9T zZGHc-Gr`ZdUl4XdKYhcv2WYf+Uug=pu1^++GHY>!_mrErVipp6jb0p(59UL`9EZke z@Q#Yydav(4@{lJplTNb4y^C@1jlg@_zbk38j&0j~M@_~u+^f-b&u7;-I44a78uzuq zon`p{i*^M%Ki70W4@bPJ)d=VrZu@iA_GYXVv8N(0Pej)Kh*bI_bClmA*C{=bnId5y Riuw_QSi~f@;~-a7{s92B?`r@6 literal 0 HcmV?d00001 diff --git a/Packages/DelphiX-Berlin/Delphinus.Theming.pas b/Packages/DelphiX-Berlin/Delphinus.Theming.pas new file mode 100644 index 0000000..852c5a3 --- /dev/null +++ b/Packages/DelphiX-Berlin/Delphinus.Theming.pas @@ -0,0 +1,42 @@ +unit Delphinus.Theming; + +interface + +uses + SysUtils, + Graphics, + Windows; + +const + CBlendPrimary = 0.87; + CBlendSecondary = 0.54; + CBlendDisabled = 0.38; + CBlendDivider = 0.12; + + CPrimaryColor: TColor = $fe4f30; //$304ffe; + CAccentColor: TColor = $5b18c2;//$c2185b; + +function BlendColor(ABackground, AForeground: TColor; AForegroundAlpha: Single): TColor; + +implementation + +type + TColorRec = packed record + R, G, B, A: Byte; + end; + +function BlendColor(ABackground, AForeground: TColor; AForegroundAlpha: Single): TColor; +var + LBackgroundAlpha: Single; + LBackground, LForeground: TColorRec; +begin + LBackgroundAlpha := 1 - AForegroundAlpha; + LBackground := TColorRec(ColorToRGB(ABackground)); + LForeground := TColorRec(ColorToRGB(AForeground)); + TColorRec(Result).R := Round(LBackground.R * LBackgroundAlpha + LForeground.R * AForegroundAlpha); + TColorRec(Result).G := Round(LBackground.G * LBackgroundAlpha + LForeground.G * AForegroundAlpha); + TColorRec(Result).B := Round(LBackground.B * LBackgroundAlpha + LForeground.B * AForegroundAlpha); + TColorRec(Result).A := Round(LBackground.A * LBackgroundAlpha + LForeground.A * AForegroundAlpha); +end; + +end. diff --git a/Packages/DelphiX-Berlin/Delphinus.dpk b/Packages/DelphiX-Berlin/Delphinus.dpk new file mode 100644 index 0000000..e9b4adc --- /dev/null +++ b/Packages/DelphiX-Berlin/Delphinus.dpk @@ -0,0 +1,194 @@ +package Delphinus; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + rtl, + DesignIDE, + vclimg, + vcl; + +contains + Delphinus.Theming in 'Delphinus.Theming.pas', + Delphinus.About in '..\Delphinus.About.pas' {AboutDialog}, + Delphinus.CategoryFilterView in '..\Delphinus.CategoryFilterView.pas' {CategoryFilterView: TFrame}, + Delphinus.Controller in '..\Delphinus.Controller.pas', + Delphinus.DelphiInstallation.View in '..\Delphinus.DelphiInstallation.View.pas' {DelphiInstallationView: TFrame}, + Delphinus.DependencyDialog in '..\Delphinus.DependencyDialog.pas' {DependencyDialog}, + Delphinus.Dialog in '..\Delphinus.Dialog.pas' {DelphinusDialog}, + Delphinus.Forms in '..\Delphinus.Forms.pas', + Delphinus.LicenseDialog in '..\Delphinus.LicenseDialog.pas' {LicenseDialog}, + Delphinus.Main in '..\Delphinus.Main.pas', + Delphinus.OptionsDialog in '..\Delphinus.OptionsDialog.pas' {DelphinusOptionsDialog}, + Delphinus.OptionsDialog.TypeSelection in '..\Delphinus.OptionsDialog.TypeSelection.pas' {TypeSelectionDialog}, + Delphinus.ProgressDialog in '..\Delphinus.ProgressDialog.pas' {ProgressDialog}, + Delphinus.Resources.Names in '..\Delphinus.Resources.Names.pas', + Delphinus.Resources in '..\Delphinus.Resources.pas', + Delphinus.SetupDialog in '..\Delphinus.SetupDialog.pas' {SetupDialog}, + Delphinus.UiTypes in '..\Delphinus.UiTypes.pas', + Delphinus.Version in '..\Delphinus.Version.pas', + DN.ActiveX in '..\..\DN.ActiveX.pas', + DN.BPLService.Intf in '..\..\DN.BPLService.Intf.pas', + DN.BPLService.Registry in '..\..\DN.BPLService.Registry.pas', + DN.BPLService.ToolsApi in '..\..\DN.BPLService.ToolsApi.pas', + DN.Character in '..\..\DN.Character.pas', + DN.ComCtrls.Helper in '..\..\DN.ComCtrls.Helper.pas', + DN.Compiler.IDE in '..\..\DN.Compiler.IDE.pas', + DN.Compiler.Intf in '..\..\DN.Compiler.Intf.pas', + DN.Compiler.MSBuild in '..\..\DN.Compiler.MSBuild.pas', + DN.Compiler in '..\..\DN.Compiler.pas', + DN.Compiler.ValueOverrides.Factory in '..\..\DN.Compiler.ValueOverrides.Factory.pas', + DN.Compiler.ValueOverrides.Intf in '..\..\DN.Compiler.ValueOverrides.Intf.pas', + DN.Compiler.ValueOverrides in '..\..\DN.Compiler.ValueOverrides.pas', + DN.Controls.Button in '..\..\DN.Controls.Button.pas', + DN.Controls in '..\..\DN.Controls.pas', + DN.DelphiInstallation.Editions in '..\..\DN.DelphiInstallation.Editions.pas', + DN.DelphiInstallation.Intf in '..\..\DN.DelphiInstallation.Intf.pas', + DN.DelphiInstallation in '..\..\DN.DelphiInstallation.pas', + DN.DelphiInstallation.Provider.Intf in '..\..\DN.DelphiInstallation.Provider.Intf.pas', + DN.DelphiInstallation.Provider in '..\..\DN.DelphiInstallation.Provider.pas', + DN.DPRProperties.Intf in '..\..\DN.DPRProperties.Intf.pas', + DN.DPRProperties in '..\..\DN.DPRProperties.pas', + DN.Environment in '..\..\DN.Environment.pas', + DN.EnvironmentOptions.IDE in '..\..\DN.EnvironmentOptions.IDE.pas', + DN.EnvironmentOptions.Intf in '..\..\DN.EnvironmentOptions.Intf.pas', + DN.EnvironmentOptions in '..\..\DN.EnvironmentOptions.pas', + DN.EnvironmentOptions.Registry in '..\..\DN.EnvironmentOptions.Registry.pas', + DN.ExpertService.Intf in '..\..\DN.ExpertService.Intf.pas', + DN.ExpertService in '..\..\DN.ExpertService.pas', + DN.FileService.Intf in '..\..\DN.FileService.Intf.pas', + DN.FileService in '..\..\DN.FileService.pas', + DN.Graphics.Loader in '..\..\DN.Graphics.Loader.pas', + DN.Graphics in '..\..\DN.Graphics.pas', + DN.HttpClient.Cache.Intf in '..\..\DN.HttpClient.Cache.Intf.pas', + DN.HttpClient.Cache in '..\..\DN.HttpClient.Cache.pas', + DN.HttpClient.Intf in '..\..\DN.HttpClient.Intf.pas', + DN.HttpClient in '..\..\DN.HttpClient.pas', + DN.HttpClient.WinHttp in '..\..\DN.HttpClient.WinHttp.pas', + DN.Import.WinHttp in '..\..\DN.Import.WinHttp.pas', + DN.Installer.Delphinus in '..\..\DN.Installer.Delphinus.pas', + DN.Installer.IDE in '..\..\DN.Installer.IDE.pas', + DN.Installer.Intf in '..\..\DN.Installer.Intf.pas', + DN.Installer in '..\..\DN.Installer.pas', + DN.IOUtils in '..\..\DN.IOUtils.pas', + DN.JSon in '..\..\DN.JSon.pas', + DN.JSonFile.CacheInfo in '..\..\DN.JSonFile.CacheInfo.pas', + DN.JSonFile.Info in '..\..\DN.JSonFile.Info.pas', + DN.JSonFile.Installation in '..\..\DN.JSonFile.Installation.pas', + DN.JSonFile.InstalledInfo in '..\..\DN.JSonFile.InstalledInfo.pas', + DN.JSonFile in '..\..\DN.JSonFile.pas', + DN.JSonFile.Uninstallation in '..\..\DN.JSonFile.Uninstallation.pas', + DN.Package.Dependency.Intf in '..\..\DN.Package.Dependency.Intf.pas', + DN.Package.Dependency in '..\..\DN.Package.Dependency.pas', + DN.Package.DirectoryLoader.Intf in '..\..\DN.Package.DirectoryLoader.Intf.pas', + DN.Package.DirectoryLoader in '..\..\DN.Package.DirectoryLoader.pas', + DN.Package.Finder.Intf in '..\..\DN.Package.Finder.Intf.pas', + DN.Package.Finder in '..\..\DN.Package.Finder.pas', + DN.Package.Github in '..\..\DN.Package.Github.pas', + DN.Package.Gitlab in '..\..\DN.Package.Gitlab.pas', + DN.Package.Intf in '..\..\DN.Package.Intf.pas', + DN.Package in '..\..\DN.Package.pas', + DN.Package.Version.Finder.Intf in '..\..\DN.Package.Version.Finder.Intf.pas', + DN.Package.Version.Finder in '..\..\DN.Package.Version.Finder.pas', + DN.Package.Version.Intf in '..\..\DN.Package.Version.Intf.pas', + DN.Package.Version in '..\..\DN.Package.Version.pas', + DN.PackageDetailView in '..\..\DN.PackageDetailView.pas' {PackageDetailView: TFrame}, + DN.PackageFilter in '..\..\DN.PackageFilter.pas', + DN.PackageOverview in '..\..\DN.PackageOverview.pas', + DN.PackageProvider.Folder in '..\..\DN.PackageProvider.Folder.pas', + DN.PackageProvider.GitHub in '..\..\DN.PackageProvider.GitHub.pas', + DN.PackageProvider.GitHub.State in '..\..\DN.PackageProvider.GitHub.State.pas', + DN.PackageProvider.GitHubRepo in '..\..\DN.PackageProvider.GitHubRepo.pas', + DN.PackageProvider.GitLab in '..\..\DN.PackageProvider.GitLab.pas', + DN.PackageProvider.GitLab.State in '..\..\DN.PackageProvider.GitLab.State.pas', + DN.PackageProvider.Installed in '..\..\DN.PackageProvider.Installed.pas', + DN.PackageProvider.Intf in '..\..\DN.PackageProvider.Intf.pas', + DN.PackageProvider.MultiSource in '..\..\DN.PackageProvider.MultiSource.pas', + DN.PackageProvider in '..\..\DN.PackageProvider.pas', + DN.PackageProvider.State.Intf in '..\..\DN.PackageProvider.State.Intf.pas', + DN.PackageProvider.State in '..\..\DN.PackageProvider.State.pas', + DN.PackageSource.ConfigPage.Folder in '..\..\DN.PackageSource.ConfigPage.Folder.pas' {DNFolderConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Github in '..\..\DN.PackageSource.ConfigPage.Github.pas' {DNGithubSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Gitlab in '..\..\DN.PackageSource.ConfigPage.Gitlab.pas' {DNGitlabSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Intf in '..\..\DN.PackageSource.ConfigPage.Intf.pas', + DN.PackageSource.ConfigPage in '..\..\DN.PackageSource.ConfigPage.pas', + DN.PackageSource.Folder in '..\..\DN.PackageSource.Folder.pas', + DN.PackageSource.Github in '..\..\DN.PackageSource.Github.pas', + DN.PackageSource.Gitlab in '..\..\DN.PackageSource.Gitlab.pas', + DN.PackageSource.Intf in '..\..\DN.PackageSource.Intf.pas', + DN.PackageSource in '..\..\DN.PackageSource.pas', + DN.PackageSource.Registry.Intf in '..\..\DN.PackageSource.Registry.Intf.pas', + DN.PackageSource.Registry in '..\..\DN.PackageSource.Registry.pas', + DN.PackageSource.Settings.Field.Intf in '..\..\DN.PackageSource.Settings.Field.Intf.pas', + DN.PackageSource.Settings.Field in '..\..\DN.PackageSource.Settings.Field.pas', + DN.PackageSource.Settings.Folder in '..\..\DN.PackageSource.Settings.Folder.pas', + DN.PackageSource.Settings.Github in '..\..\DN.PackageSource.Settings.Github.pas', + DN.PackageSource.Settings.Gitlab in '..\..\DN.PackageSource.Settings.Gitlab.pas', + DN.PackageSource.Settings.Intf in '..\..\DN.PackageSource.Settings.Intf.pas', + DN.PackageSource.Settings in '..\..\DN.PackageSource.Settings.pas', + DN.Preview in '..\..\DN.Preview.pas', + DN.Progress.Intf in '..\..\DN.Progress.Intf.pas', + DN.Progress in '..\..\DN.Progress.pas', + DN.ProjectGroupInfo.Intf in '..\..\DN.ProjectGroupInfo.Intf.pas', + DN.ProjectGroupInfo in '..\..\DN.ProjectGroupInfo.pas', + DN.ProjectInfo.Intf in '..\..\DN.ProjectInfo.Intf.pas', + DN.ProjectInfo in '..\..\DN.ProjectInfo.pas', + DN.Settings.Intf in '..\..\DN.Settings.Intf.pas', + DN.Settings in '..\..\DN.Settings.pas', + DN.Setup.Core in '..\..\DN.Setup.Core.pas', + DN.Setup.Dependency.Intf in '..\..\DN.Setup.Dependency.Intf.pas', + DN.Setup.Dependency in '..\..\DN.Setup.Dependency.pas', + DN.Setup.Dependency.Processor.Intf in '..\..\DN.Setup.Dependency.Processor.Intf.pas', + DN.Setup.Dependency.Processor in '..\..\DN.Setup.Dependency.Processor.pas', + DN.Setup.Dependency.Resolver.Install in '..\..\DN.Setup.Dependency.Resolver.Install.pas', + DN.Setup.Dependency.Resolver.Intf in '..\..\DN.Setup.Dependency.Resolver.Intf.pas', + DN.Setup.Dependency.Resolver.UnInstall in '..\..\DN.Setup.Dependency.Resolver.UnInstall.pas', + DN.Setup.Intf in '..\..\DN.Setup.Intf.pas', + DN.Setup in '..\..\DN.Setup.pas', + DN.TextTable.Intf in '..\..\DN.TextTable.Intf.pas', + DN.TextTable in '..\..\DN.TextTable.pas', + DN.ToolsApi in '..\..\DN.ToolsApi.pas', + DN.Types in '..\..\DN.Types.pas', + DN.Uninstaller.Delphinus in '..\..\DN.Uninstaller.Delphinus.pas', + DN.Uninstaller.IDE in '..\..\DN.Uninstaller.IDE.pas', + DN.Uninstaller.Intf in '..\..\DN.Uninstaller.Intf.pas', + DN.Uninstaller in '..\..\DN.Uninstaller.pas', + DN.Utils in '..\..\DN.Utils.pas', + DN.VariableResolver.Compiler.Factory in '..\..\DN.VariableResolver.Compiler.Factory.pas', + DN.VariableResolver.Compiler in '..\..\DN.VariableResolver.Compiler.pas', + DN.VariableResolver.Intf in '..\..\DN.VariableResolver.Intf.pas', + DN.VariableResolver in '..\..\DN.VariableResolver.pas', + DN.Version in '..\..\DN.Version.pas', + DN.Zip in '..\..\DN.Zip.pas'; + +end. + + + + diff --git a/Packages/DelphiX-Berlin/Delphinus.dproj b/Packages/DelphiX-Berlin/Delphinus.dproj new file mode 100644 index 0000000..206d39f --- /dev/null +++ b/Packages/DelphiX-Berlin/Delphinus.dproj @@ -0,0 +1,704 @@ + + + {0990B172-C221-4312-816E-1E634AF7EE2C} + Delphinus.dpk + 18.2 + VCL + True + Debug + Win32 + 1 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + ..;$(DCC_UnitSearchPath) + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + Delphinus + true + true + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + + + rtl;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;$(DCC_UsePackage) + + + rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + $(BDS)\bin\bds.exe + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + + + +
AboutDialog
+ dfm +
+ +
CategoryFilterView
+ dfm + TFrame +
+ + +
DelphiInstallationView
+ dfm + TFrame +
+ +
DependencyDialog
+ dfm +
+ +
DelphinusDialog
+ dfm +
+ + +
LicenseDialog
+ dfm +
+ + +
DelphinusOptionsDialog
+ dfm +
+ +
TypeSelectionDialog
+ dfm +
+ +
ProgressDialog
+ dfm +
+ + + +
SetupDialog
+ dfm +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageDetailView
+ dfm + TFrame +
+ + + + + + + + + + + + + + + +
DNFolderConfigPage
+ dfm + TFrame +
+ +
DNGithubSourceConfigPage
+ dfm + TFrame +
+ +
DNGitlabSourceConfigPage
+ dfm + TFrame +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DelphinusImages.res
+
+ +
Delphinus.res
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Package + + + + Delphinus.dpk + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + Delphinus.bpl + true + + + + + 0 + .dll;.bpl + + + 1 + .dylib + + + + + Contents\Resources + 1 + + + + + classes + 1 + + + + + Contents\MacOS + 0 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + library\lib\mips + 1 + + + + + 1 + + + 1 + + + 0 + + + 1 + + + 1 + + + library\lib\armeabi-v7a + 1 + + + 1 + + + + + 0 + + + 1 + .framework + + + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + 1 + + + + + + library\lib\armeabi + 1 + + + + + 0 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-large + 1 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + res\drawable-hdpi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + + + Assets + 1 + + + Assets + 1 + + + + + 1 + + + 1 + + + 1 + + + + + res\values + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + res\drawable + 1 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 0 + .bpl + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\drawable-ldpi + 1 + + + + + + + + + + + + + + False + True + False + + + 12 + + + + +
diff --git a/Packages/DelphiX-Berlin/Delphinus.res b/Packages/DelphiX-Berlin/Delphinus.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/Packages/DelphiX-Berlin/DelphinusImages.res b/Packages/DelphiX-Berlin/DelphinusImages.res new file mode 100644 index 0000000000000000000000000000000000000000..a1219957d920981bb83075d905dc9759ef667383 GIT binary patch literal 112664 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 literal 0 HcmV?d00001 diff --git a/Packages/DelphiX-Rio/Delphinus.Theming.pas b/Packages/DelphiX-Rio/Delphinus.Theming.pas new file mode 100644 index 0000000..852c5a3 --- /dev/null +++ b/Packages/DelphiX-Rio/Delphinus.Theming.pas @@ -0,0 +1,42 @@ +unit Delphinus.Theming; + +interface + +uses + SysUtils, + Graphics, + Windows; + +const + CBlendPrimary = 0.87; + CBlendSecondary = 0.54; + CBlendDisabled = 0.38; + CBlendDivider = 0.12; + + CPrimaryColor: TColor = $fe4f30; //$304ffe; + CAccentColor: TColor = $5b18c2;//$c2185b; + +function BlendColor(ABackground, AForeground: TColor; AForegroundAlpha: Single): TColor; + +implementation + +type + TColorRec = packed record + R, G, B, A: Byte; + end; + +function BlendColor(ABackground, AForeground: TColor; AForegroundAlpha: Single): TColor; +var + LBackgroundAlpha: Single; + LBackground, LForeground: TColorRec; +begin + LBackgroundAlpha := 1 - AForegroundAlpha; + LBackground := TColorRec(ColorToRGB(ABackground)); + LForeground := TColorRec(ColorToRGB(AForeground)); + TColorRec(Result).R := Round(LBackground.R * LBackgroundAlpha + LForeground.R * AForegroundAlpha); + TColorRec(Result).G := Round(LBackground.G * LBackgroundAlpha + LForeground.G * AForegroundAlpha); + TColorRec(Result).B := Round(LBackground.B * LBackgroundAlpha + LForeground.B * AForegroundAlpha); + TColorRec(Result).A := Round(LBackground.A * LBackgroundAlpha + LForeground.A * AForegroundAlpha); +end; + +end. diff --git a/Packages/DelphiX-Rio/Delphinus.dpk b/Packages/DelphiX-Rio/Delphinus.dpk new file mode 100644 index 0000000..f62706a --- /dev/null +++ b/Packages/DelphiX-Rio/Delphinus.dpk @@ -0,0 +1,193 @@ +package Delphinus; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + rtl, + DesignIDE, + vclimg, + vcl; + +contains + Delphinus.Main in '..\Delphinus.Main.pas', + Delphinus.Controller in '..\Delphinus.Controller.pas', + Delphinus.Dialog in '..\Delphinus.Dialog.pas' {DelphinusDialog}, + Delphinus.SetupDialog in '..\Delphinus.SetupDialog.pas' {SetupDialog}, + Delphinus.UiTypes in '..\Delphinus.UiTypes.pas', + Delphinus.Forms in '..\Delphinus.Forms.pas', + Delphinus.Resources.Names in '..\Delphinus.Resources.Names.pas', + Delphinus.OptionsDialog in '..\Delphinus.OptionsDialog.pas' {DelphinusOptionsDialog}, + Delphinus.Version in '..\Delphinus.Version.pas', + Delphinus.LicenseDialog in '..\Delphinus.LicenseDialog.pas' {LicenseDialog}, + Delphinus.CategoryFilterView in '..\Delphinus.CategoryFilterView.pas' {CategoryFilterView: TFrame}, + Delphinus.ProgressDialog in '..\Delphinus.ProgressDialog.pas' {ProgressDialog}, + Delphinus.Theming in 'Delphinus.Theming.pas', + Delphinus.Resources in '..\Delphinus.Resources.pas', + Delphinus.About in '..\Delphinus.About.pas' {AboutDialog}, + Delphinus.DependencyDialog in '..\Delphinus.DependencyDialog.pas' {DependencyDialog}, + Delphinus.OptionsDialog.TypeSelection in '..\Delphinus.OptionsDialog.TypeSelection.pas' {TypeSelectionDialog}, + DN.ActiveX in '..\..\DN.ActiveX.pas', + DN.BPLService.Intf in '..\..\DN.BPLService.Intf.pas', + DN.BPLService.Registry in '..\..\DN.BPLService.Registry.pas', + DN.BPLService.ToolsApi in '..\..\DN.BPLService.ToolsApi.pas', + DN.Character in '..\..\DN.Character.pas', + DN.ComCtrls.Helper in '..\..\DN.ComCtrls.Helper.pas', + DN.Compiler.IDE in '..\..\DN.Compiler.IDE.pas', + DN.Compiler.Intf in '..\..\DN.Compiler.Intf.pas', + DN.Compiler.MSBuild in '..\..\DN.Compiler.MSBuild.pas', + DN.Compiler in '..\..\DN.Compiler.pas', + DN.Compiler.ValueOverrides.Factory in '..\..\DN.Compiler.ValueOverrides.Factory.pas', + DN.Compiler.ValueOverrides.Intf in '..\..\DN.Compiler.ValueOverrides.Intf.pas', + DN.Compiler.ValueOverrides in '..\..\DN.Compiler.ValueOverrides.pas', + DN.Controls.Button in '..\..\DN.Controls.Button.pas', + DN.Controls in '..\..\DN.Controls.pas', + DN.DelphiInstallation.Editions in '..\..\DN.DelphiInstallation.Editions.pas', + DN.DelphiInstallation.Intf in '..\..\DN.DelphiInstallation.Intf.pas', + DN.DelphiInstallation in '..\..\DN.DelphiInstallation.pas', + DN.DelphiInstallation.Provider.Intf in '..\..\DN.DelphiInstallation.Provider.Intf.pas', + DN.DelphiInstallation.Provider in '..\..\DN.DelphiInstallation.Provider.pas', + DN.DPRProperties.Intf in '..\..\DN.DPRProperties.Intf.pas', + DN.DPRProperties in '..\..\DN.DPRProperties.pas', + DN.Environment in '..\..\DN.Environment.pas', + DN.EnvironmentOptions.IDE in '..\..\DN.EnvironmentOptions.IDE.pas', + DN.EnvironmentOptions.Intf in '..\..\DN.EnvironmentOptions.Intf.pas', + DN.EnvironmentOptions in '..\..\DN.EnvironmentOptions.pas', + DN.EnvironmentOptions.Registry in '..\..\DN.EnvironmentOptions.Registry.pas', + DN.ExpertService.Intf in '..\..\DN.ExpertService.Intf.pas', + DN.ExpertService in '..\..\DN.ExpertService.pas', + DN.FileService.Intf in '..\..\DN.FileService.Intf.pas', + DN.FileService in '..\..\DN.FileService.pas', + DN.Graphics.Loader in '..\..\DN.Graphics.Loader.pas', + DN.Graphics in '..\..\DN.Graphics.pas', + DN.HttpClient.Cache.Intf in '..\..\DN.HttpClient.Cache.Intf.pas', + DN.HttpClient.Cache in '..\..\DN.HttpClient.Cache.pas', + DN.HttpClient.Intf in '..\..\DN.HttpClient.Intf.pas', + DN.HttpClient in '..\..\DN.HttpClient.pas', + DN.HttpClient.WinHttp in '..\..\DN.HttpClient.WinHttp.pas', + DN.Import.WinHttp in '..\..\DN.Import.WinHttp.pas', + DN.Installer.Delphinus in '..\..\DN.Installer.Delphinus.pas', + DN.Installer.IDE in '..\..\DN.Installer.IDE.pas', + DN.Installer.Intf in '..\..\DN.Installer.Intf.pas', + DN.Installer in '..\..\DN.Installer.pas', + DN.IOUtils in '..\..\DN.IOUtils.pas', + DN.JSon in '..\..\DN.JSon.pas', + DN.JSonFile.CacheInfo in '..\..\DN.JSonFile.CacheInfo.pas', + DN.JSonFile.Info in '..\..\DN.JSonFile.Info.pas', + DN.JSonFile.Installation in '..\..\DN.JSonFile.Installation.pas', + DN.JSonFile.InstalledInfo in '..\..\DN.JSonFile.InstalledInfo.pas', + DN.JSonFile in '..\..\DN.JSonFile.pas', + DN.JSonFile.Uninstallation in '..\..\DN.JSonFile.Uninstallation.pas', + DN.Package.Dependency.Intf in '..\..\DN.Package.Dependency.Intf.pas', + DN.Package.Dependency in '..\..\DN.Package.Dependency.pas', + DN.Package.DirectoryLoader.Intf in '..\..\DN.Package.DirectoryLoader.Intf.pas', + DN.Package.DirectoryLoader in '..\..\DN.Package.DirectoryLoader.pas', + DN.Package.Finder.Intf in '..\..\DN.Package.Finder.Intf.pas', + DN.Package.Finder in '..\..\DN.Package.Finder.pas', + DN.Package.Github in '..\..\DN.Package.Github.pas', + DN.Package.Intf in '..\..\DN.Package.Intf.pas', + DN.Package in '..\..\DN.Package.pas', + DN.Package.Version.Finder.Intf in '..\..\DN.Package.Version.Finder.Intf.pas', + DN.Package.Version.Finder in '..\..\DN.Package.Version.Finder.pas', + DN.Package.Version.Intf in '..\..\DN.Package.Version.Intf.pas', + DN.Package.Version in '..\..\DN.Package.Version.pas', + DN.PackageDetailView in '..\..\DN.PackageDetailView.pas' {PackageDetailView: TFrame}, + DN.PackageFilter in '..\..\DN.PackageFilter.pas', + DN.PackageOverview in '..\..\DN.PackageOverview.pas', + DN.PackageProvider.Folder in '..\..\DN.PackageProvider.Folder.pas', + DN.PackageProvider.GitHub in '..\..\DN.PackageProvider.GitHub.pas', + DN.PackageProvider.GitHub.State in '..\..\DN.PackageProvider.GitHub.State.pas', + DN.PackageProvider.GitHubRepo in '..\..\DN.PackageProvider.GitHubRepo.pas', + DN.PackageProvider.GitLab in '..\..\DN.PackageProvider.GitLab.pas', + DN.PackageProvider.GitLab.State in '..\..\DN.PackageProvider.GitLab.State.pas', + DN.PackageProvider.Installed in '..\..\DN.PackageProvider.Installed.pas', + DN.PackageProvider.Intf in '..\..\DN.PackageProvider.Intf.pas', + DN.PackageProvider.MultiSource in '..\..\DN.PackageProvider.MultiSource.pas', + DN.PackageProvider in '..\..\DN.PackageProvider.pas', + DN.PackageProvider.State.Intf in '..\..\DN.PackageProvider.State.Intf.pas', + DN.PackageProvider.State in '..\..\DN.PackageProvider.State.pas', + DN.PackageSource.ConfigPage.Folder in '..\..\DN.PackageSource.ConfigPage.Folder.pas' {DNFolderConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Github in '..\..\DN.PackageSource.ConfigPage.Github.pas' {DNGithubSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Gitlab in '..\..\DN.PackageSource.ConfigPage.Gitlab.pas' {DNGitlabSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Intf in '..\..\DN.PackageSource.ConfigPage.Intf.pas', + DN.PackageSource.ConfigPage in '..\..\DN.PackageSource.ConfigPage.pas', + DN.PackageSource.Folder in '..\..\DN.PackageSource.Folder.pas', + DN.PackageSource.Github in '..\..\DN.PackageSource.Github.pas', + DN.PackageSource.Intf in '..\..\DN.PackageSource.Intf.pas', + DN.PackageSource in '..\..\DN.PackageSource.pas', + DN.PackageSource.Registry.Intf in '..\..\DN.PackageSource.Registry.Intf.pas', + DN.PackageSource.Registry in '..\..\DN.PackageSource.Registry.pas', + DN.PackageSource.Settings.Field.Intf in '..\..\DN.PackageSource.Settings.Field.Intf.pas', + DN.PackageSource.Settings.Field in '..\..\DN.PackageSource.Settings.Field.pas', + DN.PackageSource.Settings.Folder in '..\..\DN.PackageSource.Settings.Folder.pas', + DN.PackageSource.Settings.Github in '..\..\DN.PackageSource.Settings.Github.pas', + DN.PackageSource.Settings.Gitlab in '..\..\DN.PackageSource.Settings.Gitlab.pas', + DN.PackageSource.Settings.Intf in '..\..\DN.PackageSource.Settings.Intf.pas', + DN.PackageSource.Settings in '..\..\DN.PackageSource.Settings.pas', + DN.Preview in '..\..\DN.Preview.pas', + DN.Progress.Intf in '..\..\DN.Progress.Intf.pas', + DN.Progress in '..\..\DN.Progress.pas', + DN.ProjectGroupInfo.Intf in '..\..\DN.ProjectGroupInfo.Intf.pas', + DN.ProjectGroupInfo in '..\..\DN.ProjectGroupInfo.pas', + DN.ProjectInfo.Intf in '..\..\DN.ProjectInfo.Intf.pas', + DN.ProjectInfo in '..\..\DN.ProjectInfo.pas', + DN.Settings.Intf in '..\..\DN.Settings.Intf.pas', + DN.Settings in '..\..\DN.Settings.pas', + DN.Setup.Core in '..\..\DN.Setup.Core.pas', + DN.Setup.Dependency.Intf in '..\..\DN.Setup.Dependency.Intf.pas', + DN.Setup.Dependency in '..\..\DN.Setup.Dependency.pas', + DN.Setup.Dependency.Processor.Intf in '..\..\DN.Setup.Dependency.Processor.Intf.pas', + DN.Setup.Dependency.Processor in '..\..\DN.Setup.Dependency.Processor.pas', + DN.Setup.Dependency.Resolver.Install in '..\..\DN.Setup.Dependency.Resolver.Install.pas', + DN.Setup.Dependency.Resolver.Intf in '..\..\DN.Setup.Dependency.Resolver.Intf.pas', + DN.Setup.Dependency.Resolver.UnInstall in '..\..\DN.Setup.Dependency.Resolver.UnInstall.pas', + DN.Setup.Intf in '..\..\DN.Setup.Intf.pas', + DN.Setup in '..\..\DN.Setup.pas', + DN.TextTable.Intf in '..\..\DN.TextTable.Intf.pas', + DN.TextTable in '..\..\DN.TextTable.pas', + DN.ToolsApi in '..\..\DN.ToolsApi.pas', + DN.Types in '..\..\DN.Types.pas', + DN.Uninstaller.Delphinus in '..\..\DN.Uninstaller.Delphinus.pas', + DN.Uninstaller.IDE in '..\..\DN.Uninstaller.IDE.pas', + DN.Uninstaller.Intf in '..\..\DN.Uninstaller.Intf.pas', + DN.Uninstaller in '..\..\DN.Uninstaller.pas', + DN.Utils in '..\..\DN.Utils.pas', + DN.VariableResolver.Compiler.Factory in '..\..\DN.VariableResolver.Compiler.Factory.pas', + DN.VariableResolver.Compiler in '..\..\DN.VariableResolver.Compiler.pas', + DN.VariableResolver.Intf in '..\..\DN.VariableResolver.Intf.pas', + DN.VariableResolver in '..\..\DN.VariableResolver.pas', + DN.Version in '..\..\DN.Version.pas', + DN.Zip in '..\..\DN.Zip.pas', + DN.Package.Gitlab in '..\..\DN.Package.Gitlab.pas', + DN.PackageSource.Gitlab in '..\..\DN.PackageSource.Gitlab.pas'; + +end. + + + + diff --git a/Packages/DelphiX-Rio/Delphinus.dproj b/Packages/DelphiX-Rio/Delphinus.dproj new file mode 100644 index 0000000..6941ad7 --- /dev/null +++ b/Packages/DelphiX-Rio/Delphinus.dproj @@ -0,0 +1,1120 @@ + + + {0990B172-C221-4312-816E-1E634AF7EE2C} + Delphinus.dpk + 18.8 + VCL + True + Debug + Win32 + 1 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + ..;$(DCC_UnitSearchPath) + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + Delphinus + true + true + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + + + rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + $(BDS)\bin\bds.exe + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + + + + +
DelphinusDialog
+
+ +
SetupDialog
+
+ + + + +
DelphinusOptionsDialog
+
+ + +
LicenseDialog
+
+ +
CategoryFilterView
+ TFrame +
+ +
ProgressDialog
+
+ + + +
AboutDialog
+
+ +
DependencyDialog
+ dfm +
+ +
TypeSelectionDialog
+ dfm +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageDetailView
+ dfm + TFrame +
+ + + + + + + + + + + + + + + +
DNFolderConfigPage
+ dfm + TFrame +
+ +
DNGithubSourceConfigPage
+ dfm + TFrame +
+ +
DNGitlabSourceConfigPage
+ dfm + TFrame +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DelphinusImages.res
+
+ +
Delphinus.res
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Package + + + + Delphinus.dpk + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + Delphinus.bpl + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + True + False + + + 12 + + + + +
diff --git a/Packages/DelphiX-Rio/Delphinus.res b/Packages/DelphiX-Rio/Delphinus.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/Packages/DelphiX-Rio/DelphinusImages.res b/Packages/DelphiX-Rio/DelphinusImages.res new file mode 100644 index 0000000000000000000000000000000000000000..a1219957d920981bb83075d905dc9759ef667383 GIT binary patch literal 112664 zcmeHQ2UrwW*B%7LsEH*-V^mNRYl=y%iBY835IeC8_E?fwQfvsu4%nlyqlrC&1zVy< z6uT(K26pU9uL2hC|DM^s%P`FD&KC6hzMt_q-aGf6^SPjZJ}c$)|Dw^Z^xBtAyWZT4`L%C34%9l{u7V%MUM4S7dd)E#%jfz$}IIYb#c{! zX^X2~gD^dEjd)Gvd9v8Car$r7g7jeKY}PqX^S13D{)*~@V{ZqM=D0p#!TWE>IkbIg(BJG+ z^B9RSo|HvZM@aE6`PD6!_FL6s#_X8(Fs7Hjxaz3~ODmS(95j}V*-$+{)aa&Q403$* zdp|Wcrr@V9uGWv^qdh-b9sf7SpK|f5jkY#E#_A6oKW&j?H#PXC=wPgSar~4;)!$cR zo4IQM%iJ@>==c<|eyjc=$EOr!`wVep{P7j~U`erg9&5*9gLeAYX&oQN;tIA|u;rN2G<`|cPq0oLw}2z^$!}E~ zN-^d6)J4^rVy(Dq21i`-;%csPJf(ASy;xLjiCPYdNyegT4V179m8EI=+|czg(wys~ zoHO_OUiAl>m&8kRMy~fN&M|2OHkk=Ig0GMzI0(r?X(2|i7s4>aNc?d3q))<7M>;X0 z*o(G=L0E)I*l(dxbR)yq8$uhwMd%=S2`vO?q@DtwB=scsZFIM0BUHex8~zvQF3(2T zSVqv^3(~!wX4=Z{^&G+B1mX93ey}M#j7Q+3Lg?Gix*o`IX~;3hvVW3cpRB-tIna$o z&uhb?=ex6*RXthw@X9QDPD^$LejFKIiCtUNLB9_c@@F0kWM?PU7x6F7a$*nG4`io) zuEV0he{p6D(Wh&RJF-Z>hAivk-28r6$WJkj^lQM<4^LwJ8dm^+OQbe{VqS+2C+!L|Rz&>>7P!NP!Qw|?Kta?wRkY73evuDp{ z%a$!;At50q_l-5;zi81S*1LCaHg4QFHfho%Hgo1oMn2Iv2@MT3=#w@0fBEGXHhubZ zHe<#N_Uo^|vVQ&gv8hw1ihfW&ARs`m50>&DIB**$_^Exw zy>;tW=I7_fwr}6gHg4Q#l$(692LFy7JJ^pu{>a9UA1{src^eI#TZ5nQckbLN_Pv^z zOZ~AHzZBDyye0fwwrpXmSFbin$VTd)CH(&W{%q*bp(Y8f3)bS7;+UJar2RobL5yNx zija-e*Z*dIX*6)y1PXt&&(s5=kKj+5SGigsm&aXE9()QoEb4P5qsoeAzgq&X*3qyI% zfA{WPrtNc++RguZv4sEO!-p(9JeS zw~?l#ix?~vV?k{uKP2&x>dN!d_7aB94_Qp*c62Va<#CqAL*6e^3?*A$uLc7;;`kw6 zZYNJQZBZUyq)Qlb8~M2!9l1?Gp7ZY^JbWk!;o-PPm?8)<_JWXHS`e}vG(veQqq^gF z1tBSu)-{bNJqPC^w8L|7U9g^Mj{Iv`8O$Gg4vtnaJK3IZQPD`gmN}x-3BuR1!sp-+ z3^R^)p>$Q!938i|E72*WU6qboJ?bL=841qoQW-?|oV(P9+gg$WuL8J!hunZ9L0&+Z zR-S9isP1=<9qn}Mu(_PB`?`y!9kzMA({Zc&5(yXQG?xC>Ik@dR1k&}-jwZR`5$d7k zZr2gK31)C}-xAtyZ`Yo{IHoa2I&N(vs(`b-mN&-&e$f^&>_DJu^QNE_y|sktbWS7QU6--uh^ z-0T$6=3SLI?5D6X{B~K)tF<#UH-SO(TUA?rI5<+rPkFU=&|9Mve_FdxN9%_wEDQK= zNY_d33(6e8o%|B`lfYGl^YRpBAA(!Drt0EAaMQI!$0^OzI5+hm8!3h?{~71yDe7M-|ErGws~&$?8(-r5^U&R=@cyS1W8e?j zIMF+XXq@wd@@nl6=e1H!X}-%A_X1yk+wJtIDCOjNe*MART&|`q=3Rf>mlB_$dy!5d z9_7KGsKy5qbm&^1fNN`c-d;m#=iqi-Ou$yv_u%eih?Cc~+S^Ucf}igFRAC#?X#r4_)*DMeE`-}1p zNOkKPpU=vOg{3?Kd<|#Gr5Ove6}KpIut)n`vsdeoEC{7ZVg$jSBuo%&4GHOxa69bv zIuI6NirXK=L0sB{_Cn~(y?OV1U3I&<`S(Gjd%8ts`yj=Dlz&gx5oJ!0!hH|~;eX_4 z;*|0}_E>+Q{pUt5=|Q4U-Z_0F)fH4T8@QzR#vX4Z-{&=uMmBIx^|qED4cyY}spMrc zpCZZD5z5sD{}KV>}k>}rJOMzFt_^Y<8I@b!G7`2 z;&}N|sv{kJ_6?oWMi}Eq+{2aZ3HR2W7vj}p&f@HR98^XJ=@{@K(hxt^l8?ciq{KgZ zLMD6uT%-{Hlls89se*J!R|x}UFB-a}>U{@JBbT)9dhA5Jne(z(d_s=MpN-}&TAs~_ zJ2g#HMyb>4ZY_?#K7Pc1zLZN}o_t8p(6pI? zK|ZMDrZ_6@gON{a`H3qlOY8>mKZ*nOg+70!<@EWWzV>76kC*By<%yg3H~GNhz{i7< zjkFBc$r<|ijg3DkHy>-#@u12F18czNuIV4a*957*JWp#2KPcW~C+Dt1l&3O&=v$+3 zEy}9z{KVk9O)v)baZYK<*B?1I*Wo@`vi?xNXzw!=#}fHqU~LiW46J?lY&vz2zP{I$ z`>`Up=5OTfvR2y2IW4$J6Q=6zYntn?@;YpuKN)F+scWN(3_ibh1=ln4_$2opB1UTN z2Z<`Uxk^LV^q#mEh_Jwi%ear~&+*Jj8#^UAf`53&Fz zcE3ZO^8F7=jqQODC+&mOhe-E9T=6srJ>k|>_f!a;_sREuB`OYPVWG3VF?BOV8S&qsg%sk#P3Z??pqaF%H0DbjTiic4n*4Pm9D zH3~UDPj8_tTU&k<=|0F`kU9|Bv({|nA%mj`q2y?Z{0oR7Te3;f>WoGz zKMtV4kUg)9gky<&9G#nDvT=RTe43Ls-G!kPg2zN^(NT{d5KpP!-*Ru{-&pHaN@%(Ok z;Zva@>gmY8rb(Z5vzP7hYCACPcPdCKoq$&U(J7T7_2C3-YQ7DDJ+Vd+6PGuaR+r#ycY_4IjWm`pDY=glBAUbjM4KsrE7ox}TK zBj=Q#r$dMS4tOZjrN3)Fh3u7-|AYJ+5VZ%*c{!gc=j7W;$P&nJkhzc%5E?IB-bG&D zQ4$r@r>1b4qkBT111KN=68J+6@Y|#Aij{oG0#1$$>jlo~?-)ZzBUC>uq8Mv&{c10GvEYJoS+8r)ipXCA>Gjn()tIAU;7#C($#xy3%}w9R9W=jK-BjQP+Z zq+LHH?p`~)G2bH-MWMW0$5_2qpZ+c}ct9^)irsftPj>YF5q=5LrBp_B#_FY5$kY9d z-lP4N_8&uszFRD|kJ=RfBu>XE&m?Chv4qS7d9m(1DKk;@kK-YI(P5kWSNa@iAL8C! zqRS54-mk;DnS6sS`*#WZ?c5@EB_Uc@&NKSzDNa&MT08aeqizD%_1w{!Jr0qygu~Cc3u6! z+XwR1FFm(dS3mv46kR>W_ZmfV6zb#uX-ieo338Qze*oJ z#>RM#PceS_T=P)jz0|v`duUf32i4t5zNy21kaj;`J@pwsWbvP&k6%9icHIc&5R80S zePN|2w^QgYG4G+Tp2je5lQz}626Wig_9N)%zVA+LCR}|-Y(^}jw(C0{XFO)owgWp0 zLVI3%57h62=zJz0C=R?Yh>PY0wTrNg)l0FEH@NvB6xBLzZS4p@_L$*AINsy%p(3amh1&k0 zxoNCVaR1;z&j=LAf$uTCrClc{!k2}(p8bZ@m*y?Lb7yS7r9gZt1T{Ybd9EG*ACxhYrkk@4UAtl6s6z+$ZKQ8{0ELY6=x%-NFV}q8q}N}*qqC4iVuWsjDJ8cw=ebaj~d*Z9sDytw^|j;-`!Hq* zxVKc&#hi1>Q+<6QVglP3Kh-PEfuVg}#6G5eCXw^`pV!OpthRIPnaCvSZZhv@Hm^wuV(CXzr4Mjii0PUb19`J z@@Enz$5)dM=;=03iI<@_qmtft293Eon%8u0%!AnASxp6}4T{|L`>i0?r% zB_(?$!A)Ot5b zNrOc7@85p|%4+rP+jn#qj}}ay?ZANpD?vYU!NmS7dhI}#v|}KXHdViPzK9(-s^nLIMY{C%Xpb6T%rbsQ=9Y0|qoxvWJgNeMk3W={xh=ay;?_J}g(V zNBK{i{FS-6ebm|k3_M5l*e~3(z_2~V13dIRalQj>9~3mTzoy-PkIdVC?fKbNqW=f- z8KVI9j*~_Y$h!3V0G1Wz!?Mq>VOhuhS@zkbqEH)FPU+8}=c{B-WfX&{KlEb{wjhSP zzhRmGjAc*${!WZ3^$TqOA|8GAGy{%$GJtZ;vqNAG_(^*9*#R_nt7-P<1WpXh!hU}4)M{=c;i5AbzA z9MHSX!C9*2j5*P94-aq!&pyaA2-7Ff3vY9HmeoFQYkhErBe?eH<8B8(8YQZka5dPz=6eblz zx^2P((g@QaskV}yH)wmgFTPUG5Wj#%_9|9=J2yNhXag0Zvk$a zV@BI!M*9gf(oi3?Jv8$p=p+;v|KWhFc86!_ecnb~*HpBf{4=xt)CVK<#h}fR!0~F@ zZV7+e@IbwvaRGOJ!Se^`ectRP@#}rw4r|_o0&oA30KLx}8XAAAZiVF=bMi6B&sW79 z(mQ|K9P-!uye0TQ#`sWNce@;$$JXCDX4D7L>3npaGXIf)7w%#HdY?C?c|q4reSOgD zrI3pt0u&~(6Iv>JfqZpMLvO(RRR>$TTecqaUplc;vGY#SOKfRn?O?xN`>5U5NJp$Y5@^!%_S{GKFbwwBjpFOSX57Sl`kv#N zleRtTUl06|X7~_Ew&rju*=X-e)c6sJ`zLQD3~Q9NIymEfTEp5N37i25(#j0Xt&vn` z4UR&LmlpxP&nl+>Aow44&Wa>uSh8de|`$7VMxgBy85(R0Sy1B?_NDXl* z)fwa`^7PHN;VN*ur2bi?t_nT5561a7*(R#MElB=^LVly;sxbZqH~y1UjK8j!e;=yQ zlh3~--2$U01I)&drbgr~@Rxv2Gb4I(9HV~|0q<4wzv}oGu0O`FYlZ92t6hHzGXAS@ zzjFiYfPC$eo)-vz>V~|py-VFFyq&(Oh!gyw`^Y7bzabHjmT8)MOsP+5@<#7}XjzWk zth_is4Z;h8H`&^yY_u(svA&3H`Z}A+sT=Lu!N&<{8*MjdY%X#Iz8UgE6~8ij-qN(+ z^PclFc1^H(vc=XReX|{{{XHQ+K~};)irq1;_p;J-Su9gG=H6q!EFTJa^hY4iehA+b zi4jUaH{*FXeb2_>IX8N75`Oeg^22{xVx{NZx{2?HcE!sKyWzPv&5{545b67nUYG5M zXkLR=xF4dw-~ShCoOaP`6LSxzP(Q(Gt6y#ba!xxY5!W)p_5!Vw#$x* zO;L6oGMASXMA|HLd|7ZXQFcx^!8x2meU9*Q(&6RSPMd{JEXR3}UgY@BJ0~3F<)p*Q zt(^k94Cg_5f#ZW;(*B8Mc)2xFr-ObXjC1IOR?a(pzLoIbL%xqzuIb7}oe8bTh}(() z7X0VDbE3BnpZCA9bmzn&7Ep?&PTMte32k3uGJojAKL|uVXVv)Rw9Bs~_~v3zf2U6=-~dBhGxnRn|7QX4|6RzhE&^E3UUmG}@cwt%F$r_gjQNlG=d#nMgk=0} zRo8k!Xc0Q88u7b?P82`U0RJ+rKbmWwv9*utcT5m%TZB$rMYb)rjaT*k0=lP=A5C{p zFZ#s}pW-ITUo-N3@Zz*}tQ=a^d5fJBx`|_g#)V305jvr-DsUA_=m%Ou)yE#XuxYOX zT9u0P_VI6nKThjIlIylf@5ueZSbGa)G1~HYvQY)DQmI9#Z)0F5LvkPwv^>(7+(+39 zNIJ%z!DoUL`nGeTbBi55X0jMI1O9Nx9wn{M&iUJ*j_%DTDb-uE%w?zY-x!F6HE9a5 zUP1)&?T4hyW$gBhTnV$q%c5;W$?~&N{C=PAJAbI>y1JC?W9&8Z@OVBtrTvf=`2L?O zzAw`O`y#H|7#Q9Uc|*1zQd+bs+z)vP1Lze|#4oCwk6Bt4yWpdI_0}wiU0l!kVPLi6 z4+E;Phk@0fJ_x9~^6`SYL*f_LbBbI1Nt?&>YJK}Kp!x~uut$N_Qy;36Au)OT_7KU}Ae!%%tVT4%eAb^dt2TCtGkH7Wv5s z6XXf}rMSh-ufrbBuCCj&Hr0zK>z&7&!mFg4vg(V}hjVMalNx0DpJ$mHnwM3=G_@@K zcc;+v%(T`&S>Hl5NMGBctEqf?^iQX+bt!6!7iqsciR!@nK@TP$7a2zCZ)dD`YGMjE z*G*ri@ge2+7LHFedm6FKQCzot;KP-)KbpTZe(nvE%o8f(bC=f_ zrvI4{$hSceMtdK4ZxOw_Nb?>e2Rz^5fagU>nq%+77s8~1a$geCBOB%y=F1+I1vDNB zVb}{1WeU=8NZy0?L+Gyp>HCm8@Ld`HVY}gdkkYb!5Y6SFa3AD9bF7)`RbpbSxu!Zh zOE6Lr6RIaC#ji?9ijRWCLlRU9=|;mgC@CpU)%zm2!mPrCj zPD~h+92cASAxuuFkftWb544Okzt5?O3Bweq@)V^e#tCW337>=exwZL|6XRKOa%}z7 z)WkfT@)Pi`w>Gy9FF9V}n_GE3fG&+S3;SHJeNM4Y%A581KtKJ1@iJ=mVEF6_+w=`1xx%aNSK(jtCl*Fx*DwINPy z!K!!It(YUQOOX0t8h>m&^KBJ}-{^^FscDJq#HhXOVdPzwo|%sG6c!!4jve>=Uc|q5 zG=wD{8V!F^Sw?CGdmMY49o_mV;&jh!{`kl7%%?*vdzKT=E`-OiH9mRT!qT%+S;VwW zEaBcgmYRxwN=ediC1cG=f**f>!BXOHo6VmP7tg*Pkj7X}91EJ0z>e>VlVXW6IY0Xd zi@mC8V|r#1dvrCDon1JC9sK5N_UPmvEG6$4Fe(0Vh=1?zG8lUi$L9T(%+~#>ZJ&00 zrl-fVe}0W&k8eF)u*wQf5hc2k&eIkxCAy}MmEdI zieqQbC9=h~$He+3*+4duld|h)mSQgW_`MT0EQ4^)dUY zNh}Kvh{YO^8!Kvqsqv@wlO0dRIHbj~XPI#ZRL$lA}K+k$4Tj{$pghfKwaz3Sf zkT!TCMBVpe%E<+P?t@r=oczZj9%PO$)u)53OtHhPW3fYQoBbi|>_LhiV)K-I z5cR@XaxsYgVK!1pM{ODS{D5+*Aory5?a1G_M8D@`57FJ#nKIX~UE?7EjCjt{B6m=9wI z(GQLsTTKePeEg-iKVbF0_?-Q@VNIU4^Lr-FUoP|^s}Ou$=Zm>xfP6;(Me_F4?>mT5 zoH?I7<@~*V8ZG`lP1Tj*cZ%)H+NGwwdUfE#YkSk;YL1xr?9Az7dbznTBUxA(fHF3!hRg}O&I4emimnSp8Yy+mN-rteOhCiN*cXtjXryS8q4B3RZW#nMp^{=i?U^}sqQMvp_U^{q-I`>RF7=xU z6h>8nN$Wkk5_MkD2P&s}k^9pRB8>u?q0qEp-OKu7K;>HQB#M_A@J3Atw_B%Hk2c&+ zWgQ~3ng6wPb~|3P*V6opkDrPBR*t*eDW_i+UMsrkHY@sjG%LE`2z&GIbT&C;uO{|Z z9CLDBe*XT5Nr`+-rj-1sHfowC_EwnhoJU_eY1~NWwR8(}n7xg4Sh<_E@6m@*8O7dO z^Iab|mCu^y!xsIzfc5fpXKUB2VBdfDEn75Sv)(qY_r8-MTWi$0e)XBS4p4i^2U>He zjLu&MKkogKMK0}J=lMpTevo91_8G&_-g|1=o7V?FW46|)uUF5p4BG5V?G@XOIY;N# zz%Io2{}q8e`x2Qrv%Sr<&v!IOO3#3hG#B?UXdlB*B4K!pgCqvekR+4fyD(XJ{v)5@ zxsWUp2N2{vXdk2=MEX2PJMn!Xo{%<>iOxtHQrFpeaYq6IjUBzr||6t{+{KG0#KWd&-JHjf|ILXS@j$nD8 zn+(Ev5Nihf$jbk)=kFh543cApu$m{?=~}1QC-B`y*Vfg{URcd875Sa9clR+?CxS8P zSRy-NUrd7k8t|XktiebOwF>^@+NW3v34U?lr$Sh%Empy2h>wG=e^)adzWoM^;*uNF z)2vM`-UkwVyS0pA{1AVxu6cbi7JZ=UV+lUS5W^U<27WN`HRDu*Ph;qvJyz+1C?$Lv zL#4MdR`-m>@uB!?o&%EjPh+U~CQW>39#B7+D!?V|RDJjqqc?Xl=5UCys)reKG(n*M z0(1Bfu)9Hc|I+-*Am6!AoM@~T--y%%fqr_GFqZe(+0~5j(>S&+4FaF(a!#0q`6N9w z_}MyKNjoHE&yl|ixeB?aAUEO5QHV1n@AF-n_3Z*|bn%hp({VlpQWfH;O(`#xYQU`| ztdL<-JA%*;t63AsamalL`AKpQavkCW9h1I$fa^(agnmPwt^uoAS;*Tmc?;*cSMD_u zyIchQIkneE!d0uQpY6Y{26tuxmoULr@Wb6wUcv7KqE*U5`dsV6Me+@4YFSS@V9cUx@hiIT3gIGR<)F z3alIQ{$I~|?Pt$bm=_`o`753d$^EF@$hdhOFY^C%h z>Rn;4TLb%Ut*yfqv9#^#wyn0%C!}Uk_#*}!cC{fJAc+u;{Q`LselDi4`2o1Eb70i- ztS%)Vpw|a768&q>D{$Tw5&@fMkb97SAQvE+5FL+KNUhOcTWjgsLH2x{pl@uT>#Wt! zLOKb2x^)V1E|0SLkRZr=y+i80fiw^j2hnjL-x3^RfAo{|H+X1_9G2+Dz~{!~!_@P+ zZADon=xF``LLJV(!TAG;-D%)zCJY(l0JhY3@`c9XG)=AMfBCpTy{;O0Ur0KHx1$X> zbocZqw}S*o>Z6b^PXJya`o}bML=MER4DuHx_KT3$U0;y5hlFeEX>0_Oq4zFF(caL1 z-l3YY2pbw_&$Sq5km|+<@-&aGYwKwK%py$h&Bnju>K)`L(!*vlgyKpuqA{i$N0f)$ zfKXj7{#K2x2%zUb3H}t=a{RlwP-+o&)*aL#!FAaT~Z`^(XFm?S)a|`FRj`4bG=X4$tFUdTiGKKY( zVy_#YSoc~&bmNn3P)}p*AcS)~LSFaWIyl}!TdI*R9egc@Umrn__Z`Fe5n$)eKdo_Aio;266?l$8W!+u#hMjda|Fu8wFnq4eYR?@3tn3^ z^J8{|CWT!w=zRm>ZJ?CwXzm<<(72=i{}`Aif{i)7su`TOB&p#ZNrJf6_jKO)*GQ$UzAn$CajZ z?fJHENNwFZD`HF5CXP?3bS(A`sg3@qL2Gam$aKhYh;ED^e+c}|5&Pm^+lbHPDK6-o=Y{p^LXFk2xk%~qJqCW|tK9TKF%%flj}XKO3O z*vt@;aUYi@;`j=z1#pim-|uzConA}a>$%}cr`B3O4Bzj)DZAgJyGTK>=KY@54I#j% zFT~phVhbsv6N2=p14M|JK* zFY!FU$EzZ+)LaAIGZfQer9QI{jp6MdaDsv8^8uPy7}-9;j< zD0632M{SbYAfE-P4Gu9*lgD@q{u8}RqU?}VkL)IX@5u)BY{~lfa21~|8Q9ZJmr@zk zk&Xh#7GQ~EYvy2JeND5@dz+P@H5NG6osu2 zKA`^sCiQy{<%g(0zw7TV^?moiUM)2*$b#O0o^B<8y`Au>eWXh^u)P`J)2})Q#JQNw zO}&btUzSXV?r^U*QheQeUI+Ge6K#O~E5|2YvI+F@J_3KmeOvHou_gXb^r{T5!y5nF zN%8j%?B%MvhZxk;?R8*>a{TZ5x0Cvx@8SeZtXp2LNJAi5y7+gK#lNRpOJKS|a^nvj zN&H{HejnuPslGjQdrba5eTt(j8loEqQ+~=fex3pMI)ug$<;C{V_#s`XE%Nc0*A-`J z`_|v5FV+sMClY+!`0s`B-(6w+qihiBl*T{$;Uut1&(ikqOr+qeiLwki$E4BS*|!5U zeL>@ugvJb&QJuovqP8@hqkR=;pmrU`9H#5XPZIp=$nT+Z8XJ>;=)rtOeJu**sZ6U& zPSbQJ(d5b^FKNf&h$y5J|C!W3i%7R|Ao&l zvog)26@}^wGXB|kuffq{_t}XP%0hLdW6t=mTzRiJHL{G@8^ShLN7zKdx#V-vwrFVU z)k`n2XGw5c@r9FJeGUM`&spsigY>|h+mUpueh4NG; zQ`}v)~`=i9&fQBOj^Vq)RpxEAC+* z*51oDEI1^NdybulP~n8fr((sOZQ#R0@}bAqcwY!`Gql&oti(i?g?Au`f;@3k9qEuR zaewmRUKX+>jK!Wde%~W^1KeU!#frPXf)6q8zPp=wc0R%q?>@*k9(cQ{j&w-(!#aD@ z_N+d{k|H(tb8>t&=inCA-h1z_PvFDl3cz)B4r6zs?%_5gcT7^A%BYTXNO#(g2m4XG z`MsbTJ|&%s75@^85zp#`OKo#=ImDtO?uc=q{-!*YQ61@!ZdTN>dYoI$eWwyPFMIc0 z&DX=;dvAA1tep|W)1dwVcJ2TFl&1AKe5@idLeS~dR? zh4PxR-S(s-wc&aAqFB!BO-U;t+)@frIL3mrX7xIp1R=5|!qi244 z`t<2Wkorn;{`~p+-Me?M@8#vCC{#x}O19cEqkAFHWBLTx3>*ynib8dyqtBkojYYOefx@aq@&NC%8j)@J|6F@(j!lvJYk-mp7~-=+&}&F6YJWw zDFJ96y?XUxD^{!!`AJ8gJ(U*(KaIyBLxzaHy()h4f%>M9 zzhL{nbLY;ickkYcLUjchf0{pM&YWRq&z@Bjsv{k9#(%SB&BUo;%-#^Tu{u8gIhTAc z)~Qpc_4@VeSyEDx!8RDR3sJeBFwCoIAwY%NE=y%5ydHf`F}2lWgo3knL-i$`m0^XAQ2t5&TD*`r5~SX^9O9_);a4Cd_Y%-XhXD+=YQOv+C- zWJ?%?MVN$5B%I5D5B<3hQ>RW9airL4_=%friQCQ1jeYs$m;DTJb6>b`NV~y@c%*Fd zOE%zSty{Ndt5#{g$icBWm%fzi!M+WA zct}2c_uY3QE{_9^XBt-|()mK%q)Xh?KfnL}JBx^jFnZmS`vQBh2q|3nD&~tXz7X4b z5AQaWj|bjvs-u{YF4~>8Y11Ya85t?wkIC`XoO2(*{|V$W;r8j%hh4jNEzdef>k5@o z9qEwn^y$<4QM>v5oEknQ9Z6qQ=RVN=&cFZuE5?ChL3t|U-0-{l<;$1rac(vDol4xi z47g$zzLdmxjv$^+ojS2gmoAAyc`Bni(jjGV(tW(e?dLvF3Va*j+anIAk+PO8TZ%$? zZJ9mkNNso?z9^RSdQ(zxkPpGctK|-+GE*=t(FM27=bwLWgLEf}HgC1|srAjt$*CBL zTKz)3{1M=L6110Ls>E1nFT@FMDeZ-L;rm~0@N`HE!5QBLbHkbDFuXVNj%;tFyl7Oo zH=+&R|AVB8dve(-oznfQbWWc|`Ip&bEq4U?8Hq!u^nWXQq-q{cFJMRH+%MAyecUg@ z2V>j?=>zpG^)ctrrZ1{=Oy4C+r}P)nI%|#xJ>0Bvr*!dNpN5-5$BY3|e#%?J2YuXx z|F&mrDL&LGFXy+^2SeNKo7J<#*_mHk^+MN@0IE9|o=$QXOd?x)$-{S|tAM&oMDBPv_$Y2d|f>+BNRHf{mU& z$Zdb+PHD&AZWPEVR}-yJ$AWn{)G2+qP&aKH*Z# zB|1LRddgdao8wn*pHUH*SEabx{-*xP*GJam<~~&NeDWUVScqnQw(eNt9BR@^ozh#Q z%~l_4YPd;<)(46&^@U7S&u_I{`t%fhcxl|+C+%8I*9(8j^YX&ii9m;R$wss# zjAURDW|jkE#34D9o)e*ONO#1uBK$DC7gAof7oxeu7Vd@c=>6}fGiJ;vJ8RY~f51p_`K{%H0dD5!=cn5Xp}d^mQXdR)Yq@lLAvkwY;y2d^72Fj6L`Z$D zP+r&n^1LbIK_xfm@&p$NKj&$-yiAP`G{;C!ZfoFN&VLiSbub=mk$ORLq_%`j9QxL3 z=+b)5+n^?u^XJ(M0oGv!JiU7%R^ZRG7XrM~3jBKaLbPk#c?BDNvCy@D=FFMLVfO|w zJ_rm9bU>_qix~R45jd)HTYi%H~B^DgSP+qJmjhB`E96uYU&hxcxl|+KkZsg*DHU@ z^YX&5>iE%Ii!$AJogO!@!>W{ZK7y z8?y&*ZF)Bq*^sRPUxl$%e`}2IVa|fJyIDn@<=s_B63uw!Q}YW!`I$;*9cCMs=h^x|Fx(fw&$8?smci z-y}Idl~En(kS^t|dElLIvw?k)Fu`?Bf&U!Ukq+rn-kJx-a(7^}5rdoeT)v@(7;|a- zscghxr=FyPcgS_O2KT_8E_N7CjX75TZY}>9`|}rU#l{cv@l)Bju}$zUwU&QyeX=DC zer{@tw$!5b4C?9n6SrNkqHZ|FULpQ$!OGevxgObwu>b}yGbaTGz02+?;{O`iFJE6H zQy)K-lMd;MHn630OAl(tpl+@oulm#BEzYgfeku#vUbQ^wl8vRjgFQ8C4cc=KcoE}& zZZh2%KXhi0F4+)2$FRhg0X^LM0Q3Hjqnqktudn?-j{Y)}bjijNPHx-3yY_pvh~}@W zY7H~i{za>5ee*(i3?UiQh}YdrH61>UOdQH^%_xUC41dckVCP_8uxQsdO7IhJL%Q6~ z8tFIP-0gvRi}Mp^uWy8G&X2rqt<&<~A{%RP69zEpow7NDySsffu!rV8*#Eb>GY5{e ze?9;*eSWREq8{o*9q5vc_4r%a0k0b2ZQ1Q1!Xmw}VMnXw8@9JvPI+k^=??7K%Ixc| zNTBdv@Gc$qSa7nCJsoP0P#!XtOt_AMxkW`=wA{cCB);I?9y2%~<;618Q5o0e^_Hfa z_q40JWq132z`a8}fA01eOqk#mh4NHJbsC-a{m6#O%{l(u+0JguP7hDu&4a{>xVt@a zkghX^M>-JFr9L6sdBJGK0WTS*_45y&$b$cTYS@>bLWX1wNW$eV8 zxq|0Ba=eTA=F}_Y%gPkjJo`b5>hVaSX~^asV?KBJP7MUAoi``}Az|=+UB3 zp2`THbV%0{E+t!F9)*beAmE!M=ch6)|8~+8#%PxL)~29_uOR7Q2AgYlm`ah1SSmI2ES(wM8`T`hmmceVBL4p_UQIOI(F>Hz#$6d!DCBYDEmUIYt?-aVBUosCk}UacUyXI zkyJ3x#eERcAzjk5)&V>kf42ymW8(c4*_@x=Wx>lyN2@E2KVEK03Or{>4*K;Yq#~5B zukXwrJ$gJR!MGInL8wlvlS4L^a7t~_r*s__|Bl3adBiHD7nUtsww#3WRLJW{mu#dM z*2v?XG$IUm#zNTY)vIfeP@c-DlIvK5Pl~~Dkp^n{X7GBP&!94@qcX0`>n%-zT@}&~ zxOa#LBJP7A)y163Amjt-^n;ka53+LQN;}|q0%IN|7Q!Go5TpAbq@&ekNXd2{`p9$5 znl-A&18k~67~~XeXG7Y-A8{W9WqQNO>qwVu$d)i545DfuWbN9u`SAbvLw8G=uTEcq zl8q9!KKqwd&i5nOE8GWhLSysqgXnug1n*%jV=oy?HuSqOj=Aqytti_Yc~1=G|JvS& z*r>w){$EAFKAg2HeweL?Y__tjw?E9>jRmvVAr^0ch_QkY!ZyYa-kk-(t;N*5yxo8k z@Ub>@pBeL^RA>VGw9{x&C~r(3_0NI*kpXI56?7LF!+Ue}W!A{4k0_KkrcanU0%MtD ztX%O!EWsdVSPrYO@F=VB>oI1Jyg^<3^uX%}nMu#DW2}xcf@zF1w;ou=nw+mbf)%w7 zW6}D2C?57g7k~SM2HJm^T^DvUv;Iy1zlT2l68kcB{IBiL&TXrF?qWU3*ESOhz`s|? zhmyNfb^Imwrt9NBU;>q*YO%wt4*2uU$5K1ub^N7vCMxl(o^Oi8l0xw3n~!ezxw$m;Zn>h%*QgDZtM8VY`!DsH+jA(@=6Nj^RevOYdZdN>u==cH)p;{xD>Op z`S|AQOFI5H*F@#=TQJ`gc_oF0=A&+oSUBG#bc$K_w$B;OO=J32uiwmUaX;f*ER0POkheO1Az)zy zUP1(Pdn1wzK3LB4&ebfuKZN8ten*BRM-Y6m8LW9O#1GGhkkC6rNa&dndT$7ScSx3l z=6gA^cZhI0x+$&?k?xIj!<$t*IV0b^|J=uOpCDE#IKSUe6!lXbWa4Ra( z@mh4`s_W5_Ns!0aubd0Kbt|$=fsz9J?xjoRZbY4(4bCjc)$37bzr7KC?q|^l@*^tJ z8}rP@8h%9V6x@$)6=H9mZW?>#SiO$dqs|QmPb?&!IPso$-QRfB_UqB-=A-U8{bRUNMd~%0S^~4V0_@ONVBe{LfgTp~11O!VT#f$=7B|Z=U}0(X~^xnoDi2T#0xK z*QSS%iPCaId9p#wZo-FqxTbpHnkx3cDeEiQkS$>lmb@*7_^FQcuScI<0{dscIg6OM zsO2YJvJq{8VJf%Ow`=Vv^GE`ugU+mHWTXyYOOw30M_ZeN0x)Qr$O&gO}39I9b>QmAAR>FtNC+> z?B~scva=k5vSREVvK;NieG_rNgzt~=JradI5!w%Nf=Ks6T*Y^*x?wkja_t2d?2NeK z_hb()@ zHiGSOZjbLaCGOw9U-jMy*0Rl5Xa0nJe-f-^Chv`q4YwyO!sP8UmXfY9ec;<+e6PZK zv>;NFNDJgHAuM>jz9?u~%EKgM_}U!U-NbjI@K%k}P!5EfxdISl3D?H9o+)_1-(V2(b*wJOiv2x9*h@E$@`?~Q0}Zo-Fq5HF_P8!=^lB^$CO z3~=9+x5ZHVsgCqvy9DwKauygaYWYc*Y_zsZOy!pP2CO>3*$JWVNoGo8KViZI@prCy z{3%_xZe1qnk`38Pu`J0`o525s^J6TCYZTsd$(AfxBHklt`Ja%kC0zP!DgF@gx1Rah z!c%;Yi`Hg?*JpjWYRl37q2Np4oC;~e+_`fLbZ>;-D+=D3kZcM6Gvt@z+V#@*MzF@$ z04H5f_8~5Xdn0NGQK4R*2wf7RmGD#eggtD~+d|sns-nF)|5dZ(s9IKgl&e;<)w)zm@YBFCX~+J|cjF+A3KKtprnA6FGBlo3Y=ji@TZDm)#b zdCsW>ekX~ZYw|+c0(*Jx_`enQ^RzfZ?)ScCb!^}2^%50Jpyu^9tzA1K^&=@>4F88W z>vtMSvHtF@T=9xB{9Aos1O2)E+Q`;D#t1@5+zys}(?(dff`+U84{bc$>|=@+eWOve zVcm-Sjgq=;Tw8Pan?vt64<6mJXJ~^niSGLH{-H}s#D827ti~j-RpJxb{G*^wS0iHbGu@rC+Cdc z_vO)+-X)V8Hr(3t!p78T!jlo7wdq%)VHdy2r#`LG)n=V*tzF*@UOuGgHunl8+u3~V zIe65jkU>tHJdb=9`I>j+fHDoeY=^e36LN9Dr|0YR_xW(uhi`?R{^v})X-UP0MmHTC zS^e7QMdqzN{ZDwi_uI~|xlEYw#$QvftiGDm*dw}BV(g>UaozmvLcY!lnHPA}GqI6P z!#5XA8y=YH?BLj{$=;T8%G;gj_D0D3q@p%c=gt?(Ikgt5+Dx@8Q_ks!M&+L8l)TvB zaL_*Q?~h!G@@VIG^YOX5ZbkMUo^vDl=CF++KklhC?yG*+>oNbB(>1)iy}AG3*%!$+ z4HNv<4PPD7qDbSGgI@3YT}JzHn}@F%z1(hOVDP@K>%aTRsppQ&Q@<{I-=@+4@9$eD zcRcCxPN`FiggNsUl^8H%tjjO+iVk^w`iP*!S*Z#2MtZd>R>l$-Qh*9KWf(C$S)&{mkU2veZ zdu#uw(oOeOTGg}Im!)^SbFO-+@P1vIRg zIU{vg^>cG>Jn&EPy}2{utw+BV9ppAIsJcz>HP0LE-SXC?O{4a_v$(fS)a)z_$KccXvjO?D%^|z^zIsdVB8}Uo%-D9j!;rpp%T2St`DwYGZa$%pOYVO*#ct%(TX8Wb*WIie z^^0e@u(E?cno`*VC;#>+=a^VOVcMO!`+MyE!Xcv6)0{V|UO0V+Rs8GS!BvMkHLP^y z^u(3t!y~>d_1Lz}v;6@db*gpZ$Db!}yjI-%TJo{YAw|D*eDCY7JDcAO8dc?by{q*< zU(_J^MaxkC?oq{m4k}r`N>WmZd&6yRdJS3pBP-pdrOUrVN2b1+5H#l2xa1Rdjb9AS z8ga1p&8V$24$sd?YM$NGZ_(T5&b6@_Un9J3RM?T*^F|H7_RQw+JAuvLsIpRM{=&wq zYuN2ggU6gqp44&t2k8lK2i^|-zUViz4j=pb?2CvcMaJGOcB0LUG%vqCXY5yv8CWBt zf_;|`jc#SOoxH2`(xDHY3pXp=+Eb){{qWKUe}4YleR}xvVBbMQ5^E+W#B*2nc%wmkhyo0^BuHN7x#ZOucqZ5=Oq zWVU+twcl4|qj#j8dw65NSJsU+U;kX}*7#fJC%+x^Y0>0~{o>}G?HoP1oOfo`@od~z zx2Ih5I8)x{t<^)ne>V62+CzIj@0w=&k<*V~x`b^TRAc1$A+@eMl{|O-?2SYA_YZ$N zq;_;z$#XZqTjAE_?O}V$tPZXklRhTm$;h%JZJxM#U)pM4uw}-{pZToOZ{nAx>kA5_F zjPHe~vu?KzIQ)8`@X4f7gKquw{Q0!|+a7&6?Y-hQ!(wmWJi3zob@G$i*PV)Q%i8zk zdz*!2hOzI9MK8G)Hgn3|?E5jMYCNCp@mi<0Tb4(c>$Ty|rB+MBKb>0Ju7+^M$@hMA?S@5q^_(%jWd9y<)AC)V hikBUcQzY`2lkFzkZTucrQlX7od)E+W?_UJr{{W&WnxOyy literal 0 HcmV?d00001 diff --git a/Packages/DelphiX-Sydney/Delphinus.Theming.pas b/Packages/DelphiX-Sydney/Delphinus.Theming.pas new file mode 100644 index 0000000..852c5a3 --- /dev/null +++ b/Packages/DelphiX-Sydney/Delphinus.Theming.pas @@ -0,0 +1,42 @@ +unit Delphinus.Theming; + +interface + +uses + SysUtils, + Graphics, + Windows; + +const + CBlendPrimary = 0.87; + CBlendSecondary = 0.54; + CBlendDisabled = 0.38; + CBlendDivider = 0.12; + + CPrimaryColor: TColor = $fe4f30; //$304ffe; + CAccentColor: TColor = $5b18c2;//$c2185b; + +function BlendColor(ABackground, AForeground: TColor; AForegroundAlpha: Single): TColor; + +implementation + +type + TColorRec = packed record + R, G, B, A: Byte; + end; + +function BlendColor(ABackground, AForeground: TColor; AForegroundAlpha: Single): TColor; +var + LBackgroundAlpha: Single; + LBackground, LForeground: TColorRec; +begin + LBackgroundAlpha := 1 - AForegroundAlpha; + LBackground := TColorRec(ColorToRGB(ABackground)); + LForeground := TColorRec(ColorToRGB(AForeground)); + TColorRec(Result).R := Round(LBackground.R * LBackgroundAlpha + LForeground.R * AForegroundAlpha); + TColorRec(Result).G := Round(LBackground.G * LBackgroundAlpha + LForeground.G * AForegroundAlpha); + TColorRec(Result).B := Round(LBackground.B * LBackgroundAlpha + LForeground.B * AForegroundAlpha); + TColorRec(Result).A := Round(LBackground.A * LBackgroundAlpha + LForeground.A * AForegroundAlpha); +end; + +end. diff --git a/Packages/DelphiX-Sydney/Delphinus.dpk b/Packages/DelphiX-Sydney/Delphinus.dpk new file mode 100644 index 0000000..e9b4adc --- /dev/null +++ b/Packages/DelphiX-Sydney/Delphinus.dpk @@ -0,0 +1,194 @@ +package Delphinus; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + rtl, + DesignIDE, + vclimg, + vcl; + +contains + Delphinus.Theming in 'Delphinus.Theming.pas', + Delphinus.About in '..\Delphinus.About.pas' {AboutDialog}, + Delphinus.CategoryFilterView in '..\Delphinus.CategoryFilterView.pas' {CategoryFilterView: TFrame}, + Delphinus.Controller in '..\Delphinus.Controller.pas', + Delphinus.DelphiInstallation.View in '..\Delphinus.DelphiInstallation.View.pas' {DelphiInstallationView: TFrame}, + Delphinus.DependencyDialog in '..\Delphinus.DependencyDialog.pas' {DependencyDialog}, + Delphinus.Dialog in '..\Delphinus.Dialog.pas' {DelphinusDialog}, + Delphinus.Forms in '..\Delphinus.Forms.pas', + Delphinus.LicenseDialog in '..\Delphinus.LicenseDialog.pas' {LicenseDialog}, + Delphinus.Main in '..\Delphinus.Main.pas', + Delphinus.OptionsDialog in '..\Delphinus.OptionsDialog.pas' {DelphinusOptionsDialog}, + Delphinus.OptionsDialog.TypeSelection in '..\Delphinus.OptionsDialog.TypeSelection.pas' {TypeSelectionDialog}, + Delphinus.ProgressDialog in '..\Delphinus.ProgressDialog.pas' {ProgressDialog}, + Delphinus.Resources.Names in '..\Delphinus.Resources.Names.pas', + Delphinus.Resources in '..\Delphinus.Resources.pas', + Delphinus.SetupDialog in '..\Delphinus.SetupDialog.pas' {SetupDialog}, + Delphinus.UiTypes in '..\Delphinus.UiTypes.pas', + Delphinus.Version in '..\Delphinus.Version.pas', + DN.ActiveX in '..\..\DN.ActiveX.pas', + DN.BPLService.Intf in '..\..\DN.BPLService.Intf.pas', + DN.BPLService.Registry in '..\..\DN.BPLService.Registry.pas', + DN.BPLService.ToolsApi in '..\..\DN.BPLService.ToolsApi.pas', + DN.Character in '..\..\DN.Character.pas', + DN.ComCtrls.Helper in '..\..\DN.ComCtrls.Helper.pas', + DN.Compiler.IDE in '..\..\DN.Compiler.IDE.pas', + DN.Compiler.Intf in '..\..\DN.Compiler.Intf.pas', + DN.Compiler.MSBuild in '..\..\DN.Compiler.MSBuild.pas', + DN.Compiler in '..\..\DN.Compiler.pas', + DN.Compiler.ValueOverrides.Factory in '..\..\DN.Compiler.ValueOverrides.Factory.pas', + DN.Compiler.ValueOverrides.Intf in '..\..\DN.Compiler.ValueOverrides.Intf.pas', + DN.Compiler.ValueOverrides in '..\..\DN.Compiler.ValueOverrides.pas', + DN.Controls.Button in '..\..\DN.Controls.Button.pas', + DN.Controls in '..\..\DN.Controls.pas', + DN.DelphiInstallation.Editions in '..\..\DN.DelphiInstallation.Editions.pas', + DN.DelphiInstallation.Intf in '..\..\DN.DelphiInstallation.Intf.pas', + DN.DelphiInstallation in '..\..\DN.DelphiInstallation.pas', + DN.DelphiInstallation.Provider.Intf in '..\..\DN.DelphiInstallation.Provider.Intf.pas', + DN.DelphiInstallation.Provider in '..\..\DN.DelphiInstallation.Provider.pas', + DN.DPRProperties.Intf in '..\..\DN.DPRProperties.Intf.pas', + DN.DPRProperties in '..\..\DN.DPRProperties.pas', + DN.Environment in '..\..\DN.Environment.pas', + DN.EnvironmentOptions.IDE in '..\..\DN.EnvironmentOptions.IDE.pas', + DN.EnvironmentOptions.Intf in '..\..\DN.EnvironmentOptions.Intf.pas', + DN.EnvironmentOptions in '..\..\DN.EnvironmentOptions.pas', + DN.EnvironmentOptions.Registry in '..\..\DN.EnvironmentOptions.Registry.pas', + DN.ExpertService.Intf in '..\..\DN.ExpertService.Intf.pas', + DN.ExpertService in '..\..\DN.ExpertService.pas', + DN.FileService.Intf in '..\..\DN.FileService.Intf.pas', + DN.FileService in '..\..\DN.FileService.pas', + DN.Graphics.Loader in '..\..\DN.Graphics.Loader.pas', + DN.Graphics in '..\..\DN.Graphics.pas', + DN.HttpClient.Cache.Intf in '..\..\DN.HttpClient.Cache.Intf.pas', + DN.HttpClient.Cache in '..\..\DN.HttpClient.Cache.pas', + DN.HttpClient.Intf in '..\..\DN.HttpClient.Intf.pas', + DN.HttpClient in '..\..\DN.HttpClient.pas', + DN.HttpClient.WinHttp in '..\..\DN.HttpClient.WinHttp.pas', + DN.Import.WinHttp in '..\..\DN.Import.WinHttp.pas', + DN.Installer.Delphinus in '..\..\DN.Installer.Delphinus.pas', + DN.Installer.IDE in '..\..\DN.Installer.IDE.pas', + DN.Installer.Intf in '..\..\DN.Installer.Intf.pas', + DN.Installer in '..\..\DN.Installer.pas', + DN.IOUtils in '..\..\DN.IOUtils.pas', + DN.JSon in '..\..\DN.JSon.pas', + DN.JSonFile.CacheInfo in '..\..\DN.JSonFile.CacheInfo.pas', + DN.JSonFile.Info in '..\..\DN.JSonFile.Info.pas', + DN.JSonFile.Installation in '..\..\DN.JSonFile.Installation.pas', + DN.JSonFile.InstalledInfo in '..\..\DN.JSonFile.InstalledInfo.pas', + DN.JSonFile in '..\..\DN.JSonFile.pas', + DN.JSonFile.Uninstallation in '..\..\DN.JSonFile.Uninstallation.pas', + DN.Package.Dependency.Intf in '..\..\DN.Package.Dependency.Intf.pas', + DN.Package.Dependency in '..\..\DN.Package.Dependency.pas', + DN.Package.DirectoryLoader.Intf in '..\..\DN.Package.DirectoryLoader.Intf.pas', + DN.Package.DirectoryLoader in '..\..\DN.Package.DirectoryLoader.pas', + DN.Package.Finder.Intf in '..\..\DN.Package.Finder.Intf.pas', + DN.Package.Finder in '..\..\DN.Package.Finder.pas', + DN.Package.Github in '..\..\DN.Package.Github.pas', + DN.Package.Gitlab in '..\..\DN.Package.Gitlab.pas', + DN.Package.Intf in '..\..\DN.Package.Intf.pas', + DN.Package in '..\..\DN.Package.pas', + DN.Package.Version.Finder.Intf in '..\..\DN.Package.Version.Finder.Intf.pas', + DN.Package.Version.Finder in '..\..\DN.Package.Version.Finder.pas', + DN.Package.Version.Intf in '..\..\DN.Package.Version.Intf.pas', + DN.Package.Version in '..\..\DN.Package.Version.pas', + DN.PackageDetailView in '..\..\DN.PackageDetailView.pas' {PackageDetailView: TFrame}, + DN.PackageFilter in '..\..\DN.PackageFilter.pas', + DN.PackageOverview in '..\..\DN.PackageOverview.pas', + DN.PackageProvider.Folder in '..\..\DN.PackageProvider.Folder.pas', + DN.PackageProvider.GitHub in '..\..\DN.PackageProvider.GitHub.pas', + DN.PackageProvider.GitHub.State in '..\..\DN.PackageProvider.GitHub.State.pas', + DN.PackageProvider.GitHubRepo in '..\..\DN.PackageProvider.GitHubRepo.pas', + DN.PackageProvider.GitLab in '..\..\DN.PackageProvider.GitLab.pas', + DN.PackageProvider.GitLab.State in '..\..\DN.PackageProvider.GitLab.State.pas', + DN.PackageProvider.Installed in '..\..\DN.PackageProvider.Installed.pas', + DN.PackageProvider.Intf in '..\..\DN.PackageProvider.Intf.pas', + DN.PackageProvider.MultiSource in '..\..\DN.PackageProvider.MultiSource.pas', + DN.PackageProvider in '..\..\DN.PackageProvider.pas', + DN.PackageProvider.State.Intf in '..\..\DN.PackageProvider.State.Intf.pas', + DN.PackageProvider.State in '..\..\DN.PackageProvider.State.pas', + DN.PackageSource.ConfigPage.Folder in '..\..\DN.PackageSource.ConfigPage.Folder.pas' {DNFolderConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Github in '..\..\DN.PackageSource.ConfigPage.Github.pas' {DNGithubSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Gitlab in '..\..\DN.PackageSource.ConfigPage.Gitlab.pas' {DNGitlabSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Intf in '..\..\DN.PackageSource.ConfigPage.Intf.pas', + DN.PackageSource.ConfigPage in '..\..\DN.PackageSource.ConfigPage.pas', + DN.PackageSource.Folder in '..\..\DN.PackageSource.Folder.pas', + DN.PackageSource.Github in '..\..\DN.PackageSource.Github.pas', + DN.PackageSource.Gitlab in '..\..\DN.PackageSource.Gitlab.pas', + DN.PackageSource.Intf in '..\..\DN.PackageSource.Intf.pas', + DN.PackageSource in '..\..\DN.PackageSource.pas', + DN.PackageSource.Registry.Intf in '..\..\DN.PackageSource.Registry.Intf.pas', + DN.PackageSource.Registry in '..\..\DN.PackageSource.Registry.pas', + DN.PackageSource.Settings.Field.Intf in '..\..\DN.PackageSource.Settings.Field.Intf.pas', + DN.PackageSource.Settings.Field in '..\..\DN.PackageSource.Settings.Field.pas', + DN.PackageSource.Settings.Folder in '..\..\DN.PackageSource.Settings.Folder.pas', + DN.PackageSource.Settings.Github in '..\..\DN.PackageSource.Settings.Github.pas', + DN.PackageSource.Settings.Gitlab in '..\..\DN.PackageSource.Settings.Gitlab.pas', + DN.PackageSource.Settings.Intf in '..\..\DN.PackageSource.Settings.Intf.pas', + DN.PackageSource.Settings in '..\..\DN.PackageSource.Settings.pas', + DN.Preview in '..\..\DN.Preview.pas', + DN.Progress.Intf in '..\..\DN.Progress.Intf.pas', + DN.Progress in '..\..\DN.Progress.pas', + DN.ProjectGroupInfo.Intf in '..\..\DN.ProjectGroupInfo.Intf.pas', + DN.ProjectGroupInfo in '..\..\DN.ProjectGroupInfo.pas', + DN.ProjectInfo.Intf in '..\..\DN.ProjectInfo.Intf.pas', + DN.ProjectInfo in '..\..\DN.ProjectInfo.pas', + DN.Settings.Intf in '..\..\DN.Settings.Intf.pas', + DN.Settings in '..\..\DN.Settings.pas', + DN.Setup.Core in '..\..\DN.Setup.Core.pas', + DN.Setup.Dependency.Intf in '..\..\DN.Setup.Dependency.Intf.pas', + DN.Setup.Dependency in '..\..\DN.Setup.Dependency.pas', + DN.Setup.Dependency.Processor.Intf in '..\..\DN.Setup.Dependency.Processor.Intf.pas', + DN.Setup.Dependency.Processor in '..\..\DN.Setup.Dependency.Processor.pas', + DN.Setup.Dependency.Resolver.Install in '..\..\DN.Setup.Dependency.Resolver.Install.pas', + DN.Setup.Dependency.Resolver.Intf in '..\..\DN.Setup.Dependency.Resolver.Intf.pas', + DN.Setup.Dependency.Resolver.UnInstall in '..\..\DN.Setup.Dependency.Resolver.UnInstall.pas', + DN.Setup.Intf in '..\..\DN.Setup.Intf.pas', + DN.Setup in '..\..\DN.Setup.pas', + DN.TextTable.Intf in '..\..\DN.TextTable.Intf.pas', + DN.TextTable in '..\..\DN.TextTable.pas', + DN.ToolsApi in '..\..\DN.ToolsApi.pas', + DN.Types in '..\..\DN.Types.pas', + DN.Uninstaller.Delphinus in '..\..\DN.Uninstaller.Delphinus.pas', + DN.Uninstaller.IDE in '..\..\DN.Uninstaller.IDE.pas', + DN.Uninstaller.Intf in '..\..\DN.Uninstaller.Intf.pas', + DN.Uninstaller in '..\..\DN.Uninstaller.pas', + DN.Utils in '..\..\DN.Utils.pas', + DN.VariableResolver.Compiler.Factory in '..\..\DN.VariableResolver.Compiler.Factory.pas', + DN.VariableResolver.Compiler in '..\..\DN.VariableResolver.Compiler.pas', + DN.VariableResolver.Intf in '..\..\DN.VariableResolver.Intf.pas', + DN.VariableResolver in '..\..\DN.VariableResolver.pas', + DN.Version in '..\..\DN.Version.pas', + DN.Zip in '..\..\DN.Zip.pas'; + +end. + + + + diff --git a/Packages/DelphiX-Sydney/Delphinus.dproj b/Packages/DelphiX-Sydney/Delphinus.dproj new file mode 100644 index 0000000..e4ac8da --- /dev/null +++ b/Packages/DelphiX-Sydney/Delphinus.dproj @@ -0,0 +1,899 @@ + + + {0990B172-C221-4312-816E-1E634AF7EE2C} + Delphinus.dpk + 19.0 + VCL + True + Debug + Win32 + 1 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + ..;$(DCC_UnitSearchPath) + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + Delphinus + true + true + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + + + CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers + Debug + true + Base + true + rtl;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;$(DCC_UsePackage);$(DCC_UsePackage) + + + rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + $(BDS)\bin\bds.exe + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + + + +
AboutDialog
+ dfm +
+ +
CategoryFilterView
+ dfm + TFrame +
+ + +
DelphiInstallationView
+ dfm + TFrame +
+ +
DependencyDialog
+ dfm +
+ +
DelphinusDialog
+ dfm +
+ + +
LicenseDialog
+ dfm +
+ + +
DelphinusOptionsDialog
+ dfm +
+ +
TypeSelectionDialog
+ dfm +
+ +
ProgressDialog
+ dfm +
+ + + +
SetupDialog
+ dfm +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageDetailView
+ dfm + TFrame +
+ + + + + + + + + + + + + + + +
DNFolderConfigPage
+ dfm + TFrame +
+ +
DNGithubSourceConfigPage
+ dfm + TFrame +
+ +
DNGitlabSourceConfigPage
+ dfm + TFrame +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DelphinusImages.res
+
+ +
Delphinus.res
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Package + + + + Delphinus.dpk + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + Delphinus.bpl + true + + + + + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + False + True + False + + + 12 + + + + +
diff --git a/Packages/DelphiX-Sydney/Delphinus.res b/Packages/DelphiX-Sydney/Delphinus.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/Packages/DelphiX-Sydney/DelphinusImages.res b/Packages/DelphiX-Sydney/DelphinusImages.res new file mode 100644 index 0000000000000000000000000000000000000000..a1219957d920981bb83075d905dc9759ef667383 GIT binary patch literal 112664 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 literal 0 HcmV?d00001 diff --git a/Packages/DelphiX-Tokyo/Delphinus.Theming.pas b/Packages/DelphiX-Tokyo/Delphinus.Theming.pas new file mode 100644 index 0000000..852c5a3 --- /dev/null +++ b/Packages/DelphiX-Tokyo/Delphinus.Theming.pas @@ -0,0 +1,42 @@ +unit Delphinus.Theming; + +interface + +uses + SysUtils, + Graphics, + Windows; + +const + CBlendPrimary = 0.87; + CBlendSecondary = 0.54; + CBlendDisabled = 0.38; + CBlendDivider = 0.12; + + CPrimaryColor: TColor = $fe4f30; //$304ffe; + CAccentColor: TColor = $5b18c2;//$c2185b; + +function BlendColor(ABackground, AForeground: TColor; AForegroundAlpha: Single): TColor; + +implementation + +type + TColorRec = packed record + R, G, B, A: Byte; + end; + +function BlendColor(ABackground, AForeground: TColor; AForegroundAlpha: Single): TColor; +var + LBackgroundAlpha: Single; + LBackground, LForeground: TColorRec; +begin + LBackgroundAlpha := 1 - AForegroundAlpha; + LBackground := TColorRec(ColorToRGB(ABackground)); + LForeground := TColorRec(ColorToRGB(AForeground)); + TColorRec(Result).R := Round(LBackground.R * LBackgroundAlpha + LForeground.R * AForegroundAlpha); + TColorRec(Result).G := Round(LBackground.G * LBackgroundAlpha + LForeground.G * AForegroundAlpha); + TColorRec(Result).B := Round(LBackground.B * LBackgroundAlpha + LForeground.B * AForegroundAlpha); + TColorRec(Result).A := Round(LBackground.A * LBackgroundAlpha + LForeground.A * AForegroundAlpha); +end; + +end. diff --git a/Packages/DelphiX-Tokyo/Delphinus.dpk b/Packages/DelphiX-Tokyo/Delphinus.dpk new file mode 100644 index 0000000..e9b4adc --- /dev/null +++ b/Packages/DelphiX-Tokyo/Delphinus.dpk @@ -0,0 +1,194 @@ +package Delphinus; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + rtl, + DesignIDE, + vclimg, + vcl; + +contains + Delphinus.Theming in 'Delphinus.Theming.pas', + Delphinus.About in '..\Delphinus.About.pas' {AboutDialog}, + Delphinus.CategoryFilterView in '..\Delphinus.CategoryFilterView.pas' {CategoryFilterView: TFrame}, + Delphinus.Controller in '..\Delphinus.Controller.pas', + Delphinus.DelphiInstallation.View in '..\Delphinus.DelphiInstallation.View.pas' {DelphiInstallationView: TFrame}, + Delphinus.DependencyDialog in '..\Delphinus.DependencyDialog.pas' {DependencyDialog}, + Delphinus.Dialog in '..\Delphinus.Dialog.pas' {DelphinusDialog}, + Delphinus.Forms in '..\Delphinus.Forms.pas', + Delphinus.LicenseDialog in '..\Delphinus.LicenseDialog.pas' {LicenseDialog}, + Delphinus.Main in '..\Delphinus.Main.pas', + Delphinus.OptionsDialog in '..\Delphinus.OptionsDialog.pas' {DelphinusOptionsDialog}, + Delphinus.OptionsDialog.TypeSelection in '..\Delphinus.OptionsDialog.TypeSelection.pas' {TypeSelectionDialog}, + Delphinus.ProgressDialog in '..\Delphinus.ProgressDialog.pas' {ProgressDialog}, + Delphinus.Resources.Names in '..\Delphinus.Resources.Names.pas', + Delphinus.Resources in '..\Delphinus.Resources.pas', + Delphinus.SetupDialog in '..\Delphinus.SetupDialog.pas' {SetupDialog}, + Delphinus.UiTypes in '..\Delphinus.UiTypes.pas', + Delphinus.Version in '..\Delphinus.Version.pas', + DN.ActiveX in '..\..\DN.ActiveX.pas', + DN.BPLService.Intf in '..\..\DN.BPLService.Intf.pas', + DN.BPLService.Registry in '..\..\DN.BPLService.Registry.pas', + DN.BPLService.ToolsApi in '..\..\DN.BPLService.ToolsApi.pas', + DN.Character in '..\..\DN.Character.pas', + DN.ComCtrls.Helper in '..\..\DN.ComCtrls.Helper.pas', + DN.Compiler.IDE in '..\..\DN.Compiler.IDE.pas', + DN.Compiler.Intf in '..\..\DN.Compiler.Intf.pas', + DN.Compiler.MSBuild in '..\..\DN.Compiler.MSBuild.pas', + DN.Compiler in '..\..\DN.Compiler.pas', + DN.Compiler.ValueOverrides.Factory in '..\..\DN.Compiler.ValueOverrides.Factory.pas', + DN.Compiler.ValueOverrides.Intf in '..\..\DN.Compiler.ValueOverrides.Intf.pas', + DN.Compiler.ValueOverrides in '..\..\DN.Compiler.ValueOverrides.pas', + DN.Controls.Button in '..\..\DN.Controls.Button.pas', + DN.Controls in '..\..\DN.Controls.pas', + DN.DelphiInstallation.Editions in '..\..\DN.DelphiInstallation.Editions.pas', + DN.DelphiInstallation.Intf in '..\..\DN.DelphiInstallation.Intf.pas', + DN.DelphiInstallation in '..\..\DN.DelphiInstallation.pas', + DN.DelphiInstallation.Provider.Intf in '..\..\DN.DelphiInstallation.Provider.Intf.pas', + DN.DelphiInstallation.Provider in '..\..\DN.DelphiInstallation.Provider.pas', + DN.DPRProperties.Intf in '..\..\DN.DPRProperties.Intf.pas', + DN.DPRProperties in '..\..\DN.DPRProperties.pas', + DN.Environment in '..\..\DN.Environment.pas', + DN.EnvironmentOptions.IDE in '..\..\DN.EnvironmentOptions.IDE.pas', + DN.EnvironmentOptions.Intf in '..\..\DN.EnvironmentOptions.Intf.pas', + DN.EnvironmentOptions in '..\..\DN.EnvironmentOptions.pas', + DN.EnvironmentOptions.Registry in '..\..\DN.EnvironmentOptions.Registry.pas', + DN.ExpertService.Intf in '..\..\DN.ExpertService.Intf.pas', + DN.ExpertService in '..\..\DN.ExpertService.pas', + DN.FileService.Intf in '..\..\DN.FileService.Intf.pas', + DN.FileService in '..\..\DN.FileService.pas', + DN.Graphics.Loader in '..\..\DN.Graphics.Loader.pas', + DN.Graphics in '..\..\DN.Graphics.pas', + DN.HttpClient.Cache.Intf in '..\..\DN.HttpClient.Cache.Intf.pas', + DN.HttpClient.Cache in '..\..\DN.HttpClient.Cache.pas', + DN.HttpClient.Intf in '..\..\DN.HttpClient.Intf.pas', + DN.HttpClient in '..\..\DN.HttpClient.pas', + DN.HttpClient.WinHttp in '..\..\DN.HttpClient.WinHttp.pas', + DN.Import.WinHttp in '..\..\DN.Import.WinHttp.pas', + DN.Installer.Delphinus in '..\..\DN.Installer.Delphinus.pas', + DN.Installer.IDE in '..\..\DN.Installer.IDE.pas', + DN.Installer.Intf in '..\..\DN.Installer.Intf.pas', + DN.Installer in '..\..\DN.Installer.pas', + DN.IOUtils in '..\..\DN.IOUtils.pas', + DN.JSon in '..\..\DN.JSon.pas', + DN.JSonFile.CacheInfo in '..\..\DN.JSonFile.CacheInfo.pas', + DN.JSonFile.Info in '..\..\DN.JSonFile.Info.pas', + DN.JSonFile.Installation in '..\..\DN.JSonFile.Installation.pas', + DN.JSonFile.InstalledInfo in '..\..\DN.JSonFile.InstalledInfo.pas', + DN.JSonFile in '..\..\DN.JSonFile.pas', + DN.JSonFile.Uninstallation in '..\..\DN.JSonFile.Uninstallation.pas', + DN.Package.Dependency.Intf in '..\..\DN.Package.Dependency.Intf.pas', + DN.Package.Dependency in '..\..\DN.Package.Dependency.pas', + DN.Package.DirectoryLoader.Intf in '..\..\DN.Package.DirectoryLoader.Intf.pas', + DN.Package.DirectoryLoader in '..\..\DN.Package.DirectoryLoader.pas', + DN.Package.Finder.Intf in '..\..\DN.Package.Finder.Intf.pas', + DN.Package.Finder in '..\..\DN.Package.Finder.pas', + DN.Package.Github in '..\..\DN.Package.Github.pas', + DN.Package.Gitlab in '..\..\DN.Package.Gitlab.pas', + DN.Package.Intf in '..\..\DN.Package.Intf.pas', + DN.Package in '..\..\DN.Package.pas', + DN.Package.Version.Finder.Intf in '..\..\DN.Package.Version.Finder.Intf.pas', + DN.Package.Version.Finder in '..\..\DN.Package.Version.Finder.pas', + DN.Package.Version.Intf in '..\..\DN.Package.Version.Intf.pas', + DN.Package.Version in '..\..\DN.Package.Version.pas', + DN.PackageDetailView in '..\..\DN.PackageDetailView.pas' {PackageDetailView: TFrame}, + DN.PackageFilter in '..\..\DN.PackageFilter.pas', + DN.PackageOverview in '..\..\DN.PackageOverview.pas', + DN.PackageProvider.Folder in '..\..\DN.PackageProvider.Folder.pas', + DN.PackageProvider.GitHub in '..\..\DN.PackageProvider.GitHub.pas', + DN.PackageProvider.GitHub.State in '..\..\DN.PackageProvider.GitHub.State.pas', + DN.PackageProvider.GitHubRepo in '..\..\DN.PackageProvider.GitHubRepo.pas', + DN.PackageProvider.GitLab in '..\..\DN.PackageProvider.GitLab.pas', + DN.PackageProvider.GitLab.State in '..\..\DN.PackageProvider.GitLab.State.pas', + DN.PackageProvider.Installed in '..\..\DN.PackageProvider.Installed.pas', + DN.PackageProvider.Intf in '..\..\DN.PackageProvider.Intf.pas', + DN.PackageProvider.MultiSource in '..\..\DN.PackageProvider.MultiSource.pas', + DN.PackageProvider in '..\..\DN.PackageProvider.pas', + DN.PackageProvider.State.Intf in '..\..\DN.PackageProvider.State.Intf.pas', + DN.PackageProvider.State in '..\..\DN.PackageProvider.State.pas', + DN.PackageSource.ConfigPage.Folder in '..\..\DN.PackageSource.ConfigPage.Folder.pas' {DNFolderConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Github in '..\..\DN.PackageSource.ConfigPage.Github.pas' {DNGithubSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Gitlab in '..\..\DN.PackageSource.ConfigPage.Gitlab.pas' {DNGitlabSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Intf in '..\..\DN.PackageSource.ConfigPage.Intf.pas', + DN.PackageSource.ConfigPage in '..\..\DN.PackageSource.ConfigPage.pas', + DN.PackageSource.Folder in '..\..\DN.PackageSource.Folder.pas', + DN.PackageSource.Github in '..\..\DN.PackageSource.Github.pas', + DN.PackageSource.Gitlab in '..\..\DN.PackageSource.Gitlab.pas', + DN.PackageSource.Intf in '..\..\DN.PackageSource.Intf.pas', + DN.PackageSource in '..\..\DN.PackageSource.pas', + DN.PackageSource.Registry.Intf in '..\..\DN.PackageSource.Registry.Intf.pas', + DN.PackageSource.Registry in '..\..\DN.PackageSource.Registry.pas', + DN.PackageSource.Settings.Field.Intf in '..\..\DN.PackageSource.Settings.Field.Intf.pas', + DN.PackageSource.Settings.Field in '..\..\DN.PackageSource.Settings.Field.pas', + DN.PackageSource.Settings.Folder in '..\..\DN.PackageSource.Settings.Folder.pas', + DN.PackageSource.Settings.Github in '..\..\DN.PackageSource.Settings.Github.pas', + DN.PackageSource.Settings.Gitlab in '..\..\DN.PackageSource.Settings.Gitlab.pas', + DN.PackageSource.Settings.Intf in '..\..\DN.PackageSource.Settings.Intf.pas', + DN.PackageSource.Settings in '..\..\DN.PackageSource.Settings.pas', + DN.Preview in '..\..\DN.Preview.pas', + DN.Progress.Intf in '..\..\DN.Progress.Intf.pas', + DN.Progress in '..\..\DN.Progress.pas', + DN.ProjectGroupInfo.Intf in '..\..\DN.ProjectGroupInfo.Intf.pas', + DN.ProjectGroupInfo in '..\..\DN.ProjectGroupInfo.pas', + DN.ProjectInfo.Intf in '..\..\DN.ProjectInfo.Intf.pas', + DN.ProjectInfo in '..\..\DN.ProjectInfo.pas', + DN.Settings.Intf in '..\..\DN.Settings.Intf.pas', + DN.Settings in '..\..\DN.Settings.pas', + DN.Setup.Core in '..\..\DN.Setup.Core.pas', + DN.Setup.Dependency.Intf in '..\..\DN.Setup.Dependency.Intf.pas', + DN.Setup.Dependency in '..\..\DN.Setup.Dependency.pas', + DN.Setup.Dependency.Processor.Intf in '..\..\DN.Setup.Dependency.Processor.Intf.pas', + DN.Setup.Dependency.Processor in '..\..\DN.Setup.Dependency.Processor.pas', + DN.Setup.Dependency.Resolver.Install in '..\..\DN.Setup.Dependency.Resolver.Install.pas', + DN.Setup.Dependency.Resolver.Intf in '..\..\DN.Setup.Dependency.Resolver.Intf.pas', + DN.Setup.Dependency.Resolver.UnInstall in '..\..\DN.Setup.Dependency.Resolver.UnInstall.pas', + DN.Setup.Intf in '..\..\DN.Setup.Intf.pas', + DN.Setup in '..\..\DN.Setup.pas', + DN.TextTable.Intf in '..\..\DN.TextTable.Intf.pas', + DN.TextTable in '..\..\DN.TextTable.pas', + DN.ToolsApi in '..\..\DN.ToolsApi.pas', + DN.Types in '..\..\DN.Types.pas', + DN.Uninstaller.Delphinus in '..\..\DN.Uninstaller.Delphinus.pas', + DN.Uninstaller.IDE in '..\..\DN.Uninstaller.IDE.pas', + DN.Uninstaller.Intf in '..\..\DN.Uninstaller.Intf.pas', + DN.Uninstaller in '..\..\DN.Uninstaller.pas', + DN.Utils in '..\..\DN.Utils.pas', + DN.VariableResolver.Compiler.Factory in '..\..\DN.VariableResolver.Compiler.Factory.pas', + DN.VariableResolver.Compiler in '..\..\DN.VariableResolver.Compiler.pas', + DN.VariableResolver.Intf in '..\..\DN.VariableResolver.Intf.pas', + DN.VariableResolver in '..\..\DN.VariableResolver.pas', + DN.Version in '..\..\DN.Version.pas', + DN.Zip in '..\..\DN.Zip.pas'; + +end. + + + + diff --git a/Packages/DelphiX-Tokyo/Delphinus.dproj b/Packages/DelphiX-Tokyo/Delphinus.dproj new file mode 100644 index 0000000..0d89cad --- /dev/null +++ b/Packages/DelphiX-Tokyo/Delphinus.dproj @@ -0,0 +1,704 @@ + + + {0990B172-C221-4312-816E-1E634AF7EE2C} + Delphinus.dpk + 18.2 + VCL + True + Debug + Win32 + 1 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + ..;$(DCC_UnitSearchPath) + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + true + Delphinus + true + true + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + + + rtl;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;$(DCC_UsePackage) + + + rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + + + rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + $(BDS)\bin\bds.exe + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + + + +
AboutDialog
+ dfm +
+ +
CategoryFilterView
+ dfm + TFrame +
+ + +
DelphiInstallationView
+ dfm + TFrame +
+ +
DependencyDialog
+ dfm +
+ +
DelphinusDialog
+ dfm +
+ + +
LicenseDialog
+ dfm +
+ + +
DelphinusOptionsDialog
+ dfm +
+ +
TypeSelectionDialog
+ dfm +
+ +
ProgressDialog
+ dfm +
+ + + +
SetupDialog
+ dfm +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageDetailView
+ dfm + TFrame +
+ + + + + + + + + + + + + + + +
DNFolderConfigPage
+ dfm + TFrame +
+ +
DNGithubSourceConfigPage
+ dfm + TFrame +
+ +
DNGitlabSourceConfigPage
+ dfm + TFrame +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DelphinusImages.res
+
+ +
Delphinus.res
+
+ + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Package + + + + Delphinus.dpk + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + Delphinus.bpl + true + + + + + 1 + + + Contents\MacOS + 0 + + + + + classes + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + False + True + False + + + 12 + + + + +
diff --git a/Packages/DelphiX-Tokyo/Delphinus.res b/Packages/DelphiX-Tokyo/Delphinus.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/Packages/DelphiX-Tokyo/DelphinusImages.res b/Packages/DelphiX-Tokyo/DelphinusImages.res new file mode 100644 index 0000000000000000000000000000000000000000..a1219957d920981bb83075d905dc9759ef667383 GIT binary patch literal 112664 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 literal 0 HcmV?d00001 diff --git a/Packages/DelphiXE/Delphinus.dpk b/Packages/DelphiXE/Delphinus.dpk index 63fdb5e..4993b35 100644 --- a/Packages/DelphiXE/Delphinus.dpk +++ b/Packages/DelphiXE/Delphinus.dpk @@ -36,112 +36,146 @@ contains Delphinus.Main in '..\Delphinus.Main.pas', Delphinus.Controller in '..\Delphinus.Controller.pas', Delphinus.Dialog in '..\Delphinus.Dialog.pas' {DelphinusDialog}, - DN.Compiler.Intf in '..\..\DN.Compiler.Intf.pas', - DN.Compiler.MSBuild in '..\..\DN.Compiler.MSBuild.pas', - DN.Compiler in '..\..\DN.Compiler.pas', - DN.Installer.Intf in '..\..\DN.Installer.Intf.pas', - DN.Installer in '..\..\DN.Installer.pas', - DN.Package.Intf in '..\..\DN.Package.Intf.pas', - DN.Package in '..\..\DN.Package.pas', - DN.PackageOverview in '..\..\DN.PackageOverview.pas', - DN.PackageProvider.Intf in '..\..\DN.PackageProvider.Intf.pas', - DN.PackageProvider.GitHub in '..\..\DN.PackageProvider.GitHub.pas', - DN.Preview in '..\..\DN.Preview.pas', - DN.ProjectInfo.Intf in '..\..\DN.ProjectInfo.Intf.pas', - DN.ProjectInfo in '..\..\DN.ProjectInfo.pas', - DN.Types in '..\..\DN.Types.pas', - DN.Uninstaller.Intf in '..\..\DN.Uninstaller.Intf.pas', - DN.Uninstaller in '..\..\DN.Uninstaller.pas', - DN.Zip in '..\..\DN.Zip.pas', Delphinus.SetupDialog in '..\Delphinus.SetupDialog.pas' {SetupDialog}, - DN.PackageProvider in '..\..\DN.PackageProvider.pas', - DN.PackageProvider.Installed in '..\..\DN.PackageProvider.Installed.pas', - DN.Installer.IDE in '..\..\DN.Installer.IDE.pas', - DN.ToolsApi in '..\..\DN.ToolsApi.pas', - DN.Uninstaller.IDE in '..\..\DN.Uninstaller.IDE.pas', - DN.ProjectGroupInfo in '..\..\DN.ProjectGroupInfo.pas', - DN.ProjectGroupInfo.Intf in '..\..\DN.ProjectGroupInfo.Intf.pas', - DN.JSonFile in '..\..\DN.JSonFile.pas', - DN.JSonFile.Info in '..\..\DN.JSonFile.Info.pas', - DN.JSonFile.Installation in '..\..\DN.JSonFile.Installation.pas', - DN.Controls.Button in '..\..\DN.Controls.Button.pas', - DN.Controls in '..\..\DN.Controls.pas', - DN.Graphics in '..\..\DN.Graphics.pas', - DN.PackageDetailView in '..\..\DN.PackageDetailView.pas' {PackageDetailView: TFrame}, - DN.JSonFile.Uninstallation in '..\..\DN.JSonFile.Uninstallation.pas', - DN.JSonFile.InstalledInfo in '..\..\DN.JSonFile.InstalledInfo.pas', - DN.Package.Github in '..\..\DN.Package.Github.pas', - DN.JSonFile.CacheInfo in '..\..\DN.JSonFile.CacheInfo.pas', - DN.Package.Version.Intf in '..\..\DN.Package.Version.Intf.pas', - DN.Package.Version in '..\..\DN.Package.Version.pas', Delphinus.UiTypes in '..\Delphinus.UiTypes.pas', - DN.JSon in '..\..\DN.JSon.pas', Delphinus.Forms in '..\Delphinus.Forms.pas', Delphinus.OptionsDialog in '..\Delphinus.OptionsDialog.pas' {DelphinusOptionsDialog}, - DN.Setup.Intf in '..\..\DN.Setup.Intf.pas', - DN.Setup in '..\..\DN.Setup.pas', - DN.IOUtils in '..\..\DN.IOUtils.pas', Delphinus.LicenseDialog in '..\Delphinus.LicenseDialog.pas' {LicenseDialog}, Delphinus.CategoryFilterView in '..\Delphinus.CategoryFilterView.pas', Delphinus.ProgressDialog in '..\Delphinus.ProgressDialog.pas' {ProgressDialog}, - DN.PackageFilter in '..\..\DN.PackageFilter.pas', - DN.Progress.Intf in '..\..\DN.Progress.Intf.pas', - DN.Progress in '..\..\DN.Progress.pas', - DN.HttpClient.Intf in '..\..\DN.HttpClient.Intf.pas', - DN.HttpClient in '..\..\DN.HttpClient.pas', - DN.HttpClient.WinHttp in '..\..\DN.HttpClient.WinHttp.pas', - DN.Import.WinHttp in '..\..\DN.Import.WinHttp.pas', - DN.HttpClient.Cache.Intf in '..\..\DN.HttpClient.Cache.Intf.pas', - DN.HttpClient.Cache in '..\..\DN.HttpClient.Cache.pas', - DN.Environment in '..\..\DN.Environment.pas', - DN.ComCtrls.Helper in '..\..\DN.ComCtrls.Helper.pas', - DN.ActiveX in '..\..\DN.ActiveX.pas', - DN.Setup.Core in '..\..\DN.Setup.Core.pas', - DN.Settings.Intf in '..\..\DN.Settings.Intf.pas', - DN.Settings in '..\..\DN.Settings.pas', - DN.FileService.Intf in '..\..\DN.FileService.Intf.pas', - DN.FileService in '..\..\DN.FileService.pas', - DN.VariableResolver.Compiler in '..\..\DN.VariableResolver.Compiler.pas', - DN.VariableResolver.Intf in '..\..\DN.VariableResolver.Intf.pas', - DN.VariableResolver in '..\..\DN.VariableResolver.pas', Delphinus.Version in '..\Delphinus.Version.pas', - DN.Version in '..\..\DN.Version.pas', Delphinus.Resources.Names in '..\Delphinus.Resources.Names.pas', Delphinus.Resources in '..\Delphinus.Resources.pas', Delphinus.About in '..\Delphinus.About.pas' {AboutDialog}, - DN.Graphics.Loader in '..\..\DN.Graphics.Loader.pas', + Delphinus.DependencyDialog in '..\Delphinus.DependencyDialog.pas' {DependencyDialog}, + Delphinus.OptionsDialog.TypeSelection in '..\Delphinus.OptionsDialog.TypeSelection.pas' {TypeSelectionDialog}, + DN.ActiveX in '..\..\DN.ActiveX.pas', + DN.BPLService.Intf in '..\..\DN.BPLService.Intf.pas', + DN.BPLService.Registry in '..\..\DN.BPLService.Registry.pas', + DN.BPLService.ToolsApi in '..\..\DN.BPLService.ToolsApi.pas', + DN.Character in '..\..\DN.Character.pas', + DN.ComCtrls.Helper in '..\..\DN.ComCtrls.Helper.pas', DN.Compiler.IDE in '..\..\DN.Compiler.IDE.pas', + DN.Compiler.Intf in '..\..\DN.Compiler.Intf.pas', + DN.Compiler.MSBuild in '..\..\DN.Compiler.MSBuild.pas', + DN.Compiler in '..\..\DN.Compiler.pas', DN.Compiler.ValueOverrides.Factory in '..\..\DN.Compiler.ValueOverrides.Factory.pas', DN.Compiler.ValueOverrides.Intf in '..\..\DN.Compiler.ValueOverrides.Intf.pas', DN.Compiler.ValueOverrides in '..\..\DN.Compiler.ValueOverrides.pas', + DN.Controls.Button in '..\..\DN.Controls.Button.pas', + DN.Controls in '..\..\DN.Controls.pas', + DN.DelphiInstallation.Editions in '..\..\DN.DelphiInstallation.Editions.pas', + DN.DelphiInstallation.Intf in '..\..\DN.DelphiInstallation.Intf.pas', + DN.DelphiInstallation in '..\..\DN.DelphiInstallation.pas', + DN.DelphiInstallation.Provider.Intf in '..\..\DN.DelphiInstallation.Provider.Intf.pas', + DN.DelphiInstallation.Provider in '..\..\DN.DelphiInstallation.Provider.pas', DN.DPRProperties.Intf in '..\..\DN.DPRProperties.Intf.pas', DN.DPRProperties in '..\..\DN.DPRProperties.pas', - DN.PackageProvider.GitHub.State in '..\..\DN.PackageProvider.GitHub.State.pas', - DN.PackageProvider.State.Intf in '..\..\DN.PackageProvider.State.Intf.pas', - DN.PackageProvider.State in '..\..\DN.PackageProvider.State.pas', + DN.Environment in '..\..\DN.Environment.pas', + DN.EnvironmentOptions.IDE in '..\..\DN.EnvironmentOptions.IDE.pas', DN.EnvironmentOptions.Intf in '..\..\DN.EnvironmentOptions.Intf.pas', + DN.EnvironmentOptions in '..\..\DN.EnvironmentOptions.pas', + DN.EnvironmentOptions.Registry in '..\..\DN.EnvironmentOptions.Registry.pas', DN.ExpertService.Intf in '..\..\DN.ExpertService.Intf.pas', DN.ExpertService in '..\..\DN.ExpertService.pas', - DN.BPLService.Intf in '..\..\DN.BPLService.Intf.pas', - DN.BPLService.ToolsApi in '..\..\DN.BPLService.ToolsApi.pas', - DN.EnvironmentOptions.IDE in '..\..\DN.EnvironmentOptions.IDE.pas', - DN.EnvironmentOptions in '..\..\DN.EnvironmentOptions.pas', - DN.VariableResolver.Compiler.Factory in '..\..\DN.VariableResolver.Compiler.Factory.pas', - DN.Utils in '..\..\DN.Utils.pas', + DN.FileService.Intf in '..\..\DN.FileService.Intf.pas', + DN.FileService in '..\..\DN.FileService.pas', + DN.Graphics.Loader in '..\..\DN.Graphics.Loader.pas', + DN.Graphics in '..\..\DN.Graphics.pas', + DN.HttpClient.Cache.Intf in '..\..\DN.HttpClient.Cache.Intf.pas', + DN.HttpClient.Cache in '..\..\DN.HttpClient.Cache.pas', + DN.HttpClient.Intf in '..\..\DN.HttpClient.Intf.pas', + DN.HttpClient in '..\..\DN.HttpClient.pas', + DN.HttpClient.WinHttp in '..\..\DN.HttpClient.WinHttp.pas', + DN.Import.WinHttp in '..\..\DN.Import.WinHttp.pas', + DN.Installer.Delphinus in '..\..\DN.Installer.Delphinus.pas', + DN.Installer.IDE in '..\..\DN.Installer.IDE.pas', + DN.Installer.Intf in '..\..\DN.Installer.Intf.pas', + DN.Installer in '..\..\DN.Installer.pas', + DN.IOUtils in '..\..\DN.IOUtils.pas', + DN.JSon in '..\..\DN.JSon.pas', + DN.JSonFile.CacheInfo in '..\..\DN.JSonFile.CacheInfo.pas', + DN.JSonFile.Info in '..\..\DN.JSonFile.Info.pas', + DN.JSonFile.Installation in '..\..\DN.JSonFile.Installation.pas', + DN.JSonFile.InstalledInfo in '..\..\DN.JSonFile.InstalledInfo.pas', + DN.JSonFile in '..\..\DN.JSonFile.pas', + DN.JSonFile.Uninstallation in '..\..\DN.JSonFile.Uninstallation.pas', DN.Package.Dependency.Intf in '..\..\DN.Package.Dependency.Intf.pas', DN.Package.Dependency in '..\..\DN.Package.Dependency.pas', + DN.Package.DirectoryLoader.Intf in '..\..\DN.Package.DirectoryLoader.Intf.pas', + DN.Package.DirectoryLoader in '..\..\DN.Package.DirectoryLoader.pas', + DN.Package.Finder.Intf in '..\..\DN.Package.Finder.Intf.pas', + DN.Package.Finder in '..\..\DN.Package.Finder.pas', + DN.Package.Github in '..\..\DN.Package.Github.pas', + DN.Package.Intf in '..\..\DN.Package.Intf.pas', + DN.Package in '..\..\DN.Package.pas', + DN.Package.Version.Finder.Intf in '..\..\DN.Package.Version.Finder.Intf.pas', + DN.Package.Version.Finder in '..\..\DN.Package.Version.Finder.pas', + DN.Package.Version.Intf in '..\..\DN.Package.Version.Intf.pas', + DN.Package.Version in '..\..\DN.Package.Version.pas', + DN.PackageDetailView in '..\..\DN.PackageDetailView.pas' {PackageDetailView: TFrame}, + DN.PackageFilter in '..\..\DN.PackageFilter.pas', + DN.PackageOverview in '..\..\DN.PackageOverview.pas', + DN.PackageProvider.Folder in '..\..\DN.PackageProvider.Folder.pas', + DN.PackageProvider.GitHub in '..\..\DN.PackageProvider.GitHub.pas', + DN.PackageProvider.GitHub.State in '..\..\DN.PackageProvider.GitHub.State.pas', + DN.PackageProvider.GitHubRepo in '..\..\DN.PackageProvider.GitHubRepo.pas', + DN.PackageProvider.Installed in '..\..\DN.PackageProvider.Installed.pas', + DN.PackageProvider.Intf in '..\..\DN.PackageProvider.Intf.pas', + DN.PackageProvider.MultiSource in '..\..\DN.PackageProvider.MultiSource.pas', + DN.PackageProvider in '..\..\DN.PackageProvider.pas', + DN.PackageProvider.State.Intf in '..\..\DN.PackageProvider.State.Intf.pas', + DN.PackageProvider.State in '..\..\DN.PackageProvider.State.pas', + DN.PackageSource.ConfigPage.Folder in '..\..\DN.PackageSource.ConfigPage.Folder.pas' {DNFolderConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Github in '..\..\DN.PackageSource.ConfigPage.Github.pas' {DNGithubSourceConfigPage: TFrame}, + DN.PackageSource.ConfigPage.Intf in '..\..\DN.PackageSource.ConfigPage.Intf.pas', + DN.PackageSource.ConfigPage in '..\..\DN.PackageSource.ConfigPage.pas', + DN.PackageSource.Folder in '..\..\DN.PackageSource.Folder.pas', + DN.PackageSource.Github in '..\..\DN.PackageSource.Github.pas', + DN.PackageSource.Intf in '..\..\DN.PackageSource.Intf.pas', + DN.PackageSource in '..\..\DN.PackageSource.pas', + DN.PackageSource.Registry.Intf in '..\..\DN.PackageSource.Registry.Intf.pas', + DN.PackageSource.Registry in '..\..\DN.PackageSource.Registry.pas', + DN.PackageSource.Settings.Field.Intf in '..\..\DN.PackageSource.Settings.Field.Intf.pas', + DN.PackageSource.Settings.Field in '..\..\DN.PackageSource.Settings.Field.pas', + DN.PackageSource.Settings.Folder in '..\..\DN.PackageSource.Settings.Folder.pas', + DN.PackageSource.Settings.Github in '..\..\DN.PackageSource.Settings.Github.pas', + DN.PackageSource.Settings.Intf in '..\..\DN.PackageSource.Settings.Intf.pas', + DN.PackageSource.Settings in '..\..\DN.PackageSource.Settings.pas', + DN.Preview in '..\..\DN.Preview.pas', + DN.Progress.Intf in '..\..\DN.Progress.Intf.pas', + DN.Progress in '..\..\DN.Progress.pas', + DN.ProjectGroupInfo.Intf in '..\..\DN.ProjectGroupInfo.Intf.pas', + DN.ProjectGroupInfo in '..\..\DN.ProjectGroupInfo.pas', + DN.ProjectInfo.Intf in '..\..\DN.ProjectInfo.Intf.pas', + DN.ProjectInfo in '..\..\DN.ProjectInfo.pas', + DN.Settings.Intf in '..\..\DN.Settings.Intf.pas', + DN.Settings in '..\..\DN.Settings.pas', + DN.Setup.Core in '..\..\DN.Setup.Core.pas', + DN.Setup.Dependency.Intf in '..\..\DN.Setup.Dependency.Intf.pas', + DN.Setup.Dependency in '..\..\DN.Setup.Dependency.pas', DN.Setup.Dependency.Processor.Intf in '..\..\DN.Setup.Dependency.Processor.Intf.pas', DN.Setup.Dependency.Processor in '..\..\DN.Setup.Dependency.Processor.pas', DN.Setup.Dependency.Resolver.Install in '..\..\DN.Setup.Dependency.Resolver.Install.pas', DN.Setup.Dependency.Resolver.Intf in '..\..\DN.Setup.Dependency.Resolver.Intf.pas', DN.Setup.Dependency.Resolver.UnInstall in '..\..\DN.Setup.Dependency.Resolver.UnInstall.pas', - DN.Setup.Dependency in '..\..\DN.Setup.Dependency.pas', - DN.Setup.Dependency.Intf in '..\..\DN.Setup.Dependency.Intf.pas', - DN.Package.Finder.Intf in '..\..\DN.Package.Finder.Intf.pas', - DN.Package.Finder in '..\..\DN.Package.Finder.pas', - DN.Package.DirectoryLoader.Intf in '..\..\DN.Package.DirectoryLoader.Intf.pas', - DN.Package.DirectoryLoader in '..\..\DN.Package.DirectoryLoader.pas', - Delphinus.DependencyDialog in '..\Delphinus.DependencyDialog.pas' {DependencyDialog}; + DN.Setup.Intf in '..\..\DN.Setup.Intf.pas', + DN.Setup in '..\..\DN.Setup.pas', + DN.TextTable.Intf in '..\..\DN.TextTable.Intf.pas', + DN.TextTable in '..\..\DN.TextTable.pas', + DN.ToolsApi in '..\..\DN.ToolsApi.pas', + DN.Types in '..\..\DN.Types.pas', + DN.Uninstaller.Delphinus in '..\..\DN.Uninstaller.Delphinus.pas', + DN.Uninstaller.IDE in '..\..\DN.Uninstaller.IDE.pas', + DN.Uninstaller.Intf in '..\..\DN.Uninstaller.Intf.pas', + DN.Uninstaller in '..\..\DN.Uninstaller.pas', + DN.Utils in '..\..\DN.Utils.pas', + DN.VariableResolver.Compiler.Factory in '..\..\DN.VariableResolver.Compiler.Factory.pas', + DN.VariableResolver.Compiler in '..\..\DN.VariableResolver.Compiler.pas', + DN.VariableResolver.Intf in '..\..\DN.VariableResolver.Intf.pas', + DN.VariableResolver in '..\..\DN.VariableResolver.pas', + DN.Version in '..\..\DN.Version.pas', + DN.Zip in '..\..\DN.Zip.pas'; end. diff --git a/Packages/DelphiXE/Delphinus.dproj b/Packages/DelphiXE/Delphinus.dproj index d6975ab..57a2871 100644 --- a/Packages/DelphiXE/Delphinus.dproj +++ b/Packages/DelphiXE/Delphinus.dproj @@ -71,60 +71,15 @@ dfm
DelphinusDialog
- - - - - - - - - - - - - - - - - dfm
SetupDialog
- - - - - - - - - - - - - - - dfm -
PackageDetailView
- TFrame -
- - - - - - -
DelphinusOptionsDialog
- - -
LicenseDialog
@@ -132,68 +87,154 @@
ProgressDialog
- - - - - - - - - - - - - - - - - - - - -
AboutDialog
- + +
DependencyDialog
+
+ +
TypeSelectionDialog
+
+ + + + + + + + + + + + + + + + - - - + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageDetailView
+ TFrame +
+ + + + + + + + + + + + + +
DNFolderConfigPage
+ TFrame +
+ +
DNGithubSourceConfigPage
+ TFrame +
+ + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - -
DependencyDialog
-
+ + + + + + + + + + + + + + + + +
DelphinusImages.res
diff --git a/Packages/DelphiXE6/Delphinus.dpk b/Packages/DelphiXE6/Delphinus.dpk index e10bb16..617a08b 100644 --- a/Packages/DelphiXE6/Delphinus.dpk +++ b/Packages/DelphiXE6/Delphinus.dpk @@ -144,7 +144,27 @@ contains DN.Setup.Dependency.Processor.Intf in '..\..\DN.Setup.Dependency.Processor.Intf.pas', DN.Setup.Dependency.Processor in '..\..\DN.Setup.Dependency.Processor.pas', DN.Setup.Dependency.Resolver.Install in '..\..\DN.Setup.Dependency.Resolver.Install.pas', - DN.Setup.Dependency.Resolver.UnInstall in '..\..\DN.Setup.Dependency.Resolver.UnInstall.pas'; + DN.Setup.Dependency.Resolver.UnInstall in '..\..\DN.Setup.Dependency.Resolver.UnInstall.pas', + DN.PackageSource.Registry.Intf in '..\..\DN.PackageSource.Registry.Intf.pas', + DN.PackageSource.Registry in '..\..\DN.PackageSource.Registry.pas', + DN.PackageSource.Intf in '..\..\DN.PackageSource.Intf.pas', + DN.PackageSource in '..\..\DN.PackageSource.pas', + DN.PackageSource.Settings.Intf in '..\..\DN.PackageSource.Settings.Intf.pas', + DN.PackageSource.Settings in '..\..\DN.PackageSource.Settings.pas', + DN.PackageSource.Settings.Field.Intf in '..\..\DN.PackageSource.Settings.Field.Intf.pas', + DN.PackageSource.Settings.Field in '..\..\DN.PackageSource.Settings.Field.pas', + DN.PackageSource.Github in '..\..\DN.PackageSource.Github.pas', + DN.PackageSource.Settings.Github in '..\..\DN.PackageSource.Settings.Github.pas', + DN.Character in '..\..\DN.Character.pas', + DN.PackageSource.ConfigPage in '..\..\DN.PackageSource.ConfigPage.pas', + DN.PackageSource.ConfigPage.Intf in '..\..\DN.PackageSource.ConfigPage.Intf.pas', + DN.PackageSource.ConfigPage.Github in '..\..\DN.PackageSource.ConfigPage.Github.pas' {DNGithubSourceConfigPage: TFrame}, + DN.PackageProvider.MultiSource in '..\..\DN.PackageProvider.MultiSource.pas', + DN.PackageProvider.Folder in '..\..\DN.PackageProvider.Folder.pas', + DN.PackageSource.Folder in '..\..\DN.PackageSource.Folder.pas', + DN.PackageSource.Settings.Folder in '..\..\DN.PackageSource.Settings.Folder.pas', + DN.PackageSource.ConfigPage.Folder in '..\..\DN.PackageSource.ConfigPage.Folder.pas' {DNFolderConfigPage: TFrame}, + Delphinus.OptionsDialog.TypeSelection in '..\Delphinus.OptionsDialog.TypeSelection.pas' {TypeSelectionDialog}; end. diff --git a/Packages/DelphiXE6/Delphinus.dproj b/Packages/DelphiXE6/Delphinus.dproj index eefafc2..edcd18e 100644 --- a/Packages/DelphiXE6/Delphinus.dproj +++ b/Packages/DelphiXE6/Delphinus.dproj @@ -2,7 +2,7 @@ {0990B172-C221-4312-816E-1E634AF7EE2C} Delphinus.dpk - 15.4 + 18.2 VCL True Debug @@ -13,11 +13,6 @@ true - - true - Base - true - true Base @@ -59,9 +54,6 @@ false false - - rtl;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;$(DCC_UsePackage) - rtl;vclimg;dbrtl;DbxCommonDriver;IndyCore;IndySystem;IndyProtocols;vcl;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) @@ -226,6 +218,37 @@ + + + + + + + + + + + + + + +
DNGithubSourceConfigPage
+ dfm + TFrame +
+ + + + + +
DNFolderConfigPage
+ dfm + TFrame +
+ +
TypeSelectionDialog
+ dfm +
DelphinusImages.res
@@ -257,9 +280,372 @@ Microsoft Office XP Sample Automation Server Wrapper Components - + + + + Delphinus.bpl + true + + + + + 1 + + + Contents\MacOS + 0 + + + + + classes + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + 1 + + + 1 + + + 0 + + + + + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + + + + 1 + + + 1 + + + 1 + + + + + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + - False True False @@ -268,4 +654,5 @@ + diff --git a/Packages/DelphiXE6/Delphinus.res b/Packages/DelphiXE6/Delphinus.res new file mode 100644 index 0000000000000000000000000000000000000000..36f26e234a8ac66a47e95cec6d496cf2f1442471 GIT binary patch literal 32 UcmZQzU|>)H;{X347|28c09i@|9RL6T literal 0 HcmV?d00001 diff --git a/Packages/DelphiXE6/DelphinusImages.res b/Packages/DelphiXE6/DelphinusImages.res new file mode 100644 index 0000000000000000000000000000000000000000..ff5b610faf90b0a56a30588febaf624751c17899 GIT binary patch literal 108304 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 + FOnlineSubNodeNames: TArray; + FOnlineSubNodeCounts: TArray; FInstalledNodeIndex: Integer; FUpdatesNodeIndex: Integer; FOnCategoryChanged: TCategoryChanged; FOnlineCount: Integer; FInstalledCount: Integer; FUpdatesCount: Integer; - procedure CategoryChanged(ANewCategory: TPackageCategory); + procedure CategoryChanged(ANewCategory: TPackageCategory; ASubNode: Integer); function GetNumberedCaption(const AText: string; AValue: Integer): string; procedure SetInstalledCount(const Value: Integer); procedure SetOnlineCount(const Value: Integer); procedure SetUpdatesCount(const Value: Integer); + function GetSubOnlineCount(const AIndex: Integer): Integer; + procedure SetSubOnlineCount(const AIndex, Value: Integer); public { Public declarations } constructor Create(AOwner: TComponent); override; + procedure SetOnlineSubnodes(const ANames: TArray); property OnCategoryChanged: TCategoryChanged read FOnCategoryChanged write FOnCategoryChanged; property OnlineCount: Integer read FOnlineCount write SetOnlineCount; property InstalledCount: Integer read FInstalledCount write SetInstalledCount; property UpdatesCount: Integer read FUpdatesCount write SetUpdatesCount; + property SubOnlineCount[const AIndex: Integer]: Integer read GetSubOnlineCount write SetSubOnlineCount; end; implementation @@ -64,10 +71,10 @@ implementation { TCategoryFilterView } -procedure TCategoryFilterView.CategoryChanged(ANewCategory: TPackageCategory); +procedure TCategoryFilterView.CategoryChanged(ANewCategory: TPackageCategory; ASubNode: Integer); begin if Assigned(FOnCategoryChanged) then - FOnCategoryChanged(Self, ANewCategory); + FOnCategoryChanged(Self, ANewCategory, ASubNode); end; constructor TCategoryFilterView.Create(AOwner: TComponent); @@ -81,9 +88,9 @@ constructor TCategoryFilterView.Create(AOwner: TComponent); //See(in german): http://www.delphipraxis.net/89993-treenode-treeview-automatisches-destroy.html LOnlineNode := tvCategories.Items.AddChild(nil, GetNumberedCaption(COnline, FOnlineCount)); LOnlineNode.Selected := True; - FOnlineNodeIndex := LOnlineNode.AbsoluteIndex; - FInstalledNodeIndex := tvCategories.Items.AddChild(nil, GetNumberedCaption(CInstalled, FInstalledCount)).AbsoluteIndex; - FUpdatesNodeIndex := tvCategories.Items.AddChild(nil, GetNumberedCaption(CUpdates, FUpdatesCount)).AbsoluteIndex; + FOnlineNodeIndex := LOnlineNode.Index; + FInstalledNodeIndex := tvCategories.Items.AddChild(nil, GetNumberedCaption(CInstalled, FInstalledCount)).Index; + FUpdatesNodeIndex := tvCategories.Items.AddChild(nil, GetNumberedCaption(CUpdates, FUpdatesCount)).Index; LRect := LOnlineNode.DisplayRect(False); tvCategories.ClientHeight := (LRect.Bottom - LRect.Top)*3; end; @@ -103,6 +110,11 @@ function TCategoryFilterView.GetNumberedCaption(const AText: string; Result := AText; end; +function TCategoryFilterView.GetSubOnlineCount(const AIndex: Integer): Integer; +begin + Result := FOnlineSubNodeCounts[AIndex]; +end; + procedure TCategoryFilterView.SetInstalledCount(const Value: Integer); begin FInstalledCount := Value; @@ -115,6 +127,35 @@ procedure TCategoryFilterView.SetOnlineCount(const Value: Integer); tvCategories.Items.Item[FOnlineNodeIndex].Text := GetNumberedCaption(COnline, FOnlineCount); end; +procedure TCategoryFilterView.SetOnlineSubnodes(const ANames: TArray); +var + LOnlineNode, LSubNode: TTreeNode; + i: Integer; +begin + FOnlineSubNodeNames := ANames; + SetLength(FOnlineSubNodes, Length(ANames)); + SetLength(FOnlineSubNodeCounts, Length(ANames)); + LOnlineNode := tvCategories.Items.Item[FOnlineNodeIndex]; + FInstalledNodeIndex := FOnlineNodeIndex + 1; + FUpdatesNodeIndex := FOnlineNodeIndex + 2; + for i := Pred(LOnlineNode.Count) downto 0 do + tvCategories.Items.Delete(LOnlineNode.Item[i]); + + for i := 0 to High(FOnlineSubNodeNames) do + begin + LSubNode := tvCategories.Items.AddChild(LOnlineNode, FOnlineSubNodeNames[i]); + FOnlineSubNodes[i] := LSubNode.Index; + Inc(FInstalledNodeIndex); + Inc(FUpdatesNodeIndex); + end; +end; + +procedure TCategoryFilterView.SetSubOnlineCount(const AIndex, Value: Integer); +begin + FOnlineSubNodeCounts[AIndex] := Value; + tvCategories.Items[FOnlineNodeIndex].Item[FOnlineSubNodes[AIndex]].Text := GetNumberedCaption(FOnlineSubNodeNames[AIndex], Value); +end; + procedure TCategoryFilterView.SetUpdatesCount(const Value: Integer); begin FUpdatesCount := Value; @@ -135,7 +176,6 @@ procedure TCategoryFilterView.tvCategoriesAdvancedCustomDrawItem( begin LRect := Node.DisplayRect(False); LText := Node.Text; - if cdsSelected in State then LBackground := clSkyBlue else if cdsHot in State then @@ -146,8 +186,19 @@ procedure TCategoryFilterView.tvCategoriesAdvancedCustomDrawItem( Sender.Canvas.Brush.Color := LBackground; Sender.Canvas.FillRect(LRect); SetBkMode(Sender.Canvas.Handle, TRANSPARENT); - LRect.Left := 3; + LRect.Left := 16; + if Assigned(Node.Parent) then + LRect.Left := LRect.Left + 10; Sender.Canvas.TextRect(LRect, LText); + if Node.Count > 0 then + begin + LRect.Left := 2; + if Node.Expanded then + LText := '-' + else + LText := '+'; + Sender.Canvas.TextRect(LRect, LText); + end; DefaultDraw := True; end; end; @@ -155,17 +206,23 @@ procedure TCategoryFilterView.tvCategoriesAdvancedCustomDrawItem( procedure TCategoryFilterView.tvCategoriesChange(Sender: TObject; Node: TTreeNode); begin - case Node.Index of - 0: CategoryChanged(pcOnline); - 1: CategoryChanged(pcInstalled); - 2: CategoryChanged(pcUpdates); - end; + if not Assigned(Node.Parent) then + begin + if Node.AbsoluteIndex = FOnlineNodeIndex then + CategoryChanged(pcOnline, -1) + else if Node.AbsoluteIndex = FInstalledNodeIndex then + CategoryChanged(pcInstalled, -1) + else if Node.AbsoluteIndex = FUpdatesNodeIndex then + CategoryChanged(pcUpdates, -1); + end + else + CategoryChanged(pcOnline, Node.Index); end; procedure TCategoryFilterView.tvCategoriesCollapsing(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean); begin - AllowCollapse := False; + AllowCollapse := True; end; end. diff --git a/Packages/Delphinus.Dialog.dfm b/Packages/Delphinus.Dialog.dfm index b50ecca..69e7deb 100644 --- a/Packages/Delphinus.Dialog.dfm +++ b/Packages/Delphinus.Dialog.dfm @@ -35,6 +35,7 @@ object DelphinusDialog: TDelphinusDialog BevelOuter = bvNone ShowCaption = False TabOrder = 0 + Visible = False DesignSize = ( 984 32) diff --git a/Packages/Delphinus.Dialog.pas b/Packages/Delphinus.Dialog.pas index 734fa42..28caaa9 100644 --- a/Packages/Delphinus.Dialog.pas +++ b/Packages/Delphinus.Dialog.pas @@ -30,9 +30,11 @@ interface DN.PackageFilter, DN.Version, DN.EnvironmentOptions.Intf, + DN.PackageSource.Registry.Intf, + DN.PackageSource.Settings.Intf, ExtCtrls, StdCtrls, - Registry; + Registry, System.Actions, System.ImageList; type TDelphinusDialog = class(TForm) @@ -79,11 +81,14 @@ TDelphinusDialog = class(TForm) FSettings: IDNSettings; FCategoryFilteView: TCategoryFilterView; FCategory: TPackageCategory; + FCategorySubNode: Integer; FProgressDialog: TProgressDialog; FFilter: string; FFileService: IDNFileService; FDummyPic: TGraphic; FEnvironmentOptionsService: IDNEnvironmentOptionsService; + FSourceRegistry: IDNPackageSourceRegistry; + FProviders: TList; procedure ReloadPackages; procedure InstallPackage(const APackage: IDNPackage); procedure UnInstallPackage(const APackage: IDNPackage); @@ -105,7 +110,7 @@ TDelphinusDialog = class(TForm) function CreateInstallDependencyResolver: IDNSetupDependencyResolver; function CreateUninstallDependencyResolver: IDNSetupDependencyResolver; function IsStarter: Boolean; - procedure HandleCategoryChanged(Sender: TObject; ANewCategory: TPackageCategory); + procedure HandleCategoryChanged(Sender: TObject; ANewCategory: TPackageCategory; ASubNode: Integer); procedure HandleSelectedPackageChanged(Sender: TObject); procedure HandleAsyncProgress(const ATask, AItem: string; AProgress, AMax: Int64); function GetActivePackageSource: TList; @@ -114,6 +119,7 @@ TDelphinusDialog = class(TForm) procedure FilterPackage(const APackage: IDNPackage; var AAccepted: Boolean); procedure LoadIcons; procedure ShowWarning(const AMessage: string); + function SourceSettingsFactory(const ASourceName: string; out ASettings: IDNPackageSourceSettings): Boolean; public { Public declarations } constructor Create(AOwner: TComponent); override; @@ -134,7 +140,6 @@ implementation DN.Types, DN.Package.Finder.Intf, DN.Package.Finder, - DN.PackageProvider.GitHub, DN.PackageProvider.Installed, DN.PackageProvider.State.Intf, Delphinus.SetupDialog, @@ -150,8 +155,6 @@ implementation DN.Setup.Dependency.Resolver.Uninstall, DN.Setup.Dependency.Processor, Delphinus.OptionsDialog, - DN.HttpClient.Intf, - DN.HttpClient.WinHttp, DN.Progress.Intf, DN.Settings, DN.ExpertService, @@ -163,6 +166,12 @@ implementation DN.VariableResolver.Intf, DN.VariableResolver.Compiler, DN.VariableResolver.Compiler.Factory, + DN.PackageSource.Registry, + DN.PackageSource.Intf, + DN.PackageSource.GitHub, + DN.PackageSource.GitLab, + DN.PackageSource.Folder, + DN.PackageProvider.MultiSource, Delphinus.Resources.Names, Delphinus.Resources, Delphinus.About, @@ -193,7 +202,7 @@ procedure TDelphinusDialog.actOptionsExecute(Sender: TObject); var LDialog: TDelphinusOptionsDialog; begin - LDialog := TDelphinusOptionsDialog.Create(nil); + LDialog := TDelphinusOptionsDialog.Create(FSourceRegistry); try LDialog.LoadSettings(FSettings); if LDialog.ShowModal = mrOk then @@ -230,12 +239,17 @@ procedure TDelphinusDialog.btnInstallFolderClick(Sender: TObject); constructor TDelphinusDialog.Create(AOwner: TComponent); begin inherited; - FSettings := TDNSettings.Create(); + FSourceRegistry := TDNPackageSourceRegistry.Create(); + FSourceRegistry.RegisterSource(TDNGithubPackageSource.Create() as IDNPackageSource); + FSourceRegistry.RegisterSource(TDNGitlabPackageSource.Create() as IDNPackageSource); + FSourceRegistry.RegisterSource(TDNFolderPackageSource.Create() as IDNPackageSource); + FSettings := TDNSettings.Create(SourceSettingsFactory); FPackages := TList.Create(); FInstalledPackages := TList.Create(); FUpdatePackages := TList.Create(); FFileService := TDNFileService.Create((BorlandIDEServices as IOTAServices).GetBaseRegistryKey); FEnvironmentOptionsService := TDNIDEEnvironmentOptionsService.Create(); + FProviders := TList.Create(); FProgressDialog := TProgressDialog.Create(Self); FDetailView := TPackageDetailView.Create(Self); @@ -347,6 +361,7 @@ destructor TDelphinusDialog.Destroy; FPackageProvider := nil; FInstalledPackageProvider := nil; FSettings := nil; + FProviders.Free; FDummyPic.Free; inherited; end; @@ -413,7 +428,13 @@ function TDelphinusDialog.GetActiveOverView: TPackageOverView; function TDelphinusDialog.GetActivePackageSource: TList; begin case FCategory of - pcOnline: Result := FPackages; + pcOnline: + begin + if FCategorySubNode = -1 then + Result := FPackages + else + Result := FProviders[FCategorySubNode].Packages; + end; pcInstalled: Result := FInstalledPackages; pcUpdates: Result := FUpdatePackages; else @@ -510,10 +531,10 @@ procedure TDelphinusDialog.HandleAsyncProgress(const ATask, AItem: string; ); end; -procedure TDelphinusDialog.HandleCategoryChanged(Sender: TObject; - ANewCategory: TPackageCategory); +procedure TDelphinusDialog.HandleCategoryChanged(Sender: TObject; ANewCategory: TPackageCategory; ASubNode: Integer); begin FCategory := ANewCategory; + FCategorySubNode := ASubNode; RefreshOverview(); end; @@ -595,26 +616,49 @@ procedure TDelphinusDialog.LoadIcons; procedure TDelphinusDialog.RecreatePackageProvider; var - LClient: IDNHttpClient; + LSource: IDNPackageSource; + LSetting: IDNPackageSourceSettings; + LNames: TArray; + i: Integer; begin - LClient := TDNWinHttpClient.Create(); - if FSettings.OAuthToken <> '' then - LClient.Authentication := Format(CGithubOAuthAuthentication, [FSettings.OAuthToken]); - FPackageProvider := TDNGitHubPackageProvider.Create(LClient); + FPackageProvider := nil; + FProviders.Clear; + SetLength(LNames, Length(FSettings.SourceSettings)); + i := 0; + for LSetting in FSettings.SourceSettings do + begin + if FSourceRegistry.TryGetSource(LSetting.SourceName, LSource) then + begin + FProviders.Add(LSource.NewProvider(LSetting)); + LNames[i] := LSetting.Name; + Inc(i); + end; + end; + SetLength(LNames, i); + FCategoryFilteView.SetOnlineSubnodes(LNames); + FPackageProvider := TDNMultiSourceProvider.Create(FProviders.ToArray); end; procedure TDelphinusDialog.RefreshInstalledPackages; var LInstalledPackage: IDNPackage; LState: IDNPackageProviderState; + LProvider: IDNPackageProvider; begin - if Supports(FPackageProvider, IDNPackageProviderState, LState) then + for LProvider in FProviders do begin - if LState.State <> psOk then - ShowWarning(LState.LastError) - else - pnlWarning.Visible := False; + if Supports(LProvider, IDNPackageProviderState, LState) then + begin + if LState.State <> psOk then + begin + ShowWarning(LState.LastError); + Break; + end + else + pnlWarning.Visible := False; + end; end; + if FInstalledPackageProvider.Reload() then begin FInstalledPackages.Clear; @@ -659,9 +703,13 @@ procedure TDelphinusDialog.ReloadPackages; LProgress.OnProgress := nil; TThread.Queue(nil, procedure + var + i: Integer; begin begin FCategoryFilteView.OnlineCount := FPackages.Count; + for i := 0 to Pred(FProviders.Count) do + FCategoryFilteView.SubOnlineCount[i] := FProviders[i].Packages.Count; RefreshInstalledPackages(); FProgressDialog.ModalResult := mrOk; end; @@ -697,6 +745,16 @@ procedure TDelphinusDialog.ShowWarning(const AMessage: string); pnlWarning.Visible := True; end; +function TDelphinusDialog.SourceSettingsFactory(const ASourceName: string; + out ASettings: IDNPackageSourceSettings): Boolean; +var + LSource: IDNPackageSource; +begin + Result := FSourceRegistry.TryGetSource(ASourceName, LSource); + if Result then + ASettings := LSource.NewSettings; +end; + procedure TDelphinusDialog.UnInstallPackage(const APackage: IDNPackage); var LDialog: TSetupDialog; diff --git a/Packages/Delphinus.LicenseDialog.pas b/Packages/Delphinus.LicenseDialog.pas index 500044c..df932c3 100644 --- a/Packages/Delphinus.LicenseDialog.pas +++ b/Packages/Delphinus.LicenseDialog.pas @@ -6,7 +6,8 @@ interface Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DN.Package.Intf, - Delphinus.Forms, Vcl.ComCtrls; + Delphinus.Forms, + ComCtrls; type TLicenseDialog = class(TForm) diff --git a/Packages/Delphinus.OptionsDialog.TypeSelection.dfm b/Packages/Delphinus.OptionsDialog.TypeSelection.dfm new file mode 100644 index 0000000..238a781 --- /dev/null +++ b/Packages/Delphinus.OptionsDialog.TypeSelection.dfm @@ -0,0 +1,73 @@ +object TypeSelectionDialog: TTypeSelectionDialog + Left = 0 + Top = 0 + BorderStyle = bsDialog + Caption = 'Source Type Selection' + ClientHeight = 125 + ClientWidth = 309 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + Position = poScreenCenter + DesignSize = ( + 309 + 125) + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 8 + Width = 125 + Height = 13 + Caption = 'Select the type of source:' + end + object Label2: TLabel + Left = 8 + Top = 51 + Width = 31 + Height = 13 + Caption = 'Name:' + end + object cbSourceType: TComboBox + Left = 8 + Top = 24 + Width = 293 + Height = 21 + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + TabOrder = 0 + end + object btnOK: TButton + Left = 145 + Top = 92 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + TabOrder = 1 + OnClick = btnOKClick + end + object btnCancel: TButton + Left = 226 + Top = 92 + Width = 75 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 2 + end + object edSourceName: TEdit + Left = 8 + Top = 67 + Width = 293 + Height = 21 + Anchors = [akLeft, akTop, akRight] + TabOrder = 3 + TextHint = 'New Name' + end +end diff --git a/Packages/Delphinus.OptionsDialog.TypeSelection.pas b/Packages/Delphinus.OptionsDialog.TypeSelection.pas new file mode 100644 index 0000000..3b84c3b --- /dev/null +++ b/Packages/Delphinus.OptionsDialog.TypeSelection.pas @@ -0,0 +1,95 @@ +unit Delphinus.OptionsDialog.TypeSelection; + +interface + +uses + Messages, + SysUtils, + Variants, + Classes, + Graphics, + Controls, + Forms, + Dialogs, + StdCtrls, + DN.PackageSource.Intf; + +type + TIsNameValid = reference to function(const AName: string): Boolean; + + TTypeSelectionDialog = class(TForm) + cbSourceType: TComboBox; + btnOK: TButton; + btnCancel: TButton; + Label1: TLabel; + Label2: TLabel; + edSourceName: TEdit; + procedure btnOKClick(Sender: TObject); + private + FOnValidateName: TIsNameValid; + FSources: TArray; + function GetSelectedSource: IDNPackageSource; + function GetSourceName: string; + { Private declarations } + public + { Public declarations } + constructor Create(const ASources: TArray); reintroduce; + property SelectedSource: IDNPackageSource read GetSelectedSource; + property SourceName: string read GetSourceName; + property OnValidateName: TIsNameValid read FOnValidateName write FOnValidateName; + end; + +var + TypeSelectionDialog: TTypeSelectionDialog; + +implementation + +{$R *.dfm} + +procedure TTypeSelectionDialog.btnOKClick(Sender: TObject); +var + LName: string; +begin + if cbSourceType.ItemIndex < 0 then + begin + MessageDlg('You must select a sourcetype!', mtInformation, [mbOK], 0); + Exit; + end; + + LName := SourceName; + if LName = '' then + begin + MessageDlg('Name can not be empty!', mtInformation, [mbOK], 0); + Exit; + end; + + if not FOnValidateName(LName) then + begin + MessageDlg('Name is already in use!', mtInformation, [mbOK], 0); + Exit; + end; + ModalResult := mrOk; +end; + +constructor TTypeSelectionDialog.Create( + const ASources: TArray); +var + LSource: IDNPackageSource; +begin + inherited Create(nil); + FSources := ASources; + for LSource in FSources do + cbSourceType.Items.Add(LSource.Name); +end; + +function TTypeSelectionDialog.GetSelectedSource: IDNPackageSource; +begin + Result := FSources[cbSourceType.ItemIndex]; +end; + +function TTypeSelectionDialog.GetSourceName: string; +begin + Result := Trim(edSourceName.Text); +end; + +end. diff --git a/Packages/Delphinus.OptionsDialog.dfm b/Packages/Delphinus.OptionsDialog.dfm index d8e2140..fde46ee 100644 --- a/Packages/Delphinus.OptionsDialog.dfm +++ b/Packages/Delphinus.OptionsDialog.dfm @@ -4,8 +4,8 @@ object DelphinusOptionsDialog: TDelphinusOptionsDialog BorderIcons = [biSystemMenu] BorderStyle = bsSingle Caption = 'Options' - ClientHeight = 166 - ClientWidth = 395 + ClientHeight = 408 + ClientWidth = 525 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -14,55 +14,99 @@ object DelphinusOptionsDialog: TDelphinusOptionsDialog Font.Style = [] OldCreateOrder = False Position = poMainFormCenter + DesignSize = ( + 525 + 408) PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel - Left = 8 - Top = 8 - Width = 64 + Left = 3 + Top = 36 + Width = 42 Height = 13 - Caption = 'OAuth-Token' - end - object lbResponse: TLabel - Left = 8 - Top = 54 - Width = 298 - Height = 13 - AutoSize = False - end - object edToken: TEdit - Left = 8 - Top = 27 - Width = 298 - Height = 21 - PasswordChar = '*' - TabOrder = 0 - end - object btnTest: TButton - Left = 312 - Top = 25 - Width = 75 - Height = 25 - Caption = 'Test' - TabOrder = 1 - OnClick = btnTestClick + Caption = 'Sources:' end object btnOK: TButton - Left = 231 - Top = 133 + Left = 364 + Top = 381 Width = 75 Height = 25 + Anchors = [akRight, akBottom] Caption = 'OK' ModalResult = 1 - TabOrder = 2 + TabOrder = 0 + ExplicitLeft = 221 + ExplicitTop = 152 end object btnCancel: TButton - Left = 312 - Top = 133 + Left = 445 + Top = 381 Width = 75 Height = 25 + Anchors = [akRight, akBottom] Caption = 'Cancel' ModalResult = 2 + TabOrder = 1 + ExplicitLeft = 302 + ExplicitTop = 152 + end + object lvSources: TListView + AlignWithMargins = True + Left = 3 + Top = 55 + Width = 126 + Height = 350 + Margins.Top = 25 + Align = alLeft + Columns = <> + TabOrder = 2 + ViewStyle = vsList + OnSelectItem = lvSourcesSelectItem + ExplicitHeight = 121 + end + object pnlSettings: TPanel + Left = 135 + Top = 33 + Width = 385 + Height = 342 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone TabOrder = 3 + ExplicitWidth = 242 + ExplicitHeight = 113 + end + object ToolBar1: TToolBar + Left = 0 + Top = 0 + Width = 525 + Height = 30 + AutoSize = True + ButtonHeight = 30 + ButtonWidth = 31 + Caption = 'ToolBar1' + Images = ilToolbar + TabOrder = 4 + ExplicitWidth = 382 + object tbAdd: TToolButton + Left = 0 + Top = 0 + Caption = 'tbAdd' + ImageIndex = 0 + OnClick = tbAddClick + end + object tbDelete: TToolButton + Left = 31 + Top = 0 + Caption = 'tbDelete' + ImageIndex = 1 + OnClick = tbDeleteClick + end + end + object ilToolbar: TImageList + ColorDepth = cd32Bit + Height = 24 + Width = 24 + Left = 184 + Top = 88 end end diff --git a/Packages/Delphinus.OptionsDialog.pas b/Packages/Delphinus.OptionsDialog.pas index ea4a6c1..0f77097 100644 --- a/Packages/Delphinus.OptionsDialog.pas +++ b/Packages/Delphinus.OptionsDialog.pas @@ -10,24 +10,44 @@ interface uses + Generics.Collections, Windows, Messages, SysUtils, Variants, Classes, Graphics, - Controls, Forms, Dialogs, - Delphinus.Forms, StdCtrls, - DN.Settings.Intf; + Controls, Forms, + Dialogs, + Delphinus.Forms, + DN.PackageSource.Registry.Intf, + DN.Settings.Intf, + DN.PackageSource.Settings.Intf, + DN.PackageSource.ConfigPage.Intf, + StdCtrls, + ComCtrls, + ExtCtrls, ToolWin, ImgList, System.ImageList; type TDelphinusOptionsDialog = class(TForm) - edToken: TEdit; - Label1: TLabel; - btnTest: TButton; btnOK: TButton; btnCancel: TButton; - lbResponse: TLabel; - procedure btnTestClick(Sender: TObject); + lvSources: TListView; + pnlSettings: TPanel; + ToolBar1: TToolBar; + tbAdd: TToolButton; + tbDelete: TToolButton; + ilToolbar: TImageList; + Label1: TLabel; + procedure lvSourcesSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure tbDeleteClick(Sender: TObject); + procedure tbAddClick(Sender: TObject); private { Private declarations } + FRegistry: IDNPackageSourceRegistry; + FSettings: TList; + FPages: TDictionary; + procedure RebuildSettingsList; public { Public declarations } + constructor Create(const ARegistry: IDNPackageSourceRegistry); reintroduce; + destructor Destroy; override; procedure LoadSettings(const ASettings: IDNSettings); procedure StoreSettings(const ASettings: IDNSettings); end; @@ -38,48 +58,130 @@ TDelphinusOptionsDialog = class(TForm) implementation uses - DN.PackageProvider.GitHub, - DN.JSon, - DN.HttpClient.Intf, - DN.HttpClient.WinHttp; + DN.PackageSource.Intf, + Delphinus.Resources, + Delphinus.Resources.Names, + Delphinus.OptionsDialog.TypeSelection; {$R *.dfm} { TDelphinusOptionsDialog } -procedure TDelphinusOptionsDialog.btnTestClick(Sender: TObject); +constructor TDelphinusOptionsDialog.Create(const ARegistry: IDNPackageSourceRegistry); +begin + inherited Create(nil); + FSettings := TList.Create(); + FPages := TDictionary.Create(); + FRegistry := ARegistry; + tbAdd.ImageIndex := AddIconToImageList(ilToolbar, Ico_Add); + tbDelete.ImageIndex := AddIconToImageList(ilToolbar, Ico_Delete); +end; + +destructor TDelphinusOptionsDialog.Destroy; +begin + FPages.Free; + FSettings.Free; + inherited; +end; + +procedure TDelphinusOptionsDialog.LoadSettings(const ASettings: IDNSettings); +begin + FSettings.Clear(); + FSettings.AddRange(ASettings.SourceSettings); + RebuildSettingsList(); +end; + +procedure TDelphinusOptionsDialog.lvSourcesSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); var - LClient: IDNHttpClient; - LResult: Integer; - LResponse: string; - LJSon: TJSONObject; + LSource: IDNPackageSource; + LSettings: IDNPackageSourceSettings; + LPage, LOldPage: IDNPackageSourceConfigPage; begin - LClient := TDNWinHttpClient.Create(); - LClient.Authentication := Format(CGithubOAuthAuthentication, [Trim(edToken.Text)]); - LResult := LClient.GetText('https://api.github.com/user', LResponse); - if LResult = HTTPErrorOk then + LPage := nil; + if Selected then begin - LJSon := TJSonObject.ParseJSONValue(LResponse) as TJSonObject; - try - lbResponse.Caption := 'Authenticated as ' + LJSon.GetValue('login').Value; - finally - LJSon.Free; + LSettings := FSettings[Item.Index]; + if not FPages.TryGetValue(LSettings, LPage) then + begin + if not FRegistry.TryGetSource(LSettings.SourceName, LSource) then + Exit; + LPage := LSource.NewConfigPage; + FPages.Add(LSettings, LPage); end; - end - else - begin - lbResponse.Caption := 'Failed with ResponseCode ' + IntToStr(LResult); + LPage.Parent := pnlSettings; + LPage.Load(LSettings); end; + + for LOldPage in FPages.Values do + if LOldPage <> LPage then + LOldPage.Parent := nil; end; -procedure TDelphinusOptionsDialog.LoadSettings(const ASettings: IDNSettings); +procedure TDelphinusOptionsDialog.RebuildSettingsList; +var + LSetting: IDNPackageSourceSettings; begin - edToken.Text := ASettings.OAuthToken; + lvSources.Clear; + for LSetting in FSettings do + lvSources.AddItem(LSetting.Name, nil); end; procedure TDelphinusOptionsDialog.StoreSettings(const ASettings: IDNSettings); +var + LPair: TPair; +begin + for LPair in FPages do + LPair.Value.Save(LPair.Key); + ASettings.SourceSettings := FSettings.ToArray; +end; + +procedure TDelphinusOptionsDialog.tbDeleteClick(Sender: TObject); +var + LSettings: IDNPackageSourceSettings; + LPage: IDNPackageSourceConfigPage; begin - ASettings.OAuthToken := Trim(edToken.Text); + if lvSources.ItemIndex > -1 then + begin + LSettings := FSettings[lvSources.ItemIndex]; + if FPages.TryGetValue(LSettings, LPage) then + begin + LPage.Parent := nil; + FPages.Remove(LSettings); + end; + + FSettings.Delete(lvSources.ItemIndex); + RebuildSettingsList; + end; +end; + +procedure TDelphinusOptionsDialog.tbAddClick(Sender: TObject); +var + LDialog: TTypeSelectionDialog; + LSettings: IDNPackageSourceSettings; +begin + LDialog := TTypeSelectionDialog.Create(FRegistry.Sources); + try + LDialog.OnValidateName := + function(const AName: string): Boolean + var + LSettings: IDNPackageSourceSettings; + begin + Result := True; + for LSettings in FSettings do + if AnsiSameText(LSettings.Name, AName) then + Exit(False); + end; + if LDialog.ShowModal() = mrOk then + begin + LSettings := LDialog.SelectedSource.NewSettings; + LSettings.Name := LDialog.SourceName; + FSettings.Add(LSettings); + RebuildSettingsList; + end; + finally + LDialog.Free; + end; end; end. diff --git a/Packages/Delphinus.Resources.Names.pas b/Packages/Delphinus.Resources.Names.pas index 6ea1c81..c872d4c 100644 --- a/Packages/Delphinus.Resources.Names.pas +++ b/Packages/Delphinus.Resources.Names.pas @@ -14,6 +14,7 @@ interface Ico_Agreement = 'Ico_Agreement'; Ico_Agreement_Disabled = 'Ico_Agreement_Disabled'; Ico_Close = 'Ico_Close'; + Ico_Add = 'Ico_Add'; Ico_Delete = 'Ico_Delete'; Ico_Delphinus = 'Ico_Dolphin16'; Ico_Delphinus32 = 'Ico_Dolphin32'; diff --git a/Packages/DelphinusImages.rc b/Packages/DelphinusImages.rc index acd1f64..4790622 100644 --- a/Packages/DelphinusImages.rc +++ b/Packages/DelphinusImages.rc @@ -2,6 +2,7 @@ Ico_About ICON "..\\Icons\\About.ico" Ico_Agreement ICON "..\\Icons\\Agreement.ico" Ico_Agreement_Disabled ICON "..\\Icons\\AGreement_Disabled.ico" Ico_Close ICON "..\\Icons\\Close.ico" +Ico_Add ICON "..\\Icons\\Add.ico" Ico_Delete ICON "..\\Icons\\Delete.ico" Ico_Dolphin16 ICON "..\\Icons\\Dolphin16.ico" Ico_Dolphin32 ICON "..\\Icons\\Dolphin32.ico" diff --git a/Tools/Commandline/DN.DPM.pas b/Tools/Commandline/DN.DPM.pas index 9c829fe..513ecec 100644 --- a/Tools/Commandline/DN.DPM.pas +++ b/Tools/Commandline/DN.DPM.pas @@ -9,7 +9,9 @@ interface DN.Command.Environment.Intf, DN.PackageProvider.Intf, DN.Settings.Intf, - DN.DelphiInstallation.Provider.Intf; + DN.DelphiInstallation.Provider.Intf, + DN.PackageSource.Settings.Intf, + DN.PackageSource.Registry.Intf; type TDPM = class @@ -19,6 +21,9 @@ TDPM = class FOnlinePackageProvider: IDNPackageProvider; FDelphiProvider: IDNDelphiInstallationProvider; FDispatcher: IDNCommandDispatcher; + FSourceRegistry: IDNPackageSourceRegistry; + function SourceSettingsFactory(const ASourceName: string; + out ASettings: IDNPackageSourceSettings): Boolean; function GetCommandLine: string; function GetKnownCommands: TArray; public @@ -52,17 +57,36 @@ implementation DN.HttpClient.WinHttp, DN.Settings, DN.DelphiInstallation.Editions, - DN.DelphiInstallation.Provider; + DN.DelphiInstallation.Provider, + DN.PackageSource.Intf, + DN.PackageSource.Registry, + DN.PackageSource.Github, + DN.PackageSource.Gitlab, + DN.PackageSource.Folder; { TDPM } +function TDPM.SourceSettingsFactory(const ASourceName: string; + out ASettings: IDNPackageSourceSettings): Boolean; +var + LSource: IDNPackageSource; +begin + Result := FSourceRegistry.TryGetSource(ASourceName, LSource); + if Result then + ASettings := LSource.NewSettings; +end; + constructor TDPM.Create; var LHTTP: IDNHttpClient; LFactory: TInstalledPackageProviderFactory; begin inherited; - FSettings := TDNSettings.Create(); + FSourceRegistry := TDNPackageSourceRegistry.Create(); + FSourceRegistry.RegisterSource(TDNGithubPackageSource.Create() as IDNPackageSource); + FSourceRegistry.RegisterSource(TDNGitlabPackageSource.Create() as IDNPackageSource); + FSourceRegistry.RegisterSource(TDNFolderPackageSource.Create() as IDNPackageSource); + FSettings := TDNSettings.Create(SourceSettingsFactory); LHTTP := TDNWinHttpClient.Create(); if FSettings.OAuthToken <> '' then LHTTP.Authentication := Format(CGithubOAuthAuthentication, [FSettings.OAuthToken]); diff --git a/Tools/WebSetup/Delphinus.WebSetup.Dialog.dfm b/Tools/WebSetup/Delphinus.WebSetup.Dialog.dfm index f5fe1ea..3c91c60 100644 --- a/Tools/WebSetup/Delphinus.WebSetup.Dialog.dfm +++ b/Tools/WebSetup/Delphinus.WebSetup.Dialog.dfm @@ -37,6 +37,10 @@ object DNWebSetupDialog: TDNWebSetupDialog Enabled = False ImageIndex = 4 TabVisible = False + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object Image2: TImage Left = 3 Top = 16 @@ -178,6 +182,10 @@ object DNWebSetupDialog: TDNWebSetupDialog object tsProgress: TTabSheet ImageIndex = 2 TabVisible = False + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 DesignSize = ( 404 167) @@ -212,6 +220,10 @@ object DNWebSetupDialog: TDNWebSetupDialog Caption = 'Log' ImageIndex = 3 TabVisible = False + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object mLog: TMemo Left = 0 Top = 0 @@ -300,7 +312,7 @@ object DNWebSetupDialog: TDNWebSetupDialog Left = 408 Top = 72 Bitmap = { - 494C0101010008004C0010001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600 + 494C010101000800040010001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600 0000000000003600000028000000400000001000000001002000000000000010 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 diff --git a/Tools/WebSetup/Delphinus.WebSetup.Dialog.pas b/Tools/WebSetup/Delphinus.WebSetup.Dialog.pas index aa8bd95..55249de 100644 --- a/Tools/WebSetup/Delphinus.WebSetup.Dialog.pas +++ b/Tools/WebSetup/Delphinus.WebSetup.Dialog.pas @@ -16,7 +16,10 @@ interface DN.VariableResolver.Intf, DN.VariableResolver.Compiler.Factory, Buttons, ActnList, - pngimage; + pngimage, System.ImageList, + DN.PackageSource.Registry, + DN.PackageSource.Registry.Intf, + DN.PackageSource.Settings.Intf; type TDNWebSetupDialog = class(TForm) @@ -64,6 +67,9 @@ TDNWebSetupDialog = class(TForm) FCanExitPage: TDictionary>; FSettings: IDNElevatedSettings; FLog: TStringList; + FSourceRegistry: IDNPackageSourceRegistry; + function SourceSettingsFactory(const ASourceName: string; + out ASettings: IDNPackageSourceSettings): Boolean; procedure FillVersions; procedure LoadPackage; procedure RunSetupAsync; @@ -116,7 +122,11 @@ implementation DN.Package.Version.Intf, DN.VariableResolver.Compiler, DN.DelphiInstallation.Editions, - Delphinus.WebSetup; + Delphinus.WebSetup, + DN.PackageSource.Intf, + DN.PackageSource.Github, + DN.PackageSource.Gitlab, + DN.PackageSource.Folder; {$R *.dfm} @@ -179,6 +189,16 @@ procedure TDNWebSetupDialog.cbNoVersionClick(Sender: TObject); cbVersions.Enabled := not cbNoVersion.Checked; end; +function TDNWebSetupDialog.SourceSettingsFactory(const ASourceName: string; + out ASettings: IDNPackageSourceSettings): Boolean; +var + LSource: IDNPackageSource; +begin + Result := FSourceRegistry.TryGetSource(ASourceName, LSource); + if Result then + ASettings := LSource.NewSettings; +end; + constructor TDNWebSetupDialog.Create(AOwner: TComponent); begin inherited; @@ -195,8 +215,12 @@ constructor TDNWebSetupDialog.Create(AOwner: TComponent); FCanExitPage.Add(tsDelphiSelection, DelphiSelectionCanExit); FCanExitPage.Add(tsSettings, SettingsCanExit); - FLog := TStringList.Create(); - FSettings := TDNSettings.Create(); + FSourceRegistry := TDNPackageSourceRegistry.Create(); + FSourceRegistry.RegisterSource(TDNGithubPackageSource.Create() as IDNPackageSource); + FSourceRegistry.RegisterSource(TDNGitlabPackageSource.Create() as IDNPackageSource); + FSourceRegistry.RegisterSource(TDNFolderPackageSource.Create() as IDNPackageSource); + FLog := TStringList.Create; + FSettings := TDNSettings.Create(SourceSettingsFactory); if FSettings.InstallationDirectory <> '' then begin edInstallDirectory.Text := FSettings.InstallationDirectory; From c01c0bb8d5799db57f2481af816a4d8fa2f9cdbc Mon Sep 17 00:00:00 2001 From: Matthias Heunecke Date: Mon, 15 Mar 2021 15:03:17 +0100 Subject: [PATCH 2/2] corrected file headers --- DN.Package.Gitlab.pas | 2 +- DN.PackageProvider.GitLab.State.pas | 2 +- DN.PackageProvider.GitLab.pas | 2 +- DN.PackageSource.ConfigPage.Gitlab.pas | 2 +- DN.PackageSource.Settings.Gitlab.pas | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DN.Package.Gitlab.pas b/DN.Package.Gitlab.pas index 9fce31a..377f7e9 100644 --- a/DN.Package.Gitlab.pas +++ b/DN.Package.Gitlab.pas @@ -1,6 +1,6 @@ { ######################################################### -# Author: Matthias Heunecke, Navimatix # +# Copyright by Alexander Benikowski # # This unit is part of the Delphinus project hosted on # # https://github.com/Memnarch/Delphinus # ######################################################### diff --git a/DN.PackageProvider.GitLab.State.pas b/DN.PackageProvider.GitLab.State.pas index 8297da6..fa831af 100644 --- a/DN.PackageProvider.GitLab.State.pas +++ b/DN.PackageProvider.GitLab.State.pas @@ -1,6 +1,6 @@ { ######################################################### -# Author: Matthias Heunecke, Navimatix # +# Copyright by Alexander Benikowski # # This unit is part of the Delphinus project hosted on # # https://github.com/Memnarch/Delphinus # ######################################################### diff --git a/DN.PackageProvider.GitLab.pas b/DN.PackageProvider.GitLab.pas index a46b784..5a92880 100644 --- a/DN.PackageProvider.GitLab.pas +++ b/DN.PackageProvider.GitLab.pas @@ -1,6 +1,6 @@ { ######################################################### -# Author: Matthias Heunecke, Navimatix # +# Copyright by Alexander Benikowski # # This unit is part of the Delphinus project hosted on # # https://github.com/Memnarch/Delphinus # ######################################################### diff --git a/DN.PackageSource.ConfigPage.Gitlab.pas b/DN.PackageSource.ConfigPage.Gitlab.pas index 27e27f6..b0a3b01 100644 --- a/DN.PackageSource.ConfigPage.Gitlab.pas +++ b/DN.PackageSource.ConfigPage.Gitlab.pas @@ -1,6 +1,6 @@ { ######################################################### -# Author: Matthias Heunecke, Navimatix # +# Copyright by Alexander Benikowski # # This unit is part of the Delphinus project hosted on # # https://github.com/Memnarch/Delphinus # ######################################################### diff --git a/DN.PackageSource.Settings.Gitlab.pas b/DN.PackageSource.Settings.Gitlab.pas index 719432e..e5ac99a 100644 --- a/DN.PackageSource.Settings.Gitlab.pas +++ b/DN.PackageSource.Settings.Gitlab.pas @@ -1,6 +1,6 @@ { ######################################################### -# Author: Matthias Heunecke, Navimatix # +# Copyright by Alexander Benikowski # # This unit is part of the Delphinus project hosted on # # https://github.com/Memnarch/Delphinus # #########################################################