unit package_description_options;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,
  // LCL
  Forms, Controls, StdCtrls, Spin,
  // LazUtils
  LazUtilities,
  // IdeIntf
  PackageDependencyIntf, IDEOptionsIntf, IDEOptEditorIntf,
  // IDE
  LazarusIDEStrConsts, PackageDefs, PackageSystem, BrokenDependenciesDlg;

type

  { TPackageDescriptionOptionsFrame }

  TPackageDescriptionOptionsFrame = class(TAbstractIDEOptionsEditor)
    AuthorEdit: TEdit;
    AuthorGroupBox: TGroupBox;
    DescriptionGroupBox: TGroupBox;
    DescriptionMemo: TMemo;
    dummyForSizing: TLabel;
    LicenseGroupBox: TGroupBox;
    LicenseMemo: TMemo;
    VersionBuildLabel: TLabel;
    VersionBuildSpinEdit: TSpinEdit;
    VersionGroupBox: TGroupBox;
    VersionMajorLabel: TLabel;
    VersionMajorSpinEdit: TSpinEdit;
    VersionMinorLabel: TLabel;
    VersionMinorSpinEdit: TSpinEdit;
    VersionReleaseLabel: TLabel;
    VersionReleaseSpinEdit: TSpinEdit;
  public
    function GetTitle: string; override;
    procedure Setup({%H-}ADialog: TAbstractOptionsEditorDialog); override;
    procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
    procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
    class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
  end;

implementation

{$R *.lfm}

{ TPackageDescriptionOptionsFrame }

function TPackageDescriptionOptionsFrame.GetTitle: string;
begin
  Result := lisCodeHelpDescrTag;
end;

procedure TPackageDescriptionOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
  DescriptionGroupBox.Caption := lisPckOptsDescriptionAbstract;
  AuthorGroupBox.Caption := lisPckOptsAuthor;
  LicenseGroupBox.Caption := lisPckOptsLicense;
  VersionGroupBox.Caption := lisVersion;
  VersionMajorLabel.Caption := lisPckOptsMajor;
  VersionMinorLabel.Caption := lisPckOptsMinor;
  VersionReleaseLabel.Caption := lisPckOptsRelease;
  VersionBuildLabel.Caption := lisBuildNumber;
end;

procedure TPackageDescriptionOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
var
  LazPackage: TLazPackage;
begin
  LazPackage := (AOptions as TPackageIDEOptions).Package;
  DescriptionMemo.Text := LazPackage.Description;
  AuthorEdit.Text := LazPackage.Author;
  LicenseMemo.Text := LazPackage.License;
  VersionMajorSpinEdit.Value := LazPackage.Version.Major;
  VersionMinorSpinEdit.Value := LazPackage.Version.Minor;
  VersionReleaseSpinEdit.Value := LazPackage.Version.Release;
  VersionBuildSpinEdit.Value := LazPackage.Version.Build;
end;

procedure TPackageDescriptionOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
var
  LazPackage: TLazPackage;
  NewVersion: TPkgVersion;
  BrokenDependencies: TFPList;
  RenameDependencies: boolean;
  MsgResult: TModalResult;
begin
  LazPackage := (AOptions as TPackageIDEOptions).Package;
  LazPackage.Description := DescriptionMemo.Text;
  LazPackage.Author := AuthorEdit.Text;
  LazPackage.License := LicenseMemo.Text;
  NewVersion := TPkgVersion.Create;
  try
    NewVersion.Major := RoundToInt(VersionMajorSpinEdit.Value);
    NewVersion.Minor := RoundToInt(VersionMinorSpinEdit.Value);
    NewVersion.Release := RoundToInt(VersionReleaseSpinEdit.Value);
    NewVersion.Build := RoundToInt(VersionBuildSpinEdit.Value);

    // check for broken dependencies
    BrokenDependencies := PackageGraph.GetBrokenDependenciesWhenChangingPkgID(LazPackage,
                                                    LazPackage.Name, NewVersion);
    RenameDependencies := False;
    try
      if BrokenDependencies.Count > 0 then
      begin
        MsgResult := ShowBrokenDependencies(BrokenDependencies);
        if MsgResult = mrOK then            // = Yes
          RenameDependencies := True
        else if MsgResult <> mrClose then   // <> Ignore
          exit;
      end;
    finally
      BrokenDependencies.Free;
    end;

    PackageGraph.ChangePackageID(LazPackage, LazPackage.Name, NewVersion, RenameDependencies, True);
  finally
    NewVersion.Free;
  end;
end;

class function TPackageDescriptionOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
  Result := TPackageIDEOptions;
end;

initialization
  RegisterIDEOptionsEditor(GroupPackage, TPackageDescriptionOptionsFrame,
    PackageOptionsDescription);
end.

