{
 ***************************************************************************
 *                                                                         *
 *   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.   *
 *                                                                         *
 ***************************************************************************
}
unit formed_options;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,
  // LCL
  Graphics, Forms, StdCtrls, Dialogs, Spin, ColorBox,
  // BuildIntf
  IDEOptionsIntf,
  // IdeIntf
  IDEOptEditorIntf,
  // IdeConfig
  EnvironmentOpts,
  // IDE
  EnvGuiOptions, LazarusIDEStrConsts;

type
  TDesignerColor = (
    dcGrid,
    dcBorderSpacing,
    dcGridLinesLeftTop,
    dcGridLinesRightBottom,
    dcGrabber,
    dcMarker,
    dcRuberbandSelection,
    dcRuberbandCreation,
    dcNonFormBackgroundColor
  );

  { TFormEditorOptionsFrame }

  TFormEditorOptionsFrame = class(TAbstractIDEOptionsEditor)
    FormTitleBarChangesObjectInspectorCheckBox: TCheckBox;
    ForceDPIScalingInDesignTimeCheckBox: TCheckBox;
    SwitchToFavoritesOITabCheckBox:TCheckBox;
    CheckPackagesOnFormCreateCheckBox: TCheckBox;
    OpenDesignerOnOpenUnitCheckBox: TCheckBox;
    ColorBox: TColorBox;
    ColorsListBox: TColorListBox;
    CreateCompFocusNameCheckBox: TCheckBox;
    FormEditMiscGroupBox: TGroupBox;
    GridGroupBox: TGroupBox;
    GridSizeXSpinEdit: TSpinEdit;
    GridSizeXLabel: TLabel;
    GridSizeYSpinEdit: TSpinEdit;
    GridSizeYLabel: TLabel;
    GuideLinesGroupBox: TGroupBox;
    DesignerColorsGroupBox: TGroupBox;
    RightClickSelectsCheckBox: TCheckBox;
    RubberbandSelectsGrandChildsCheckBox: TCheckBox;
    ShowBorderSpaceCheckBox: TCheckBox;
    ShowComponentCaptionsCheckBox: TCheckBox;
    ShowEditorHintsCheckBox: TCheckBox;
    ShowGridCheckBox: TCheckBox;
    ShowGuideLinesCheckBox: TCheckBox;
    SnapToGridCheckBox: TCheckBox;
    SnapToGuideLinesCheckBox: TCheckBox;
    procedure ColorBoxChange(Sender: TObject);
    procedure ColorsListBoxGetColors(Sender: TCustomColorListBox; Items: TStrings);
    procedure ColorsListBoxSelectionChange(Sender: TObject; User: boolean);
    procedure CreateCompFocusNameCheckBoxChange(Sender: TObject);
    procedure FrameResize(Sender: TObject);
  private
    FLoaded: Boolean;
    procedure ChangeColor(AIndex: Integer; NewColor: TColor);
  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}

{ TFormEditorOptionsFrame }

function TFormEditorOptionsFrame.GetTitle: String;
begin
  Result := dlgFrmEditor;
end;

procedure TFormEditorOptionsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
  procedure SetupGridGroupBox;
  begin
    ShowGridCheckBox.Caption:=dlgQShowGrid;
    ShowGridCheckBox.Hint:=dlgGridConsistsOfSmallDots;
    ShowBorderSpaceCheckBox.Caption:=dlgQShowBorderSpacing;
    ShowBorderSpaceCheckBox.Hint:=dlgBorderSpaceCanBeSetInAnchorEditor;
    SnapToGridCheckBox.Caption:=dlgQSnapToGrid;
    SnapToGridCheckBox.Hint:=dlgDistanceBetweenGridPointsIsSmallestStep;
    GridSizeXSpinEdit.Hint:=dlgGridXHint;
    GridSizeXLabel.Caption:=dlgGridX;
    GridSizeYSpinEdit.Hint:=dlgGridYHint;
    GridSizeYLabel.Caption:=dlgGridY;
  end;

  procedure SetupGuideLinesGroupBox;
  begin
    ShowGuideLinesCheckBox.Caption:=dlgGuideLines;
    ShowGuideLinesCheckBox.Hint:=dlgGuideLinesHint;
    SnapToGuideLinesCheckBox.Caption:=dlgSnapGuideLines;
    SnapToGuideLinesCheckBox.Hint:=dlgSnapGuideLinesHint;
  end;

  procedure SetupMiscGroupBox;
  begin
    RubberbandSelectsGrandChildsCheckBox.Caption:=dlgRubberbandSelectsGrandChildren;
    RubberbandSelectsGrandChildsCheckBox.Hint:=dlgSelectAllChildControls;
    ShowComponentCaptionsCheckBox.Caption:=dlgShowCaptionsOfNonVisuals;
    ShowComponentCaptionsCheckBox.Hint:=dlgDrawComponentsNameBelowIt;
    ShowEditorHintsCheckBox.Caption:=dlgShowDesignerHints;
    ShowEditorHintsCheckBox.Hint:=dlgShowDesignerHintsHint;
    OpenDesignerOnOpenUnitCheckBox.Caption:=lisOpenDesignerOnOpenUnit;
    OpenDesignerOnOpenUnitCheckBox.Hint:=lisOpenDesignerOnOpenUnitHint;
    RightClickSelectsCheckBox.Caption:=dlgRightClickSelects;
    RightClickSelectsCheckBox.Hint:=dlgComponentUnderMouseCursorIsFirstSelected;
    CreateCompFocusNameCheckBox.Caption:=lisAskNameOnCreate;
    CreateCompFocusNameCheckBox.Hint:=lisAskForComponentNameAfterPuttingItOnForm;
    SwitchToFavoritesOITabCheckBox.Caption:=lisOFESwitchToObjectInspectorFavoritesTab;
    SwitchToFavoritesOITabCheckBox.Hint:=lisSwitchToFavoritesTabAfterAsking;
    CheckPackagesOnFormCreateCheckBox.Caption:=dlgCheckPackagesOnFormCreate;
    CheckPackagesOnFormCreateCheckBox.Hint:=dlgCheckPackagesOnFormCreateHint;
    FormTitleBarChangesObjectInspectorCheckBox.Caption:=dlgFormTitleBarChangesObjectInspector;
    FormTitleBarChangesObjectInspectorCheckBox.Hint:=dlgFormTitleBarChangesObjectInspectorHint;
    ForceDPIScalingInDesignTimeCheckBox.Caption:=dlgForceDPIScalingInDesignTime;
    ForceDPIScalingInDesignTimeCheckBox.Hint:=dlgForceDPIScalingInDesignTimeHint;
  end;
