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

  1. {******************************************************************************}
  2. {                                                                              }
  3. {                       GmMultipageImage.pas v2.61 Pro                         }
  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 GmMultipageImage;
  14.  
  15. interface
  16.  
  17. uses
  18.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  19.   GmPreview, Buttons, GmTypes, GmConst;
  20.  
  21.   {$I GMPS.INC}
  22.  
  23. type
  24.   TGmMultiPrintPage = class(TGmPaperImage)
  25.   private
  26.     FOrientation: TGmOrientation;
  27.     FPagesPerSheet: TGmPagesPerSheet;
  28.     FShowHeaderFooter: Boolean;
  29.     procedure SetPagesPerSheet(APagesPerSheet: TGmPagesPerSheet);
  30.     procedure DrawHeaderFooter(Canvas: TCanvas; AArea: TRect; Border: integer);
  31.   protected
  32.     procedure Paint; override;
  33.   public
  34.     constructor Create(AOwner: TComponent); override;
  35.     destructor Destroy; override;
  36.     property PagesPerSheet: TGmPagesPerSheet read FPagesPerSheet write SetPagesPerSheet default gmFourPage;
  37.   end;
  38.  
  39.  
  40.   TGmMultipageImage = class(TWinControl)
  41.   private
  42.     FBorderStyle: TBorderStyle;
  43.     FBtnOnePage : TSpeedButton;
  44.     FBtnTwoPage : TSpeedButton;
  45.     FBtnFourPage: TSpeedButton;
  46.     FPagesPerSheet: TGmPagesPerSheet;
  47.     FPreview: TGmPreview;
  48.     FPageImage: TGmMultiPrintPage;
  49.     FShowButtons: Boolean;
  50.     FShowHeaderFooter: Boolean;
  51.     // events...
  52.     FOnClickOnePage : TNotifyEvent;
  53.     FOnClickTwoPage : TNotifyEvent;
  54.     FOnClickFourPage: TNotifyEvent;
  55.     FOnChanging: TNotifyEvent;
  56.     function GetAbout: string;
  57.     function GetVersion: Extended;
  58.     procedure SetAbout(const AValue: string);
  59.     procedure BtnClick(Sender: TObject);
  60.     procedure SetPreview(APreview: TGmPreview);
  61.     procedure SetPagesPerSheet(APagesPerSheet: TGmPagesPerSheet);
  62.     procedure SetShadow(AShadow: TGmShadow);
  63.     procedure SetShowButtons(AValue: Boolean);
  64.     procedure SetShowHeaderFooter(AValue: Boolean);
  65.     function GetShadow: TGmShadow;
  66.     procedure SetBorderStyle(const Value: TBorderStyle);
  67.  
  68.     { Private declarations }
  69.   protected
  70.     procedure CreateParams(var Params: TCreateParams); override;
  71.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  72.     // update messages...
  73.     procedure MultiPageChanged(var Message: TMessage); message GM_MULTIPAGE_CHANGED;
  74.     procedure OrientationChanged(var Message: TMessage); message GM_ORIENTATION_CHANGED;
  75.     procedure ComponentResize(var Message: TMessage); message WM_SIZE;
  76.     { Protected declarations }
  77.   public
  78.     constructor Create(AOwner: TComponent); override;
  79.     destructor Destroy; override;
  80.     property Version: Extended read GetVersion;
  81.     { Public declarations }
  82.   published
  83.     property About: string read GetAbout write SetAbout;
  84.     property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
  85.     property Color default clGray;
  86.     property Hint;
  87.     property PagesPerSheet: TGmPagesPerSheet read FPagesPerSheet write SetPagesPerSheet default gmOnePage;
  88.     property ParentColor;
  89.     property Preview: TGmPreview read FPreview write SetPreview;
  90.     property ShowHint;
  91.     property Shadow: TGmShadow read GetShadow write SetShadow;
  92.     property ShowButtons: Boolean read FShowButtons write SetShowButtons default True;
  93.     property ShowHeaderFooter: Boolean read FShowHeaderFooter write SetShowHeaderFooter default True;
  94.     property TabOrder;
  95.     property Visible;
  96.     // enents...
  97.     property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  98.     property OnClickOnePage: TNotifyEvent read FOnClickOnePage write FOnClickOnePage;
  99.     property OnClickTwoPage: TNotifyEvent read FOnClickTwoPage write FOnClickTwoPage;
  100.     property OnClickFourPage: TNotifyEvent read FOnClickFourPage write FOnClickFourPage;
  101.     { Published declarations }
  102.   end;
  103.  
  104. implementation
  105.  
  106. {$R MultiRes.RES}
  107.  
  108. //------------------------------------------------------------------------------
  109.  
  110. constructor TGmMultiPrintPage.Create(AOwner: TComponent);
  111. begin
  112.   inherited Create(AOwner);
  113.   Shadow := TGmShadow.Create;
  114.   Gutter := 5;
  115.   FPagesPerSheet := gmFourPage;
  116. end;
  117.  
  118. destructor TGmMultiPrintPage.Destroy;
  119. begin
  120.   Shadow.Free;
  121.   inherited Destroy;
  122. end;
  123.  
  124. procedure TGmMultiPrintPage.SetPagesPerSheet(APagesPerSheet: TGmPagesPerSheet);
  125. var
  126.   AHeight: integer;
  127.   AWidth: integer;
  128. begin
  129.   if FOrientation = gmPortrait then
  130.   begin
  131.     AHeight := 65;
  132.     AWidth := 50;
  133.   end
  134.   else
  135.   begin
  136.     AHeight := 50;
  137.     AWidth := 65;
  138.   end;
  139.   FPagesPerSheet := APagesPerSheet;
  140.   // resize page...
  141.   if FPagesPerSheet = gmTwoPage then
  142.   begin
  143.     Height := AWidth;
  144.     Width := AHeight;
  145.   end
  146.   else
  147.   begin
  148.     Height := AHeight;
  149.     Width := AWidth;
  150.   end;
  151.   Top := (TWinControl(Owner).Height - Height) div 2;
  152.   Invalidate;
  153. end;
  154.  
  155. procedure TGmMultiPrintPage.DrawHeaderFooter(Canvas: TCanvas; AArea: TRect; Border: integer);
  156. begin
  157.   if FShowHeaderFooter then
  158.   begin
  159.     Canvas.Pen.Color := clSilver;
  160.     Canvas.Pen.Style := psSolid;
  161.     Canvas.Polyline([Point(AArea.Left+Border, AArea.Top+Border+1)   , Point(AArea.Right-Border, AArea.Top+Border+1)]);
  162.     Canvas.Polyline([Point(AArea.Left+Border, AArea.Bottom-Border-1), Point(AArea.Right-Border, AArea.Bottom-Border-1)]);
  163.   end;
  164. end;
  165.  
  166. procedure TGmMultiPrintPage.Paint;
  167. var
  168.   PageArea: TRect;
  169.   PageRects: array[1..4] of TRect;
  170. begin
  171.   // paint the page...
  172.   inherited;
  173.   Canvas.Pen.Style := psSolid;
  174.   PageArea := PageRect;
  175.   if FPagesPerSheet = gmOnePage then
  176.     DrawHeaderFooter(Canvas, PageArea, 6)
  177.   else
  178.   if FPagesPerSheet = gmTwoPage then
  179.   begin
  180.  
  181.     if FOrientation = gmPortrait then
  182.     begin
  183.       PageRects[1] := Rect(PageArea.Left, PageArea.Top, (Width div 2), Height - PageArea.Top);
  184.       PageRects[2] := Rect((Width div 2), PageArea.Top, Width - PageArea.Left, Height - PageArea.Top);
  185.       Canvas.Pen.Color := clGray;
  186.       Canvas.Polyline([Point(PageRects[1].Right, PageRects[1].Top),
  187.                        Point(PageRects[1].Right, PageRects[1].Bottom)]);
  188.     end;
  189.     if FOrientation = gmLandscape then
  190.     begin
  191.       PageRects[1] := Rect(PageArea.Left, PageArea.Top, Width - PageArea.Left, Height div 2);
  192.       PageRects[2] := Rect(PageArea.Left, Height div 2, Width - PageArea.Left, Height - PageArea.Top);
  193.       Canvas.Pen.Color := clGray;
  194.       Canvas.Polyline([Point(PageRects[1].Left+1,PageRects[1].Bottom),
  195.                        Point(PageRects[1].Right-1,PageRects[1].Bottom)]);
  196.     end;
  197.     DrawHeaderFooter(Canvas, PageRects[1], 4);
  198.     DrawHeaderFooter(Canvas, PageRects[2], 4);
  199.   end
  200.   else
  201.   if FPagesPerSheet = gmFourPage then
  202.   begin
  203.     PageRects[1] := Rect(PageArea.Left, PageArea.Top, (Width div 2), Height div 2);
  204.     PageRects[2] := Rect((Width div 2), PageArea.Top, Width - PageArea.Left, Height div 2);
  205.     PageRects[3] := Rect(PageArea.Left, PageRects[1].Bottom, (Width div 2), PageArea.Bottom);
  206.     PageRects[4] := Rect(Width div 2, PageRects[1].Bottom, Width - PageArea.Left, PageArea.Bottom);
  207.     Canvas.Pen.Color := clGray;
  208.     Canvas.Polyline([Point(PageRects[1].Right, PageRects[1].Top),
  209.                      Point(PageRects[1].Right, PageRects[3].Bottom)]);
  210.     Canvas.Polyline([Point(PageRects[1].Left, PageRects[1].Bottom),
  211.                      Point(PageRects[2].Right, PageRects[1].Bottom)]);
  212.     Canvas.Pen.Color := clBlack;
  213.     DrawHeaderFooter(Canvas, PageRects[1], 4);
  214.     DrawHeaderFooter(Canvas, PageRects[2], 4);
  215.     DrawHeaderFooter(Canvas, PageRects[3], 4);
  216.     DrawHeaderFooter(Canvas, PageRects[4], 4);
  217.   end;
  218. end;
  219.  
  220. //------------------------------------------------------------------------------
  221.  
  222.  
  223. constructor TGmMultipageImage.Create(AOwner: TComponent);
  224. begin
  225.   inherited Create(AOwner);
  226.   FBorderStyle := bsSingle;
  227.   Color := clGray;
  228.   Width := 121;
  229.   Height := 89;
  230.   FPageImage := TGmMultiPrintPage.Create(Self);
  231.   FPageImage.FShowHeaderFooter := True;
  232.  
  233.   FShowHeaderFooter := True;
  234.   with FPageImage do
  235.   begin
  236.     Left := 40;
  237.     Width := 45;
  238.     Height := 60;
  239.     Shadow.Width := 2;
  240.     PaperSize := A4;
  241.     Parent := Self;
  242.   end;
  243.   FShowButtons := False;
  244.   PagesPerSheet := gmOnePage;
  245.   SetShowButtons(True);
  246. end;
  247.  
  248. destructor TGmMultipageImage.Destroy;
  249. begin
  250.   if Assigned(FPreview) then FPreview.RemoveAssociatedComponent(Self);
  251.   // free the TGmMultipageImage and destroy...
  252.   if Assigned(FBtnOnePage) then FBtnOnePage.Free;
  253.   if Assigned(FBtnTwoPage) then FBtnTwoPage.Free;
  254.   if Assigned(FBtnFourPage) then FBtnFourPage.Free;
  255.   FPageImage.Free;
  256.   inherited Destroy;
  257. end;
  258.  
  259. function TGmMultipageImage.GetAbout: string;
  260. begin
  261.   Result := Self.ClassName+' v'+FloatToStr(GetVersion);
  262. end;
  263.  
  264. function TGmMultipageImage.GetVersion: Extended;
  265. begin
  266.   Result := SUITE_VERSION;
  267. end;
  268.  
  269. procedure TGmMultipageImage.SetAbout(const AValue: string);
  270. begin
  271.   // does nothing.
  272. end;
  273.  
  274. procedure TGmMultipageImage.CreateParams(var Params: TCreateParams);
  275. const
  276.   BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER);
  277. begin
  278.   inherited CreateParams(Params);
  279.   with Params do
  280.   begin
  281.     Style := Style or BorderStyles[FBorderStyle];
  282.     if NewStyleControls and Ctl3D and (FBorderStyle = bsSingle) then
  283.     begin
  284.       Style := Style and not WS_BORDER;
  285.       ExStyle := ExStyle or WS_EX_CLIENTEDGE;
  286.     end;
  287.   end;
  288. end;
  289.  
  290. procedure TGmMultipageImage.Notification(AComponent: TComponent; Operation: TOperation);
  291. begin
  292.   inherited Notification(AComponent, Operation);
  293.   if (Operation = opRemove) and (AComponent = FPreview) then
  294.     FPreview := nil;
  295. end;
  296.  
  297. procedure TGmMultipageImage.MultiPageChanged(var Message: TMessage);
  298. begin
  299.   if PagesPerSheet <> FPreview.PagesPerSheet then
  300.     PagesPerSheet := FPreview.PagesPerSheet;
  301. end;
  302.  
  303. procedure TGmMultiPageImage.OrientationChanged(var Message: TMessage);
  304. begin
  305.   SetPagesPerSheet(FPagesPerSheet);
  306. end;
  307.  
  308. procedure TGmMultiPageImage.ComponentResize(var Message: TMessage);
  309. begin
  310.   FBtnOnePage.SetBounds((Width div 2) - 44, (Height div 2) - 38, FBtnOnePage.Width, FBtnOnePage.Height);
  311.   FBtnTwoPage.SetBounds((Width div 2) - 44, (Height div 2) - 12, FBtnTwoPage.Width, FBtnTwoPage.Height);
  312.   FBtnFourPage.SetBounds((Width div 2) - 44, (Height div 2) + 14, FBtnFourPage.Width, FBtnFourPage.Height);
  313.   FPageImage.SetBounds((Width div 2) -14, (Height div 2) - 32, FPageImage.Width, FPageImage.Height);
  314. end;
  315.  
  316. procedure TGmMultipageImage.BtnClick(Sender: TObject);
  317. begin
  318.   // call the button events when clicked...
  319.   if Assigned(FOnChanging) then FOnChanging(Self);
  320.  
  321.   if (Sender = FBtnOnePage) and (PagesPerSheet <> gmOnePage) then
  322.   begin
  323.     PagesPerSheet := gmOnePage;
  324.     if Assigned(FOnClickOnePage) then FOnClickOnePage(Self);
  325.   end
  326.   else
  327.   if (Sender = FBtnTwoPage) and (PagesPerSheet <> gmTwoPage) then
  328.   begin
  329.     PagesPerSheet := gmTwoPage;
  330.     if Assigned(FOnClickTwoPage) then FOnClickTwoPage(Self);
  331.   end
  332.   else
  333.   if (Sender = FBtnFourPage) and (PagesPerSheet <> gmFourPage) then
  334.   begin
  335.     PagesPerSheet := gmFourPage;
  336.     if Assigned(FOnClickFourPage) then FOnClickFourPage(Self);
  337.   end;
  338. end;
  339.  
  340. procedure TGmMultiPageImage.SetPreview(APreview: TGmPreview);
  341. begin
  342.   // assign the preview property to a TGmPreview component...
  343.   if Assigned(FPreview) then FPreview.RemoveAssociatedComponent(Self);
  344.   FPreview := APreview;
  345.   if Assigned(FPreview) then
  346.   begin
  347.     FPreview.AddAssociatedComponent(Self);
  348.     PagesPerSheet := FPreview.PagesPerSheet;
  349.   end;
  350. end;
  351.  
  352. procedure TGmMultipageImage.SetPagesPerSheet(APagesPerSheet: TGmPagesPerSheet);
  353. begin
  354.   FPagesPerSheet := APagesPerSheet;
  355.   if Assigned(FPreview) then FPageImage.FOrientation := FPreview.Orientation;
  356.   FPageImage.PagesPerSheet := APagesPerSheet;
  357.   // select the correct button...
  358.   if FShowButtons then
  359.   begin
  360.     FBtnOnePage.Down  := APagesPerSheet = gmOnePage;
  361.     FBtnTwoPage.Down  := APagesPerSheet = gmTwoPage;
  362.     FBtnFourPage.Down := APagesPerSheet = gmFourPage;
  363.   end;  
  364.   if Assigned(FPreview) then FPreview.PagesPerSheet := APagesPerSheet;
  365.   Invalidate;
  366. end;
  367.  
  368. procedure TGmMultipageImage.SetShadow(AShadow: TGmShadow);
  369. begin
  370.   // set the shaow for the page image...
  371.   FPageImage.Shadow := AShadow;
  372.   FPageImage.Invalidate;
  373. end;
  374.  
  375. procedure TGmMultipageImage.SetShowButtons(AValue: Boolean);
  376. begin
  377.   // show or hide the buttons...
  378.   if FShowButtons <> AValue then
  379.   begin
  380.     if AValue = True then
  381.     begin
  382.       FPageImage.Left := 40;
  383.       FBtnOnePage := TSpeedButton.Create(Self);
  384.       with FBtnOnePage do
  385.       begin
  386.         Top := 4;
  387.         Left := 8;
  388.         Glyph.LoadFromResourceName(HInstance, 'ONE');
  389.         GroupIndex := 1;
  390.         Down := True;
  391.         OnClick := BtnClick;
  392.       end;
  393.       FBtnTwoPage := TSpeedButton.Create(Self);
  394.       with FBtnTwoPage do
  395.       begin
  396.         Top := 28;
  397.         Left := 8;
  398.         Glyph.LoadFromResourceName(HInstance, 'TWO');
  399.         GroupIndex := 1;
  400.         OnClick := BtnClick;
  401.       end;
  402.       FBtnFourPage := TSpeedButton.Create(Self);
  403.       with FBtnFourPage do
  404.       begin
  405.         Top := 52;
  406.         Left := 8;
  407.         Glyph.LoadFromResourceName(HInstance, 'FOUR');
  408.         GroupIndex := 1;
  409.         OnClick := BtnClick;
  410.       end;
  411.       FBtnOnePage.Parent := Self;
  412.       FBtnTwoPage.Parent := Self;
  413.       FBtnFourPage.Parent := Self;
  414.     end
  415.     else
  416.     begin
  417.       FPageImage.Left := 4;
  418.       FBtnOnePage.Free;
  419.       FBtnTwoPage.Free;
  420.       FBtnFourPage.Free;
  421.       FBtnOnePage := nil;
  422.       FBtnTwoPage := nil;
  423.       FBtnFourPage := nil;
  424.     end;
  425.     FShowButtons := AValue;
  426.   end;
  427. end;
  428.  
  429. procedure TGmMultipageImage.SetShowHeaderFooter(AValue: Boolean);
  430. begin
  431.   // show or hide the header/footer...
  432.   FShowHeaderFooter := AValue;
  433.   FPageImage.FShowHeaderFooter := AValue;
  434.   FPageImage.Repaint;
  435. end;
  436.  
  437. function TGmMultipageImage.GetShadow: TGmShadow;
  438. begin
  439.   // return the TGmShadow object...
  440.   Result := FPageImage.Shadow;
  441. end;
  442.  
  443. procedure TGmMultipageImage.SetBorderStyle(const Value: TBorderStyle);
  444. begin
  445.   if FBorderStyle <> Value then
  446.   begin
  447.     FBorderStyle := Value;
  448.     RecreateWnd;
  449.   end;
  450. end;
  451.  
  452. end.
  453.