unit MAIN;

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
  StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, StdActns,
  ActnList, ToolWin, ImgList, frxClass, frxDesgn, frxExportODF,
  frxExportTXT, frxExportMail, frxExportCSV, frxExportText, frxExportImage,
  frxExportRTF, frxExportXML, frxExportXLS, frxExportHTML, frxExportPDF,
  frxSDACComponents, frxODACComponents, frxIBDACComponents,
  frxDACComponents, frxMYDACComponents, frxVCLZip, frxFunction,
  frxAdvPicture, frxChart, frxCrypt, frxGZip, frxDCtrl, frxDMPExport,
  frxGradient, frxChBox, frxCross, frxRich, frxOLE, frxBarcode;

type
  TfrxReportList = class(TObject)
  private
    FReportList: TList;
    function GetReport(Index: Integer): TfrxReport;
    function GetCount: Integer;
  public
    constructor Create;
    destructor Destroy; override;
    procedure ClearList;
    procedure Delete(Index: Integer);
    function CreateNewReport: TfrxReport;
    function IndexOf(Report: TfrxReport): Integer;
    property Report [Index: Integer]: TfrxReport read GetReport;
    property Count: Integer read GetCount;
  end;

  TMainForm = class(TForm)
    StatusBar: TStatusBar;
    ActionList1: TActionList;
    FileNew1: TAction;
    FileSave1: TAction;
    FileExit1: TAction;
    WindowCascade1: TWindowCascade;
    WindowTileHorizontal1: TWindowTileHorizontal;
    WindowArrangeAll1: TWindowArrange;
    WindowMinimizeAll1: TWindowMinimizeAll;
    WindowTileVertical1: TWindowTileVertical;
    ToolBar2: TToolBar;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton9: TToolButton;
    ToolButton8: TToolButton;
    ToolButton10: TToolButton;
    ToolButton11: TToolButton;
    ImageList1: TImageList;
    ToolButton1: TToolButton;
    ToolButton5: TToolButton;
    PreviewReport: TAction;
    MainMenu1: TMainMenu;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxOLEObject1: TfrxOLEObject;
    frxRichObject1: TfrxRichObject;
    frxCrossObject1: TfrxCrossObject;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxGradientObject1: TfrxGradientObject;
    frxDotMatrixExport1: TfrxDotMatrixExport;
    frxDialogControls1: TfrxDialogControls;
    frxGZipCompressor1: TfrxGZipCompressor;
    frxCrypt1: TfrxCrypt;
    frxChartObject1: TfrxChartObject;
    frxAdvPictureObject1: TfrxAdvPictureObject;
    frxAddFunctionLibrary1: TfrxAddFunctionLibrary;
    frxVCLZipCompressor1: TfrxVCLZipCompressor;
    frxMYDACComponents1: TfrxMYDACComponents;
    frxIBDACComponents1: TfrxIBDACComponents;
    frxODACComponents1: TfrxODACComponents;
    frxSDACComponents1: TfrxSDACComponents;
    frxPDFExport1: TfrxPDFExport;
    frxHTMLExport1: TfrxHTMLExport;
    frxXLSExport1: TfrxXLSExport;
    frxXMLExport1: TfrxXMLExport;
    frxRTFExport1: TfrxRTFExport;
    frxBMPExport1: TfrxBMPExport;
    frxJPEGExport1: TfrxJPEGExport;
    frxTIFFExport1: TfrxTIFFExport;
    frxGIFExport1: TfrxGIFExport;
    frxSimpleTextExport1: TfrxSimpleTextExport;
    frxCSVExport1: TfrxCSVExport;
    frxMailExport1: TfrxMailExport;
    frxTXTExport1: TfrxTXTExport;
    frxODSExport1: TfrxODSExport;
    frxODTExport1: TfrxODTExport;
    procedure FileNew1Execute(Sender: TObject);
    procedure FileExit1Execute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure DestroyDesigner(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FileSave1Execute(Sender: TObject);
    procedure PreviewReportExecute(Sender: TObject);
  private
    { Private declarations }
    FReportList: TfrxReportList;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

{ TfrxReportList }

procedure TfrxReportList.ClearList;
begin
 while FReportList.Count > 0 do
 begin
  TfrxReport(FReportList[0]).Free;
  FReportList.Delete(0);
 end;
end;

constructor TfrxReportList.Create;
begin
  inherited;
  FReportList := TList.Create;
end;

function TfrxReportList.CreateNewReport: TfrxReport;
begin
  Result := TfrxReport.Create(nil);
  Result.CreateUniqueName;
  Result.PreviewOptions.MDIChild := True;
  Result.PreviewOptions.Modal := False;
  Result.EngineOptions.DestroyForms := False;
  FReportList.Add(Result);
end;

procedure TfrxReportList.Delete(Index: Integer);
begin
  if (Index < 0) or (Index >= FReportList.Count) then
    exit;
  TfrxReport(FReportList[Index]).Free;
  FReportList.Delete(Index);
end;

destructor TfrxReportList.Destroy;
begin
 ClearList;
 FReportList.Free;
 inherited;
end;

function TfrxReportList.GetCount: Integer;
begin
  Result := FReportList.Count;
end;

function TfrxReportList.GetReport(Index: Integer): TfrxReport;
begin
  if (Index < 0) or (Index >= FReportList.Count) then
    Result := nil
  else
    Result := TfrxReport(FReportList[Index]);
end;

function TfrxReportList.IndexOf(Report: TfrxReport): Integer;
begin
  Result := FReportList.IndexOf(Report);
end;


{Main Form}

procedure TMainForm.FileNew1Execute(Sender: TObject);
begin
  with FReportList.CreateNewReport do
  begin
    DesignReport(False, True);
    TfrxDesignerForm(Designer).OnDestroy := DestroyDesigner;
    TfrxDesignerForm(Designer).Caption := 'Designer-' + IntToStr(FReportList.Count);
  end;
end;

procedure TMainForm.FileExit1Execute(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FReportList := TfrxReportList.Create;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  FReportList.Free;
end;

procedure TMainForm.DestroyDesigner(Sender: TObject);
var
  idx: Integer;
begin
  idx := FReportList.IndexOf(TfrxDesignerForm(Sender).Report);
  if FReportList.Report[idx].PreviewForm <> nil then
    FReportList.Report[idx].PreviewForm.Close;
  FReportList.Delete(idx);
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
  idx: Integer;
begin
  for idx := 0 to FReportList.Count - 1 do
    TfrxDesignerForm(FReportList.Report[idx].Designer).Close;
  Action := caFree;
end;

procedure TMainForm.FileSave1Execute(Sender: TObject);
var
  idx: Integer;
begin
  for idx := 0 to FReportList.Count - 1 do
    TfrxDesignerForm(FReportList.Report[idx].Designer).SaveCmd.Execute;
end;

procedure TMainForm.PreviewReportExecute(Sender: TObject);
var
  idx: Integer;
begin
  for idx := 0 to FReportList.Count - 1 do
    FReportList.Report[idx].ShowReport;
end;

end.
