{
  Author: Jens Arm

 ***************************************************************************
 *                                                                         *
 *   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 UnitInfoDlg;

{$mode objfpc}{$H+}

interface

uses
  // LCL + FCL
  SysUtils, Controls, StdCtrls, Forms, Buttons, ComCtrls,
  // CodeTools
  CodeToolsDefPreview, CodeToolManager,
  // LazUtils
  LazFileUtils, LazLoggerBase,
  // IDE
  LazarusIDEStrConsts;

type

  { TUnitInfoDialog }

  TUnitInfoDialog = class(TForm)
    GotoIncludeDirectiveButton: TButton;
    CodeToolsDefsButton: TButton;
    ListValues: TListView;
    OkButton: TBitBtn;
    ClearIncludedBy: TButton;
    UnitPathMemo: TMemo;
    IncludePathMemo: TMemo;
    SrcPathMemo: TMemo;
    Notebook: TPageControl;
    GeneralPage: TTabSheet;
    UnitPathsPage: TTabSheet;
    IncludePathsPage: TTabSheet;
    CompleteUnitPathsPage: TTabSheet;
    PathsGroupBox: TGroupBox;
    procedure CodeToolsDefsButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure clearIncludedByClick(Sender: TObject);
  private
    FFilePath: string;
    function getIncludedBy: string;
  end;

function ShowUnitInfoDlg(const AnUnitName, AType: string;
  IsPartOfProject: boolean; SizeInBytes, UnitSizeWithIncludeFiles, UnitSizeParsed,
  LineCount, UnitLineCountWithIncludes, UnitLineCountParsed: integer;
  const FilePath: string; const IncludedBy: string; out ClearIncludedBy: boolean;
  const UnitPath, IncludePath, SrcPath: string): TModalResult;

implementation

{$R *.lfm}

function ShowUnitInfoDlg(const AnUnitName, AType: string;
  IsPartOfProject: boolean; SizeInBytes, UnitSizeWithIncludeFiles,
  UnitSizeParsed, LineCount, UnitLineCountWithIncludes,
  UnitLineCountParsed: integer; const FilePath: string;
  const IncludedBy: string; out ClearIncludedBy: boolean; const UnitPath,
  IncludePath, SrcPath: string): TModalResult;
var Dlg: TUnitInfoDialog;
  s: String;
begin
  ClearIncludedBy:=false;

  Dlg:=TUnitInfoDialog.Create(nil);
  with Dlg do begin
    Caption:=Format(lisInformationAboutUnit, [AnUnitName]);

    FFilePath:=FilePath;

    ListValues.Items[0].SubItems[0]:=AnUnitName;
    ListValues.Items[1].SubItems[0]:=AType;

    if IsPartOfProject then s:=lisUIDyes else s:=lisUIDno;
    ListValues.Items[2].SubItems[0]:=s;

    s:=Format(lisUIDbytes, [IntToStr(SizeInBytes)]);
    if UnitSizeWithIncludeFiles<>SizeInBytes then
      s:=s+lisWithIncludes2+IntToStr(UnitSizeWithIncludeFiles);
    if UnitSizeParsed<>UnitSizeWithIncludeFiles then
      s:=s+lisParsed+IntToStr(UnitSizeParsed);
    ListValues.Items[3].SubItems[0]:=s;

    s:=IntToStr(LineCount);
    if UnitLineCountWithIncludes<>LineCount then
      s:=s+lisWithIncludes2+IntToStr(UnitLineCountWithIncludes);
    if UnitLineCountParsed<>LineCount then
      s:=s+lisParsed+IntToStr(UnitLineCountParsed);
    ListValues.Items[4].SubItems[0]:=s;

    ListValues.Items[5].SubItems[0]:=FilePath;
    ListValues.Items[6].SubItems[0]:=IncludedBy;

    UnitPathMemo.Lines.Delimiter := ';';
    UnitPathMemo.Lines.StrictDelimiter := true;
    UnitPathMemo.Lines.DelimitedText := MinimizeSearchPath(UnitPath);

    IncludePathMemo.Lines.Delimiter := ';';
    IncludePathMemo.Lines.StrictDelimiter := true;
    IncludePathMemo.Lines.DelimitedText := MinimizeSearchPath(IncludePath);

    SrcPathMemo.Lines.Delimiter := ';';
    SrcPathMemo.Lines.StrictDelimiter := true;
    SrcPathMemo.Lines.DelimitedText := MinimizeSearchPath(SrcPath);

    GotoIncludeDirectiveButton.Visible:=IncludedBy<>'';
  end;

  Result:=Dlg.ShowModal;
  ClearIncludedBy:=(Result in [mrOk,mrYes]) and (IncludedBy<>'')
                   and (Dlg.getIncludedBy='');
  Dlg.Free;
end;

{ TUnitInfoDialog }

procedure TUnitInfoDialog.CodeToolsDefsButtonClick(Sender: TObject);
begin
  DebugLn(['TUnitInfoDialog.CodeToolsDefsButtonClick FFilePath=',FFilePath]);
  ShowCodeToolsDefinesValuesDialog(CodeToolBoss.DefineTree, ExtractFilePath(FFilePath));
end;

procedure TUnitInfoDialog.FormCreate(Sender: TObject);
begin
  Notebook.Page[0].Caption := lisGeneral;
  Notebook.Page[1].Caption := lisUnitPaths;
  Notebook.Page[2].Caption := lisIncludePaths;
  Notebook.Page[3].Caption := lisSourcePaths;
  Notebook.PageIndex := 0;

  with ListValues do
  begin
    with Items.Add do begin Caption:= lisUIDName; SubItems.Add(''); end;
    with Items.Add do begin Caption:= lisUIDType; SubItems.Add(''); end;
    with Items.Add do begin Caption:= lisUIDinProject; SubItems.Add(''); end;
    with Items.Add do begin Caption:= lisUIDSize; SubItems.Add(''); end;
    with Items.Add do begin Caption:= lisUIDLines; SubItems.Add(''); end;
    with Items.Add do begin Caption:= lisToFPCPath; SubItems.Add(''); end;
    with Items.Add do begin Caption:= lisUIDIncludedBy; SubItems.Add(''); end;
  end;

  ClearIncludedBy.Caption:=lisUIClearIncludedByReference;
  CodeToolsDefsButton.Caption:=lisUIShowCodeToolsValues;
  GotoIncludeDirectiveButton.Caption:=lisMenuGotoIncludeDirective;
end;

procedure TUnitInfoDialog.clearIncludedByClick(Sender: TObject);
begin
  ListValues.Items[6].SubItems[0]:='';
end;

function TUnitInfoDialog.getIncludedBy: string;
begin
  Result:=ListValues.Items[6].SubItems[0];
end;

end.
