unit project_misc_options;

{$mode objfpc}{$H+}

interface

uses
  SysUtils,
  // LCL
  Forms, Dialogs, ExtCtrls, StdCtrls,
  // LazUtils
  FileUtil, LazFileUtils,
  // IdeIntf
  ProjectIntf, IDEOptionsIntf, IDEOptEditorIntf,
  // IDE
  Project, LazarusIDEStrConsts;

type

  { TProjectMiscOptionsFrame }

  TProjectMiscOptionsFrame = class(TAbstractIDEOptionsEditor)
    AlwaysBuildCheckBox: TCheckBox;
    Bevel1: TBevel;
    Bevel2: TBevel;
    LRSInOutputDirCheckBox: TCheckBox;
    MainUnitHasCreateFormStatementsCheckBox: TCheckBox;
    CompatibilityModeCheckBox: TCheckBox;
    MainUnitHasTitleStatementCheckBox: TCheckBox;
    MainUnitHasScaledStatementCheckBox: TCheckBox;
    MainUnitHasUsesSectionForAllUnitsCheckBox: TCheckBox;
    MainUnitIsPascalSourceCheckBox: TCheckBox;
    PathDelimComboBox: TComboBox;
    PathDelimLabel: TLabel;
    ResourceGroupBox: TGroupBox;
    RunnableCheckBox: TCheckBox;
    UseDesignTimePkgsCheckBox: TCheckBox;
    UseFPCResourcesRadioButton: TRadioButton;
    UseLRSFilesRadioButton: TRadioButton;
  private
  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}

{ TProjectMiscOptionsFrame }

function TProjectMiscOptionsFrame.GetTitle: string;
begin
  Result := dlgPOMisc;
end;

procedure TProjectMiscOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
  MainUnitIsPascalSourceCheckBox.Caption := lisMainUnitIsPascalSource;
  MainUnitIsPascalSourceCheckBox.Hint := lisMainUnitIsPascalSourceHint;
  MainUnitHasUsesSectionForAllUnitsCheckBox.Caption := lisMainUnitHasUsesSectionContainingAllUnitsOfProject;
  MainUnitHasUsesSectionForAllUnitsCheckBox.Hint := lisNewUnitsAreAddedToUsesSections;
  MainUnitHasCreateFormStatementsCheckBox.Caption := lisUpdateApplicationCreateForm;
  MainUnitHasCreateFormStatementsCheckBox.Hint := lisUsedForAutoCreatedForms;
  MainUnitHasTitleStatementCheckBox.Caption := lisUpdateApplicationTitleStatement;
  MainUnitHasTitleStatementCheckBox.Hint := lisIdeMaintainsTheTitleInMainUnit;
  MainUnitHasScaledStatementCheckBox.Caption := lisUpdateApplicationScaledStatement;

  MainUnitHasScaledStatementCheckBox.Hint := lisIdeMaintainsScaledInMainUnit;
  CompatibilityModeCheckBox.Caption := lisLPICompatibilityModeCheckBox;
  CompatibilityModeCheckBox.Hint := lisLPICompatibilityModeCheckBoxHint;
  RunnableCheckBox.Caption := lisProjectIsRunnable;
  RunnableCheckBox.Hint := lisProjectIsRunnableHint;
  UseDesignTimePkgsCheckBox.Caption := lisUseDesignTimePackages;
  UseDesignTimePkgsCheckBox.Hint := lisThisIsTestProjectForDesignTimePackage;
  AlwaysBuildCheckBox.Caption := lisProjOptsAlwaysBuildEvenIfNothingChanged;
  AlwaysBuildCheckBox.Hint := lisProjOptsAlwaysBuildHint;
  LRSInOutputDirCheckBox.Caption := lisPutLrsFilesInOutputDirectory;
  LRSInOutputDirCheckBox.Hint := lisPutLrsFilesInOutputDirectoryHint;
  ResourceGroupBox.Caption := lisResourceTypeOfNewFiles;
  UseLRSFilesRadioButton.Caption := lisLrsIncludeFiles;
  UseLRSFilesRadioButton.Hint := lisAutomaticallyConvertLfmToLrs;
  UseFPCResourcesRadioButton.Caption := lisFPCResources;
  UseFPCResourcesRadioButton.Hint := lisDelphiCompatibleResources;
  PathDelimLabel.Caption:=lisStorePathDelimitersAndAs;
  PathDelimComboBox.Items.Text:=lisDoNotChange+LineEnding
                               +lisChangeToUnix+LineEnding
                               +lisChangeToWindows;
