anchor.diff:  interface
   
   uses
  -  Classes, SysUtils,
  +  Classes,
  +  SysUtils,
     {$ifdef win32}
     shellapi,
     {$endif}
  -  fpg_base, fpg_main,
  -  fpg_form, fpg_panel, fpg_label, fpg_button, fpg_edit, fpg_dialogs, fpg_utils,
  +  fpg_base,
  +  fpg_main,
  +  fpg_form,
  +  fpg_panel,
  +  fpg_label,
  +  fpg_button,
  +  fpg_edit,
  +  fpg_dialogs,
  +  fpg_utils,
     U_Report;
   
   type
     TF_Visu = class(TfpgForm)
  -    private
  -      FReport: T_Report;
  -      Bv_Command: TfpgBevel;
  -      Bt_Close: TfpgButton;
  -      Bt_Print: TfpgButton;
  -      Bt_Printer: TfpgButton;
  -      Bt_Stop: TfpgButton;
  -      Bt_Pdf: TfpgButton;
  -      Bv_Pages: TfpgBevel;
  -      L_Pages: TfpgLabel;
  -      Bt_FirstPage: TfpgButton;
  -      Bt_PrecPage: TfpgButton;
  -      E_NumPage: TfpgEditInteger;
  -      Bt_NextPage: TfpgButton;
  -      Bt_LastPage: TfpgButton;
  -      L_FromPage: Tfpglabel;
  -      L_NbrPages: TfpgLabel;
  -      Bv_Sections: TfpgBevel;
  -      L_Sections: TfpgLabel;
  -      Bt_PrecSect: TfpgButton;
  -      E_NumSect: TfpgEditInteger;
  -      Bt_NextSect: TfpgButton;
  -      L_FromSect: Tfpglabel;
  -      L_NbrSect: TfpgLabel;
  -      L_PageSect: Tfpglabel;
  -      L_NumPageSect: Tfpglabel;
  -      L_FromPageSect: TfpgLabel;
  -      L_NbrPageSect: TfpgLabel;
  -      procedure FormShow(Sender: TObject);
  -      procedure Bt_CloseClick(Sender: TObject);
  -      procedure Bt_PrintClick(Sender: TObject);
  -      procedure Bt_PrinterClick(Sender: TObject);
  -      procedure Bt_StopClick(Sender: TObject);
  -      procedure Bt_PdfClick(Sender: TObject);
  -      procedure Bt_FirstPageClick(Sender: TObject);
  -      procedure Bt_PrecPageClick(Sender: TObject);
  -      procedure Bt_NextPageClick(Sender: TObject);
  -      procedure Bt_LastPageClick(Sender: TObject);
  -      procedure Bt_PrecSectClick(Sender: TObject);
  -      procedure Bt_NextSectClick(Sender: TObject);
  -      procedure E_NumPageKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
  -                var Consumed: boolean);
  -      procedure E_NumSectKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState;
  -                var Consumed: boolean);
  -      procedure ChangeButtons;
  -    public
  -      constructor Create(AOwner: TComponent; AImprime: T_Report); reintroduce;
  -      destructor Destroy; override;
  -    end;
  +  private
  +    FReport: T_Report;
  +    Bv_Command: TfpgBevel;
  +    Bt_Close: TfpgButton;
  +    Bt_Print: TfpgButton;
  +    Bt_Printer: TfpgButton;
  +    Bt_Stop: TfpgButton;
  +    Bt_Pdf: TfpgButton;
  +    Bv_Pages: TfpgBevel;
  +    L_Pages: TfpgLabel;
  +    Bt_FirstPage: TfpgButton;
  +    Bt_PrecPage: TfpgButton;
  +    E_NumPage: TfpgEditInteger;
  +    Bt_NextPage: TfpgButton;
  +    Bt_LastPage: TfpgButton;
  +    L_FromPage: TfpgLabel;
  +    L_NbrPages: TfpgLabel;
  +    Bv_Sections: TfpgBevel;
  +    L_Sections: TfpgLabel;
  +    Bt_PrecSect: TfpgButton;
  +    E_NumSect: TfpgEditInteger;
  +    Bt_NextSect: TfpgButton;
  +    L_FromSect: TfpgLabel;
  +    L_NbrSect: TfpgLabel;
  +    L_PageSect: TfpgLabel;
  +    L_NumPageSect: TfpgLabel;
  +    L_FromPageSect: TfpgLabel;
  +    L_NbrPageSect: TfpgLabel;
  +    procedure FormShow(Sender: TObject);
  +    procedure Bt_CloseClick(Sender: TObject);
  +    procedure Bt_PrintClick(Sender: TObject);
  +    procedure Bt_PrinterClick(Sender: TObject);
  +    procedure Bt_StopClick(Sender: TObject);
  +    procedure Bt_PdfClick(Sender: TObject);
  +    procedure Bt_FirstPageClick(Sender: TObject);
  +    procedure Bt_PrecPageClick(Sender: TObject);
  +    procedure Bt_NextPageClick(Sender: TObject);
  +    procedure Bt_LastPageClick(Sender: TObject);
  +    procedure Bt_PrecSectClick(Sender: TObject);
  +    procedure Bt_NextSectClick(Sender: TObject);
  +    procedure E_NumPageKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: Boolean);
  +    procedure E_NumSectKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: Boolean);
  +    procedure ChangeButtons;
  +  public
  +    constructor Create(AOwner: TComponent; AImprime: T_Report); reintroduce;
  +    destructor Destroy; override;
  +  end;
   
   var
     F_Visu: TF_Visu;
  
