mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 06:48:11 +02:00
1581 lines
48 KiB
ObjectPascal
1581 lines
48 KiB
ObjectPascal
{
|
|
***************************************************************************
|
|
* *
|
|
* This source is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This code is distributed in the hope that it will be useful, but *
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
|
* General Public License for more details. *
|
|
* *
|
|
* A copy of the GNU General Public License is available on the World *
|
|
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
|
|
* obtain it by writing to the Free Software Foundation, *
|
|
* Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA. *
|
|
* *
|
|
***************************************************************************
|
|
|
|
Author: Balázs Székely
|
|
Abstract:
|
|
Implementation of the main dialog.
|
|
}
|
|
unit opkman_mainfrm;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, fpjson, Graphics, laz.VirtualTrees, md5,
|
|
// LCL
|
|
Forms, Controls, Dialogs, StdCtrls, ExtCtrls, Buttons, Menus, ComCtrls, Clipbrd,
|
|
InterfaceBase, LCLIntf, LCLVersion, LCLProc, LCLPlatformDef,
|
|
// LazUtils
|
|
LazFileUtils, LazIDEIntf, LazVersion,
|
|
// IdeIntf
|
|
IDECommands, PackageIntf,
|
|
// OpkMan
|
|
opkman_downloader, opkman_installer, opkman_updates,
|
|
opkman_serializablepackages, opkman_visualtree, opkman_const, opkman_common,
|
|
opkman_progressfrm, opkman_zipper, opkman_packagelistfrm, opkman_options,
|
|
opkman_optionsfrm, opkman_createrepositorypackagefrm, opkman_maindm,
|
|
opkman_createjsonforupdatesfrm, opkman_createrepositoryfrm;
|
|
|
|
type
|
|
|
|
{ TMainFrm }
|
|
|
|
TMainFrm = class(TForm)
|
|
bReturn: TButton;
|
|
cbFilterBy: TComboBox;
|
|
cbPackageCategory: TComboBox;
|
|
cbPackageState: TComboBox;
|
|
cbPackageType: TComboBox;
|
|
miSaveChecked: TMenuItem;
|
|
miFromExteranlSource: TMenuItem;
|
|
miFromRepository: TMenuItem;
|
|
miSaveInstalled: TMenuItem;
|
|
miSep2: TMenuItem;
|
|
miSep3: TMenuItem;
|
|
miSep1: TMenuItem;
|
|
miCreateRepository: TMenuItem;
|
|
miLoad: TMenuItem;
|
|
miSave: TMenuItem;
|
|
miDateDsc: TMenuItem;
|
|
miDateAsc: TMenuItem;
|
|
miNameDsc: TMenuItem;
|
|
miNameAsc: TMenuItem;
|
|
miByDate: TMenuItem;
|
|
miByName: TMenuItem;
|
|
miSaveToFile: TMenuItem;
|
|
miJSONSort: TMenuItem;
|
|
miResetRating: TMenuItem;
|
|
miCopyToClpBrd: TMenuItem;
|
|
miCreateJSONForUpdates: TMenuItem;
|
|
miCreateRepositoryPackage: TMenuItem;
|
|
OD: TOpenDialog;
|
|
pnReturn: TPanel;
|
|
pmInstall: TPopupMenu;
|
|
SD: TSaveDialog;
|
|
tbCleanUp1: TToolButton;
|
|
tbInstall1: TToolButton;
|
|
tbUninstall: TToolButton;
|
|
tbOptions: TToolButton;
|
|
cbAll: TCheckBox;
|
|
edFilter: TEdit;
|
|
lbFilterBy: TLabel;
|
|
miJSONShow: TMenuItem;
|
|
miJSONHide: TMenuItem;
|
|
mJSON: TMemo;
|
|
pmMemo: TPopupMenu;
|
|
pnFilter: TPanel;
|
|
pnMessage: TPanel;
|
|
pnToolBar: TPanel;
|
|
pnTop: TPanel;
|
|
pnMain: TPanel;
|
|
pmTree: TPopupMenu;
|
|
pmCreate: TPopupMenu;
|
|
SDD: TSelectDirectoryDialog;
|
|
spCollapse: TSpeedButton;
|
|
spClear: TSpeedButton;
|
|
spExpand: TSpeedButton;
|
|
tbButtons: TToolBar;
|
|
imTBNor: TImageList;
|
|
tbDownload: TToolButton;
|
|
tbInstall: TToolButton;
|
|
tbHelp: TToolButton;
|
|
tbRefresh: TToolButton;
|
|
tbCleanUp: TToolButton;
|
|
tbCreate: TToolButton;
|
|
tbUpdate: TToolButton;
|
|
tbOpenRepo: TToolButton;
|
|
tmWait: TTimer;
|
|
procedure bReturnClick(Sender: TObject);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
|
|
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
procedure miCopyToClpBrdClick(Sender: TObject);
|
|
procedure miCreateJSONForUpdatesClick(Sender: TObject);
|
|
procedure miCreateRepositoryClick(Sender: TObject);
|
|
procedure miCreateRepositoryPackageClick(Sender: TObject);
|
|
procedure miFromExteranlSourceClick(Sender: TObject);
|
|
procedure miFromRepositoryClick(Sender: TObject);
|
|
procedure miLoadClick(Sender: TObject);
|
|
procedure miNameAscClick(Sender: TObject);
|
|
procedure miResetRatingClick(Sender: TObject);
|
|
procedure miSaveCheckedClick(Sender: TObject);
|
|
procedure miSaveInstalledClick(Sender: TObject);
|
|
procedure miSaveToFileClick(Sender: TObject);
|
|
procedure pnReturnResize(Sender: TObject);
|
|
procedure pnToolBarResize(Sender: TObject);
|
|
procedure tbCleanUpClick(Sender: TObject);
|
|
procedure tbCreateClick(Sender: TObject);
|
|
procedure tbDownloadClick(Sender: TObject);
|
|
procedure tbHelpClick(Sender: TObject);
|
|
procedure tbInstallClick(Sender: TObject);
|
|
procedure tbOpenRepoClick(Sender: TObject);
|
|
procedure tbOptionsClick(Sender: TObject);
|
|
procedure tbRefreshClick(Sender: TObject);
|
|
procedure cbAllClick(Sender: TObject);
|
|
procedure cbFilterByChange(Sender: TObject);
|
|
procedure cbPackageCategoryChange(Sender: TObject);
|
|
procedure cbPackageStateChange(Sender: TObject);
|
|
procedure cbPackageTypeChange(Sender: TObject);
|
|
procedure edFilterChange(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure FormKeyPress(Sender: TObject; var Key: char);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure miJSONShowClick(Sender: TObject);
|
|
procedure pnMainResize(Sender: TObject);
|
|
procedure pnTopResize(Sender: TObject);
|
|
procedure spClearClick(Sender: TObject);
|
|
procedure spExpandClick(Sender: TObject);
|
|
procedure tbUninstallClick(Sender: TObject);
|
|
procedure tbUpdateClick(Sender: TObject);
|
|
procedure tmWaitTimer(Sender: TObject);
|
|
private
|
|
FHintTimeOut: Integer;
|
|
FFormIsHiden: Boolean;
|
|
procedure EnableDisableControls(const AEnable: Boolean);
|
|
procedure SetupMessage(const AMessage: String = '');
|
|
procedure SetupControls;
|
|
procedure SetupColors;
|
|
procedure GetPackageList(const ARepositoryHasChanged: Boolean = False);
|
|
procedure DoOnChecking(Sender: TObject; const AIsAllChecked: Boolean);
|
|
procedure DoOnChecked(Sender: TObject);
|
|
procedure DoOnJSONProgress(Sender: TObject);
|
|
procedure DoOnJSONDownloadCompleted(Sender: TObject; AJSON: TJSONStringType; AErrTyp: TErrorType; const AErrMsg: String = '');
|
|
procedure DoOnProcessJSON(Sender: TObject);
|
|
procedure DoDeactivate(Sender: TObject);
|
|
function IsSomethingChecked(const AResolveDependencies: Boolean = True): Boolean;
|
|
function Download(const ADstDir: String; var ADoExtract: Boolean): TModalResult;
|
|
function Extract(const ASrcDir, ADstDir: String; var ADoOpen: Boolean; const AIsUpdate: Boolean = False): TModalResult;
|
|
function Install(var AInstallStatus: TInstallStatus; var ANeedToRebuild: Boolean): TModalResult;
|
|
function UpdateP(const ADstDir: String; var ADoExtract: Boolean): TModalResult;
|
|
procedure Rebuild;
|
|
function CheckDstDir(const ADstDir: String): Boolean;
|
|
protected
|
|
procedure DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy;
|
|
const AXProportion, AYProportion: Double); override;
|
|
public
|
|
procedure ShowOptions(const AActivePageIndex: Integer = 0);
|
|
end;
|
|
|
|
var
|
|
MainFrm: TMainFrm;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
{ TMainFrm }
|
|
|
|
procedure TMainFrm.FormCreate(Sender: TObject);
|
|
begin
|
|
if MainDM = nil then
|
|
MainDM := TMainDM.Create(self);
|
|
VisualTree := TVisualTree.Create(pnMain, MainDM.Images, pmTree);
|
|
VisualTree.OnChecking := @DoOnChecking;
|
|
VisualTree.OnChecked := @DoOnChecked;
|
|
SerializablePackages.OnProcessJSON := @DoOnProcessJSON;
|
|
PackageDownloader.OnJSONProgress := @DoOnJSONProgress;
|
|
PackageDownloader.OnJSONDownloadCompleted := @DoOnJSONDownloadCompleted;
|
|
spExpand.Caption := '';
|
|
spExpand.Images := MainDM.Images;
|
|
spExpand.ImageIndex := IMG_EXPAND;
|
|
spCollapse.Caption := '';
|
|
spCollapse.Images := MainDM.Images;
|
|
spCollapse.ImageIndex := IMG_COLLAPSE;
|
|
spClear.Images := MainDM.Images;
|
|
spClear.ImageIndex := IMG_CLEAR;
|
|
tbButtons.DisabledImages := CreateDisabledImageList(imTBNor, self);
|
|
FHintTimeOut := Application.HintHidePause;
|
|
Updates := nil;
|
|
CurLazVersion := IntToStr(laz_major) + '.' + IntToStr(laz_minor) + '.' + IntToStr(laz_release);
|
|
CurFPCVersion := {$I %FPCVERSION%};
|
|
CurWidgetSet := LCLPlatformDisplayNames[GetDefaultLCLWidgetType];
|
|
Application.HintHidePause := 1000000;
|
|
Application.AddOnDeactivateHandler(@DoDeactivate, False);
|
|
end;
|
|
|
|
procedure TMainFrm.FormDestroy(Sender: TObject);
|
|
begin
|
|
SerializablePackages.OnProcessJSON := nil;
|
|
PackageDownloader.OnJSONProgress := nil;
|
|
PackageDownloader.OnJSONDownloadCompleted := nil;
|
|
Application.RemoveOnDeactivateHandler(@DoDeactivate);
|
|
FreeAndNil(VisualTree);
|
|
Application.HintHidePause := FHintTimeOut;
|
|
end;
|
|
|
|
procedure TMainFrm.FormKeyPress(Sender: TObject; var Key: char);
|
|
begin
|
|
if Key = #27 then
|
|
Close;
|
|
end;
|
|
|
|
procedure TMainFrm.FormShow(Sender: TObject);
|
|
begin
|
|
if not FFormIsHiden then
|
|
begin
|
|
SetupControls;
|
|
SetupColors;
|
|
tmWait.Enabled := True;
|
|
end
|
|
end;
|
|
|
|
procedure TMainFrm.tmWaitTimer(Sender: TObject);
|
|
begin
|
|
tmWait.Enabled := False;
|
|
if (Options.CheckForUpdates <> 5) then
|
|
begin
|
|
Updates := TUpdates.Create;
|
|
Updates.StartUpdate;
|
|
end;
|
|
GetPackageList;
|
|
end;
|
|
|
|
|
|
procedure TMainFrm.GetPackageList(const ARepositoryHasChanged: Boolean = False);
|
|
var
|
|
JSONFile: String;
|
|
JSON: TJSONStringType;
|
|
MS: TMemoryStream;
|
|
SuccessfullyLoaded: Boolean;
|
|
begin
|
|
cbFilterBy.ItemIndex := 0;
|
|
cbFilterByChange(cbFilterBy);
|
|
Caption := rsLazarusPackageManager;
|
|
EnableDisableControls(False);
|
|
VisualTree.VST.Clear;
|
|
VisualTree.VST.Invalidate;
|
|
if ARepositoryHasChanged then
|
|
begin
|
|
SetupMessage(rsMainFrm_rsMessageChangingRepository);
|
|
Sleep(1500);
|
|
end;
|
|
|
|
SuccessfullyLoaded := False;
|
|
JSONFile := ExtractFilePath(LocalRepositoryConfigFile) + 'packagelist' + '_' + MD5Print(MD5String(Options.RemoteRepository[Options.ActiveRepositoryIndex])) + '.json';
|
|
if Options.LoadJsonLocally and (Options.LoadJsonLocallyCnt < 25) and FileExists(JSONFile) and (FileSizeUtf8(JSONFile) > 0) then
|
|
begin
|
|
MS := TMemoryStream.Create;
|
|
try
|
|
MS.LoadFromFile(JSONFile);
|
|
MS.Position := 0;
|
|
SetLength({%H-}JSON, MS.Size);
|
|
MS.Read(Pointer(JSON)^, Length(JSON));
|
|
try
|
|
SuccessfullyLoaded := SerializablePackages.JSONToPackages(JSON);
|
|
except
|
|
end;
|
|
if SuccessfullyLoaded then
|
|
begin
|
|
DoOnJSONDownloadCompleted(Self, JSON, etNone);
|
|
Options.LoadJsonLocallyCnt := Options.LoadJsonLocallyCnt + 1;
|
|
end
|
|
else
|
|
Options.LoadJsonLocallyCnt := 25;
|
|
Options.Changed := True;
|
|
finally
|
|
MS.Free;
|
|
end;
|
|
end;
|
|
|
|
if not SuccessfullyLoaded then
|
|
begin
|
|
if Options.LoadJsonLocally then
|
|
begin
|
|
Options.LoadJsonLocallyCnt := 0;
|
|
Options.Changed := True;
|
|
end;
|
|
SetupMessage(rsMainFrm_rsMessageDownload);
|
|
PackageDownloader.DownloadJSON(Options.ConTimeOut*1000);
|
|
end;
|
|
end;
|
|
|
|
function TMainFrm.IsSomethingChecked(const AResolveDependencies: Boolean = True): Boolean;
|
|
begin
|
|
Result := VisualTree.VST.CheckedCount > 0;
|
|
if Result then
|
|
begin
|
|
if AResolveDependencies then
|
|
if VisualTree.ResolveDependencies = mrCancel then
|
|
begin
|
|
Result := False;
|
|
Exit;
|
|
end;
|
|
VisualTree.GetPackageList;
|
|
VisualTree.UpdatePackageStates;
|
|
end
|
|
else
|
|
MessageDlgEx(rsMainFrm_rsNoPackageToDownload, mtInformation, [mbOk], Self)
|
|
end;
|
|
|
|
function TMainFrm.CheckDstDir(const ADstDir: String): Boolean;
|
|
begin
|
|
Result := True;
|
|
if not DirectoryExists(ADstDir) then
|
|
begin
|
|
if not ForceDirectories(ADstDir) then
|
|
begin
|
|
MessageDlgEx(Format(rsMainFrm_rsDestDirError, [ADstDir]), mtError, [mbOk], Self);
|
|
Result := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TMainFrm.DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy;
|
|
const AXProportion, AYProportion: Double);
|
|
begin
|
|
inherited;
|
|
if AMode in [lapAutoAdjustWithoutHorizontalScrolling, lapAutoAdjustForDPI] then
|
|
VisualTree.AutoAdjustLayout(AXProportion, AYProportion);
|
|
end;
|
|
|
|
function TMainFrm.Download(const ADstDir: String; var ADoExtract: Boolean): TModalResult;
|
|
begin
|
|
if not CheckDstDir(ADstDir) then
|
|
begin
|
|
Result := mrCancel;
|
|
Exit;
|
|
end;
|
|
ADoExtract := False;
|
|
ProgressFrm := TProgressFrm.Create(MainFrm);
|
|
try
|
|
ProgressFrm.SetupControls(0);
|
|
PackageDownloader.OnPackageDownloadProgress := @ProgressFrm.DoOnPackageDownloadProgress;
|
|
PackageDownloader.OnPackageDownloadError := @ProgressFrm.DoOnPackageDownloadError;
|
|
PackageDownloader.OnPackageDownloadCompleted := @ProgressFrm.DoOnPackageDownloadCompleted;
|
|
PackageDownloader.DownloadPackages(ADstDir);
|
|
Result := ProgressFrm.ShowModal;
|
|
if Result = mrOK then
|
|
ADoExtract := ProgressFrm.cbExtractOpen.Checked;
|
|
finally
|
|
ProgressFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
function TMainFrm.Extract(const ASrcDir, ADstDir: String; var ADoOpen: Boolean;
|
|
const AIsUpdate: Boolean = False): TModalResult;
|
|
begin
|
|
if not CheckDstDir(ADstDir) then
|
|
begin
|
|
Result := mrCancel;
|
|
Exit;
|
|
end;
|
|
ProgressFrm := TProgressFrm.Create(MainFrm);
|
|
try
|
|
PackageUnzipper := TPackageUnzipper.Create;
|
|
ProgressFrm.SetupControls(1);
|
|
PackageUnzipper.OnZipProgress := @ProgressFrm.DoOnZipProgress;
|
|
PackageUnzipper.OnZipError := @ProgressFrm.DoOnZipError;
|
|
PackageUnzipper.OnZipCompleted := @ProgressFrm.DoOnZipCompleted;
|
|
PackageUnzipper.StartUnZip(ASrcDir, ADstDir, AIsUpdate);
|
|
Result := ProgressFrm.ShowModal;
|
|
if Result = mrOk then
|
|
ADoOpen := ProgressFrm.cbExtractOpen.Checked;
|
|
finally
|
|
ProgressFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
function TMainFrm.Install(var AInstallStatus: TInstallStatus;
|
|
var ANeedToRebuild: Boolean): TModalResult;
|
|
begin
|
|
ProgressFrm := TProgressFrm.Create(MainFrm);
|
|
try
|
|
ProgressFrm.SetupControls(2);
|
|
Result := ProgressFrm.ShowModal;
|
|
if Result = mrOk then
|
|
begin
|
|
AInstallStatus := ProgressFrm.InstallStatus;
|
|
ANeedToRebuild := ProgressFrm.NeedToRebuild;
|
|
end;
|
|
finally
|
|
ProgressFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
function TMainFrm.UpdateP(const ADstDir: String; var ADoExtract: Boolean): TModalResult;
|
|
begin
|
|
if not CheckDstDir(ADstDir) then
|
|
begin
|
|
Result := mrCancel;
|
|
Exit;
|
|
end;
|
|
ADoExtract := False;
|
|
ProgressFrm := TProgressFrm.Create(MainFrm);
|
|
try
|
|
ProgressFrm.SetupControls(3);
|
|
PackageDownloader.OnPackageDownloadProgress := @ProgressFrm.DoOnPackageDownloadProgress;
|
|
PackageDownloader.OnPackageDownloadError := @ProgressFrm.DoOnPackageDownloadError;
|
|
PackageDownloader.OnPackageDownloadCompleted := @ProgressFrm.DoOnPackageDownloadCompleted;
|
|
PackageDownloader.OnPackageUpdateProgress := @ProgressFrm.DoOnPackageUpdateProgress;
|
|
PackageDownloader.OnPackageUpdateCompleted := @ProgressFrm.DoOnPackageUpdateCompleted;
|
|
PackageDownloader.UpdatePackages(ADstDir);
|
|
Result := ProgressFrm.ShowModal;
|
|
if Result = mrOK then
|
|
ADoExtract := ProgressFrm.cbExtractOpen.Checked;
|
|
finally
|
|
ProgressFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.DoOnJSONDownloadCompleted(Sender: TObject; AJSON: TJSONStringType; AErrTyp: TErrorType; const AErrMsg: String = '');
|
|
begin
|
|
case AErrTyp of
|
|
etNone:
|
|
begin
|
|
if (not Options.LoadJsonLocally) then
|
|
SetupMessage(rsMainFrm_rsMessageParsingJSON);
|
|
if (SerializablePackages.Count = 0) then
|
|
begin
|
|
EnableDisableControls(True);
|
|
SetupMessage(rsMainFrm_rsMessageNoPackage);
|
|
MessageDlgEx(rsMainFrm_rsMessageError1 + sLineBreak + SerializablePackages.LastError, mtInformation, [mbOk], Self);
|
|
Exit;
|
|
end;
|
|
VisualTree.PopulateTree;
|
|
VisualTree.UpdatePackageUStatus;
|
|
EnableDisableControls(True);
|
|
SetupMessage;
|
|
mJSON.Text := AJSON;
|
|
cbAll.Checked := False;
|
|
Caption := rsLazarusPackageManager + ' ' + SerializablePackages.QuickStatistics;
|
|
end;
|
|
etConfig:
|
|
begin
|
|
EnableDisableControls(True);
|
|
SetupMessage(rsMainFrm_rsMessageNoPackage);
|
|
Caption := rsLazarusPackageManager;
|
|
if MessageDlgEx('"' + AErrMsg + '"', mtConfirmation, [mbYes, mbNo], Self) = mrYes then
|
|
ShowOptions;
|
|
end;
|
|
etTimeOut, etHTTPClient:
|
|
begin
|
|
EnableDisableControls(True);
|
|
SetupMessage(rsMainFrm_rsMessageNoPackage);
|
|
Caption := rsLazarusPackageManager;
|
|
MessageDlgEx(rsMainFrm_rsMessageError0 + sLineBreak + '"' + AErrMsg + '"', mtInformation, [mbOk], Self);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.DoOnJSONProgress(Sender: TObject);
|
|
begin
|
|
Application.ProcessMessages;
|
|
end;
|
|
|
|
|
|
procedure TMainFrm.DoOnProcessJSON(Sender: TObject);
|
|
begin
|
|
Application.ProcessMessages;
|
|
end;
|
|
|
|
procedure TMainFrm.DoDeactivate(Sender: TObject);
|
|
begin
|
|
if Assigned(VisualTree.ShowHintFrm) then
|
|
if VisualTree.ShowHintFrm.Visible then
|
|
VisualTree.ShowHintFrm.Hide;
|
|
end;
|
|
|
|
procedure TMainFrm.ShowOptions(const AActivePageIndex: Integer = 0);
|
|
var
|
|
OldIndex: Integer;
|
|
DefaultTheme: Boolean;
|
|
begin
|
|
OptionsFrm := TOptionsFrm.Create(MainFrm);
|
|
try
|
|
OptionsFrm.SetupControls(AActivePageIndex);
|
|
OldIndex := Options.ActiveRepositoryIndex;
|
|
DefaultTheme := Options.UseDefaultTheme;
|
|
if OptionsFrm.ShowModal = mrOk then
|
|
begin
|
|
tbRefresh.Enabled := Trim(Options.RemoteRepository[Options.ActiveRepositoryIndex]) <> '';
|
|
GetPackageList(OldIndex <> Options.ActiveRepositoryIndex);
|
|
if DefaultTheme <> Options.UseDefaultTheme then
|
|
SetupColors;
|
|
end;
|
|
finally
|
|
OptionsFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.EnableDisableControls(const AEnable: Boolean);
|
|
begin
|
|
cbAll.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
cbFilterBy.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
pnFilter.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
cbPackageState.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
cbPackageType.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
|
|
spExpand.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
spCollapse.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
VisualTree.VST.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
if edFilter.CanFocus then
|
|
edFilter.SetFocus;
|
|
tbRefresh.Enabled := (AEnable) and (Trim(Options.RemoteRepository[Options.ActiveRepositoryIndex]) <> '');
|
|
tbDownload.Enabled := (AEnable) and (SerializablePackages.Count > 0) and (VisualTree.VST.CheckedCount > 0);
|
|
tbInstall.Enabled := (AEnable) and (SerializablePackages.Count > 0) and (VisualTree.VST.CheckedCount > 0);
|
|
tbUninstall.Enabled := (AEnable) and (SerializablePackages.Count > 0) and (VisualTree.VST.CheckedCount > 0);
|
|
tbUpdate.Enabled := (AEnable) and (SerializablePackages.Count > 0) and (VisualTree.VST.CheckedCount > 0);
|
|
tbOpenRepo.Enabled := (AEnable);
|
|
tbCleanUp.Enabled := (AEnable) and (SerializablePackages.Count > 0);
|
|
tbCreate.Visible := Options.UserProfile = 1;
|
|
if tbCreate.Visible then
|
|
begin
|
|
tbCreate.Left := tbOptions.Left - 10;
|
|
tbCreate.Enabled := (AEnable);
|
|
end;
|
|
pnToolBarResize(pnToolbar);
|
|
tbOptions.Enabled := (AEnable);
|
|
tbHelp.Enabled := (AEnable);
|
|
end;
|
|
|
|
procedure TMainFrm.SetupMessage(const AMessage: String = '');
|
|
begin
|
|
if AMessage = '' then
|
|
begin
|
|
pnMessage.SendToBack;
|
|
pnMessage.Visible := False;
|
|
end
|
|
else
|
|
begin
|
|
pnMessage.Caption := AMessage;
|
|
pnMessage.Visible := True;
|
|
pnMessage.BringToFront;
|
|
Application.ProcessMessages;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.DoOnChecking(Sender: TObject; const AIsAllChecked: Boolean);
|
|
begin
|
|
cbAll.OnClick := nil;
|
|
cbAll.Checked := AIsAllChecked;
|
|
cbAll.OnClick := @cbAllClick;
|
|
end;
|
|
|
|
procedure TMainFrm.DoOnChecked(Sender: TObject);
|
|
begin
|
|
EnableDisableControls(True);
|
|
end;
|
|
|
|
procedure TMainFrm.cbAllClick(Sender: TObject);
|
|
begin
|
|
VisualTree.CheckNodes(cbAll.Checked);
|
|
EnableDisableControls(True);
|
|
end;
|
|
|
|
procedure TMainFrm.cbFilterByChange(Sender: TObject);
|
|
begin
|
|
VisualTree.ResetFilter;
|
|
case cbFilterBy.ItemIndex of
|
|
0..1, 4..9, 11..12:
|
|
begin
|
|
cbPackageType.Visible := False;
|
|
cbPackageState.Visible := False;
|
|
cbPackageCategory.Visible := False;
|
|
pnFilter.Visible := True;
|
|
edFilter.Text := '';
|
|
if edFilter.CanFocus then
|
|
edFilter.SetFocus;
|
|
end;
|
|
2: begin
|
|
pnFilter.Visible := False;
|
|
cbPackageType.Visible := False;
|
|
cbPackageState.Visible := False;
|
|
cbPackageCategory.Visible := True;
|
|
cbPackageCategory.ItemIndex := 0;
|
|
if cbPackageCategory.CanFocus then
|
|
cbPackageCategory.SetFocus;
|
|
end;
|
|
3: begin
|
|
pnFilter.Visible := False;
|
|
cbPackageType.Visible := False;
|
|
cbPackageState.Visible := True;
|
|
cbPackageCategory.Visible := False;
|
|
cbPackageState.ItemIndex := 0;
|
|
if cbPackageState.CanFocus then
|
|
cbPackageState.SetFocus;
|
|
end;
|
|
10: begin
|
|
pnFilter.Visible := False;
|
|
cbPackageState.Visible := False;
|
|
cbPackageType.Visible := True;
|
|
cbPackageCategory.Visible := False;
|
|
cbPackageType.ItemIndex := 0;
|
|
if cbPackageType.CanFocus then
|
|
cbPackageType.SetFocus;
|
|
end;
|
|
end;
|
|
cbPackageState.Height := cbFilterBy.Height;
|
|
cbPackageState.Top := (pnTop.Height - cbPackageState.Height) div 2;
|
|
cbPackageType.Height := cbFilterBy.Height;
|
|
cbPackageType.Top := (pnTop.Height - cbPackageType.Height) div 2;
|
|
cbPackageCategory.Height := cbFilterBy.Height;
|
|
cbPackageCategory.Top := (pnTop.Height - cbPackageCategory.Height) div 2;
|
|
end;
|
|
|
|
procedure TMainFrm.cbPackageCategoryChange(Sender: TObject);
|
|
begin
|
|
if cbPackageCategory.ItemIndex > 0 then
|
|
VisualTree.FilterTree(TFilterBy(cbFilterBy.ItemIndex), 'PackageCategory', cbPackageCategory.ItemIndex - 1)
|
|
else
|
|
VisualTree.ResetFilter;
|
|
end;
|
|
|
|
procedure TMainFrm.cbPackageTypeChange(Sender: TObject);
|
|
begin
|
|
if cbPackageType.ItemIndex > 0 then
|
|
VisualTree.FilterTree(TFilterBy(cbFilterBy.ItemIndex), 'PackageType', cbPackageType.ItemIndex - 1)
|
|
else
|
|
VisualTree.ResetFilter;
|
|
end;
|
|
|
|
procedure TMainFrm.cbPackageStateChange(Sender: TObject);
|
|
begin
|
|
if cbPackageState.ItemIndex > 0 then
|
|
VisualTree.FilterTree(TFilterBy(cbFilterBy.ItemIndex), 'PackageState', cbPackageState.ItemIndex - 1)
|
|
else
|
|
VisualTree.ResetFilter;
|
|
end;
|
|
|
|
procedure TMainFrm.edFilterChange(Sender: TObject);
|
|
begin
|
|
if edFilter.Text <> '' then
|
|
VisualTree.FilterTree(TFilterBy(cbFilterBy.ItemIndex), edFilter.Text)
|
|
else
|
|
VisualTree.ResetFilter;
|
|
end;
|
|
|
|
procedure TMainFrm.pnTopResize(Sender: TObject);
|
|
begin
|
|
cbFilterBy.Left := (pnTop.Width - pnFilter.Width - cbFilterBy.Width + lbFilterBy.Width - 5) div 2;
|
|
pnFilter.Left := cbFilterBy.Left + cbFilterBy.Width + 5;
|
|
cbPackageType.Left := pnFilter.Left;
|
|
cbPackageState.Left := pnFilter.Left;
|
|
cbPackageCategory.Left := pnFilter.Left;
|
|
lbFilterBy.Left := cbFilterBy.Left - 8 - lbFilterBy.Width;
|
|
end;
|
|
|
|
procedure TMainFrm.spClearClick(Sender: TObject);
|
|
begin
|
|
edFilter.OnChange := nil;
|
|
edFilter.Text := '';
|
|
VisualTree.ResetFilter;
|
|
edFilter.OnChange := @edFilterChange;
|
|
end;
|
|
|
|
procedure TMainFrm.spExpandClick(Sender: TObject);
|
|
begin
|
|
case TSpeedButton(Sender).Tag of
|
|
1: VisualTree.ExpandEx;
|
|
2: VisualTree.CollapseEx;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.tbOptionsClick(Sender: TObject);
|
|
begin
|
|
ShowOptions;
|
|
end;
|
|
|
|
procedure TMainFrm.tbHelpClick(Sender: TObject);
|
|
begin
|
|
OpenURL('https://wiki.freepascal.org/Online_Package_Manager');
|
|
end;
|
|
|
|
procedure TMainFrm.tbRefreshClick(Sender: TObject);
|
|
begin
|
|
GetPackageList;
|
|
end;
|
|
|
|
procedure TMainFrm.tbDownloadClick(Sender: TObject);
|
|
var
|
|
DstDir: String;
|
|
CanGo: Boolean;
|
|
DoExtract: Boolean;
|
|
DoOpen: Boolean;
|
|
begin
|
|
if not IsSomethingChecked(False) then
|
|
Exit;
|
|
|
|
SDD.InitialDir := Options.LastDownloadDir;
|
|
if SDD.Execute then
|
|
begin
|
|
CanGo := True;
|
|
DstDir := AppendPathDelim(SDD.FileName);
|
|
VisualTree.UpdatePackageStates;
|
|
PackageListFrm := TPackageListFrm.Create(MainFrm);
|
|
try
|
|
PackageListFrm.lbMessage.Caption := rsMainFrm_PackageAlreadyDownloaded;
|
|
PackageListFrm.PopulateList(1, DstDir);
|
|
if PackageListFrm.Count > 0 then
|
|
CanGo := PackageListFrm.ShowModal = mrYes
|
|
else
|
|
CanGo := True;
|
|
finally
|
|
PackageListFrm.Free;
|
|
end;
|
|
end
|
|
else
|
|
CanGo := False;
|
|
|
|
if CanGo then
|
|
begin
|
|
Options.LastDownloadDir := DstDir;
|
|
Options.Changed := True;
|
|
PackageAction := paDownloadTo;
|
|
DoExtract := False;
|
|
if Download(DstDir, DoExtract) = mrOK then
|
|
begin
|
|
if SerializablePackages.ExtractCount > 0 then
|
|
begin
|
|
if DoExtract then
|
|
begin
|
|
DoOpen := False;
|
|
if Extract(DstDir, DstDir, DoOpen) = mrOk then
|
|
begin
|
|
if DoOpen then
|
|
OpenDocument(DstDir);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
SerializablePackages.RemoveErrorState;
|
|
end;
|
|
|
|
procedure TMainFrm.Rebuild;
|
|
begin
|
|
FFormIsHiden := True;
|
|
Self.Hide;
|
|
IDECommands.ExecuteIDECommand(Self, ecBuildLazarus);
|
|
Self.Show;
|
|
FFormIsHiden := False;
|
|
end;
|
|
|
|
procedure TMainFrm.tbUpdateClick(Sender: TObject);
|
|
var
|
|
CanGo: Boolean;
|
|
DoOpen: Boolean;
|
|
DoExtract: Boolean;
|
|
InstallStatus: TInstallStatus;
|
|
NeedToRebuild: Boolean;
|
|
begin
|
|
if not IsSomethingChecked(True) then
|
|
Exit;
|
|
CanGo := True;
|
|
|
|
if Options.IncompatiblePackages then
|
|
begin
|
|
PackageListFrm := TPackageListFrm.Create(MainFrm);
|
|
try
|
|
PackageListFrm.lbMessage.Caption := rsMainFrm_PackageIncompatible;
|
|
PackageListFrm.PopulateList(3);
|
|
if PackageListFrm.Count > 0 then
|
|
CanGo := PackageListFrm.ShowModal = mrYes
|
|
else
|
|
CanGo := True;
|
|
finally
|
|
PackageListFrm.Free;
|
|
end;
|
|
end;
|
|
if CanGo then
|
|
begin
|
|
NeedToRebuild := False;
|
|
VisualTree.UpdatePackageStates;
|
|
if Options.AlreadyInstalledPackages then
|
|
begin
|
|
PackageListFrm := TPackageListFrm.Create(MainFrm);
|
|
try
|
|
PackageListFrm.lbMessage.Caption := rsMainFrm_PackageUpdate0;
|
|
PackageListFrm.PopulateList(2);
|
|
if PackageListFrm.Count > 0 then
|
|
CanGo := PackageListFrm.ShowModal = mrYes
|
|
else
|
|
CanGo := True;
|
|
finally
|
|
PackageListFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
if CanGo then
|
|
begin
|
|
if MessageDlgEx(rsMainFrm_PackageUpdateWarning, mtConfirmation, [mbYes, mbNo], Self) <> mrYes then
|
|
Exit;
|
|
|
|
PackageAction := paUpdate;
|
|
VisualTree.UpdatePackageStates;
|
|
if SerializablePackages.DownloadCount > 0 then
|
|
begin
|
|
DoExtract := True;
|
|
CanGo := UpdateP(Options.LocalRepositoryUpdateExpanded, DoExtract) = mrOK;
|
|
VisualTree.UpdatePackageStates;
|
|
end;
|
|
|
|
if CanGo then
|
|
begin
|
|
if SerializablePackages.ExtractCount > 0 then
|
|
begin
|
|
DoOpen := False;
|
|
CanGo := Extract(Options.LocalRepositoryUpdateExpanded, Options.LocalRepositoryPackagesExpanded, DoOpen, True) = mrOk;
|
|
VisualTree.UpdatePackageStates;
|
|
end;
|
|
|
|
if CanGo then
|
|
begin
|
|
if Options.DeleteZipAfterInstall then
|
|
SerializablePackages.DeleteDownloadedZipFiles;
|
|
if SerializablePackages.InstallCount > 0 then
|
|
begin
|
|
InstallStatus := isFailed;
|
|
if Install(InstallStatus, NeedToRebuild) = mrOk then
|
|
begin
|
|
if (InstallStatus = isSuccess) or (InstallStatus = isPartiallyFailed) then
|
|
begin
|
|
SerializablePackages.MarkRuntimePackages;
|
|
VisualTree.UpdatePackageStates;
|
|
if NeedToRebuild then
|
|
Rebuild;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
if not NeedToRebuild then
|
|
SerializablePackages.RemoveErrorState;
|
|
end;
|
|
|
|
procedure TMainFrm.tbUninstallClick(Sender: TObject);
|
|
|
|
function IsAtLeastOnePackageInstalled: Boolean;
|
|
var
|
|
I, J: Integer;
|
|
LazarusPackage: TLazarusPackage;
|
|
begin
|
|
Result := False;
|
|
for I := 0 to SerializablePackages.Count - 1 do
|
|
begin
|
|
for J := 0 to SerializablePackages.Items[I].LazarusPackages.Count - 1 do
|
|
begin
|
|
LazarusPackage := TLazarusPackage(SerializablePackages.Items[I].LazarusPackages.Items[J]);
|
|
if (LazarusPackage.Checked) and (LazarusPackage.PackageState = psInstalled) then
|
|
begin
|
|
Result := True;
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function GetIDEPackage(const AFileName: String): TIDEPackage;
|
|
var
|
|
I: Integer;
|
|
IDEPackge: TIDEPackage;
|
|
begin
|
|
Result := nil;
|
|
for I := 0 to PackageEditingInterface.GetPackageCount - 1 do
|
|
begin
|
|
IDEPackge := PackageEditingInterface.GetPackages(I);
|
|
if CompareText(IDEPackge.Filename, AFileName) = 0 then
|
|
begin
|
|
Result := IDEPackge;
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
I, J: Integer;
|
|
LazarusPackage: TLazarusPackage;
|
|
IDEPackage: TIDEPackage;
|
|
FileName: String;
|
|
NeedToRebuild: Boolean;
|
|
begin
|
|
if not IsSomethingChecked(False) then
|
|
Exit;
|
|
|
|
if IsAtLeastOnePackageInstalled then
|
|
begin
|
|
if MessageDlgEx(Format(rsMainFrm_rsUninstall, [' ']), mtInformation, [mbYes, mbNo], Self) <> mrYes then
|
|
Exit;
|
|
end
|
|
else
|
|
begin
|
|
MessageDlgEx(rsMainFrm_rsUninstall_Nothing, mtInformation, [mbOk], Self);
|
|
Exit;
|
|
end;
|
|
|
|
NeedToRebuild := False;
|
|
for I := 0 to SerializablePackages.Count - 1 do
|
|
begin
|
|
for J := 0 to SerializablePackages.Items[I].LazarusPackages.Count - 1 do
|
|
begin
|
|
LazarusPackage := TLazarusPackage(SerializablePackages.Items[I].LazarusPackages.Items[J]);
|
|
if (LazarusPackage.Checked) and (LazarusPackage.PackageState = psInstalled) then
|
|
begin
|
|
case LazarusPackage.PackageType of
|
|
lptRunTime, lptRunTimeOnly:
|
|
begin
|
|
FileName := StringReplace(LazarusPackage.Name, '.lpk', '.opkman', [rfIgnoreCase]);
|
|
if FileExists(Options.LocalRepositoryPackagesExpanded + SerializablePackages.Items[I].PackageBaseDir + LazarusPackage.PackageRelativePath + FileName) then
|
|
DeleteFile(Options.LocalRepositoryPackagesExpanded + SerializablePackages.Items[I].PackageBaseDir + LazarusPackage.PackageRelativePath + FileName);
|
|
NeedToRebuild := True;
|
|
end;
|
|
lptDesignTime, lptRunAndDesignTime:
|
|
begin
|
|
IDEPackage := GetIDEPackage(LazarusPackage.InstalledFileName);
|
|
if IDEPackage <> nil then
|
|
begin
|
|
if PackageEditingInterface.UninstallPackage(IDEPackage, False) <> mrOk then
|
|
begin
|
|
NeedToRebuild := False;
|
|
MessageDlgEx(Format(rsMainFrm_rsUninstall_Error, [LazarusPackage.Name]), mtError, [mbOk], Self);
|
|
Exit;
|
|
end
|
|
else
|
|
NeedToRebuild := True;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
if NeedToRebuild then
|
|
Rebuild;
|
|
end;
|
|
|
|
procedure TMainFrm.tbInstallClick(Sender: TObject);
|
|
var
|
|
CanGo: Boolean;
|
|
DoExtract: Boolean;
|
|
DoOpen: Boolean;
|
|
InstallStatus: TInstallStatus;
|
|
NeedToRebuild: Boolean;
|
|
begin
|
|
if not IsSomethingChecked then
|
|
Exit;
|
|
|
|
CanGo := True;
|
|
if Options.IncompatiblePackages then
|
|
begin
|
|
PackageListFrm := TPackageListFrm.Create(MainFrm);
|
|
try
|
|
PackageListFrm.lbMessage.Caption := rsMainFrm_PackageIncompatible;
|
|
PackageListFrm.PopulateList(3);
|
|
if PackageListFrm.Count > 0 then
|
|
CanGo := PackageListFrm.ShowModal = mrYes
|
|
else
|
|
CanGo := True;
|
|
finally
|
|
PackageListFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
if CanGo then
|
|
begin
|
|
if Options.AlreadyInstalledPackages then
|
|
begin
|
|
PackageListFrm := TPackageListFrm.Create(MainFrm);
|
|
try
|
|
PackageListFrm.lbMessage.Caption := rsMainFrm_PackageAlreadyInstalled;
|
|
PackageListFrm.PopulateList(0);
|
|
if PackageListFrm.Count > 0 then
|
|
CanGo := PackageListFrm.ShowModal = mrYes
|
|
else
|
|
CanGo := True;
|
|
finally
|
|
PackageListFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
if CanGo then
|
|
begin
|
|
PackageAction := paInstall;
|
|
VisualTree.UpdatePackageStates;
|
|
if SerializablePackages.DownloadCount > 0 then
|
|
begin
|
|
DoExtract := True;
|
|
CanGo := Download(Options.LocalRepositoryArchiveExpanded, DoExtract) = mrOK;
|
|
VisualTree.UpdatePackageStates;
|
|
end;
|
|
|
|
if CanGo then
|
|
begin
|
|
if SerializablePackages.ExtractCount > 0 then
|
|
begin
|
|
DoOpen := False;
|
|
CanGo := Extract(Options.LocalRepositoryArchiveExpanded, Options.LocalRepositoryPackagesExpanded, DoOpen) = mrOk;
|
|
VisualTree.UpdatePackageStates;
|
|
end;
|
|
|
|
if CanGo then
|
|
begin
|
|
if Options.DeleteZipAfterInstall then
|
|
SerializablePackages.DeleteDownloadedZipFiles;
|
|
if SerializablePackages.InstallCount > 0 then
|
|
begin
|
|
InstallStatus := isFailed;
|
|
NeedToRebuild := False;
|
|
if Install(InstallStatus, NeedToRebuild) = mrOk then
|
|
begin
|
|
SerializablePackages.MarkRuntimePackages;
|
|
VisualTree.UpdatePackageStates;
|
|
if (InstallStatus = isSuccess) or (InstallStatus = isPartiallyFailed) then
|
|
if NeedToRebuild then
|
|
Rebuild;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
if not NeedToRebuild then
|
|
SerializablePackages.RemoveErrorState;
|
|
end;
|
|
|
|
procedure TMainFrm.miFromRepositoryClick(Sender: TObject);
|
|
begin
|
|
tbInstallClick(tbInstall);
|
|
end;
|
|
|
|
procedure TMainFrm.miFromExteranlSourceClick(Sender: TObject);
|
|
begin
|
|
tbUpdateClick(tbUpdate);
|
|
end;
|
|
|
|
|
|
procedure TMainFrm.tbOpenRepoClick(Sender: TObject);
|
|
begin
|
|
OpenDocument(Options.LocalRepositoryPackagesExpanded);
|
|
end;
|
|
|
|
procedure TMainFrm.tbCleanUpClick(Sender: TObject);
|
|
var
|
|
Cnt: Integer;
|
|
begin
|
|
if MessageDlgEx(rsMainFrm_rsRepositoryCleanup0, mtInformation, [mbYes, mbNo], Self) = mrYes then
|
|
begin
|
|
Screen.BeginWaitCursor;
|
|
try
|
|
Cnt := SerializablePackages.Cleanup;
|
|
finally
|
|
Screen.EndWaitCursor;
|
|
end;
|
|
MessageDlgEx(Format(rsMainFrm_rsRepositoryCleanup1, [IntToStr(Cnt)]),
|
|
mtInformation, [mbOk], Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.tbCreateClick(Sender: TObject);
|
|
begin
|
|
CreateRepositoryPackagesFrm := TCreateRepositoryPackagesFrm.Create(MainFrm);
|
|
try
|
|
CreateRepositoryPackagesFrm.SetType(0);
|
|
CreateRepositoryPackagesFrm.ShowModal;
|
|
finally
|
|
CreateRepositoryPackagesFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.pnToolBarResize(Sender: TObject);
|
|
var
|
|
I: Integer;
|
|
W: Integer;
|
|
begin
|
|
W := 0;
|
|
for I := 0 to tbButtons.ButtonCount - 1 do
|
|
if tbButtons.Buttons[I].Visible then
|
|
W := W + tbButtons.Buttons[I].Width;
|
|
tbButtons.Width := W + 2;
|
|
if tbButtons.Width < 450 then
|
|
tbButtons.Width := 450;
|
|
tbButtons.Left := (pnToolBar.Width - tbButtons.Width) div 2;
|
|
tbButtons.Height := tbButtons.Buttons[0].Height;
|
|
tbButtons.Top := (pnToolBar.Height - tbButtons.Height) div 2;
|
|
end;
|
|
|
|
procedure TMainFrm.miCreateRepositoryPackageClick(Sender: TObject);
|
|
begin
|
|
tbCreateClick(tbCreate);
|
|
end;
|
|
|
|
procedure TMainFrm.miCreateJSONForUpdatesClick(Sender: TObject);
|
|
var
|
|
Msg: String;
|
|
begin
|
|
case VisualTree.GetCheckedRepositoryPackages of
|
|
0: Msg := rsCreateJSONForUpdatesFrm_Message0;
|
|
1: Msg := '';
|
|
2: Msg := rsCreateJSONForUpdatesFrm_Message1;
|
|
end;
|
|
if Msg <> '' then
|
|
begin
|
|
MessageDlgEx(Msg, mtInformation, [mbOk], MainFrm);
|
|
Exit;
|
|
end;
|
|
VisualTree.GetPackageList;
|
|
CreateJSONForUpdatesFrm := TCreateJSONForUpdatesFrm.Create(MainFrm);
|
|
try
|
|
CreateJSONForUpdatesFrm.PopluateTree;
|
|
CreateJSONForUpdatesFrm.ShowModal;
|
|
finally
|
|
CreateJSONForUpdatesFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.miCreateRepositoryClick(Sender: TObject);
|
|
var
|
|
CreateRepositoryFrm: TCreateRepositoryFrm;
|
|
begin
|
|
CreateRepositoryFrm := TCreateRepositoryFrm.Create(MainFrm);
|
|
try
|
|
CreateRepositoryFrm.ShowModal;
|
|
finally
|
|
CreateRepositoryFrm.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.miCopyToClpBrdClick(Sender: TObject);
|
|
var
|
|
Data: PData;
|
|
Node: PVirtualNode;
|
|
begin
|
|
Node := VisualTree.VST.GetFirstSelected;
|
|
if Node <> nil then
|
|
begin
|
|
Data := VisualTree.VST.GetNodeData(Node);
|
|
case Data^.DataType of
|
|
17: Clipboard.AsText := Data^.HomePageURL;
|
|
18: Clipboard.AsText := Data^.DownloadURL;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.FormKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
begin
|
|
if ssCtrl in Shift then
|
|
begin
|
|
if (Key = 82) and (tbRefresh.Enabled) then
|
|
tbRefreshClick(tbRefresh)
|
|
else if (Key = 68) and (tbDownload.Enabled) then
|
|
tbDownloadClick(tbDownload)
|
|
else if (Key = 73) and (tbInstall.Enabled) then
|
|
tbInstallClick(tbInstall)
|
|
else if (Key = 69) and (tbUpdate.Enabled) then
|
|
tbUpdateClick(tbUpdate)
|
|
else if (Key = 85) and (tbUninstall.Enabled) then
|
|
tbUninstallClick(tbUninstall)
|
|
else if (Key = 76) and (tbOpenRepo.Enabled) then
|
|
tbOpenRepoClick(tbOpenRepo)
|
|
else if (Key = 67) and (tbCleanUp.Enabled) then
|
|
tbCleanUpClick(tbCleanUp)
|
|
else if (Key = 80) and (tbInstall.Enabled) then
|
|
miCreateRepositoryPackageClick(miCreateRepositoryPackage)
|
|
else if (Key = 79) and (tbOptions.Enabled) then
|
|
tbOptionsClick(tbOptions)
|
|
else if (Key = 72) and (tbHelp.Enabled) then
|
|
tbHelpClick(tbHelp);
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.miResetRatingClick(Sender: TObject);
|
|
var
|
|
Data: PData;
|
|
Node: PVirtualNode;
|
|
MetaPkg: TMetaPackage;
|
|
begin
|
|
if MessageDlgEx(rsMainFrm_miResetRating + '?', mtConfirmation, [mbYes, mbNo], Self) <> mrYes then
|
|
Exit;
|
|
Node := VisualTree.VST.GetFirstSelected;
|
|
if Node <> nil then
|
|
begin
|
|
Data := VisualTree.VST.GetNodeData(Node);
|
|
if Data^.DataType = 1 then
|
|
begin
|
|
Data^.Rating := 0;
|
|
MetaPkg := SerializablePackages.FindMetaPackage(Data^.PackageName, fpbPackageName);
|
|
if MetaPkg <> nil then
|
|
MetaPkg.Rating := 0;
|
|
VisualTree.VST.ReinitNode(Node, False);
|
|
VisualTree.VST.RepaintNode(Node);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.miSaveCheckedClick(Sender: TObject);
|
|
var
|
|
Node: PVirtualNode;
|
|
Data: PData;
|
|
SL: TStringList;
|
|
begin
|
|
SD.DefaultExt := '.*.opm';
|
|
SD.Filter := '*.opm|*.opm';
|
|
|
|
SL := TStringList.Create;
|
|
try
|
|
Node := VisualTree.VST.GetFirst;
|
|
while Node <> nil do
|
|
begin
|
|
if VisualTree.VST.CheckState[Node] = csCheckedNormal then
|
|
begin
|
|
Data := VisualTree.VST.GetNodeData(Node);
|
|
if (Data^.DataType = 2) then
|
|
SL.Add(Data^.LazarusPackageName);
|
|
end;
|
|
Node := VisualTree.VST.GetNext(Node);
|
|
end;
|
|
if Trim(SL.Text) = '' then
|
|
MessageDlgEx(rsMainFrm_rsMessageNothingChacked, mtInformation, [mbOk], Self)
|
|
else
|
|
if SD.Execute then
|
|
begin
|
|
SL.SaveToFile(SD.FileName);
|
|
MessageDlgEx(Format(rsMainFrm_resMessageChecksSaved, [IntToStr(SL.Count)]), mtInformation, [mbOk], Self)
|
|
end;
|
|
finally
|
|
SL.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.miSaveInstalledClick(Sender: TObject);
|
|
var
|
|
Node: PVirtualNode;
|
|
Data: PData;
|
|
SL: TStringList;
|
|
begin
|
|
SD.DefaultExt := '.*.opm';
|
|
SD.Filter := '*.opm|*.opm';
|
|
|
|
SL := TStringList.Create;
|
|
try
|
|
Node := VisualTree.VST.GetFirst;
|
|
while Node <> nil do
|
|
begin
|
|
Data := VisualTree.VST.GetNodeData(Node);
|
|
if (Data^.DataType = 2) and (Data^.InstalledVersion <> '') then
|
|
SL.Add(Data^.LazarusPackageName);
|
|
Node := VisualTree.VST.GetNext(Node);
|
|
end;
|
|
if Trim(SL.Text) = '' then
|
|
MessageDlgEx(rsMainFrm_rsMessageNothingInstalled, mtInformation, [mbOk], Self)
|
|
else
|
|
if SD.Execute then
|
|
begin
|
|
SL.SaveToFile(SD.FileName);
|
|
MessageDlgEx(Format(rsMainFrm_resMessageChecksSaved, [IntToStr(SL.Count)]), mtInformation, [mbOk], Self)
|
|
end;
|
|
finally
|
|
SL.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.miLoadClick(Sender: TObject);
|
|
var
|
|
SL: TStringList;
|
|
TrimmedS: String;
|
|
I, CheckCount: Integer;
|
|
Node: PVirtualNode;
|
|
Data: PData;
|
|
begin
|
|
if OD.Execute then
|
|
begin
|
|
CheckCount := 0;
|
|
SL := TStringList.Create;
|
|
try
|
|
SL.LoadFromFile(OD.FileName);
|
|
for I := 0 to SL.Count - 1 do
|
|
begin
|
|
TrimmedS := Trim(SL.Strings[I]);
|
|
Node := VisualTree.VST.GetFirst;
|
|
while Node <> nil do
|
|
begin
|
|
Data := VisualTree.VST.GetNodeData(Node);
|
|
if CompareText(Trim(Data^.LazarusPackageName), TrimmedS) = 0 then
|
|
begin
|
|
VisualTree.VST.CheckState[Node] := csCheckedNormal;
|
|
Inc(CheckCount);
|
|
Break;
|
|
end;
|
|
Node := VisualTree.VST.GetNext(Node);
|
|
end;
|
|
end;
|
|
finally
|
|
SL.Free;
|
|
end;
|
|
if CheckCount > 0 then
|
|
MessageDlgEx(Format(rsMainFrm_resMessageChecksLoaded, [IntToStr(CheckCount)]), mtInformation, [mbOk], Self)
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TMainFrm.pnMainResize(Sender: TObject);
|
|
begin
|
|
pnMessage.Left := (pnMain.Width - pnMessage.Width) div 2;
|
|
pnMessage.Top := (pnMain.Height - pnMessage.Height) div 2;
|
|
end;
|
|
|
|
procedure TMainFrm.miJSONShowClick(Sender: TObject);
|
|
begin
|
|
if not mJSON.Visible then
|
|
begin
|
|
VisualTree.VST.Visible := False;
|
|
pnTop.Visible := False;
|
|
pnToolBar.Visible := False;
|
|
pnReturn.Height := 50;
|
|
pnReturn.Visible := True;
|
|
mJSON.Visible := True;
|
|
mJSON.BringToFront;
|
|
end
|
|
else
|
|
begin
|
|
mJSON.SendToBack;
|
|
mJSON.Visible := False;
|
|
pnReturn.Visible := False;
|
|
pnTop.Visible := True;
|
|
pnToolBar.Visible := True;
|
|
VisualTree.VST.Visible := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.bReturnClick(Sender: TObject);
|
|
begin
|
|
miJSONShowClick(miJSONShow);
|
|
end;
|
|
|
|
procedure TMainFrm.FormCloseQuery(Sender: TObject; var CanClose: boolean);
|
|
begin
|
|
if Assigned(Updates) then
|
|
begin
|
|
Updates.StopUpdate;
|
|
Updates.Terminate;
|
|
while Assigned(Updates) do
|
|
CheckSynchronize(100); // wait for update thread to terminate
|
|
// Remains the slightest chance of a mem leak, since the update thread needs still enough cpu time to finish running the destructor
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TMainFrm.miNameAscClick(Sender: TObject);
|
|
var
|
|
JSON: TJSONStringType;
|
|
begin
|
|
JSON := '';
|
|
case (Sender as TMenuItem).Tag of
|
|
0: SerializablePackages.Sort(stName, soAscendent);
|
|
1: SerializablePackages.Sort(stName, soDescendent);
|
|
2: SerializablePackages.Sort(stDate, soAscendent);
|
|
3: SerializablePackages.Sort(stDate, soDescendent);
|
|
end;
|
|
SerializablePackages.PackagesToJSON(JSON);
|
|
mJSON.Lines.BeginUpdate;
|
|
try
|
|
mJSON.Clear;
|
|
mJSON.Text := JSON;
|
|
finally
|
|
mJSON.Lines.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.miSaveToFileClick(Sender: TObject);
|
|
var
|
|
JSON: TJSONStringType;
|
|
Ms: TMemoryStream;
|
|
begin
|
|
SD.DefaultExt := '.*.json';
|
|
SD.Filter := '*.json|*.json';
|
|
if SD.Execute then
|
|
begin
|
|
JSON := '';
|
|
SerializablePackages.PackagesToJSON(JSON);
|
|
Ms := TMemoryStream.Create;
|
|
try
|
|
Ms.Write(Pointer(JSON)^, Length(JSON));
|
|
Ms.Position := 0;
|
|
Ms.SaveToFile(SD.FileName);
|
|
finally
|
|
Ms.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainFrm.pnReturnResize(Sender: TObject);
|
|
begin
|
|
bReturn.Left := (pnReturn.Width - bReturn.Width) div 2 ;
|
|
bReturn.Top := (pnReturn.Height - bReturn.Height) div 2;
|
|
end;
|
|
|
|
procedure TMainFrm.SetupControls;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Caption := rsLazarusPackageManager;
|
|
|
|
cbFilterBy.Clear;
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTHeaderColumn_PackageName);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTHeaderColumn_LazarusPackage);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_PackageCategory);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_PackageStatus);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_Version);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_Description);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_Author);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_LazCompatibility);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_FPCCompatibility);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_SupportedWidgetsets);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_Packagetype);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_Dependecies);
|
|
cbFilterBy.Items.Add(rsMainFrm_VSTText_License);
|
|
cbFilterBy.ItemIndex := 0;
|
|
|
|
cbPackageType.Clear;
|
|
cbPackageType.Items.Add('');
|
|
cbPackageType.Items.Add(rsMainFrm_VSTText_PackageType2);
|
|
cbPackageType.Items.Add(rsMainFrm_VSTText_PackageType1);
|
|
cbPackageType.Items.Add(rsMainFrm_VSTText_PackageType0);
|
|
cbPackageType.Items.Add(rsMainFrm_VSTText_PackageType3);
|
|
|
|
cbPackageState.Clear;
|
|
cbPackageState.Items.Add('');
|
|
cbPackageState.Items.Add(rsMainFrm_VSTText_PackageState0);
|
|
cbPackageState.Items.Add(rsMainFrm_VSTText_PackageState1);
|
|
cbPackageState.Items.Add(rsMainFrm_VSTText_PackageState2);
|
|
cbPackageState.Items.Add(rsMainFrm_VSTText_PackageState3);
|
|
|
|
cbPackageCategory.Clear;
|
|
cbPackageCategory.Items.Add('');
|
|
for I := 0 to MaxCategories - 1 do
|
|
cbPackageCategory.Items.Add(Categories[I]);
|
|
|
|
tbRefresh.Caption := rsMainFrm_TBRefresh_Caption;
|
|
tbRefresh.Hint := rsMainFrm_TBRefresh_Hint;
|
|
tbDownload.Caption := rsMainFrm_TBDownload_Caption;
|
|
tbDownload.Hint := rsMainFrm_TBDownload_Hint;
|
|
tbInstall.Caption := rsMainFrm_TBInstall_Caption;
|
|
tbInstall.Hint := rsMainFrm_TBInstall_Hint;
|
|
tbUpdate.Caption := rsMainFrm_TBUpdate_Caption;
|
|
tbUpdate.Hint := rsMainFrm_TBUpdate_Hint;
|
|
tbUninstall.Caption := rsMainFrm_TBUninstall_Caption;
|
|
tbUninstall.Hint := rsMainFrm_TBUninstall_Hint;
|
|
tbOpenRepo.Caption := rsMainFrm_TBOpenRepo_Caption;
|
|
tbOpenRepo.Hint := rsMainFrm_TBOpenRepo_Hint;
|
|
tbCleanUp.Caption := rsMainFrm_TBCleanUp_Caption;
|
|
tbCleanUp.Hint := rsMainFrm_TBCleanUp_Hint;
|
|
tbCreate.Caption := rsMainFrm_TBRepository_Caption;
|
|
tbCreate.Hint := rsMainFrm_TBRepository_Hint;
|
|
tbOptions.Caption := rsMainFrm_TBOptions_Caption;
|
|
tbOptions.Hint := rsMainFrm_TBOptions_Hint;
|
|
tbHelp.Caption := rsMainFrm_TBHelp_Caption;
|
|
tbHelp.Hint := rsMainFrm_TBHelp_Hint;
|
|
|
|
miFromRepository.Caption := rsMainFrm_VSTHeaderColumn_Repository;
|
|
miFromRepository.Hint := rsMainFrm_VSTHeaderColumn_Repository_Hint;
|
|
miFromExteranlSource.Caption := rsMainFrm_VSTHeaderColumn_Update;
|
|
miFromExteranlSource.Hint := rsMainFrm_VSTHeaderColumn_Update_Hint;
|
|
miCreateRepositoryPackage.Caption := rsMainFrm_miCreateRepositoryPackage;
|
|
miCreateJSONForUpdates.Caption := rsMainFrm_miCreateJSONForUpdates;
|
|
miCreateRepository.Caption := rsMainFrm_miCreateRepository;
|
|
miJSONShow.Caption := rsMainFrm_miJSONShow;
|
|
miJSONHide.Caption := rsMainFrm_miJSONHide;
|
|
miJSONSort.Caption := rsMainFrm_miJSONSort;
|
|
miByName.Caption := rsMainFrm_miByName;
|
|
miNameAsc.Caption := rsMainFrm_miAscendent;
|
|
miNameDsc.Caption := rsMainFrm_miDescendent;
|
|
miByDate.Caption := rsMainFrm_miByDate;
|
|
miDateAsc.Caption := rsMainFrm_miAscendent;
|
|
miDateDsc.Caption := rsMainFrm_miDescendent;
|
|
miSaveToFile.Caption := rsMainFrm_miSaveToFile;
|
|
miCopyToClpBrd.Caption := rsMainFrm_miCopyToClpBrd;
|
|
miResetRating.Caption := rsMainFrm_miResetRating;
|
|
miSave.Caption := rsMainFrm_miSave;
|
|
miSaveChecked.Caption := rsMainFrm_miSaveChecked;
|
|
miSaveInstalled.Caption := rsMainFrm_miLoadInstalled;
|
|
miLoad.Caption := rsMainFrm_miLoad;
|
|
edFilter.Hint := rsMainFrm_edFilter_Hint;
|
|
spClear.Hint := rsMainFrm_spClear_Hint;
|
|
cbFilterBy.Top := (pnTop.Height - cbFilterBy.Height) div 2;
|
|
pnFilter.Height := cbFilterBy.Height;
|
|
pnFilter.Top := (pnTop.Height - pnFilter.Height) div 2;
|
|
cbPackageState.Top := (pnTop.Height - cbPackageState.Height) div 2;
|
|
cbPackageType.Top := (pnTop.Height - cbPackageType.Height) div 2;
|
|
cbPackageCategory.Top := (pnTop.Height - cbPackageCategory.Height) div 2;
|
|
cbAll.Top := (pnTop.Height - cbAll.Height) div 2;
|
|
cbAll.Hint := rsMainFrm_cbAll_Hint;
|
|
spExpand.Top:= (pnTop.Height - spExpand.Height + 1) div 2;
|
|
spExpand.Hint := rsMainFrm_spExpand_Hint;
|
|
spCollapse.Top:= (pnTop.Height - spCollapse.Height + 1) div 2;
|
|
spCollapse.Hint := rsMainFrm_spCollapse_Hint;
|
|
cbAll.Caption := rsMainFrm_cbAll_Caption;
|
|
lbFilterBy.Top := cbFilterBy.Top + (cbFilterBy.Height - lbFilterBy.Height) div 2;
|
|
lbFilterBy.Caption := rsMainFrm_lbFilter_Caption;
|
|
cbFilterBy.Hint := rsMainFrm_cbFilterBy_Hint;
|
|
bReturn.Caption := rsMainFrm_bReturn_Caption;
|
|
cbPackageCategory.Visible := False;
|
|
cbPackageType.Visible := False;
|
|
cbPackageState.Visible := False;
|
|
end;
|
|
|
|
procedure TMainFrm.SetupColors;
|
|
begin
|
|
VisualTree.SetupColors;
|
|
if not Options.UseDefaultTheme then
|
|
begin
|
|
Self.Color := clBtnFace;
|
|
pnMain.Color := clBtnFace;
|
|
pnMessage.Color := clBtnFace;
|
|
pnTop.Color := clBtnFace;
|
|
mJSON.Color := clBtnFace;
|
|
end
|
|
else
|
|
begin
|
|
pnMain.Color := VisualTree.VST.GetDefaultColor(dctBrush);
|
|
pnMessage.Color := VisualTree.VST.GetDefaultColor(dctBrush);
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|