⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptrvdata.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  DefCharExtra := GetTextCharacterExtra(Canvas.Handle);
  tmpbmp := TBitmap.Create;
  {$IFDEF RVDEBUGTABLE}
  if Self is TRectPtblRVData then begin
    Canvas.Pen.Color := clRed;
    Canvas.Pen.Width := 0;
    Canvas.Rectangle(GetPrintableAreaLeft,GetPrintableAreaTop,
                     GetPrintableAreaLeft+ TRectPtblRVData(Self).Width,
                     GetPrintableAreaTop+TRectPtblRVData(Self).Height);
    end
  else begin
  {
    if PgNo=1 then
      with Self as TCustomMainPtblRVData do  begin
        Canvas.Pen.Color := clRed;
        Canvas.Pen.Width := 0;
        Canvas.Pen.Style  := psDot;
        Canvas.MoveTo(LeftOffs-300, TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.StartAt);
        Canvas.LineTo(300+GetWidth+LeftOffs-GetDevX(GetRightMargin), TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.StartAt);
        Canvas.Pen.Style  := psSolid;
      end;
    if PgNo=(Self as TCustomMainPtblRVData).PagesColl.Count then
      with Self as TCustomMainPtblRVData do  begin
        Canvas.Pen.Color := clRed;
        Canvas.Pen.Width := 0;
        Canvas.Pen.Style  := psDot;
        Canvas.MoveTo(LeftOffs-300, TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.EndAt);
        Canvas.LineTo(300+GetWidth+LeftOffs-GetDevX(GetRightMargin), TmpTM+TmpTMPix+TPrintableRV(FRichView).FRVPrint.EndAt);
        Canvas.Pen.Style  := psSolid;
      end
    }
  end;
  {$ENDIF}
  if Preview and (GetRVLogPalette<>nil) then
    tmpbmp.Palette := CreatePalette(GetRVLogPalette^);
  XPos := 0;
  try
    for i:=first to last do begin
      dli := DrawItems[i];
      li := GetItem(dli.ItemNo);
      BiDiMode := GetParaBiDiMode(li.ParaNo);
      if (i=last) and (i<>first) and (dli is TRVMultiDrawItemInfo) and
          (TRVMultiDrawItemInfo(dli).PartsList.Count>0) then
        part := 0;
      if not Correction or dli.FromNewLine or (dli.Left>XPos) or (BiDiMode=rvbdRightToLeft) then
        XPos := dli.Left;

      if ((i=first) or
         ((dli.ItemNo<>DrawItems[i-1].ItemNo) and
           li.CanBeBorderStart)) and
         (li.StyleNo<>rvsBreak) then
         DrawParagraph(i);
      no := li.StyleNo;
      if no>=0 then begin{ text }
        RVStyle.ApplyStyleColor(Canvas, no, []);
        RVStyle.ApplyStyle(Canvas, no, BiDiMode);
        TextStyle := RVStyle.TextStyles[no];
        if TextStyle.BiDiMode=rvbdUnspecified then
          BidiMode2 := BiDiMode
        else
          BidiMode2 := TextStyle.BiDiMode;
        if BidiMode2<>rvbdRightToLeft then begin
          if TextStyle.CharSpacing<>0 then
            SetTextCharacterExtra(Canvas.Handle, GetDevX(TextStyle.CharSpacing));
          if Correction and (dli.Length>1) and (BiDiMode<>rvbdRightToLeft) then begin
            CharExtra := dli.Width{$IFNDEF DONOTUSEJUSTIFY}-dli.SpaceBefore{$ENDIF}
                       - RVU_TextWidth({$IFNDEF RVDONOTUSEALLCAPS}
                                 RV_ReturnCapitalized(DrawItems.GetString(i,Items), RVStyle.TextStyles[No]),
                                 {$ELSE}
                                 DrawItems.GetString(i,Items),
                                 {$ENDIF}
                                 Canvas, li.ItemOptions);
            CharExtra := GetDevX(TextStyle.CharSpacing)+(DefCharExtra*(dli.Length-1)+CharExtra) div (dli.Length-1);
            SetTextCharacterExtra(Canvas.Handle,CharExtra);
          end;
        end;
        if Assigned(RVStyle.OnDrawTextBack) then begin
          Dummy := True;
          RVStyle.OnDrawTextBack(RVStyle, Canvas, no, XPos+LeftOffs, dli.Top-zerocoord, dli.Width, dli.Height, [], Dummy);
        end;
        RVStyle.DrawStyleText(DrawItems.GetString(i,Items), Canvas, dli.ItemNo, 1,  no, Self,
             {$IFNDEF DONOTUSEJUSTIFY}dli.SpaceBefore,{$ELSE}0,{$ENDIF}
             XPos+LeftOffs, dli.Top-zerocoord, dli.Width, dli.Height, [], True);
        SetTextCharacterExtra(Canvas.Handle,DefCharExtra);
        if Correction then begin
          LineWidth := RVU_TextWidth(DrawItems.GetString(i,Items), Canvas, li.ItemOptions)
                   {$IFNDEF DONOTUSEJUSTIFY}+dli.SpaceBefore{$ENDIF};
          if LineWidth>dli.Width then
            inc(XPos, LineWidth)
          else
            inc(XPos, dli.Width);
        end;
        end
      else begin // nontext
        if li.GetBoolValueEx(rvbpPrintToBMP, RVStyle) then begin
          if (Part>0) or ((Part=0)and(i=first)) then
            ItemTop := -zerocoord
          else
            ItemTop := dli.Top-zerocoord;
          if (Part>=0) then
            h := MulDiv(TRVMultiDrawItemPart(TRVMultiDrawItemInfo(dli).PartsList[Part]).Height,
              sad.ppiyScreen, sad.ppiyDevice)
          else
            h := li.GetImageHeight(RVStyle);
          if li.GetBoolValue(rvbpFullWidth) then
            w := MulDiv(GetWidth-GetDevX(GetRightMargin)-dli.Left,
                                   sad.ppixScreen, sad.ppixDevice)
          else
            w  := li.GetImageWidth(RVStyle);
          tmpbmp.Width := w;
          tmpbmp.Height := h;
          DrawBackToTmpBmp(ItemTop);
          if li.PrintToBitmap(tmpbmp, Preview, FRichView, dli, Part) then
            RV_PictureToDevice(Canvas,
                               XPos+LeftOffs+ GetDevX(li.GetBorderWidth),
                               ItemTop + GetDevY(li.GetBorderWidth),
                               w, h,
                               sad, tmpbmp, Preview);
          end
        else begin
          if (Part>0) or ((Part=0)and(i=first)) then
            ItemTop := -zerocoord
          else
            ItemTop := dli.Top-zerocoord;
          if li.GetBoolValue(rvbpFullWidth) then
            li.Print(Canvas, XPos+LeftOffs, ItemTop,
                     GetWidth+LeftOffs-GetDevX(GetRightMargin),
                     Preview, Correction, sad, FRichView, dli, part)
          else
            li.Print(Canvas, XPos+LeftOffs, ItemTop,0,
                     Preview, Correction, sad, FRichView, dli, part);
        end;
        inc(XPos,dli.Width);
        if part<>-1 then begin
          if i=first then
            zerocoord := GetTopCoord2(PgNo);
          part := -1;
        end;
      end;
    end;
    DoPagePostpaint(Canvas, pgNo, Preview);
  finally
    backgroundbmp.Free;
    tmpbmp.Free;
  end;
