unit U_GuideFileList;

interface

uses
  Windows, U_LNG, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, IdGlobal,
  Dialogs, ExtCtrls, RzPanel, RzButton, StdCtrls, RzEdit, Mask,

  U_BaseCommon, U_BaseConstants, kbmMemTable, siComp, siLngLnk, pFIBDataSet,
  Buttons, U_ProtectionCommon, XPMenu, ComCtrls, ToolWin, DB, cxStyles,
  cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit,
  cxDBData, cxMemo, cxCheckBox, cxCurrencyEdit, cxColorComboBox,
  cxSpinEdit, cxTextEdit, cxGridLevel, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, cxClasses, cxControls,
  cxGridCustomView, cxGrid, FIBQuery, pFIBQuery,

  U_SCSComponent, U_SCSLists, U_Common, ActnList, ImgList, ShellApi, ComObj, Clipbrd, OleCtrls, OleCtnrs,
  cxDBLookupComboBox;

Const
  wdPropertyTitle = $00000001;
  wdPropertySubject = $00000002;
  wdPropertyAuthor = $00000003;
  wdPropertyKeywords = $00000004;
  wdPropertyComments = $00000005;
  wdPropertyTemplate = $00000006;
  wdPropertyLastAuthor = $00000007;
  wdPropertyRevision = $00000008;
  wdPropertyAppName = $00000009;
  wdPropertyTimeLastPrinted = $0000000A;
  wdPropertyTimeCreated = $0000000B;
  wdPropertyTimeLastSaved = $0000000C;
  wdPropertyVBATotalEdit = $0000000D;
  wdPropertyPages = $0000000E;
  wdPropertyWords = $0000000F;
  wdPropertyCharacters = $00000010;
  wdPropertySecurity = $00000011;
  wdPropertyCategory = $00000012;
  wdPropertyFormat = $00000013;
  wdPropertyManager = $00000014;
  wdPropertyCompany = $00000015;
  wdPropertyBytes = $00000016;
  wdPropertyLines = $00000017;
  wdPropertyParas = $00000018;
  wdPropertySlides = $00000019;
  wdPropertyNotes = $0000001A;
  wdPropertyHiddenSlides = $0000001B;
  wdPropertyMMClips = $0000001C;
  wdPropertyHyperlinkBase = $0000001D;
  wdPropertyCharsWSpaces = $0000001E;

  wdDoNotSaveChanges = 0;
  wdDialogFilePrint=88;

  wdPageBreak = $00000007;