begin
  GridGroupBox.Caption := dlgEnvGrid;
  GuideLinesGroupBox.Caption := dlgEnvLGuideLines;
  FormEditMiscGroupBox.Caption := dlgEnvMisc;
  DesignerColorsGroupBox.Caption := dlgColors;
  SetupGridGroupBox;
  SetupGuideLinesGroupBox;
  SetupMiscGroupBox;
  FLoaded := False;
end;

procedure TFormEditorOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
var
  EnvOpt: TEnvironmentOptions;
  EnvGui: TIDESubOptions;
begin
  EnvOpt := AOptions as TEnvironmentOptions;
  EnvGui := EnvOpt.GetSubConfigObj(TEnvGuiOptions);
  //Assert(Assigned(EnvGui), 'TFormEditorOptionsFrame.ReadSettings: EnvGui=Nil');
  with EnvGui as TEnvGuiOptions do
  begin
    // read colors
    ColorsListBox.Items.Objects[Ord(dcGrid)] := TObject(PtrInt(GridColor));
    ColorsListBox.Items.Objects[Ord(dcBorderSpacing)] := TObject(PtrInt(BorderSpacingColor));
    ColorsListBox.Items.Objects[Ord(dcGridLinesLeftTop)] := TObject(PtrInt(GuideLineColorLeftTop));
    ColorsListBox.Items.Objects[Ord(dcGridLinesRightBottom)] := TObject(PtrInt(GuideLineColorRightBottom));
    ColorsListBox.Items.Objects[Ord(dcGrabber)] := TObject(PtrInt(GrabberColor));
    ColorsListBox.Items.Objects[Ord(dcMarker)] := TObject(PtrInt(MarkerColor));
    ColorsListBox.Items.Objects[Ord(dcNonFormBackgroundColor)] := TObject(PtrInt(NonFormBackgroundColor));
    ColorsListBox.Items.Objects[Ord(dcRuberbandSelection)] := TObject(PtrInt(RubberbandSelectionColor));
    ColorsListBox.Items.Objects[Ord(dcRuberbandCreation)] := TObject(PtrInt(RubberbandCreationColor));

    ShowBorderSpaceCheckBox.Checked := ShowBorderSpacing;
    ShowGridCheckBox.Checked := ShowGrid;
    SnapToGridCheckBox.Checked := SnapToGrid;
    GridSizeXSpinEdit.Value := GridSizeX;
    GridSizeYSpinEdit.Value := GridSizeY;
    ShowGuideLinesCheckBox.Checked := ShowGuideLines;
    SnapToGuideLinesCheckBox.Checked := SnapToGuideLines;
    ShowComponentCaptionsCheckBox.Checked := ShowComponentCaptions;
    ShowEditorHintsCheckBox.Checked := ShowEditorHints;
    OpenDesignerOnOpenUnitCheckBox.Checked := AutoCreateFormsOnOpen;
    CheckPackagesOnFormCreateCheckBox.Checked := CheckPackagesOnFormCreate;
    RightClickSelectsCheckBox.Checked := RightClickSelects;
    RubberbandSelectsGrandChildsCheckBox.Checked := RubberbandSelectsGrandChilds;
    CreateCompFocusNameCheckBox.Checked := CreateComponentFocusNameProperty;
    SwitchToFavoritesOITabCheckBox.Checked := SwitchToFavoritesOITab;
    SwitchToFavoritesOITabCheckBox.Enabled := CreateCompFocusNameCheckBox.Checked;
    FormTitleBarChangesObjectInspectorCheckBox.Checked := FormTitleBarChangesObjectInspector;
    ForceDPIScalingInDesignTimeCheckBox.Checked := ForceDPIScalingInDesignTime;
  end;
  FLoaded := True;