end;
{============================ TCustomMainPtblRVData ===========================}
constructor TCustomMainPtblRVData.Create(RichView: TRVScroller);
begin
  inherited;
  PagesColl := TCollection.Create(TRVPageInfo);
end;
{------------------------------------------------------------------------------}
destructor TCustomMainPtblRVData.Destroy;
begin
  PagesColl.Free;
  inherited;
end;
{------------------------------------------------------------------------------}
function TCustomMainPtblRVData.GetColor: TColor;
begin
  if Transparent then
    Result := clNone
  else
    Result := inherited GetColor;
end;
{------------------------------------------------------------------------------}
function TCustomMainPtblRVData.GetPageHeight: Integer;
begin
  Result := 0;
end;
{------------------------------------------------------------------------------}
function TCustomMainPtblRVData.GetPageWidth: Integer;
begin
  Result := 0;
end;
{------------------------------------------------------------------------------}
procedure TCustomMainPtblRVData.GetDrawItemsRange(PageNo: Integer; var StartNo, EndNo, Part: Integer);
begin
  StartNo := TRVPageInfo(PagesColl.Items[PageNo-1]).StartDrawItemNo;
  Part := TRVPageInfo(PagesColl.Items[PageNo-1]).StartPart-1;
  //FirstOffs := TRVPageInfo(PagesColl.Items[PageNo-1]).FirstItemOff;
  if PageNo=PagesColl.Count then
    EndNo := DrawItems.Count-1
  else begin
    EndNo := TRVPageInfo(PagesColl.Items[PageNo]).StartDrawItemNo-1;
    if TRVPageInfo(PagesColl.Items[PageNo]).StartPart>1 then
      inc(EndNo);
  end;
