home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January / ChipCD_1.03.iso / zkuste / delphi / kolekce / d3456 / GmPrintSuite_2_61_Lite.exe / {app} / GmPreview.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-10-10  |  43.2 KB  |  1,376 lines

  1. {******************************************************************************}
  2. {                                                                              }
  3. {                          GmPreview.pas v2.61 Lite                            }
  4. {                                                                              }
  5. {           Copyright (c) 2001 Graham Murt  - www.MurtSoft.co.uk               }
  6. {                                                                              }
  7. {   Feel free to e-mail me with any comments, suggestions, bugs or help at:    }
  8. {                                                                              }
  9. {                           graham@murtsoft.co.uk                              }
  10. {                                                                              }
  11. {******************************************************************************}
  12.  
  13. unit GmPreview;
  14.  
  15. interface
  16.  
  17. uses Windows, Classes, Controls, Forms, GmTypes, GmCanvas, Graphics,
  18.   Messages, GmPrinter, GmConst, GmRtfFuncs;
  19.  
  20. const
  21.   // cursor values...
  22.   crZoomIn   = 101;
  23.   crZoomOut  = 102;
  24.  
  25.   {$I GMPS.INC}
  26.  
  27. type
  28.   // *** TGmPreview ***
  29.  
  30.   TGmPreview = class(TGmScrollingWinControl)
  31.   private
  32.     FBorderStyle: TBorderStyle;
  33.     FCanvas: TGmCanvas;
  34.     FCoordsRelativeTo: TGmCoordsRelative;
  35.     FCurrentPage: integer;
  36.     FFooter: TGmHeaderFooter;
  37.     FGutter: integer;
  38.     FHeader: TGmHeaderFooter;
  39.     FMargins: TGmMargins;
  40.     FMaxZoom: integer;
  41.     FMinZoom: integer;
  42.     FMouseOver: Boolean;
  43.     FMousePos: TPoint;
  44.     FOrientation: TGmOrientation;
  45.     FPages: TGmPageList;
  46.     FPagesPerSheet: TGmPagesPerSheet;
  47.     FPanning: Boolean;
  48.     FPanningXYStart : TPoint;
  49.     FPaper: TGmPageCanvas;  // obsolete property.
  50.     FPaperImage: TGmPaperImage;
  51.     FPaperSize: TGmPaperSize;
  52.     FPrinter: TGmPrinter;
  53.     FRegisteredComponents: TList;
  54.     FReversePrintOrder: Boolean;
  55.     FShadow: TGmShadow;
  56.     FTempInt: integer;
  57.     FTempValue: TGmValue;
  58.     FUpdateCount: integer;
  59.     FZoom: integer;
  60.     FZoomIncrement: integer;
  61.     FZoomStyle: TGmZoomStyle;
  62.     // events...
  63.     FAfterPrint       : TNotifyEvent;
  64.     FAfterPrintPage   : TPrintPageEvent;
  65.     FBeforeLoad       : TBeforeLoadEvent;
  66.     FBeforePrint      : TNotifyEvent;
  67.     FBeforePrintPage  : TPrintPageEvent;
  68.     FBeforeReadStream : TBeforeReadWriteStream;
  69.     FBeforeWriteStream: TBeforeReadWriteStream;
  70.     FNeedRichEdit     : TNeedRichEditEvent;
  71.     FOnAbortPrint     : TNotifyEvent;
  72.     FOnCanvasChange   : TNotifyEvent;
  73.     FOnChangeOrientation: TNotifyEvent;
  74.     FOnChangePageOrientation: TPageOrientationChanged;
  75.     FOnChangePrinter  : TNotifyEvent;
  76.     FOnClear          : TNotifyEvent;
  77.     FOnDeletePage     : TNotifyEvent;
  78.     FOnLoadProgress   : TFileProgressEvent;
  79.     FOnMarginsChange  : TNotifyEvent;
  80.     FOnNewPage        : TNotifyEvent;
  81.     FOnPageChange     : TPageChangeEvent;
  82.     FOnPageChanging   : TPageChangeEvent;
  83.     FOnPrintPage      : TPrintPageEvent;
  84.     FOnPrintProgress  : TPrintProgressEvent;
  85.     FOnSaveProgress   : TFileProgressEvent;
  86.     FOnZoom           : TZoomEvent;
  87.     FOnPageDragDrop   : TPageDragDropEvent;
  88.     FOnPageDragOver   : TPageDragOverEvent;
  89.     FOnPageMouseDown  : TPageMouseEvent;
  90.     FOnPageMouseMove  : TPageMouseMoveEvent;
  91.     FOnPageMouseUp    : TPageMouseEvent;
  92.     FOnPageSizeChange : TNotifyEvent;
  93.     function GetAvailablePageHeight: TGmValue;
  94.     function GetAvailablePageWidth: TGmValue;
  95.     function GetGmValue: TGmValue;
  96.     function GetMessagesEnabled: Boolean;
  97.     function GetNumPages: integer;
  98.     function GetOrientationType: TGmOrientationType;
  99.     function GetPage(index: integer): TGmPage;
  100.     function GetPageHeight: TGmValue;
  101.     function GetPageWidth: TGmValue;
  102.     function GetPrintCopies: integer;
  103.     function GetRtfInformation: TGmRtfInformation;
  104.     function GetScale: Extended;
  105.     function GetScrollbarPercents: TGmPoint;
  106.     function GetTitle: string;
  107.     function IsUpdating: Boolean;
  108.     procedure ForceMessageToControls(AMessage: integer; Param1, Param2: integer);
  109.     procedure LoadDocInfoFromStream(AStream: TStream; var ANumPages: integer);
  110.     procedure LoadPageSetupFromStream(AStream: TStream);
  111.     procedure MessageToControls(AMessage: integer; Param1, Param2: integer);
  112.     procedure PageSizeChanged(Sender: TObject);
  113.     procedure HeaderFooterChanged(Sender: TObject);
  114.     procedure PageChanged;
  115.     procedure SaveDocInfoToStream(AStream: TStream);
  116.     procedure SavePageSetupToStream(AStream: TStream);
  117.     procedure SetCoordsRelative(const AValue: TGmCoordsRelative);
  118.     procedure SetCurrentPage(AValue: integer);
  119.     procedure SetGutter(AValue: integer);
  120.     procedure SetMaxZoom(const AValue: integer);
  121.     procedure SetMessagesEnabled(const AValue: Boolean);
  122.     procedure SetMinZoom(const AValue: integer);
  123.     procedure SetOrientation(AValue: TGmOrientation);
  124.     procedure SetPagesPerSheet(AValue: TGmPagesPerSheet);
  125.     procedure SetPaperSize(AValue: TGmPaperSize);
  126.     procedure SetPrintCopies(AValue: integer);
  127.     procedure SetTitle(ATitle: string);
  128.     procedure SetZoom(AValue: integer);
  129.     // events...
  130.     procedure CanvasChanged(Sender: TObject);
  131.     procedure MarginsChanged(Sender: TObject);
  132.     procedure PrinterChanged(Sender: TObject);
  133.     procedure PageOrientationChanged(Sender: TObject; APageNum: integer; AOrientation: TGmOrientation);
  134.   protected
  135.     procedure CMMouseEnter (var Message: TMessage); message CM_MOUSEENTER;
  136.     procedure CMMouseLeave (var Message: TMessage); message CM_MOUSELEAVE;
  137.     procedure CreateParams(var Params: TCreateParams); override;
  138.  
  139.     procedure DoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
  140.     procedure DoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
  141.     procedure DoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
  142.  
  143.     procedure DoPageDragDrop(Sender, Source: TObject; X, Y: TGmValue);
  144.     procedure DoPageDragOver(Sender, Source: TObject; X, Y: TGmValue; State: TDragState; var Accept: Boolean);
  145.     procedure DoPageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: TGmValue);
  146.     procedure DoPageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: TGmValue);
  147.     procedure DoPageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: TGmValue);
  148.     procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
  149.     procedure PreviewResize(var Message: TMessage); message WM_SIZE;
  150.     procedure WMNCHitTest(var Message: TMessage); message WM_NCHITTEST;
  151.     procedure ChangeDrawingDpi(var Message: TMessage); message GM_CHANGE_DRAWING_PPI;
  152.     procedure DefaultDrawingDpi(var Message: TMessage); message GM_DEFAULT_DRAWING_PPI;
  153.   public
  154.     constructor Create(AOwner: TComponent); override;
  155.     destructor Destroy; override;
  156.     function GetFileVersion(AFileName: string): Extended;
  157.     function NewPage: TGmPage; virtual;
  158.     function PaperSizeToStr(APaperSize: TGmPaperSize): string;
  159.     function Tokenize(AText: string; APage: integer): string;
  160.     procedure AddAssociatedComponent(AComponent: TComponent);
  161.     procedure RemoveAssociatedComponent(AComponent: TComponent);
  162.     procedure Assign(Source: TPersistent); override;
  163.     procedure BeginUpdate;
  164.     procedure CenterOnClick(x, y: integer);
  165.     procedure Clear; virtual;
  166.     procedure DeleteCurrentPage;
  167.     procedure DeletePage(index: integer);
  168.     procedure EndUpdate;
  169.     procedure FindText(AText: string; CaseSensative: Boolean; AList: TList);
  170.     procedure FirstPage;
  171.     procedure FitHeight;
  172.     procedure FitWidth;
  173.     procedure FitWholePage;
  174.     procedure LastPage;
  175.     procedure LoadFromStream(AStream: TStream);
  176.     procedure LoadFromFile(AFilename: string);
  177.     procedure NextPage;
  178.     procedure PrevPage;
  179.     procedure Print;
  180.     procedure PrintCurrentPage;
  181.     procedure PrintRange(APageFrom, APageTo: integer);
  182.     procedure PrintToFile(AFileName: string);
  183.     procedure SaveToFile(AFilename: string);
  184.     procedure SaveToStream(AStream: TStream);
  185.     procedure ScrollToPosition(XPercent, YPercent: Extended);
  186.     procedure SetCursor(ACursor: TGmCursor);
  187.     procedure SetPageSize(AWidth, AHeight: Extended; AUnits: TGmMeasurement);
  188.     procedure StartPanning;
  189.     procedure StopPanning;
  190.     procedure UpdatePreview;
  191.     procedure UsePrinterPageSize;
  192.     procedure ZoomIn;
  193.     procedure ZoomOut;
  194.     property AvailablePageHeight: TGmValue read GetAvailablePageHeight;
  195.     property AvailablePageWidth: TGmValue read GetAvailablePageWidth;
  196.     property Canvas: TGmCanvas read FCanvas;
  197.     property CurrentPage: integer read FCurrentPage write SetCurrentPage;
  198.     property MessagesEnabled: Boolean read GetMessagesEnabled write SetMessagesEnabled;
  199.     property NumPages: integer read GetNumPages;
  200.     property PageHeight: TGmValue read GetPageHeight;
  201.  
  202.     property Pages[index: integer]: TGmPage read GetPage;
  203.     property PageWidth: TGmValue read GetPageWidth;
  204.     property Panning: Boolean read FPanning;
  205.     property Paper: TGmPageCanvas read FPaper;
  206.     property RtfInformation: TGmRtfInformation read GetRtfInformation;
  207.   published
  208.     {properties available from Delphi 4...}
  209.     {$IFNDEF VER100}
  210.     {$IFNDEF VER110}
  211.     property Anchors;
  212.     property Constraints;
  213.     {$ENDIF}
  214.     {$ENDIF}
  215.     property Align;
  216.     property AutoScroll;
  217.     property BorderStyle: TBorderStyle read FBorderStyle write FBorderStyle;
  218.     property Color default clGray;
  219.     property CoordsRelativeTo: TGmCoordsRelative read FCoordsRelativeTo write SetCoordsRelative;
  220.     property Footer: TGmHeaderFooter read FFooter write FFooter;
  221.     property GmPrinter: TGmPrinter read FPrinter write FPrinter;
  222.     property Gutter: integer read FGutter write SetGutter default DEFAULT_GUTTER;
  223.     property Header: TGmHeaderFooter read FHeader write FHeader;
  224.     property Hint;
  225.     property Margins: TGmMargins read FMargins write FMargins;
  226.     property MaxZoom: integer read FMaxZoom write SetMaxZoom default DEFAULT_MAX_ZOOM;
  227.     property MinZoom: integer read FMinZoom write SetMinZoom default DEFAULT_MIN_ZOOM;
  228.     property Orientation: TGmOrientation read FOrientation write SetOrientation default gmPortrait;
  229.     property PagesPerSheet: TGmPagesPerSheet read FPagesPerSheet write SetPagesPerSheet default gmOnePage;
  230.     property PaperSize: TGmPaperSize read FPaperSize write SetPaperSize default A4;
  231.     property ParentColor;
  232.     property PopupMenu;
  233.     property PrintCopies: integer read GetPrintCopies write SetPrintCopies;
  234.     property ReversePrintOrder: Boolean read FReversePrintOrder write FReversePrintOrder default False;
  235.     property Shadow: TGmShadow read FShadow write FShadow;
  236.     property ShowHint;
  237.     property TabOrder;
  238.     property Title: string read GetTitle write SetTitle;
  239.     property Visible;
  240.     property Zoom: integer read FZoom write SetZoom default DEFAULT_ZOOM;
  241.     property ZoomIncrement: integer read FZoomIncrement write FZoomIncrement default DEFAULT_ZOOM_INC;
  242.     property ZoomStyle: TGmZoomStyle read FZoomStyle write FZoomStyle default gmFixedZoom;
  243.     // events...
  244.     property AfterPrint: TNotifyEvent read FAfterPrint write FAfterPrint;
  245.     property AfterPrintPage: TPrintPageEvent read FAfterPrintPage write FAfterPrintPage;
  246.     property BeforeLoad: TBeforeLoadEvent read FBeforeLoad write FBeforeLoad;
  247.     property BeforePrint: TNotifyEvent read FBeforePrint write FBeforePrint;
  248.     property BeforePrintPage: TPrintPageEvent read FBeforePrintPage write FBeforePrintPage;
  249.     property BeforeReadStream: TBeforeReadWriteStream read FBeforeReadStream write FBeforeReadStream;
  250.     property BeforeWriteStream: TBeforeReadWriteStream read FBeforeWriteStream write FBeforeWriteStream;
  251.     property OnAbortPrint: TNotifyEvent read FOnAbortPrint write FOnAbortPrint;
  252.     property OnCanvasChange: TNotifyEvent read FOnCanvasChange write FOnCanvasChange;
  253.     property OnChangeMargins: TNotifyEvent read FOnMarginsChange write FOnMarginsChange;
  254.     property OnChangeOrientation: TNotifyEvent read FOnChangeOrientation write FOnChangeOrientation;
  255.     property OnChangePageOrientation: TPageOrientationChanged read FOnChangePageOrientation write FOnChangePageOrientation;
  256.     property OnChangePrinter: TNotifyEvent read FOnChangePrinter write FOnChangePrinter;
  257.     property OnClear: TNotifyEvent read FOnClear write FOnClear;
  258.     property OnDeletePage: TNotifyEvent read FOnDeletePage write FOnDeletePage;
  259.     property OnDragOver;
  260.     property OnDragDrop;
  261.     property OnEndDrag;
  262.     property OnLoadProgress: TFileProgressEvent read FOnLoadProgress write FOnLoadProgress;
  263.     property OnMouseDown;
  264.     property OnMouseMove;
  265.     property OnMouseUp;
  266.     property OnNeedRichEdit: TNeedRichEditEvent read FNeedRichEdit write FNeedRichEdit;
  267.     property OnNewPage: TNotifyEvent read FOnNewPage write FOnNewPage;
  268.     property OnPageChange: TPageChangeEvent read FOnPageChange write FOnPageChange;
  269.     property OnPageChanging: TPageChangeEvent read FOnPageChanging write FOnPageChanging;
  270.     property OnPageDragDrop: TPageDragDropEvent read FOnPageDragDrop write FOnPageDragDrop;
  271.     property OnPageDragOver: TPageDragOverEvent read FOnPageDragOver write FOnPageDragOver;
  272.     property OnPageMouseDown: TPageMouseEvent read FOnPageMouseDown write FOnPageMouseDown;
  273.     property OnPageMouseMove: TPageMouseMoveEvent read FOnPageMouseMove write FOnPageMouseMove;
  274.     property OnPageMouseUp: TPageMouseEvent read FOnPageMouseUp write FOnPageMouseUp;
  275.     property OnPageSizeChange: TNotifyEvent read FOnPageSizeChange write FOnPageSizeChange;
  276.     property OnPrintPage: TPrintPageEvent read FOnPrintPage write FOnPrintPage;
  277.     property OnPrintProgress: TPrintProgressEvent read FOnPrintProgress write FOnPrintProgress;
  278.     property OnSaveProgress: TFileProgressEvent read FOnSaveProgress write FOnSaveProgress;
  279.     property OnStartDrag;
  280.     property OnZoom: TZoomEvent read FOnZoom write FOnZoom;
  281.   end;
  282.  
  283. implementation
  284.  
  285. {$R GmCursors.res}
  286.  
  287. uses SysUtils, GmErrors, GmObjects, Math, GmStream;
  288. //------------------------------------------------------------------------------
  289.  
  290. // *** TGmPreview Constructor/Destructor ***
  291.  
  292. constructor TGmPreview.Create(AOwner: TComponent);
  293. begin
  294.   inherited Create(AOwner);
  295.   Inc(FUpdateCount);
  296.  
  297.   // create objects...
  298.   FRegisteredComponents := TList.Create;
  299.   FPrinter := TGmPrinter.Create;
  300.   FPages := TGmPageList.Create;
  301.   FCanvas := TGmCanvas.Create(Self);
  302.   FHeader := TGmHeader.Create;
  303.   FFooter := TGmFooter.Create;
  304.   FMargins := TGmMargins.Create;
  305.   FShadow := TGmShadow.Create;
  306.   FPaperImage := TGmPaperImage.Create(Self);
  307. //  FPageHeight := TGmValue.Create;
  308. //  FPageWidth := TGmValue.Create;
  309.  
  310.   // set object events...
  311.   FHeader.OnChange := HeaderFooterChanged;
  312.   FFooter.OnChange := HeaderFooterChanged;
  313.   FPages.OnChange := PageSizeChanged;
  314.   FPages.OnPageOrientationChange := PageOrientationChanged;
  315.  
  316.   FPaperImage.OnPageMouseDown := DoPageMouseDown;
  317.   FPaperImage.OnPageMouseMove := DoPageMouseMove;
  318.   FPaperImage.OnPageMouseUp := DoPageMouseUp;
  319.   FPaperImage.OnPageDragDrop := DoPageDragDrop;
  320.   FPaperImage.OnPageDragOver := DoPageDragOver;
  321.  
  322.   FPaperImage.OnMouseDown := DoMouseDown;
  323.   FPaperImage.OnMouseMove := DoMouseMove;
  324.   FPaperImage.OnMouseUp   := DoMouseUp;
  325.  
  326.   FPrinter.OnPrinterChanged := PrinterChanged;
  327.   FCanvas.OnChange := CanvasChanged;
  328.   FMargins.OnChange := MarginsChanged;
  329.   // link objects...
  330.   FMargins.Printer := FPrinter;
  331.   FPaperImage.Shadow := FShadow;
  332.   FPaperImage.Margins := FMargins;
  333.   FPages.Header := FHeader;
  334.   FPages.Footer := FFooter;
  335.   FPages.Margins := FMargins;
  336.   FPages.Preview := Self;
  337.   FHeader.Margins := FMargins;
  338.   FFooter.Margins := FMargins;
  339.   FHeader.Preview := Self;
  340.   FFooter.Preview := Self;
  341.   // load cursors...
  342.   Screen.Cursors[crZoomIn]  := LoadCursor(HInstance, 'ZoomIn');
  343.   Screen.Cursors[crZoomOut] := LoadCursor(HInstance, 'ZoomOut');
  344.  
  345.   // set properties...
  346.   Color := clGray;
  347.   Height := DEFAULT_HEIGHT;
  348.   Width := DEFAULT_WIDTH;
  349.   {$IFNDEF VER100} {$IFNDEF VER110}
  350.   DoubleBuffered := True;
  351.   {$ENDIF} {$ENDIF}
  352.   ControlStyle := [csCaptureMouse, csClickEvents, csSetCaption, csDoubleClicks];
  353.   FBorderStyle := bsSingle;
  354.   FPages.AddPage;
  355.   FCurrentPage := 1;
  356.   FCanvas.Page := Pages[FCurrentPage];
  357.   FGutter := DEFAULT_GUTTER;
  358.   FOrientation := gmPortrait;
  359.   FPaperSize := A4;
  360.   FPaperImage.Parent := Self;
  361.   FMaxZoom := DEFAULT_MAX_ZOOM;
  362.   FMinZoom := DEFAULT_MIN_ZOOM;
  363.   FZoom := DEFAULT_ZOOM;
  364.   FZoomIncrement := DEFAULT_ZOOM_INC;
  365.   FZoomStyle := gmFixedZoom;
  366.   FPagesPerSheet := gmOnePage;
  367.   FReversePrintOrder := False;
  368.   Dec(FUpdateCount);
  369. end;
  370.  
  371. destructor TGmPreview.Destroy;
  372. begin
  373.   FCanvas.Free;
  374.   FMargins.Free;
  375.   FPages.Free;
  376.   FHeader.Free;
  377.   FFooter.Free;
  378.   FPrinter.Free;
  379.   FShadow.Free;
  380.   FPaperImage.Free;
  381.   FRegisteredComponents.Free;
  382.   if Assigned(FTempValue) then FTempValue.Free;
  383.   inherited Destroy;
  384. end;
  385.  
  386. //------------------------------------------------------------------------------
  387.  
  388. function TGmPreview.GetAvailablePageHeight: TGmValue;
  389. begin
  390.   Result := GetGmValue;
  391.   Result.AsUnits := PageHeight.AsUnits - ((Margins.Top.AsUnits + Margins.Bottom.AsUnits) +
  392.                                           (Header.Height.AsUnits + Footer.Height.AsUnits));
  393. end;
  394.  
  395. function TGmPreview.GetAvailablePageWidth: TGmValue;
  396. begin
  397.   Result := GetGmValue;
  398.   Result.AsUnits := PageWidth.AsUnits - (Margins.Left.AsUnits + Margins.Right.AsUnits);
  399. end;
  400.  
  401. function TGmPreview.GetGmValue: TGmValue;
  402. begin
  403.   if not Assigned(FTempValue) then FTempValue := TGmValue.Create;
  404.   Result := FTempValue;
  405.   Result.OnChange := nil;
  406. end;
  407.  
  408. function TGmPreview.GetMessagesEnabled: Boolean;
  409. begin
  410.   Result := FUpdateCount = 0;
  411. end;
  412.  
  413. function TGmPreview.GetNumPages: integer;
  414. begin
  415.   Result := FPages.Count;
  416. end;
  417.  
  418. function TGmPreview.GetOrientationType: TGmOrientationType;
  419. begin
  420.   Result := FPages.GetOrientationType;
  421. end;
  422.  
  423. function TGmPreview.GetPage(index: integer): TGmPage;
  424. begin
  425.   Result := nil;
  426.   if (index >= 1) or (index <= FPages.Count) then
  427.   Result := FPages.Page[index];
  428. end;
  429.  
  430. function TGmPreview.GetPageHeight: TGmValue;
  431. begin
  432. //  Result := GetGmValue;
  433. //  Result.OnChange := PageSizeChanged;
  434. //  Result.Assign(FPages.PageHeight);
  435.   Result := FPages.PageHeight;
  436. end;
  437.  
  438. function TGmPreview.GetPageWidth: TGmValue;
  439. begin
  440.   //Result := GetGmValue;
  441.   //Result.OnChange := PageSizeChanged;
  442.   Result := FPages.PageWidth;//.Assign(FPages.PageWidth);
  443. end;
  444.  
  445. function TGmPreview.GetPrintCopies: integer;
  446. begin
  447.   Result := FPrinter.PrintCopies;
  448. end;
  449.  
  450. function TGmPreview.GetRtfInformation: TGmRtfInformation;
  451. begin
  452.   Result := (FPages.RtfInformation as TGmRtfInformation);
  453. end;
  454.  
  455. function TGmPreview.GetScale: Extended;
  456. begin
  457.   Result := FZoom / 100;
  458. end;
  459.  
  460. function TGmPreview.GetScrollbarPercents: TGmPoint;
  461. begin
  462.   if (HorzScrollBar.Range > 0) and (HorzScrollBar.Position > 0) then
  463.     Result.x := 100 * (HorzScrollBar.Position / (HorzScrollBar.Range-ClientWidth))
  464.   else
  465.     Result.x := 0;
  466.   if (VertScrollBar.Range > 0) and (VertScrollBar.Position > 0) then
  467.     Result.y := 100 * (VertScrollBar.Position / (VertScrollBar.Range-ClientHeight))
  468.   else
  469.     Result.y := 0;
  470. end;
  471.  
  472. function TGmPreview.GetTitle: string;
  473. begin
  474.   Result := GmPrinter.Title;
  475. end;
  476.  
  477. function TGmPreview.IsUpdating: Boolean;
  478. begin
  479.   Result := (FUpdateCount <> 0);
  480. end;
  481.  
  482. procedure TGmPreview.ForceMessageToControls(AMessage: integer; Param1, Param2: integer);
  483. var
  484.   FTempValue: integer;
  485. begin
  486.   FTempValue := FUpdateCount;
  487.   try
  488.     FUpdateCount := 0;
  489.     MessageToControls(AMessage, Param1, Param2);
  490.   finally
  491.     FUpdateCount := FTempValue;
  492.   end;
  493. end;
  494.  
  495. procedure TGmPreview.LoadDocInfoFromStream(AStream: TStream; var ANumPages: integer);
  496. var
  497.   GmStream: TGmExtStream;
  498. begin
  499.   GmStream := TGmExtStream.Create;
  500.   try
  501.     GmStream.LoadFromStream(AStream);
  502.     GmStream.ReadDateTime;
  503.     ANumPages := GmStream.ReadInteger;
  504.   finally
  505.     GmStream.Free;
  506.   end;
  507. end;
  508.  
  509. procedure TGmPreview.LoadPageSetupFromStream(AStream: TStream);
  510. var
  511.   GmStream: TGmExtStream;
  512. begin
  513.   GmStream := TGmExtStream.Create;
  514.   try
  515.     GmStream.LoadFromStream(AStream);
  516.     FPages.PageWidth.AsUnits  := GmStream.ReadInteger;
  517.     FPages.PageHeight.AsUnits := GmStream.ReadInteger;
  518.     FPaperSize := StrToPaperSize(GmStream.ReadStr);
  519.     Orientation := TGmOrientation(GmStream.ReadInteger);
  520.     Shadow.Color := GmStream.ReadInteger;
  521.     Shadow.Width := GmStream.ReadInteger;
  522.   finally
  523.     GmStream.Free;
  524.   end;
  525. end;
  526.  
  527. procedure TGmPreview.MessageToControls(AMessage: integer; Param1, Param2: integer);
  528. var
  529.   ICount: integer;
  530.   AComponent: TComponent;
  531. begin
  532.   // broadcast a message to all associated components...
  533.   if (MessagesEnabled) then
  534.   begin
  535.     for ICount := 0 to FRegisteredComponents.Count-1 do
  536.     begin
  537.       AComponent := TComponent(FRegisteredComponents[ICount]);
  538.       if (AComponent is TWinControl) then
  539.         PostMessage((AComponent as TWinControl).Handle, AMessage, Param1, Param2);
  540.     end;
  541.   end;
  542. end;
  543.  
  544. procedure TGmPreview.PageSizeChanged(Sender: TObject);
  545. begin
  546.   FPaperSize := Custom;
  547.   //FPages.PageWidth :=
  548.   UpdatePreview;
  549. end;
  550.  
  551. procedure TGmPreview.HeaderFooterChanged(Sender: TObject);
  552. begin
  553.   FPages.UpdateAll;
  554.   UpdatePreview;
  555. end;
  556.  
  557. procedure TGmPreview.PageChanged;
  558. begin
  559.   if Assigned(FOnPageChange) then FOnPageChange(Self, FCurrentPage);
  560.   MessageToControls(GM_PAGE_CHANGED, 0, 0);
  561. end;
  562.  
  563. procedure TGmPreview.SetCoordsRelative(const AValue: TGmCoordsRelative);
  564. begin
  565.   if AValue <> FCoordsRelativeTo then
  566.   begin
  567.     FCoordsRelativeTo := AValue;
  568.     case AValue of
  569.       fromPage          : FCanvas.SetDrawingOffset(0,0);
  570.       fromPrinterMargins: FCanvas.SetDrawingOffset(FPrinter.PrinterMargins.Left.AsInches,
  571.                                                    FPrinter.PrinterMargins.Top.AsInches);
  572.       fromUserMargins   : FCanvas.SetDrawingOffset(FMargins.Left.AsInches,
  573.                                                    FMargins.Top.AsInches);
  574.       fromHeaderLine    : FCanvas.SetDrawingOffset(FMargins.Left.AsInches,
  575.                                                    FMargins.Top.AsInches + FHeader.Height.AsInches);
  576.     end;
  577.   end;
  578. end;
  579.  
  580. procedure TGmPreview.SetCurrentPage(AValue: integer);
  581. begin
  582.   if (FCurrentPage <> AValue) or (AValue = -1) then
  583.   begin
  584.     if Assigned(FOnPageChanging) then FOnPageChanging(Self, FCurrentPage);
  585.     if AValue <> -1 then FCurrentPage := AValue;
  586.     FCanvas.Page := FPages[FCurrentPage];
  587.     UpdatePreview;
  588.     PageChanged;
  589.   end;
  590. end;
  591.  
  592. procedure TGmPreview.SetGutter(AValue: integer);
  593. begin
  594.   if FGutter <> AValue then
  595.   begin
  596.     FGutter := AValue;
  597.     FPaperImage.Gutter := AValue;
  598.     UpdatePreview;
  599.   end;
  600. end;
  601.  
  602. procedure TGmPreview.SetMaxZoom(const AValue: integer);
  603. begin
  604.   if AValue = FMaxZoom then Exit;
  605.   if AValue > FMinZoom then
  606.     FMaxZoom := AValue
  607.   else
  608.     FMaxZoom := FMinZoom;
  609. end;
  610.  
  611. procedure TGmPreview.SetMessagesEnabled(const AValue: Boolean);
  612. begin
  613.   if AValue then Dec(FUpdateCount) else Inc(FUpdateCount);
  614. end;
  615.  
  616. procedure TGmPreview.SetMinZoom(const AValue: integer);
  617. begin
  618.   if AValue = FMinZoom then Exit;
  619.   if AValue < FMaxZoom then
  620.     FMinZoom := AValue
  621.   else
  622.     FMinZoom := FMaxZoom;
  623. end;
  624.  
  625. procedure TGmPreview.SetOrientation(AValue: TGmOrientation);
  626. var
  627.   SavePaperSize: TGmPaperSize;
  628. begin
  629.   if AValue <> FOrientation then
  630.   begin
  631.     SavePaperSize := FPaperSize;
  632.     try
  633.       FOrientation := AValue;
  634.       FPages.Orientation := FOrientation;
  635.     finally
  636.       FPaperSize := SavePaperSize;
  637.       MessageToControls(GM_ORIENTATION_CHANGED, 0, 0);
  638.       if Assigned(FOnChangeOrientation) then FOnChangeOrientation(Self);
  639.     end;
  640.   end;
  641. end;
  642.  
  643. procedure TGmPreview.SetPagesPerSheet(AValue: TGmPagesPerSheet);
  644. begin
  645.   if FPagesPerSheet <> AValue then
  646.   begin
  647.     FPagesPerSheet := AValue;
  648.     MessageToControls(GM_MULTIPAGE_CHANGED, 0, 0);
  649.   end;
  650. end;
  651.  
  652. procedure TGmPreview.SetPaperSize(AValue: TGmPaperSize);
  653. var
  654.   ASize: TGmSize;
  655. begin
  656.   try
  657.     if AValue = Custom then Exit;
  658.     if (FPaperSize <> AValue) then
  659.     begin
  660.       ASize := GetPaperDimensions(AValue);
  661.       //FPages.PageHeight.AsInches := ASize.Height;
  662.       //FPages.PageWidth.AsInches := ASize.Width;
  663.       FPages.PaperSize := AValue;
  664.     end;
  665.   finally
  666.     FPaperSize := AValue;
  667.     if Assigned(FOnPageSizeChange) then FOnPageSizeChange(Self);
  668.   end;
  669. end;
  670.  
  671. procedure TGmPreview.SetPrintCopies(AValue: integer);
  672. begin
  673.   FPrinter.PrintCopies := AValue;
  674. end;
  675.  
  676. procedure TGmPreview.SetTitle(ATitle: string);
  677. begin
  678.   GmPrinter.Title := ATitle;
  679. end;
  680.  
  681. procedure TGmPreview.SetZoom(AValue: integer);
  682. begin
  683.   if AValue < 5 then AValue := 5;
  684.   if FZoom <> AValue then
  685.   begin
  686.     FZoom := AValue;
  687.     UpdatePreview;
  688.   end;
  689. end;
  690.  
  691. procedure TGmPreview.CanvasChanged(Sender: TObject);
  692. begin
  693.   if Assigned(FOnCanvasChange) then FOnCanvasChange(Self);
  694. end;
  695.  
  696. procedure TGmPreview.MarginsChanged(Sender: TObject);
  697. begin
  698.   if Assigned(FOnMarginsChange) then FOnMarginsChange(Self);
  699. end;
  700.  
  701. procedure TGmPreview.PrinterChanged(Sender: TObject);
  702. begin
  703.   MessageToControls(GM_PRINTER_CHANGED, 0, 0);
  704.   if Assigned(FOnChangePrinter) then FOnChangePrinter(Self);
  705. end;
  706.  
  707. procedure TGmPreview.PageOrientationChanged(Sender: TObject; APageNum: integer; AOrientation: TGmOrientation);
  708. begin
  709.   if Assigned(FOnChangePageOrientation) then FOnChangePageOrientation(Sender, APageNum, AOrientation);
  710. end;
  711.  
  712. procedure TGmPreview.UpdatePreview;
  713. var
  714.   ATop, ALeft: integer;
  715.   SX, SY: integer;
  716.   PW, PH: integer;
  717.   PageChanged: Boolean;
  718. begin
  719.   if IsUpdating then Exit;
  720.   PageChanged := Pages[FCurrentPage].RedrawPage;
  721.   FPaperImage.Page := Pages[FCurrentPage];
  722.   SX := HorzScrollBar.Position;
  723.   SY := VertScrollBar.Position;
  724.   ATop := 0;
  725.   ALeft := 0;
  726.   FPaperImage.Zoom := FZoom;
  727.   FPaperImage.PaperSize := FPaperSize;
  728.   PW := Round(GetScale * (Pages[FCurrentPage].PageSize.Width.AsInches * SCREEN_PPI));
  729.   PH := Round(GetScale * (Pages[FCurrentPage].PageSize.Height.AsInches * SCREEN_PPI));
  730.   if (PW + (2*FGutter)) < Width then ALeft := (Width div 2)  - ((PW + (2*FGutter)) div 2);
  731.   if (PH + (2*FGutter)) < Height then ATop := (Height div 2) - ((PH + (2*FGutter)) div 2);
  732.   FPaperImage.SetBounds(ALeft-SX, ATop-SY, PW + (2*FGutter), PH + (2*FGutter));
  733.   Invalidate;
  734.   if PageChanged then MessageToControls(GM_PREVIEW_UPDATED, 0, 0);
  735. end;
  736.  
  737. procedure TGmPreview.UsePrinterPageSize;
  738. begin
  739.   BeginUpdate;
  740.   try
  741.     Orientation := AsGmOrientation(GmPrinter.Orientation);
  742.     PageHeight.AsInches := GmPrinter.PrinterHeight.AsInches;
  743.     PageWidth.AsInches  := GmPrinter.PrinterWidth.AsInches;
  744.     FPaperSize := GmPrinter.PrinterPaperSize;
  745.   finally
  746.     EndUpdate;
  747.   end;
  748. end;
  749.  
  750. procedure TGmPreview.ZoomIn;
  751. var
  752.   APercents: TGmPoint;
  753. begin
  754.   // zoom in...
  755.   if FMouseOver then SetCursor(gmZoomIn);
  756.   APercents := GetScrollbarPercents;
  757.   case FZoomStyle of
  758.     gmFixedZoom   : Zoom := Zoom + FZoomIncrement;
  759.     gmVariableZoom: Zoom := Zoom + (Zoom div 2);
  760.   end;
  761.   ScrollToPosition(APercents.x, APercents.y);
  762. end;
  763.  
  764. procedure TGmPreview.ZoomOut;
  765. var
  766.   APercents: TGmPoint;
  767. begin
  768.   // zoom out...
  769.   if FMouseOver then SetCursor(gmZoomOut);
  770.   APercents := GetScrollbarPercents;
  771.   case FZoomStyle of
  772.     gmFixedZoom   : Zoom := Zoom - FZoomIncrement;
  773.     gmVariableZoom: Zoom := Zoom - (Zoom div 2);
  774.   end;
  775.   ScrollToPosition(APercents.x, APercents.y);
  776. end;
  777.  
  778. //------------------------------------------------------------------------------
  779.  
  780. // *** Protected functions ***
  781.  
  782. procedure TGmPreview.CMMouseEnter (var Message: TMessage);
  783. begin
  784.   FMouseOver := True;
  785. end;
  786.  
  787. procedure TGmPreview.CMMouseLeave (var Message: TMessage);
  788. begin
  789.   // stop panning when the mouse leaves the preview...
  790.   FMouseOver := False;
  791.   if FPanning then StopPanning;
  792. end;
  793.  
  794. procedure TGmPreview.CreateParams(var Params: TCreateParams);
  795. const
  796.   BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER);
  797. begin
  798.   inherited CreateParams(Params);
  799.   with Params do
  800.   begin
  801.     Style := Style or BorderStyles[FBorderStyle];
  802.     if NewStyleControls and Ctl3D and (FBorderStyle = bsSingle) then
  803.     begin
  804.       Style := Style and not WS_BORDER;
  805.       ExStyle := ExStyle or WS_EX_CLIENTEDGE;
  806.     end;
  807.   end;
  808. end;
  809.  
  810. procedure TGmPreview.DoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
  811. begin
  812.   if Assigned(OnMouseDown) then
  813.     OnMouseDown(Sender, Button, Shift, X + FPaperImage.Left, Y + FPaperImage.Top);
  814. end;
  815.  
  816. procedure TGmPreview.DoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
  817. begin
  818.   MouseMove(Shift, X + FPaperImage.Left, Y + FPaperImage.Top);
  819.   if Assigned(OnMouseMove) then
  820.     OnMouseMove(Sender, Shift, X + FPaperImage.Left, Y + FPaperImage.Top);
  821. end;
  822.  
  823. procedure TGmPreview.DoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
  824. begin
  825.   if Assigned(OnMouseUp) then
  826.     OnMouseUp(Sender, Button, Shift, X + FPaperImage.Left, Y + FPaperImage.Top);
  827. end;
  828.  
  829. procedure TGmPreview.DoPageDragDrop(Sender, Source: TObject; X, Y: TGmValue);
  830. begin
  831.   if Assigned(FOnPageDragDrop) then FOnPageDragDrop(Self, Source, X, Y);
  832. end;
  833.  
  834. procedure TGmPreview.DoPageDragOver(Sender, Source: TObject; X, Y: TGmValue; State: TDragState; var Accept: Boolean);
  835. begin
  836.   if Assigned(FOnPageDragOver) then FOnPageDragOver(Self, Source, X, Y, State, Accept);
  837. end;
  838.  
  839. procedure TGmPreview.DoPageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: TGmValue);
  840. begin
  841.   if Assigned(FOnPageMouseDown) then FOnPageMouseDown(Self, Button, Shift, X, Y);
  842. end;
  843.  
  844. procedure TGmPreview.DoPageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: TGmValue);
  845. begin
  846.   if Assigned(FOnPageMouseMove) then FOnPageMouseMove(Self, Shift, X, Y);
  847. end;
  848.  
  849. procedure TGmPreview.DoPageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: TGmValue);
  850. begin
  851.   if Assigned(FOnPageMouseUp) then FOnPageMouseUp(Self, Button, Shift, X, Y);
  852. end;
  853.  
  854. procedure TGmPreview.MouseMove(Shift: TShiftState; X, Y: integer);
  855. begin
  856.   // scroll the page (panning) if this option is selected...
  857.   FMousePos.X := X;
  858.   FMousePos.Y := Y;
  859.   if FPanning then
  860.   begin
  861.     HorzScrollBar.Position := FPanningXYStart.X - FMousePos.X;
  862.     VertScrollBar.Position := FPanningXYStart.Y - FMousePos.Y;
  863.   end;
  864.   inherited MouseMove(Shift, X, Y);
  865. end;
  866.  
  867. procedure TGmPreview.PreviewResize(var Message: TMessage);
  868. begin
  869.   inherited;
  870.   UpdatePreview;
  871. end;   
  872.  
  873. procedure TGmPreview.WMNCHitTest(var Message: TMessage);
  874. begin
  875.   DefaultHandler(Message);
  876. end;
  877.  
  878. procedure TGmPreview.ChangeDrawingDpi(var Message: TMessage);
  879. begin
  880.   DRAWING_DPI := Message.WParam;
  881. end;
  882.  
  883. procedure TGmPreview.DefaultDrawingDpi(var Message: TMessage);
  884. begin
  885.   DRAWING_DPI := DEFAULT_DRAW_DPI;
  886. end;
  887.  
  888. //------------------------------------------------------------------------------
  889.  
  890. // *** Public functions ***
  891.  
  892. function TGmPreview.GetFileVersion(AFileName: string): Extended;
  893. var
  894.   AStream: TFileStream;
  895. begin
  896.   // return the version of a TGmPreview which created the file referenced by
  897.   // the AFileName paramater...
  898.   Result := -1;
  899.   AStream := TFileStream.Create(AFileName, fmOpenRead);
  900.   try
  901.     try
  902.       AStream.Read(Result, SizeOf(Result));
  903.     except
  904.       ShowGmError(Self, CANT_READ_VERSION);
  905.     end;
  906.   finally
  907.     AStream.Free;
  908.   end;
  909. end;
  910.  
  911. function TGmPreview.NewPage: TGmPage;
  912. begin
  913.   Result := FPages.AddPage;
  914.   FCanvas.Page := Result;
  915.   if IsUpdating = False then LastPage;
  916.   FCurrentPage := NumPages;
  917.   if Assigned(FOnNewPage) then FOnNewPage(Self);
  918.   MessageToControls(GM_NUMPAGES_CHANGED, 0, 0);
  919. end;
  920.  
  921. function TGmPreview.PaperSizeToStr(APaperSize: TGmPaperSize): string;
  922. begin
  923.   case APaperSize of
  924.     A3    : Result := C_A3;
  925.     A4    : Result := C_A4;
  926.     A5    : Result := C_A5;
  927.     A6    : Result := C_A6;
  928.     B5    : Result := C_B5;
  929.     C5    : Result := C_C5;
  930.     Legal : Result := C_Legal;
  931.     Letter: Result := C_Letter;
  932.   else
  933.     Result := C_CUSTOM;
  934.   end;
  935. end;
  936.  
  937. function TGmPreview.Tokenize(AText: string; APage: integer): string;
  938. var
  939.   tokenPosition: integer;
  940. begin
  941.   Result := AText;
  942.   // search and replace the {DATE} token...
  943.   while Pos('{DATE}', Result) <> 0 do
  944.   begin
  945.     tokenPosition := Pos('{DATE}', Result);
  946.     Delete(Result, tokenPosition, 6);
  947.     Insert(FormatDateTime('dd-mmm-yyyy',Date), Result, tokenPosition);
  948.   end;
  949.  
  950.   // search and replace the {TIME} token...
  951.   while Pos('{TIME}', Result) <> 0 do
  952.   begin
  953.     tokenPosition := Pos('{TIME}', Result);
  954.     Delete(Result, tokenPosition, 6);
  955.     Insert(FormatDateTime('hh:nn',Time), Result, tokenPosition);
  956.   end;
  957.  
  958.   // search and replace the {PAGE} token...
  959.   while Pos('{PAGE}', Result) <> 0 do
  960.   begin
  961.     tokenPosition := Pos('{PAGE}', Result);
  962.     Delete(Result, tokenPosition, 6);
  963.     Insert(IntToStr(APage), Result, tokenPosition);
  964.   end;
  965.  
  966.   // search and replace the {NUMPAGES} token...
  967.   while Pos('{NUMPAGES}', Result) <> 0 do
  968.   begin
  969.     tokenPosition := Pos('{NUMPAGES}', Result);
  970.     Delete(Result, tokenPosition, 10);
  971.     Insert(IntToStr(NumPages), Result, tokenPosition);
  972.   end;
  973. end;
  974.  
  975. procedure TGmPreview.AddAssociatedComponent(AComponent: TComponent);
  976. begin
  977.   if FRegisteredComponents.IndexOf(AComponent) = -1 then
  978.     FRegisteredComponents.Add(AComponent);
  979. end;
  980.  
  981. procedure TGmPreview.RemoveAssociatedComponent(AComponent: TComponent);
  982. begin
  983.   if FRegisteredComponents.IndexOf(AComponent) <> -1 then
  984.     FRegisteredComponents.Delete(FRegisteredComponents.IndexOf(AComponent));
  985. end;
  986.  
  987. procedure TGmPreview.Assign(Source: TPersistent);
  988. var
  989.   APreview: TGmPreview;
  990. begin
  991.   // assign all objects and properties...
  992.   APreview := (Source as TGmPreview);
  993.   Dec(FUpdateCount);
  994.   try
  995.     FHeader.Assign(APreview.FHeader);
  996.     FFooter.Assign(APreview.FFooter);
  997.     FMargins.Assign(APreview.FMargins);
  998.     FPrinter.Assign(APreview.FPrinter);
  999.     FPaperSize := APreview.FPaperSize;
  1000.     FOrientation := APreview.FOrientation;
  1001.     FPages.Assign(APreview.FPages);
  1002.     FPagesPerSheet := APreview.FPagesPerSheet;
  1003.     FShadow.Assign(APreview.FShadow);
  1004.     PageWidth.Assign(APreview.PageWidth);
  1005.     PageHeight.Assign(APreview.PageHeight);
  1006.     FCurrentPage := -1;
  1007.   finally
  1008.     Inc(FUpdateCount);
  1009.     CurrentPage := APreview.CurrentPage;
  1010.   end;
  1011. end;
  1012.  
  1013. procedure TGmPreview.BeginUpdate;
  1014. begin
  1015.   Inc(FUpdateCount);
  1016.   FTempInt := NumPages;
  1017.   FPaperImage.Enabled := False;
  1018.   ForceMessageToControls(GM_PREVIEW_BEGINUPDATE, 0, 0);
  1019. end;
  1020.  
  1021. procedure TGmPreview.CenterOnClick(x, y: integer);
  1022. begin
  1023.   ShowGmMessage(Self, '"TGmPreview.CenterOnClick"'+#13+#13+PRO_VERSION_ONLY);
  1024. end;
  1025.  
  1026. procedure TGmPreview.Clear;
  1027. var
  1028.   ICount: integer;
  1029. begin
  1030.   FCurrentPage := 1;
  1031.   for ICount := FPages.Count downto 1 do
  1032.   begin
  1033.     if ICount > 1 then FPages.DeletePage(ICount)
  1034.     else
  1035.       FPages.Page[ICount].Clear;
  1036.   end;
  1037.   FCanvas.Page := Pages[FCurrentPage];
  1038.   UpdatePreview;
  1039.   if Assigned(FOnClear) then FOnClear(Self);
  1040.   MessageToControls(GM_PREVIEW_CLEARED, 0, 0);
  1041. end;
  1042.  
  1043. procedure TGmPreview.DeleteCurrentPage;
  1044. begin
  1045.   DeletePage(FCurrentPage);
  1046.   UpdatePreview;
  1047. end;
  1048.  
  1049. procedure TGmPreview.DeletePage(index: integer);
  1050. begin
  1051.   if (CurrentPage = NumPages) and (NumPages > 1) then
  1052.   begin
  1053.     FCurrentPage := FCurrentPage-1;
  1054.   end;
  1055.   if (index = 1) and (NumPages = 1) then
  1056.     FPages[index].Clear
  1057.   else
  1058.     FPages.DeletePage(index);
  1059.   SetCurrentPage(-1);
  1060.   MessageToControls(GM_NUMPAGES_CHANGED, 0, 0);
  1061.   if Assigned(FOnDeletePage) then FOnDeletePage(Self);
  1062. end;
  1063.  
  1064. procedure TGmPreview.EndUpdate;
  1065. begin
  1066.   Dec(FUpdateCount);
  1067.   if not IsUpdating then
  1068.   begin
  1069.     FPaperImage.Enabled := True;
  1070.     UpdatePreview;
  1071.     ForceMessageToControls(GM_PREVIEW_ENDUPDATE, 0, 0);
  1072.   end;
  1073.   if FTempInt <> NumPages then PageChanged;
  1074. end;
  1075.  
  1076. procedure TGmPreview.FindText(AText: string; CaseSensative: Boolean; AList: TList);
  1077. begin
  1078.     ShowGmMessage(Self, '"TGmPreview.FindText"'+#13+#13+PRO_VERSION_ONLY);
  1079. end;
  1080.  
  1081. procedure TGmPreview.FirstPage;
  1082. begin
  1083.   if CurrentPage > 1 then
  1084.     CurrentPage := 1;
  1085. end;
  1086.  
  1087. procedure TGmPreview.FitHeight;
  1088. begin
  1089.   ShowGmMessage(Self, '"TGmPreview.FitHeight"'+#13+#13+PRO_VERSION_ONLY);
  1090. end;
  1091.  
  1092. procedure TGmPreview.FitWidth;
  1093. begin
  1094.   ShowGmMessage(Self, '"TGmPreview.FitWidth"'+#13+#13+PRO_VERSION_ONLY);
  1095. end;
  1096.  
  1097. procedure TGmPreview.FitWholePage;
  1098. begin
  1099.   ShowGmMessage(Self, '"TGmPreview.FitWholePage"'+#13+#13+PRO_VERSION_ONLY);
  1100.  
  1101. end;
  1102.  
  1103. procedure TGmPreview.LastPage;
  1104. begin
  1105.   if CurrentPage < NumPages then
  1106.     CurrentPage := NumPages;
  1107. end;
  1108.  
  1109. procedure TGmPreview.LoadFromStream(AStream: TStream);
  1110. var
  1111.   AFileVersion: Extended;
  1112.   GmStream: TGmExtStream;
  1113.   ICount: integer;
  1114.   LoadFile: Boolean;
  1115.   ANumberPages: integer;
  1116. begin
  1117.   // load the TGmPreview from a Stream...
  1118.   BeginUpdate;
  1119.   AStream.ReadBuffer(AFileVersion, SizeOf(AFileVersion));
  1120.   GmStream := TGmExtStream.Create;
  1121.   try
  1122.     Clear;
  1123.     if Assigned(FBeforeReadStream) then FBeforeReadStream(Self, GmStream);
  1124.     GmStream.LoadFromStream(AStream);
  1125.     LoadFile := True;
  1126.     if Assigned(FBeforeLoad) then FBeforeLoad(Self, AFileVersion, LoadFile);
  1127.     if LoadFile = False then Exit;
  1128.     LoadDocInfoFromStream(GmStream, ANumberPages);
  1129.     LoadPageSetupFromStream(GmStream);
  1130.     Margins.LoadFromStream(GmStream);
  1131.     FHeader.LoadFromStream(GmStream);
  1132.     Footer.LoadFromStream(GmStream);
  1133.  
  1134.     for ICount := 1 to ANumberPages do
  1135.       if ICount <> 1 then NewPage;
  1136.       // now load the pages...
  1137.     for ICount := 1 to ANumberPages do
  1138.     begin
  1139.       Pages[ICount].LoadFromStream(AFileVersion, GmStream);
  1140.       if Assigned(FOnLoadProgress) then FOnLoadProgress(Self, (ICount/NumPages)*100);
  1141.     end;
  1142.   finally
  1143.     GmStream.Free;
  1144.     EndUpdate;
  1145.   end;
  1146. end;
  1147.  
  1148. procedure TGmPreview.LoadFromFile(AFilename: string);
  1149. var
  1150.   AFileStream: TFileStream;
  1151.   AFileVersion: Extended;
  1152. begin
  1153.   // load a TGmPreview file...
  1154.   AFileStream := TFileStream.Create(AFileName, fmOpenRead);
  1155.   try
  1156.     AFileStream.Read(AFileVersion, SizeOf(AFileVersion));
  1157.     AFileStream.Seek(0, soFromBeginning);
  1158.     LoadFromStream(AFileStream);
  1159.   finally
  1160.     AFileStream.Free;
  1161.   end;
  1162. end;
  1163.  
  1164. procedure TGmPreview.NextPage;
  1165. begin
  1166.   if CurrentPage < NumPages then
  1167.     CurrentPage := CurrentPage + 1;
  1168. end;
  1169.  
  1170. procedure TGmPreview.PrevPage;
  1171. begin
  1172.   if CurrentPage > 1 then
  1173.     CurrentPage := CurrentPage -1;
  1174. end;
  1175.  
  1176. procedure TGmPreview.Print;
  1177. begin
  1178.   PrintRange(1, NumPages);
  1179. end;
  1180.  
  1181. procedure TGmPreview.PrintCurrentPage;
  1182. begin
  1183.   PrintRange(FCurrentPage, FCurrentPage);
  1184. end;
  1185.  
  1186. procedure TGmPreview.PrintRange(APageFrom, APageTo: integer);
  1187. var
  1188.   APage: TGmPage;
  1189.   ICount: integer;
  1190.   AStartPage,
  1191.   AEndPage: integer;
  1192.   ACopies: integer;
  1193. begin
  1194.   if Assigned(FPrinter.PrintDialog) then ;
  1195.  
  1196.  
  1197.   if GetOrientationType = gmMixedOrientation then
  1198.     FPrinter.PagesPerSheet := gmOnePage
  1199.   else
  1200.     FPrinter.PagesPerSheet := FPagesPerSheet;
  1201.  
  1202.   FPrinter.Orientation := AsPrinterOrientation(FPages[1].Orientation);
  1203.  
  1204.   if Assigned(FBeforePrint) then FBeforePrint(Self);
  1205.  
  1206.  
  1207.   FPrinter.BeginDoc;
  1208.  
  1209.   if not FPrinter.Printing then Exit;
  1210.   try
  1211.     if FReversePrintOrder then
  1212.     begin
  1213.       AStartPage := APageTo;
  1214.       AEndPage := APageFrom-1;
  1215.     end
  1216.     else
  1217.     begin
  1218.       AStartPage := APageFrom;
  1219.       AEndPage := APageTo+1;
  1220.     end;
  1221.     
  1222.     for ACopies := 1 to PrintCopies do
  1223.     begin
  1224.       ICount := AStartPage;
  1225.       while (ICount <> AEndPage) do
  1226.       begin
  1227.         APage := Pages[ICount];
  1228.         if Assigned(FBeforePrintPage) then FBeforePrintPage(Self, APage, FPrinter.Handle);
  1229.         if Assigned(FOnPrintPage) then FOnPrintPage(Self, APage, FPrinter.Handle);
  1230.         APage.Print(FPrinter);
  1231.  
  1232.         if Assigned(FAfterPrintPage) then FAfterPrintPage(Self, APage, FPrinter.Handle);
  1233.  
  1234.         if ICount < APageTo then
  1235.           FPrinter.NewPage(Pages[ICount+1].Orientation);
  1236.         Application.ProcessMessages;
  1237.         if FPrinter.Aborted then Exit;
  1238.         if Assigned(FOnPrintProgress) then FOnPrintProgress(Self, ICount, (APageTo - APageFrom));
  1239.  
  1240.         if FReversePrintOrder then Dec(ICount) else Inc(ICount);
  1241.         if (ICount < 1) or (ICount > NumPages) then Exit;
  1242.       end;
  1243.     end;
  1244.   finally
  1245.     if not FPrinter.Aborted then
  1246.     begin
  1247.       FPrinter.EndDoc;
  1248.       if Assigned(FAfterPrint) then FAfterPrint(Self);
  1249.     end
  1250.     else
  1251.       if Assigned(FOnAbortPrint) then FOnAbortPrint(Self);
  1252.   end;
  1253. end;
  1254.  
  1255. procedure TGmPreview.PrintToFile(AFileName: string);
  1256. begin
  1257.   FPrinter.FileName := AFileName;
  1258.   try
  1259.     Print;
  1260.   finally
  1261.     FPrinter.FileName := '';
  1262.   end;
  1263. end;
  1264.  
  1265. procedure TGmPreview.SaveDocInfoToStream(AStream: TStream);
  1266. var
  1267.   GmStream: TGmExtStream;
  1268. begin
  1269.   GmStream := TGmExtStream.Create;
  1270.   try
  1271.     // the two following values aren't used yet... but I thought they may be
  1272.     // needed at a later time.
  1273.     GmStream.WriteDateTime(Now);
  1274.     GmStream.WriteInteger(NumPages);
  1275.   finally
  1276.     GmStream.SaveToStream(AStream);
  1277.     GmStream.Free;
  1278.   end;
  1279. end;
  1280.  
  1281. procedure TGmPreview.SavePageSetupToStream(AStream: TStream);
  1282. var
  1283.   GmStream: TGmExtStream;
  1284. begin
  1285.   GmStream := TGmExtStream.Create;
  1286.   try
  1287.     GmStream.WriteInteger(FPages.PageWidth.AsUnits);
  1288.     GmStream.WriteInteger(FPages.PageHeight.AsUnits);
  1289.     GmStream.WriteStr(PaperSizeToStr(FPaperSize));
  1290.     GmStream.WriteInteger(Ord(Orientation));
  1291.     GmStream.WriteInteger(Shadow.Color);
  1292.     GmStream.WriteInteger(Shadow.Width);
  1293.   finally
  1294.     GmStream.SaveToStream(AStream);
  1295.     GmStream.Free;
  1296.   end;
  1297. end;
  1298.  
  1299. procedure TGmPreview.SaveToFile(AFilename: string);
  1300. var
  1301.   AFileStream: TFileStream;
  1302. begin
  1303.   // Save the TGmPreview pages to a file...
  1304.   AFileStream := TFileStream.Create(AFileName, fmCreate);
  1305.   try
  1306.     SaveToStream(AFileStream);
  1307.   finally
  1308.     AFileStream.Free;
  1309.   end;
  1310. end;
  1311.  
  1312. procedure TGmPreview.SaveToStream(AStream: TStream);
  1313. var
  1314.   GmStream: TGmExtStream;
  1315.   ICount: integer;
  1316.   AVersion: Extended;
  1317. begin
  1318.   // Save the TGmPreview to a stream...
  1319.   AVersion := SUITE_VERSION;
  1320.   AStream.WriteBuffer(AVersion, SizeOf(AVersion));
  1321.   GmStream := TGmExtStream.Create;
  1322.   try
  1323.     SaveDocInfoToStream(GmStream);
  1324.     SavePageSetupToStream(GmStream);
  1325.     Margins.SaveToStream(GmStream);
  1326.  
  1327.     FHeader.SaveToStream(GmStream);
  1328.     FFooter.SaveToStream(GmStream);
  1329.     for ICount := 1 to NumPages do
  1330.     begin
  1331.       FPages.Page[ICount].SaveToStream(GmStream);
  1332.       if Assigned(FOnSaveProgress) then FOnSaveProgress(Self, (ICount/NumPages)*100);
  1333.     end;
  1334.   finally
  1335.     if Assigned(FBeforeWriteStream) then FBeforeWriteStream(Self, GmStream);
  1336.     GmStream.SaveToStream(AStream);
  1337.     GmStream.Free;
  1338.   end;
  1339. end;
  1340.  
  1341. procedure TGmPreview.ScrollToPosition(XPercent, YPercent: Extended);
  1342. begin
  1343.   HorzScrollBar.Position := Round((XPercent/100) * (HorzScrollBar.Range-ClientWidth));
  1344.   VertScrollBar.Position := Round((YPercent/100) * (VertScrollBar.Range-ClientHeight));
  1345. end;
  1346.  
  1347. procedure TGmPreview.SetCursor(ACursor: TGmCursor);
  1348. begin
  1349.   // change the preview page cursor...
  1350.   case ACursor of
  1351.     gmDefault   : Cursor := crDefault;
  1352.     gmZoomIn    : Cursor := crZoomIn;
  1353.     gmZoomOut   : Cursor := crZoomOut;
  1354.   end;
  1355. end;
  1356.  
  1357. procedure TGmPreview.SetPageSize(AWidth, AHeight: Extended; AUnits: TGmMeasurement);
  1358. begin
  1359.   PageHeight.AsGmValue[AUnits] := AHeight;
  1360.   PageWidth.AsGmValue[AUnits] := AWidth;
  1361. end;
  1362.  
  1363. procedure TGmPreview.StartPanning;
  1364. begin
  1365.   // start the panning of the page...
  1366.   ShowGmMessage(Self, '"TGmPreview.StartPanning"'+#13+#13+PRO_VERSION_ONLY);
  1367. end;
  1368.  
  1369. procedure TGmPreview.StopPanning;
  1370. begin
  1371.   // stop the page panning...
  1372.   ShowGmMessage(Self, '"TGmPreview.FitWidth"'+#13+#13+PRO_VERSION_ONLY);
  1373. end;
  1374.  
  1375. end.
  1376.