PtRVData.pas
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:56k
源码类别:

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       A set of classes representing documents and     }
  5. {       subdocuments in RichView stored in TRVPrint     }
  6. {       and TRVReportHelper.                            }
  7. {                                                       }
  8. {       Copyright (c) Sergey Tkachenko                  }
  9. {       svt@trichview.com                               }
  10. {       http://www.trichview.com                        }
  11. {                                                       }
  12. {*******************************************************}
  13. unit PtRVData;
  14. interface
  15. {$I RV_Defs.inc}
  16. uses SysUtils, Classes, Windows, Graphics, Printers,
  17.      DLines, RVFuncs, RVItem, RVBack,
  18.      CRVData, CRVFData, RVRVData,
  19.      {$IFNDEF RVDONOTUSELISTS}
  20.      RVMarker,
  21.      {$ENDIF}
  22.      RVStyle, RVScroll, RichView, RVUni, RVClasses;
  23. type
  24.   { ----------------------------------------------------------------------------
  25.     TRVMultiDrawItemPartsList: list of TRVMultiDrawItemPart.
  26.     Used as TRVMultiDrawItemInfo.PartsList.
  27.   }
  28.   TRVMultiDrawItemPartsList = class (TRVList)
  29.     private
  30.       function Get(Index: Integer): TRVMultiDrawItemPart;
  31.       procedure Put(Index: Integer; const Value: TRVMultiDrawItemPart);
  32.     public
  33.       property Items[Index: Integer]: TRVMultiDrawItemPart read Get write Put; default;
  34.   end;
  35.   { ----------------------------------------------------------------------------
  36.     TRVMultiDrawItemInfo: ancestor class of drawing item containing multiple
  37.     parts on several tables. Inherited classes: TRVTablePrintPart,
  38.     TRVImagePrintPart.
  39.   }
  40.   TRVMultiDrawItemInfo = class (TRVDrawLineInfo)
  41.     private
  42.       FPartsList: TRVMultiDrawItemPartsList;
  43.     public
  44.       constructor Create;
  45.       destructor Destroy; override;
  46.       property PartsList: TRVMultiDrawItemPartsList read FPartsList;
  47.   end;
  48.   { ----------------------------------------------------------------------------
  49.     TRVPageInfo: information about one page.
  50.   }
  51.   TRVPageInfo = class (TCollectionItem)
  52.     public
  53.       StartY, StartDrawItemNo, StartPart, StartY2 : Integer;
  54.       procedure Assign(Source: TPersistent); override;
  55.   end;
  56.   { ----------------------------------------------------------------------------
  57.     TRVPageCollection: collection of TRVPageInfo.
  58.     Class of TCustomMainPtblRVData.Pages.
  59.   }
  60.   TRVPageCollection = class (TCollection)
  61.     private
  62.       function GetItem(Index: Integer): TRVPageInfo;
  63.       procedure SetItem(Index: Integer; const Value: TRVPageInfo);
  64.     public
  65.       constructor Create;
  66.       function Add: TRVPageInfo;
  67.       property Items[Index: Integer]: TRVPageInfo
  68.        read GetItem write SetItem; default;
  69.   end;
  70.   TCustomPrintableRVData = class(TRichViewRVData)
  71.     private
  72.       FBackgroundBmp: TBitmap;    // valid only in DrawPage
  73.       FDrawItem: TRVDrawLineInfo; // valid only in DrawPage
  74.       FItemTop: Integer;       // valid only in DrawPage
  75.       FPageNo: Integer;
  76.     protected
  77.       function GetBack: TRVBackground; virtual;
  78.       function GetTopCoord(PageNo: Integer): Integer; virtual;
  79.       function GetTopCoord2(PageNo: Integer): Integer; virtual;
  80.       function GetPrintableAreaTop: Integer; virtual;
  81.       procedure DoPagePrepaint(Canvas: TCanvas; PageNo: Integer; Preview, Correction: Boolean); virtual;
  82.       procedure DoPagePostpaint(Canvas: TCanvas; PageNo: Integer; Preview: Boolean); virtual;
  83.       procedure GetDrawItemsRange(PageNo: Integer; var StartNo, EndNo, Part: Integer);  virtual;
  84.       procedure CheckPageNo(PageNo: Integer); virtual;
  85.       function ShareItems: Boolean; override;
  86.       function InitPrinterCanvas: TCanvas; dynamic;
  87.       procedure DonePrinterCanvas(Canvas: TCanvas); dynamic;
  88.       function GetColorMode: TRVColorMode; virtual;
  89.       function GetSourceRVDataForPrinting: TCustomRVData; dynamic;
  90.       procedure DoOnHyperlink(RVData: TCustomRVData; ItemNo: Integer; const R: TRect); virtual;
  91.       procedure DoOnCheckpoint(RVData: TCustomRVData; ItemNo, X, Y: Integer); virtual;
  92.     public
  93.       ParentDrawsBack: Boolean;
  94.       function GetPrintableAreaLeft(PageNo: Integer): Integer; virtual;
  95.       procedure DrawPage(pgNo: Integer; Canvas: TCanvas; Preview, Correction: Boolean); virtual;
  96.       procedure DrawBackToBitmap(Left,Top: Integer; bmp: TBitmap;
  97.         const sad: TRVScreenAndDevice;
  98.         ItemBackgroundLayer: Integer; // 0 - do not draw; -1 - draw completely; others - item specific
  99.         RelativeToItem: Boolean); virtual;
  100.   end;
  101.   TCustomMainPtblRVData = class(TCustomPrintableRVData)
  102.     private
  103.       {$IFNDEF RVDONOTUSELISTS}
  104.       FPrevMarkers: TRVMarkerList;
  105.       {$ENDIF}
  106.     protected
  107.       TmpTMPix, TmpBMPix: Integer;
  108.       StreamSavePage: Integer;
  109.       PrinterCanvas : TCanvas;
  110.       procedure DoFormatting(PageCompleted: Integer; Step:TRVPrintingStep); dynamic;
  111.       function GetBack: TRVBackground; override;
  112.       function GetTopCoord(PageNo: Integer): Integer; override;
  113.       function GetTopCoord2(PageNo: Integer): Integer; override;
  114.       procedure GetSADForFormatting(Canvas: TCanvas; var sad: TRVScreenAndDevice); override;
  115.       function GetPrintableAreaTop: Integer; override;
  116.       procedure GetDrawItemsRange(PageNo: Integer; var StartNo, EndNo, Part: Integer);  override;
  117.       procedure CheckPageNo(PageNo: Integer); override;
  118.       function GetPageWidth: Integer; dynamic;
  119.       function GetPageHeight: Integer; dynamic;
  120.       procedure Prepare; dynamic;
  121.       procedure RVFGetLimits(SaveScope: TRVFSaveScope;
  122.         var StartItem, EndItem, StartOffs, EndOffs: Integer;
  123.         var StartPart, EndPart: TRVMultiDrawItemPart); override;
  124.       function GetColorMode: TRVColorMode; override;
  125.       function GetFirstItemMarker(var ListNo, Level: Integer): Boolean; override;
  126.       function GetSourceRVDataForPrinting: TCustomRVData; override;
  127.     public
  128.       PrnSad: TRVScreenAndDevice;
  129.       Pages: TRVPageCollection;
  130.       FTopMarginPix, FBottomMarginPix: Integer;
  131.       Transparent: Boolean;
  132.       TmpLM, TmpTM: Integer;
  133.       TmpRM, TmpBM: Integer;
  134.       ColorMode: TRVColorMode;
  135.       FFirstParaListNo, FFirstParaLevel: Integer;
  136.       FIsDestinationReady: Boolean;
  137.       procedure Clear; override;
  138.       function GetPrintableAreaLeft(PageNo: Integer): Integer; override;
  139.       function FormatPages: Integer;
  140.       procedure FormatNextPage(var i, StartAt, StartY, Y: Integer;
  141.         var Splitting: Boolean; MaxHeight: Integer);
  142.       procedure DrawPage(pgNo: Integer; Canvas: TCanvas; Preview, Correction: Boolean); override;
  143.       function GetColor: TColor; override;
  144.       {$IFNDEF RVDONOTUSERVF}
  145.       function SavePageAsRVF(Stream: TStream; PageNo: Integer; Color: TColor;
  146.         Background: TRVBackground; Layout: TRVLayoutInfo): Boolean;
  147.       {$ENDIF}
  148.       {$IFNDEF RVDONOTUSELISTS}
  149.       function GetPrevMarkers: TRVMarkerList; override;
  150.       {$ENDIF}
  151.       constructor Create(RichView: TRVScroller); override;
  152.       destructor Destroy; override;
  153.   end;
  154.   TRVHeaderFooterRVData = class;
  155.   TPrintableRVData = class(TCustomMainPtblRVData)
  156.     private
  157.       rgn: HRGN;
  158.       rgnres: Integer;
  159.     protected
  160.       procedure DoFormatting(PageCompleted: Integer; Step:TRVPrintingStep); override;
  161.       function InitPrinterCanvas: TCanvas; override;
  162.       procedure DonePrinterCanvas(Canvas: TCanvas); override;
  163.       procedure DoPagePrepaint(Canvas: TCanvas; PageNo:Integer; Preview, Correction: Boolean); override;
  164.       procedure DoPagePostpaint(Canvas: TCanvas; PageNo:Integer; Preview: Boolean); override;
  165.       function GetPageWidth: Integer; override;
  166.       function GetPageHeight: Integer; override;
  167.       procedure Prepare; override;
  168.     public
  169.       TmpLMMir: Integer;
  170.       Header, Footer: TRVHeaderFooterRVData;
  171.       HeaderY, FooterY: Integer;
  172.       function GetPrintableAreaLeft(PageNo: Integer): Integer; override;
  173.       constructor Create(RichView: TRVScroller); override;
  174.       destructor Destroy; override;
  175.   end;
  176.   TRectPtblRVData = class(TCustomPrintableRVData)
  177.     protected
  178.       procedure GetSADForFormatting(Canvas: TCanvas; var sad: TRVScreenAndDevice); override;
  179.       function GetPrintableAreaTop: Integer; override;
  180.       function GetTopCoord(PageNo: Integer): Integer; override;
  181.       function InitPrinterCanvas: TCanvas; override;
  182.       function GetColorMode: TRVColorMode; override;
  183.       function GetSourceRVDataForPrinting: TCustomRVData; override;
  184.       procedure DoOnHyperlink(RVData: TCustomRVData; ItemNo: Integer;
  185.         const R: TRect); override;
  186.       procedure DoOnCheckpoint(RVData: TCustomRVData; ItemNo, X, Y: Integer); override;
  187.     public
  188.       FSourceDataForPrinting: TCustomRVData;
  189.       FParentPrintData: TCustomPrintableRVData;
  190.       Left,Top,DX,DY,Width,Height: Integer;
  191.       Transparent: Boolean;
  192.       FColor: TColor;
  193.       function GetMaxTextWidth: Integer; override;
  194.       function GetMinTextWidth: Integer; override;      
  195.       function GetPrintableAreaLeft(PageNo: Integer): Integer; override;
  196.       function GetParentData: TCustomRVData; override;
  197.       function GetRootData: TCustomRVData; override;
  198.       constructor Create(RichView: TRVScroller; SourceDataForPrinting: TCustomRVFormattedData;
  199.         ParentPrintData: TCustomPrintableRVData); {$IFDEF RICHVIEWDEF4} reintroduce;{$ENDIF}
  200.       procedure DrawBackToBitmap(Left,Top: Integer; bmp: TBitmap;
  201.         const sad: TRVScreenAndDevice; ItemBackgroundLayer: Integer;
  202.         RelativeToItem: Boolean); override;
  203.       function GetWidth: Integer; override;
  204.       function GetHeight: Integer; override;
  205.       function GetLeftMargin: Integer; override;
  206.       function GetRightMargin: Integer; override;
  207.       function GetTopMargin: Integer; override;
  208.       function GetBottomMargin: Integer; override;
  209.       function GetCanvas: TCanvas; override;
  210.       function GetColor: TColor; override;
  211.   end;
  212.   TRVHeaderFooterRVData = class (TRectPtblRVData)
  213.     public
  214.       constructor Create(RichView: TRVScroller; SourceDataForPrinting: TCustomRVFormattedData;
  215.         ParentPrintData: TCustomPrintableRVData);
  216.       function GetRVStyle: TRVStyle; override;
  217.   end;
  218. implementation
  219. uses PtblRV, RVStr;
  220. {============================ TRVMultiDrawItemInfo ============================}
  221. constructor TRVMultiDrawItemInfo.Create;
  222. begin
  223.   inherited Create;
  224.   FPartsList := TRVMultiDrawItemPartsList.Create;
  225. end;
  226. {------------------------------------------------------------------------------}
  227. destructor TRVMultiDrawItemInfo.Destroy;
  228. begin
  229.   FPartsList.Free;
  230.   inherited  Destroy;
  231. end;
  232. {=============================== TRVPageInfo ==================================}
  233. procedure TRVPageInfo.Assign(Source: TPersistent);
  234. begin
  235.   if Source is TRVPageInfo then begin
  236.     StartY := TRVPageInfo(Source).StartY;
  237.     StartDrawItemNo := TRVPageInfo(Source).StartDrawItemNo;
  238.     end
  239.   else
  240.     inherited Assign(Source);
  241. end;
  242. {============================= TRVPageCollection ==============================}
  243. function TRVPageCollection.Add: TRVPageInfo;
  244. begin
  245.   Result := TRVPageInfo(inherited Add);
  246. end;
  247. {------------------------------------------------------------------------------}
  248. constructor TRVPageCollection.Create;
  249. begin
  250.   inherited Create(TRVPageInfo);
  251. end;
  252. {------------------------------------------------------------------------------}
  253. function TRVPageCollection.GetItem(Index: Integer): TRVPageInfo;
  254. begin
  255.   Result := TRVPageInfo(inherited GetItem(Index));
  256. end;
  257. {------------------------------------------------------------------------------}
  258. procedure TRVPageCollection.SetItem(Index: Integer;
  259.   const Value: TRVPageInfo);
  260. begin
  261.   inherited SetItem(Index, Value);
  262. end;
  263. {======================== TRVMultiDrawItemPartsList ===========================}
  264. function TRVMultiDrawItemPartsList.Get(
  265.   Index: Integer): TRVMultiDrawItemPart;
  266. begin
  267.   Result := TRVMultiDrawItemPart(inherited Get(Index));
  268. end;
  269. {------------------------------------------------------------------------------}
  270. procedure TRVMultiDrawItemPartsList.Put(Index: Integer;
  271.   const Value: TRVMultiDrawItemPart);
  272. begin
  273.   inherited Put(Index, Value);
  274. end;
  275. {============================== TCustomPrintableRVData ========================}
  276. procedure TCustomPrintableRVData.DonePrinterCanvas(Canvas: TCanvas);
  277. begin
  278. end;
  279. {------------------------------------------------------------------------------}
  280. function TCustomPrintableRVData.GetSourceRVDataForPrinting: TCustomRVData;
  281. begin
  282.   Result := nil;
  283. end;
  284. {------------------------------------------------------------------------------}
  285. function TCustomPrintableRVData.GetColorMode: TRVColorMode;
  286. begin
  287.   Result := rvcmPrinterColor;
  288. end;
  289. {------------------------------------------------------------------------------}
  290. function TCustomPrintableRVData.ShareItems: Boolean;
  291. begin
  292.   Result := True;
  293. end;
  294. {------------------------------------------------------------------------------}
  295. function TCustomPrintableRVData.InitPrinterCanvas: TCanvas;
  296. begin
  297.   Result := nil;
  298. end;
  299. {------------------------------------------------------------------------------}
  300. function TCustomPrintableRVData.GetBack: TRVBackground;
  301. begin
  302.   Result := nil;
  303. end;
  304. {------------------------------------------------------------------------------}
  305. function TCustomPrintableRVData.GetTopCoord(PageNo: Integer): Integer;
  306. begin
  307.   Result := 0;
  308. end;
  309. {------------------------------------------------------------------------------}
  310. function TCustomPrintableRVData.GetTopCoord2(PageNo: Integer): Integer;
  311. begin
  312.   Result := 0;
  313. end;
  314. {------------------------------------------------------------------------------}
  315. function TCustomPrintableRVData.GetPrintableAreaLeft(PageNo: Integer): Integer;
  316. begin
  317.   Result := 0;
  318. end;
  319. {------------------------------------------------------------------------------}
  320. function TCustomPrintableRVData.GetPrintableAreaTop: Integer;
  321. begin
  322.   Result := 0;
  323. end;
  324. {------------------------------------------------------------------------------}
  325. procedure TCustomPrintableRVData.DoPagePrepaint(Canvas: TCanvas; PageNo:Integer; Preview, Correction: Boolean);
  326. begin
  327. end;
  328. {------------------------------------------------------------------------------}
  329. procedure TCustomPrintableRVData.DoPagePostpaint(Canvas: TCanvas; PageNo: Integer; Preview: Boolean);
  330. begin
  331. end;
  332. {------------------------------------------------------------------------------}
  333. procedure TCustomPrintableRVData.GetDrawItemsRange(PageNo: Integer; var StartNo, EndNo, Part: Integer);
  334. begin
  335.   StartNo := 0;
  336.   EndNo   := DrawItems.Count-1;
  337.   Part    := -1;
  338.   //FirstOffs := 0;
  339. end;
  340. {------------------------------------------------------------------------------}
  341. procedure TCustomPrintableRVData.CheckPageNo(PageNo: Integer);
  342. begin
  343. end;
  344. {------------------------------------------------------------------------------}
  345. procedure TCustomPrintableRVData.DrawBackToBitmap(Left, Top: Integer;
  346.   bmp: TBitmap; const sad: TRVScreenAndDevice; ItemBackgroundLayer: Integer;
  347.   RelativeToItem: Boolean);
  348. var pi: TParaInfo;
  349.     item: TCustomRVItemInfo;
  350.     Clr: TColor;
  351.     r,r2: TRect;
  352. begin
  353.   if RelativeToItem then begin
  354.     inc(Left, RV_XToScreen(FDrawItem.Left, sad));
  355.     inc(Top,  RV_YToScreen(FItemTop-GetPrintableAreaTop, sad));
  356.   end;
  357.   item := GetItem(FDrawItem.ItemNo);
  358.   pi := GetRVStyle.ParaStyles[item.ParaNo];
  359.   r := Rect(0,0, bmp.Width, bmp.Height);
  360.   if (pi.Background.Color=clNone) and (FBackgroundBmp<>nil) then
  361.     bmp.Canvas.CopyRect(Rect(0,0, bmp.Width, bmp.Height),
  362.       FBackgroundBmp.Canvas, Bounds(Left, Top, bmp.Width, bmp.Height))
  363.   else begin
  364.     Clr := pi.Background.Color;
  365.     if Clr = clNone then
  366.       Clr := GetColor;
  367.     if Clr = clNone then
  368.       Clr := clWhite;
  369.     bmp.Canvas.Pen.Color := Clr;
  370.     bmp.Canvas.Brush.Color := Clr;
  371.     bmp.Canvas.FillRect(r);
  372.   end;
  373.   if ItemBackgroundLayer<>0 then begin
  374.     r2 := Bounds(RV_XToScreen(FDrawItem.Left, sad)-Left,
  375.       RV_YToScreen(FItemTop-GetPrintableAreaTop, sad)-Top,
  376.       RV_XToScreen(FDrawItem.Width,sad),
  377.       RV_YToScreen(FDrawItem.Height,sad));
  378.     item.DrawBackgroundForPrinting(bmp.Canvas, r, r2, GetColorMode, ItemBackgroundLayer);
  379.   end;
  380. end;
  381. {------------------------------------------------------------------------------}
  382. procedure TCustomPrintableRVData.DoOnHyperlink(RVData: TCustomRVData;
  383.   ItemNo: Integer; const R: TRect);
  384. begin
  385. end;
  386. {------------------------------------------------------------------------------}
  387. procedure TCustomPrintableRVData.DoOnCheckpoint(RVData: TCustomRVData;
  388.   ItemNo, X, Y: Integer);
  389. begin
  390. end;
  391. {------------------------------------------------------------------------------}
  392. procedure TCustomPrintableRVData.DrawPage(pgNo: Integer; Canvas: TCanvas; Preview, Correction: Boolean);
  393. var i,no: Integer;
  394.     dli:TRVDrawLineInfo;
  395.     item: TCustomRVItemInfo;
  396.     zerocoord: Integer;
  397.     first, last, part: Integer;
  398.     tmpbmp : TBitmap;
  399.     LeftOffs: Integer;
  400.     RVStyle: TRVStyle;
  401.     sad: TRVScreenAndDevice;
  402.     {.......................................}
  403.     function GetDevX(ScreenX: Integer):Integer;
  404.     begin
  405.       Result := MulDiv(ScreenX, sad.ppixDevice, sad.ppixScreen);
  406.     end;
  407.     {.......................................}
  408.     function GetDevY(ScreenY: Integer):Integer;
  409.     begin
  410.       Result := MulDiv(ScreenY, sad.ppiyDevice, sad.ppiyScreen);
  411.     end;
  412.     {.......................................}
  413.     procedure DrawBackground; // in-out: backgroundbmp
  414.                               // in: Canvas
  415.     var BackWidth, BackHeight: Integer;
  416.         Color: TColor;
  417.     begin
  418.       BackWidth  := MulDiv(GetWidth,  sad.ppixScreen, sad.ppixDevice);
  419.       BackHeight := MulDiv(GetHeight, sad.ppiyScreen, sad.ppiyDevice);
  420.       if (GetBack<>nil) and
  421.          (GetBack.Style <> bsNoBitmap) and
  422.          not GetBack.Bitmap.Empty then begin
  423.         if GetBack.Style=bsTiledAndScrolled then
  424.           GetBack.Style:=bsTiled;
  425.         FBackgroundBmp := TBitmap.Create;
  426.         FBackgroundBmp.Width := BackWidth;
  427.         FBackgroundBmp.Height := BackHeight;
  428.         if Preview and (GetRVLogPalette<>nil) then
  429.           FBackgroundBmp.Palette := CreatePalette(GetRVLogPalette^);
  430.         GetBack.Draw(FBackgroundBmp.Canvas, Rect(0,0, BackWidth, BackHeight),
  431.                  0,0, 0, 0, BackWidth, BackHeight, GetColor, False);
  432.         RV_PictureToDevice(Canvas, GetPrintableAreaLeft(pgNo),
  433.           GetPrintableAreaTop, -1, -1, sad, FBackgroundBmp, Preview);
  434.         end
  435.       else begin
  436.         FBackgroundBmp := nil;
  437.         if not ParentDrawsBack then
  438.           with Canvas do
  439.             if GetColor<>clNone then begin
  440.               case GetColorMode of
  441.                 rvcmColor:
  442.                   Color := GetColor;
  443.                 rvcmPrinterColor:
  444.                   Color := RV_GetPrnColor(GetColor);
  445.                 rvcmGrayScale:
  446.                   Color := RV_GetGray(RV_GetPrnColor(GetColor));
  447.                 else
  448.                   Color := clWhite;
  449.               end;
  450.               Pen.Color := Color;
  451.               Brush.Color := Color;
  452.               Brush.Style := bsSolid;
  453.               Pen.Style := psClear;
  454.               FillRect(Bounds(GetPrintableAreaLeft(pgNo), GetPrintableAreaTop, GetWidth,GetHeight));
  455.               Pen.Style := psSolid;
  456.             end;
  457.       end;
  458.       DoPagePrepaint(Canvas, pgNo, Preview, Correction);
  459.     end;
  460.     {.......................................}
  461.     procedure DrawBackTotmpbmp(Top: Integer); // in: backgroundbmp,tmpbmp,dli,item
  462.     begin
  463.       DrawBackToBitmap(
  464.         RV_XToScreen(FDrawItem.Left, sad)+item.GetBorderWidth,
  465.         RV_YToScreen(FItemTop-GetPrintableAreaTop, sad)+item.GetBorderHeight,
  466.         tmpbmp, sad, -1, False);
  467.     end;
  468.     {.......................................}
  469.     procedure DrawParagraph(i: Integer);
  470.     var R, R1: TRect;
  471.         dli: TRVDrawLineInfo;
  472.         item: TCustomRVItemInfo;
  473.         pi: TParaInfo;
  474.         j: Integer;
  475.     begin
  476.       dli := DrawItems[i];
  477.       item := GetItem(dli.ItemNo);
  478.       pi := GetRVStyle.ParaStyles[item.ParaNo];
  479.       if (pi.Border.Style=rvbNone) and (pi.Background.Color=clNone) and not Assigned(RVStyle.OnDrawParaBack) then
  480.         exit;
  481.       R.Left := GetPrintableAreaLeft(pgNo)+GetDevX(GetLeftMargin+pi.LeftIndent);
  482.       if pi.FirstIndent<0 then
  483.         inc(R.Left, GetDevX(pi.FirstIndent));
  484.       R.Right:= GetPrintableAreaLeft(pgNo)+GetWidth-GetDevX(GetRightMargin+pi.RightIndent);
  485.       if (i=first) and (part>=0) then begin
  486.         R.Top := 0;
  487.         R.Bottom := TRVMultiDrawItemInfo(dli).PartsList[part].Height;
  488.         end
  489.       else begin
  490.         R.Top := dli.Top;
  491.         if (i=last) and (dli is TRVMultiDrawItemInfo) and
  492.           (TRVMultiDrawItemInfo(dli).PartsList.Count>0) then
  493.           R.Bottom := dli.Top+TRVMultiDrawItemInfo(dli).PartsList[0].Height
  494.         else
  495.           R.Bottom := dli.Top+dli.Height+dli.ExtraSpaceBelow;
  496.       end;
  497.       for j := i+1 to last do begin
  498.         dli := DrawItems[j];
  499.         if (dli.ItemNo<>DrawItems[j-1].ItemNo) and
  500.            TCustomRVItemInfo(Items.Objects[dli.ItemNo]).CanBeBorderStart then break;
  501.         if dli.Top<R.Top then
  502.           R.Top := dli.Top;
  503.         if (j=last) and (dli is TRVMultiDrawItemInfo) and
  504.           (TRVMultiDrawItemInfo(dli).PartsList.Count>0) then
  505.           R.Bottom := dli.Top+TRVMultiDrawItemInfo(dli).PartsList[0].Height
  506.         else
  507.           if dli.Top+dli.Height+dli.ExtraSpaceBelow>R.Bottom then
  508.             R.Bottom := dli.Top+dli.Height+dli.ExtraSpaceBelow;
  509.       end;
  510.       OffsetRect(R,0,-zerocoord);
  511.       R1 := R;
  512.       pi.Background.PrepareDrawSaD(R1, sad);
  513.       GetRVStyle.DrawParaBack(Canvas, item.ParaNo, R1, True, GetColorMode);
  514.       pi.Border.DrawSaD(R, Canvas, sad, GetColorMode);
  515.     end;
  516.     {.......................................}
  517. var w, h: Integer;
  518.     BiDiMode, BiDiMode2: TRVBiDiMode;
  519.     Dummy: Boolean;
  520.     TextStyle: TFontInfo;
  521. begin
  522.   FPageNo := pgNo;
  523.   RVStyle := GetRVStyle;
  524.   if RVStyle=nil then
  525.     raise ERichViewError.Create(errStyleIsNotAssigned);
  526.   GetSADForFormatting(Canvas, sad);
  527.   GetDrawItemsRange(pgNo, first, last, part);
  528.   zerocoord := GetTopCoord(PgNo);
  529.   LeftOffs  := GetPrintableAreaLeft(pgNo);
  530.   Canvas.Brush.Style := bsClear;
  531.   DrawBackground;
  532.   tmpbmp := TBitmap.Create;
  533.   {$IFDEF RVDEBUGTABLE}
  534.   if Self is TRectPtblRVData then begin
  535.     Canvas.Pen.Color := clRed;
  536.     Canvas.Pen.Width := 0;
  537.     Canvas.Rectangle(GetPrintableAreaLeft,GetPrintableAreaTop,
  538.                      GetPrintableAreaLeft+ TRectPtblRVData(Self).Width,
  539.                      GetPrintableAreaTop+TRectPtblRVData(Self).Height);
  540.     end
  541.   else begin
  542.   {
  543.     if PgNo=1 then
  544.       with Self as TCustomMainPtblRVData do  begin
  545.         Canvas.Pen.Color := clRed;
  546.         Canvas.Pen.Width := 0;
  547.         Canvas.Pen.Style  := psDot;
  548.         Canvas.MoveTo(LeftOffs-300, TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.StartAt);
  549.         Canvas.LineTo(300+GetWidth+LeftOffs-GetDevX(GetRightMargin), TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.StartAt);
  550.         Canvas.Pen.Style  := psSolid;
  551.       end;
  552.     if PgNo=(Self as TCustomMainPtblRVData).PagesColl.Count then
  553.       with Self as TCustomMainPtblRVData do  begin
  554.         Canvas.Pen.Color := clRed;
  555.         Canvas.Pen.Width := 0;
  556.         Canvas.Pen.Style  := psDot;
  557.         Canvas.MoveTo(LeftOffs-300, TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.EndAt);
  558.         Canvas.LineTo(300+GetWidth+LeftOffs-GetDevX(GetRightMargin), TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.EndAt);
  559.         Canvas.Pen.Style  := psSolid;
  560.       end
  561.     }
  562.   end;
  563.   {$ENDIF}
  564.   if Preview and (GetRVLogPalette<>nil) then
  565.     tmpbmp.Palette := CreatePalette(GetRVLogPalette^);
  566.   try
  567.     for i:=first to last do begin
  568.       dli := DrawItems[i];
  569.       FDrawItem := dli;
  570.       item := GetItem(dli.ItemNo);
  571.       BiDiMode := GetParaBiDiMode(item.ParaNo);
  572.       if (i=last) and (i<>first) and (dli is TRVMultiDrawItemInfo) and
  573.           (TRVMultiDrawItemInfo(dli).PartsList.Count>0) then
  574.         part := 0;
  575.       if ((i=first) or
  576.          ((dli.ItemNo<>DrawItems[i-1].ItemNo) and
  577.            item.CanBeBorderStart)) and
  578.          (item.StyleNo<>rvsBreak) then
  579.          DrawParagraph(i);
  580.       if item.GetBoolValueEx(rvbpJump, RVStyle) then
  581.         DoOnHyperlink(GetSourceRVDataForPrinting, dli.ItemNo,
  582.           Bounds(dli.Left+LeftOffs, dli.Top-zerocoord, dli.Width, dli.Height));
  583.       if (item.Checkpoint<>nil) and IsDrawItemItemStart(i) and (Part<=0) then begin
  584.         if (Part>0) or ((Part=0)and(i=first)) then
  585.           FItemTop := -zerocoord
  586.         else
  587.           FItemTop := dli.Top-zerocoord;
  588.         DoOnCheckpoint(GetSourceRVDataForPrinting, dli.ItemNo,
  589.           dli.Left+LeftOffs, FItemTop);
  590.         if (rvoShowCheckpoints in Options) then
  591.           RVStyle.DrawCheckpoint(Canvas, dli.Left+LeftOffs, FItemTop,
  592.             LeftOffs, GetWidth, Self, dli.ItemNo,
  593.             0, item.Checkpoint.RaiseEvent, nil);
  594.       end;
  595.       no := GetActualStyle(item);
  596.       if no>=0 then begin{ text }
  597.         RVStyle.ApplyStyleColor(Canvas, no, [], True, GetColorMode);
  598.         RVStyle.ApplyStyle(Canvas, no, BiDiMode,
  599.           TCustomPrintableRV(RichView).CanUseCustomPPI);
  600.         TextStyle := RVStyle.TextStyles[no];
  601.         if TextStyle.BiDiMode=rvbdUnspecified then
  602.           BidiMode2 := BiDiMode
  603.         else
  604.           BidiMode2 := TextStyle.BiDiMode;
  605.         if BidiMode2=rvbdUnspecified then begin
  606.           if TextStyle.CharSpacing<>0 then
  607.             SetTextCharacterExtra(Canvas.Handle, GetDevX(TextStyle.CharSpacing));
  608.         end;
  609.         if Assigned(RVStyle.OnDrawTextBack) then begin
  610.           Dummy := True;
  611.           RVStyle.OnDrawTextBack(RVStyle, Canvas, no, dli.Left+LeftOffs, dli.Top-zerocoord, dli.Width, dli.Height, [], Dummy);
  612.         end;
  613.         RVStyle.DrawStyleText(
  614.           RV_ReturnProcessedString(DrawItems.GetString(i,Items), RVStyle.TextStyles[no],
  615.             IsDrawItemLastOnWrappedLine(i), False, True),
  616.           Canvas, dli.ItemNo, 1,  no, Self,
  617.           {$IFNDEF RVDONOTUSEJUSTIFY}dli.SpaceBefore,{$ELSE}0,{$ENDIF}
  618.           dli.Left+LeftOffs, dli.Top-zerocoord, dli.Width, dli.Height, [], True, Preview and Correction, GetColorMode, BiDiMode);
  619.         end
  620.       else begin // nontext
  621.         if item.GetBoolValueEx(rvbpPrintToBMP, RVStyle) then begin
  622.           if (Part>0) or ((Part=0)and(i=first)) then
  623.             FItemTop := -zerocoord
  624.           else
  625.             FItemTop := dli.Top-zerocoord;
  626.           if (Part>=0) then
  627.             h := MulDiv(TRVMultiDrawItemInfo(dli).PartsList[Part].Height,
  628.               sad.ppiyScreen, sad.ppiyDevice)
  629.           else
  630.             h := item.GetImageHeight(RVStyle);
  631.           if item.GetBoolValue(rvbpFullWidth) then
  632.             w := MulDiv(GetWidth-GetDevX(GetRightMargin)-dli.Left,
  633.                                    sad.ppixScreen, sad.ppixDevice)
  634.           else
  635.             w  := item.GetImageWidth(RVStyle);
  636.           tmpbmp.Width := w;
  637.           tmpbmp.Height := h;
  638.           DrawBackToTmpBmp(FItemTop);
  639.           if item.PrintToBitmap(tmpbmp, Preview, FRichView, dli, Part, GetColorMode) then
  640.             RV_PictureToDevice(Canvas,
  641.                                dli.Left+LeftOffs+ GetDevX(item.GetBorderWidth),
  642.                                FItemTop + GetDevY(item.GetBorderWidth),
  643.                                w, h,
  644.                                sad, tmpbmp, Preview);
  645.           end
  646.         else begin
  647.           if (Part>0) or ((Part=0)and(i=first)) then
  648.             FItemTop := -zerocoord
  649.           else
  650.             FItemTop := dli.Top-zerocoord;
  651.           if item.GetBoolValue(rvbpFullWidth) then
  652.             item.Print(Canvas, dli.Left+LeftOffs, FItemTop,
  653.                      GetWidth+LeftOffs-GetDevX(GetRightMargin),
  654.                      Preview, Correction, sad, FRichView, dli, part, GetColorMode, Self)
  655.           else
  656.             item.Print(Canvas, dli.Left+LeftOffs, FItemTop,0,
  657.                      Preview, Correction, sad, FRichView, dli, part, GetColorMode, Self);
  658.         end;
  659.         if part<>-1 then begin
  660.           if i=first then
  661.             zerocoord := GetTopCoord2(PgNo);
  662.           part := -1;
  663.         end;
  664.       end;
  665.     end;
  666.     DoPagePostpaint(Canvas, pgNo, Preview);
  667.     {$IFDEF RVWATERMARK}
  668.     if rvflRoot in Flags then begin
  669.       Canvas.Brush.Style := bsClear;
  670.       Canvas.Font.Name := 'Arial';
  671.       Canvas.Font.Size := 8;
  672.       Canvas.Font.Style := [];
  673.       Canvas.Font.Color := clRed;
  674.       Canvas.TextOut(GetPrintableAreaLeft(PgNo), GetPrintableAreaTop, 'unregistered');
  675.     end;
  676.     {$ENDIF}
  677.   finally
  678.     FBackgroundBmp.Free;
  679.     FBackgroundBmp := nil;
  680.     FDrawItem := nil;
  681.     tmpbmp.Free;
  682.   end;
  683. end;
  684. {============================ TCustomMainPtblRVData ===========================}
  685. constructor TCustomMainPtblRVData.Create(RichView: TRVScroller);
  686. begin
  687.   inherited;
  688.   Pages := TRVPageCollection.Create;
  689.   ColorMode := rvcmPrinterColor;
  690. end;
  691. {------------------------------------------------------------------------------}
  692. destructor TCustomMainPtblRVData.Destroy;
  693. begin
  694.   Pages.Free;
  695.   inherited;
  696. end;
  697. {------------------------------------------------------------------------------}
  698. function TCustomMainPtblRVData.GetSourceRVDataForPrinting: TCustomRVData;
  699. begin
  700.   Result := TCustomRichView(RichView).RVData;
  701. end;
  702. {------------------------------------------------------------------------------}
  703. {$IFNDEF RVDONOTUSELISTS}
  704. function TCustomMainPtblRVData.GetPrevMarkers: TRVMarkerList;
  705. begin
  706.   if FPrevMarkers=nil then
  707.     FPrevMarkers := TRVMarkerList.Create;
  708.   Result := FPrevMarkers;
  709. end;
  710. {$ENDIF}
  711. {------------------------------------------------------------------------------}
  712. procedure TCustomMainPtblRVData.Clear;
  713. {$IFNDEF RVDONOTUSELISTS}
  714. var i: Integer;
  715. {$ENDIF}
  716. begin
  717.   inherited;
  718.   FFirstParaListNo := -1;
  719.   FFirstParaLevel  := -1;
  720.   {$IFNDEF RVDONOTUSELISTS}
  721.   if FPrevMarkers<>nil then begin
  722.     for i := 0 to FPrevMarkers.Count-1 do
  723.       TRVMarkerItemInfo(FPrevMarkers.Items[i]).Free;
  724.     FPrevMarkers.Free;
  725.     FPrevMarkers := nil;
  726.   end;
  727.   {$ENDIF}
  728. end;
  729. {------------------------------------------------------------------------------}
  730. function TCustomMainPtblRVData.GetFirstItemMarker(var ListNo,
  731.   Level: Integer): Boolean;
  732. begin
  733.   if (rvstFirstParaAborted in State) then begin
  734.     ListNo := FFirstParaListNo;
  735.     Level  := FFirstParaLevel;
  736.     Result := ListNo>=0;
  737.     end
  738.   else
  739.     Result := inherited GetFirstItemMarker(ListNo, Level);
  740. end;
  741. {------------------------------------------------------------------------------}
  742. function TCustomMainPtblRVData.GetColor: TColor;
  743. begin
  744.   if Transparent then
  745.     Result := clNone
  746.   else
  747.     Result := inherited GetColor;
  748. end;
  749. {------------------------------------------------------------------------------}
  750. function TCustomMainPtblRVData.GetPageHeight: Integer;
  751. begin
  752.   Result := 0;
  753. end;
  754. {------------------------------------------------------------------------------}
  755. function TCustomMainPtblRVData.GetPageWidth: Integer;
  756. begin
  757.   Result := 0;
  758. end;
  759. {------------------------------------------------------------------------------}
  760. procedure TCustomMainPtblRVData.GetDrawItemsRange(PageNo: Integer; var StartNo, EndNo, Part: Integer);
  761. begin
  762.   StartNo := Pages[PageNo-1].StartDrawItemNo;
  763.   Part := Pages[PageNo-1].StartPart-1;
  764.   //FirstOffs := TRVPageInfo(PagesColl.Items[PageNo-1]).FirstItemOff;
  765.   if PageNo=Pages.Count then
  766.     EndNo := DrawItems.Count-1
  767.   else begin
  768.     EndNo := Pages[PageNo].StartDrawItemNo-1;
  769.     if Pages[PageNo].StartPart>1 then
  770.       inc(EndNo);
  771.   end;
  772. end;
  773. {------------------------------------------------------------------------------}
  774. procedure TCustomMainPtblRVData.FormatNextPage(var i, StartAt, StartY, Y: Integer;
  775.   var Splitting: Boolean; MaxHeight: Integer);
  776. var j: Integer;
  777.     dli :TRVDrawLineInfo;
  778.     rvpi       : TRVPageInfo;
  779.     nPages: Integer;
  780.     MustBreak: Boolean;
  781.     pi: TParaInfo;
  782.     {................................................}
  783.     function GetDevY(Y: Integer): Integer;
  784.     begin
  785.       Result := MulDiv(Y, PrnSaD.ppiyDevice, PrnSaD.ppiyScreen);
  786.     end;
  787.     {................................................}
  788.     function FindFirstItemOnPage(MultiItem: Boolean): Boolean;
  789.     var nextnewline, oldnexntewline, nextnewline2, j, tmp, oldi: Integer;
  790.         dli2, dli3 :TRVDrawLineInfo;
  791.     begin
  792.       { searching for the item which will be the first on the new page }
  793.       oldi := i;
  794.       nextnewline := i;
  795.       oldnexntewline := -1;
  796.       while True do begin
  797.         nextnewline2 := -1;
  798.         for j:=nextnewline downto 0 do
  799.           if DrawItems[j].FromNewLine then begin
  800.             if nextnewline2<0 then
  801.               nextnewline2 := j;
  802.             if not (rvpaoKeepLinesTogether in pi.Options)
  803.                or IsDrawItemParaStart(j) then begin
  804.               nextnewline := j;
  805.               break;
  806.             end;
  807.           end;
  808.         if (StartAt<=0) and (nextnewline2>=0) and
  809.           (nextnewline <= Pages.Items[nPages-1].StartDrawItemNo) then begin
  810.           if oldnexntewline>=0 then begin
  811.             nextnewline := oldnexntewline;
  812.             break;
  813.           end;
  814.           nextnewline := nextnewline2;
  815.         end;
  816.         if (StartAt<=0) and
  817.            ((nextnewline <= Pages.Items[nPages-1].StartDrawItemNo) or (nextnewline<=0)) then
  818.           break;
  819.         pi := GetRVStyle.ParaStyles[GetItemPara(DrawItems[nextnewline-1].ItemNo)];
  820.         if not IsDrawItemParaStart(nextnewline) or
  821.            not (rvpaoKeepWithNext in pi.Options) then
  822.           break;
  823.         if oldnexntewline<0 then
  824.           oldnexntewline := nextnewline;
  825.         dec(nextnewline);
  826.       end;
  827.       { page must contain one line at least}
  828.       if (StartAt<=0) and
  829.         (nextnewline <= Pages.Items[nPages-1].StartDrawItemNo) then begin
  830.         tmp := nextnewline;
  831.         nextnewline := DrawItems.Count;
  832.         for j := tmp+1 to DrawItems.Count-1 do
  833.           if DrawItems[j].FromNewLine then begin
  834.             nextnewline := j;
  835.             break;
  836.           end;
  837.         if (nextnewline<i) and not IsDrawItemParaStart(nextnewline) then
  838.           for j := nextnewline+1 to i do
  839.             if IsDrawItemParaStart(j) then begin
  840.               nextnewline := j-1;
  841.               break;
  842.             end;
  843.       end;
  844.       if (nextnewline<>DrawItems.Count) and ((nextnewline<>oldi) or not MultiItem) then begin
  845.         { searching min y of first line in new page }
  846.         dli2 := DrawItems[nextnewline];
  847.         StartY := dli2.Top;
  848.         for j := nextnewline+1 to DrawItems.Count-1 do begin
  849.           dli3 := DrawItems[j];
  850.           if dli3.FromNewLine then
  851.             break;
  852.           if dli3.Top<StartY then
  853.             StartY := dli3.Top;
  854.         end;
  855.         rvpi             := Pages.Add;
  856.         rvpi.StartDrawItemNo := nextnewline;
  857.         dli              := DrawItems[nextnewline];
  858.         pi := GetRVStyle.ParaStyles[GetItemPara(dli.ItemNo)];
  859.         dec(StartY, GetDevY(pi.SpaceBefore));
  860.         rvpi.StartY      := StartY;
  861.         DoFormatting(nPages, rvpsProceeding);
  862.         StartAt := 0;
  863.       end;
  864.       i := nextnewline;
  865.       Result := i<>oldi;
  866.     end;
  867.     {................................................}
  868. begin
  869.   if Pages.Count=0 then begin
  870.     rvpi := Pages.Add;
  871.     rvpi.StartY := 0;
  872.     rvpi.StartDrawItemNo := 0;
  873.     StartY := 0;
  874.     i := 0;
  875.     StartAt := TPrintableRV(FRichView).RVPrint.StartAt;
  876.     Splitting := False;
  877.   end;
  878.   nPages := Pages.Count;
  879.   if Splitting then begin
  880.     dli := DrawItems[i];
  881.     pi := GetRVStyle.ParaStyles[GetItemPara(dli.ItemNo)];  
  882.     while dli.SplitAt(y) do begin
  883.       rvpi             := Pages.Add;
  884.       rvpi.StartDrawItemNo := i;
  885.       dli              := DrawItems[i];
  886.       rvpi.StartY      := -GetDevY(pi.SpaceBefore);
  887.       rvpi.StartPart   := TRVMultiDrawItemInfo(dli).PartsList.Count;
  888.       if Pages[nPages-1].StartDrawItemNo=i then
  889.          Pages[nPages-1].StartY2 :=
  890.            dli.Top+dli.Height-
  891.            TRVMultiDrawItemInfo(dli).PartsList[TRVMultiDrawItemInfo(dli).PartsList.Count-2].Height-
  892.            GetDevY(pi.SpaceBefore);
  893.       DoFormatting(nPages, rvpsProceeding);
  894.       StartAt := 0;
  895.       StartY := 0;
  896.       y := StartY+MaxHeight-StartAt+rvpi.StartY;
  897.       dec(y, GetDevY(pi.SpaceAfter));
  898.       exit;
  899.     end;
  900.     if Pages[nPages-1].StartDrawItemNo=i then begin
  901.       StartY := dli.Top+dli.Height-
  902.                 TRVMultiDrawItemInfo(dli).PartsList[TRVMultiDrawItemInfo(dli).PartsList.Count-1].Height-
  903.                 GetDevY(pi.SpaceBefore);
  904.       Pages[nPages-1].StartY2 := StartY;
  905.     end;
  906.     inc(i);
  907.     Splitting := False;
  908.   end;
  909.   while i<DrawItems.Count do begin
  910.     dli := DrawItems[i];
  911.     pi := GetRVStyle.ParaStyles[GetItemPara(dli.ItemNo)];
  912.     MustBreak := ((i>0) and (dli.ItemNo<>DrawItems[i-1].ItemNo) and
  913.       GetItem(dli.ItemNo).PageBreakBefore and
  914.       (Pages[nPages-1].StartDrawItemNo<>i));
  915.     if (dli is TRVMultiDrawItemInfo) and dli.InitSplit then begin
  916.       if Pages[nPages-1].StartDrawItemNo=i then begin
  917.         Pages[nPages-1].StartPart := 1;
  918.         Pages[nPages-1].StartY := -GetDevY(pi.SpaceBefore);
  919.       end;
  920.       y := StartY+MaxHeight-StartAt-dli.Top;
  921.       dec(y, GetDevY(pi.SpaceAfter));
  922.       if MustBreak or
  923.          ((Pages[nPages-1].StartDrawItemNo<>i) and
  924.          not dli.CanSplitFirst(y)) then begin
  925.         if not MustBreak and FindFirstItemOnPage(True) then
  926.           exit;
  927.         rvpi := Pages.Add;
  928.         rvpi.StartDrawItemNo := i;
  929.         rvpi.StartY       := -GetDevY(pi.SpaceBefore);
  930.         rvpi.StartPart    := 1;
  931.         DoFormatting(nPages, rvpsProceeding);
  932.         StartY := 0;
  933.         StartAt := 0;
  934.         y := StartY+MaxHeight-StartAt+rvpi.StartY;
  935.         dec(y, GetDevY(pi.SpaceAfter));
  936.         Splitting := True;
  937.         exit;
  938.       end;
  939.       Splitting := True;
  940.       FormatNextPage(i, StartAt, StartY, Y, Splitting, MaxHeight);
  941.       exit;
  942.     end;
  943.     y := dli.Top+dli.Height;
  944.     inc(y, GetDevY(pi.SpaceAfter));
  945.     if (y>StartY+MaxHeight-StartAt) or MustBreak then begin // i-th item does not fit in page, or mandatory break
  946.       FindFirstItemOnPage(False);
  947.       exit;
  948.       end
  949.     else
  950.       inc(i);
  951.    end;
  952.    j := DrawItems.Count-1;
  953.    dli := DrawItems[j];
  954.    pi := GetRVStyle.ParaStyles[GetItemPara(dli.ItemNo)];
  955.    StartAt := dli.Top+dli.Height;
  956.    for j := DrawItems.Count-1  downto 0 do begin
  957.      if DrawItems[j].Top+DrawItems[j].Height>StartAt then
  958.        StartAt := DrawItems[j].Top+DrawItems[j].Height;
  959.      if DrawItems[j].FromNewLine then
  960.        break;
  961.    end;
  962.    inc(StartAt, GetDevY(pi.SpaceAfter));
  963.    rvpi := Pages[nPages-1];
  964.    if rvpi.StartPart=0 then
  965.      TPrintableRV(FRichView).RVPrint.EndAt := StartAt-rvpi.StartY
  966.    else
  967.      TPrintableRV(FRichView).RVPrint.EndAt := StartAt-rvpi.StartY2;
  968.    if nPages=1 then
  969.      inc(TPrintableRV(FRichView).RVPrint.EndAt, TPrintableRV(FRichView).RVPrint.StartAt);
  970.    DoFormatting(nPages,rvpsProceeding);
  971. end;
  972. {------------------------------------------------------------------------------}
  973. procedure TCustomMainPtblRVData.DrawPage(pgNo: Integer; Canvas: TCanvas;
  974.   Preview, Correction: Boolean);
  975. begin
  976.   if (pgNo>0) and (pgNo<=Pages.Count) then
  977.     inherited
  978. end;
  979. {------------------------------------------------------------------------------}
  980. function TCustomMainPtblRVData.FormatPages: Integer;
  981. var i, StartAt, StartY,y: Integer;
  982.     Splitting: Boolean;
  983.     MaxHeight: Integer;
  984. begin
  985.    DoFormatting(0, rvpsStarting);
  986.    PrinterCanvas := InitPrinterCanvas;
  987.    FIsDestinationReady := PrinterCanvas<>nil;
  988.    if FIsDestinationReady then begin
  989.      Prepare;
  990.      TCustomRichView(FRichView).MaxTextWidth :=
  991.        RV_XToScreen(FRichView.Width, PrnSaD)-GetLeftMargin-GetRightMargin;
  992.      Format_(False, True, False, 0, PrinterCanvas, False, False, False);
  993.      DonePrinterCanvas(PrinterCanvas);
  994.      PrinterCanvas := nil;
  995.      end
  996.    else
  997.      ClearTemporal;
  998.    Pages.Clear;
  999.    Result := 0;
  1000.    if DrawItems.Count = 0 then exit;
  1001.    MaxHeight := FRichView.Height - (TmpTMPix+TmpBMPix);
  1002.    DoFormatting(0, rvpsProceeding);
  1003.    i := 0;
  1004.    while i<DrawItems.Count do
  1005.      FormatNextPage(i, StartAt, StartY, Y, Splitting, MaxHeight);
  1006.    Result := Pages.Count;
  1007.    DoFormatting(Result, rvpsFinished);
  1008. end;
  1009. {------------------------------------------------------------------------------}
  1010. procedure TCustomMainPtblRVData.DoFormatting(PageCompleted: Integer; Step: TRVPrintingStep);
  1011. begin
  1012. end;
  1013. {------------------------------------------------------------------------------}
  1014. function TCustomMainPtblRVData.GetPrintableAreaLeft(PageNo: Integer): Integer;
  1015. begin
  1016.   Result := TmpLM;
  1017. end;
  1018. {------------------------------------------------------------------------------}
  1019. function TCustomMainPtblRVData.GetPrintableAreaTop: Integer;
  1020. begin
  1021.   Result := TmpTM;
  1022. end;
  1023. {------------------------------------------------------------------------------}
  1024. function TCustomMainPtblRVData.GetBack: TRVBackground;
  1025. begin
  1026.   Result := TCustomRichView(FRichView).Background;
  1027. end;
  1028. {------------------------------------------------------------------------------}
  1029. function TCustomMainPtblRVData.GetTopCoord(PageNo: Integer): Integer;
  1030. begin
  1031.   Result := Pages[PageNo-1].StartY-TmpTM-TmpTMPix;
  1032.   if PageNo=1 then
  1033.     dec(Result,TPrintableRV(FRichView).RVPrint.StartAt);
  1034. end;
  1035. {------------------------------------------------------------------------------}
  1036. function TCustomMainPtblRVData.GetTopCoord2(PageNo: Integer): Integer;
  1037. begin
  1038.   Result := Pages[PageNo-1].StartY2-TmpTM-TmpTMPix;
  1039.   if PageNo=1 then
  1040.     dec(Result,TPrintableRV(FRichView).RVPrint.StartAt);
  1041. end;
  1042. {------------------------------------------------------------------------------}
  1043. procedure TCustomMainPtblRVData.GetSADForFormatting(Canvas: TCanvas; var sad: TRVScreenAndDevice);
  1044. begin
  1045.   sad := PrnSaD;
  1046. end;
  1047. {------------------------------------------------------------------------------}
  1048. procedure TCustomMainPtblRVData.CheckPageNo(PageNo: Integer);
  1049. begin
  1050.   if (PageNo<1) or (PageNo>Pages.Count) then
  1051.     raise ERichViewError.Create(errInvalidPageNo);
  1052. end;
  1053. {------------------------------------------------------------------------------}
  1054. procedure TCustomMainPtblRVData.Prepare;
  1055. begin
  1056.   RV_InfoAboutSaD(PrnSaD, PrinterCanvas);
  1057.   if RichViewPixelsPerInch<>0 then begin
  1058.     PrnSaD.ppixScreen := RichViewPixelsPerInch;
  1059.     PrnSaD.ppiyScreen := RichViewPixelsPerInch;    
  1060.   end;
  1061.   GetSADForFormatting(PrinterCanvas, PrnSad);
  1062.   TmpTMPix := MulDiv(FTopMarginPix,    PrnSaD.ppiyDevice, PrnSaD.ppiyScreen);
  1063.   TmpBMPix := MulDiv(FBottomMarginPix, PrnSaD.ppiyDevice, PrnSaD.ppiyScreen);
  1064. end;
  1065. {------------------------------------------------------------------------------}
  1066. function TCustomMainPtblRVData.GetColorMode: TRVColorMode;
  1067. begin
  1068.   Result := ColorMode;
  1069. end;
  1070. {------------------------------------------------------------------------------}
  1071. procedure TCustomMainPtblRVData.RVFGetLimits(SaveScope: TRVFSaveScope;
  1072.                              var StartItem, EndItem, StartOffs, EndOffs: Integer;
  1073.                              var StartPart, EndPart: TRVMultiDrawItemPart);
  1074. var StartPartIndex, EndPartIndex: Integer;
  1075. begin
  1076.   if SaveScope=rvfss_Page then begin
  1077.     StartPartIndex := -1;
  1078.     EndPartIndex   := -1;
  1079.     GetDrawItemsRange(StreamSavePage, StartItem, EndItem, StartPartIndex);
  1080.     StartOffs := GetOffsBeforeDrawItem(StartItem);
  1081.     EndOffs   := GetOffsAfterDrawItem(EndItem);
  1082.     if (EndItem>StartItem) and
  1083.        (StreamSavePage<Pages.Count) and
  1084.        (Pages[StreamSavePage].StartPart>1) then
  1085.       EndPartIndex := 0;
  1086.     if StartPartIndex<0 then
  1087.       StartPart := nil
  1088.     else
  1089.       StartPart := (DrawItems[StartItem] as TRVMultiDrawItemInfo).PartsList[StartPartIndex];
  1090.     if EndPartIndex<0 then
  1091.       EndPart := nil
  1092.     else
  1093.       EndPart := (DrawItems[EndItem] as TRVMultiDrawItemInfo).PartsList[EndPartIndex];
  1094.     DrawItem2Item(StartItem, StartOffs, StartItem, StartOffs);
  1095.     DrawItem2Item(EndItem, EndOffs, EndItem, EndOffs);
  1096.     end
  1097.   else
  1098.     inherited RVFGetLimits(SaveScope, StartItem, EndItem, StartOffs, EndOffs,
  1099.                            StartPart, EndPart);
  1100. end;
  1101. {------------------------------------------------------------------------------}
  1102. {$IFNDEF RVDONOTUSERVF}
  1103. function TCustomMainPtblRVData.SavePageAsRVF(Stream: TStream; PageNo: Integer;
  1104.   Color: TColor; Background: TRVBackground; Layout: TRVLayoutInfo): Boolean;
  1105. begin
  1106.   StreamSavePage := PageNo;
  1107.   Result := SaveRVFToStreamEx(Stream, rvfss_Page, Color, Background, Layout)
  1108. end;
  1109. {$ENDIF}
  1110. {============================== TPrintableRVData ==============================}
  1111. constructor TPrintableRVData.Create(RichView: TRVScroller);
  1112. begin
  1113.   inherited Create(RichView);
  1114.   HeaderY := 10;
  1115.   FooterY := 10;
  1116. end;
  1117. {------------------------------------------------------------------------------}
  1118. destructor TPrintableRVData.Destroy;
  1119. begin
  1120.   Footer.Free;
  1121.   Header.Free;
  1122.   inherited Destroy;
  1123. end;
  1124. {------------------------------------------------------------------------------}
  1125. procedure TPrintableRVData.DoPagePrepaint(Canvas: TCanvas; PageNo:Integer; Preview, Correction: Boolean);
  1126. var r: TRect;
  1127. begin
  1128.   r := Bounds(GetPrintableAreaLeft(PageNo), GetPrintableAreaTop,GetWidth,GetHeight);
  1129.   if Assigned(TRVPrint(TPrintableRV(FRichView).RVPrint).OnPagePrepaint) then
  1130.     TRVPrint(TPrintableRV(FRichView).RVPrint).OnPagePrepaint(
  1131.       TRVPrint(TPrintableRV(FRichView).RVPrint), PageNo, Canvas, Preview,
  1132.         Rect(0, 0, TmpLM+TmpRM+GetWidth, TmpTM+TmpBM+GetHeight),
  1133.         r
  1134.       );
  1135.   if Header<>nil then
  1136.     Header.DrawPage(1, Canvas, Preview, Correction);
  1137.   if Footer<>nil then
  1138.     Footer.DrawPage(1, Canvas, Preview, Correction);
  1139.   rgn := CreateRectRgn(0,0,1,1);
  1140.   rgnres := GetClipRgn(Canvas.Handle, rgn);
  1141.   if TRVPrint(TPrintableRV(FRichView).RVPrint).ClipMargins then
  1142.     with r do
  1143.       IntersectClipRect(Canvas.Handle,Left,Top,Right,Bottom);
  1144. end;
  1145. {------------------------------------------------------------------------------}
  1146. procedure TPrintableRVData.DoPagePostpaint(Canvas: TCanvas; PageNo:Integer; Preview: Boolean);
  1147. var r: TRect;
  1148. begin
  1149.   if rgnres=1 then
  1150.     SelectClipRgn(Canvas.Handle, rgn)
  1151.   else
  1152.     SelectClipRgn(Canvas.Handle, 0);
  1153.   DeleteObject(rgn);
  1154.   r := Bounds(GetPrintableAreaLeft(PageNo), GetPrintableAreaTop,GetWidth,GetHeight);
  1155.   if Assigned(TRVPrint(TPrintableRV(FRichView).RVPrint).OnPagePostpaint) then
  1156.     TRVPrint(TPrintableRV(FRichView).RVPrint).OnPagePostpaint(
  1157.       TRVPrint(TPrintableRV(FRichView).RVPrint), PageNo, Canvas, Preview,
  1158.         Rect(0, 0, TmpLM+TmpRM+GetWidth, TmpTM+TmpBM+GetHeight),
  1159.         r
  1160.       );
  1161. end;
  1162. {------------------------------------------------------------------------------}
  1163. function TPrintableRVData.InitPrinterCanvas: TCanvas;
  1164. var HDC: THandle;
  1165. begin
  1166.   HDC := RV_GetPrinterDC;
  1167.   if HDC=0 then
  1168.     Result := nil
  1169.   else begin
  1170.     Result := TCanvas.Create;
  1171.     Result.Handle := HDC;
  1172.   end;
  1173. end;
  1174. {------------------------------------------------------------------------------}
  1175. procedure TPrintableRVData.DonePrinterCanvas(Canvas: TCanvas);
  1176. var PHDC: HDC;
  1177. begin
  1178.   PHDC := Canvas.Handle;
  1179.   Canvas.Handle := 0;
  1180.   Canvas.Free;
  1181.   DeleteDC(PHDC);
  1182. end;
  1183. {------------------------------------------------------------------------------}
  1184. procedure TPrintableRVData.DoFormatting(PageCompleted: Integer;
  1185.   Step: TRVPrintingStep);
  1186. begin
  1187.   if Assigned(TRVPrint(TPrintableRV(FRichView).RVPrint).OnFormatting) then
  1188.     TRVPrint(TPrintableRV(FRichView).RVPrint).OnFormatting(TPrintableRV(FRichView), PageCompleted, Step);
  1189. end;
  1190. {------------------------------------------------------------------------------}
  1191. function TPrintableRVData.GetPrintableAreaLeft(PageNo: Integer): Integer;
  1192. begin
  1193.   if not TPrintableRV(FRichView).FMirrorMargins or ((PageNo mod 2)=1) then
  1194.     Result := TmpLM
  1195.   else
  1196.     Result := TmpLMMir;
  1197. end;
  1198. {------------------------------------------------------------------------------}
  1199. function TPrintableRVData.GetPageHeight: Integer;
  1200. begin
  1201.   Result := Printer.PageHeight;
  1202. end;
  1203. {------------------------------------------------------------------------------}
  1204. function TPrintableRVData.GetPageWidth: Integer;
  1205. begin
  1206.   Result := Printer.PageWidth;
  1207. end;
  1208. {------------------------------------------------------------------------------}
  1209. procedure TPrintableRVData.Prepare;
  1210. var phoX, phoY, phW, phH, lpy, lpx, footeroffs: Integer;
  1211.     PHDC: HDC;
  1212. begin
  1213.   inherited Prepare;
  1214.   PrinterCanvas.Font.PixelsPerInch := PrnSaD.ppiyDevice;
  1215.   PHDC := PrinterCanvas.Handle;
  1216.   lpy := GetDeviceCaps(PHDC, LOGPIXELSY);
  1217.   lpx := GetDeviceCaps(PHDC, LOGPIXELSX);
  1218.   phoX := GetDeviceCaps(PHDC, PHYSICALOFFSETX);
  1219.   phoY := GetDeviceCaps(PHDC, PHYSICALOFFSETY);
  1220.   phW  := GetDeviceCaps(PHDC, PHYSICALWIDTH);
  1221.   phH  := GetDeviceCaps(PHDC, PHYSICALHEIGHT);
  1222.   {
  1223.   if phW>phoX+GetPageWidth then
  1224.     phW := phoX+GetPageWidth;
  1225.   if phH>phoY+GetPageHeight then
  1226.     phH := phoY+GetPageHeight;
  1227.   }
  1228.   with TPrintableRV(FRichView) do begin
  1229.     TmpLM := MulDiv(FLeftMarginMM,   5*lpx, 127)- phoX;
  1230.     TmpTM := MulDiv(FTopMarginMM,    5*lpy, 127)- phoY;
  1231.     TmpRM := MulDiv(FRightMarginMM,  5*lpx, 127)- (phW-(phoX+GetPageWidth));
  1232.     TmpBM := MulDiv(FBottomMarginMM, 5*lpy, 127)- (phH-(phoY+GetPageHeight));
  1233.     TmpLMMir := MulDiv(FRightMarginMM,   5*lpx, 127)- phoX;
  1234.   end;
  1235.   if TmpLM<0 then TmpLM := 0;
  1236.   if TmpTM<0 then TmpTM := 0;
  1237.   if TmpRM<0 then TmpRM := 0;
  1238.   if TmpBM<0 then TmpBM := 0;
  1239.   if TmpLMMir<0 then TmpLMMir := 0;
  1240.   if Header<>nil then begin
  1241.     Header.Left := TmpLM;
  1242.     Header.Width := GetPageWidth - (TmpLM+TmpRM);
  1243.     Header.Top := MulDiv(HeaderY,  5*lpy, 127)- phoY;
  1244.     if Header.Top<0 then
  1245.       Header.Top := 0;
  1246.     Header.Height := 1;
  1247.     Header.Format(True);
  1248.     if TmpTM<Header.Top+Header.DocumentHeight then
  1249.       TmpTM := Header.Top+Header.DocumentHeight;
  1250.   end;
  1251.   if Footer<>nil then begin
  1252.     Footer.Left := TmpLM;
  1253.     Footer.Width := GetPageWidth - (TmpLM+TmpRM);
  1254.     Footer.Top := 0;
  1255.     Footer.Height := 1;
  1256.     Footer.Format(True);
  1257.     footeroffs := MulDiv(FooterY,  5*lpy, 127)-(phH-(phoY+GetPageHeight))+Footer.DocumentHeight;
  1258.     Footer.Top := GetPageHeight-footeroffs;
  1259.     if TmpBM<footeroffs then
  1260.       TmpBM := footeroffs;
  1261.   end;
  1262.   State := State+[rvstSkipformatting];
  1263.   try
  1264.     FRichView.ClientWidth := GetPageWidth - (TmpLM+TmpRM);
  1265.     FRichView.ClientHeight:= GetPageHeight - (TmpTM+TmpBM);
  1266.   finally
  1267.     State := State-[rvstSkipformatting];
  1268.   end;
  1269. end;
  1270. {================================ TRectPtblRVData =============================}
  1271. constructor TRectPtblRVData.Create(RichView: TRVScroller;
  1272.   SourceDataForPrinting: TCustomRVFormattedData;
  1273.   ParentPrintData: TCustomPrintableRVData);
  1274. begin
  1275.   inherited Create(RichView);
  1276.   FSourceDataForPrinting := SourceDataForPrinting;
  1277.   FParentPrintData := ParentPrintData;
  1278.   ShareItemsFrom(SourceDataForPrinting);
  1279. end;
  1280. {------------------------------------------------------------------------------}
  1281. function TRectPtblRVData.GetPrintableAreaLeft(PageNo: Integer): Integer;
  1282. begin
  1283.   Result := Left+DX;
  1284. end;
  1285. {------------------------------------------------------------------------------}
  1286. function TRectPtblRVData.GetPrintableAreaTop: Integer;
  1287. begin
  1288.   Result := Top+DY;
  1289. end;
  1290. {------------------------------------------------------------------------------}
  1291. procedure TRectPtblRVData.GetSADForFormatting(Canvas: TCanvas; var sad: TRVScreenAndDevice);
  1292. begin
  1293.   sad := TCustomMainPtblRVData(TPrintableRV(FRichView).RVData).PrnSaD;
  1294. end;
  1295. {------------------------------------------------------------------------------}
  1296. function TRectPtblRVData.GetTopCoord(PageNo: Integer): Integer;
  1297. begin
  1298.   Result := -(Top+DY);
  1299. end;
  1300. {------------------------------------------------------------------------------}
  1301. function TRectPtblRVData.GetWidth: Integer;
  1302. begin
  1303.   Result := Width;
  1304. end;
  1305. {------------------------------------------------------------------------------}
  1306. function TRectPtblRVData.GetHeight: Integer;
  1307. begin
  1308.   Result := Height;
  1309. end;
  1310. {------------------------------------------------------------------------------}
  1311. function TRectPtblRVData.InitPrinterCanvas: TCanvas;
  1312. begin
  1313.   Result := GetCanvas;
  1314. end;
  1315. {------------------------------------------------------------------------------}
  1316. function TRectPtblRVData.GetColorMode: TRVColorMode;
  1317. begin
  1318.   Result := TCustomMainPtblRVData(TPrintableRV(FRichView).RVData).ColorMode;
  1319. end;
  1320. {------------------------------------------------------------------------------}
  1321. function TRectPtblRVData.GetCanvas: TCanvas;
  1322. begin
  1323.   Result := TCustomMainPtblRVData(TPrintableRV(FRichView).RVData).PrinterCanvas;
  1324. end;
  1325. {------------------------------------------------------------------------------}
  1326. function TRectPtblRVData.GetColor: TColor;
  1327. begin
  1328.   Result := FColor;
  1329. end;
  1330. {------------------------------------------------------------------------------}
  1331. function TRectPtblRVData.GetBottomMargin: Integer;
  1332. begin
  1333.   Result := 0;
  1334. end;
  1335. {------------------------------------------------------------------------------}
  1336. function TRectPtblRVData.GetLeftMargin: Integer;
  1337. begin
  1338.   Result := 0;
  1339. end;
  1340. {------------------------------------------------------------------------------}
  1341. function TRectPtblRVData.GetRightMargin: Integer;
  1342. begin
  1343.   Result := 0;
  1344. end;
  1345. {------------------------------------------------------------------------------}
  1346. function TRectPtblRVData.GetTopMargin: Integer;
  1347. begin
  1348.   Result := 0;
  1349. end;
  1350. {------------------------------------------------------------------------------}
  1351. procedure TRectPtblRVData.DoOnHyperlink(RVData: TCustomRVData;
  1352.   ItemNo: Integer; const R: TRect);
  1353. begin
  1354.   FParentPrintData.DoOnHyperlink(RVData, ItemNo, R);
  1355. end;
  1356. {------------------------------------------------------------------------------}
  1357. procedure TRectPtblRVData.DoOnCheckpoint(RVData: TCustomRVData;
  1358.   ItemNo, X, Y: Integer);
  1359. begin
  1360.   FParentPrintData.DoOnCheckpoint(RVData, ItemNo, X, Y);
  1361. end;
  1362. {------------------------------------------------------------------------------}
  1363. function TRectPtblRVData.GetSourceRVDataForPrinting: TCustomRVData;
  1364. begin
  1365.   Result := FSourceDataForPrinting;
  1366. end;
  1367. {------------------------------------------------------------------------------}
  1368. function TRectPtblRVData.GetParentData: TCustomRVData;
  1369. begin
  1370.   Result := FParentPrintData; // TCustomRichView(FRichView).RVData;
  1371. end;
  1372. {------------------------------------------------------------------------------}
  1373. function TRectPtblRVData.GetRootData: TCustomRVData;
  1374. begin
  1375.   Result := GetParentData.GetRootData;
  1376. end;
  1377. {------------------------------------------------------------------------------}
  1378. procedure TRectPtblRVData.DrawBackToBitmap(Left, Top: Integer;
  1379.   bmp: TBitmap; const sad: TRVScreenAndDevice; ItemBackgroundLayer: Integer;
  1380.   RelativeToItem: Boolean);
  1381. var r, r2: TRect;
  1382.     l,t: Integer;
  1383.     pi: TParaInfo;
  1384.     item: TCustomRVItemInfo;
  1385. begin
  1386.   if RelativeToItem then begin
  1387.     inc(Left, RV_XToScreen(FDrawItem.Left, sad));
  1388.     inc(Top, RV_YToScreen(FItemTop-GetPrintableAreaTop, sad));
  1389.   end;
  1390.   item := GetItem(FDrawItem.ItemNo);
  1391.   pi := GetRVStyle.ParaStyles[item.ParaNo];
  1392.   r := Rect(0,0, bmp.Width, bmp.Height);
  1393.   if pi.Background.Color<>clNone then begin
  1394.     bmp.Canvas.Brush.Color := pi.Background.Color;
  1395.     bmp.Canvas.FillRect(r);
  1396.     end
  1397.   else if Transparent then begin
  1398.     l := Left+
  1399.       RV_XToScreen(GetPrintableAreaLeft(FPageNo)-
  1400.         FParentPrintData.GetPrintableAreaLeft(FParentPrintData.FPageNo), sad);
  1401.     t := Top+
  1402.       RV_YToScreen(GetPrintableAreaTop-FParentPrintData.GetPrintableAreaTop, sad);
  1403.     FParentPrintData.DrawBackToBitmap(l, t, bmp, sad, -1, False);
  1404.     end
  1405.   else
  1406.     inherited;
  1407.   if ItemBackgroundLayer<>0 then begin
  1408.     r2 := Bounds(RV_XToScreen(FDrawItem.Left, sad)-Left,
  1409.       RV_YToScreen(FItemTop-GetPrintableAreaTop, sad)-Top,
  1410.       RV_XToScreen(FDrawItem.Width,sad),
  1411.       RV_YToScreen(FDrawItem.Height,sad));
  1412.     GetItem(FDrawItem.ItemNo).DrawBackgroundForPrinting(bmp.Canvas, r, r2, GetColorMode, ItemBackgroundLayer);
  1413.   end;
  1414. end;
  1415. {------------------------------------------------------------------------------}
  1416. function TRectPtblRVData.GetMaxTextWidth: Integer;
  1417. begin
  1418.   Result := 0;
  1419. end;
  1420. {------------------------------------------------------------------------------}
  1421. function TRectPtblRVData.GetMinTextWidth: Integer;
  1422. begin
  1423.   Result := 0;
  1424. end;
  1425. {========================= TRVHeaderFooterRVData ==============================}
  1426. constructor TRVHeaderFooterRVData.Create(RichView: TRVScroller;
  1427.   SourceDataForPrinting: TCustomRVFormattedData;
  1428.   ParentPrintData: TCustomPrintableRVData);
  1429. begin
  1430.   inherited;
  1431.   FColor := clNone;
  1432. end;
  1433. {------------------------------------------------------------------------------}
  1434. function TRVHeaderFooterRVData.GetRVStyle: TRVStyle;
  1435. begin
  1436.   Result := FSourceDataForPrinting.GetRVStyle;
  1437. end;
  1438. end.