end;
{------------------------------------------------------------------------------}
procedure TCustomMainPtblRVData.FormatNextPage(var i, StartAt, StartY, Y: Integer;
                                               var Splitting: Boolean;
                                               MaxHeight: Integer);
var j: Integer;
    dli, dli2, dli3 :TRVDrawLineInfo;
    nextnewline, tmp  : Integer;
    rvpi       : TRVPageInfo;
    nPages: Integer;
    MustBreak: Boolean;
    pi: TParaInfo;
    {................................................}
    function GetDevY(Y: Integer): Integer;
    begin
      Result := MulDiv(Y, PrnSaD.ppiyDevice, PrnSaD.ppiyScreen);
    end;
    {................................................}
begin
  if PagesColl.Count=0 then begin
    rvpi := TRVPageInfo(PagesColl.Add);
    rvpi.StartY := 0;
    rvpi.StartDrawItemNo := 0;
    StartY := 0;
    i := 0;
    StartAt := TPrintableRV(FRichView).RVPrint.StartAt;
    Splitting := False;
  end;
  nPages := PagesColl.Count;

  if Splitting then begin
    dli := DrawItems[i];
    pi := GetRVStyle.ParaStyles[TCustomRVItemInfo(Items.Objects[dli.ItemNo]).ParaNo];  
    while dli.SplitAt(y) do begin
      rvpi             := TRVPageInfo(PagesColl.Add);
      rvpi.StartDrawItemNo := i;
      dli              := DrawItems[i];
      rvpi.StartY      := -GetDevY(pi.SpaceBefore);
      rvpi.StartPart   := TRVMultiDrawItemInfo(dli).PartsList.Count;
      if TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo=i then
         TRVPageInfo(PagesColl.Items[nPages-1]).StartY2 :=
           dli.Top+dli.Height-
           TRVMultiDrawItemPart(TRVMultiDrawItemInfo(dli).PartsList[TRVMultiDrawItemInfo(dli).PartsList.Count-2]).Height-
           GetDevY(pi.SpaceBefore);
      DoFormatting(nPages, rvpsProceeding);
      StartAt := 0;
      StartY := 0;
      y := StartY+MaxHeight-StartAt+rvpi.StartY;
      dec(y, GetDevY(pi.SpaceAfter));
      exit;
    end;
    if TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo=i then begin
      StartY := dli.Top+dli.Height-
                TRVMultiDrawItemPart(TRVMultiDrawItemInfo(dli).PartsList[TRVMultiDrawItemInfo(dli).PartsList.Count-1]).Height-
                GetDevY(pi.SpaceBefore);
      TRVPageInfo(PagesColl.Items[nPages-1]).StartY2 := StartY;
    end;
    inc(i);
    Splitting := False;
  end;
  while i<DrawItems.Count do begin
    dli := DrawItems[i];
    pi := GetRVStyle.ParaStyles[TCustomRVItemInfo(Items.Objects[dli.ItemNo]).ParaNo];
    MustBreak := ((i>0) and (dli.ItemNo<>DrawItems[i-1].ItemNo) and
                  TCustomRVItemInfo(Items.Objects[dli.ItemNo]).PageBreakBefore and
                  (TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo<>i));
    if (dli is TRVMultiDrawItemInfo) and dli.InitSplit then begin
      if TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo=i then begin
        TRVPageInfo(PagesColl.Items[nPages-1]).StartPart := 1;
        TRVPageInfo(PagesColl.Items[nPages-1]).StartY := -GetDevY(pi.SpaceBefore);
      end;
      y := StartY+MaxHeight-StartAt-dli.Top;
      dec(y, GetDevY(pi.SpaceAfter));
      if MustBreak or
         ((TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo<>i) and
         not dli.CanSplitFirst(y)) then begin
        rvpi := TRVPageInfo(PagesColl.Add);
        rvpi.StartDrawItemNo := i;
        rvpi.StartY       := -GetDevY(pi.SpaceBefore);
        rvpi.StartPart    := 1;
        DoFormatting(nPages, rvpsProceeding);
        StartY := 0;
        StartAt := 0;
        y := StartY+MaxHeight-StartAt+rvpi.StartY;
        dec(y, GetDevY(pi.SpaceAfter));
        Splitting := True;
        exit;
      end;
      Splitting := True;
      FormatNextPage(i, StartAt, StartY, Y, Splitting, MaxHeight);
      exit;
    end;
    y := dli.Top+dli.Height;
    inc(y, GetDevY(pi.SpaceAfter));
    if (y>StartY+MaxHeight-StartAt) or MustBreak then begin // i-th item does not fit in page }
      { searching item will be first in new page }        // or mandatory break
      nextnewline := i;
      for j:=i downto 0 do
        if DrawItems[j].FromNewLine then begin
          nextnewline := j;
          break;
        end;
      { page must contain one line at least}
      if (StartAt<=0) and
        (nextnewline = TRVPageInfo(PagesColl.Items[nPages-1]).StartDrawItemNo) then begin
        tmp := nextnewline;
        nextnewline := DrawItems.Count;
        for j := tmp+1 to DrawItems.Count-1 do begin
          if DrawItems[j].FromNewLine then begin
            nextnewline := j;
            break;
          end;
        end;
      end;
      if nextnewline<>DrawItems.Count then begin
        { searching min y of first line in new page }
        dli2 := DrawItems[nextnewline];
        StartY := dli2.Top;
        for j := nextnewline+1 to DrawItems.Count-1 do begin
          dli3 := DrawItems[j];
          if dli3.FromNewLine then
            break;
          if dli3.Top<StartY then
            StartY := dli3.Top;
        end;
        rvpi             := TRVPageInfo(PagesColl.Add);
        rvpi.StartDrawItemNo := nextnewline;
        dli              := DrawItems[nextnewline];
        pi := GetRVStyle.ParaStyles[TCustomRVItemInfo(Items.Objects[dli.ItemNo]).ParaNo];
        dec(StartY, GetDevY(pi.SpaceBefore));
        rvpi.StartY      := StartY;
        DoFormatting(nPages, rvpsProceeding);
        StartAt := 0;
      end;
      i := nextnewline;
      exit;
      end
    else
      inc(i);
   end;
   j := DrawItems.Count-1;
   dli := DrawItems[j];
   pi := GetRVStyle.ParaStyles[TCustomRVItemInfo(Items.Objects[dli.ItemNo]).ParaNo];
   StartAt := dli.Top+dli.Height;
   for j := DrawItems.Count-1  downto 0 do begin
     if DrawItems[j].Top+DrawItems[j].Height>StartAt then
       StartAt := DrawItems[j].Top+DrawItems[j].Height;
     if DrawItems[j].FromNewLine then
       break;
   end;
   inc(StartAt, GetDevY(pi.SpaceAfter));
   rvpi := TRVPageInfo(PagesColl.Items[nPages-1]);
   if rvpi.StartPart=0 then
     TPrintableRV(FRichView).RVPrint.EndAt := StartAt-rvpi.StartY
   else
     TPrintableRV(FRichView).RVPrint.EndAt := StartAt-rvpi.StartY2;
   if nPages=1 then
     inc(TPrintableRV(FRichView).RVPrint.EndAt, TPrintableRV(FRichView).RVPrint.StartAt);
   DoFormatting(nPages,rvpsProceeding);
end;
{------------------------------------------------------------------------------}
function TCustomMainPtblRVData.FormatPages: Integer;
var i, StartAt, StartY,y: Integer;
    Splitting: Boolean;
    MaxHeight: Integer;
begin
   DoFormatting(0, rvpsStarting);
   PrinterCanvas := InitPrinterCanvas;
   Prepare;
   TCustomRichView(FRichView).MaxTextWidth := MulDiv(FRichView.Width,
            PrnSaD.ppixScreen, PrnSaD.ppixDevice);
   Format_(False, True, False, 0, PrinterCanvas, False, False);
   DonePrinterCanvas(PrinterCanvas);
   PrinterCanvas := nil;
   PagesColl.Clear;
   Result := 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -