2019-01-12 17:05:16 +00:00
|
|
|
|
unit fMain;
|
|
|
|
|
|
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
|
2019-01-20 05:41:33 +00:00
|
|
|
|
StdCtrls, ExtCtrls, Buttons, ActnList, EditBtn, Menus, virtualtreeview_package,
|
|
|
|
|
VirtualTrees, dMain, uPackage, uPackageList;
|
2019-01-12 17:05:16 +00:00
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
2019-01-20 05:41:33 +00:00
|
|
|
|
// Указатель на тип данных TRootNodeData
|
|
|
|
|
PRootNodeData = ^TRootNodeData;
|
|
|
|
|
// Тип данных для работы с корневыми нодами
|
|
|
|
|
TRootNodeData = record
|
|
|
|
|
FName: String;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
// Указатель на тип данных TChildNodeData
|
|
|
|
|
PChildNodeData = ^TChildNodeData;
|
|
|
|
|
// Тип данных для работы с дочерними нодами
|
|
|
|
|
TChildNodeData = record
|
|
|
|
|
FName: String;
|
|
|
|
|
FPath: String;
|
|
|
|
|
end;
|
|
|
|
|
|
2019-01-12 17:05:16 +00:00
|
|
|
|
{ TfmMain }
|
|
|
|
|
|
|
|
|
|
TfmMain = class(TForm)
|
|
|
|
|
btnSoftStart: TButton;
|
|
|
|
|
btnToolsPkgEdit: TSpeedButton;
|
|
|
|
|
btnToolsPkgReload: TSpeedButton;
|
|
|
|
|
btnToolsRun: TButton;
|
|
|
|
|
cmbSoftPkgSelect: TComboBox;
|
|
|
|
|
cmbToolsPkgSelect: TComboBox;
|
|
|
|
|
edSoftSearch: TEdit;
|
|
|
|
|
edToolsSearch: TEdit;
|
|
|
|
|
labSoftPkgDescription: TLabel;
|
|
|
|
|
labToolsPkgDescription: TLabel;
|
|
|
|
|
PageControl: TPageControl;
|
|
|
|
|
pnSoftTop: TPanel;
|
|
|
|
|
btnSoftPkgEdit: TSpeedButton;
|
|
|
|
|
btnSoftPkgReload: TSpeedButton;
|
|
|
|
|
pnToolsTop: TPanel;
|
|
|
|
|
tabSoft: TTabSheet;
|
|
|
|
|
tabLog: TTabSheet;
|
|
|
|
|
tabSystem: TTabSheet;
|
|
|
|
|
tabTools: TTabSheet;
|
|
|
|
|
vstSoftPkgContents: TVirtualStringTree;
|
2019-01-20 05:41:33 +00:00
|
|
|
|
vstToolsPkgContents: TVirtualStringTree;
|
|
|
|
|
// Создание формы и обновление выпадающих меню пакетов программ и утилит
|
2019-01-12 17:05:16 +00:00
|
|
|
|
procedure FormCreate(Sender: TObject);
|
2019-01-20 05:41:33 +00:00
|
|
|
|
// Смена пакета программ через выпадающий список
|
|
|
|
|
procedure cmbSoftPkgSelectChange(Sender: TObject);
|
|
|
|
|
// Смена пакета утилит через выпадающий список
|
|
|
|
|
procedure cmbToolsPkgSelectChange(Sender: TObject);
|
2019-01-12 20:24:13 +00:00
|
|
|
|
// Обрабока клика по кнопке обновления выпадающего меню пакетов программ
|
|
|
|
|
procedure btnSoftPkgReloadClick(Sender: TObject);
|
|
|
|
|
// Обрабока клика по кнопке обновления выпадающего меню пакетов утилит
|
|
|
|
|
procedure btnToolsPkgReloadClick(Sender: TObject);
|
2019-01-20 06:38:12 +00:00
|
|
|
|
procedure PageControlChange(Sender: TObject);
|
2019-01-20 05:41:33 +00:00
|
|
|
|
// Отображение отметок в нодах дерева программ
|
|
|
|
|
procedure vstSoftPkgContentsInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
|
|
|
|
|
var InitialStates: TVirtualNodeInitStates);
|
|
|
|
|
// Отображение имён утилит в нодах дерева программ
|
|
|
|
|
procedure vstSoftPkgContentsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
|
|
|
|
Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
|
|
|
|
|
// Отображение имён утилит в нодах дерева утилит
|
|
|
|
|
procedure vstToolsPkgContentsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
|
|
|
|
Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
|
2019-01-12 17:05:16 +00:00
|
|
|
|
private
|
2019-01-20 05:41:33 +00:00
|
|
|
|
// Создание ноды в указанном дереве с указанными параметрами
|
|
|
|
|
function AddNode(AVST: TVirtualStringTree; ARootNode: PVirtualNode; AName: String;
|
|
|
|
|
APath: String = ''): PVirtualNode;
|
|
|
|
|
// Создание ноды в указанном дереве с указанными параметрами
|
|
|
|
|
//function AddNode(AVST: TVirtualStringTree; ARootNode: PVirtualNode; AName: String;
|
|
|
|
|
// APath: String = ''): PVirtualNode;
|
|
|
|
|
// Отображение имён программ в нодах деревьев при инициализации деревьев
|
|
|
|
|
procedure SetNodeText(AVST: TVirtualStringTree; Node: PVirtualNode; Column: TColumnIndex;
|
|
|
|
|
TextType: TVSTTextType; var CellText: String);
|
|
|
|
|
// Заполнение дерева содержимым пакета
|
|
|
|
|
procedure PackageFillVST(AVST: TVirtualStringTree; APackage: TPackage);
|
2019-01-12 17:05:16 +00:00
|
|
|
|
public
|
2019-01-20 05:41:33 +00:00
|
|
|
|
// Выбор пакета. Заполняется дерево и отображается описание пакета.
|
|
|
|
|
procedure SetActivePackage(AType: TPackageType; APackageIndex: Integer);
|
|
|
|
|
// Перезагрузка дерева пакетов и выпадающих списков пакетов по указанному типу
|
|
|
|
|
procedure ReloadPackagesList(APackageType: TPackageType);
|
2019-01-12 17:05:16 +00:00
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
var
|
|
|
|
|
fmMain: TfmMain;
|
|
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
|
|
{$R *.lfm}
|
|
|
|
|
|
|
|
|
|
{ TfmMain }
|
2019-01-20 05:41:33 +00:00
|
|
|
|
|
2019-01-12 20:24:13 +00:00
|
|
|
|
{------------------------------------------------------------------------------
|
2019-01-20 05:41:33 +00:00
|
|
|
|
Функция: TPackage.AddNode()
|
|
|
|
|
Назначение: Создание дочерней ноды в указанном дереве с указанными параметрами
|
|
|
|
|
Вх. параметры:
|
|
|
|
|
AVST: TVirtualStringTree - компонент дерева, в котором нужно создать ноду
|
|
|
|
|
ARootNode: PVirtualNode - указатель на ноду-родителя (для создания ноды, вложенной в неё)
|
|
|
|
|
AName: String - название ноды (для отображения имени программы или утилиты)
|
|
|
|
|
APath: String = '' - путь к программе или утилите (не заполняется для корневых нод)
|
|
|
|
|
Возвращает: PVirtualNode - указатель на созданную ноду списка
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
function TfmMain.AddNode(AVST: TVirtualStringTree; ARootNode: PVirtualNode; AName: String;
|
|
|
|
|
APath: String = ''): PVirtualNode;
|
|
|
|
|
var
|
|
|
|
|
ptrData: PChildNodeData;
|
|
|
|
|
begin
|
|
|
|
|
Result := AVST.AddChild(ARootNode);
|
|
|
|
|
AVST.ValidateNode(Result, False);
|
|
|
|
|
ptrData := AVST.GetNodeData(Result);
|
|
|
|
|
ptrData^.FName := AName;
|
|
|
|
|
//if Assigned(APath) then
|
|
|
|
|
ptrData^.FPath := APath;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.SetNodeText()
|
|
|
|
|
Назначение: Отображение имён программ в нодах деревьев при инициализации деревьев
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.SetNodeText(AVST: TVirtualStringTree; Node: PVirtualNode; Column: TColumnIndex;
|
|
|
|
|
TextType: TVSTTextType; var CellText: String);
|
|
|
|
|
var
|
|
|
|
|
PData: PRootNodeData;
|
|
|
|
|
begin
|
|
|
|
|
PData := AVST.GetNodeData(Node);
|
|
|
|
|
CellText := PData^.FName;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.SetActivePackage()
|
|
|
|
|
Назначение: Выбор пакета. Заполняется дерево и отображается описание пакета.
|
|
|
|
|
Вх. параметры:
|
|
|
|
|
AType: TPackageType - тип пакета
|
|
|
|
|
APackageIndex: integer - номер пакета в списке (а равно в соотв. ComboBox)
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.SetActivePackage(AType: TPackageType; APackageIndex: Integer);
|
|
|
|
|
var
|
|
|
|
|
Package: TPackage;
|
|
|
|
|
begin
|
|
|
|
|
case (AType) of
|
|
|
|
|
ptSoft:
|
|
|
|
|
begin
|
|
|
|
|
Package := dmMain.SoftPackages[APackageIndex];
|
|
|
|
|
PackageFillVST(vstSoftPkgContents, Package);
|
|
|
|
|
labSoftPkgDescription.Caption := Package.Description;
|
|
|
|
|
end;
|
|
|
|
|
ptTools:
|
|
|
|
|
begin
|
|
|
|
|
Package := dmMain.ToolsPackages[APackageIndex];
|
|
|
|
|
PackageFillVST(vstToolsPkgContents, Package);
|
|
|
|
|
labToolsPkgDescription.Caption := Package.Description;
|
|
|
|
|
end;
|
|
|
|
|
else
|
|
|
|
|
raise Exception.Create('TfmMain.SetActivePackage(): передан неизвестный тип пакета');
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.PackageFillVST()
|
|
|
|
|
Назначение: Заполнение дерева содержимым пакета
|
|
|
|
|
Вх. параметры:
|
|
|
|
|
AVST: TVirtualStringTree - компонент дерева, которое необходимо заполнить
|
|
|
|
|
APackage: TPackage - объект пакета
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.PackageFillVST(AVST: TVirtualStringTree; APackage: TPackage);
|
|
|
|
|
var
|
|
|
|
|
Sections: TStringList;
|
|
|
|
|
SectionItems: TStringList;
|
|
|
|
|
keySection: Integer;
|
|
|
|
|
keyItem: Integer;
|
|
|
|
|
Path: String;
|
|
|
|
|
ptrRootNode: PVirtualNode;
|
|
|
|
|
ptrChildNode: PVirtualNode;
|
|
|
|
|
begin
|
|
|
|
|
AVST.Clear;
|
|
|
|
|
Sections := TStringList.Create;
|
|
|
|
|
SectionItems := TStringList.Create;
|
|
|
|
|
APackage.ReadSections(Sections);
|
|
|
|
|
for keySection := 0 to Sections.Count - 1 do
|
|
|
|
|
begin
|
|
|
|
|
if Sections[keySection] = 'PackageInfo' then
|
|
|
|
|
continue;
|
|
|
|
|
ptrRootNode := AddNode(AVST, nil, Sections[keySection]);
|
|
|
|
|
APackage.ReadSection(Sections[keySection], SectionItems);
|
|
|
|
|
if SectionItems.Count > 0 then
|
|
|
|
|
begin
|
|
|
|
|
for keyItem := 0 to SectionItems.Count - 1 do
|
|
|
|
|
begin
|
|
|
|
|
Path := APackage.ReadString(Sections[keySection], SectionItems[keyItem], '');
|
|
|
|
|
AddNode(AVST, ptrRootNode, SectionItems[keyItem], Path);
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.ReloadPackagesList()
|
|
|
|
|
Назначение: Обновление выпадающих меню пакетов при создании окна
|
2019-01-12 20:24:13 +00:00
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.FormCreate(Sender: TObject);
|
|
|
|
|
begin
|
|
|
|
|
ReloadPackagesList(ptSoft);
|
|
|
|
|
ReloadPackagesList(ptTools);
|
2019-01-20 06:38:12 +00:00
|
|
|
|
PageControl.ActivePageIndex := 0;
|
2019-01-20 05:41:33 +00:00
|
|
|
|
end;
|
|
|
|
|
|
2019-01-12 20:24:13 +00:00
|
|
|
|
{------------------------------------------------------------------------------
|
2019-01-20 05:41:33 +00:00
|
|
|
|
Процедура: TfmMain.btnSoftPkgReloadClick()
|
|
|
|
|
Назначение: Обрабока клика по кнопке обновления выпадающего списка пакетов программ
|
2019-01-12 20:24:13 +00:00
|
|
|
|
------------------------------------------------------------------------------}
|
2019-01-12 17:05:16 +00:00
|
|
|
|
procedure TfmMain.btnSoftPkgReloadClick(Sender: TObject);
|
|
|
|
|
begin
|
2019-01-12 20:24:13 +00:00
|
|
|
|
ReloadPackagesList(ptSoft);
|
2019-01-12 17:05:16 +00:00
|
|
|
|
end;
|
2019-01-20 05:41:33 +00:00
|
|
|
|
|
2019-01-12 20:24:13 +00:00
|
|
|
|
{------------------------------------------------------------------------------
|
2019-01-20 05:41:33 +00:00
|
|
|
|
Процедура: TfmMain.btnToolsPkgReloadClick()
|
|
|
|
|
Назначение: Обрабока клика по кнопке обновления выпадающего списка пакетов утилит
|
2019-01-12 20:24:13 +00:00
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.btnToolsPkgReloadClick(Sender: TObject);
|
2019-01-12 17:05:16 +00:00
|
|
|
|
begin
|
2019-01-12 20:24:13 +00:00
|
|
|
|
ReloadPackagesList(ptTools);
|
2019-01-12 17:05:16 +00:00
|
|
|
|
end;
|
2019-01-20 06:38:12 +00:00
|
|
|
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.PageControlChange()
|
|
|
|
|
Назначение: Обрабока переключения вкладок
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.PageControlChange(Sender: TObject);
|
|
|
|
|
begin
|
|
|
|
|
// меню выбора должно быть активно только на вкладке "Установка"
|
|
|
|
|
dmMain.mbCheck.Enabled := PageControl.ActivePageIndex = 0;
|
|
|
|
|
end;
|
2019-01-12 17:05:16 +00:00
|
|
|
|
|
2019-01-20 05:41:33 +00:00
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.vstSoftPkgContentsGetText()
|
|
|
|
|
Назначение: Отображение имён программ в нодах дерева программ
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.vstSoftPkgContentsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
|
|
|
|
Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
|
|
|
|
|
begin
|
|
|
|
|
SetNodeText(vstSoftPkgContents, Node, Column, TextType, CellText);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.vstSoftPkgContentsGetText()
|
|
|
|
|
Назначение: Отображение имён утилит в нодах дерева утилит
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.vstToolsPkgContentsGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
|
|
|
|
Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
|
|
|
|
|
begin
|
|
|
|
|
SetNodeText(vstToolsPkgContents, Node, Column, TextType, CellText);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.vstSoftPkgContentsInitNode()
|
|
|
|
|
Назначение: Отображение отметок в нодах дерева программ
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.vstSoftPkgContentsInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
|
|
|
|
|
var InitialStates: TVirtualNodeInitStates);
|
|
|
|
|
begin
|
|
|
|
|
//Sender.CheckType[Node] := ctTriStateCheckBox;
|
|
|
|
|
case (Sender.GetNodeLevel(Node)) of
|
|
|
|
|
0: Node^.CheckType := ctTriStateCheckBox;
|
|
|
|
|
1: Node^.CheckType := ctCheckBox;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
2019-01-12 20:24:13 +00:00
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.ReloadPackagesList()
|
2019-01-20 05:41:33 +00:00
|
|
|
|
Назначение: Перезагрузка пакетов и заполнение выпадающих списков пакетов
|
2019-01-12 20:24:13 +00:00
|
|
|
|
Вх. параметры: APackageType: TPackageType - тип списка пакета
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.ReloadPackagesList(APackageType: TPackageType);
|
|
|
|
|
var
|
2019-01-20 05:41:33 +00:00
|
|
|
|
LastIndex: Integer;
|
2019-01-12 20:24:13 +00:00
|
|
|
|
Key: Integer;
|
|
|
|
|
PackageList: TPackageList;
|
2019-01-20 05:41:33 +00:00
|
|
|
|
Package: TPackage;
|
|
|
|
|
Combo: TComboBox;
|
|
|
|
|
begin
|
2019-01-12 20:24:13 +00:00
|
|
|
|
case (APackageType) of
|
2019-01-20 05:41:33 +00:00
|
|
|
|
ptSoft:
|
|
|
|
|
begin
|
2019-01-12 20:24:13 +00:00
|
|
|
|
Combo := cmbSoftPkgSelect;
|
|
|
|
|
PackageList := dmMain.SoftPackages;
|
|
|
|
|
end;
|
2019-01-20 05:41:33 +00:00
|
|
|
|
ptTools:
|
|
|
|
|
begin
|
2019-01-12 20:24:13 +00:00
|
|
|
|
Combo := cmbToolsPkgSelect;
|
|
|
|
|
PackageList := dmMain.ToolsPackages;
|
|
|
|
|
end;
|
2019-01-20 05:41:33 +00:00
|
|
|
|
else raise Exception.Create('TfmMain.ReloadPackagesList(): передан неизвестный тип пакета');
|
2019-01-12 20:24:13 +00:00
|
|
|
|
end;
|
|
|
|
|
LastIndex := Combo.ItemIndex;
|
|
|
|
|
if LastIndex < 0 then
|
|
|
|
|
LastIndex := 0;
|
|
|
|
|
Combo.Clear;
|
|
|
|
|
PackageList.Reload();
|
|
|
|
|
if PackageList.Count > 0 then
|
|
|
|
|
begin
|
|
|
|
|
for Key := 0 to PackageList.Count - 1 do
|
|
|
|
|
begin
|
2019-01-20 05:41:33 +00:00
|
|
|
|
Package := PackageList[Key];
|
|
|
|
|
Combo.Items.Add(Package.Name + ' (' + ExtractFileName(Package.FileName) + ')');
|
2019-01-12 20:24:13 +00:00
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
if Combo.Items.Count <= LastIndex then
|
|
|
|
|
LastIndex := Combo.Items.Count - 1;
|
|
|
|
|
Combo.ItemIndex := LastIndex;
|
2019-01-20 05:41:33 +00:00
|
|
|
|
SetActivePackage(APackageType, LastIndex);
|
2019-01-12 17:05:16 +00:00
|
|
|
|
end;
|
|
|
|
|
|
2019-01-20 05:41:33 +00:00
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.cmbSoftPkgSelectChange()
|
|
|
|
|
Назначение: Смена пакета программ через выпадающий список
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.cmbSoftPkgSelectChange(Sender: TObject);
|
|
|
|
|
begin
|
|
|
|
|
SetActivePackage(ptSoft, cmbSoftPkgSelect.ItemIndex);
|
|
|
|
|
end;
|
2019-01-12 17:05:16 +00:00
|
|
|
|
|
2019-01-20 05:41:33 +00:00
|
|
|
|
{------------------------------------------------------------------------------
|
|
|
|
|
Процедура: TfmMain.cmbSoftPkgSelectChange()
|
|
|
|
|
Назначение: Смена пакета утилит через выпадающий список
|
|
|
|
|
------------------------------------------------------------------------------}
|
|
|
|
|
procedure TfmMain.cmbToolsPkgSelectChange(Sender: TObject);
|
|
|
|
|
begin
|
|
|
|
|
SetActivePackage(ptTools, cmbToolsPkgSelect.ItemIndex);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
end.
|