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

RichEdit

开发平台:

Delphi

  1.               Control.Visible := False;
  2.               Control.Parent := TCustomRVData(RVData).GetParentControl;
  3.             end;
  4.           else
  5.             begin
  6.               SetExtraPropertyFromRVFStr(s);
  7.             end;
  8.         end;
  9.       end;
  10.     else // read from file
  11.       begin
  12.         if LineNo=0 then
  13.           Name := s
  14.         else if LineNo=1 then begin
  15.           ControlClass := TControlClass(GetClass(s));
  16.           if ControlClass<>nil then begin
  17.             Control := ControlClass.Create(nil);
  18.             Control.Visible := False;
  19.             Control.Parent := TCustomRVData(RVData).GetParentControl;
  20.           end;
  21.           end
  22.         else if LineNo=LineCount-1 then begin
  23.           if ReadType=2 then
  24.             RVFLoadControlBinary(s, TComponent(Control), '', TCustomRVData(RVData).GetParentControl)
  25.           else
  26.             Result := RVFLoadControl(s, TComponent(Control), '', TCustomRVData(RVData).GetParentControl);
  27.           if Result then
  28.             if Control=nil then begin
  29.               TCustomRVData(RVData).RVFWarnings := TCustomRVData(RVData).RVFWarnings + [rvfwUnknownCtrls];
  30.               if not (rvfoIgnoreUnknownCtrls in TCustomRVData(RVData).RVFOptions) then
  31.                 Result := False;
  32.             end;
  33.           ReadState := rstSkip;
  34.           end
  35.         else
  36.           SetExtraPropertyFromRVFStr(s);
  37.         if (ReadType=2) and (LineNo=LineCount-2) then
  38.             ReadMode := rmBeforeBinary;
  39.       end;
  40.   end;
  41. end;
  42. {------------------------------------------------------------------------------}
  43. function TRVControlItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  44. begin
  45.   case Prop of
  46.     rvbpValid:
  47.       Result := Control<>nil;
  48.     rvbpDisplayActiveState,rvbpImmediateControlOwner:
  49.       Result := True;
  50.     rvbpResizable:
  51.       Result := FResizable and (PercentWidth=0);
  52.     rvbpResizeHandlesOutside:
  53.       Result := True;
  54.     else
  55.       Result := inherited GetBoolValue(Prop);
  56.   end;
  57. end;
  58. {------------------------------------------------------------------------------}
  59. function TRVControlItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean;
  60. begin
  61.   case Prop of
  62.     rvbpAllowsFocus:
  63.       Result := (Control<>nil) and (Control is TWinControl) and
  64.                 TWinControl(Control).TabStop and
  65.                 TWinControl(Control).CanFocus;
  66.     rvbpActualPrintSize:
  67.       Result := (PercentWidth>0) and (PercentWidth<=100);
  68.     rvbpXORFocus:
  69.       Result := False;
  70.     else
  71.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  72.   end;
  73. end;
  74. {------------------------------------------------------------------------------}
  75. function TRVControlItemInfo.AsText(LineWidth: Integer;
  76.                            RVData: TPersistent;
  77.                            const Text, Path: String;
  78.                            TextOnly,Unicode: Boolean): String;
  79. begin
  80.   Result := TCustomRVData(RVData).SaveComponentToFile(Path, Control, rvsfText);
  81. end;
  82. {------------------------------------------------------------------------------}
  83. procedure TRVControlItemInfo.SaveRTF(Stream: TStream; const Path: String;
  84.   RVData: TPersistent; ItemNo: Integer; const Name: String; TwipsPerPixel: Double;
  85.   Level: Integer; ColorList: TRVColorList;
  86.   StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  87.   FontTable: TRVList);
  88. var s: String;
  89. begin
  90.   s := TCustomRVData(RVData).SaveComponentToFile('', Control, rvsfRTF);
  91.   if s<>'' then
  92.     RVWrite(Stream,s);
  93. end;
  94. {------------------------------------------------------------------------------}
  95. function RVFGetItemOptions(ItemOptions: TRVItemOptions; ForceSameAsPrev: Boolean): TRVItemOptions;
  96. begin
  97.   Result := ItemOptions;
  98.   if ForceSameAsPrev then begin
  99.     Include(Result, rvioSameAsPrev);
  100.     Exclude(Result, rvioBR);
  101.     Exclude(Result, rvioPageBreakBefore);    
  102.   end;
  103. end;
  104. {------------------------------------------------------------------------------}
  105. function TRVControlItemInfo.GetRVFExtraPropertyCount: Integer;
  106. begin
  107.   Result := inherited GetRVFExtraPropertyCount;
  108.   if MinHeightOnPage>0 then
  109.     inc(Result);
  110.   if FResizable then
  111.     inc(Result);
  112.   if not FVisible then
  113.     inc(Result);
  114. end;
  115. {------------------------------------------------------------------------------}
  116. procedure TRVControlItemInfo.SaveRVFExtraProperties(Stream: TStream);
  117. begin
  118.   inherited SaveRVFExtraProperties(Stream);
  119.   if MinHeightOnPage>0 then
  120.     WriteRVFExtraIntPropertyStr(Stream, rvepMinHeightOnPage, MinHeightOnPage);
  121.   if FResizable then
  122.     WriteRVFExtraIntPropertyStr(Stream, rvepResizable, ord(FResizable));
  123.   if not FVisible then
  124.     WriteRVFExtraIntPropertyStr(Stream, rvepResizable, ord(FVisible));  
  125. end;
  126. {------------------------------------------------------------------------------}
  127. function TRVControlItemInfo.SetExtraIntProperty(Prop: TRVExtraItemProperty; Value: Integer): Boolean;
  128. begin
  129.   case Prop of
  130.     rvepResizable:
  131.       begin
  132.         FResizable := Value<>0;
  133.         Result := True;
  134.       end;
  135.     rvepVisible:
  136.       begin
  137.         FVisible := Value<>0;
  138.         if (Control<>nil) and (Control.Parent<>nil) then
  139.           Control.Visible := FVisible;
  140.         Result := True;
  141.       end;
  142.     rvepMinHeightOnPage:
  143.       begin
  144.         MinHeightOnPage := Value;
  145.         Result := True;
  146.       end;
  147.     else
  148.       Result := inherited SetExtraIntProperty(Prop, Value);
  149.   end;
  150. end;
  151. {------------------------------------------------------------------------------}
  152. function TRVControlItemInfo.GetExtraIntProperty(Prop: TRVExtraItemProperty; var Value: Integer): Boolean;
  153. begin
  154.   case Prop of
  155.     rvepResizable:
  156.       begin
  157.         Value := ord(FResizable);
  158.         Result := True;
  159.       end;
  160.     rvepVisible:
  161.       begin
  162.         Value := ord(FVisible);
  163.         Result := True;
  164.       end;
  165.     rvepMinHeightOnPage:
  166.       begin
  167.         Value := MinHeightOnPage;
  168.         Result := True;
  169.       end;
  170.     else
  171.       Result := inherited GetExtraIntProperty(Prop, Value);
  172.   end;
  173. end;
  174. {------------------------------------------------------------------------------}
  175. procedure TRVControlItemInfo.SaveRVF(Stream: TStream;
  176.                                      RVData: TPersistent;
  177.                                      ItemNo, ParaNo: Integer;
  178.                                      const Name: String;
  179.                                      Part: TRVMultiDrawItemPart;
  180.                                      ForceSameAsPrev: Boolean);
  181. var SaveType, LineCount: Integer;
  182. begin
  183.    if rvfoSaveControlsBody in TCustomRVData(RVData).RVFOptions then begin
  184.      if rvfoSaveBinary in TCustomRVData(RVData).RVFOptions then
  185.        SaveType := 2 // save binary
  186.      else
  187.        SaveType := 0; // save hex dump
  188.      LineCount := 3+GetRVFExtraPropertyCount;
  189.      end
  190.    else begin
  191.      SaveType := 1; // do not save
  192.      LineCount := 1+GetRVFExtraPropertyCount;
  193.    end;
  194.    RVFWriteLine(Stream,
  195.      Format('%d %d %s %d %d %s %s',
  196.             [StyleNo, LineCount,
  197.              RVFItemSavePara(ParaNo, TCustomRVData(RVData), ForceSameAsPrev),
  198.              Byte(RVFGetItemOptions(ItemOptions, ForceSameAsPrev)) and RVItemOptionsMask,
  199.              SaveType,
  200.              RVFSaveTag(rvoTagsArePChars in TCustomRVData(RVData).Options,Tag),
  201.              SaveRVFHeaderTail(RVData)]));
  202.    RVFWriteLine(Stream, Name);
  203.    if SaveType<>1 then begin
  204.      RVFWriteLine(Stream, Control.ClassName);
  205.      SaveRVFExtraProperties(Stream);
  206.      TCustomRVData(RVData).ControlAction(rvcaBeforeRVFSave, ItemNo, Self);
  207.      if rvfoSaveBinary in TCustomRVData(RVData).RVFOptions then
  208.        RVFSaveControlBinary(Stream, Control)
  209.      else
  210.        RVFWriteLine(Stream, RVFSaveControl(Control));
  211.      TCustomRVData(RVData).ControlAction(rvcaAfterRVFSave, ItemNo, Self);
  212.      end
  213.    else
  214.       SaveRVFExtraProperties(Stream);
  215. end;
  216. {------------------------------------------------------------------------------}
  217. procedure TRVControlItemInfo.MovingToUndoList(ItemNo: Integer; RVData, AContainerUndoItem: TObject);
  218. begin
  219.   Control.Parent := nil;
  220.   TCustomRVData(RVData).ControlAction(rvcaMoveToUndoList, ItemNo, Self);
  221.   inherited MovingToUndoList(ItemNo, RVData, AContainerUndoItem);
  222. end;
  223. {------------------------------------------------------------------------------}
  224. procedure TRVControlItemInfo.MovingFromUndoList(ItemNo: Integer; RVData: TObject);
  225. begin
  226.   TCustomRVData(RVData).ControlAction(rvcaMoveFromUndoList, ItemNo, Self);
  227.   Control.Parent := TCustomRVData(RVData).GetParentControl;
  228. end;
  229. {------------------------------------------------------------------------------}
  230. procedure TRVControlItemInfo.Inserting(RVData: TObject; var Text: String; Safe: Boolean);
  231. begin
  232.   Control.Visible := False;
  233.   if not Safe and (RVData<>nil) then
  234.     Control.Parent := TCustomRVData(RVData).GetParentControl
  235.   else
  236.     Control.Parent := nil;
  237.   inherited Inserting(RVData, Text, Safe);
  238. end;
  239. {------------------------------------------------------------------------------}
  240. procedure TRVControlItemInfo.Focusing;
  241. begin
  242.   if Control is TWinControl then
  243.     TWinControl(Control).SetFocus;
  244. end;
  245. {------------------------------------------------------------------------------}
  246. procedure TRVControlItemInfo.OnDocWidthChange(DocWidth: Integer;
  247.   dli: TRVDrawLineInfo; Printing: Boolean; Canvas: TCanvas;
  248.   RVData: TPersistent; sad: PRVScreenAndDevice;
  249.   var HShift, Desc: Integer; NoCaching, Reformatting: Boolean);
  250. begin
  251.   HShift := 0;
  252.   if (PercentWidth>0) and (PercentWidth<=100) then begin
  253.     if not Printing then
  254.       Control.Width := DocWidth * PercentWidth div 100-Spacing*2;
  255.     dli.Width := DocWidth * PercentWidth div 100;
  256.     dli.Height := RV_YToDevice(Control.Height+Spacing*2, sad^);
  257.     Desc := RV_YToDevice(GetDescent, sad^);
  258.     end
  259.   else
  260.     Desc := GetDescent;
  261. end;
  262. {============================ TRVGraphicItemInfo ==============================}
  263. constructor TRVGraphicItemInfo.CreateEx(RVData: TPersistent; AImage: TGraphic; AVAlign: TRVVAlign);
  264. begin
  265.   inherited Create(RVData);
  266.   StyleNo := rvsPicture;
  267.   Image   := AImage;
  268.   VAlign  := AVAlign;
  269. end;
  270. {------------------------------------------------------------------------------}
  271. destructor TRVGraphicItemInfo.Destroy;
  272. begin
  273.   Image.Free;
  274.   ImageCopy.Free;
  275.   {$IFNDEF RVDONOTUSEANIMATION}
  276.   FAnimator.Free;
  277.   {$ENDIF}
  278.   inherited Destroy;
  279. end;
  280. {------------------------------------------------------------------------------}
  281. procedure TRVGraphicItemInfo.Assign(Source: TCustomRVItemInfo);
  282. var  grclass: TGraphicClass;
  283. begin
  284.   if Source is TRVGraphicItemInfo then begin
  285.     Alt := TRVGraphicItemInfo(Source).Alt;
  286.     ImageFileName := TRVGraphicItemInfo(Source).ImageFileName;
  287.     ImageWidth := TRVGraphicItemInfo(Source).ImageWidth;
  288.     ImageHeight := TRVGraphicItemInfo(Source).ImageHeight;
  289.     NoHTMLImageSize := TRVGraphicItemInfo(Source).NoHTMLImageSize;
  290.     Image.Free;
  291.     ImageCopy.Free;
  292.     grclass := TGraphicClass(TRVGraphicItemInfo(Source).Image.ClassType);
  293.     Image := RV_CreateGraphics(grclass);
  294.     Image.Assign(TRVGraphicItemInfo(Source).Image);
  295.     if TRVGraphicItemInfo(Source).ImageCopy<>nil then begin
  296.       grclass := TGraphicClass(TRVGraphicItemInfo(Source).ImageCopy.ClassType);
  297.       ImageCopy := RV_CreateGraphics(grclass);
  298.       ImageCopy.Assign(TRVGraphicItemInfo(Source).ImageCopy);
  299.       end
  300.     else
  301.       ImageCopy := nil;
  302.   end;
  303.   inherited Assign(Source);
  304. end;
  305. {------------------------------------------------------------------------------}
  306. procedure TRVGraphicItemInfo.TransferProperties(Source: TCustomRVItemInfo;
  307.   RVData: TPersistent);
  308. begin
  309.   {$IFNDEF RVDONOTUSEANIMATION}
  310.   if (FAnimator=nil) and (Source is TRVGraphicItemInfo) then begin
  311.     FAnimator := TRVGraphicItemInfo(Source).FAnimator;
  312.     TRVGraphicItemInfo(Source).FAnimator := nil;
  313.     if FAnimator<>nil then
  314.       TRVAnimator(FAnimator).Update(nil, Self);
  315.     UpdateAnimator(RVData);
  316.   end;
  317.   {$ENDIF}
  318. end;
  319. {------------------------------------------------------------------------------}
  320. function TRVGraphicItemInfo.GetHeight: Integer;
  321. begin
  322.   if (ImageHeight>0) then
  323.     Result := ImageHeight
  324.   else
  325.     Result := Image.Height;
  326.   inc(Result,Spacing*2);
  327. end;
  328. {------------------------------------------------------------------------------}
  329. function TRVGraphicItemInfo.GetImageHeight(RVStyle: TRVStyle): Integer;
  330. begin
  331.   if (ImageHeight>0) then
  332.     Result := ImageHeight
  333.   else
  334.     Result := Image.Height;
  335. end;
  336. {------------------------------------------------------------------------------}
  337. function TRVGraphicItemInfo.GetWidth: Integer;
  338. begin
  339.   if (ImageWidth>0) then
  340.     Result := ImageWidth
  341.   else
  342.     Result := Image.Width;
  343.   inc(Result, Spacing*2);
  344. end;
  345. {------------------------------------------------------------------------------}
  346. function TRVGraphicItemInfo.GetImageWidth(RVStyle: TRVStyle): Integer;
  347. begin
  348.   if (ImageWidth>0) then
  349.     Result := ImageWidth
  350.   else
  351.     Result := Image.Width;
  352. end;
  353. {------------------------------------------------------------------------------}
  354. function TRVGraphicItemInfo.GetMinWidth(sad: PRVScreenAndDevice; Canvas: TCanvas;
  355.                                         RVData: TPersistent): Integer;
  356. begin
  357.   if (ImageWidth>0) then
  358.     Result := ImageWidth
  359.   else
  360.     Result := Image.Width;
  361.   inc(Result, Spacing*2);
  362.   if sad<>nil then
  363.     Result := MulDiv(Result, sad.ppixDevice, sad.ppixScreen);
  364. end;
  365. {------------------------------------------------------------------------------}
  366. {$IFNDEF RVDONOTUSEANIMATION}
  367. procedure TRVGraphicItemInfo.UpdateAnimator(RVData: TObject);
  368. begin
  369.   if RVData is TCustomRVFormattedData then begin
  370.     if not TCustomRVFormattedData(RVData).AllowAnimation then begin
  371.       FAnimator.Free;
  372.       FAnimator := nil;
  373.       end
  374.     else
  375.       RV_MakeAnimator(Self, TCustomRVFormattedData(RVData), TRVAnimator(FAnimator));
  376.   end;
  377. end;
  378. {$ENDIF}
  379. {------------------------------------------------------------------------------}
  380. procedure TRVGraphicItemInfo.Paint(x, y: Integer; Canvas: TCanvas;
  381.   State: TRVItemDrawStates; Style: TRVStyle; dli: TRVDrawLineInfo);
  382. var w,h: Integer;
  383.   {...............................................}
  384.   procedure DrawBmp;
  385.   begin
  386.     if (ImageWidth=0) and (ImageHeight=0) then
  387.       BitBlt(Canvas.Handle, x, y,
  388.              ImageCopy.Width, ImageCopy.Height,
  389.              TBitmap(ImageCopy).Canvas.Handle, 0, 0, SRCCOPY)
  390.     else
  391.       StretchBlt(Canvas.Handle, x, y, w, h,
  392.              TBitmap(ImageCopy).Canvas.Handle, 0, 0,
  393.              ImageCopy.Width, ImageCopy.Height, SRCCOPY);
  394.   end;
  395.   {...............................................}
  396.   procedure DrawImage(Image: TGraphic);
  397.   var DCState: Integer;
  398.   begin
  399.     DCState := 0;
  400.     try
  401.       if (ImageWidth=0) and (ImageHeight=0) then begin
  402.         if Image is TMetafile then begin
  403.           DCState := SaveDC(Canvas.Handle);
  404.           IntersectClipRect(Canvas.Handle, x, y, x+Image.Width, y+Image.Height);
  405.         end;
  406.         try
  407.           Canvas.Draw(x, y, Image);
  408.         except
  409.         end;
  410.         end
  411.       else begin
  412.         if Image is TMetafile then begin
  413.           DCState := SaveDC(Canvas.Handle);
  414.           IntersectClipRect(Canvas.Handle, x, y, x+w, y+h);
  415.         end;
  416.         try
  417.           Canvas.StretchDraw(Bounds(x, y, w, h), Image);
  418.         except
  419.         end;
  420.       end;
  421.     finally
  422.       if DCState<>0 then
  423.         RestoreDC(Canvas.Handle, DCState);
  424.     end;
  425.   end;
  426.   {...............................................}
  427. begin
  428.   w := GetImageWidth(Style);
  429.   h := GetImageHeight(Style);
  430.   inc(x, Spacing); inc(y, Spacing);
  431.   {$IFNDEF RVDONOTUSEANIMATION}
  432.   if FAnimator<>nil then
  433.     TRVAnimator(FAnimator).Draw(x,y,Canvas, False)
  434.   else
  435.   {$ENDIF}
  436.     if ImageCopy<>nil then
  437.       if ImageCopy is TBitmap then
  438.         DrawBmp
  439.       else
  440.         DrawImage(ImageCopy)
  441.     else
  442.       DrawImage(Image);
  443.   if (rvidsCurrent in State) and (Style.CurrentItemColor<>clNone) then begin
  444.     Canvas.Pen.Width := 1;
  445.     Canvas.Pen.Color := Style.CurrentItemColor;
  446.     Canvas.Pen.Style := psSolid;
  447.     Canvas.Brush.Style := bsClear;
  448.     Canvas.Rectangle(x-Spacing-1,y-Spacing-1, x+w+Spacing+1, y+h+Spacing+1);
  449.   end;
  450.   if (rvidsSelected in State) then begin
  451.     if rvidsControlFocused in State then
  452.       Canvas.Pen.Color := Style.SelColor
  453.     else
  454.       Canvas.Pen.Color := Style.InactiveSelColor;
  455.     Canvas.Brush.Style := bsClear;
  456.     if Canvas.Pen.Color<>clNone then begin
  457.       Canvas.Pen.Style := psSolid;
  458.       Canvas.Pen.Width := 1;
  459.       Canvas.Rectangle(x-Spacing,y-Spacing, x+w+Spacing, y+h+Spacing);
  460.     end;
  461.   end
  462. end;
  463. {------------------------------------------------------------------------------}
  464. function TRVGraphicItemInfo.AsImage: TGraphic;
  465. begin
  466.   Result := Image;
  467. end;
  468. {------------------------------------------------------------------------------}
  469. procedure TRVGraphicItemInfo.MovingToUndoList(ItemNo: Integer; RVData, AContainerUndoItem: TObject);
  470. begin
  471.   ImageCopy.Free;
  472.   ImageCopy := nil;
  473.   {$IFNDEF RVDONOTUSEANIMATION}
  474.   if FAnimator<>nil then begin
  475.     FAnimator.Free;
  476.     FAnimator := nil;
  477.   end;
  478.   {$ENDIF}
  479.   inherited MovingToUndoList(ItemNo, RVData, AContainerUndoItem);
  480. end;
  481. {------------------------------------------------------------------------------}
  482. procedure TRVGraphicItemInfo.UpdatePaletteInfo(PaletteAction: TRVPaletteAction;
  483.                                                ForceRecreateCopy: Boolean;
  484.                                                Palette: HPALETTE;
  485.                                                LogPalette: PLogPalette);
  486. begin
  487.   if not (PaletteAction in [rvpaCreateCopies,rvpaCreateCopiesEx]) or ForceRecreateCopy or
  488.      (Palette=0) then begin
  489.     ImageCopy.Free;
  490.     ImageCopy := nil;
  491.   end;
  492. //  if ImageCopy=nil then
  493. //    ImageCopy := TBitmap.Create;
  494. //  ImageCopy.Width  := Image.Width;
  495. //  ImageCopy.Height := Image.Height;
  496. //  TBitmap(ImageCopy).Canvas.Draw(0,0,Image);
  497.   case PaletteAction of
  498.   {*} rvpaAssignPalette:
  499.       begin
  500.         if LogPalette<>nil then
  501.           RV_SetPaletteToPicture(Image,LogPalette);
  502.       end;
  503.   {*} rvpaCreateCopies,rvpaCreateCopiesEx:
  504.       begin
  505.         if (LogPalette<>nil) and (ImageCopy=nil) then begin
  506.           {$IFNDEF RVDONOTUSEJPEGIMAGE}
  507.           if (PaletteAction=rvpaCreateCopiesEx) and
  508.              (Image is TJpegImage) then
  509.             ImageCopy := TBitmap.Create
  510.           else
  511.           {$ENDIF}
  512.             ImageCopy := RV_CreateGraphics(TGraphicClass(Image.ClassType));
  513.           ImageCopy.Assign(Image);
  514.           RV_SetPaletteToPicture(ImageCopy,LogPalette);
  515.           if ImageCopy is TBitmap then
  516.             TBitmap(ImageCopy).IgnorePalette := True;
  517.         end;
  518.       end;
  519.   end;
  520. end;
  521. {------------------------------------------------------------------------------}
  522. function TRVGraphicItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  523. begin
  524.   case Prop of
  525.     rvbpResizable:
  526.       Result := (Image<>nil) and not (Image is TIcon);
  527.     rvbpValid:
  528.       Result := Image<>nil;
  529.     rvbpResizeHandlesOutside:
  530.       {$IFNDEF RVDONOTUSEANIMATION}
  531.       Result := FAnimator<>nil;
  532.       {$ELSE}
  533.       Result := False;
  534.       {$ENDIF}
  535.     rvbpDisplayActiveState, rvbpDrawingChangesFont:
  536.       Result := True;
  537.     else
  538.       Result := inherited GetBoolValue(Prop);
  539.   end;
  540. end;
  541. {------------------------------------------------------------------------------}
  542. function TRVGraphicItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean;
  543. begin
  544.   case Prop of
  545.     rvbpPrintToBMP:
  546.       Result := not (Image is TMetafile);
  547.     else
  548.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  549.   end;
  550. end;
  551. {------------------------------------------------------------------------------}
  552. {$IFNDEF RVDONOTUSEHTML}
  553. function RV_GetExtraIMGStr(SaveOptions: TRVSaveOptions; Width, Height: Integer;
  554.   NoHTMLImageSize: Boolean): String;
  555. begin
  556.   if rvsoNoHypertextImageBorders in SaveOptions then
  557.     Result := ' border=0 '
  558.   else
  559.     Result := ' ';
  560.   if (rvsoImageSizes in SaveOptions) and not NoHTMLImageSize then
  561.     Result := Result+Format('width=%d height=%d ',[Width, Height]);
  562. end;
  563. {$ENDIF}
  564. {------------------------------------------------------------------------------}
  565. {$IFNDEF RVDONOTUSEHTML}
  566. procedure TRVGraphicItemInfo.SaveToHTML(Stream: TStream; RVData: TPersistent;
  567.   ItemNo: Integer; const Text, Path: String; const imgSavePrefix: String;
  568.   var imgSaveNo: Integer; CurrentFileColor: TColor;
  569.   SaveOptions: TRVSaveOptions; UseCSS: Boolean; Bullets: TRVList);
  570.   {.................................................................}
  571.   function GetExtraIMGStr: String;
  572.   var s: String;
  573.       RVStyle: TRVStyle;
  574.   begin
  575.     Result := '';
  576.     if rvsoNoHypertextImageBorders in SaveOptions then
  577.       RV_AddStr(Result, Format('border=%s',[RV_HTMLGetIntAttrVal(0, SaveOptions)]));
  578.     RVStyle := TCustomRVData(RVData).GetRVStyle;
  579.     if ((rvsoImageSizes in SaveOptions) and not NoHTMLImageSize) or
  580.        (ImageWidth>0) or (ImageHeight>0) then
  581.       RV_AddStr(Result,
  582.         Format('width=%s height=%s', [
  583.          RV_HTMLGetIntAttrVal(GetImageWidth(RVStyle), SaveOptions),
  584.          RV_HTMLGetIntAttrVal(GetImageHeight(RVStyle), SaveOptions)]));
  585.     if (Alt<>'') or UseCSS then begin
  586.       if rvsoUTF8 in SaveOptions then
  587.         s := RVU_AnsiToUTF8(RVStyle.DefCodePage, Alt)
  588.       else
  589.         s := Alt;
  590.       RV_AddStr(Result, 'alt="'+s+'"');
  591.     end;
  592.     if Spacing>0 then
  593.       RV_AddStr(Result, Format('hspace=%s vspace=%s', [
  594.         RV_HTMLGetIntAttrVal(Spacing, SaveOptions),
  595.         RV_HTMLGetIntAttrVal(Spacing, SaveOptions)]));
  596.     {$IFNDEF RVDONOTUSEITEMHINTS}
  597.     if Hint<>'' then begin
  598.       s := RV_GetHintStr(rvsfHTML, Hint);    
  599.       if rvsoUTF8 in SaveOptions then
  600.         s := RVU_AnsiToUTF8(RVStyle.DefCodePage, s);
  601.       RV_AddStr(Result, s);
  602.     end;
  603.     {$ENDIF}
  604.     if UseCSS then begin
  605.       s := GetVShiftCSS(RVStyle);
  606.       if s<>'' then
  607.         RV_AddStr(Result, Format('style="{%s}"',[s]));
  608.     end;
  609.     if Result<>'' then
  610.       Result := ' '+Result+' '
  611.     else
  612.       Result := ' ';
  613.   end;
  614.   {.................................................................}
  615. var Location: String;
  616.     DoDefault: Boolean;
  617. begin
  618.   if (ImageFileName<>'') and (rvsoUseItemImageFileNames in SaveOptions) then
  619.     Location := ExtractRelativePath(Path, ImageFileName)
  620.   else
  621.     Location := '';
  622.   TCustomRVData(RVData).HTMLSaveImage(TCustomRVData(RVData), ItemNo, Path, CurrentFileColor, Location, DoDefault);
  623.   if DoDefault then
  624.     if (ImageFileName<>'') and (rvsoUseItemImageFileNames in SaveOptions) then
  625.       Location := ExtractRelativePath(Path, ImageFileName)
  626.     else
  627.       Location := TCustomRVData(RVData).DoSavePicture(rvsfHTML, imgSavePrefix, Path,
  628.         imgSaveNo, rvsoOverrideImages in SaveOptions, CurrentFileColor, Image);
  629.   if Location<>'' then
  630.     RVWrite(Stream, Format('<img%s%ssrc="%s"%s>',
  631.       [GetHTMLImageAlign(VAlign, SaveOptions, UseCSS), GetExtraIMGStr,
  632.        RV_GetHTMLPath(Location, SaveOptions, TCustomRVData(RVData).GetRVStyle.DefCodePage),
  633.        RV_HTMLGetEndingSlash(SaveOptions)]));
  634. end;
  635. {$ENDIF}
  636. {------------------------------------------------------------------------------}
  637. function TRVGraphicItemInfo.ReadRVFLine(const s: String;
  638.                                         RVData: TPersistent;
  639.                                         ReadType, LineNo, LineCount: Integer;
  640.                                         var Name: String;
  641.                                         var ReadMode: TRVFReadMode;
  642.                                         var ReadState: TRVFReadState): Boolean;
  643. var grcls : TGraphicClass;
  644.     ifn: String;
  645. begin
  646.   Result := True;
  647.   case ReadType of
  648.     1: // ask user
  649.       begin
  650.         case LineNo of
  651.           0:
  652.             begin
  653.               Image := TCustomRVData(RVData).RVFPictureNeeded(s, Tag);
  654.               Name := s;
  655.             end;
  656.           else
  657.             begin
  658.               ifn := ImageFileName;
  659.               SetExtraPropertyFromRVFStr(s);
  660.               if (ifn<>ImageFileName) and (ImageFileName<>'') and (Image=nil) then
  661.                 Image := TCustomRVData(RVData).RVFPictureNeeded(ImageFileName, Tag);
  662.             end;
  663.         end;
  664.       end;
  665.     else // load picture from file
  666.       begin
  667.         if LineNo=0 then
  668.           Name := s
  669.         else if LineNo=1 then begin
  670.           grcls := TGraphicClass(GetClass(s));
  671.           if grcls=nil then begin
  672.             TCustomRVData(RVData).RVFWarnings := TCustomRVData(RVData).RVFWarnings + [rvfwUnknownPicFmt];
  673.             if not (rvfoIgnoreUnknownPicFmt in TCustomRVData(RVData).RVFOptions) then
  674.               Result := False;
  675.             end
  676.           else begin
  677.             Image := RV_CreateGraphics(grcls);
  678.           end;
  679.           end
  680.         else if LineNo=LineCount-1 then begin
  681.           if Image<>nil then begin
  682.             try
  683.               if ReadType=2 then
  684.                 RVFLoadPictureBinary(s, Image)
  685.               else
  686.                 Result := RVFLoadPicture(s, Image);
  687.                {$IFNDEF RVDONOTCORRECTWMFSCALE}
  688.                 if (Image is TMetafile) {$IFNDEF RVCORRECTWMFSCALE2} and  not TMetafile(Image).Enhanced{$ENDIF} and (TMetafile(Image).Inch=0)  then
  689.                    TMetafile(Image).Inch := 1440;
  690.                {$ENDIF}
  691.             except
  692.               Image.Free;
  693.               Image := RV_CreateGraphics(TGraphicClass(TCustomRVData(RVData).GetRVStyle.InvalidPicture.Graphic.ClassType));
  694.               Image.Assign(TCustomRVData(RVData).GetRVStyle.InvalidPicture.Graphic);
  695.               TCustomRVData(RVData).RVFWarnings := TCustomRVData(RVData).RVFWarnings+[rvfwInvalidPicture];
  696.             end;
  697.           end;
  698.           ReadState := rstSkip;
  699.           end
  700.         else
  701.           SetExtraPropertyFromRVFStr(s);
  702.         if (ReadType=2) and (LineNo=LineCount-2) then
  703.             ReadMode := rmBeforeBinary;          
  704.       end;
  705.   end;
  706. end;
  707. {------------------------------------------------------------------------------}
  708. function TRVGraphicItemInfo.GetRVFExtraPropertyCount: Integer;
  709. begin
  710.   Result := inherited GetRVFExtraPropertyCount;
  711.   if ImageWidth>0 then
  712.     inc(Result);
  713.   if ImageHeight>0 then
  714.     inc(Result);
  715.   if MinHeightOnPage>0 then
  716.     inc(Result);
  717.   if NoHTMLImageSize then
  718.     inc(Result);
  719.   if Interval>0 then
  720.     inc(Result);
  721.   {$IFDEF RICHVIEWCBDEF3}
  722.   if (Image<>nil) and (Image is TBitmap) and TBitmap(Image).Transparent then begin
  723.     inc(Result,2);
  724.     if TBitmap(Image).TransparentMode=tmFixed then
  725.       inc(Result);
  726.   end;
  727.   {$ENDIF}
  728.   if ImageFileName<>'' then
  729.     inc(Result);
  730.   if Alt<>'' then
  731.     inc(Result);
  732. end;
  733. {------------------------------------------------------------------------------}
  734. procedure TRVGraphicItemInfo.SaveRVFExtraProperties(Stream: TStream);
  735. begin
  736.   inherited SaveRVFExtraProperties(Stream);
  737.   if ImageWidth>0 then
  738.     WriteRVFExtraIntPropertyStr(Stream, rvepImageWidth, ImageWidth);
  739.   if ImageHeight>0 then
  740.     WriteRVFExtraIntPropertyStr(Stream, rvepImageHeight, ImageHeight);
  741.   if MinHeightOnPage>0 then
  742.     WriteRVFExtraIntPropertyStr(Stream, rvepMinHeightOnPage, MinHeightOnPage);
  743.   if NoHTMLImageSize then
  744.     WriteRVFExtraIntPropertyStr(Stream, rvepNoHTMLImageSize, 1);
  745.   if Interval>0 then
  746.     WriteRVFExtraIntPropertyStr(Stream, rvepAnimationInterval, Interval);
  747.   {$IFDEF RICHVIEWCBDEF3}
  748.   if (Image<>nil) and (Image is TBitmap) and TBitmap(Image).Transparent then begin
  749.     WriteRVFExtraIntPropertyStr(Stream, rvepTransparent, 1);
  750.     WriteRVFExtraIntPropertyStr(Stream, rvepTransparentMode, ord(TBitmap(Image).TransparentMode));
  751.     if TBitmap(Image).TransparentMode=tmFixed then
  752.       WriteRVFExtraIntPropertyStr(Stream, rvepTransparentColor, TBitmap(Image).TransparentColor);
  753.   end;
  754.   {$ENDIF}
  755.   if ImageFileName<>'' then
  756.     WriteRVFExtraStrPropertyStr(Stream, rvespImageFileName, ImageFileName);
  757.   if Alt<>'' then
  758.     WriteRVFExtraStrPropertyStr(Stream, rvespAlt, Alt);
  759. end;
  760. {------------------------------------------------------------------------------}
  761. function TRVGraphicItemInfo.SetExtraIntProperty(Prop: TRVExtraItemProperty; Value: Integer): Boolean;
  762. begin
  763.   Result := False;
  764.   case Prop of
  765.     rvepImageWidth:
  766.       begin
  767.         ImageWidth := Value;
  768.         Result := True;
  769.       end;
  770.     rvepImageHeight:
  771.       begin
  772.         ImageHeight := Value;
  773.         Result := True;
  774.       end;
  775.     rvepMinHeightOnPage:
  776.       begin
  777.         MinHeightOnPage := Value;
  778.         Result := True;
  779.       end;
  780.     rvepNoHTMLImageSize:
  781.       begin
  782.         NoHTMLImageSize := Value<>0;
  783.         Result := True;
  784.       end;
  785.     rvepAnimationInterval:
  786.       begin
  787.         Interval := Value;
  788.         Result := True;
  789.       end;
  790.     {$IFDEF RICHVIEWCBDEF3}
  791.     rvepTransparent:
  792.       if (Image<>nil) and (Image is TBitmap) then begin
  793.         TBitmap(Image).Transparent := Value<>0;
  794.         Result := True;
  795.       end;
  796.     rvepTransparentMode:
  797.       if (Image<>nil) and (Image is TBitmap) then begin
  798.         TBitmap(Image).TransparentMode := TTransparentMode(Value);
  799.         Result := True;
  800.       end;
  801.     rvepTransparentColor:
  802.       begin
  803.         if (Image<>nil) and (Image is TBitmap) then begin
  804.           TBitmap(Image).TransparentColor := TColor(Value);
  805.           Result := True;
  806.         end;
  807.       end;
  808.     {$ENDIF}
  809.     else
  810.       Result := inherited SetExtraIntProperty(Prop, Value);
  811.   end;
  812. end;
  813. {------------------------------------------------------------------------------}
  814. function TRVGraphicItemInfo.GetExtraIntProperty(Prop: TRVExtraItemProperty; var Value: Integer): Boolean;
  815. begin
  816.   Result := False;
  817.   case Prop of
  818.     rvepImageWidth:
  819.       begin
  820.         Value := ImageWidth;
  821.         Result := True;
  822.       end;
  823.     rvepImageHeight:
  824.       begin
  825.         Value := ImageHeight;
  826.         Result := True;
  827.       end;
  828.     rvepMinHeightOnPage:
  829.       begin
  830.         Value := MinHeightOnPage;
  831.         Result := True;
  832.       end;
  833.     rvepNoHTMLImageSize:
  834.       begin
  835.         Value := ord(NoHTMLImageSize);
  836.         Result := True;
  837.       end;
  838.     rvepAnimationInterval:
  839.       begin
  840.         Value := Interval;
  841.         Result := True;
  842.       end;
  843.     {$IFDEF RICHVIEWCBDEF3}
  844.     rvepTransparent:
  845.       if (Image<>nil) and (Image is TBitmap) then begin
  846.         Value := ord(TBitmap(Image).Transparent);
  847.         Result := True;
  848.       end;
  849.     rvepTransparentMode:
  850.       if (Image<>nil) and (Image is TBitmap) then begin
  851.         Value := ord(TBitmap(Image).TransparentMode);
  852.         Result := True;
  853.       end;
  854.     rvepTransparentColor:
  855.       begin
  856.         if (Image<>nil) and (Image is TBitmap) then begin
  857.           Value := Integer(TBitmap(Image).TransparentColor);
  858.           Result := True;
  859.         end;
  860.       end;
  861.     {$ENDIF}
  862.     else
  863.       Result := inherited GetExtraIntProperty(Prop, Value);
  864.   end;
  865. end;
  866. {------------------------------------------------------------------------------}
  867. function TRVGraphicItemInfo.GetExtraStrProperty(
  868.   Prop: TRVExtraItemStrProperty; var Value: String): Boolean;
  869. begin
  870.   case Prop of
  871.     rvespImageFileName:
  872.       begin
  873.         Value := ImageFileName;
  874.         Result := True;
  875.       end;
  876.     rvespAlt:
  877.       begin
  878.         Value := Alt;
  879.         Result := True;
  880.       end;
  881.     else
  882.       Result := inherited GetExtraStrProperty(Prop, Value);
  883.   end;
  884. end;
  885. {------------------------------------------------------------------------------}
  886. function TRVGraphicItemInfo.SetExtraStrProperty(
  887.   Prop: TRVExtraItemStrProperty; const Value: String): Boolean;
  888. begin
  889.   case Prop of
  890.     rvespImageFileName:
  891.       begin
  892.         ImageFileName := Value;
  893.         Result := True;
  894.       end;
  895.     rvespAlt:
  896.       begin
  897.         Alt := Value;
  898.         Result := True;
  899.       end;
  900.     else
  901.       Result := inherited SetExtraStrProperty(Prop, Value);
  902.   end;
  903. end;
  904. {------------------------------------------------------------------------------}
  905. procedure TRVGraphicItemInfo.SaveRVF(Stream: TStream;
  906.   RVData: TPersistent; ItemNo, ParaNo: Integer;
  907.   const Name: String; Part: TRVMultiDrawItemPart;
  908.   ForceSameAsPrev: Boolean);
  909. var SaveType, LineCount: Integer;
  910. begin
  911.   if rvfoSavePicturesBody in TCustomRVData(RVData).RVFOptions then begin
  912.     if rvfoSaveBinary in TCustomRVData(RVData).RVFOptions then
  913.       SaveType := 2 // save binary
  914.     else
  915.       SaveType := 0; // save hex dump
  916.     LineCount := 3+GetRVFExtraPropertyCount;
  917.     end
  918.   else begin
  919.     SaveType := 1; // do not save
  920.     LineCount := 1+GetRVFExtraPropertyCount;
  921.   end;
  922.   RVFWriteLine(Stream,
  923.                Format('%d %d %s %d %d %s %s',
  924.                  [StyleNo, LineCount,
  925.                   RVFItemSavePara(ParaNo, TCustomRVData(RVData), ForceSameAsPrev),
  926.                   Byte(RVFGetItemOptions(ItemOptions,ForceSameAsPrev)) and RVItemOptionsMask,
  927.                   SaveType,
  928.                   RVFSaveTag(rvoTagsArePChars in TCustomRVData(RVData).Options, Tag),
  929.                   SaveRVFHeaderTail(RVData)]));
  930.   RVFWriteLine(Stream, Name);
  931.   if SaveType<>1 then begin
  932.     RVFWriteLine(Stream, Image.ClassName);
  933.     SaveRVFExtraProperties(Stream);
  934.     if rvfoSaveBinary in TCustomRVData(RVData).RVFOptions then
  935.       RVFSavePictureBinary(Stream, Image)
  936.     else
  937.       RVFWriteLine(Stream, RVFSavePicture(Image));
  938.     end
  939.   else
  940.     SaveRVFExtraProperties(Stream);
  941. end;
  942. {------------------------------------------------------------------------------}
  943. procedure RVSaveImageToRTF(Stream: TStream; TwipsPerPixel: Double;
  944.                            Image: TGraphic; ImageWidth, ImageHeight: Integer;
  945.                            Options: TRVRTFOptions);
  946. var s: String;
  947.     wmf: TMetafile;
  948.     FreeWMF: Boolean;
  949.     {$IFDEF RICHVIEWCBDEF3}
  950.     bmp: TBitmap;
  951.     slw: Integer;
  952.     {$ENDIF}
  953.     picw, pich: Integer;
  954. begin
  955.   if Image=nil then
  956.     exit;
  957.   RVFWrite(Stream,'{pict');
  958.   if (ImageWidth>0) and (Image.Width>0) then begin
  959.     if (Image is TMetafile) and (TMetafile(Image).MMWidth>0) and
  960.        (not TMetafile(Image).Enhanced or (rvrtfSaveEMFAsWMF in Options)) then
  961.       picw := Round(TMetafile(Image).MMWidth*72/(127*TwipsPerPixel))
  962.     else
  963.       picw := Image.Width;
  964.     RVFWrite(Stream,Format('picscalex%d', [Round(ImageWidth*100/picw)]));
  965.   end;
  966.   if (ImageHeight>0) and (Image.Height>0) then begin
  967.     if (Image is TMetafile) and (TMetafile(Image).MMHeight>0) and
  968.        (not TMetafile(Image).Enhanced or (rvrtfSaveEMFAsWMF in Options)) then
  969.       pich := Round(TMetafile(Image).MMHeight*72/(127*TwipsPerPixel))
  970.     else
  971.       pich := Image.Height;
  972.     RVFWrite(Stream,Format('picscaley%d', [Round(ImageHeight*100/pich)]));
  973.   end;
  974.   {$IFDEF RICHVIEWCBDEF3} // requires ScanLine property...
  975.   // Saving bitmaps ...
  976.   if Image is TBitmap then begin
  977.     s := RVFSavePicture(Image);
  978.     if TBitmap(Image).Height>1 then
  979.       slw := abs(PChar(TBitmap(Image).ScanLine[1])-PChar(TBitmap(Image).ScanLine[0]))
  980.     else
  981.       slw := Image.Width;
  982.     RVFWrite(Stream,
  983.       Format('dibitmap0wbmwidthbytes%dpicw%dpich%dpicwgoal%dpichgoal%d ',
  984.         [ slw, Image.Width, Image.Height, Image.Width*15, Image.Height*15]));
  985.     RVFWrite(Stream, PChar(s)+sizeof(TBitmapFileHeader)*2);
  986.   end
  987.   // Saving metafiles ...
  988.   else
  989.   {$ENDIF}
  990.     if Image is TMetafile then begin
  991.       if TMetafile(Image).Enhanced then
  992.         if not (rvrtfSaveEMFAsWMF in Options) then begin
  993.           s := RVFSavePicture(Image);
  994.           RVFWrite(Stream,Format('emfblippicw%dpich%d ',
  995.             [TMetafile(Image).MMWidth, TMetafile(Image).MMHeight]));
  996.           RVFWrite(Stream,PChar(s));
  997.           wmf := nil;
  998.           FreeWMF := False;
  999.           end
  1000.         else begin
  1001.           wmf := TMetafile.Create;
  1002.           wmf.Assign(Image);
  1003.           wmf.Enhanced := False;
  1004.           FreeWMF := True;
  1005.         end
  1006.       else begin
  1007.         wmf := TMetafile(Image);
  1008.         FreeWMF := False;
  1009.       end;
  1010.       if wmf<>nil then begin
  1011.         s := RVFSavePicture(wmf);
  1012.         RVFWrite(Stream,Format('wmetafile8picw%dpich%d ',
  1013.           [wmf.MMWidth, wmf.MMHeight]));
  1014.         RVFWrite(Stream,PChar(s)+22*2); // sizeof(TMetafileHeader)=22
  1015.         if FreeWMF then
  1016.           wmf.Free;
  1017.       end;
  1018.     end
  1019.   else
  1020.   // Saving Jpegs ...
  1021.    {$IFNDEF RVDONOTUSEJPEGIMAGE}
  1022.   if (Image is TJpegImage) and (rvrtfSaveJpegAsJpeg in Options) then begin
  1023.     s := RVFSavePicture(Image);
  1024.     RVFWrite(Stream,Format('jpegblippicw%dpich%d ',
  1025.                [Image.Width, Image.Height]));
  1026.     RVFWrite(Stream,PChar(s));
  1027.     end
  1028.   else
  1029.   {$ENDIF}
  1030.   // Saving PNG...
  1031.   if (RVPngGraphiClass<>nil) and (Image is RVPngGraphiClass) then begin
  1032.     s := RVFSavePicture(Image);
  1033.     RVFWrite(Stream,Format('pngblippicw%dpich%d ',
  1034.                [Image.Width, Image.Height]));
  1035.     RVFWrite(Stream,PChar(s));
  1036.     end
  1037.   else
  1038.   {$IFDEF RICHVIEWCBDEF3}
  1039.   if rvrtfSaveBitmapDefault in Options then begin
  1040.     // Saving other image formats, such as icons, as bitmaps
  1041.     bmp := TBitmap.Create;
  1042.     try
  1043.       bmp.Assign(Image);
  1044.     except
  1045.       bmp.Width := Image.Width;
  1046.       bmp.Height := Image.Height;
  1047.       bmp.Canvas.Brush.Color := clWhite;
  1048.       bmp.Canvas.FillRect(Rect(0,0,bmp.Width,bmp.Height));
  1049.       bmp.Canvas.Draw(0,0,Image);
  1050.     end;
  1051.     s := RVFSavePicture(bmp);
  1052.     if bmp.Height>1 then
  1053.       slw := abs(PChar(bmp.ScanLine[1])-PChar(bmp.ScanLine[0]))
  1054.     else
  1055.       slw := bmp.Width;
  1056.     RVFWrite(Stream,Format('dibitmap0wbmwidthbytes%dpicw%dpich%dpicwgoal%dpichgoal%d ',
  1057.                [ slw, bmp.Width, bmp.Height, bmp.Width*15, bmp.Height*15]));
  1058.     RVFWrite(Stream, PChar(s)+sizeof(TBitmapFileHeader)*2);
  1059.     bmp.Free;
  1060.     end
  1061.   else
  1062.   {$ENDIF}
  1063.   begin
  1064.     // Saving other image formats, such as icons, as metafiles
  1065.     wmf :=  TMetafile.Create;
  1066.     wmf.Enhanced := False;
  1067.     wmf.Width := Image.Width;
  1068.     wmf.Height := Image.Height;
  1069.     with TMetafileCanvas.Create(wmf, 0) do begin
  1070.       Draw(0,0, Image);
  1071.       Free;
  1072.     end;
  1073.     if rvrtfSaveEMFDefault in Options then begin
  1074.       wmf.Enhanced := True;
  1075.       s := RVFSavePicture(wmf);
  1076.       RVFWrite(Stream,Format('emfblippicw%dpich%d ',
  1077.                [TMetafile(wmf).MMWidth, TMetafile(wmf).MMHeight]));
  1078.       RVFWrite(Stream,PChar(s));
  1079.       end
  1080.     else begin
  1081.       s := RVFSavePicture(wmf);
  1082.       // Unfortunately, some RTF readers can read only wmetafile8 (for ex., WordPad).
  1083.       // MS Word reads all correctly
  1084.       // (there are some problems with picture size when saving wmetafile8)
  1085.       // May be it will be better to store unknown formats as bitmaps,
  1086.       // but it's not recommended, and some quality losing is possible.
  1087.       RVFWrite(Stream,Format('wmetafile1picw%dpich%d ',
  1088.                  [wmf.Width, wmf.Height]));
  1089.       RVFWrite(Stream,PChar(s)+22*2); // sizeof(TMetafileHeader)=22
  1090.     end;
  1091.     wmf.Free;
  1092.   end;
  1093.   RVFWrite(Stream,'}');
  1094. end;
  1095. {------------------------------------------------------------------------------}
  1096. procedure TRVGraphicItemInfo.SaveRTF(Stream: TStream; const Path: String;
  1097.   RVData: TPersistent; ItemNo: Integer; const Name: String; TwipsPerPixel: Double;
  1098.   Level: Integer; ColorList: TRVColorList;
  1099.   StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  1100.   FontTable: TRVList);
  1101. begin
  1102.   RVSaveImageToRTF(Stream, TwipsPerPixel, Image, ImageWidth, ImageHeight,
  1103.     TCustomRVData(RVData).RTFOptions);
  1104. end;
  1105. {------------------------------------------------------------------------------}
  1106. function TRVGraphicItemInfo.PrintToBitmap(Bkgnd: TBitmap; Preview: Boolean;
  1107.   RichView: TRVScroller; dli: TRVDrawLineInfo; Part: Integer;
  1108.   ColorMode: TRVColorMode):Boolean;
  1109. var Top: Integer;
  1110. {$IFDEF RICHVIEWCBDEF3}
  1111.     tmp: TBitmap;
  1112. {$ENDIF}
  1113. begin
  1114.   Result := True;
  1115.   if (dli is TRVMultiImagePrintInfo) and (Part>=0) then
  1116.     Top := -TRVImagePrintPart(TRVMultiImagePrintInfo(dli).PartsList[Part]).ImgTop
  1117.   else
  1118.     Top := 0;
  1119.   if (ImageWidth<=0) and (ImageHeight<=0) then
  1120.     if Preview and (ImageCopy<>nil) then
  1121.       Bkgnd.Canvas.Draw(0,Top, ImageCopy)
  1122.     else
  1123.       Bkgnd.Canvas.Draw(0,Top, Image)
  1124.   else
  1125.     if Preview and (ImageCopy<>nil) then
  1126.       Bkgnd.Canvas.StretchDraw(Bounds(0,Top, Bkgnd.Width,Bkgnd.Height), ImageCopy)
  1127.     else begin
  1128.       if ((ImageWidth<=0) or (ImageWidth=Image.Width)) and ((ImageHeight<=0) or (ImageHeight=Image.Height)) then
  1129.         Bkgnd.Canvas.StretchDraw(Bounds(0,Top, Bkgnd.Width,Bkgnd.Height), Image)
  1130.       else begin
  1131.         {$IFDEF RICHVIEWCBDEF3}      
  1132.         tmp := nil;
  1133.         if Image.Transparent then begin
  1134.           tmp := TBitmap.Create;
  1135.           tmp.Assign(bkgnd);
  1136.         end;
  1137.         {$ENDIF}
  1138.         bkgnd.Width  := Image.Width;
  1139.         if Part<0 then
  1140.           bkgnd.Height := Image.Height;
  1141.         {$IFDEF RICHVIEWCBDEF3}
  1142.         if Image.Transparent then begin
  1143.           bkgnd.Canvas.StretchDraw(Rect(0,0,bkgnd.Width,bkgnd.Height), tmp);
  1144.           tmp.Free
  1145.         end;
  1146.         {$ENDIF}
  1147.         Bkgnd.Canvas.Draw(0, Top, Image)
  1148.       end;
  1149.     end;
  1150. end;
  1151. {------------------------------------------------------------------------------}
  1152. procedure TRVGraphicItemInfo.Print(Canvas: TCanvas; x, y, x2: Integer;
  1153.   Preview, Correction: Boolean; const sad: TRVScreenAndDevice;
  1154.   RichView: TRVScroller; dli: TRVDrawLineInfo;
  1155.   Part: Integer; ColorMode: TRVColorMode; RVData: TPersistent);
  1156. var DCState: Integer;
  1157.     R: TRect;
  1158. begin
  1159.   // will be called only for metafiles
  1160.   DCState := SaveDC(Canvas.Handle);
  1161.   try
  1162.     R := Bounds(x+MulDiv(Spacing,  sad.ppixDevice, sad.ppixScreen),
  1163.       y+MulDiv(Spacing, sad.ppiyDevice, sad.ppiyScreen),
  1164.       MulDiv(GetImageWidth(TCustomRichView(RichView).Style),  sad.ppixDevice, sad.ppixScreen),
  1165.       MulDiv(GetImageHeight(TCustomRichView(RichView).Style), sad.ppiyDevice, sad.ppiyScreen));
  1166.     with R do
  1167.       IntersectClipRect(Canvas.Handle, Left, Top, Right, Bottom);
  1168.     Canvas.StretchDraw(r, Image);
  1169.   finally
  1170.     RestoreDC(Canvas.Handle, DCState);
  1171.   end;
  1172. end;
  1173. {------------------------------------------------------------------------------}
  1174. function TRVGraphicItemInfo.CreatePrintingDrawItem(RVData: TObject;
  1175.   const sad: TRVScreenAndDevice): TRVDrawLineInfo;
  1176. begin
  1177.   if not GetBoolValueEx(rvbpPrintToBMP, nil) or (MinHeightOnPage=0) or
  1178.     ((ImageHeight>0) and (ImageHeight<>Image.Height)) then begin
  1179.     Result := TRVDrawLineInfo.Create;
  1180.     exit;
  1181.   end;
  1182.   Result := TRVMultiImagePrintInfo.Create(Self);
  1183.   Result.Width  := MulDiv(GetWidth, sad.ppixDevice, sad.ppixScreen);
  1184.   Result.Height := MulDiv(GetHeight, sad.ppiyDevice, sad.ppiyScreen);
  1185.   TRVMultiImagePrintInfo(Result).sad := sad;
  1186. end;
  1187. {============================ TRVHotGraphicItemInfo ===========================}
  1188. constructor TRVHotGraphicItemInfo.CreateEx(RVData: TPersistent;
  1189.   AImage: TGraphic; AVAlign: TRVVAlign);
  1190. begin
  1191.   inherited CreateEx(RVData, AImage, AVAlign);
  1192.   StyleNo := rvsHotPicture;
  1193. end;
  1194. {------------------------------------------------------------------------------}
  1195. function TRVHotGraphicItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx;
  1196.   RVStyle: TRVStyle): Boolean;
  1197. begin
  1198.   case Prop of
  1199.     rvbpJump, rvbpAllowsFocus, rvbpXORFocus:
  1200.       Result := True;
  1201.     else
  1202.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  1203.   end;
  1204. end;
  1205. {------------------------------------------------------------------------------}
  1206. procedure TRVHotGraphicItemInfo.Execute(RVData:TPersistent);
  1207. begin
  1208.   if RVData is TCustomRVFormattedData then
  1209.     TCustomRVFormattedData(RVData).DoJump(JumpID+
  1210.       TCustomRVFormattedData(RVData).FirstJumpNo)
  1211. end;
  1212. {============================== TRVBulletItemInfo =============================}
  1213. constructor TRVBulletItemInfo.CreateEx(RVData: TPersistent; AImageIndex: Integer; AImageList: TCustomImageList; AVAlign: TRVVAlign);
  1214. begin
  1215.   inherited Create(RVData);
  1216.   StyleNo    := rvsBullet;
  1217.   ImageIndex := AImageIndex;
  1218.   ImageList  := AImageList;
  1219.   VAlign     := AVAlign;
  1220. end;
  1221. {------------------------------------------------------------------------------}
  1222. procedure TRVBulletItemInfo.Assign(Source: TCustomRVItemInfo);
  1223. begin
  1224.   if Source is TRVBulletItemInfo then begin
  1225.     ImageList  := TRVBulletItemInfo(Source).ImageList;
  1226.     ImageIndex := TRVBulletItemInfo(Source).ImageIndex;
  1227.     NoHTMLImageSize := TRVBulletItemInfo(Source).NoHTMLImageSize;
  1228.   end;
  1229.   inherited Assign(Source);
  1230. end;
  1231. {------------------------------------------------------------------------------}
  1232. function TRVBulletItemInfo.GetHeight: Integer;
  1233. begin
  1234.   Result := TImageList(ImageList).Height+Spacing*2;
  1235. end;
  1236. {------------------------------------------------------------------------------}
  1237. function TRVBulletItemInfo.GetImageHeight(RVStyle: TRVStyle): Integer;
  1238. begin
  1239.   Result := TImageList(ImageList).Height;
  1240. end;
  1241. {------------------------------------------------------------------------------}
  1242. function TRVBulletItemInfo.GetWidth: Integer;
  1243. begin
  1244.   Result := TImageList(ImageList).Width+Spacing*2;
  1245. end;
  1246. {------------------------------------------------------------------------------}
  1247. function TRVBulletItemInfo.GetImageWidth(RVStyle: TRVStyle): Integer;
  1248. begin
  1249.   Result := TImageList(ImageList).Width;
  1250. end;
  1251. {------------------------------------------------------------------------------}
  1252. function TRVBulletItemInfo.GetMinWidth(sad: PRVScreenAndDevice; Canvas: TCanvas;
  1253.                                        RVData: TPersistent): Integer;
  1254. begin
  1255.   Result := TImageList(ImageList).Width+Spacing*2;
  1256.   if sad<>nil then
  1257.     Result := MulDiv(Result, sad.ppixDevice, sad.ppixScreen);
  1258. end;
  1259. {------------------------------------------------------------------------------}
  1260. function TRVBulletItemInfo.GetImageIndex(Hot: Boolean): Integer;
  1261. begin
  1262.   Result := ImageIndex;
  1263. end;
  1264. {------------------------------------------------------------------------------}
  1265. function TRVBulletItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  1266. begin
  1267.   case Prop of
  1268.     rvbpValid:
  1269.       Result := ImageList<>nil;
  1270.     rvbpDisplayActiveState:
  1271.       Result := True;
  1272.     else
  1273.       Result := inherited GetBoolValue(Prop);
  1274.   end;
  1275. end;
  1276. {------------------------------------------------------------------------------}
  1277. function TRVBulletItemInfo.GetExtraIntProperty(Prop: TRVExtraItemProperty;
  1278.   var Value: Integer): Boolean;
  1279. begin
  1280.   case Prop of
  1281.     rvepNoHTMLImageSize:
  1282.       begin
  1283.         Value := ord(NoHTMLImageSize);
  1284.         Result := True;
  1285.       end;
  1286.     else
  1287.       Result := inherited GetExtraIntProperty(Prop, Value);
  1288.   end;
  1289. end;
  1290. {------------------------------------------------------------------------------}
  1291. function TRVBulletItemInfo.SetExtraIntProperty(Prop: TRVExtraItemProperty;
  1292.   Value: Integer): Boolean;
  1293. begin
  1294.   case Prop of
  1295.     rvepNoHTMLImageSize:
  1296.       begin
  1297.         NoHTMLImageSize := Value<>0;
  1298.         Result := True;
  1299.       end;
  1300.     else
  1301.       Result := inherited SetExtraIntProperty(Prop, Value);
  1302.   end;
  1303. end;
  1304. {------------------------------------------------------------------------------}
  1305. function TRVBulletItemInfo.GetExtraStrProperty(
  1306.   Prop: TRVExtraItemStrProperty; var Value: String): Boolean;
  1307. begin
  1308.   case Prop of
  1309.     rvespAlt:
  1310.       begin
  1311.         Value := Alt;
  1312.         Result := True;
  1313.       end;
  1314.     else
  1315.       Result := inherited GetExtraStrProperty(Prop, Value);
  1316.   end;
  1317. end;
  1318. {------------------------------------------------------------------------------}
  1319. function TRVBulletItemInfo.SetExtraStrProperty(
  1320.   Prop: TRVExtraItemStrProperty; const Value: String): Boolean;
  1321. begin
  1322.   case Prop of
  1323.     rvespAlt:
  1324.       begin
  1325.         Alt := Value;
  1326.         Result := True;
  1327.       end;
  1328.     else
  1329.       Result := inherited SetExtraStrProperty(Prop, Value);
  1330.   end;
  1331. end;
  1332. {------------------------------------------------------------------------------}
  1333. function TRVBulletItemInfo.GetRVFExtraPropertyCount: Integer;
  1334. begin
  1335.   Result := inherited GetRVFExtraPropertyCount;
  1336.   if NoHTMLImageSize then
  1337.     inc(Result);
  1338.   if Alt<>'' then
  1339.     inc(Result);
  1340. end;
  1341. {------------------------------------------------------------------------------}
  1342. procedure TRVBulletItemInfo.SaveRVFExtraProperties(Stream: TStream);
  1343. begin
  1344.   inherited SaveRVFExtraProperties(Stream);
  1345.   if NoHTMLImageSize then
  1346.     WriteRVFExtraIntPropertyStr(Stream, rvepNoHTMLImageSize, 1);
  1347. end;
  1348. {------------------------------------------------------------------------------}
  1349. function TRVBulletItemInfo.PrintToBitmap(Bkgnd: TBitmap; Preview: Boolean;
  1350.   RichView: TRVScroller; dli: TRVDrawLineInfo; Part: Integer;
  1351.   ColorMode: TRVColorMode): Boolean;
  1352. begin
  1353.   Result := True;
  1354.   ImageList.Draw(Bkgnd.Canvas,0,0, ImageIndex);
  1355. end;
  1356. {------------------------------------------------------------------------------}
  1357. procedure TRVBulletItemInfo.Paint(x, y: Integer; Canvas: TCanvas;
  1358.   State: TRVItemDrawStates; Style: TRVStyle; dli: TRVDrawLineInfo);
  1359. var SelColor: TColor;
  1360.     BlendColor: TColorRef;
  1361.     ILDrawOptions: Integer;
  1362. begin
  1363.   if (rvidsSelected in State) then begin
  1364.     if rvidsControlFocused in State then
  1365.       SelColor := Style.SelColor
  1366.     else
  1367.       SelColor := Style.InactiveSelColor;
  1368.     end
  1369.   else
  1370.     SelColor := clNone;
  1371.   if SelColor<clNone then begin
  1372.     BlendColor := ColorToRGB(SelColor);
  1373.     ILDrawOptions := ILD_TRANSPARENT or ILD_SELECTED;
  1374.     end
  1375.   else begin
  1376.     BlendColor := CLR_NONE;
  1377.     ILDrawOptions := ILD_TRANSPARENT;
  1378.   end;
  1379.   ImageList_DrawEx(ImageList.Handle, GetImageIndex(rvidsHover in State),
  1380.                    Canvas.Handle, x+Spacing, y+Spacing,
  1381.                    TImageList(ImageList).Width, TImageList(ImageList).Height,
  1382.                    CLR_NONE, BlendColor, ILDrawOptions);
  1383.   if (rvidsCurrent in State) and (Style.CurrentItemColor<>clNone) then begin
  1384.     Canvas.Pen.Color := Style.CurrentItemColor;
  1385.     Canvas.Pen.Width := 1;
  1386.     Canvas.Pen.Style := psSolid;
  1387.     Canvas.Rectangle(x,y, x+TImageList(ImageList).Width+Spacing*2, y+TImageList(ImageList).Height+Spacing*2);
  1388.   end;
  1389. end;
  1390. {------------------------------------------------------------------------------}
  1391. function TRVBulletItemInfo.ReadRVFHeader(var P: PChar; RVData: TPersistent): Boolean;
  1392. var ImageListNo: Integer;
  1393. begin
  1394.   Result := (RVFReadInteger(P,ImageListNo) and
  1395.              RVFReadInteger(P,ImageIndex));
  1396.   if not Result then exit;
  1397.   ImageList := TCustomRVData(RVData).RVFImageListNeeded(ImageListNo);
  1398.   if ImageList<>nil then
  1399.     if ImageList.Count<=ImageIndex then begin
  1400.       TCustomRVData(RVData).RVFWarnings := TCustomRVData(RVData).RVFWarnings+[rvfwConvLargeImageIdx];
  1401.       if rvfoConvLargeImageIdxToZero in TCustomRVData(RVData).RVFOptions then
  1402.         ImageIndex := 0
  1403.       else
  1404.         Result := False;
  1405.     end;
  1406. end;
  1407. {------------------------------------------------------------------------------}
  1408. function TRVBulletItemInfo.ReadRVFLine(const s: String;
  1409.                                        RVData: TPersistent;
  1410.                                        ReadType, LineNo, LineCount: Integer;
  1411.                                        var Name: String;
  1412.                                        var ReadMode: TRVFReadMode;
  1413.                                        var ReadState: TRVFReadState): Boolean;
  1414. begin
  1415.   if (LineNo=0) then
  1416.     Name := s
  1417.   else
  1418.     SetExtraPropertyFromRVFStr(s);
  1419.   Result := True;
  1420. end;
  1421. {------------------------------------------------------------------------------}
  1422. function TRVBulletItemInfo.SaveRVFHeaderTail(RVData: TPersistent): String;
  1423. begin
  1424.   Result :=  Format('%d %d', [ImageList.Tag, ImageIndex]);
  1425. end;
  1426. {------------------------------------------------------------------------------}
  1427. procedure TRVBulletItemInfo.SaveRVF(Stream: TStream; RVData: TPersistent;
  1428.                                     ItemNo,ParaNo: Integer; const Name: String;
  1429.                                     Part: TRVMultiDrawItemPart;
  1430.                                     ForceSameAsPrev: Boolean);
  1431. begin
  1432.   RVFWriteLine(Stream,
  1433.     Format('%d %d %s %d %d %s %s',
  1434.           [StyleNo, 1+GetRVFExtraPropertyCount,
  1435.            RVFItemSavePara(ParaNo,TCustomRVData(RVData), ForceSameAsPrev),
  1436.            Byte(RVFGetItemOptions(ItemOptions, ForceSameAsPrev)) and RVItemOptionsMask,
  1437.            0, RVFSaveTag(rvoTagsArePChars in TCustomRVData(RVData).Options, Tag),
  1438.            SaveRVFHeaderTail(RVData)]));
  1439.   RVFWriteLine(Stream, Name);
  1440.   SaveRVFExtraProperties(Stream);
  1441. end;
  1442. {------------------------------------------------------------------------------}
  1443. procedure RVSaveImageListImageToRTF(Stream: TStream;
  1444.                                     TwipsPerPixel: Double;
  1445.                                     ImageList: TCustomImageList;
  1446.                                     ImageIndex: Integer;
  1447.                                     RTFOptions: TRVRTFOptions);
  1448. var s: String;
  1449.     wmf: TMetafile;
  1450.     {$IFDEF RICHVIEWCBDEF3}
  1451.     bmp: TBitmap;
  1452.     slw: Integer;
  1453.     {$ENDIF}
  1454.     Canvas: TMetafileCanvas;
  1455. begin
  1456.   if (ImageList=nil) or (ImageIndex<0) or
  1457.      (ImageIndex>=ImageList.Count) then
  1458.     exit;
  1459.   RVFWrite(Stream,'{pict');
  1460.   {$IFDEF RICHVIEWCBDEF3}
  1461.   if rvrtfSaveBitmapDefault in RTFOptions then begin
  1462.     bmp := TBitmap.Create;
  1463.     ImageList.GetBitmap(ImageIndex, bmp);
  1464.     s := RVFSavePicture(bmp);
  1465.     if bmp.Height>1 then
  1466.       slw := abs(PChar(bmp.ScanLine[1])-PChar(bmp.ScanLine[0]))
  1467.     else
  1468.       slw := bmp.Width;
  1469.     RVFWrite(Stream,Format('dibitmap0wbmwidthbytes%dpicw%dpich%dpicwgoal%dpichgoal%d ',
  1470.                [slw, bmp.Width, bmp.Height, bmp.Width*15, bmp.Height*15]));
  1471.     RVFWrite(Stream, PChar(s)+sizeof(TBitmapFileHeader)*2);
  1472.     bmp.Free;
  1473.     end
  1474.   else
  1475.   {$ENDIF}
  1476.   begin
  1477.     wmf :=  TMetafile.Create;
  1478.     wmf.Enhanced := False;
  1479.     wmf.Width := TImageList(ImageList).Width;
  1480.     wmf.Height := TImageList(ImageList).Height;
  1481.     Canvas := TMetafileCanvas.Create(wmf, 0);
  1482.     ImageList.Draw(Canvas, 0, 0, ImageIndex);
  1483.     Canvas.Free;
  1484.     s := RVFSavePicture(wmf);
  1485.     RVFWrite(Stream,Format('wmetafile1picw%dpich%d ',
  1486.                [wmf.Width, wmf.Height]));
  1487.     RVFWrite(Stream,PChar(s)+22*2); // sizeof(TMetafileHeader)=22
  1488.     wmf.Free;
  1489.   end;
  1490.   RVFWrite(Stream,'}');
  1491. end;
  1492. {------------------------------------------------------------------------------}
  1493. procedure TRVBulletItemInfo.SaveRTF(Stream: TStream; const Path: String;
  1494.   RVData: TPersistent; ItemNo: Integer; const Name: String; TwipsPerPixel: Double;
  1495.   Level: Integer; ColorList: TRVColorList;
  1496.   StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  1497.   FontTable: TRVList);
  1498. begin
  1499.   RVSaveImageListImageToRTF(Stream, TwipsPerPixel,
  1500.     ImageList, ImageIndex, TCustomRVData(RVData).RTFOptions);
  1501. end;
  1502. {------------------------------------------------------------------------------}
  1503. {$IFNDEF RVDONOTUSEHTML}
  1504. procedure RVSaveImageSharedImageInHTML(ImageList: TCustomImageList;
  1505.   ImageIndex: Integer; Graphic: TGraphic;
  1506.   var Location: String;
  1507.   RVData: TPersistent; const Path,
  1508.   imgSavePrefix: String; var imgSaveNo: Integer; CurrentFileColor: TColor;
  1509.   SaveOptions: TRVSaveOptions;
  1510.   Bullets: TRVList);
  1511. var j: Integer;
  1512.     bmp: TBitmap;
  1513.     bi : TRVHTMLBulletInfo;
  1514. begin
  1515.   Location := '';
  1516.   for j:=0 to Bullets.Count-1 do begin
  1517.     bi := TRVHTMLBulletInfo(Bullets[j]);
  1518.     if (ImageList = bi.ImageList) and
  1519.        (ImageIndex = bi.ImageIndex) and
  1520.        (Graphic = bi.Graphic) and
  1521.        (CurrentFileColor = bi.BackColor) then begin
  1522.       Location := bi.FileName;
  1523.       break;
  1524.     end;
  1525.   end;
  1526.   if Location='' then begin
  1527.     bmp := TBitmap.Create;
  1528.     try
  1529.       if ImageList<>nil then begin
  1530.         bmp.Width := TImageList(ImageList).Width;
  1531.         bmp.Height := TImageList(ImageList).Height;
  1532.         bmp.Canvas.Brush.Color := CurrentFileColor;
  1533.         bmp.Canvas.Pen.Color := CurrentFileColor;
  1534.         bmp.Canvas.FillRect(Rect(0,0,bmp.Width,bmp.Height));
  1535.         ImageList.Draw(bmp.Canvas, 0, 0, ImageIndex);
  1536.         end
  1537.       else begin
  1538.         bmp.Width := Graphic.Width;
  1539.         bmp.Height := Graphic.Width;
  1540.         bmp.Canvas.Brush.Color := CurrentFileColor;
  1541.         bmp.Canvas.Pen.Color := CurrentFileColor;
  1542.         bmp.Canvas.FillRect(Rect(0,0,bmp.Width,bmp.Height));
  1543.         bmp.Canvas.Draw(0,0, Graphic);
  1544.       end;
  1545.       Location := TCustomRVData(RVData).DoSavePicture(rvsfHTML, imgSavePrefix, Path,
  1546.                      imgSaveNo, rvsoOverrideImages in SaveOptions,
  1547.                      CurrentFileColor, bmp);
  1548.       Location := RV_GetHTMLPath(Location, SaveOptions, TCustomRVData(RVData).GetRVStyle.DefCodePage);
  1549.       bi := TRVHTMLBulletInfo.Create;
  1550.       bi.FileName   := Location;
  1551.       bi.BackColor  := CurrentFileColor;
  1552.       bi.ImageList  :=  ImageList;
  1553.       bi.ImageIndex := ImageIndex;
  1554.       bi.Graphic    := Graphic;
  1555.       Bullets.Add(bi);
  1556.     finally
  1557.       bmp.Free;
  1558.     end;
  1559.   end;
  1560. end;
  1561. {------------------------------------------------------------------------------}
  1562. procedure TRVBulletItemInfo.SaveToHTML(Stream: TStream;
  1563.   RVData: TPersistent; ItemNo: Integer; const Text, Path,
  1564.   imgSavePrefix: String; var imgSaveNo: Integer; CurrentFileColor: TColor;
  1565.   SaveOptions: TRVSaveOptions;
  1566.   UseCSS: Boolean; Bullets: TRVList);
  1567. var
  1568.     Location: String;
  1569.     DoDefault: Boolean;
  1570.     {....................................................}
  1571.     function GetCSS: String;
  1572.     var s: String;
  1573.     begin
  1574.       Result := '';
  1575.       if UseCSS then begin
  1576.         Result := GetVShiftCSS(TCustomRVData(RVData).GetRVStyle);
  1577.         if Result<>'' then
  1578.           RV_AddStr(Result, Format('style="{%s}"',[Result]));
  1579.       end;
  1580.       if (Alt<>'') or UseCSS then begin
  1581.         if rvsoUTF8 in SaveOptions then
  1582.           s := RVU_AnsiToUTF8(TCustomRVData(RVData).GetRVStyle.DefCodePage, Alt)
  1583.         else
  1584.           s := Alt;
  1585.         RV_AddStr(Result, 'alt="'+s+'"');
  1586.       end;
  1587.       {$IFNDEF RVDONOTUSEITEMHINTS}
  1588.       if Hint<>'' then begin
  1589.         s := RV_GetHintStr(rvsfHTML, Hint);
  1590.         if rvsoUTF8 in SaveOptions then
  1591.           s := RVU_AnsiToUTF8(TCustomRVData(RVData).GetRVStyle.DefCodePage, s);
  1592.         RV_AddStr(Result, s);
  1593.       end;
  1594.       {$ENDIF}
  1595.       if Spacing>0 then
  1596.         RV_AddStr(Result, Format('hspace=%s vspace=%s', [
  1597.           RV_HTMLGetIntAttrVal(Spacing, SaveOptions),
  1598.           RV_HTMLGetIntAttrVal(Spacing, SaveOptions)]));
  1599.       if Result<>'' then
  1600.         Result := ' '+Result+' ';
  1601.     end;
  1602.     {....................................................}
  1603. begin
  1604.   TCustomRVData(RVData).HTMLSaveImage(TCustomRVData(RVData), ItemNo, Path, CurrentFileColor, Location, DoDefault);
  1605.   if DoDefault then
  1606.     RVSaveImageSharedImageInHTML(ImageList, ImageIndex, nil, Location, RVData, Path,
  1607.       imgSavePrefix, imgSaveNo, CurrentFileColor, SaveOptions, Bullets);
  1608.   RVWrite(Stream,Format('<img%s%ssrc="'+Location+'"%s>',
  1609.     [RV_GetExtraIMGStr(SaveOptions, TImageList(ImageList).Width,
  1610.       TImageList(ImageList).Height, NoHTMLImageSize), GetCSS,
  1611.       RV_HTMLGetEndingSlash(SaveOptions)]));
  1612. end;
  1613. {$ENDIF}
  1614. {============================= TRVHotspotItemInfo =============================}
  1615. constructor TRVHotspotItemInfo.CreateEx(RVData: TPersistent; AImageIndex, AHotImageIndex: Integer;
  1616.                                         AImageList: TCustomImageList; AVAlign: TRVVAlign);
  1617. begin
  1618.   inherited CreateEx(RVData, AImageIndex, AImageList, AVAlign);
  1619.   StyleNo       := rvsHotspot;
  1620.   HotImageIndex := AHotImageIndex;
  1621. end;
  1622. {------------------------------------------------------------------------------}
  1623. procedure TRVHotspotItemInfo.Assign(Source: TCustomRVItemInfo);
  1624. begin
  1625.   if Source is TRVHotspotItemInfo then
  1626.     HotImageIndex := TRVHotspotItemInfo(Source).HotImageIndex;
  1627.   inherited Assign(Source);
  1628. end;
  1629. {------------------------------------------------------------------------------}
  1630. function TRVHotspotItemInfo.GetImageIndex(Hot: Boolean): Integer;
  1631. begin
  1632.   if Hot then
  1633.     Result := HotImageIndex
  1634.   else
  1635.     Result := ImageIndex;
  1636. end;
  1637. {------------------------------------------------------------------------------}
  1638. function TRVHotspotItemInfo.ReadRVFHeader(var P: PChar;
  1639.   RVData: TPersistent): Boolean;
  1640. begin
  1641.   Result := (inherited ReadRVFHeader(P, RVData));
  1642.   if not Result then
  1643.     exit;
  1644.   if not (P^ in [#0, #10, #13]) then begin
  1645.     Result := RVFReadInteger(P,HotImageIndex);
  1646.     if not Result then
  1647.       exit;
  1648.     end
  1649.   else
  1650.     HotImageIndex := ImageIndex;
  1651.   if ImageList<>nil then
  1652.     if ImageList.Count<=HotImageIndex then begin
  1653.       TCustomRVData(RVData).RVFWarnings := TCustomRVData(RVData).RVFWarnings+[rvfwConvLargeImageIdx];
  1654.     if rvfoConvLargeImageIdxToZero in TCustomRVData(RVData).RVFOptions then
  1655.       HotImageIndex := 0
  1656.     else
  1657.       Result := False;
  1658.     end;
  1659. end;
  1660. {------------------------------------------------------------------------------}
  1661. function TRVHotspotItemInfo.SaveRVFHeaderTail(RVData: TPersistent): String;
  1662. begin
  1663.   Result := Format('%s %d', [inherited SaveRVFHeaderTail(RVData), HotImageIndex]);
  1664. end;
  1665. {------------------------------------------------------------------------------}
  1666. procedure TRVHotspotItemInfo.SaveRVF(Stream: TStream; RVData: TPersistent;
  1667.                                      ItemNo,ParaNo: Integer; const Name: String;
  1668.                                      Part: TRVMultiDrawItemPart;
  1669.                                      ForceSameAsPrev: Boolean);
  1670. begin
  1671.   RVFWriteLine(Stream,
  1672.     Format('%d %d %s %d %d %s %s',
  1673.           [StyleNo, 1,
  1674.            RVFItemSavePara(ParaNo,TCustomRVData(RVData),ForceSameAsPrev),
  1675.            Byte(RVFGetItemOptions(ItemOptions,ForceSameAsPrev)) and RVItemOptionsMask,
  1676.            0, RVFSaveTag(rvoTagsArePChars in TCustomRVData(RVData).Options, Tag),
  1677.            SaveRVFHeaderTail(RVData)]));
  1678.   RVFWriteLine(Stream, Name);
  1679. end;
  1680. {------------------------------------------------------------------------------}
  1681. function TRVHotspotItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx;
  1682.                                            RVStyle: TRVStyle): Boolean;
  1683. begin
  1684.   case Prop of
  1685.     rvbpJump, rvbpAllowsFocus,rvbpXORFocus:
  1686.        Result := True;
  1687.     rvbpHotColdJump:
  1688.        Result := ImageIndex<>HotImageIndex;
  1689.     else
  1690.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  1691.   end;
  1692. end;
  1693. {------------------------------------------------------------------------------}
  1694. procedure TRVHotspotItemInfo.Execute(RVData: TPersistent);
  1695. begin
  1696.   if RVData is TCustomRVFormattedData then
  1697.     TCustomRVFormattedData(RVData).DoJump(JumpID+
  1698.       TCustomRVFormattedData(RVData).FirstJumpNo)
  1699. end;
  1700. {============================ TRVBreakItemInfo ================================}
  1701. constructor TRVBreakItemInfo.CreateEx(RVData: TPersistent; ALineWidth: Byte; AStyle: TRVBreakStyle; AColor: TColor);
  1702. begin
  1703.   inherited Create(RVData);
  1704.   StyleNo   := rvsBreak;
  1705.   LineWidth := ALineWidth;
  1706.   Style     := AStyle;
  1707.   Color     := AColor;
  1708. end;
  1709. {------------------------------------------------------------------------------}
  1710. procedure TRVBreakItemInfo.Assign(Source: TCustomRVItemInfo);
  1711. begin
  1712.   if Source is TRVBreakItemInfo then begin
  1713.     LineWidth := TRVBreakItemInfo(Source).LineWidth;
  1714.     Color     := TRVBreakItemInfo(Source).Color;
  1715.     Style     := TRVBreakItemInfo(Source).Style;
  1716.   end;
  1717.   inherited Assign(Source);
  1718. end;
  1719. {------------------------------------------------------------------------------}
  1720. { Drawing 3d edge with colors TopLeftColor, BottomRightColor.
  1721.   r - outer rectangle (right bottom coordinates inclusive).
  1722.   LineWidth - width of edge.                                                   }
  1723. procedure DrawEdge(Canvas: TCanvas; r: TRect;
  1724.   TopLeftColor, BottomRightColor: TColor; LineWidth: Integer);
  1725. var i: Integer;
  1726.     DrawBottom: Boolean;
  1727. begin
  1728.   if LineWidth<=0 then
  1729.     LineWidth := 1;
  1730.   DrawBottom := r.Bottom-r.Top>=LineWidth;
  1731.   for i := LineWidth-1 downto 0 do begin
  1732.     Canvas.Pen.Color := TopLeftColor;
  1733.     Canvas.MoveTo(r.Left, r.Bottom);
  1734.     Canvas.LineTo(r.Left, r.Top);
  1735.     Canvas.LineTo(r.Right, r.Top);
  1736.     if DrawBottom then begin
  1737.       Canvas.Pen.Color := BottomRightColor;
  1738.       Canvas.LineTo(r.Right, r.Bottom);
  1739.       Canvas.LineTo(r.Left, r.Bottom);
  1740.       InflateRect(r, -1, -1);
  1741.       end
  1742.     else
  1743.       InflateRect(r, 0, -1);
  1744.   end;
  1745. end;
  1746. {------------------------------------------------------------------------------}
  1747. procedure TRVBreakItemInfo.PaintFullWidth(Left, Right, Top: Integer;
  1748.   Canvas: TCanvas; State: TRVItemDrawStates; Style: TRVStyle;
  1749.   const ClipRect: TRect; dli: TRVDrawLineInfo);
  1750. begin
  1751.   inc(Left,5);
  1752.   dec(Right,5);
  1753.   inc(Top,5);
  1754.   if Color = clNone then
  1755.     Canvas.Pen.Color := Style.TextStyles[0].Color
  1756.   else
  1757.     Canvas.Pen.Color := Color;
  1758.   Canvas.Pen.Style := psInsideFrame;
  1759.   case Self.Style of
  1760.     rvbsLine:
  1761.       begin
  1762.         Canvas.Pen.Width := LineWidth;
  1763.         Canvas.MoveTo(Left, Top);
  1764.         Canvas.LineTo(Right, Top);
  1765.       end;
  1766.     rvbsRectangle:
  1767.       begin
  1768.         Canvas.Pen.Width := 1;
  1769.         Canvas.Rectangle(Left, Top-LineWidth div 2,
  1770.           Right, Top-LineWidth div 2+LineWidth);
  1771.       end;
  1772.     rvbs3d:
  1773.       begin
  1774.         Canvas.Pen.Width := 1;
  1775.         DrawEdge(Canvas,
  1776.           Rect(Left, Top-LineWidth div 2, Right-1, Top-LineWidth div 2+LineWidth-1),
  1777.           clBtnShadow, clBtnFace, 1);
  1778.       end;
  1779.   end;
  1780.   if rvidsSelected in State then begin
  1781.     if rvidsControlFocused in State then
  1782.       Canvas.Pen.Color := Style.SelColor
  1783.     else
  1784.       Canvas.Pen.Color := Style.InactiveSelColor;
  1785.     if Canvas.Pen.Color<>clNone then begin
  1786.       Canvas.Pen.Width := LineWidth;
  1787.       Canvas.MoveTo(Left, Top);
  1788.       Canvas.LineTo(Right, Top);
  1789.     end;
  1790.   end;
  1791.   Canvas.Pen.Width := 1;  
  1792.   Canvas.Pen.Style := psSolid;  
  1793. end;
  1794. {------------------------------------------------------------------------------}
  1795. procedure TRVBreakItemInfo.Print(Canvas: TCanvas; x, y, x2: Integer;
  1796.   Preview, Correction: Boolean; const sad: TRVScreenAndDevice; RichView: TRVScroller;
  1797.   dli: TRVDrawLineInfo;Part: Integer; ColorMode: TRVColorMode; RVData: TPersistent);
  1798. var x5, y5, w: Integer;
  1799.     clr: TColor;
  1800. begin
  1801.   Canvas.Pen.Style := psInsideFrame;
  1802.   Canvas.Pen.Mode := pmCopy;
  1803.   if Color = clNone then
  1804.     clr := TCustomRichView(RichView).Style.TextStyles[0].Color
  1805.   else
  1806.     clr := Color;
  1807.   Canvas.Pen.Color := RV_GetColor(clr, ColorMode);;
  1808.   y5 := (5 * sad.ppiyDevice) div sad.ppiyScreen;
  1809.   x5 := (5 * sad.ppixDevice) div sad.ppixScreen;
  1810.   case Style of
  1811.     rvbsLine:
  1812.       begin
  1813.         Canvas.Pen.Width := (LineWidth * sad.ppiyDevice) div sad.ppiyScreen;
  1814.         Canvas.MoveTo(x+x5, y+y5);
  1815.         Canvas.LineTo(x2-x5, y+y5);
  1816.       end;
  1817.     rvbsRectangle:
  1818.       begin
  1819.         w := (LineWidth * sad.ppiyDevice) div sad.ppiyScreen;
  1820.         Canvas.Pen.Width := Round(sad.ppiyDevice/sad.ppiyScreen);
  1821.         Canvas.Rectangle(x+x5, y+y5-(w div 2), x2-x5, y+y5-(w div 2)+w);
  1822.       end;
  1823.     rvbs3d:
  1824.       begin
  1825.         Canvas.Pen.Width := 1;
  1826.         w := (LineWidth * sad.ppiyDevice) div sad.ppiyScreen;
  1827.         DrawEdge(Canvas,
  1828.           Rect(x+x5, y+y5-(w div 2), x2-x5-1, y+y5-(w div 2)+w-1),
  1829.           RV_GetColor(clBtnShadow, ColorMode),
  1830.           RV_GetColor(clBtnFace, ColorMode),
  1831.           Round(sad.ppiyDevice/sad.ppiyScreen));
  1832.       end;
  1833.   end;
  1834.   Canvas.Pen.Style := psSolid;
  1835. end;
  1836. {------------------------------------------------------------------------------}
  1837. function TRVBreakItemInfo.AsText(LineWidth: Integer; RVData: TPersistent;
  1838.   const Text, Path: String; TextOnly,Unicode: Boolean): String;
  1839. var c: Char;
  1840. begin
  1841.   if Self.LineWidth>1 then
  1842.     c := '='
  1843.   else
  1844.     c := '-';
  1845.   if LineWidth<1 then
  1846.     LineWidth := 1;
  1847.   SetLength(Result, LineWidth);
  1848.   FillChar(PChar(Result)^, LineWidth, ord(c));
  1849. end;
  1850. {------------------------------------------------------------------------------}
  1851. {$IFNDEF RVDONOTUSEHTML}
  1852. procedure TRVBreakItemInfo.SaveToHTML(Stream: TStream; RVData: TPersistent;
  1853.   ItemNo: Integer; const Text, Path: String; const imgSavePrefix: String;
  1854.   var imgSaveNo: Integer; CurrentFileColor: TColor;
  1855.   SaveOptions: TRVSaveOptions; UseCSS: Boolean; Bullets: TRVList);
  1856. var title: String;
  1857. begin
  1858.   if rvsoForceNonTextCSS in SaveOptions then
  1859.     UseCSS := True;
  1860.   title := '';
  1861.   {$IFNDEF RVDONOTUSEITEMHINTS}
  1862.   if Hint<>'' then begin
  1863.     title := RV_GetHintStr(rvsfHTML, Hint)+' ';;
  1864.     if rvsoUTF8 in SaveOptions then
  1865.       title := RVU_AnsiToUTF8(TCustomRVData(RVData).GetRVStyle.DefCodePage, title);
  1866.   end;
  1867.   {$ENDIF}
  1868.   if UseCSS and (Color<>clNone) then
  1869.     RVWrite(Stream, Format('<hr %s size=%s %sstyle="{color : %s}"%s>',
  1870.       [RV_HTMLGetNoValueAttribute('noshade', SaveOptions),
  1871.        RV_HTMLGetIntAttrVal(LineWidth, SaveOptions),
  1872.        title, RV_GetHTMLRGBStr(Color, False),
  1873.        RV_HTMLGetEndingSlash(SaveOptions)]))
  1874.   else if (Color<>clNone) then
  1875.     RVWrite(Stream, Format('<hr %s size=%s color=%s %s%s>',
  1876.       [RV_HTMLGetNoValueAttribute('noshade', SaveOptions),
  1877.        RV_HTMLGetIntAttrVal(LineWidth, SaveOptions),
  1878.        RV_GetHTMLRGBStr(Color, True), title,
  1879.        RV_HTMLGetEndingSlash(SaveOptions)]))
  1880.   else
  1881.     RVWrite(Stream, Format('<hr %s size=%s %s%s>',
  1882.       [RV_HTMLGetNoValueAttribute('noshade', SaveOptions),
  1883.        RV_HTMLGetIntAttrVal(LineWidth, SaveOptions),
  1884.        title, RV_HTMLGetEndingSlash(SaveOptions)]));
  1885. end;
  1886. {$ENDIF}
  1887. {------------------------------------------------------------------------------}
  1888. function TRVBreakItemInfo.ReadRVFHeader(var P: PChar;
  1889.   RVData: TPersistent): Boolean;
  1890. var bc, bs,bw: Integer;
  1891. begin
  1892.   if not (P^ in [#0, #10, #13]) then begin
  1893.     Result := (RVFReadInteger(P,bc) and
  1894.                RVFReadInteger(P,bs) and
  1895.                RVFReadInteger(P,bw));
  1896.     if Result then begin
  1897.       LineWidth := Byte(bw);
  1898.       Style     := TRVBreakStyle(bs);
  1899.       Color     := bc;
  1900.     end;
  1901.     end
  1902.   else begin
  1903.     Color := clNone;
  1904.     Style := rvbsLine;
  1905.     LineWidth := 1;
  1906.     Result := True;
  1907.   end;
  1908. end;
  1909. {------------------------------------------------------------------------------}
  1910. function TRVBreakItemInfo.SaveRVFHeaderTail(RVData: TPersistent): String;
  1911. begin
  1912.   Result := Format('%d %d %d', [Integer(Color), Integer(Style), Integer(LineWidth)]);
  1913. end;
  1914. {------------------------------------------------------------------------------}
  1915. procedure TRVBreakItemInfo.SaveRVF(Stream: TStream; RVData: TPersistent;
  1916.                                    ItemNo, ParaNo: Integer; const Name: String;
  1917.                                    Part: TRVMultiDrawItemPart;
  1918.                                    ForceSameAsPrev: Boolean);
  1919. begin
  1920.   RVFWriteLine(Stream,
  1921.                Format('%d %d %s %d %d %s %s',
  1922.                      [StyleNo, 0,
  1923.                       RVFItemSavePara(ParaNo, TCustomRVData(RVData), False),
  1924.                       Byte(ItemOptions) and RVItemOptionsMask,
  1925.                       0, RVFSaveTag(rvoTagsArePChars in TCustomRVData(RVData).Options,Tag),
  1926.                       SaveRVFHeaderTail(RVData)]));
  1927. end;
  1928. {------------------------------------------------------------------------------}
  1929. procedure TRVBreakItemInfo.FillRTFTables(ColorList: TRVColorList;
  1930.   ListOverrideCountList: TRVIntegerList; RVData: TPersistent); 
  1931. begin
  1932.   ColorList.AddUnique(Color);
  1933. end;
  1934. {------------------------------------------------------------------------------}
  1935. procedure TRVBreakItemInfo.SaveRTF(Stream: TStream; const Path: String;
  1936.   RVData: TPersistent; ItemNo: Integer; const Name: String; TwipsPerPixel: Double;
  1937.   Level: Integer; ColorList: TRVColorList;
  1938.   StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  1939.   FontTable: TRVList);
  1940. var ColorIdx: Integer;
  1941.     tbl: String;
  1942. begin
  1943.   if Color = clNone then
  1944.     ColorIdx := 0
  1945.   else
  1946.     ColorIdx := ColorList.IndexOf(Pointer(Color));
  1947.   case Level of
  1948.     0:
  1949.       tbl := '';
  1950.     1:
  1951.       tbl := 'intblitap1';
  1952.     else
  1953.       tbl := Format('itap%d',[Level]);
  1954.   end;
  1955.   RVWrite(Stream, Format('pard%splainfs6brdrbbrdrsbrdrw%dbrdrcf%dparpard%s',
  1956.                   [tbl, Round(LineWidth*TwipsPerPixel), ColorIdx, tbl]));
  1957. end;
  1958. {------------------------------------------------------------------------------}
  1959. function TRVBreakItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  1960. begin
  1961.   case Prop of
  1962.     rvbpRequiresRVFLines:
  1963.       Result := False;
  1964.     else
  1965.       Result := inherited GetBoolValue(Prop);
  1966.   end;
  1967. end;
  1968. {------------------------------------------------------------------------------}
  1969. function TRVBreakItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean;
  1970. begin
  1971.   case Prop of
  1972.     rvbpPrintToBMP:
  1973.       Result := False;
  1974.     else
  1975.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  1976.   end;
  1977. end;
  1978. {================================ TRVTextItemInfo =============================}
  1979. procedure TRVTextItemInfo.Execute(RVData: TPersistent);
  1980. begin
  1981.   if RVData is TCustomRVFormattedData then begin
  1982.     if GetBoolValueEx(rvbpJump, TCustomRVData(RVData).GetRVStyle) then
  1983.       TCustomRVFormattedData(RVData).DoJump(JumpID+
  1984.           TCustomRVFormattedData(RVData).FirstJumpNo)
  1985.   end;
  1986. end;
  1987. {------------------------------------------------------------------------------}
  1988. function TRVTextItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx;
  1989.   RVStyle: TRVStyle): Boolean;
  1990. begin
  1991.   case Prop of
  1992.     rvbpJump, rvbpAllowsFocus,rvbpXORFocus:
  1993.       Result := RVStyle.TextStyles[GetActualStyleNo(RVStyle)].Jump;
  1994.     rvbpHotColdJump:
  1995.       Result := RVStyle.TextStyles[GetActualStyleNo(RVStyle)].Jump and
  1996.                 RVStyle.StyleHoverSensitive(GetActualStyleNo(RVStyle));
  1997.     else
  1998.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  1999.   end;
  2000. end;
  2001. {------------------------------------------------------------------------------}
  2002. procedure TRVTextItemInfo.MarkStylesInUse(Data: TRVDeleteUnusedStylesData);
  2003. begin
  2004.   inherited MarkStylesInUse(Data);
  2005.   if StyleNo<>rvsDefStyle then
  2006.     Data.UsedTextStyles[StyleNo] := 1;
  2007. end;
  2008. {------------------------------------------------------------------------------}
  2009. function TRVTextItemInfo.ReadRVFHeader(var P: PChar;
  2010.   RVData: TPersistent): Boolean;
  2011. begin
  2012.   Result := True;
  2013.   {$IFNDEF RVDONOTUSEITEMHINTS}
  2014.   {$IFDEF RICHVIEWCBDEF3}
  2015.   if P^<>#0 then
  2016.     Hint := AnsiExtractQuotedStr(P, '"');
  2017.   {$ENDIF}
  2018.   {$ENDIF}
  2019. end;
  2020. {------------------------------------------------------------------------------}
  2021. procedure TRVTextItemInfo.UpdateStyles(Data: TRVDeleteUnusedStylesData);
  2022. begin
  2023.   inherited UpdateStyles(Data);
  2024.   if StyleNo<>rvsDefStyle then
  2025.     dec(StyleNo, Data.UsedTextStyles[StyleNo]-1);
  2026. end;
  2027. {=========================== TRVStoreSubRVData ================================}
  2028. { Must be overriden to return a copy of itself. }
  2029. function TRVStoreSubRVData.Duplicate: TRVStoreSubRVData;
  2030. begin
  2031.   Result := nil;
  2032. end;
  2033. {------------------------------------------------------------------------------}
  2034. { Compares itself with StoreSub. Self and StoreSub must be of the same item.
  2035.   Return value: 0 if the same subdocument, <0 if Self is before StoreSub,
  2036.     > 0 if Self is after StoreSub. }
  2037. function TRVStoreSubRVData.Compare(StoreSub: TRVStoreSubRVData): Integer;
  2038. begin
  2039.   Result := 0;
  2040. end;
  2041. {=========================== TRVMultiDrawItemPart =============================}
  2042. function TRVMultiDrawItemPart.GetSoftPageBreakInfo: Integer;
  2043. begin
  2044.   Result := -1;
  2045. end;
  2046. {============================== TRVTabItemInfo ================================}
  2047. procedure TRVTabItemInfo.MarkStylesInUse(Data: TRVDeleteUnusedStylesData);
  2048. begin
  2049.   inherited MarkStylesInUse(Data);
  2050.   Data.UsedTextStyles[TextStyleNo] := 1;
  2051. end;
  2052. {------------------------------------------------------------------------------}
  2053. procedure TRVTabItemInfo.UpdateStyles(Data: TRVDeleteUnusedStylesData);
  2054. begin
  2055.   inherited UpdateStyles(Data);
  2056.   dec(TextStyleNo, Data.UsedTextStyles[TextStyleNo]-1)
  2057. end;
  2058. {------------------------------------------------------------------------------}
  2059. procedure TRVTabItemInfo.ApplyStyleConversion(RVData: TPersistent;
  2060.   ItemNo, UserData: Integer);
  2061. begin
  2062.   TCustomRVFormattedData(RVData).DoCurrentTextStyleConversion(TextStyleNo, ParaNo,
  2063.     ItemNo, UserData, False);
  2064. end;
  2065. {------------------------------------------------------------------------------}
  2066. function TRVTabItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean;
  2067. begin
  2068.   case Prop of
  2069.     rvbpPrintToBMP:
  2070.       Result := False;
  2071.     rvbpActualPrintSize:
  2072.       Result := True;
  2073.     else
  2074.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  2075.   end;
  2076. end;
  2077. {------------------------------------------------------------------------------}
  2078. function TRVTabItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  2079. begin
  2080.   case Prop of
  2081.     rvbpDrawingChangesFont, rvbpAlwaysInText, rvbpSwitchToAssStyleNo:
  2082.       Result := True;
  2083.     else
  2084.       Result := inherited GetBoolValue(Prop);
  2085.   end;
  2086. end;
  2087. {------------------------------------------------------------------------------}
  2088. procedure TRVTabItemInfo.OnDocWidthChange(DocWidth: Integer;
  2089.   dli: TRVDrawLineInfo; Printing: Boolean; Canvas: TCanvas;
  2090.   RVData: TPersistent; sad: PRVScreenAndDevice; var HShift, Desc: Integer;
  2091.   NoCaching, Reformatting: Boolean);
  2092. var TextMetric: TTextMetric;
  2093. begin
  2094.   TCustomRVData(RVData).GetRVStyle.ApplyStyle(Canvas, TextStyleNo, rvbdUnspecified,
  2095.     rvflCanUseCustomPPI in TCustomRVData(RVData).Flags);
  2096.   FillChar(TextMetric, sizeof(TextMetric), 0);
  2097.   GetTextMetrics(Canvas.Handle, TextMetric);
  2098.   Desc := TextMetric.tmDescent;
  2099.   dli.Height := TextMetric.tmHeight;
  2100.   dli.Width := 0;
  2101. end;
  2102. {------------------------------------------------------------------------------}
  2103. procedure TRVTabItemInfo.SaveRVF(Stream: TStream; RVData: TPersistent;
  2104.   ItemNo, ParaNo: Integer; const Name: String; Part: TRVMultiDrawItemPart;
  2105.   ForceSameAsPrev: Boolean);
  2106. begin
  2107.   RVFWriteLine(Stream,
  2108.     Format('%d %d %s %d %d %s %s',
  2109.       [StyleNo, 0, RVFItemSavePara(ParaNo, TCustomRVData(RVData), False),
  2110.        Byte(ItemOptions) and RVItemOptionsMask,
  2111.        0, RVFSaveTag(rvoTagsArePChars in TCustomRVData(RVData).Options,Tag),
  2112.        SaveRVFHeaderTail(RVData)]));
  2113. end;
  2114. {------------------------------------------------------------------------------}
  2115. function TRVTabItemInfo.SaveRVFHeaderTail(RVData: TPersistent): String;
  2116. begin
  2117.   Result := IntToStr(TextStyleNo);
  2118. end;
  2119. {------------------------------------------------------------------------------}
  2120. function TRVTabItemInfo.ReadRVFHeader(var P: PChar;
  2121.   RVData: TPersistent): Boolean;
  2122. begin
  2123.   Result := True;
  2124.   if not (P^ in [#0, #10, #13]) then begin
  2125.     Result := RVFReadInteger(P, TextStyleNo);
  2126.   end;
  2127. end;
  2128. {------------------------------------------------------------------------------}
  2129. procedure TRVTabItemInfo.DrawTab(Canvas: TCanvas; x, y: Integer;
  2130.   dli: TRVDrawLineInfo; Style: TRVStyle; TextDrawState: TRVTextDrawStates;
  2131.   CanUseCustomPPI, RTL, SpecialChars, Printing: Boolean;
  2132.   ColorMode: TRVColorMode);
  2133.   {.........................................}
  2134.   procedure DrawArrow(const r: TRect);
  2135.   var x,y,len: Integer;
  2136.   begin
  2137.     len := r.Right-r.Left;
  2138.     if len<5 then
  2139.       len := 5;
  2140.     if len>10 then
  2141.       len := 10;
  2142.     Canvas.Pen.Color := Canvas.Font.Color;
  2143.     Canvas.Pen.Width := 1;
  2144.     Canvas.Pen.Style := psSolid;
  2145.     x := (R.Right+R.Left+len) div 2;
  2146.     y := (R.Top+R.Bottom) div 2;
  2147.     Canvas.MoveTo(x,y);
  2148.     Canvas.LineTo(x-len-1,y);
  2149.     if RTL then begin
  2150.       x := x-len+1;
  2151.       Canvas.MoveTo(x,y-1);
  2152.       Canvas.LineTo(x,y+2);
  2153.       inc(x);
  2154.       Canvas.MoveTo(x,y-2);
  2155.       Canvas.LineTo(x,y+3);
  2156.       inc(x);
  2157.       Canvas.MoveTo(x,y-2);
  2158.       Canvas.LineTo(x,y+3);
  2159.       end
  2160.     else begin
  2161.       dec(x);
  2162.       Canvas.MoveTo(x,y-1);
  2163.       Canvas.LineTo(x,y+2);
  2164.       dec(x);
  2165.       Canvas.MoveTo(x,y-2);
  2166.       Canvas.LineTo(x,y+3);
  2167.       dec(x);
  2168.       Canvas.MoveTo(x,y-2);
  2169.       Canvas.LineTo(x,y+3);
  2170.     end;
  2171.   end;
  2172.   {.........................................}
  2173. var w,r: Integer;
  2174.     potm: POutlineTextMetric;
  2175.     sz: Integer;
  2176. begin
  2177.   Style.ApplyStyleColor(Canvas, TextStyleNo, TextDrawState, Printing, ColorMode);
  2178.   Style.ApplyStyle(Canvas, TextStyleNo, rvbdUnspecified, CanUseCustomPPI);
  2179.   {
  2180.   Canvas.Pen.Style := psSolid;
  2181.   Canvas.Pen.Color := clRed;
  2182.   Canvas.Pen.Width := 1;
  2183.   Canvas.Rectangle(x, y, x+dli.Width, y+dli.Height);
  2184.   }
  2185.   if Canvas.Brush.Color<>clNone then
  2186.     Canvas.FillRect(Bounds(x, y, dli.Width, dli.Height));
  2187.   if fsUnderline in Canvas.Font.Style then begin
  2188.     sz := GetOutlineTextMetrics(Canvas.Handle,0,nil);
  2189.     if sz>0 then begin
  2190.       GetMem(potm, sz);
  2191.       FillChar(potm^, sz, 0);
  2192.       sz := GetOutlineTextMetrics(Canvas.Handle,sz,potm);
  2193.       if sz>0 then begin
  2194.         Canvas.Pen.Color := Canvas.Font.Color;
  2195.         Canvas.Pen.Width := potm.otmsUnderscoreSize;
  2196.         Canvas.Pen.Style := psInsideFrame;
  2197.         w := y-potm.otmsUnderscorePosition+potm.otmTextMetrics.tmAscent+
  2198.           potm.otmsUnderscoreSize div 2;
  2199.         Canvas.MoveTo(x-1, w);
  2200.         Canvas.LineTo(x+dli.Width+1, w);
  2201.         Canvas.Pen.Style := psSolid;
  2202.       end;
  2203.       end;
  2204.     end;
  2205.   if SpecialChars then
  2206.     DrawArrow(Bounds(x, y, dli.Width, dli.Height));
  2207.   if Leader<>'' then begin
  2208.     Style.ApplyStyle(Canvas, TextStyleNo, rvbdUnspecified, CanUseCustomPPI);
  2209.     w := Canvas.TextWidth(Leader);
  2210.     if w=0 then
  2211.       exit;
  2212.     r := x+dli.Width-w;
  2213.     inc(x, w);
  2214.     while x+w<=r do begin
  2215.       Canvas.TextOut(x, y, Leader);
  2216.       inc(x, w);
  2217.     end;
  2218.   end;
  2219. end;
  2220. {------------------------------------------------------------------------------}
  2221. procedure TRVTabItemInfo.Paint(x, y: Integer; Canvas: TCanvas;
  2222.   State: TRVItemDrawStates; Style: TRVStyle; dli: TRVDrawLineInfo);
  2223. var TextDrawState: TRVTextDrawStates;
  2224. begin
  2225.   TextDrawState := [];
  2226.   if rvidsSelected in State then
  2227.     include(TextDrawState, rvtsSelected);
  2228.   if rvidsControlFocused in State then
  2229.     include(TextDrawState, rvtsControlFocused);
  2230.   if rvidsHover in State then
  2231.     include(TextDrawState, rvtsHover);
  2232.   DrawTab(Canvas, x, y, dli, Style, TextDrawState, rvidsCanUseCustomPPI in State,
  2233.     rvidsRTL in State, rvidsShowSpecialCharacters in State, False, rvcmColor);
  2234. end;
  2235. {------------------------------------------------------------------------------}
  2236. procedure TRVTabItemInfo.Print(Canvas: TCanvas; x, y, x2: Integer; Preview,
  2237.   Correction: Boolean; const sad: TRVScreenAndDevice;
  2238.   RichView: TRVScroller; dli: TRVDrawLineInfo; Part: Integer;
  2239.   ColorMode: TRVColorMode; RVData: TPersistent);
  2240. begin
  2241.   DrawTab(Canvas, x, y, dli, TCustomRVData(RVData).GetRVStyle, [],
  2242.     rvflCanUseCustomPPI in TCustomRVData(RVData).Flags, False, False, True,
  2243.     ColorMode);
  2244. end;
  2245. {------------------------------------------------------------------------------}
  2246. function TRVTabItemInfo.GetAssociatedTextStyleNo: Integer;
  2247. begin
  2248.   Result := TextStyleNo;
  2249. end;
  2250. {------------------------------------------------------------------------------}
  2251. procedure TRVTabItemInfo.SetAssociatedTextStyleNo(Value: Integer);
  2252. begin
  2253.   TextStyleNo := Value;
  2254. end;
  2255. {------------------------------------------------------------------------------}
  2256. procedure TRVTabItemInfo.SaveRTF(Stream: TStream; const Path: String;
  2257.   RVData: TPersistent; ItemNo: Integer; const Name: String; TwipsPerPixel: Double;
  2258.   Level: Integer; ColorList: TRVColorList; StyleToFont,
  2259.   ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  2260.   FontTable: TRVList);
  2261. begin
  2262.   RVWrite(Stream, 'tab ');
  2263. end;
  2264. {------------------------------------------------------------------------------}
  2265. {$IFNDEF RVDONOTUSEHTML}
  2266. procedure TRVTabItemInfo.SaveToHTML(Stream: TStream; RVData: TPersistent;
  2267.   ItemNo: Integer; const Text, Path, imgSavePrefix: String;
  2268.   var imgSaveNo: Integer; CurrentFileColor: TColor;
  2269.   SaveOptions: TRVSaveOptions; UseCSS: Boolean; Bullets: TRVList);
  2270. var SpacesInTab: Integer;
  2271.     Filler: String;
  2272.     Len: Integer;
  2273. begin
  2274.   SpacesInTab := TCustomRVData(RVData).GetRVStyle.SpacesInTab;
  2275.   if SpacesInTab<=0 then
  2276.     SpacesInTab := 8;
  2277.   if Leader='' then begin
  2278.     Filler := ' &nbsp;';
  2279.     Len := 2;
  2280.     end
  2281.   else begin
  2282.     Filler := RV_MakeHTMLStr(Leader, False);
  2283.     Len := Length(Leader);
  2284.   end;
  2285.   SpacesInTab := (SpacesInTab+Len-1) div Len;
  2286.   while SpacesInTab<>0 do begin
  2287.     RVFWrite(Stream, Filler);
  2288.     dec(SpacesInTab);
  2289.   end;
  2290. end;
  2291. {$ENDIF}
  2292. {------------------------------------------------------------------------------}
  2293. function TRVTabItemInfo.AsText(LineWidth: Integer; RVData: TPersistent;
  2294.   const Text, Path: String; TextOnly, Unicode: Boolean): String;
  2295. begin
  2296.   Result := #09;
  2297. end;
  2298. {==============================================================================}
  2299. initialization
  2300.   RichView_InitializeList;
  2301.   RichViewTextItemClass := TRVTextItemInfo;
  2302. finalization
  2303.   RichView_FinalizeList;
  2304. end.