end;

procedure TProjectMiscOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
begin
  with (AOptions as TProjectIDEOptions).Project do
  begin
    MainUnitIsPascalSourceCheckBox.Checked := (pfMainUnitIsPascalSource in Flags);
    MainUnitHasUsesSectionForAllUnitsCheckBox.Checked := (pfMainUnitHasUsesSectionForAllUnits in Flags);
    if TProjectIDEOptions(AOptions).LclApp then begin
      MainUnitHasCreateFormStatementsCheckBox.Checked := (pfMainUnitHasCreateFormStatements in Flags);
      MainUnitHasTitleStatementCheckBox.Checked := (pfMainUnitHasTitleStatement in Flags);
      MainUnitHasScaledStatementCheckBox.Checked := (pfMainUnitHasScaledStatement in Flags);
    end
    else begin  // Disable these for a console program.
      MainUnitHasCreateFormStatementsCheckBox.Enabled := False;
      MainUnitHasTitleStatementCheckBox.Enabled := False;
      MainUnitHasScaledStatementCheckBox.Enabled := False;
    end;
    CompatibilityModeCheckBox.Checked := (pfCompatibilityMode in Flags);
    RunnableCheckBox.Checked := (pfRunnable in Flags);
    UseDesignTimePkgsCheckBox.Checked := (pfUseDesignTimePackages in Flags);
    AlwaysBuildCheckBox.Checked := (pfAlwaysBuild in Flags);
    LRSInOutputDirCheckBox.Checked := (pfLRSFilesInOutputDirectory in Flags);
    case ProjResources.ResourceType of
      rtLRS: UseLRSFilesRadioButton.Checked := True;
      rtRes: UseFPCResourcesRadioButton.Checked := True;
    end;
    case StorePathDelim of
    pdsNone: PathDelimComboBox.ItemIndex:=0;
    pdsSystem: if PathDelim='/' then {%H-}PathDelimComboBox.ItemIndex:=1
                                else {%H-}PathDelimComboBox.ItemIndex:=2;
    pdsUnix: PathDelimComboBox.ItemIndex:=1;
    pdsWindows: PathDelimComboBox.ItemIndex:=2;
    end;
  end;
end;

procedure TProjectMiscOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
var
  Project: TProject;
  NewFlags: TProjectFlags;

  procedure SetProjectFlag(AFlag: TProjectFlag; AValue: Boolean);
  begin
    if AValue then
      Include(NewFlags, AFlag)
    else
      Exclude(NewFlags, AFlag);
  end;

begin
  Project := (AOptions as TProjectIDEOptions).Project;
  NewFlags := Project.Flags;
  SetProjectFlag(pfMainUnitIsPascalSource,
                 MainUnitIsPascalSourceCheckBox.Checked);
  SetProjectFlag(pfMainUnitHasUsesSectionForAllUnits,
                 MainUnitHasUsesSectionForAllUnitsCheckBox.Checked);
  SetProjectFlag(pfMainUnitHasCreateFormStatements,
                 MainUnitHasCreateFormStatementsCheckBox.Checked);
  SetProjectFlag(pfMainUnitHasTitleStatement,
                 MainUnitHasTitleStatementCheckBox.Checked);
  SetProjectFlag(pfMainUnitHasScaledStatement,
                 MainUnitHasScaledStatementCheckBox.Checked);
  SetProjectFlag(pfCompatibilityMode,
                 CompatibilityModeCheckBox.Checked);
  SetProjectFlag(pfRunnable, RunnableCheckBox.Checked);
  SetProjectFlag(pfUseDesignTimePackages, UseDesignTimePkgsCheckBox.Checked);
  SetProjectFlag(pfAlwaysBuild, AlwaysBuildCheckBox.Checked);
  SetProjectFlag(pfLRSFilesInOutputDirectory, LRSInOutputDirCheckBox.Checked);
  Project.Flags := NewFlags;
  if UseLRSFilesRadioButton.Checked then
    Project.ProjResources.ResourceType := rtLRS
  else
    Project.ProjResources.ResourceType := rtRes;
  case PathDelimComboBox.ItemIndex of
  0: Project.StorePathDelim:=pdsNone;
  1: Project.StorePathDelim:=pdsUnix;
  2: Project.StorePathDelim:=pdsWindows;
  end;
end;

class function TProjectMiscOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
  Result := TProjectIDEOptions;
end;

initialization
  RegisterIDEOptionsEditor(GroupProject, TProjectMiscOptionsFrame, ProjectOptionsMisc);

end.

