unit dMain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Controls, Menus, VirtualTrees, uPackage, uPackageList;

type

  { TdmMain }

  TdmMain = class(TDataModule)
    imgIcons: TImageList;
    mmMain: TMainMenu;
    mbInstallCheckAll: TMenuItem;
    mbInstallExpandTree: TMenuItem;
    mbInstallCollapseTree: TMenuItem;
    mbInstallCheckInvert: TMenuItem;
    mbInstallCheckNone: TMenuItem;
    mbTree: TMenuItem;
    mbCollapseTree: TMenuItem;
    mbExpandTree: TMenuItem;
    mbCheck: TMenuItem;
    mbCheckAll: TMenuItem;
    mbCheckInvert: TMenuItem;
    mbCheckNone: TMenuItem;
    mbOptions: TMenuItem;
    mbHelp: TMenuItem;
    mbOnlineHelp: TMenuItem;
    mbAbout: TMenuItem;
    mbOptonsMain: TMenuItem;
    mbOptionsPkg: TMenuItem;
    pmInstallTree: TPopupMenu;
    pmInstallCheck: TPopupMenu;
    procedure DataModuleCreate(Sender: TObject);
    procedure mbCheckAllClick(Sender: TObject);
    procedure mbCheckNoneClick(Sender: TObject);
    procedure mbCollapseTreeClick(Sender: TObject);
    procedure mbExpandTreeClick(Sender: TObject);
  private
    // Подготовка директорий
    procedure PrepareDirs(); 
    // Подготовка списков пакетов
    procedure PreparePackages();
  public
    { Публичные переменные, которые доступны во всех юнитах с подключенным uses ..., dMain }

    // путь к файлу ABTool.exe
    ABToolExePath: String;
    // путь к директории ABTool
    ABToolDataPath: String;
    // путь к директории ABTool\Packages
    ABToolPkgPath: String;
    // путь к директории ABTool\Languages
    ABToolLangPath: String;
    // путь к директории ABTool\Logs
    ABToolLogPath: String;
    // Список объектов пакетов программ для установки
    SoftPackages: TPackageList; 
    // Список объектов пакетов утилит для запуска
    ToolsPackages: TPackageList;
    // Установка состояния отметки для всех корневых нод указанного дерева
    procedure SetVSTCheckState(AVST: TBaseVirtualTree; AState: boolean);
  end;

var
  dmMain: TdmMain;

implementation

uses fMain;

{$R *.lfm}

{ TdmMain }
                       
{------------------------------------------------------------------------------
Конструктор:   TdmMain.Create()
Назначение:    Создание датамодуля, подготовка путей и списков пакетов
------------------------------------------------------------------------------}
procedure TdmMain.DataModuleCreate(Sender: TObject);
begin
  PrepareDirs();
  PreparePackages();
end;
         
{------------------------------------------------------------------------------
Конструктор:   TdmMain.SetVSTCheckState()
Назначение:    Установка состояния отметки для всех корневых нод указанного дерева
Вх. параметры:
  AVST: TBaseVirtualTree - дерево
  AState: boolean - состояние отметок: TRUE выбрать все, FALSE снять выбор со всех
------------------------------------------------------------------------------}
procedure TdmMain.SetVSTCheckState(AVST: TBaseVirtualTree; AState: boolean);
var
  Node: PVirtualNode;  

  // Установка состояния отметки ноды-родителя дочерним нодам
  procedure CheckChildNodes(ANode: PVirtualNode);
  var
    ChildNode: PVirtualNode;
  begin
    ChildNode := AVST.GetFirstChild(ANode);
    while Assigned(ChildNode) do
    begin
      CheckChildNodes(ChildNode);
      ChildNode^.CheckState := ChildNode^.Parent^.CheckState;
      ChildNode := AVST.GetNextSibling(ChildNode);
    end;
  end;

begin
  AVST.BeginUpdate;
  try
    Node := AVST.GetFirst;
    while Assigned(Node) do
    begin
      if AState = true then
        Node^.CheckState := csCheckedNormal
      else
        Node^.CheckState := csUncheckedNormal;
      CheckChildNodes(Node);
      Node := AVST.GetNextSibling(Node);
    end;
  finally
    AVST.EndUpdate;
  end;
end;

{------------------------------------------------------------------------------
Конструктор:   TdmMain.mbCheckAllClick()
Назначение:    Обработка клика п. меню "Выбрать всё"
------------------------------------------------------------------------------}
procedure TdmMain.mbCheckAllClick(Sender: TObject);
begin
  SetVSTCheckState(fmMain.vstSoftPkgContents, true);
end; 
     
{------------------------------------------------------------------------------
Конструктор:   TdmMain.mbCheckNoneClick()
Назначение:    Обработка клика п. меню "Снять выбор"
------------------------------------------------------------------------------}
procedure TdmMain.mbCheckNoneClick(Sender: TObject);
begin
  SetVSTCheckState(fmMain.vstSoftPkgContents, false);
end;
      
{------------------------------------------------------------------------------
Процедура:  TdmMain.mbCollapseTreeClick()
Назначение: Сворачивание дерева на активной вкладке главного окна
------------------------------------------------------------------------------}
procedure TdmMain.mbCollapseTreeClick(Sender: TObject);
begin
  case (fmMain.PageControl.ActivePageIndex) of
    0: fmMain.vstSoftPkgContents.FullCollapse();
    1: fmMain.vstToolsPkgContents.FullCollapse();
  end;
end;

{------------------------------------------------------------------------------
Процедура:  TdmMain.mbCollapseTreeClick()
Назначение: Разворачивание дерева на активной вкладке главного окна
------------------------------------------------------------------------------}
procedure TdmMain.mbExpandTreeClick(Sender: TObject);
begin
  case (fmMain.PageControl.ActivePageIndex) of
    0: fmMain.vstSoftPkgContents.FullExpand();
    1: fmMain.vstToolsPkgContents.FullExpand();
  end;
end;
                    
{------------------------------------------------------------------------------
Процедура:  TdmMain.PreparePackages()
Назначение: Подготовка директорий
------------------------------------------------------------------------------}
procedure TdmMain.PrepareDirs();
begin
  ABToolExePath := ExtractFilePath(ParamStr(0));
  ABToolDataPath := ABToolExePath + 'ABTool\';
  ABToolPkgPath := ABToolDataPath + 'Packages\';
  ABToolLangPath := ABToolDataPath + 'Languages\';
  ABToolLogPath := ABToolDataPath + 'Logs\';
  if not DirectoryExists(ABToolPkgPath) then
    ForceDirectories(ABToolPkgPath);
  if not DirectoryExists(ABToolLangPath) then
    ForceDirectories(ABToolLangPath);
  if not DirectoryExists(ABToolLogPath) then
    ForceDirectories(ABToolLogPath);
end;
       
{------------------------------------------------------------------------------
Процедура:  TdmMain.PreparePackages()
Назначение: Подготовка списков пакетов
------------------------------------------------------------------------------}
procedure TdmMain.PreparePackages();
begin
  SoftPackages  := TPackageList.Create;
  SoftPackages.Load(ptSoft);
  ToolsPackages := TPackageList.Create;
  ToolsPackages.Load(ptTools);
end;

end.

