{  $Id$  }
{
 /***************************************************************************
                          pkgvirtualuniteditor.pas
                          ------------------------


 ***************************************************************************/

 ***************************************************************************
 *                                                                         *
 *   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.   *
 *                                                                         *
 ***************************************************************************

  Author: Mattias Gaertner

  Abstract:
    TEditVirtualUnitDialog is a dialog to edit the properties of a virtual unit.
}
unit PkgVirtualUnitEditor;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,
  // LCL
  Forms, Controls, Dialogs,
  // LazUtils
  FileUtil, LazFileUtils,
  // IdeIntf
  PackageDependencyIntf,
  // IDE
  PackageDefs, LazarusIDEStrConsts;

function ShowEditVirtualPackageDialog(PkgFile: TPkgFile): TModalResult;

implementation

type
  TDummyForClose = class
  public
    PkgFile: TPkgFile;
    procedure CloseEvent(Sender: TObject; const {%H-}AValues: array of string;
      var ACanClose: boolean);
  end;

function ShowEditVirtualPackageDialog(PkgFile: TPkgFile): TModalResult;
var
  Str: array of string;
  Dummy: TDummyForClose;
begin
  Result:= mrCancel;
  if not Assigned(PkgFile) then exit;

  SetLength(Str{%H-}, 2);
  Str[0]:= PkgFile.Filename;
  Str[1]:= PkgFile.Unit_Name;

  Dummy:= TDummyForClose.Create;
  try
    Dummy.PkgFile:= PkgFile;
    if not InputQuery(lisPVUEditVirtualUnit,
      [lisPEFilename, lisPEUnitname], Str, @Dummy.CloseEvent) then exit;
  finally
    FreeAndNil(Dummy);
  end;

  if (PkgFile.Filename=Str[0]) and
     (PkgFile.Unit_name=Str[1]) then exit;

  PkgFile.Filename:= Str[0];
  PkgFile.Unit_name:= Str[1];
  if Assigned(PkgFile.LazPackage) then
    PkgFile.LazPackage.Modified:= true;
  Result:= mrOk;
end;

{ TDummyForClose }

procedure TDummyForClose.CloseEvent(Sender: TObject; const AValues: array of string;
  var ACanClose: boolean);
var
  NewFilename: String;
  NewUnitName: String;
  NewFilenameOnly: String;
  LazPackage: TLazPackage;
  ConflictUnit: TPkgFile;
begin
  ACanClose:=false;
  NewFilename:=AValues[0];
  NewUnitName:=AValues[1];

  if not FilenameHasPascalExt(NewFilename) then begin
    MessageDlg(lisPEInvalidUnitFilename,
      lisPVUAPascalUnitMustHaveTheExtensionPpOrPas,
      mtError,[mbCancel],0);
    exit;
  end;
  NewFilenameOnly:=ExtractFilenameOnly(NewFilename);
  if CompareText(NewUnitName,NewFilenameOnly)<>0 then begin
    MessageDlg(lisPEInvalidUnitname,
      Format(lisPVUUnitnameAndFilenameDoNotMatchExampleUnit1PasAndUni, [LineEnding]),
      mtError,[mbCancel],0);
    exit;
  end;
  if (NewUnitName='') or (not IsValidUnitName(NewUnitName)) then begin
    MessageDlg(lisPEInvalidUnitname,
      lisPVUTheUnitnameIsNotAValidPascalIdentifier,
      mtError,[mbCancel],0);
    exit;
  end;
  LazPackage:=PkgFile.LazPackage;
  if LazPackage<>nil then begin
    ConflictUnit:=LazPackage.FindUnit(NewUnitName,true,PkgFile);
    if ConflictUnit<>nil then begin
      MessageDlg(lisPEConflictFound,
        Format(lisPVUThereIsAlreadyAnUnitWithThisNameFile, [LineEnding,
          ConflictUnit.Filename]),
        mtError,[mbCancel],0);
      exit;
    end;
  end;

  ACanClose:=true;
end;

end.