unit FileOverwriteConfirm;

{
[FileOverwriteConfirm] [1.0]
Delphi 2005
December 2005

LICENSE

The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
"http://www.mozilla.org/MPL/"

Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
the specific language governing rights and limitations under the License.

The Original Code is "[FileOverwriteConfirm.pas]".

The Initial Developer of the Original Code is Martin Holmes (Victoria,
BC, Canada, "http://www.mholmes.com/"). Copyright (C) 2005 Martin Holmes 
and the University of Victoria Computing and Media Centre. The code was 
co-developed for university and personal projects, and rights are shared
by Martin Holmes and the University of Victoria. All Rights Reserved.
}

{
 This unit written by Martin Holmes, November 2005.

 The purpose of this unit is to provide a flexible interface for informing
 users when an operation will overwrite multiple files, and allowing them
 to confirm the overwrite of each file individually. It would be used when
 (for example) saving a collection of interrelated files (XML, XSLT, CSS...)
 where the results of a previous save might have been customized by the user,
 so he/she would not want to overwrite some customized files.


 Dependencies:
  TntUnicodeControls (Troy Wolbrink)
  FormState
}


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TntForms, FormState, StdCtrls, Buttons, TntButtons, CheckLst,
  TntCheckLst, TntStdCtrls, TntClasses, TntSysUtils;

type
  TufrmFileOverwriteConfirm = class(TTntForm)
    ulbExplanation: TTntLabel;
    uclbFIles: TTntCheckListBox;
    ubnOK: TTntBitBtn;
    ubnCancel: TTntBitBtn;
    procedure TntFormHide(Sender: TObject);
    procedure TntFormShow(Sender: TObject);
    procedure TntFormDestroy(Sender: TObject);
    procedure TntFormCreate(Sender: TObject);
  private
    { Private declarations }
    FFormStateSaver: TFormStateSaver;
    FFileList: TTntStringList;
  public
//This function initializes the list, checks for the existence of each of the
//files, and if there are files that will be overwritten, returns true.
//It also builds its checklist ready for showing by the calling function.
    function CheckForOverwrites(Files: TTntStringList): Boolean;
//This function would be called later to check whether the user OK'd the
//overwriting of a specific file
    function CanOverwrite(FName: WideString): Boolean;
    { Public declarations }
  end;

var
  ufrmFileOverwriteConfirm: TufrmFileOverwriteConfirm;

implementation

{$R *.dfm}

procedure TufrmFileOverwriteConfirm.TntFormCreate(Sender: TObject);
begin
  FFileList := TTntStringList.Create;

end;

procedure TufrmFileOverwriteConfirm.TntFormDestroy(Sender: TObject);
begin
  FreeAndNil(FFileList);
end;

function TufrmFileOverwriteConfirm.CheckForOverwrites(
  Files: TTntStringList): Boolean;
var
i: integer;
begin
  Result := False; //default
  if Files.Count > 0 then
    begin
      FFileList.Clear;
      uclbFiles.Clear;
      for i := 0 to Files.Count-1 do
        begin
          if WideFileExists(Files[i]) then
            begin
              FFileList.Add(Files[i]);
              uclbFiles.Items.Add(ExtractFileName(Files[i]));
              uclbFiles.Checked[uclbFiles.Items.Count-1] := True;
              Result := True;
            end;
        end;
    end;
end;

procedure TufrmFileOverwriteConfirm.TntFormShow(Sender: TObject);
begin
  FFormStateSaver := TFormStateSaver.Create(Self, True);
end;

function TufrmFileOverwriteConfirm.CanOverwrite(FName: WideString): Boolean;
var
ItemNum: integer;
begin
  Result := True; //Default -- allow overwriting if we know nothing about the file
  ItemNum :=  FFileList.IndexOf(FName);
  if ItemNum > -1 then
    if ItemNum < uclbFiles.Items.Count then
      Result := uclbFiles.Checked[ItemNum];
end;

procedure TufrmFileOverwriteConfirm.TntFormHide(Sender: TObject);
begin
  FreeAndNil(FFormStateSaver);
end;

end.