end;

procedure TFormEditorOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
var
  EnvOpt: TEnvironmentOptions;
  EnvGui: TIDESubOptions;
begin
  EnvOpt := AOptions as TEnvironmentOptions;
  EnvGui := EnvOpt.GetSubConfigObj(TEnvGuiOptions);
  with EnvGui as TEnvGuiOptions do
  begin
    // write colors
    GridColor := ColorsListBox.Colors[Ord(dcGrid)];
    BorderSpacingColor := ColorsListBox.Colors[Ord(dcBorderSpacing)];
    GuideLineColorLeftTop := ColorsListBox.Colors[Ord(dcGridLinesLeftTop)];
    GuideLineColorRightBottom := ColorsListBox.Colors[Ord(dcGridLinesRightBottom)];
    GrabberColor := ColorsListBox.Colors[Ord(dcGrabber)];
    MarkerColor := ColorsListBox.Colors[Ord(dcMarker)];
    NonFormBackgroundColor := ColorsListBox.Colors[Ord(dcNonFormBackgroundColor)];
    RubberbandSelectionColor := ColorsListBox.Colors[Ord(dcRuberbandSelection)];
    RubberbandCreationColor := ColorsListBox.Colors[Ord(dcRuberbandCreation)];

    ShowBorderSpacing := ShowBorderSpaceCheckBox.Checked;
    ShowGrid := ShowGridCheckBox.Checked;
    SnapToGrid := SnapToGridCheckBox.Checked;
    GridSizeX := GridSizeXSpinEdit.Value;
    GridSizeY := GridSizeYSpinEdit.Value;
    ShowGuideLines := ShowGuideLinesCheckBox.Checked;
    SnapToGuideLines := SnapToGuideLinesCheckBox.Checked;
    ShowComponentCaptions := ShowComponentCaptionsCheckBox.Checked;
    ShowEditorHints := ShowEditorHintsCheckBox.Checked;
    AutoCreateFormsOnOpen := OpenDesignerOnOpenUnitCheckBox.Checked;
    CheckPackagesOnFormCreate := CheckPackagesOnFormCreateCheckBox.Checked;
    RightClickSelects := RightClickSelectsCheckBox.Checked;
    RubberbandSelectsGrandChilds := RubberbandSelectsGrandChildsCheckBox.Checked;
    CreateComponentFocusNameProperty := CreateCompFocusNameCheckBox.Checked;
    SwitchToFavoritesOITab := SwitchToFavoritesOITabCheckBox.Checked;
    FormTitleBarChangesObjectInspector := FormTitleBarChangesObjectInspectorCheckBox.Checked;
    ForceDPIScalingInDesignTime := ForceDPIScalingInDesignTimeCheckBox.Checked;
  end;
end;

procedure TFormEditorOptionsFrame.FrameResize(Sender: TObject);
var
  w: Integer;
begin
  w := ((ClientWidth - 3 * 5) * 5) div 10;
  GridGroupBox.Width := w;
  FormEditMiscGroupBox.Width := GridGroupBox.Width;
end;

procedure TFormEditorOptionsFrame.ChangeColor(AIndex: Integer; NewColor: TColor);
begin
  ColorsListBox.Items.Objects[AIndex] := TObject(PtrInt(NewColor));
end;

procedure TFormEditorOptionsFrame.ColorsListBoxGetColors(
  Sender: TCustomColorListBox; Items: TStrings);
begin
  Items.Add(dlgGridColor);
  Items.Add(dlgBorderSpacingColor);
  Items.Add(dlgLeftTopClr);
  Items.Add(dlgRightBottomClr);
  Items.Add(dlgGrabberColor);
  Items.Add(dlgMarkerColor);
  Items.Add(dlgRuberbandSelectionColor);
  Items.Add(dlgRuberbandCreationColor);
  Items.Add(dlgNonFormBackgroundColor);
end;

procedure TFormEditorOptionsFrame.ColorBoxChange(Sender: TObject);
begin
  if not FLoaded or (ColorsListBox.ItemIndex < 0) then
    Exit;
  ChangeColor(ColorsListBox.ItemIndex, ColorBox.Selected);
  ColorsListBox.Invalidate;
end;

procedure TFormEditorOptionsFrame.ColorsListBoxSelectionChange(Sender: TObject; User: boolean);
begin
  if not (FLoaded and User) then
    Exit;
  ColorBox.Selected := ColorsListBox.Selected;
end;

procedure TFormEditorOptionsFrame.CreateCompFocusNameCheckBoxChange(Sender: TObject);
begin
  SwitchToFavoritesOITabCheckBox.Enabled := CreateCompFocusNameCheckBox.Checked;
end;

class function TFormEditorOptionsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
  Result := TEnvironmentOptions;
end;

initialization
  RegisterIDEOptionsEditor(GroupEnvironment, TFormEditorOptionsFrame, EnvOptionsFormEd);
end.