positive.code: implementation
  
  uses
    U_Command, U_Pdf, U_ReportImages;
  
  procedure TF_Visu.FormShow(Sender: TObject);
  begin
  L_Pages.Text:= 'Page';
  L_Sections.Text:= 'Section';
  L_PageSect.Text:= 'Page';
  L_FromPage.Text:= 'of';
  with FReport do
    begin
    if Sections.Count= 1
    then
      E_NumSect.Focusable:= False;
    if T_Section(Sections[Pred(Sections.Count)]).TotPages= 1
    then
      E_NumPage.Focusable:= False;
    E_NumPage.Text:= IntToStr(NumPage);
    L_NbrPages.Text:= IntToStr(T_Section(Sections[Pred(Sections.Count)]).TotPages);
    E_NumSect.Text:= IntToStr(NumSection);
    L_NbrSect.Text:= IntToStr(Sections.Count);
    L_NumPageSect.Text:= IntToStr(NumPageSection);
    L_NbrPageSect.Text:= IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
    ChangeButtons;
    end;
  end;
  
  procedure TF_Visu.Bt_CloseClick(Sender: TObject);
  begin
  Close;
  end;
  
  procedure TF_Visu.Bt_PrintClick(Sender: TObject);
  
negative.code:   PdfFile: string;
    PdfFileStream: TFileStream;
  begin
    Fd_SavePdf          := TfpgFileDialog.Create(nil);
    Fd_SavePdf.InitialDir := ExtractFilePath(ParamStr(0));
    Fd_SavePdf.FontDesc := 'bitstream vera sans-9';
    Fd_SavePdf.Filter   := 'Fichiers pdf |*.pdf';
    Fd_SavePdf.FileName := FReport.DefaultFile;
    try
      if Fd_SavePdf.RunSaveFile then
      begin
        PdfFile := Fd_SavePdf.FileName;
        if Lowercase(Copy(PdfFile, Length(PdfFile) - 3, 4)) <> '.pdf' then
          PdfFile := PdfFile + '.pdf';
        Document := TPdfDocument.CreateDocument;
        with Document do
        begin
          PdfFileStream := TFileStream.Create(PdfFile, fmCreate);
          WriteDocument(PdfFileStream);
          PdfFileStream.Free;
          Free;
        end;
        {$ifdef linux}
        fpgOpenURL(PdfFile);
        {$endif}
        {$ifdef win32}
        ShellExecute(0, PChar('OPEN'), PChar(PdfFile), PChar(''), PChar(''), 1);
        {$endif}
      end;
    finally
      Fd_SavePdf.Free;
    end;
  end;
  
  procedure TF_Visu.Bt_FirstPageClick(Sender: TObject);
  begin
    with FReport do
    begin
      NumPage         := 1;
      NumSection      := 1;
      NumPageSection  := 1;
      E_NumPage.Text  := IntToStr(NumPage);
      Bv_Visu.Visible := False;
      with T_Section(Sections[Pred(NumSection)]), F_Visu do
      begin
        Bv_Visu.Height := Paper.H;
        Bv_Visu.Width  := Paper.W;
        Bv_Visu.Top    := 50 + (F_Visu.Height - 50 - Paper.H) div 2;
        Bv_Visu.Left   := (F_Visu.Width - Paper.W) div 2;
      end;
      Bv_Visu.Visible := True;
      ChangeButtons;
      E_NumSect.Text     := IntToStr(NumSection);
      L_NumPageSect.Text := IntToStr(NumPageSection);
      L_NbrPageSect.Text := IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
    end;
  end;
  
  procedure TF_Visu.Bt_PrecPageClick(Sender: TObject);
  begin
    with FReport do
    begin
      NumPage := NumPage - 1;
      if NumPageSection = 1 then
      begin
        NumSection      := NumSection - 1;
        NumPageSection  := T_Section(Sections[Pred(NumSection)]).NbPages;
        Bv_Visu.Visible := False;
        with T_Section(Sections[Pred(NumSection)]), F_Visu do
        begin
          Bv_Visu.Height := Paper.H;
          Bv_Visu.Width  := Paper.W;
          Bv_Visu.Top    := 50 + (F_Visu.Height - 50 - Paper.H) div 2;
          Bv_Visu.Left   := (F_Visu.Width - Paper.W) div 2;
        end;
        Bv_Visu.Visible := True;
      end
      else
      begin
        NumPageSection := NumPageSection - 1;
        Bv_Visu.Invalidate;
      end;
      E_NumPage.Text     := IntToStr(NumPage);
      ChangeButtons;
      E_NumSect.Text     := IntToStr(NumSection);
      L_NumPageSect.Text := IntToStr(NumPageSection);
      L_NbrPageSect.Text := IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
    end;
  end;
  
  procedure TF_Visu.Bt_NextPageClick(Sender: TObject);
  begin
    with FReport do
    begin
      NumPage := NumPage + 1;
      if NumPageSection = T_Section(Sections[Pred(NumSection)]).NbPages then
      begin
        NumSection      := NumSection + 1;
        NumPageSection  := 1;
        Bv_Visu.Visible := False;
        with T_Section(Sections[Pred(NumSection)]), F_Visu do
        begin
          Bv_Visu.Height := Paper.H;
          Bv_Visu.Width  := Paper.W;
          Bv_Visu.Top    := 50 + (F_Visu.Height - 50 - Paper.H) div 2;
          Bv_Visu.Left   := (F_Visu.Width - Paper.W) div 2;
        end;
        Bv_Visu.Visible := True;
      end
      else
      begin
        NumPageSection := NumPageSection + 1;
        Bv_Visu.Invalidate;
      end;
      E_NumPage.Text     := IntToStr(NumPage);
      ChangeButtons;
      E_NumSect.Text     := IntToStr(NumSection);
      L_NumPageSect.Text := IntToStr(NumPageSection);
      L_NbrPageSect.Text := IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
    end;
  end;
  
  procedure TF_Visu.Bt_LastPageClick(Sender: TObject);
  begin
    with FReport do
    begin
      NumPage         := T_Section(Sections[Pred(Sections.Count)]).TotPages;
      NumSection      := Sections.Count;
      NumPageSection  := T_Section(Sections[Pred(Sections.Count)]).NbPages;
      E_NumPage.Text  := IntToStr(NumPage);
      Bv_Visu.Visible := False;
      with T_Section(Sections[Pred(NumSection)]), F_Visu do
      begin
        Bv_Visu.Height := Paper.H;
        Bv_Visu.Width  := Paper.W;
        Bv_Visu.Top    := 50 + (F_Visu.Height - 50 - Paper.H) div 2;
        Bv_Visu.Left   := (F_Visu.Width - Paper.W) div 2;
      end;
      Bv_Visu.Visible := True;
      ChangeButtons;
      E_NumSect.Text     := IntToStr(NumSection);
      L_NumPageSect.Text := IntToStr(NumPageSection);
      L_NbrPageSect.Text := IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
    end;
  end;
  
  procedure TF_Visu.Bt_PrecSectClick(Sender: TObject);
  begin
    with FReport do
    begin
      NumSection      := NumSection - 1;
      NumPage         := T_Section(Sections[Pred(NumSection)]).FirstPage;
      NumPageSection  := 1;
      E_NumPage.Text  := IntToStr(NumPage);
      Bv_Visu.Visible := False;
      with T_Section(Sections[Pred(NumSection)]), F_Visu do
      begin
        Bv_Visu.Height := Paper.H;
        Bv_Visu.Width  := Paper.W;
        Bv_Visu.Top    := 50 + (F_Visu.Height - 50 - Paper.H) div 2;
        Bv_Visu.Left   := (F_Visu.Width - Paper.W) div 2;
      end;
      Bv_Visu.Visible := True;
      ChangeButtons;
      E_NumSect.Text     := IntToStr(NumSection);
      L_NumPageSect.Text := IntToStr(NumPageSection);
      L_NbrPageSect.Text := IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
    end;
  end;
  
  procedure TF_Visu.Bt_NextSectClick(Sender: TObject);
  begin
    with FReport do
    begin
      NumSection      := NumSection + 1;
      NumPage         := T_Section(Sections[Pred(NumSection)]).FirstPage;
      NumPageSection  := 1;
      E_NumPage.Text  := IntToStr(NumPage);
      Bv_Visu.Visible := False;
      with T_Section(Sections[Pred(NumSection)]), F_Visu do
      begin
        Bv_Visu.Height := Paper.H;
        Bv_Visu.Width  := Paper.W;
        Bv_Visu.Top    := 50 + (F_Visu.Height - 50 - Paper.H) div 2;
        Bv_Visu.Left   := (F_Visu.Width - Paper.W) div 2;
      end;
      Bv_Visu.Visible := True;
      ChangeButtons;
      E_NumSect.Text     := IntToStr(NumSection);
      L_NumPageSect.Text := IntToStr(NumPageSection);
      L_NbrPageSect.Text := IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
    end;
  end;
  
  procedure TF_Visu.ChangeButtons;
  begin
    with FReport do
      if T_Section(Sections[Pred(Sections.Count)]).TotPages > 1 then
        if NumPage = 1 then
        begin
          Bt_FirstPage.Enabled := False;
          Bt_PrecPage.Enabled  := False;
          Bt_NextPage.Enabled  := True;
          Bt_LastPage.Enabled  := True;
          Bt_PrecSect.Enabled  := False;
          if Sections.Count > 1 then
            Bt_NextSect.Enabled := True
          else
            Bt_NextSect.Enabled := False;
        end
        else if NumPage = T_Section(Sections[Pred(Sections.Count)]).TotPages then
        begin
          Bt_FirstPage.Enabled := True;
          Bt_PrecPage.Enabled  := True;
          Bt_NextPage.Enabled  := False;
          Bt_LastPage.Enabled  := False;
          if Sections.Count > 1 then
            Bt_PrecSect.Enabled := True
          else
            Bt_PrecSect.Enabled := False;
          Bt_NextSect.Enabled := False;
        end
        else
        begin
          Bt_FirstPage.Enabled := True;
          Bt_PrecPage.Enabled  := True;
          Bt_NextPage.Enabled  := True;
          Bt_LastPage.Enabled  := True;
          if Sections.Count > 1 then
            if NumSection = 1 then
            begin
              Bt_PrecSect.Enabled := False;
              Bt_NextSect.Enabled := True;
            end
            else if NumSection = Sections.Count then
            begin
              Bt_PrecSect.Enabled := True;
              Bt_NextSect.Enabled := False;
            end
            else
            begin
              Bt_PrecSect.Enabled := True;
              Bt_NextSect.Enabled := True;
            end
          else
          begin
            Bt_PrecSect.Enabled := False;
            Bt_NextSect.Enabled := False;
          end;
        end
      else
      begin
        Bt_FirstPage.Enabled := False;
        Bt_PrecPage.Enabled  := False;
        Bt_NextPage.Enabled  := False;
        Bt_LastPage.Enabled  := False;
        Bt_PrecSect.Enabled  := False;
        Bt_NextSect.Enabled  := False;
      end;
  end;
  
  procedure TF_Visu.E_NumPageKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: Boolean);
  var
    CptSect, CptPage, CptPageSect: integer;
  begin
    if (KeyCode = KeyReturn) or (KeyCode = KeyPEnter) then
      with FReport do
      begin
        if E_NumPage.Value > T_Section(Sections[Pred(Sections.Count)]).TotPages then
          NumPage := T_Section(Sections[Pred(Sections.Count)]).TotPages
        else if E_NumPage.Value = 0 then
          NumPage := 1
        else
          NumPage := E_NumPage.Value;
        E_NumPage.Value := NumPage;
        CptSect := 0;
        CptPage := 0;
        repeat
          Inc(CptSect);
          CptPageSect := 0;
          repeat
            Inc(CptPage);
            Inc(CptPageSect);
          until (CptPage = NumPage) or (CptPage = T_Section(Sections[Pred(Cptsect)]).NbPages);
        until CptPage = NumPage;
        NumSection         := CptSect;
        NumPageSection     := CptPagesect;
        Bv_Visu.Invalidate;
        ChangeButtons;
        E_NumSect.Text     := IntToStr(NumSection);
        L_NumPageSect.Text := IntToStr(NumPageSection);
        L_NbrPageSect.Text := IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
      end;
  end;
  
  procedure TF_Visu.E_NumSectKeyPress(Sender: TObject; var KeyCode: word; var ShiftState: TShiftState; var Consumed: Boolean);
  begin
    if (KeyCode = KeyReturn) or (KeyCode = KeyPEnter) then
      with FReport do
      begin
        if E_NumSect.Value > Sections.Count then
          NumSection := Sections.Count
        else if E_NumSect.Value = 0 then
          NumSection := 1
        else
          NumSection := E_NumSect.Value;
        E_NumSect.Value := NumSection;
        NumPage := T_Section(Sections[Pred(NumSection)]).FirstPage;
        NumPageSection := 1;
        E_NumPage.Value    := NumPage;
        Bv_Visu.Invalidate;
        ChangeButtons;
        L_NumPageSect.Text := IntToStr(NumPageSection);
        L_NbrPageSect.Text := IntToStr(T_Section(Sections[Pred(NumSection)]).NbPages);
      end;
  end;
  
  constructor TF_Visu.Create(AOwner: TComponent; AImprime: T_Report);
  begin
    inherited Create(AOwner);
    FReport        := AImprime;
    Name           := 'F_Visu';
    WindowTitle    := 'Preview';
    WindowPosition := wpUser;
    SetPosition(0, 0, FpgApplication.ScreenWidth - 2, FpgApplication.ScreenHeight - 66);
    Sizeable       := False;
    BackgroundColor := clMediumAquamarine;
    CreateReportImages;
    Bv_Command     := CreateBevel(Self, 0, 0, Width, 50, bsBox, bsRaised);
    Bv_Command.BackgroundColor := clBisque;
    Bt_Close       := CreateButton(Bv_Command, 10, 10, 26, '', @Bt_CloseClick, 'stdimg.exit');
    Bt_Close.BackgroundColor := clOrangeRed;
    Bt_Print       := CreateButton(Bv_Command, 50, 10, 26, '', @Bt_PrintClick, 'stdimg.print');
    Bt_Print.BackgroundColor := clGreen;
    Bt_Print.Enabled := False;
    Bt_Printer     := CreateButton(Bv_Command, 90, 10, 26, '', @Bt_PrinterClick, 'repimg.Printer');
    Bt_Printer.BackgroundColor := clSilver;
    Bt_Printer.Enabled := False;
    Bt_Stop        := CreateButton(Bv_Command, 130, 10, 26, '', @Bt_StopClick, 'repimg.Stop');
    Bt_Stop.BackgroundColor := clRed;
    Bt_Pdf         := CreateButton(Bv_Command, 170, 10, 26, '', @Bt_PdfClick, 'stdimg.Adobe_pdf');
    Bt_Pdf.BackgroundColor := clWhite;
    Bt_Pdf.ImageMargin := 0;
    Bv_Pages       := CreateBevel(Bv_Command, 220, 5, 300, 40, bsBox, bsLowered);
    Bv_Pages.BackgroundColor := clLinen;
    Bt_FirstPage   := CreateButton(Bv_Pages, 54, 6, 26, '', @Bt_FirstPageClick, 'repimg.First');
    Bt_PrecPage    := CreateButton(Bv_Pages, 80, 6, 26, '', @Bt_PrecPageClick, 'repimg.Precedent');
    E_NumPage      := CreateEditInteger(Bv_Pages, 110, 8, 60, 0);
    E_NumPage.OnKeyPress := @E_NumPageKeypress;
    Bt_NextPage    := CreateButton(Bv_Pages, 174, 6, 26, '', @Bt_NextPageClick, 'repimg.Next');
    Bt_LastPage    := CreateButton(Bv_Pages, 200, 6, 26, '', @Bt_LastPageClick, 'repimg.Last');
    L_Pages        := CreateLabel(Bv_Pages, 5, E_NumPage.Top, 'Page', 0, E_NumPage.Height, taLeftJustify, tlcenter);
    L_FromPage     := CreateLabel(Bv_Pages, 235, E_NumPage.Top, 'of', 0, E_NumPage.Height, taLeftJustify, tlcenter);
    L_NbrPages     := CreateLabel(Bv_Pages, 265, E_NumPage.Top, ' ', 30, E_NumPage.Height, taCenter, tlcenter);
    Bv_Sections    := CreateBevel(Bv_Command, 540, 5, 500, 40, bsBox, bsLowered);
    Bv_Sections.BackgroundColor := clLinen;
    Bt_PrecSect    := CreateButton(Bv_Sections, 90, 6, 26, '', @Bt_PrecSectClick, 'repimg.Precedent');
    E_NumSect      := CreateEditInteger(Bv_Sections, 120, 8, 60, 0);
    E_NumSect.OnKeyPress := @E_NumSectKeyPress;
    Bt_NextSect    := CreateButton(Bv_Sections, 184, 6, 26, '', @Bt_NextSectClick, 'repimg.Next');
    L_Sections     := CreateLabel(Bv_Sections, 5, E_NumSect.Top, 'Section', 0, E_NumSect.Height, taLeftJustify, tlcenter);
    L_FromSect     := CreateLabel(Bv_Sections, 250, E_NumSect.Top, 'of', 0, E_NumSect.Height, taLeftJustify, tlcenter);
    L_NbrSect      := CreateLabel(Bv_Sections, 280, E_NumSect.Top, '-', 0, E_NumSect.Height, taLeftJustify, tlcenter);
    L_PageSect     := CreateLabel(Bv_Sections, 320, E_NumSect.Top, 'Page', 0, E_NumSect.Height, taLeftJustify, tlcenter);
    L_NumPageSect  := CreateLabel(Bv_Sections, 365, E_NumSect.Top, '-', 0, E_NumSect.Height, taLeftJustify, tlcenter);
    L_FromPageSect := CreateLabel(Bv_Sections, 410, E_NumSect.Top, 'of', 0, E_NumSect.Height, taLeftJustify, tlcenter);
    L_NbrPageSect  := CreateLabel(Bv_Sections, 440, E_NumSect.Top, '-', 0, E_NumSect.Height, taLeftJustify, tlcenter);
    OnShow         := @FormShow;
  end;
  
  destructor TF_Visu.Destroy;
  begin
    DeleteReportImages;
    inherited Destroy;
  end;
  
  end.
  