type
  TF_GuideFileList = class(TForm)
    gbOkCancel: TRzGroupBox;
    btClose: TRzBitBtn;
    lng_Forms: TsiLangLinked;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    XPMenu: TXPMenu;
    mtFiles: TkbmMemTable;
    dsrcFiles: TDataSource;
    Grid_Files: TcxGrid;
    GT_Files: TcxGridDBTableView;
    GT_FilesName: TcxGridDBColumn;
    GT_FilesDescription: TcxGridDBColumn;
    GL_Files: TcxGridLevel;
    ilToolBar: TImageList;
    ActionList: TActionList;
    Act_Print: TAction;
    Act_PrintAll: TAction;
    PrinterSetupDialog1: TPrinterSetupDialog;
    Act_SaveToFile: TAction;
    ToolButton4: TToolButton;
    Act_SaveAllToFile: TAction;
    meLog: TMemo;
    GT_FilesFileExt: TcxGridDBColumn;
    procedure gbOkCancelResize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Act_PrintExecute(Sender: TObject);
    procedure Act_PrintAllExecute(Sender: TObject);
    procedure Act_SaveToFileExecute(Sender: TObject);
    procedure Act_SaveAllToFileExecute(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    GForm: TForm;
    FObjectID: Integer;

    FFileContent: TMemoryStream;
    FFileContentPacked: Boolean;
    FFileExists: Boolean;

    FType: Integer;

    // Для каких расширений выводили сообщения
    FFileExtsWithMsg: TStringList;

    procedure LoadFromFilesID(AFilesID: TIntList);

    procedure LoadFromComponents(AComponents: TSCSComponents; aNetGuidList: TStringList = nil);
    function PrintDoc(const AFileName, AFilePath: String; AStream: TMemoryStream=nil; AFileExt: String=''): Boolean;
    function PrintDocOO(const AFilePath: String): Boolean;
    procedure PrintFromID(AID: Integer);
    procedure PrintAllPositions;
    procedure PrintCurrPosition(AIsPrintingAll: Boolean);
    procedure SaveCurrPositionToFile(const AFileName: String);
    procedure SetControls;
    procedure SetParamsToDialog(ADialog: TOpenDialog; const AFileExt: String);
  public
    NewID: Integer;

    constructor Create(AOwner: TComponent; AForm: TForm);
    destructor Destroy; override;

    function Execute(AFType: Integer; AComponList: TSCSComponents;  NetTypeGuidList: TStringList = nil): Boolean;
  end;

  function CreateFGuideFileList: TForm;

var
  F_GuideFileList: TF_GuideFileList;

implementation
Uses U_Main, Unit_DM_SCS;
{$R *.dfm}

{ TF_MakeEditGuideFile }

constructor TF_GuideFileList.Create(AOwner: TComponent; AForm: TForm);
begin
  GForm := AForm;
  inherited Create(AOwner);
end;

destructor TF_GuideFileList.Destroy;
begin

  inherited;
end;

//Tolik
// function TF_GuideFileList.Execute(AFType: Integer; AComponList: TSCSComponents): Boolean;
function TF_GuideFileList.Execute(AFType: Integer; AComponList: TSCSComponents;  NetTypeGuidList: TStringList = nil): Boolean;
begin
  Result := false;
  FType := AFType;

  try
    SetControls;
    if TList(NetTypeGuidList) = nil then
      LoadFromComponents(AComponList)
    else
      LoadFromComponents(AComponList, NetTypeGuidList);

    Act_PrintAll.Enabled := mtFiles.RecordCount > 0;
    Act_SaveAllToFile.Enabled := mtFiles.RecordCount > 0;

    gbOkCancelResize(gbOkCancel);
    if ShowModal = mrOk then
    begin
      Result := true;
    end;
  except
    on E: Exception do AddExceptionToLogExt(ClassName, MethodName(@TF_GuideFileList.Execute), E.Message);
  end;
end;

procedure TF_GuideFileList.gbOkCancelResize(Sender: TObject);
begin
  SetMiddleControlChilds(TControl(Sender), TControl(Self));
end;

procedure TF_GuideFileList.LoadFromFilesID(AFilesID: TIntList);
var
  QSelect: TpFIBQuery;
  i: Integer;
begin
  mtFiles.Active := false;
  mtFiles.Active := true;
  mtFiles.DisableControls;
  try
    if AFilesID.Count > 0 then
    begin
      QSelect := TF_Main(GForm).FNormBase.DM.Query_Select;
      SetSQLToFIBQuery(QSelect, GetSQLByParams(qtSelect, tnFiles, GetSQLOpeatorIN(fnID, '', AFilesID), nil, fnAll), false);
      QSelect.ExecQuery;
      LoadMTFromFIBQuery(mtFiles, QSelect);
      QSelect.Close;
    end;
  finally
    mtFiles.SortOn(fnFileName, []);
    mtFiles.EnableControls;
  end;
end;

procedure TF_GuideFileList.LoadFromComponents(AComponents: TSCSComponents; aNetGuidList: TStringList = nil);
var
  ComponsGUIDList: TStringList;
  FileIDList: TIntList;
  FileID: Integer;
  i: Integer;
  SCSCompon: TSCSComponent;

  QSelect: TpFIBQuery;
begin
  ComponsGUIDList := TStringList.Create;
  ComponsGUIDList.Sorted := true;
  FileIDList := TIntList.Create;

  QSelect := TF_Main(GForm).FNormBase.DM.Query_Select;
  // Скрипт получения ID файла ищ компонента
  SetSQLToFIBQuery(QSelect, GetSQLByParams(qtSelect, tnComponent, fnGUID+' = :'+fnGuid, nil, fnIDCompSpecification), false);

  // отбираем GUID компонентов, и ID файлов
  for i := 0 to AComponents.Count - 1 do
  begin
    SCSCompon := AComponents[i];
    if ((aNetGuidList = nil) or ((aNetGuidList <> nil) and (aNetGuidList.Indexof(SCScompon.GuidNetType) <> -1))) then
    begin
      if ComponsGUIDList.IndexOf(SCSCompon.GuidNB) = -1 then
      begin
        ComponsGUIDList.Add(SCSCompon.GuidNB);

        QSelect.Close;
        QSelect.Params[0].AsString := SCSCompon.GuidNB;
        QSelect.ExecQuery;
        if QSelect.RecordCount > 0 then
        begin
          FileID := QSelect.Fields[0].AsInteger;
          if (FileID <> 0) and (FileIDList.IndexOf(FileID) = -1) then
            FileIDList.Add(FileID);
        end;
      end;
    end;
  end;

  // Отбираем файлы для компонентов
  LoadFromFilesID(FileIDList);


  FileIDList.Free;
  ComponsGUIDList.Free;
end;

function TF_GuideFileList.PrintDoc(const AFileName, AFilePath: String; AStream: TMemoryStream=nil; AFileExt: String=''): Boolean;
var
  FileName: String;
  MsWord: OLEVariant;
  Doc: OLEVariant;
  SaveChanges : OLEVariant;
  prntDlg: OLEVariant;
  Created: Boolean;

  OleCntnr: TOleContainer;
  v: Variant;
  //v: OLEVariant;
  OLEStream: TMemoryStream;
  FormHidden: TForm;

  FileExt: String;
  FilePath: String;
  CanVerb: Boolean;
  TmpDir: String;
  DelTmpFile: Boolean;
begin
  Result := false;
  try
    FilePath := '';
    FileExt := AnsiLowerCase(AFileExt);
    TmpDir := '';
    DelTmpFile := false;
    // Если ворд не установлен, то печатаем поток через временные файлы
    if (FileExt <> '.doc') or (Not IsWordInstalled) then
    begin
      FilePath := AFilePath;
      if (FilePath = '') and (AStream <> nil) then
      begin
        //FilePath := GetPathToSCSTmpDir+'\file'+AFileExt;
        TmpDir := CreateUniqueDirInSCSTmp;
        FilePath := TmpDir +'\'+AFileName + AFileExt;
        FilePath := GetNoExistsFileNameForCopy(FilePath);

        AStream.Position := 0;
        AStream.SaveToFile(FilePath);

        DelTmpFile := true;
      end;
    end;

    meLog.Lines.Clear;
    //meLog.Lines.Add('File eXt '+AFileExt);

    //if IsWordInstalled then
    begin
      Created := false;
      if FilePath <> '' then
      begin
        // Печать Word через MS Office
        if IsWordInstalled and (FileExt = '.doc') then
        begin
          MsWord := CreateOleObject('Word.Application');  // meLog.Lines.Add('MsWord := CreateOleObject');
          try
            //MsWord.Documents.Add(AFilePath, EmptyParam);

            MsWord.Documents.Open(FilePath); // meLog.Lines.Add('MsWord.Documents.Open(FilePath)');

            //Doc := MsWord.Documents.Add;
            //Doc.Range.InsertFile(FilePath);

            // Докидываем другой файл
            //Doc.Range.InsertBreak(wdPageBreak);
            //Doc.Bookmarks.Item('\EndOfDoc').Range.InsertFile('C:\Projects\Клиенты\Spain\Compon specification\DOCUMENTOS DE ESPECIFICACION\Cu01 STAR Cat6 Sin Apantallar\03_test Cu01_Patchpanels_Cat.6_SinApantallar.doc');
            //Doc.BuiltInDocumentProperties[wdPropertyTitle].Value := 'Teeest...';

            MsWord.Options.PrintBackground := False; // meLog.Lines.Add('MsWord.Options.PrintBackground := False');

            MsWord.PrintOut; // meLog.Lines.Add('MsWord.PrintOut');
            Result := true;

            // Диалог работает, если использовать Doc := MsWord.Documents.Add; Doc.Range.InsertFile(FilePath);
            //prntDlg := MsWord.Dialogs.item(wdDialogFilePrint);
            //prntDlg.Show;

            MsWord.Options.PrintBackground := True; // meLog.Lines.Add('MsWord.Options.PrintBackground := True');
          finally
            if not VarIsEmpty(MsWord) then
            begin
              SaveChanges := wdDoNotSaveChanges;
              MsWord.Quit(SaveChanges);
              MsWord := Unassigned;
            end;
          end;
        end
        // Печать через ОО Writer
        else if (FileExt = '.doc') or (FileExt = '.odt') then
        begin
          if PrintDocOO(FilePath) then
            Result := true;
        end;
      end
      else if AStream <> nil then
      begin
        FormHidden := TForm.Create(Application);
        FormHidden.Position := poDesktopCenter;
        FormHidden.AlphaBlendValue := 0;
        FormHidden.AlphaBlend := true;
        FormHidden.Show; // meLog.Lines.Add('FormHidden.Show');

        OleCntnr := TOleContainer.Create(nil);
        OleCntnr.Parent := FormHidden;
        OleCntnr.Align := alClient;
        OLEStream := nil;
        CanVerb := false;
        if IsWordInstalled then
        begin
          OLEStream := TMemoryStream.Create;
          AStream.Position := 0;
          StreamToOLEStream(AStream, OLEStream); // meLog.Lines.Add('StreamToOLEStream(AStream, OLEStream)');
          OleCntnr.LoadFromStream(OLEStream); // meLog.Lines.Add('OleCntnr.LoadFromStream(OLEStream)');
          CanVerb := true;
        end
        else
        if AFileExt <> '' then
        begin
          FilePath := GetPathToSCSTmpDir+'\file'+AFileExt;
          FilePath := GetNoExistsFileNameForCopy(FilePath);

          AStream.Position := 0;
          AStream.SaveToFile(FilePath);
          OleCntnr.CreateObjectFromFile(FilePath, false); // meLog.Lines.Add('OleCntnr.CreateObjectFromFile');

          CanVerb := true;
        end;

        if CanVerb then
        begin
          OleCntnr.DoVerb(ovShow);
          meLog.Lines.Add('OleCntnr.DoVerb(ovShow)');

          if (AFileExt = '') or (AFileExt = '.doc') then
          begin
            v := OleCntnr.OleObject.Application.WordBasic; //meLog.Lines.Add('v := OleCntnr.OleObject.Application.WordBasic');
            V.ToolsOptionsPrint(Background := 0); // meLog.Lines.Add('V.ToolsOptionsPrint(Background := 0)');
            V.FilePrint;  // meLog.Lines.Add('V.FilePrint');
            Result := true;

            V.ToolsOptionsPrint(Background := 1); // meLog.Lines.Add('V.ToolsOptionsPrint(Background := 1)');
          end
          else if AFileExt = '.odt' then
          begin
            //v := OleCntnr.OleObject; // meLog.Lines.Add('v := OleCntnr.OleObject');
            //v.Print;  // meLog.Lines.Add('v.Print');
            // Result := true;
          end;
        end;
        OleCntnr.Free;
        FormHidden.Free;

        if OLEStream <> nil then
          OLEStream.Free;
      end;
      //ShellExecute(Handle, 'print', PChar(FilePath), nil, nil, SW_HIDE);
    end;

    if DelTmpFile then
    begin
      DeleteFile(FilePath);
      RemoveDir(TmpDir);
    end;
  except
    on E: Exception do AddExceptionToLogEx('TF_GuideFileList.PrintDoc', E.Message);
  end;
end;

function TF_GuideFileList.PrintDocOO(const AFilePath: String): Boolean;
//const
//  Bounds:array[1..2] of integer = (0,0);
var
  OO: Variant;
  Document: Variant;
  VariantArray: Variant;
  Desktop: Variant;
  Created: Boolean;
  FileUrl: String;

  function OOMakePropertyValue(PropertyName, PropertyValue:Variant):variant;
  var
    Structure: variant;
  begin
    Structure := OO.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
    Structure.Name := PropertyName;
    Structure.Value := PropertyValue;
    Result := Structure;
  end;

begin
  Result := false;
  if IsOOInstalled then
  begin
    OO := CreateOleObject('com.sun.star.ServiceManager');
    try
      Desktop := OO.CreateInstance('com.sun.star.frame.Desktop');
      //VariantArray := VarArrayCreate([0, 1], varVariant);
      //VariantArray[0] := OOMakePropertyValue('FilterName', 'MS Word 97');
      //VariantArray[1] := OOMakePropertyValue('Hidden', True);

      VariantArray := VarArrayCreate([0, 1], varVariant);
      VariantArray[0] := OOMakePropertyValue('Hidden', True);

      //FileUrl := ReplaceTextInStr('\', '/', ShortToLongFileName(AFilePath), false, nil);
      //FileUrl := 'file:///'+ ReplaceTextInStr(' ', '%20', FileUrl, false, nil);
      FileUrl := 'file:///'+ ReplaceTextInStr('\', '/', AFilePath, false, nil);
      Document := Desktop.LoadComponentFromURL(FileUrl, '_blank', 0, VariantArray);

      //Document := OO.OpenDocument(AFilePath,[oomReadOnly],ommNever);
      Created := not (VarIsEmpty(Document) or VarIsNull(Document));
      if Created then
      begin
        //VariantArray := VarArrayCreate(Bounds, varVariant);
        VariantArray := VarArrayCreate([0, 1], varVariant);
        VariantArray[0]:= OOMakePropertyValue('CopyCount', 1);
        VariantArray[1]:= OOMakePropertyValue('Wait', true);
        Document.print(VariantArray);

        Result := true;
        Document.Close(True);
      end;
      Document := Unassigned;
      Desktop := Unassigned;
    finally
      OO := Unassigned;
    end;
  end;
end;

procedure TF_GuideFileList.PrintFromID(AID: Integer);
var
  BookMarkStr: String;
begin
  BookMarkStr := mtFiles.Bookmark;
  mtFiles.DisableControls;
  try
    if mtFiles.Locate(fnID, AID, []) then
    begin
      PrintCurrPosition(false);
    end;
  finally
    mtFiles.EnableControls;
    mtFiles.Bookmark := BookMarkStr;
  end;
end;

procedure TF_GuideFileList.PrintAllPositions;
var
  BookMarkStr: String;
begin
  FFileExtsWithMsg.Clear;

  BookMarkStr := mtFiles.Bookmark;
  mtFiles.DisableControls;
  BeginProgress('', mtFiles.RecordCount);
  try
    mtFiles.First;
    while Not mtFiles.Eof do
    begin
      PrintCurrPosition(true);
      mtFiles.Next;

      StepProgress;
      Application.ProcessMessages;
    end;
  finally
    EndProgress;
    mtFiles.EnableControls;
    mtFiles.Bookmark := BookMarkStr;
  end;
end;

procedure TF_GuideFileList.PrintCurrPosition(AIsPrintingAll: Boolean);
var
  FileExt: String;
  FileName: String;
  FilePath: String;
  Stream: TMemoryStream;
  UnpackedStream: TMemoryStream;
  Msg: String;
begin
  if mtFiles.RecNo > 0 then
  begin
    FileName := mtFiles.FieldByName(fnFileName).AsString;
    FileExt := mtFiles.FieldByName(fnFileExt).AsString;

    // Если была неудачная попытка отпечатать этот формат, то не тратим зря время
    if FFileExtsWithMsg.IndexOf(FileExt) = -1 then
    begin
      FilePath := GetPathToSCSTmpDir+'\file'+FileExt;
      FilePath := GetNoExistsFileNameForCopy(FilePath);

      Stream := TMemoryStream.Create;
      UnpackedStream := TMemoryStream.Create;
      TBLobField(mtFiles.FieldByName(fnContent)).SaveToStream(Stream);

      UnPakStream(Stream, UnpackedStream);

      //if Not IsWordInstalled then
  //    begin
  //      UnPackedStream.SaveToFile(FilePath);
  //      UnPackedStream.Position := 0;
  //      PrintDoc(FileName, FilePath);
  //      DeleteFile(FilePath);
  //
  //      UnPackedStream.Clear;
  //      //UnPackedStream.LoadFromFile('C:\Projects\Клиенты\Spain\Compon specification\DOCUMENTOS DE ESPECIFICACION\Cu01 STAR Cat6 Sin Apantallar\03_test Cu01_Patchpanels_Cat.6_SinApantallar.doc');
  //    end
  //    else
  //      PrintDoc(FileName, '', UnPackedStream);

      if Not PrintDoc(FileName, '', UnPackedStream, FileExt) then
      begin
        // Если не смогли отпечатать то товорим
        if FFileExtsWithMsg.IndexOf(FileExt) = -1 then
        begin
          if GIsProgress then
            PauseProgress(true);
          try
            Msg := cGuideFileList_Msg3_1 + FileName+FileExt;
            if AIsPrintingAll then
              Msg := Msg + snNextRow + cGuideFileList_Msg3_2;
            MessageInfo(Msg);
          finally
            if GIsProgress then
              PauseProgress(false);
          end;
          FFileExtsWithMsg.Add(FileExt);
        end;
      end;

      UnpackedStream.Free;
      Stream.Free;
    end;
  end;
end;

procedure TF_GuideFileList.SaveCurrPositionToFile(const AFileName: String);
var
  FileExt: String;
  FileName: String;
  FilePath: String;
  Stream: TMemoryStream;
  UnpackedStream: TMemoryStream;
begin
  if mtFiles.RecNo > 0 then
  begin
    if FileExists(AFileName) then
    begin
      if GIsProgress then
        PauseProgress(true);
      try
        if MessageQuastYN(AFileName+' '+cNowExists+'. '+cQuastReplaceIt) = IDYES then
          DeleteFile(AFileName)
        else
          Exit; ///// EXIT /////
      finally
        if GIsProgress then
          PauseProgress(false);
      end;
    end;

    Stream := TMemoryStream.Create;
    UnpackedStream := TMemoryStream.Create;
    TBLobField(mtFiles.FieldByName(fnContent)).SaveToStream(Stream);

    UnPakStream(Stream, UnpackedStream);
    UnPackedStream.Position := 0;
    UnPackedStream.SaveToFile(AFileName);

    UnpackedStream.Free;
    Stream.Free;
  end;
end;

procedure TF_GuideFileList.SetControls;
begin
  case FType of
    gftCompSpecification:
      Caption := cGuideFileList_Msg1_1;
    else
      Caption := '';
  end;
end;

procedure TF_GuideFileList.SetParamsToDialog(ADialog: TOpenDialog; const AFileExt: String);
begin
  case FType of
    gftCompSpecification:
      begin
        //ADialog.DefaultExt := '*.'+enDoc;
        //ADialog.Filter := GetDialogFilter(cexdDoc, enDoc);
        ADialog.DefaultExt := '*'+AFileExt;
        ADialog.Filter := GetDialogFilter(GetExtensionDescription(AFileExt), AFileExt);
      end;
  end;
  ADialog.InitialDir := '';
  ADialog.FileName := '';
  ADialog.Options := ADialog.Options - [ofNoChangeDir];
end;

function CreateFGuideFileList: TForm;
begin
  Result := nil;
  if F_GuideFileList = nil then
    F_GuideFileList := TF_GuideFileList.Create(Application, F_NormBase);
  Result := F_GuideFileList;
end;

procedure TF_GuideFileList.FormCreate(Sender: TObject);
begin
  ActionCaptionsToHints(ActionList);

  mtFiles.FieldDefs.Add(fnID, ftInteger);
  mtFiles.FieldDefs.Add(fnFileName, ftString, 255);
  mtFiles.FieldDefs.Add(fnFileExt, ftString, 255);
  mtFiles.FieldDefs.Add(fnDescription, ftBlob, 255);
  mtFiles.FieldDefs.Add(fnContent, ftBlob);
  mtFiles.FieldDefs.Add(fnFType, ftInteger);

  FFileExtsWithMsg := TStringList.Create;
end;

procedure TF_GuideFileList.Act_PrintExecute(Sender: TObject);
begin
  //
  if mtFiles.RecNo > 0 then
  begin
    //PrintFromID(mtFiles.FieldByName(fnID).AsInteger);
    BeginProgress;
    try
      FFileExtsWithMsg.Clear;
      PrintCurrPosition(false);
    finally
      EndProgress;
    end;
  end;
end;

procedure TF_GuideFileList.Act_PrintAllExecute(Sender: TObject);
begin
  if MessageQuastYN(cGuideFileList_Msg2_1) = IDYES then
  begin
    PrintAllPositions;
  end;
end;

procedure TF_GuideFileList.Act_SaveToFileExecute(Sender: TObject);
var
  Dialog: TSaveDialog;
  FileExt: String;
  FileName: String;
begin
  if mtFiles.RecNo > 0 then
  begin
    FileName := mtFiles.FieldByName(fnFileName).AsString;
    FileExt := mtFiles.FieldByName(fnFileExt).AsString;

    Dialog := TSaveDialog.Create(Self);
    Dialog.Title := cSavingToFile;
    SetParamsToDialog(Dialog, FileExt);
    Dialog.FileName := FileName + FileExt;
    Dialog.Options := Dialog.Options + [ofOverwritePrompt];

    if Dialog.Execute then
    begin
      Application.ProcessMessages;
      if FileExists(Dialog.FileName) then
        DeleteFile(Dialog.FileName);
      SaveCurrPositionToFile(Dialog.FileName);
    end;
    FreeAndNil(Dialog);
  end;
end;

procedure TF_GuideFileList.Act_SaveAllToFileExecute(Sender: TObject);
var
  DirName: String;
  BookMarkStr: String;

  FileExt: String;
  FileName: String;
begin
  DirName := BrowseDialog(cBaseOptions_Msg5, '');
  if DirName <> '' then
  begin
    BookMarkStr := mtFiles.Bookmark;
    mtFiles.DisableControls;
    BeginProgress('', mtFiles.RecordCount);
    try
      mtFiles.First;
      while Not mtFiles.Eof do
      begin
        FileName := mtFiles.FieldByName(fnFileName).AsString;
        FileExt := mtFiles.FieldByName(fnFileExt).AsString;
        SaveCurrPositionToFile(DirName +'\'+ FileName+FileExt);

        mtFiles.Next;
        StepProgress;
        Application.ProcessMessages;
      end;
      if mtFiles.RecNo > 0 then
        ShellExecute(Handle, nil, PChar(DirName), nil, nil, SW_SHOW);
    finally
      EndProgress;
      mtFiles.EnableControls;
      mtFiles.Bookmark := BookMarkStr;
    end;
  end;
end;

procedure TF_GuideFileList.FormDestroy(Sender: TObject);
begin
  FFileExtsWithMsg.Free;
end;

end.
