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

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       Basic item types.                               }
  5. {                                                       }
  6. {       Copyright (c) Sergey Tkachenko                  }
  7. {       svt@trichview.com                               }
  8. {       http://www.trichview.com                        }
  9. {                                                       }
  10. {*******************************************************}
  11. unit RVItem;
  12. interface
  13. {$I RV_Defs.inc}
  14. uses SysUtils, Classes, Windows, Graphics, Controls, Forms,
  15.      CommCtrl,
  16.      {$IFNDEF RVDONOTUSEJPEGIMAGE}
  17.      Jpeg,
  18.      {$ENDIF}
  19.      {$IFDEF RICHVIEWDEF4}
  20.      ImgList,
  21.      {$ENDIF}
  22.      {$IFNDEF RVDONOTUSELIVESPELL}
  23.      RVWordPaint,
  24.      {$ENDIF}
  25.      RVClasses, RVFuncs, RVScroll, RVStyle, DLines;
  26. type
  27.   { Exception class }
  28.   ERichViewError = class(Exception);
  29.   { Options for RichViewItems }
  30.   TRVItemOption = (
  31.     rvioSameAsPrev,      // item is not a first item on the paragraph [section]
  32.     rvioPageBreakBefore, // item starts a page (rvioSameAsPrev must be excluded)
  33.     rvioBR,              // item starts a paragraph section, but not a paragraph
  34.                          // (rvioSameAsPrev must be excluded)
  35.     rvioUnicode,         // this is an Unicode text item
  36.     rvioGroupWithNext);  // item is grouped with next item
  37.   TRVItemOptions = set of TRVItemOption;
  38.   TRVItemState = (
  39.     rvisSpellChecked);   // this item is completely spell-checked (live spell)
  40.   TRVItemStates = set of TRVItemState;
  41.   { Item drawing states. Used in item.Paint() }
  42.   TRVItemDrawState = (
  43.     rvidsSelected,       // the item is selected
  44.     rvidsCurrent,        // the item is current (active) - at the caret position
  45.     rvidsHover,          // the item is a hypertext item under the mouse pointer
  46.     rvidsPrinting,       // this is not drawing but printing (or previewing)
  47.     rvidsPreview,        // this is drawing for print preview
  48.     rvidsPreviewCorrection, // this is drawing for print preview with preview
  49.                          // correction
  50.     rvidsControlFocused, // RichView has input focus
  51.     rvidsCanUseCustomPPI,// rvflCanUseCustomPPI is in RVData.Flags
  52.     rvidsRTL,            // Current paragraph is RTL
  53.     rvidsShowSpecialCharacters); // rvoShowSpecialCharacters in RVData.Options
  54.   TRVItemDrawStates = set of TRVItemDrawState;
  55.   { RVF reading: reading mode }
  56.   TRVFReadMode = (
  57.     rmText,              // reading ANSI text
  58.     rmBeforeBinary,      // reading line break after ANSI text before binary data
  59.     rmBinary,            // reading binary data
  60.     rmBeforeUnicode,     // reading line break after ANSI text before Unicode text
  61.     rmUnicode,           // reading Unicode text
  62.     rmAfterUnicode);     // reading line break after Unicode text before ANSI text
  63.   { RVF reading: reading state }
  64.   TRVFReadState = (
  65.     rstHeader,           // reading item header
  66.     rstData,             // reading item data lines
  67.     rstSkip);            // skipping unknown lines
  68.   { Identifiers of item boolean properties, for item.GetBoolValue() }
  69.   TRVItemBoolProperty = (
  70.     rvbpFullWidth,       // full line item (such as "break" or table) [y/n?]
  71.     rvbpValid,           // the item is valid (has correct data)
  72.     rvbpRequiresRVFLines,   // the item has one or more data lines in RVF
  73.     rvbpDisplayActiveState, // the item shows its active state (at the position
  74.                             // of caret)
  75.     rvbpDrawingChangesFont, // drawing of item may change Canvas.Font
  76.     rvbpCanSaveUnicode,  // the item can represent itself in Unicode
  77.                          // (item.AsText() returns a "raw" Unicode, if Unicode
  78.                          // parameter is True), so RichView does not need
  79.                          // to convert the result of item.AsText() to Unicode
  80.     rvbpAlwaysInText,    // the item must be saved in text, event when saving
  81.                          // the selection
  82.     rvbpImmediateControlOwner, // this item directly owns a VCL control
  83.     rvbpResizable,       // the item can be resized by mouse (RichViewEdit
  84.                          // must create a resizer for it, if this item is selected)
  85.     rvbpResizeHandlesOutside, // resize handles must be drawn not inside, but
  86.                          // outside of item rectangle
  87.     rvbpHasSubRVData,    // item has subdocuments
  88.     rvbpClickSelect,     // item is selected on single click (resizable items
  89.                          //   are always selected on single click)
  90.     rvbpNoHTML_P,        // this item cannot be nested in HTML's <p>...</p>
  91.                          // (<div>...</div> must be used)
  92.     rvbpSwitchToAssStyleNo); // when this item is current, editor must set
  93.                          // current text style to the value of AssociatedTextStyleNo
  94.                          // (if it's >=0)
  95.   { Identifiers of item boolean properties, for item.GetBoolValueEx() }
  96.   TRVItemBoolPropertyEx = (
  97.     rvbpPrintToBMP,      // item.PrintToBitmap() must be used instead of item.Print()
  98.     rvbpJump,            // this is a hypertext item
  99.     rvbpAllowsFocus,     // this item can have input focus
  100.     rvbpHotColdJump,     // this hypertext item can be highlighted under
  101.                          // the mouse pointer
  102.     rvbpXORFocus,        // RichView must draw XOR dotted frame, if this item
  103.                          // has input focus
  104.     rvbpActualPrintSize  // item.OnDocWidthChange() returns item size in printer
  105.                          // (not screen) resolution
  106.     );
  107.   { From there the caret enters into the item, for method EnterItem() }
  108.   TRVEnterDirection = (rvedLeft, rvedRight, rvedTop, rvedBottom);
  109.   { Extra item integer properties }
  110.   TRVExtraItemProperty = (
  111.     rvepUnknown,         // (none)
  112.     rvepVShift,          // vertical offset, in pixels or %
  113.     rvepVShiftAbs,       // if <>0, vertical offset is in pixels
  114.     rvepImageWidth,      // image width (for stretching)
  115.     rvepImageHeight,     // image height (for stretching)
  116.     rvepTransparent,     // bitmap image is transparent, see TBitmap.Transparent
  117.     rvepTransparentMode, // see TBitmep.TransparentMode
  118.     rvepTransparentColor,// see TBitmap.TransparentColor
  119.     rvepMinHeightOnPage, // if <>0, the item can be splitted between pages
  120.                          // if the rest of page > this value; such items
  121.                          // are always printed from the new line
  122.     rvepSpacing,         // spacing around the item
  123.     rvepResizable,       // this item (control) is resizable
  124.     rvepDeleteProtect,   // this item cannot be deleted by editing operations
  125.     rvepNoHTMLImageSize, // if<>0, image size is not saved in HTML,
  126.                          //   even if rvsoImageSizes is included in Options
  127.                          //   for SaveHTML
  128.                          //   (this option is ignored if rvepImageWidth or Height
  129.                          //   are non-zero
  130.     rvepAnimationInterval, // for bitmap image items. If nonzero and
  131.                          // imagewidth and/or imageheight are defined,
  132.                          // plaing bitmap animation (in imagewidth x imageheight)
  133.                          // frame
  134.     rvepVisible);        // for controls: replacement of TControl.Visible property
  135.   TRVExtraItemStrProperty = (
  136.     rvespUnknown,        // (none)
  137.     rvespHint,           // hint
  138.     rvespAlt,            // text representation of images
  139.     rvespImageFileName); // image file name
  140.   { Type of style changing operation }
  141.   TRVEStyleConversionType = (
  142.     rvscParaStyle,           // ApplyParaStyle
  143.     rvscTextStyle,           // ApplyTextStyle
  144.     rvscParaStyleConversion, // ApplyParaStyleConversion
  145.     rvscTextStyleConversion, // ApplyStyleConversion
  146.     rvscParaStyleTemplate,   // ApplyParaStyleTemplate
  147.     rvscTextStyleTemplate);  // ApplyTextStyleTemplate
  148.   { ----------------------------------------------------------------------------
  149.     TRVMultiDrawItemPart: ancestor class of items in
  150.     TRVMultiDrawItemInfo.PartsList.
  151.     Inherited classes:
  152.     - TRVImagePrintPart (for TRVMultiImagePrintInfo.PartsList);
  153.     - TRVTablePrintPart (for TRVTablePrintInfo.PartsList).
  154.   }
  155.   TRVMultiDrawItemPart = class
  156.     public
  157.       Height: Integer;
  158.       function GetSoftPageBreakInfo: Integer; dynamic;
  159.   end;
  160.   TRVDeleteUnusedStylesData = class
  161.     private
  162.       FInitialized, FConvertedToShifts: Boolean;
  163.       FUsedTextStyles, FUsedParaStyles, FUsedListStyles: TRVIntegerList;
  164.       FTextStyles, FParaStyles, FListStyles: Boolean;
  165.     public
  166.       constructor Create(ATextStyles, AParaStyles, AListStyles: Boolean);
  167.       destructor Destroy; override;
  168.       procedure Init(RVStyle: TRVStyle);
  169.       procedure ConvertFlagsToShifts(RVStyle: TRVStyle);
  170.       property UsedTextStyles: TRVIntegerList read FUsedTextStyles;
  171.       property UsedParaStyles: TRVIntegerList read FUsedParaStyles;
  172.       property UsedListStyles: TRVIntegerList read FUsedListStyles;
  173.       property TextStyles: Boolean read FTextStyles;
  174.       property ParaStyles: Boolean read FParaStyles;
  175.       property ListStyles: Boolean read FListStyles;
  176.       property ConvertedToShifts: Boolean read FConvertedToShifts;
  177.   end;
  178. {------------------------------------------------------------------------------}
  179.   TRVCPInfo = class;
  180.   TCustomRVItemInfo = class;
  181.   TRVCPInfo = class
  182.     public
  183.       Name: String;
  184.       Next, Prev: TRVCPInfo;
  185.       RaiseEvent, Persistent: Boolean;
  186.       ItemInfo : TCustomRVItemInfo;
  187.       ItemNo: Integer; // <- not maintained automatically
  188.       Tag: Integer;
  189.       procedure Assign(Source: TRVCPInfo; TagsArePChars: Boolean);
  190.       function CreateCopy(TagsArePChars: Boolean): TRVCPInfo;
  191.   end;
  192. {------------------------------------------------------------------------------}
  193.  TRVSubRVDataPos = (rvdFirst, rvdLast, rvdChosenUp, rvdChosenDown, rvdNext, rvdPrev);
  194.  TRVStoreSubRVData = class
  195.    function Duplicate: TRVStoreSubRVData; dynamic;
  196.    function Compare(StoreSub: TRVStoreSubRVData): Integer; dynamic;
  197.  end;
  198. {------------------------------------------------------------------------------}
  199.   TCustomRVItemInfo = class (TPersistent)
  200.     private
  201.       function GetSameAsPrev: Boolean;
  202.       procedure SetSameAsPrev(const Value: Boolean);
  203.       function GetBR: Boolean;
  204.       procedure SetBR(Value: Boolean);
  205.       function GetPageBreakBefore: Boolean;
  206.       procedure SetPageBreakBefore(const Value: Boolean);
  207.     protected
  208.       function SaveRVFHeaderTail(RVData: TPersistent): String; dynamic;
  209.       function GetRVFExtraPropertyCount: Integer; dynamic;
  210.       procedure SaveRVFExtraProperties(Stream: TStream); dynamic;
  211.       procedure SetExtraPropertyFromRVFStr(const Str: String);
  212.       function GetAssociatedTextStyleNo: Integer; virtual;
  213.       procedure SetAssociatedTextStyleNo(Value: Integer); virtual;
  214.     public
  215.       StyleNo,ParaNo: Integer;
  216.       ItemOptions: TRVItemOptions;
  217.       {$IFNDEF RVDONOTUSELIVESPELL}
  218.       ItemState: TRVItemStates;
  219.       WordPaintList: TRVWordPainterList;
  220.       {$ENDIF}
  221.       Checkpoint: TRVCPInfo;
  222.       JumpID: Integer;
  223.       Tag: Integer;
  224.       DrawItemNo: Integer;
  225.       {$IFNDEF RVDONOTUSEITEMHINTS}
  226.       Hint: String;
  227.       {$ENDIF}
  228.       constructor Create(RVData: TPersistent); virtual;
  229.       {$IFNDEF RVDONOTUSELIVESPELL}
  230.       destructor Destroy; override;
  231.       procedure ClearLiveSpellingResult;
  232.       procedure ClearWordPainters(Index: Integer);
  233.       function AdjustWordPaintersOnInsert(Index: Integer; ch: Char; RVData: TPersistent): Boolean;
  234.       function AdjustWordPaintersOnDelete(Index, Count: Integer): Boolean;
  235.       function GetMisspelling(Offs: Integer; var MisOffs, MisLength: Integer): Boolean;
  236.       procedure AddMisspelling(StartOffs, Length: Integer);
  237.       function IsMisspelled(Index: Integer): Boolean;
  238.       function ValidateMisspelledWord(const AItemText, AWord: String): Boolean;
  239.       {$ENDIF}
  240.       procedure Assign(Source: TCustomRVItemInfo); {$IFDEF RICHVIEWDEF4} reintroduce; {$ENDIF} dynamic;
  241.       procedure TransferProperties(Source: TCustomRVItemInfo; RVData: TPersistent); dynamic;
  242.       function GetSubRVDataAt(X,Y: Integer): TPersistent; dynamic;
  243.       function GetMinWidth(sad: PRVScreenAndDevice; Canvas: TCanvas;
  244.         RVData: TPersistent): Integer; virtual;
  245.       function OwnsControl(AControl: TControl): Boolean; dynamic;
  246.       function OwnsInplaceEditor(AEditor: TControl): Boolean; dynamic;
  247.       function CanBeBorderStart: Boolean;
  248.       function ParaStart(CountBR: Boolean): Boolean;
  249.       property SameAsPrev: Boolean read GetSameAsPrev write SetSameAsPrev;
  250.       function AsImage: TGraphic; virtual;
  251.       {$IFNDEF RVDONOTUSEHTML}
  252.       procedure SaveToHTML(Stream: TStream; RVData: TPersistent;
  253.         ItemNo: Integer; const Text, Path: String;
  254.         const imgSavePrefix: String; var imgSaveNo: Integer;
  255.         CurrentFileColor: TColor; SaveOptions: TRVSaveOptions;
  256.         UseCSS: Boolean; Bullets: TRVList); dynamic;
  257.       {$ENDIF}
  258.       function AsText(LineWidth: Integer; RVData: TPersistent;
  259.         const Text, Path: String; TextOnly,Unicode: Boolean): String; dynamic;
  260.       procedure UpdatePaletteInfo(PaletteAction: TRVPaletteAction;
  261.         ForceRecreateCopy: Boolean; Palette: HPALETTE;
  262.         LogPalette: PLogPalette); dynamic;
  263.       function ReadRVFHeader(var P: PChar; RVData: TPersistent): Boolean; dynamic;
  264.       function GetBoolValue(Prop: TRVItemBoolProperty): Boolean; virtual;
  265.       function GetBoolValueEx(Prop: TRVItemBoolPropertyEx;
  266.         RVStyle: TRVStyle): Boolean; virtual;
  267.       function ReadRVFLine(const s: String; RVData: TPersistent;
  268.         ReadType, LineNo, LineCount: Integer; var Name: String;
  269.         var ReadMode: TRVFReadMode; var ReadState: TRVFReadState): Boolean; dynamic;
  270.       procedure SaveRVF(Stream: TStream; RVData: TPersistent;
  271.         ItemNo, ParaNo: Integer; const Name: String; Part: TRVMultiDrawItemPart;
  272.         ForceSameAsPrev: Boolean); dynamic;
  273.       procedure SaveRTF(Stream: TStream; const Path: String;
  274.         RVData: TPersistent; ItemNo: Integer;
  275.         const Name: String; TwipsPerPixel: Double; Level: Integer;
  276.         ColorList: TRVColorList;
  277.         StyleToFont, ListOverrideOffsetsList1,
  278.         ListOverrideOffsetsList2: TRVIntegerList; FontTable: TRVList); dynamic;
  279.       procedure FillRTFTables(ColorList: TRVColorList;
  280.         ListOverrideCountList: TRVIntegerList; RVData: TPersistent); dynamic;
  281.       procedure PaintFullWidth(Left, Right, Top: Integer; Canvas: TCanvas;
  282.                       State: TRVItemDrawStates;
  283.                       Style: TRVStyle; const ClipRect: TRect;
  284.                       dli: TRVDrawLineInfo); virtual;
  285.       procedure Paint(x,y: Integer; Canvas: TCanvas; State: TRVItemDrawStates;
  286.         Style: TRVStyle; dli: TRVDrawLineInfo); virtual;
  287.       function PrintToBitmap(Bkgnd: TBitmap; Preview: Boolean;
  288.         RichView: TRVScroller; dli: TRVDrawLineInfo; Part: Integer;
  289.         ColorMode: TRVColorMode):Boolean; virtual;
  290.       procedure Print(Canvas: TCanvas; x,y,x2: Integer;
  291.         Preview, Correction: Boolean; const sad: TRVScreenAndDevice;
  292.         RichView: TRVScroller; dli: TRVDrawLineInfo;
  293.         Part: Integer; ColorMode: TRVColorMode; RVData: TPersistent); virtual;
  294.       function GetImageWidth(RVStyle: TRVStyle): Integer; virtual;
  295.       function GetImageHeight(RVStyle: TRVStyle): Integer; virtual;
  296.       function GetBorderWidth: Integer; virtual;
  297.       function GetBorderHeight: Integer; virtual;
  298.       procedure MovingToUndoList(ItemNo: Integer;
  299.         RVData, AContainerUndoItem: TObject); dynamic;
  300.       procedure MovingFromUndoList(ItemNo: Integer; RVData: TObject); dynamic;
  301.       procedure FinalizeUndoGroup; dynamic;
  302.       function MouseMove(Shift: TShiftState; X,Y, ItemNo: Integer;
  303.         RVData: TObject):Boolean; dynamic;
  304.       function MouseDown(Button: TMouseButton; Shift: TShiftState;
  305.         X,Y, ItemNo: Integer; RVData: TObject):Boolean; dynamic;
  306.       function MouseUp(Button: TMouseButton; Shift: TShiftState;
  307.         X,Y, ItemNo: Integer; RVData: TObject):Boolean; dynamic;
  308.       procedure BeforeLoading(FileFormat: TRVLoadFormat); dynamic;
  309.       procedure AfterLoading(FileFormat: TRVLoadFormat); dynamic;
  310.       procedure DeselectPartial; dynamic;
  311.       function PartiallySelected: Boolean; dynamic;
  312.       function CanDeletePartiallySelected: Boolean; dynamic;
  313.       procedure DeletePartiallySelected; dynamic;
  314.       procedure ApplyStyleConversionToSubRVDatas(UserData: Integer;
  315.         SelectedOnly: Boolean; ConvType: TRVEStyleConversionType);dynamic;
  316.       procedure ApplyStyleConversion(RVData: TPersistent; ItemNo,
  317.         UserData: Integer); dynamic;
  318.       function CreatePrintingDrawItem(RVData: TObject;
  319.         const sad: TRVScreenAndDevice): TRVDrawLineInfo; virtual;
  320.       procedure StartExport; dynamic;
  321.       procedure EndExport; dynamic;
  322.       procedure Inserting(RVData: TObject; var Text: String; Safe: Boolean); virtual;
  323.       procedure Inserted(RVData: TObject; ItemNo: Integer); virtual;
  324.       procedure BeforeUndoChangeProperty; dynamic;
  325.       procedure AfterUndoChangeProperty; dynamic;
  326.       function EnterItem(From: TRVEnterDirection; Coord: Integer): Boolean; dynamic;
  327.       function GetHypertextCursor(RVStyle: TRVStyle): TCursor; dynamic;
  328.       procedure BuildJumps(Left,Top: Integer; var StartJumpNo: Integer; jumps: TList); dynamic;
  329.       procedure Focusing;dynamic;
  330.       function MoveFocus(GoForward: Boolean; var TopLevelRVData: TPersistent;
  331.         var TopLevelItemNo: Integer): Boolean; dynamic;
  332.       procedure ClearFocus; dynamic;
  333.       procedure Execute(RVData:TPersistent);dynamic;
  334.       function AdjustFocusToControl(Control: TControl;
  335.         var TopLevelRVData: TPersistent;
  336.         var TopLevelItemNo: Integer):Boolean;dynamic;
  337.       procedure OnDocWidthChange(DocWidth: Integer; dli: TRVDrawLineInfo;
  338.         Printing: Boolean; Canvas: TCanvas; RVData: TPersistent;
  339.         sad: PRVScreenAndDevice; var HShift, Desc: Integer;
  340.         NoCaching, Reformatting: Boolean); virtual;
  341.       procedure MarkStylesInUse(Data: TRVDeleteUnusedStylesData); dynamic;
  342.       procedure UpdateStyles(Data: TRVDeleteUnusedStylesData); dynamic;
  343.       function GetSubRVData(var StoreState: TRVStoreSubRVData;
  344.         Position: TRVSubRVDataPos): TPersistent; dynamic;
  345.       procedure ChooseSubRVData(StoreState: TRVStoreSubRVData); dynamic;
  346.       procedure CleanUpChosen; dynamic;
  347.       procedure ResetSubCoords; dynamic;
  348.       function SetExtraIntProperty(Prop: TRVExtraItemProperty;
  349.         Value: Integer): Boolean; dynamic;
  350.       function GetExtraIntProperty(Prop: TRVExtraItemProperty;
  351.         var Value: Integer): Boolean; dynamic;
  352.       function SetExtraStrProperty(Prop: TRVExtraItemStrProperty;
  353.         const Value: String): Boolean; dynamic;
  354.       function GetExtraStrProperty(Prop: TRVExtraItemStrProperty;
  355.         var Value: String): Boolean; dynamic;
  356.       function SetExtraCustomProperty(const PropName, Value: String): Boolean; dynamic;
  357.       function GetSoftPageBreakDY(Data: Integer): Integer; dynamic;
  358.       function GetActualStyleNo(RVStyle: TRVStyle): Integer;
  359.       procedure DrawBackgroundForPrinting(Canvas: TCanvas;
  360.         const Rect, FullRect: TRect; ColorMode: TRVColorMode;
  361.         ItemBackgroundLayer: Integer); virtual;
  362.       {$IFNDEF RVDONOTUSEANIMATION}
  363.       procedure UpdateAnimator(RVData: TObject); dynamic;
  364.       {$ENDIF}
  365.       property BR: Boolean read GetBR write SetBR;
  366.       property PageBreakBefore: Boolean read GetPageBreakBefore write SetPageBreakBefore;
  367.       property AssociatedTextStyleNo: Integer read GetAssociatedTextStyleNo write SetAssociatedTextStyleNo;
  368.   end;
  369.   TCustomRVItemInfoClass = class of TCustomRVItemInfo;
  370.   TRVTextItemInfo = class (TCustomRVItemInfo)
  371.     public
  372.       function GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean; override;
  373.       procedure Execute(RVData:TPersistent);override;
  374.       procedure MarkStylesInUse(Data: TRVDeleteUnusedStylesData); override;
  375.       procedure UpdateStyles(Data: TRVDeleteUnusedStylesData); override;
  376.       function ReadRVFHeader(var P: PChar; RVData: TPersistent): Boolean; override;
  377.   end;
  378.   TRVTextItemInfoClass = class of TRVTextItemInfo;
  379.   TRVNonTextItemInfo = class (TCustomRVItemInfo)
  380.     protected
  381.       function GetHeight: Integer; virtual;
  382.       function GetWidth: Integer;  virtual;
  383.       function GetRVFExtraPropertyCount: Integer; override;
  384.       procedure SaveRVFExtraProperties(Stream: TStream); override;
  385.     public
  386.       DeleteProtect: Boolean;
  387.       function GetLeftOverhang: Integer; virtual;
  388.       procedure AdjustInserted(x,y: Integer; adjusty: Boolean); virtual;
  389.       procedure Assign(Source: TCustomRVItemInfo); override;
  390.       function SetExtraIntProperty(Prop: TRVExtraItemProperty; Value: Integer): Boolean; override;
  391.       function GetExtraIntProperty(Prop: TRVExtraItemProperty; var Value: Integer): Boolean; override;
  392.       property Height: Integer read GetHeight;
  393.       property Width: Integer read GetWidth;
  394.   end;
  395.   TRVFullLineItemInfo = class (TRVNonTextItemInfo)
  396.     public
  397.       function GetBoolValue(Prop: TRVItemBoolProperty): Boolean; override;
  398.   end;
  399.   TRVRectItemInfo = class (TRVNonTextItemInfo)
  400.     protected
  401.       FMinHeightOnPage: Integer;
  402.       function GetDescent: Integer; virtual; // not used
  403.       function SaveRVFHeaderTail(RVData: TPersistent): String; override;
  404.       function GetRVFExtraPropertyCount: Integer; override;
  405.       procedure SaveRVFExtraProperties(Stream: TStream); override;
  406.       function GetVShiftCSS(RVStyle: TRVStyle): String;
  407.     public
  408.       VAlign: TRVVAlign;
  409.       VShift: Integer;
  410.       VShiftAbs: Boolean;
  411.       Spacing: Integer;
  412.       constructor Create(RVData: TPersistent); override;
  413.       procedure Assign(Source: TCustomRVItemInfo); override;
  414.       function SetExtraIntProperty(Prop: TRVExtraItemProperty; Value: Integer): Boolean; override;
  415.       function GetExtraIntProperty(Prop: TRVExtraItemProperty; var Value: Integer): Boolean; override;
  416.       function ReadRVFHeader(var P: PChar; RVData: TPersistent): Boolean; override;
  417.       function GetBorderWidth: Integer; override;
  418.       function GetBorderHeight: Integer; override;
  419.       property Descent: Integer read GetDescent;
  420.   end;
  421.   TRVTabItemInfo = class (TRVRectItemInfo)
  422.     private
  423.       procedure DrawTab(Canvas: TCanvas; x, y: Integer; dli: TRVDrawLineInfo;
  424.         Style: TRVStyle; TextDrawState: TRVTextDrawStates;
  425.         CanUseCustomPPI, RTL, SpecialChars, Printing: Boolean;
  426.         ColorMode: TRVColorMode);
  427.     protected
  428.       function GetAssociatedTextStyleNo: Integer; override;
  429.       procedure SetAssociatedTextStyleNo(Value: Integer); override;
  430.       function SaveRVFHeaderTail(RVData: TPersistent): String; override;
  431.     public
  432.       TextStyleNo: Integer;
  433.       Leader: String;
  434.       function ReadRVFHeader(var P: PChar; RVData: TPersistent): Boolean; override;      
  435.       function GetBoolValueEx(Prop: TRVItemBoolPropertyEx;
  436.         RVStyle: TRVStyle): Boolean; override;
  437.       function GetBoolValue(Prop: TRVItemBoolProperty): Boolean; override;
  438.       procedure MarkStylesInUse(Data: TRVDeleteUnusedStylesData); override;
  439.       procedure UpdateStyles(Data: TRVDeleteUnusedStylesData); override;
  440.       procedure Paint(x,y: Integer; Canvas: TCanvas; State: TRVItemDrawStates;
  441.         Style: TRVStyle; dli: TRVDrawLineInfo); override;
  442.       procedure Print(Canvas: TCanvas; x,y,x2: Integer;
  443.         Preview, Correction: Boolean; const sad: TRVScreenAndDevice;
  444.         RichView: TRVScroller; dli: TRVDrawLineInfo;
  445.         Part: Integer; ColorMode: TRVColorMode; RVData: TPersistent); override;
  446.       procedure ApplyStyleConversion(RVData: TPersistent; ItemNo, UserData: Integer); override;
  447.       procedure OnDocWidthChange(DocWidth: Integer; dli: TRVDrawLineInfo;
  448.         Printing: Boolean; Canvas: TCanvas; RVData: TPersistent;
  449.         sad: PRVScreenAndDevice; var HShift, Desc: Integer;
  450.         NoCaching, Reformatting: Boolean); override;
  451.       procedure SaveRVF(Stream: TStream; RVData: TPersistent; ItemNo, ParaNo: Integer;
  452.         const Name: String; Part: TRVMultiDrawItemPart;
  453.         ForceSameAsPrev: Boolean); override;
  454.       procedure SaveRTF(Stream: TStream; const Path: String;
  455.         RVData: TPersistent; ItemNo: Integer;
  456.         const Name: String; TwipsPerPixel: Double; Level: Integer;
  457.         ColorList: TRVColorList;
  458.         StyleToFont, ListOverrideOffsetsList1,
  459.         ListOverrideOffsetsList2: TRVIntegerList; FontTable: TRVList); override;
  460.       {$IFNDEF RVDONOTUSEHTML}
  461.       procedure SaveToHTML(Stream: TStream; RVData: TPersistent;
  462.         ItemNo: Integer; const Text, Path: String;
  463.         const imgSavePrefix: String; var imgSaveNo: Integer;
  464.         CurrentFileColor: TColor; SaveOptions: TRVSaveOptions;
  465.         UseCSS: Boolean; Bullets: TRVList); override;
  466.       {$ENDIF}
  467.       function AsText(LineWidth: Integer; RVData: TPersistent;
  468.         const Text, Path: String; TextOnly, Unicode: Boolean): String; override;
  469.   end;
  470.   TRVControlItemInfo = class (TRVRectItemInfo)
  471.     protected
  472.       FResizable, FVisible: Boolean;
  473.       function GetHeight: Integer; override;
  474.       function GetWidth: Integer; override;
  475.       function GetRVFExtraPropertyCount: Integer; override;
  476.       procedure SaveRVFExtraProperties(Stream: TStream); override;
  477.     public
  478.       Control:  TControl;
  479.       PercentWidth: Integer;
  480.       constructor CreateEx(RVData: TPersistent;AControl: TControl; AVAlign: TRVVAlign);
  481.       constructor Create(RVData: TPersistent); override;
  482.       procedure Assign(Source: TCustomRVItemInfo); override;
  483.       destructor Destroy; override;
  484.       function GetMinWidth(sad: PRVScreenAndDevice; Canvas: TCanvas; RVData: TPersistent): Integer; override;
  485.       procedure AdjustInserted(x,y: Integer; adjusty: Boolean); override;
  486.       function PrintToBitmap(Bkgnd: TBitmap; Preview: Boolean; RichView: TRVScroller;
  487.         dli: TRVDrawLineInfo; Part: Integer; ColorMode: TRVColorMode):Boolean; override;
  488.       function CreatePrintingDrawItem(RVData: TObject; const sad: TRVScreenAndDevice): TRVDrawLineInfo; override;
  489.       procedure Paint(x,y: Integer; Canvas: TCanvas; State: TRVItemDrawStates;
  490.         Style: TRVStyle; dli: TRVDrawLineInfo); override;
  491.       function OwnsControl(AControl: TControl): Boolean; override;
  492.       function AsText(LineWidth: Integer;
  493.                            RVData: TPersistent;
  494.                            const Text, Path: String;
  495.                            TextOnly,Unicode: Boolean): String; override;
  496.       {$IFNDEF RVDONOTUSEHTML}
  497.       procedure SaveToHTML(Stream: TStream; RVData: TPersistent;
  498.                            ItemNo: Integer;
  499.                            const Text, Path: String;
  500.                            const imgSavePrefix: String;
  501.                            var imgSaveNo: Integer;
  502.                            CurrentFileColor: TColor;
  503.                            SaveOptions: TRVSaveOptions;
  504.                            UseCSS: Boolean;
  505.                            Bullets: TRVList); override;
  506.       {$ENDIF}
  507.       function ReadRVFLine(const s: String; RVData: TPersistent;
  508.                            ReadType, LineNo, LineCount: Integer;
  509.                            var Name: String;
  510.                            var ReadMode: TRVFReadMode;
  511.                            var ReadState: TRVFReadState): Boolean; override;
  512.       procedure SaveRVF(Stream: TStream; RVData: TPersistent; ItemNo, ParaNo: Integer;
  513.                         const Name: String; Part: TRVMultiDrawItemPart;
  514.                         ForceSameAsPrev: Boolean); override;
  515.       function SetExtraIntProperty(Prop: TRVExtraItemProperty; Value: Integer): Boolean; override;
  516.       function GetExtraIntProperty(Prop: TRVExtraItemProperty; var Value: Integer): Boolean; override;
  517.       procedure SaveRTF(Stream: TStream; const Path: String;
  518.         RVData: TPersistent; ItemNo: Integer;
  519.         const Name: String; TwipsPerPixel: Double; Level: Integer; ColorList: TRVColorList;
  520.         StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  521.         FontTable: TRVList); override;
  522.       function GetBoolValue(Prop: TRVItemBoolProperty): Boolean; override;
  523.       function GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean; override;
  524.       function GetImageHeight(RVStyle: TRVStyle): Integer; override;
  525.       function GetImageWidth(RVStyle: TRVStyle): Integer; override;
  526.       procedure MovingToUndoList(ItemNo: Integer; RVData, AContainerUndoItem: TObject); override;
  527.       procedure MovingFromUndoList(ItemNo: Integer; RVData: TObject); override;
  528.       procedure Inserting(RVData: TObject; var Text: String; Safe: Boolean); override;
  529.       procedure Focusing; override;
  530.       procedure OnDocWidthChange(DocWidth: Integer; dli: TRVDrawLineInfo; Printing: Boolean;
  531.                                  Canvas: TCanvas; RVData: TPersistent; sad: PRVScreenAndDevice;
  532.                                  var HShift, Desc: Integer; NoCaching, Reformatting: Boolean); override;
  533.       property MinHeightOnPage: Integer read FMinHeightOnPage write FMinHeightOnPage;
  534.   end;
  535.   TRVGraphicItemInfo = class (TRVRectItemInfo)
  536.     protected
  537.       {$IFNDEF RVDONOTUSEANIMATION}
  538.       FAnimator: TObject;
  539.       {$ENDIF}
  540.       function GetHeight: Integer; override;
  541.       function GetWidth: Integer; override;
  542.       function GetRVFExtraPropertyCount: Integer; override;
  543.       procedure SaveRVFExtraProperties(Stream: TStream); override;
  544.     public
  545.       Image, ImageCopy: TGraphic;
  546.       ImageWidth, ImageHeight, Interval : Integer;
  547.       NoHTMLImageSize: Boolean;
  548.       Alt, ImageFileName: String;
  549.       constructor CreateEx(RVData: TPersistent; AImage: TGraphic; AVAlign: TRVVAlign); virtual;
  550.       procedure Assign(Source: TCustomRVItemInfo); override;
  551.       procedure TransferProperties(Source: TCustomRVItemInfo;
  552.         RVData: TPersistent); override;
  553.       function SetExtraIntProperty(Prop: TRVExtraItemProperty;
  554.         Value: Integer): Boolean; override;
  555.       function GetExtraIntProperty(Prop: TRVExtraItemProperty;
  556.         var Value: Integer): Boolean; override;
  557.       function SetExtraStrProperty(Prop: TRVExtraItemStrProperty;
  558.         const Value: String): Boolean; override;
  559.       function GetExtraStrProperty(Prop: TRVExtraItemStrProperty;
  560.         var Value: String): Boolean; override;
  561.       procedure UpdatePaletteInfo(PaletteAction: TRVPaletteAction;
  562.         ForceRecreateCopy: Boolean; Palette: HPALETTE;
  563.         LogPalette: PLogPalette); override;
  564.       function GetMinWidth(sad: PRVScreenAndDevice; Canvas: TCanvas;
  565.         RVData: TPersistent): Integer; override;
  566.       destructor Destroy; override;
  567.       function AsImage: TGraphic; override;
  568.       procedure Paint(x,y: Integer; Canvas: TCanvas; State: TRVItemDrawStates;
  569.         Style: TRVStyle; dli: TRVDrawLineInfo); override;
  570.       function GetBoolValue(Prop: TRVItemBoolProperty): Boolean; override;
  571.       function GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean; override;
  572.       {$IFNDEF RVDONOTUSEHTML}
  573.       procedure SaveToHTML(Stream: TStream; RVData: TPersistent;
  574.         ItemNo: Integer; const Text, Path: String; const imgSavePrefix: String;
  575.         var imgSaveNo: Integer; CurrentFileColor: TColor;
  576.         SaveOptions: TRVSaveOptions; UseCSS: Boolean; Bullets: TRVList); override;
  577.       {$ENDIF}
  578.       function ReadRVFLine(const s: String; RVData: TPersistent;
  579.         ReadType, LineNo, LineCount: Integer; var Name: String;
  580.         var ReadMode: TRVFReadMode; var ReadState: TRVFReadState): Boolean; override;
  581.       procedure SaveRVF(Stream: TStream; RVData: TPersistent; ItemNo, ParaNo: Integer;
  582.         const Name: String; Part: TRVMultiDrawItemPart;
  583.         ForceSameAsPrev: Boolean); override;
  584.       procedure SaveRTF(Stream: TStream; const Path: String;
  585.         RVData: TPersistent; ItemNo: Integer;
  586.         const Name: String; TwipsPerPixel: Double; Level: Integer; ColorList: TRVColorList;
  587.         StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  588.         FontTable: TRVList); override;
  589.       function PrintToBitmap(Bkgnd: TBitmap; Preview: Boolean; RichView: TRVScroller;
  590.         dli: TRVDrawLineInfo; Part: Integer; ColorMode: TRVColorMode):Boolean; override;
  591.       procedure Print(Canvas: TCanvas; x,y,x2: Integer; Preview, Correction: Boolean;
  592.         const sad: TRVScreenAndDevice; RichView: TRVScroller; dli: TRVDrawLineInfo;
  593.         Part: Integer; ColorMode: TRVColorMode; RVData: TPersistent); override;
  594.       function GetImageHeight(RVStyle: TRVStyle): Integer; override;
  595.       function GetImageWidth(RVStyle: TRVStyle): Integer; override;
  596.       procedure MovingToUndoList(ItemNo: Integer; RVData, AContainerUndoItem: TObject); override;
  597.       function CreatePrintingDrawItem(RVData: TObject; const sad: TRVScreenAndDevice): TRVDrawLineInfo; override;
  598.       {$IFNDEF RVDONOTUSEANIMATION}
  599.       procedure UpdateAnimator(RVData: TObject); override;
  600.       {$ENDIF}
  601.       property MinHeightOnPage: Integer read FMinHeightOnPage write FMinHeightOnPage;
  602.   end;
  603.   TRVGraphicItemInfoClass = class of TRVGraphicItemInfo;
  604.   TRVHotGraphicItemInfo = class(TRVGraphicItemInfo)
  605.     public
  606.       function GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean; override;
  607.       constructor CreateEx(RVData: TPersistent; AImage: TGraphic; AVAlign: TRVVAlign); override;
  608.       procedure Execute(RVData:TPersistent); override;
  609.   end;
  610.   TRVBulletItemInfo = class (TRVRectItemInfo)
  611.     protected
  612.       function GetHeight: Integer; override;
  613.       function GetWidth: Integer; override;
  614.       function GetImageIndex(Hot: Boolean): Integer; virtual;
  615.       function SaveRVFHeaderTail(RVData: TPersistent): String; override;
  616.       function GetRVFExtraPropertyCount: Integer; override;
  617.       procedure SaveRVFExtraProperties(Stream: TStream); override;      
  618.     public
  619.       ImageList: TCustomImageList;
  620.       ImageIndex: Integer;
  621.       NoHTMLImageSize: Boolean;
  622.       Alt: String;       
  623.       constructor CreateEx(RVData: TPersistent; AImageIndex: Integer;
  624.         AImageList: TCustomImageList; AVAlign: TRVVAlign);
  625.       {$IFNDEF RVDONOTUSEHTML}
  626.       procedure SaveToHTML(Stream: TStream; RVData: TPersistent; ItemNo: Integer;
  627.         const Text, Path: String; const imgSavePrefix: String;
  628.         var imgSaveNo: Integer; CurrentFileColor: TColor;
  629.         SaveOptions: TRVSaveOptions; UseCSS: Boolean; Bullets: TRVList); override;
  630.       {$ENDIF}
  631.       procedure Assign(Source: TCustomRVItemInfo); override;
  632.       function GetMinWidth(sad: PRVScreenAndDevice; Canvas: TCanvas;
  633.         RVData: TPersistent): Integer; override;
  634.       procedure Paint(x,y: Integer; Canvas: TCanvas; State: TRVItemDrawStates;
  635.         Style: TRVStyle; dli: TRVDrawLineInfo); override;
  636.       function PrintToBitmap(Bkgnd: TBitmap; Preview: Boolean; RichView: TRVScroller;
  637.         dli: TRVDrawLineInfo; Part: Integer; ColorMode: TRVColorMode):Boolean; override;
  638.       function ReadRVFHeader(var P: PChar; RVData: TPersistent): Boolean; override;
  639.       function ReadRVFLine(const s: String; RVData: TPersistent;
  640.         ReadType, LineNo, LineCount: Integer; var Name: String;
  641.         var ReadMode: TRVFReadMode; var ReadState: TRVFReadState): Boolean; override;
  642.       procedure SaveRVF(Stream: TStream; RVData: TPersistent; ItemNo, ParaNo: Integer;
  643.         const Name: String; Part: TRVMultiDrawItemPart;
  644.         ForceSameAsPrev: Boolean); override;
  645.       procedure SaveRTF(Stream: TStream; const Path: String;
  646.         RVData: TPersistent; ItemNo: Integer;
  647.         const Name: String; TwipsPerPixel: Double; Level: Integer; ColorList: TRVColorList;
  648.         StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  649.         FontTable: TRVList); override;
  650.       function GetBoolValue(Prop: TRVItemBoolProperty): Boolean; override;
  651.       function SetExtraIntProperty(Prop: TRVExtraItemProperty;
  652.         Value: Integer): Boolean; override;
  653.       function GetExtraIntProperty(Prop: TRVExtraItemProperty;
  654.         var Value: Integer): Boolean; override;
  655.       function SetExtraStrProperty(Prop: TRVExtraItemStrProperty;
  656.         const Value: String): Boolean; override;
  657.       function GetExtraStrProperty(Prop: TRVExtraItemStrProperty;
  658.         var Value: String): Boolean; override;
  659.       function GetImageHeight(RVStyle: TRVStyle): Integer; override;
  660.       function GetImageWidth(RVStyle: TRVStyle): Integer; override;
  661.   end;
  662.   TRVHotspotItemInfo = class (TRVBulletItemInfo)
  663.     protected
  664.       function GetImageIndex(Hot: Boolean): Integer; override;
  665.       function SaveRVFHeaderTail(RVData: TPersistent): String; override;
  666.     public
  667.       HotImageIndex: Integer;
  668.       constructor CreateEx(RVData: TPersistent; AImageIndex, AHotImageIndex: Integer;
  669.                            AImageList: TCustomImageList; AVAlign: TRVVAlign);
  670.       procedure Assign(Source: TCustomRVItemInfo); override;
  671.       function ReadRVFHeader(var P: PChar; RVData: TPersistent): Boolean; override;
  672.       procedure SaveRVF(Stream: TStream; RVData: TPersistent; ItemNo, ParaNo: Integer;
  673.                         const Name: String; Part: TRVMultiDrawItemPart;
  674.                         ForceSameAsPrev: Boolean); override;
  675.       function GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean;override;
  676.       procedure Execute(RVData:TPersistent);override;
  677.   end;
  678.   TRVBreakItemInfo = class (TRVFullLineItemInfo)
  679.     protected
  680.       function SaveRVFHeaderTail(RVData: TPersistent): String; override;
  681.     public
  682.       LineWidth: Byte;
  683.       Style: TRVBreakStyle;
  684.       Color: TColor;
  685.       constructor CreateEx(RVData: TPersistent; ALineWidth: Byte; AStyle: TRVBreakStyle; AColor: TColor);
  686.       procedure Assign(Source: TCustomRVItemInfo); override;
  687.       procedure PaintFullWidth(Left, Right, Top: Integer; Canvas: TCanvas;
  688.                       State: TRVItemDrawStates;
  689.                       Style: TRVStyle; const ClipRect: TRect;
  690.                       dli: TRVDrawLineInfo); override;
  691.       procedure Print(Canvas: TCanvas; x,y,x2: Integer; Preview, Correction: Boolean;
  692.         const sad: TRVScreenAndDevice; RichView: TRVScroller; dli: TRVDrawLineInfo;
  693.         Part: Integer; ColorMode: TRVColorMode; RVData: TPersistent); override;
  694.       function AsText(LineWidth: Integer;
  695.                            RVData: TPersistent;
  696.                            const Text, Path: String;
  697.                            TextOnly,Unicode: Boolean): String; override;
  698.       {$IFNDEF RVDONOTUSEHTML}
  699.       procedure SaveToHTML(Stream: TStream; RVData: TPersistent;
  700.                            ItemNo: Integer;
  701.                            const Text, Path: String;
  702.                            const imgSavePrefix: String;
  703.                            var imgSaveNo: Integer;
  704.                            CurrentFileColor: TColor;
  705.                            SaveOptions: TRVSaveOptions;
  706.                            UseCSS: Boolean;
  707.                            Bullets: TRVList); override;
  708.       {$ENDIF}
  709.       function ReadRVFHeader(var P: PChar; RVData: TPersistent): Boolean; override;
  710.       procedure SaveRVF(Stream: TStream; RVData: TPersistent; ItemNo, ParaNo: Integer;
  711.                         const Name: String; Part: TRVMultiDrawItemPart;
  712.                         ForceSameAsPrev: Boolean); override;
  713.       procedure SaveRTF(Stream: TStream; const Path: String;
  714.         RVData: TPersistent; ItemNo: Integer;
  715.         const Name: String; TwipsPerPixel: Double; Level: Integer; ColorList: TRVColorList;
  716.         StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  717.         FontTable: TRVList); override;
  718.       procedure FillRTFTables(ColorList: TRVColorList; ListOverrideCountList: TRVIntegerList;
  719.         RVData: TPersistent); override;
  720.       function GetBoolValue(Prop: TRVItemBoolProperty): Boolean; override;
  721.       function GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean;override;
  722.   end;
  723.   function RV_DuplicateItem(Source: TCustomRVItemInfo;
  724.     RVData: TPersistent; DuplicateCheckpoint: Boolean): TCustomRVItemInfo;
  725.   procedure RegisterRichViewItemClass(StyleNo: Integer; ItemClass: TCustomRVItemInfoClass);
  726.   function CreateRichViewItem(StyleNo: Integer; RVData: TPersistent): TCustomRVItemInfo;
  727.   function RVFGetItemOptions(ItemOptions: TRVItemOptions; ForceSameAsPrev: Boolean): TRVItemOptions;
  728.   procedure RVSaveImageToRTF(Stream: TStream; TwipsPerPixel: Double;
  729.     Image: TGraphic; ImageWidth, ImageHeight: Integer; Options: TRVRTFOptions);
  730.   procedure RVSaveImageListImageToRTF(Stream: TStream;
  731.     TwipsPerPixel: Double; ImageList: TCustomImageList; ImageIndex: Integer;
  732.     RTFOptions: TRVRTFOptions);
  733.   {$IFNDEF RVDONOTUSEHTML}
  734.   procedure RVSaveImageSharedImageInHTML(ImageList: TCustomImageList;
  735.     ImageIndex: Integer; Graphic: TGraphic; var Location: String;
  736.     RVData: TPersistent; const Path,
  737.     imgSavePrefix: String; var imgSaveNo: Integer; CurrentFileColor: TColor;
  738.     SaveOptions: TRVSaveOptions;
  739.     Bullets: TRVList);
  740.   function RV_GetExtraIMGStr(SaveOptions: TRVSaveOptions; Width, Height: Integer;
  741.     NoHTMLImageSize: Boolean): String;
  742.   {$ENDIF}
  743. var
  744.   RichViewTextItemClass: TRVTextItemInfoClass;
  745. const
  746.   RVItemOptionsMask = $0F;
  747. procedure WriteRVFExtraIntPropertyStr(Stream: TStream; Prop: TRVExtraItemProperty;
  748.   Value: Integer);
  749. procedure WriteRVFExtraStrPropertyStr(Stream: TStream; Prop: TRVExtraItemStrProperty;
  750.   const Value: String);
  751. implementation
  752. uses RVFMisc,RichView, PtblRV, PtRVData, CRVData, CRVFData, RVUni, RVStr, CtrlImg,
  753.      RVAnimate
  754.      {$IFNDEF RVDONOTUSELISTS}
  755.      , RVMarker
  756.      {$ENDIF}
  757.      ;
  758. procedure RichView_InitializeList; forward;
  759. {============================= TRVDeleteUnusedStylesData ======================}
  760. constructor TRVDeleteUnusedStylesData.Create(ATextStyles, AParaStyles,
  761.   AListStyles: Boolean);
  762. begin
  763.   inherited Create;
  764.   FTextStyles := ATextStyles;
  765.   FParaStyles := AParaStyles;
  766.   FListStyles := AListStyles;
  767. end;
  768. {------------------------------------------------------------------------------}
  769. destructor TRVDeleteUnusedStylesData.Destroy;
  770. begin
  771.   FUsedTextStyles.Free;
  772.   FUsedParaStyles.Free;
  773.   FUsedListStyles.Free;
  774.   inherited;
  775. end;
  776. {------------------------------------------------------------------------------}
  777. procedure TRVDeleteUnusedStylesData.Init(RVStyle: TRVStyle);
  778.     {............................................}
  779.     procedure MarkStandardStyles(Styles: TCustomRVInfos; Used: TRVIntegerList);
  780.     var i: Integer;
  781.     begin
  782.       for i := 0 to Used.Count-1 do
  783.         if TCustomRVInfo(Styles.Items[i]).Standard then
  784.           Used[i] := 1;
  785.     end;
  786.     {............................................}
  787. begin
  788.   if FInitialized then
  789.     exit;
  790.   FUsedTextStyles := TRVIntegerList.CreateEx(RVStyle.TextStyles.Count, ord(not FTextStyles));
  791.   FUsedParaStyles := TRVIntegerList.CreateEx(RVStyle.ParaStyles.Count, ord(not FParaStyles));
  792.   FUsedListStyles := TRVIntegerList.CreateEx(RVStyle.ListStyles.Count, ord(not FListStyles));
  793.   {$IFNDEF RVDONOTUSEUNICODE}
  794.   if FTextStyles and (RVStyle.DefUnicodeStyle>=0) then
  795.     if RVStyle.DefUnicodeStyle>=FUsedTextStyles.Count then
  796.       RVStyle.DefUnicodeStyle := -1
  797.     else
  798.       FUsedTextStyles[RVStyle.DefUnicodeStyle] := 1;
  799.   {$ENDIF}
  800.   if FTextStyles then
  801.     MarkStandardStyles(RVStyle.TextStyles, FUsedTextStyles);
  802.   if FParaStyles then
  803.     MarkStandardStyles(RVStyle.ParaStyles, FUsedParaStyles);
  804.   if FListStyles then
  805.     MarkStandardStyles(RVStyle.ListStyles, FUsedListStyles);
  806.   FInitialized := True;
  807. end;
  808. {------------------------------------------------------------------------------}
  809. procedure TRVDeleteUnusedStylesData.ConvertFlagsToShifts(RVStyle: TRVStyle);
  810.     {............................................}
  811.     procedure UpdStyles(Styles: TCustomRVInfos; Used: TRVIntegerList);
  812.     var i,idx,val: Integer;
  813.         IsTextStyle, IsParaStyle: Boolean;
  814.     begin
  815.       IsTextStyle := Styles is TFontInfos;
  816.       IsParaStyle := Styles is TParaInfos;
  817.       idx := 1;
  818.       for i := 0 to Used.Count-1 do
  819.         if Used[i]=0 then
  820.           inc(idx)
  821.         else
  822.           Used[i] := idx;
  823.       for i := Used.Count-1 downto 0 do
  824.         if Used[i]=0 then
  825.           Styles.Items[i].Free;
  826.       for i := 0 to Styles.Count-1 do begin
  827.         val := TCustomRVInfo(Styles.Items[i]).BaseStyleNo;
  828.         if val>=0 then
  829.           if val>=Used.Count then
  830.             TCustomRVInfo(Styles.Items[i]).BaseStyleNo := -1
  831.           else
  832.             TCustomRVInfo(Styles.Items[i]).BaseStyleNo := val-Used[val]+1;
  833.         if IsTextStyle then begin
  834.           val := TFontInfo(Styles.Items[i]).NextStyleNo;
  835.           if val>=0 then
  836.             if val>=Used.Count then
  837.               TFontInfo(Styles.Items[i]).NextStyleNo := -1
  838.             else
  839.               TFontInfo(Styles.Items[i]).NextStyleNo := val-Used[val]+1;
  840.           end
  841.         else if IsParaStyle then begin
  842.           val := TParaInfo(Styles.Items[i]).NextParaNo;
  843.           if val>=0 then
  844.             if val>=Used.Count then
  845.               TParaInfo(Styles.Items[i]).NextParaNo := -1
  846.             else
  847.               TParaInfo(Styles.Items[i]).NextParaNo := val-Used[val]+1;
  848.         end;
  849.       end;
  850.     end;
  851.     {............................................}
  852. begin
  853.   if FConvertedToShifts then
  854.     exit;
  855.   if FTextStyles then
  856.     UpdStyles(RVStyle.TextStyles, FUsedTextStyles);
  857.   if FParaStyles then
  858.     UpdStyles(RVStyle.ParaStyles, FUsedParaStyles);
  859.   if FListStyles then
  860.     UpdStyles(RVStyle.ListStyles, FUsedListStyles);
  861.   FConvertedToShifts := True;
  862. end;
  863. {============================= TRVCPInfo ======================================}
  864. procedure TRVCPInfo.Assign(Source: TRVCPInfo; TagsArePChars: Boolean);
  865. begin
  866.   Name       := Source.Name;
  867.   RaiseEvent := Source.RaiseEvent;
  868.   Tag        := RV_CopyTag(Source.Tag, TagsArePChars);
  869.   Persistent := Source.Persistent;
  870.   //DrawItemNo, Next, Prev, ItemInfo are not copied
  871. end;
  872. {------------------------------------------------------------------------------}
  873. function TRVCPInfo.CreateCopy(TagsArePChars: Boolean): TRVCPInfo;
  874. begin
  875.   Result := TRVCPInfo.Create;
  876.   Result.Assign(Self,TagsArePChars);
  877. end;
  878. {========================= TRVImagePrintPart ==================================}
  879. type
  880.   TRVImagePrintPart = class (TRVMultiDrawItemPart)
  881.     public
  882.       ImgTop, ImgHeight: Integer;
  883.       function GetSoftPageBreakInfo: Integer; override;
  884.   end;
  885. function TRVImagePrintPart.GetSoftPageBreakInfo: Integer;
  886. begin
  887.   Result := ImgTop;
  888. end;
  889. {========================= TRVMultiImagePrintInfo =============================}
  890. type
  891.   TRVMultiImagePrintInfo = class (TRVMultiDrawItemInfo)
  892.     private
  893.       sad: TRVScreenAndDevice;
  894.       FItem: TRVRectItemInfo;
  895.     public
  896.       constructor Create(AItem: TRVRectItemInfo);
  897.       procedure SetSize(AWidth, AHeight: Integer); override;
  898.       function InitSplit: Boolean; override;
  899.       function CanSplitFirst(Y: Integer): Boolean; override;
  900.       function SplitAt(Y: Integer): Boolean; override;
  901.   end;
  902. {------------------------------------------------------------------------------}
  903. constructor TRVMultiImagePrintInfo.Create(AItem: TRVRectItemInfo);
  904. begin
  905.   inherited Create;
  906.   FItem := AItem;
  907. end;
  908. {------------------------------------------------------------------------------}
  909. function TRVMultiImagePrintInfo.CanSplitFirst(Y: Integer): Boolean;
  910. begin
  911.   Y := MulDiv(Y, sad.ppiyScreen, sad.ppiyDevice);
  912.   Result :=
  913.     (Y>0) and
  914.     FItem.GetBoolValueEx(rvbpPrintToBMP, nil) and
  915.     (FItem.FMinHeightOnPage>0) and
  916.     (Y>=FItem.FMinHeightOnPage) and
  917.     ((FItem.GetImageHeight(nil)-Y >= FItem.FMinHeightOnPage) or
  918.      (Y>FItem.GetImageHeight(nil)));
  919. end;
  920. {------------------------------------------------------------------------------}
  921. function TRVMultiImagePrintInfo.InitSplit: Boolean;
  922. var part: TRVImagePrintPart;
  923. begin
  924.   Result := FItem.FMinHeightOnPage<>0;
  925.   if not Result then
  926.     exit;
  927.   part := TRVImagePrintPart.Create;
  928.   part.ImgTop := 0;
  929.   part.ImgHeight := FItem.GetImageHeight(nil);
  930.   part.Height := MulDiv(part.ImgHeight, sad.ppiyDevice, sad.ppiyScreen);
  931.   PartsList.Add(part);
  932. end;
  933. {------------------------------------------------------------------------------}
  934. function TRVMultiImagePrintInfo.SplitAt(Y: Integer): Boolean;
  935. var PrevHeight, NewHeight, PrevTop: Integer;
  936.     part: TRVImagePrintPart;
  937. begin
  938.   if FItem.FMinHeightOnPage<=0 then begin
  939.     Result := False;
  940.     exit;
  941.   end;
  942.   if PartsList.Count=0 then
  943.     raise ERichViewError.Create(errRVPrint);
  944.   part := TRVImagePrintPart(PartsList[PartsList.Count-1]);
  945.   if (part.ImgHeight<=FItem.FMinHeightOnPage) then begin
  946.     Result := False;
  947.     exit;
  948.   end;
  949.   PrevHeight := MulDiv(Y, sad.ppiyScreen, sad.ppiyDevice);
  950.   NewHeight := part.ImgHeight-PrevHeight;
  951.   if (NewHeight<FItem.FMinHeightOnPage) or (PrevHeight<FItem.FMinHeightOnPage) then begin
  952.     Result := False;
  953.     exit;
  954.   end;
  955.   part.ImgHeight := PrevHeight;
  956.   part.Height := MulDiv(part.ImgHeight, sad.ppiyDevice, sad.ppiyScreen);
  957.   PrevTop := part.ImgTop;
  958.   part := TRVImagePrintPart.Create;
  959.   part.ImgTop := PrevTop+PrevHeight;
  960.   part.ImgHeight := NewHeight;
  961.   part.Height := MulDiv(part.ImgHeight, sad.ppiyDevice, sad.ppiyScreen);
  962.   PartsList.Add(part);
  963.   Result := True;
  964. end;
  965. {------------------------------------------------------------------------------}
  966. procedure TRVMultiImagePrintInfo.SetSize(AWidth, AHeight: Integer);
  967. begin
  968.   // do nothing
  969. end;
  970. {==============================================================================}
  971. type
  972.   TRichViewItemTypeInfo = class
  973.     public
  974.       StyleNo: Integer;
  975.       ItemClass: TCustomRVItemInfoClass;
  976.   end;
  977. const RichViewItemClassesList: TList = nil;
  978. {------------------------------------------------------------------------------}
  979. const RVFExtraItemIntPropNames: array [TRVExtraItemProperty] of String =
  980.   ('', 'vshift', 'vshiftabs', 'width', 'height', 'transparent', 'tmode',
  981.    'tcolor', 'minheightonpage', 'spacing', 'resizable', 'unremovable',
  982.    'nohtmlsize', 'ainterval', 'visible');
  983. const RVFExtraItemStrPropNames: array [TRVExtraItemStrProperty] of String =
  984.   ('', 'hint', 'alt', 'filename');
  985. function GetRVFExtraIntPropertyByName(const PropName: String):TRVExtraItemProperty;
  986. var i: TRVExtraItemProperty;
  987. begin
  988.   Result := rvepUnknown;
  989.   for i := Low(TRVExtraItemProperty) to High(TRVExtraItemProperty) do
  990.     if RVFExtraItemIntPropNames[i]=PropName then begin
  991.       Result := i;
  992.       exit;
  993.     end;
  994. end;
  995. {------------------------------------------------------------------------------}
  996. function GetRVFExtraStrPropertyByName(const PropName: String):TRVExtraItemStrProperty;
  997. var i: TRVExtraItemStrProperty;
  998. begin
  999.   Result := rvespUnknown;
  1000.   for i := Low(TRVExtraItemStrProperty) to High(TRVExtraItemStrProperty) do
  1001.     if RVFExtraItemStrPropNames[i]=PropName then begin
  1002.       Result := i;
  1003.       exit;
  1004.     end;
  1005. end;
  1006. {------------------------------------------------------------------------------}
  1007. procedure WriteRVFExtraIntPropertyStr(Stream: TStream; Prop: TRVExtraItemProperty;
  1008.   Value: Integer);
  1009. begin
  1010.   RVFWriteLine(Stream, Format('%s=%d', [RVFExtraItemIntPropNames[Prop], Value]));
  1011. end;
  1012. {------------------------------------------------------------------------------}
  1013. procedure WriteRVFExtraStrPropertyStr(Stream: TStream; Prop: TRVExtraItemStrProperty;
  1014.   const Value: String);
  1015. begin
  1016.   RVFWriteLine(Stream, Format('%s=%s', [RVFExtraItemStrPropNames[Prop], Value]));
  1017. end;
  1018. {------------------------------------------------------------------------------}
  1019. procedure RegisterRichViewItemClass(StyleNo: Integer; ItemClass: TCustomRVItemInfoClass);
  1020. var i: Integer;
  1021.     item: TRichViewItemTypeInfo;
  1022. begin
  1023.   if RichViewItemClassesList=nil then
  1024.     RichView_InitializeList;
  1025.   if StyleNo>=-9 then
  1026.     raise ERichViewError.Create(errRVItemReg2);
  1027.   for i := 0 to RichViewItemClassesList.Count-1 do
  1028.     if TRichViewItemTypeInfo(RichViewItemClassesList[i]).StyleNo=StyleNo then begin
  1029.       if TRichViewItemTypeInfo(RichViewItemClassesList[i]).ItemClass=ItemClass then
  1030.         exit;
  1031.       raise ERichViewError.Create(errRVItemReg2);
  1032.     end;
  1033.   item := TRichViewItemTypeInfo.Create;
  1034.   item.StyleNo := StyleNo;
  1035.   item.ItemClass := ItemClass;
  1036.   RichViewItemClassesList.Add(item);
  1037. end;
  1038. {------------------------------------------------------------------------------}
  1039. function CreateRichViewItem(StyleNo: Integer; RVData: TPersistent): TCustomRVItemInfo;
  1040. var i: Integer;
  1041. begin
  1042.   if StyleNo>=0 then begin
  1043.     Result := RichViewTextItemClass.Create(RVData);
  1044.     Result.StyleNo := StyleNo;
  1045.     exit;
  1046.   end;
  1047.   Result := nil;
  1048.   case StyleNo of
  1049.     rvsBullet:
  1050.       Result := TRVBulletItemInfo.Create(RVData);
  1051.     rvsHotspot:
  1052.       Result := TRVHotspotItemInfo.Create(RVData);
  1053.     rvsPicture:
  1054.       Result := TRVGraphicItemInfo.Create(RVData);
  1055.     rvsComponent:
  1056.       Result := TRVControlItemInfo.Create(RVData);
  1057.     rvsBreak:
  1058.       Result := TRVBreakItemInfo.Create(RVData);
  1059.     rvsHotPicture:
  1060.       Result := TRVHotGraphicItemInfo.Create(RVData);
  1061.     {$IFNDEF RVDONOTUSELISTS}
  1062.     rvsListMarker:
  1063.       Result := TRVMarkerItemInfo.Create(RVData);
  1064.     {$ENDIF}
  1065.     rvsTab:
  1066.       Result := TRVTabItemInfo.Create(RVData);
  1067.   end;
  1068.   if Result<>nil then begin
  1069.     Result.StyleNo := StyleNo;
  1070.     exit;
  1071.   end;
  1072.   for i := 0 to RichViewItemClassesList.Count-1 do
  1073.     if TRichViewItemTypeInfo(RichViewItemClassesList[i]).StyleNo=StyleNo then begin
  1074.       Result := TRichViewItemTypeInfo(RichViewItemClassesList[i]).ItemClass.Create(RVData);
  1075.       Result.StyleNo := StyleNo;
  1076.       exit;
  1077.     end;
  1078.   Result := nil;
  1079. end;
  1080. {------------------------------------------------------------------------------}
  1081. procedure RichView_InitializeList;
  1082. begin
  1083.   if RichViewItemClassesList=nil then
  1084.     RichViewItemClassesList := TList.Create;
  1085. end;
  1086. {------------------------------------------------------------------------------}
  1087. procedure RichView_FinalizeList;
  1088. var i: Integer;
  1089. begin
  1090.   for i := 0 to RichViewItemClassesList.Count-1 do
  1091.     TRichViewItemTypeInfo(RichViewItemClassesList.Items[i]).Free;
  1092.   RichViewItemClassesList.Free;
  1093. end;
  1094. {==============================================================================}
  1095. function RV_DuplicateItem(Source: TCustomRVItemInfo; RVData: TPersistent;
  1096.   DuplicateCheckpoint: Boolean): TCustomRVItemInfo;
  1097. var TagsArePChars: Boolean;
  1098. begin
  1099.   TagsArePChars := rvoTagsArePChars in TCustomRVData(RVData).Options;
  1100.   Result := TCustomRVItemInfoClass(Source.ClassType).Create(RVData);
  1101.   Result.StyleNo := Source.StyleNo;
  1102.   Result.Assign(Source);
  1103.   if DuplicateCheckpoint and (Source.Checkpoint<>nil) then begin
  1104.     Result.Checkpoint := TRVCPInfo.Create;
  1105.     Result.Checkpoint.Assign(Source.Checkpoint, TagsArePChars);
  1106.   end;
  1107.   Result.Tag  := RV_CopyTag(Source.Tag, TagsArePChars)
  1108. end;
  1109. {------------------------------------------------------------------------------}
  1110. {$IFNDEF RVDONOTUSEHTML}
  1111. function GetHTMLImageAlign(Align: TRVVAlign; SaveOptions: TRVSaveOptions; CSSVersion: Boolean): String;
  1112. begin
  1113.   case Align of
  1114.     rvvaMiddle:
  1115.       if CSSVersion and (rvsoXHTML in SaveOptions) then
  1116.         Result := ' align="middle"'
  1117.       else
  1118.         Result := ' align=middle';
  1119.     else
  1120.       Result := '';
  1121.   end;
  1122. end;
  1123. {$ENDIF}
  1124. {======================= TCustomRVItemInfo ====================================}
  1125. constructor TCustomRVItemInfo.Create;
  1126. begin
  1127.   inherited Create;
  1128.   DrawItemNo := -1;
  1129. end;
  1130. {------------------------------------------------------------------------------}
  1131. {$IFNDEF RVDONOTUSELIVESPELL}
  1132. destructor TCustomRVItemInfo.Destroy;
  1133. begin
  1134.   WordPaintList.Free;
  1135.   inherited Destroy;
  1136. end;
  1137. {------------------------------------------------------------------------------}
  1138. procedure TCustomRVItemInfo.ClearLiveSpellingResult;
  1139. var i: Integer;
  1140. begin
  1141.   Exclude(ItemState, rvisSpellChecked);
  1142.   if WordPaintList<>nil then begin
  1143.     for i := WordPaintList.Count-1 downto 0 do
  1144.       if WordPaintList[i] is TRVWordMisspellPainter then
  1145.         WordPaintList.Delete(i);
  1146.     if WordPaintList.Count=0 then begin
  1147.       WordPaintList.Free;
  1148.       WordPaintList := nil;
  1149.     end;
  1150.   end;
  1151. end;
  1152. {------------------------------------------------------------------------------}
  1153. procedure TCustomRVItemInfo.ClearWordPainters(Index: Integer);
  1154. var i: Integer;
  1155. begin
  1156.   Exclude(ItemState, rvisSpellChecked);
  1157.   if WordPaintList<>nil then begin
  1158.     if Index<=1 then begin
  1159.       WordPaintList.Free;
  1160.       WordPaintList := nil;
  1161.       end
  1162.     else begin
  1163.       for i := WordPaintList.Count-1 downto 0 do
  1164.         if WordPaintList[i].StartOffs+WordPaintList[i].Length>Index then
  1165.           WordPaintList.Delete(i);
  1166.       if WordPaintList.Count=0 then begin
  1167.         WordPaintList.Free;
  1168.         WordPaintList := nil;
  1169.       end;
  1170.     end;
  1171.   end;
  1172. end;
  1173. {------------------------------------------------------------------------------}
  1174. function TCustomRVItemInfo.AdjustWordPaintersOnInsert(Index: Integer; ch: Char;
  1175.   RVData: TPersistent): Boolean;
  1176. var i, d: Integer;
  1177. begin
  1178.   Result := TCustomRVData(RVData).IsDelimiterA(ch);
  1179.   if Result then
  1180.     d := 0
  1181.   else
  1182.     d := 1;
  1183.   if WordPaintList<>nil then begin
  1184.     for i := WordPaintList.Count-1 downto 0 do
  1185.       if WordPaintList[i].StartOffs+WordPaintList[i].Length+d>Index then
  1186.         if WordPaintList[i].StartOffs<Index+d then begin
  1187.           WordPaintList.Delete(i);
  1188.           Result := True;
  1189.           end
  1190.         else
  1191.           inc(WordPaintList[i].StartOffs);
  1192.     if WordPaintList.Count=0 then begin
  1193.       WordPaintList.Free;
  1194.       WordPaintList := nil;
  1195.     end;
  1196.   end;
  1197. end;
  1198. {------------------------------------------------------------------------------}
  1199. function TCustomRVItemInfo.AdjustWordPaintersOnDelete(Index, Count: Integer): Boolean;
  1200. var i: Integer;
  1201. begin
  1202.   Result := False;
  1203.   if WordPaintList<>nil then begin
  1204.     for i := WordPaintList.Count-1 downto 0 do
  1205.       if WordPaintList[i].StartOffs+WordPaintList[i].Length+1>Index+Count-1 then
  1206.         if WordPaintList[i].StartOffs<=Index+1 then begin
  1207.           WordPaintList.Delete(i);
  1208.           Result := True;
  1209.           end
  1210.         else
  1211.           dec(WordPaintList[i].StartOffs, Count);
  1212.     if WordPaintList.Count=0 then begin
  1213.       WordPaintList.Free;
  1214.       WordPaintList := nil;
  1215.     end;
  1216.   end;
  1217. end;
  1218. {------------------------------------------------------------------------------}
  1219. function TCustomRVItemInfo.GetMisspelling(Offs: Integer;
  1220.   var MisOffs, MisLength: Integer): Boolean;
  1221. var i: Integer;
  1222. begin
  1223.   Result := False;
  1224.   if WordPaintList<>nil then begin
  1225.     for i := WordPaintList.Count-1 downto 0 do
  1226.       if (WordPaintList[i].StartOffs+WordPaintList[i].Length+1>Offs) and
  1227.          (WordPaintList[i].StartOffs<=Offs) then begin
  1228.         Result := True;
  1229.         MisOffs := WordPaintList[i].StartOffs;
  1230.         MisLength := WordPaintList[i].Length;
  1231.         exit;
  1232.       end;
  1233.   end;
  1234. end;
  1235. {------------------------------------------------------------------------------}
  1236. function TCustomRVItemInfo.IsMisspelled(Index: Integer): Boolean;
  1237. var i: Integer;
  1238. begin
  1239.   Result := False;
  1240.   if WordPaintList<>nil then
  1241.     for i := 0 to WordPaintList.Count-1 do begin
  1242.       Result := (WordPaintList[i].StartOffs<=Index) and
  1243.         (WordPaintList[i].StartOffs+WordPaintList[i].Length>Index);
  1244.       if Result then
  1245.         exit;
  1246.     end;
  1247. end;
  1248. {------------------------------------------------------------------------------}
  1249. function TCustomRVItemInfo.ValidateMisspelledWord(const AItemText, AWord: String): Boolean;
  1250. var i: Integer;
  1251.     painter: TRVWordPainter;
  1252. begin
  1253.   Result := False;
  1254.   if WordPaintList<>nil then begin
  1255.     for i := WordPaintList.Count-1 downto 0 do begin
  1256.       painter := WordPaintList[i];
  1257.       if (painter is TRVWordMisspellPainter) and
  1258.          (Copy(AItemText, painter.StartOffs, painter.Length)=AWord) then begin
  1259.         WordPaintList.Delete(i);
  1260.         Result := True;
  1261.       end;
  1262.     end;
  1263.     if WordPaintList.Count=0 then begin
  1264.       WordPaintList.Free;
  1265.       WordPaintList := nil;
  1266.     end;
  1267.   end;
  1268. end;
  1269. {------------------------------------------------------------------------------}
  1270. procedure TCustomRVItemInfo.AddMisspelling(StartOffs, Length: Integer);
  1271. var painter: TRVWordMisspellPainter;
  1272. begin
  1273.   painter := TRVWordMisspellPainter.Create(StartOffs, Length);
  1274.   if WordPaintList=nil then
  1275.     WordPaintList := TRVWordPainterList.Create;
  1276.   WordPaintList.Add(painter)
  1277. end;
  1278. {$ENDIF}
  1279. {------------------------------------------------------------------------------}
  1280. procedure TCustomRVItemInfo.Assign(Source: TCustomRVItemInfo);
  1281. begin
  1282.   StyleNo := Source.StyleNo;
  1283.   ParaNo  := Source.ParaNo;
  1284.   ItemOptions := Source.ItemOptions;
  1285.   {$IFNDEF RVDONOTUSEITEMHINTS}
  1286.   Hint    := Source.Hint;
  1287.   {$ENDIF}
  1288.   // Checkpoint, JumpID and Tag are not assigned
  1289. end;
  1290. {------------------------------------------------------------------------------}
  1291. procedure TCustomRVItemInfo.TransferProperties(Source: TCustomRVItemInfo;
  1292.   RVData: TPersistent);
  1293. begin
  1294. end;
  1295. {------------------------------------------------------------------------------}
  1296. function TCustomRVItemInfo.ReadRVFHeader(var P: PChar;
  1297.                                          RVData: TPersistent): Boolean;
  1298. begin
  1299.   Result := True;
  1300. end;
  1301. {------------------------------------------------------------------------------}
  1302. function TCustomRVItemInfo.GetSameAsPrev: Boolean;
  1303. begin
  1304.   Result := (rvioSameAsPrev in ItemOptions);
  1305. end;
  1306. {------------------------------------------------------------------------------}
  1307. procedure TCustomRVItemInfo.SetSameAsPrev(const Value: Boolean);
  1308. begin
  1309.   if Value then begin
  1310.     Exclude(ItemOptions, rvioPageBreakBefore);
  1311.     Exclude(ItemOptions, rvioBR);
  1312.     Include(ItemOptions , rvioSameAsPrev);
  1313.     end
  1314.   else
  1315.     Exclude(ItemOptions, rvioSameAsPrev);
  1316. end;
  1317. {------------------------------------------------------------------------------}
  1318. procedure TCustomRVItemInfo.SetBR(Value: Boolean);
  1319. begin
  1320.   if GetBoolValue(rvbpFullWidth) then
  1321.     Value := False;
  1322.   if Value then begin
  1323.     Exclude(ItemOptions, rvioSameAsPrev);
  1324.     Include(ItemOptions, rvioBR);
  1325.     end
  1326.   else
  1327.     Exclude(ItemOptions, rvioBR);
  1328. end;
  1329. {------------------------------------------------------------------------------}
  1330. function TCustomRVItemInfo.GetBR: Boolean;
  1331. begin
  1332.   Result := (rvioBR in ItemOptions);
  1333. end;
  1334. {------------------------------------------------------------------------------}
  1335. function TCustomRVItemInfo.GetPageBreakBefore: Boolean;
  1336. begin
  1337.   Result := (rvioPageBreakBefore in ItemOptions);
  1338. end;
  1339. {------------------------------------------------------------------------------}
  1340. procedure TCustomRVItemInfo.SetPageBreakBefore(const Value: Boolean);
  1341. begin
  1342.   if Value then begin
  1343.     Exclude(ItemOptions, rvioSameAsPrev);
  1344.     Exclude(ItemOptions, rvioBR);
  1345.     Include(ItemOptions, rvioPageBreakBefore);
  1346.     end
  1347.   else
  1348.     Exclude(ItemOptions, rvioPageBreakBefore);
  1349. end;
  1350. {------------------------------------------------------------------------------}
  1351. function TCustomRVItemInfo.CanBeBorderStart: Boolean;
  1352. begin
  1353.   Result := not (rvioSameAsPrev in ItemOptions) and
  1354.             not (rvioBR in ItemOptions)
  1355. end;
  1356. {------------------------------------------------------------------------------}
  1357. function TCustomRVItemInfo.ParaStart(CountBR: Boolean): Boolean;
  1358. begin
  1359.   Result := not (rvioSameAsPrev in ItemOptions) and
  1360.             (CountBR or not (rvioBR in ItemOptions));
  1361. end;
  1362. {------------------------------------------------------------------------------}
  1363. procedure TCustomRVItemInfo.UpdatePaletteInfo(PaletteAction: TRVPaletteAction;
  1364.   ForceRecreateCopy: Boolean; Palette: HPALETTE; LogPalette: PLogPalette);
  1365. begin
  1366.   // nothing to do here
  1367. end;
  1368. {------------------------------------------------------------------------------}
  1369. function TCustomRVItemInfo.AsImage: TGraphic;
  1370. begin
  1371.   Result := nil;
  1372. end;
  1373. {------------------------------------------------------------------------------}
  1374. {$IFNDEF RVDONOTUSEHTML}
  1375. procedure TCustomRVItemInfo.SaveToHTML(Stream: TStream; RVData: TPersistent;
  1376.   ItemNo: Integer; const Text, Path: String; const imgSavePrefix: String;
  1377.   var imgSaveNo: Integer; CurrentFileColor: TColor;
  1378.   SaveOptions: TRVSaveOptions; UseCSS: Boolean; Bullets: TRVList);
  1379. begin
  1380.   // nothing to do here
  1381. end;
  1382. {$ENDIF}
  1383. {------------------------------------------------------------------------------}
  1384. function TCustomRVItemInfo.AsText(LineWidth: Integer; RVData: TPersistent;
  1385.   const Text, Path: String; TextOnly,Unicode: Boolean): String;
  1386. begin
  1387.   Result := '';
  1388. end;
  1389. {------------------------------------------------------------------------------}
  1390. function TCustomRVItemInfo.OwnsControl(AControl: TControl): Boolean;
  1391. begin
  1392.   Result := False;
  1393. end;
  1394. {------------------------------------------------------------------------------}
  1395. function TCustomRVItemInfo.GetSubRVDataAt(X,Y: Integer): TPersistent;
  1396. begin
  1397.   Result := nil;
  1398. end;
  1399. {------------------------------------------------------------------------------}
  1400. function TCustomRVItemInfo.OwnsInplaceEditor(AEditor: TControl): Boolean;
  1401. begin
  1402.    Result := False;
  1403. end;
  1404. {------------------------------------------------------------------------------}
  1405. function TCustomRVItemInfo.ReadRVFLine(const s: String; RVData: TPersistent;
  1406.   ReadType, LineNo, LineCount: Integer; var Name: String;
  1407.   var ReadMode: TRVFReadMode; var ReadState: TRVFReadState): Boolean;
  1408. begin
  1409.   Result := True;
  1410.   SetExtraPropertyFromRVFStr(s);
  1411. end;
  1412. {------------------------------------------------------------------------------}
  1413. function TCustomRVItemInfo.SaveRVFHeaderTail(RVData: TPersistent): String;
  1414. begin
  1415.   // nothing to do here
  1416.   Result := '';
  1417. end;
  1418. {------------------------------------------------------------------------------}
  1419. function TCustomRVItemInfo.GetRVFExtraPropertyCount: Integer;
  1420. begin
  1421.   Result := 0;
  1422.   {$IFNDEF RVDONOTUSEITEMHINTS}
  1423.   if Hint<>'' then
  1424.     inc(Result);
  1425.   {$ENDIF}
  1426. end;
  1427. {------------------------------------------------------------------------------}
  1428. procedure TCustomRVItemInfo.SaveRVFExtraProperties(Stream: TStream);
  1429. begin
  1430.   {$IFNDEF RVDONOTUSEITEMHINTS}
  1431.   if Hint<>'' then
  1432.     WriteRVFExtraStrPropertyStr(Stream, rvespHint, Hint);
  1433.   {$ENDIF}
  1434. end;
  1435. {------------------------------------------------------------------------------}
  1436. procedure TCustomRVItemInfo.SetExtraPropertyFromRVFStr(const Str: String);
  1437. var PropName, PropValStr: String;
  1438.     PropVal: Integer;
  1439.     IntProp: TRVExtraItemProperty;
  1440.     StrProp: TRVExtraItemStrProperty;
  1441.     p: Integer;
  1442. begin
  1443.   p := Pos('=', Str);
  1444.   if p=0 then
  1445.     exit;
  1446.   PropName := Copy(Str,1,p-1);
  1447.   PropValStr := Copy(Str,p+1, Length(Str));
  1448.   IntProp := GetRVFExtraIntPropertyByName(PropName);
  1449.   if IntProp<>rvepUnknown then begin
  1450.     PropVal  := StrToIntDef(PropValStr,0);
  1451.     SetExtraIntProperty(IntProp, PropVal);
  1452.     end
  1453.   else begin
  1454.     StrProp := GetRVFExtraStrPropertyByName(PropName);
  1455.     if StrProp<>rvespUnknown then begin
  1456.       SetExtraStrProperty(StrProp, PropValStr);
  1457.       end
  1458.     else
  1459.       SetExtraCustomProperty(PropName,PropValStr);
  1460.   end;
  1461. end;
  1462. {------------------------------------------------------------------------------}
  1463. procedure TCustomRVItemInfo.SaveRVF(Stream: TStream; RVData: TPersistent;
  1464.   ItemNo, ParaNo: Integer; const Name: String; Part: TRVMultiDrawItemPart;
  1465.   ForceSameAsPrev: Boolean);
  1466. begin
  1467.   // nothing to do here
  1468. end;
  1469. {------------------------------------------------------------------------------}
  1470. procedure TCustomRVItemInfo.SaveRTF(Stream: TStream; const Path: String;
  1471.   RVData: TPersistent; ItemNo: Integer; const Name: String; TwipsPerPixel: Double;
  1472.   Level: Integer; ColorList: TRVColorList;
  1473.   StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
  1474.   FontTable: TRVList);
  1475. begin
  1476.   // nothing to do here
  1477. end;
  1478. {------------------------------------------------------------------------------}
  1479. procedure TCustomRVItemInfo.FillRTFTables(ColorList: TRVColorList;
  1480.   ListOverrideCountList: TRVIntegerList; RVData: TPersistent);
  1481. begin
  1482.   // nothing to do here
  1483. end;
  1484. {------------------------------------------------------------------------------}
  1485. function TCustomRVItemInfo.PrintToBitmap(Bkgnd: TBitmap; Preview: Boolean;
  1486.   RichView: TRVScroller; dli: TRVDrawLineInfo; Part: Integer;
  1487.   ColorMode: TRVColorMode):Boolean;
  1488. begin
  1489.   // nothing was printed
  1490.   Result := False;
  1491. end;
  1492. {------------------------------------------------------------------------------}
  1493. procedure TCustomRVItemInfo.Print(Canvas: TCanvas; x, y, x2: Integer;
  1494.   Preview, Correction: Boolean; const sad: TRVScreenAndDevice;
  1495.   RichView: TRVScroller; dli: TRVDrawLineInfo;
  1496.   Part: Integer; ColorMode: TRVColorMode;
  1497.   RVData: TPersistent);
  1498. begin
  1499.   // nothing to do here
  1500. end;
  1501. {------------------------------------------------------------------------------}
  1502. function TCustomRVItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  1503. begin
  1504.   case Prop of
  1505.     rvbpFullWidth,rvbpDisplayActiveState,rvbpDrawingChangesFont,
  1506.     rvbpCanSaveUnicode,rvbpAlwaysInText,rvbpImmediateControlOwner,
  1507.     rvbpResizable, rvbpResizeHandlesOutside, rvbpHasSubRVData,
  1508.     rvbpClickSelect, rvbpNoHTML_P:
  1509.       Result := False;
  1510.     else
  1511.       Result := True;
  1512.   end;
  1513. end;
  1514. {------------------------------------------------------------------------------}
  1515. function TCustomRVItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx;
  1516.   RVStyle: TRVStyle): Boolean;
  1517. begin
  1518.   case Prop of
  1519.     rvbpPrintToBMP:
  1520.       Result := True;
  1521.     else
  1522.       Result := False;
  1523.   end;
  1524. end;
  1525. {------------------------------------------------------------------------------}
  1526. procedure TCustomRVItemInfo.PaintFullWidth(Left, Right, Top: Integer;
  1527.   Canvas: TCanvas; State: TRVItemDrawStates; Style: TRVStyle;
  1528.   const ClipRect: TRect; dli: TRVDrawLineInfo);
  1529. begin
  1530.   // nothing to do here
  1531. end;
  1532. {------------------------------------------------------------------------------}
  1533. procedure TCustomRVItemInfo.Paint(x, y: Integer; Canvas: TCanvas;
  1534.   State: TRVItemDrawStates; Style: TRVStyle; dli: TRVDrawLineInfo);
  1535. begin
  1536.   // nothing to do here
  1537. end;
  1538. {------------------------------------------------------------------------------}
  1539. function TCustomRVItemInfo.GetImageHeight(RVStyle: TRVStyle): Integer;
  1540. begin
  1541.   Result := 0;
  1542. end;
  1543. {------------------------------------------------------------------------------}
  1544. function TCustomRVItemInfo.GetImageWidth(RVStyle: TRVStyle): Integer;
  1545. begin
  1546.   Result := 0;
  1547. end;
  1548. {------------------------------------------------------------------------------}
  1549. function TCustomRVItemInfo.GetBorderHeight: Integer;
  1550. begin
  1551.   Result := 0;
  1552. end;
  1553. {------------------------------------------------------------------------------}
  1554. function TCustomRVItemInfo.GetBorderWidth: Integer;
  1555. begin
  1556.   Result := 0;
  1557. end;
  1558. {------------------------------------------------------------------------------}
  1559. procedure TCustomRVItemInfo.MovingToUndoList(ItemNo: Integer;
  1560.   RVData, AContainerUndoItem: TObject);
  1561. var s: String;
  1562. begin
  1563.   s := TCustomRVFormattedData(RVData).GetItemText(ItemNo);
  1564.   TCustomRVData(RVData).ItemAction(rviaMovingToUndoList, Self, s, TCustomRVData(RVData));
  1565.   {$IFNDEF RVDONOTUSELIVESPELL}
  1566.   ClearWordPainters(0);
  1567.   {$ENDIF}
  1568. end;
  1569. {------------------------------------------------------------------------------}
  1570. procedure TCustomRVItemInfo.MovingFromUndoList(ItemNo: Integer; RVData: TObject);
  1571. begin
  1572.   // nothing to do here
  1573. end;
  1574. {------------------------------------------------------------------------------}
  1575. procedure TCustomRVItemInfo.FinalizeUndoGroup;
  1576. begin
  1577.   // nothing to do here
  1578. end;
  1579. {------------------------------------------------------------------------------}
  1580. procedure TCustomRVItemInfo.BeforeLoading(FileFormat: TRVLoadFormat);
  1581. begin
  1582.   // nothing to do here    // currently only fo RVF and RTF
  1583. end;
  1584. {------------------------------------------------------------------------------}
  1585. procedure TCustomRVItemInfo.AfterLoading(FileFormat: TRVLoadFormat);
  1586. begin
  1587.   // nothing to do here     // currently only fo RVF and RTF
  1588. end;
  1589. {------------------------------------------------------------------------------}
  1590. function TCustomRVItemInfo.MouseMove(Shift: TShiftState; X, Y, ItemNo: Integer;
  1591.   RVData: TObject): Boolean;
  1592. var s,s2: String;
  1593.     pt: TPoint;
  1594. begin
  1595.   if rvoShowItemHints in TCustomRVData(RVData).Options then begin
  1596.     s := TCustomRVData(RVData).GetAbsoluteRootData.GetItemHint(
  1597.       TCustomRVData(RVData), ItemNo, '');
  1598.     s2 := TCustomRVData(RVData).GetAbsoluteRootData.GetParentControl.Hint;
  1599.     TCustomRVData(RVData).GetAbsoluteRootData.GetParentControl.Hint := s;
  1600.     if s='' then
  1601.       Application.CancelHint
  1602.     else if s<>s2 then begin
  1603.       GetCursorPos(pt);
  1604.       {$IFDEF RICHVIEWDEF5}
  1605.       Application.ActivateHint(pt);
  1606.       {$ENDIF}
  1607.     end;
  1608.   end;
  1609.   Result := False; // default cursor;
  1610. end;
  1611. {------------------------------------------------------------------------------}
  1612. function TCustomRVItemInfo.MouseDown(Button: TMouseButton;
  1613.   Shift: TShiftState; X, Y, ItemNo: Integer; RVData: TObject): Boolean;
  1614. begin
  1615.   Result := False; // default cursor;
  1616. end;
  1617. {------------------------------------------------------------------------------}
  1618. function TCustomRVItemInfo.MouseUp(Button: TMouseButton;
  1619.   Shift: TShiftState; X, Y, ItemNo: Integer; RVData: TObject): Boolean;
  1620. begin
  1621.   Result := False; // default cursor;
  1622. end;
  1623. {------------------------------------------------------------------------------}
  1624. function TCustomRVItemInfo.GetMinWidth(sad: PRVScreenAndDevice; Canvas: TCanvas;
  1625.                                        RVData: TPersistent): Integer;
  1626. begin
  1627.   Result := 20; // min width of doc - 20 pixels
  1628.   if sad<>nil then
  1629.     Result := MulDiv(Result, sad.ppixDevice, sad.ppixScreen);  
  1630. end;
  1631. {------------------------------------------------------------------------------}
  1632. procedure TCustomRVItemInfo.DeselectPartial;
  1633. begin
  1634.   // nothing to do here
  1635. end;
  1636. {------------------------------------------------------------------------------}
  1637. procedure TCustomRVItemInfo.BuildJumps(Left,Top: Integer; var StartJumpNo: Integer;
  1638.   jumps: TList);
  1639. begin
  1640.   // nothing to do here
  1641. end;
  1642. {------------------------------------------------------------------------------}
  1643. procedure TCustomRVItemInfo.Focusing;
  1644. begin
  1645.   // nothing to do here
  1646. end;
  1647. {------------------------------------------------------------------------------}
  1648. function TCustomRVItemInfo.MoveFocus(GoForward: Boolean;
  1649.   var TopLevelRVData: TPersistent; var TopLevelItemNo: Integer): Boolean;
  1650. begin
  1651.   Result := False;
  1652. end;
  1653. {------------------------------------------------------------------------------}
  1654. procedure TCustomRVItemInfo.ClearFocus;
  1655. begin
  1656.   // nothing to do here
  1657. end;
  1658. {------------------------------------------------------------------------------}
  1659. procedure TCustomRVItemInfo.Execute(RVData: TPersistent);
  1660. begin
  1661.   // nothing to do here
  1662. end;
  1663. {------------------------------------------------------------------------------}
  1664. function TCustomRVItemInfo.AdjustFocusToControl(Control: TControl;
  1665.   var TopLevelRVData: TPersistent; var TopLevelItemNo: Integer):Boolean;
  1666. begin
  1667.   Result := False;
  1668. end;
  1669. {------------------------------------------------------------------------------}
  1670. function TCustomRVItemInfo.PartiallySelected: Boolean;
  1671. begin
  1672.   Result :=  False;
  1673. end;
  1674. {------------------------------------------------------------------------------}
  1675. function TCustomRVItemInfo.CanDeletePartiallySelected: Boolean;
  1676. begin
  1677.   Result :=  False;
  1678. end;
  1679. {------------------------------------------------------------------------------}
  1680. procedure TCustomRVItemInfo.DeletePartiallySelected;
  1681. begin
  1682.   // nothing to do here
  1683. end;
  1684. {------------------------------------------------------------------------------}
  1685. procedure TCustomRVItemInfo.ApplyStyleConversionToSubRVDatas(
  1686.   UserData: Integer; SelectedOnly: Boolean; ConvType: TRVEStyleConversionType);
  1687. begin
  1688.   // nothing to do here
  1689. end;
  1690. {------------------------------------------------------------------------------}
  1691. procedure TCustomRVItemInfo.ApplyStyleConversion(RVData: TPersistent;
  1692.   ItemNo, UserData: Integer);
  1693. begin
  1694.   // Currently, there is no difference between the implementation of
  1695.   // rvscTextStyleConversion and rvscTextStyleConversion
  1696.   ApplyStyleConversionToSubRVDatas(UserData, False, rvscTextStyleConversion);
  1697. end;
  1698. {------------------------------------------------------------------------------}
  1699. function TCustomRVItemInfo.CreatePrintingDrawItem(RVData: TObject;
  1700.   const sad: TRVScreenAndDevice): TRVDrawLineInfo;
  1701. begin
  1702.   Result := TRVDrawLineInfo.Create;
  1703. end;
  1704. {------------------------------------------------------------------------------}
  1705. procedure TCustomRVItemInfo.StartExport;
  1706. begin
  1707.   // nothing to do here
  1708. end;
  1709. {------------------------------------------------------------------------------}
  1710. procedure TCustomRVItemInfo.EndExport;
  1711. begin
  1712.   // nothing to do here
  1713. end;
  1714. {------------------------------------------------------------------------------}
  1715. procedure TCustomRVItemInfo.Inserting(RVData: TObject; var Text: String; Safe: Boolean);
  1716. begin
  1717.   if RVData<>nil then
  1718.     TCustomRVData(RVData).ItemAction(rviaInserting, Self, Text, TCustomRVData(RVData));
  1719. end;
  1720. {------------------------------------------------------------------------------}
  1721. procedure TCustomRVItemInfo.Inserted(RVData: TObject; ItemNo: Integer);
  1722. var s: String;
  1723. begin
  1724.   if RVData<>nil then begin
  1725.     {$IFNDEF RVDONOTUSEANIMATION}
  1726.     UpdateAnimator(RVData);
  1727.     {$ENDIF}  
  1728.     s := '';
  1729.     TCustomRVData(RVData).ItemAction(rviaInserted, Self, s, TCustomRVData(RVData));
  1730.   end;
  1731. end;
  1732. {------------------------------------------------------------------------------}
  1733. procedure TCustomRVItemInfo.AfterUndoChangeProperty;
  1734. begin
  1735.   // nothing to do here
  1736. end;
  1737. {------------------------------------------------------------------------------}
  1738. procedure TCustomRVItemInfo.BeforeUndoChangeProperty;
  1739. begin
  1740.   // nothing to do here
  1741. end;
  1742. {------------------------------------------------------------------------------}
  1743. function TCustomRVItemInfo.EnterItem(From: TRVEnterDirection; Coord: Integer): Boolean;
  1744. begin
  1745.   Result := False;
  1746. end;
  1747. {------------------------------------------------------------------------------}
  1748. function TCustomRVItemInfo.GetHypertextCursor(RVStyle: TRVStyle): TCursor;
  1749. begin
  1750.   Result := RVStyle.JumpCursor;
  1751. end;
  1752. {------------------------------------------------------------------------------}
  1753. procedure TCustomRVItemInfo.OnDocWidthChange(DocWidth: Integer;
  1754.   dli: TRVDrawLineInfo; Printing: Boolean; Canvas: TCanvas;
  1755.   RVData: TPersistent; sad: PRVScreenAndDevice; var HShift, Desc: Integer;
  1756.   NoCaching, Reformatting: Boolean);
  1757. begin
  1758.   HShift := 0;
  1759.   Desc := 1;
  1760. end;
  1761. {------------------------------------------------------------------------------}
  1762. procedure TCustomRVItemInfo.MarkStylesInUse(Data: TRVDeleteUnusedStylesData);
  1763. begin
  1764.   Data.UsedParaStyles[ParaNo] := 1;
  1765. end;
  1766. {------------------------------------------------------------------------------}
  1767. procedure TCustomRVItemInfo.UpdateStyles(Data: TRVDeleteUnusedStylesData);
  1768. begin
  1769.   dec(ParaNo, Data.UsedParaStyles[ParaNo]-1);
  1770. end;
  1771. {------------------------------------------------------------------------------}
  1772. function TCustomRVItemInfo.GetSubRVData(var StoreState: TRVStoreSubRVData;
  1773.                                          Position: TRVSubRVDataPos): TPersistent;
  1774. begin
  1775.   Result := nil;
  1776.   StoreState := nil;
  1777. end;
  1778. {------------------------------------------------------------------------------}
  1779. procedure TCustomRVItemInfo.ChooseSubRVData(StoreState: TRVStoreSubRVData);
  1780. begin
  1781.   // nothing to do here
  1782. end;
  1783. {------------------------------------------------------------------------------}
  1784. procedure TCustomRVItemInfo.CleanUpChosen;
  1785. begin
  1786.   // nothing to do here
  1787. end;
  1788. {------------------------------------------------------------------------------}
  1789. procedure TCustomRVItemInfo.ResetSubCoords;
  1790. begin
  1791.   // nothing to do here
  1792. end;
  1793. {------------------------------------------------------------------------------}
  1794. function TCustomRVItemInfo.SetExtraIntProperty(Prop: TRVExtraItemProperty; Value: Integer): Boolean;
  1795. begin
  1796.   Result := False;
  1797. end;
  1798. {------------------------------------------------------------------------------}
  1799. function TCustomRVItemInfo.GetExtraIntProperty(Prop: TRVExtraItemProperty; var Value: Integer): Boolean;
  1800. begin
  1801.   Result := False;
  1802. end;
  1803. {------------------------------------------------------------------------------}
  1804. function TCustomRVItemInfo.GetExtraStrProperty(Prop: TRVExtraItemStrProperty;
  1805.   var Value: String): Boolean;
  1806. begin
  1807.   Result := False;
  1808.   {$IFNDEF RVDONOTUSEITEMHINTS}
  1809.   case Prop of
  1810.     rvespHint:
  1811.       begin
  1812.         Value := Hint;
  1813.         Result := True;
  1814.       end;
  1815.   end;
  1816.   {$ENDIF}
  1817. end;
  1818. {------------------------------------------------------------------------------}
  1819. function TCustomRVItemInfo.SetExtraStrProperty(Prop: TRVExtraItemStrProperty;
  1820.   const Value: String): Boolean;
  1821. begin
  1822.   Result := False;
  1823.   {$IFNDEF RVDONOTUSEITEMHINTS}
  1824.   case Prop of
  1825.     rvespHint:
  1826.       begin
  1827.         Hint := Value;
  1828.         Result := True;
  1829.       end;
  1830.   end;
  1831.   {$ENDIF}
  1832. end;
  1833. {------------------------------------------------------------------------------}
  1834. function TCustomRVItemInfo.GetSoftPageBreakDY(Data: Integer): Integer;
  1835. begin
  1836.   Result := Data;
  1837. end;
  1838. {------------------------------------------------------------------------------}
  1839. function TCustomRVItemInfo.SetExtraCustomProperty(const PropName,
  1840.   Value: String): Boolean;
  1841. begin
  1842.   Result := False;
  1843. end;
  1844. {------------------------------------------------------------------------------}
  1845. procedure TCustomRVItemInfo.DrawBackgroundForPrinting(Canvas: TCanvas;
  1846.   const Rect, FullRect: TRect; ColorMode: TRVColorMode;
  1847.   ItemBackgroundLayer: Integer);
  1848. begin
  1849.   // This method is only for items containing subdocuments, i.e. tables.
  1850.   // Used for drawing background in bitmap
  1851.   // ItemBackgroundLayer: 0 - do not draw; -1 - draw completely; others - item specific
  1852. end;
  1853. {------------------------------------------------------------------------------}
  1854. {$IFNDEF RVDONOTUSEANIMATION}
  1855. procedure TCustomRVItemInfo.UpdateAnimator(RVData: TObject);
  1856. begin
  1857. end;
  1858. {$ENDIF}
  1859. {------------------------------------------------------------------------------}
  1860. function TCustomRVItemInfo.GetActualStyleNo(RVStyle: TRVStyle): Integer;
  1861. begin
  1862.   Result := StyleNo;
  1863.   if Result=rvsDefStyle then begin
  1864.     if RVStyle.ParaStyles[ParaNo].DefStyleNo>=0 then
  1865.       Result := RVStyle.ParaStyles[ParaNo].DefStyleNo
  1866.     else
  1867.       Result := 0;
  1868.   end;
  1869. end;
  1870. {------------------------------------------------------------------------------}
  1871. // For non-text items, can return the associated text style. It will be used
  1872. // for saving in RTF and HTML
  1873. function TCustomRVItemInfo.GetAssociatedTextStyleNo: Integer;
  1874. begin
  1875.   Result := -1;
  1876. end;
  1877. {------------------------------------------------------------------------------}
  1878. procedure TCustomRVItemInfo.SetAssociatedTextStyleNo(Value: Integer);
  1879. begin
  1880. end;
  1881. {============================= TRVNonTextItemInfo =============================}
  1882. procedure TRVNonTextItemInfo.AdjustInserted(x, y: Integer; adjusty: Boolean);
  1883. begin
  1884.   // nothing to do here
  1885. end;
  1886. {------------------------------------------------------------------------------}
  1887. function TRVNonTextItemInfo.GetHeight: Integer;
  1888. begin
  1889.   Result := 0;
  1890. end;
  1891. {------------------------------------------------------------------------------}
  1892. function TRVNonTextItemInfo.GetWidth: Integer;
  1893. begin
  1894.   Result := 0;
  1895. end;
  1896. {------------------------------------------------------------------------------}
  1897. function TRVNonTextItemInfo.GetLeftOverhang: Integer;
  1898. begin
  1899.   Result := 0;
  1900. end;
  1901. {------------------------------------------------------------------------------}
  1902. procedure TRVNonTextItemInfo.Assign(Source: TCustomRVItemInfo);
  1903. begin
  1904.   if Source is TRVNonTextItemInfo then begin
  1905.     DeleteProtect := TRVNonTextItemInfo(Source).DeleteProtect;
  1906.   end;
  1907.   inherited;
  1908. end;
  1909. {------------------------------------------------------------------------------}
  1910. function TRVNonTextItemInfo.GetExtraIntProperty(Prop: TRVExtraItemProperty;
  1911.   var Value: Integer): Boolean;
  1912. begin
  1913.   case Prop of
  1914.     rvepDeleteProtect:
  1915.       begin
  1916.         Value := ord(DeleteProtect);
  1917.         Result := True;
  1918.       end;
  1919.     else
  1920.       Result := inherited GetExtraIntProperty(Prop, Value);
  1921.   end;
  1922. end;
  1923. {------------------------------------------------------------------------------}
  1924. function TRVNonTextItemInfo.SetExtraIntProperty(Prop: TRVExtraItemProperty;
  1925.   Value: Integer): Boolean;
  1926. begin
  1927.   case Prop of
  1928.     rvepDeleteProtect:
  1929.       begin
  1930.         DeleteProtect := Value<>0;
  1931.         Result := True;
  1932.       end;
  1933.     else
  1934.       Result := inherited SetExtraIntProperty(Prop, Value);
  1935.   end;
  1936. end;
  1937. {------------------------------------------------------------------------------}
  1938. function TRVNonTextItemInfo.GetRVFExtraPropertyCount: Integer;
  1939. begin
  1940.   Result := inherited GetRVFExtraPropertyCount;
  1941.   if DeleteProtect then
  1942.     inc(Result);
  1943. end;
  1944. {------------------------------------------------------------------------------}
  1945. procedure TRVNonTextItemInfo.SaveRVFExtraProperties(Stream: TStream);
  1946. begin
  1947.   inherited;
  1948.   if DeleteProtect then
  1949.     WriteRVFExtraIntPropertyStr(Stream, rvepDeleteProtect, ord(DeleteProtect));
  1950. end;
  1951. {=========================== TRVFullLineItemInfo ==============================}
  1952. function TRVFullLineItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  1953. begin
  1954.   case Prop of
  1955.     rvbpFullWidth:
  1956.       Result := True;
  1957.     else
  1958.       Result := inherited GetBoolValue(Prop);
  1959.   end;
  1960. end;
  1961. {=============================== TRVRectItemInfo ==============================}
  1962. constructor TRVRectItemInfo.Create(RVData: TPersistent);
  1963. begin
  1964.   inherited Create(RVData);
  1965.   Spacing := 1;
  1966. end;
  1967. {------------------------------------------------------------------------------}
  1968. procedure TRVRectItemInfo.Assign(Source: TCustomRVItemInfo);
  1969. begin
  1970.   if Source is TRVRectItemInfo then begin
  1971.     FMinHeightOnPage := TRVRectItemInfo(Source).FMinHeightOnPage;
  1972.     VAlign           := TRVRectItemInfo(Source).VAlign;
  1973.     VShift           := TRVRectItemInfo(Source).VShift;
  1974.     VShiftAbs        := TRVRectItemInfo(Source).VShiftAbs;
  1975.     Spacing          := TRVRectItemInfo(Source).Spacing;
  1976.   end;
  1977.   inherited Assign(Source);
  1978. end;
  1979. {------------------------------------------------------------------------------}
  1980. function TRVRectItemInfo.GetDescent: Integer;
  1981. begin
  1982.   Result := Spacing;
  1983. end;
  1984. {------------------------------------------------------------------------------}
  1985. function TRVRectItemInfo.GetBorderHeight: Integer;
  1986. begin
  1987.   Result := Spacing;
  1988. end;
  1989. {------------------------------------------------------------------------------}
  1990. function TRVRectItemInfo.GetBorderWidth: Integer;
  1991. begin
  1992.   Result := Spacing;
  1993. end;
  1994. {------------------------------------------------------------------------------}
  1995. function TRVRectItemInfo.ReadRVFHeader(var P: PChar;
  1996.   RVData: TPersistent): Boolean;
  1997. var va: Integer;
  1998. begin
  1999.   Result := True;
  2000.   if not (P^ in [#0, #10, #13]) then begin
  2001.     Result := RVFReadInteger(P,va);
  2002.     if Result then
  2003.       VAlign := TRVVAlign(va);
  2004.     end
  2005.   else
  2006.     VAlign := rvvaBaseLine;
  2007. end;
  2008. {------------------------------------------------------------------------------}
  2009. function TRVRectItemInfo.SaveRVFHeaderTail(RVData: TPersistent): String;
  2010. begin
  2011.   Result := IntToStr(ord(VAlign));
  2012. end;
  2013. {------------------------------------------------------------------------------}
  2014. function TRVRectItemInfo.GetRVFExtraPropertyCount: Integer;
  2015. begin
  2016.   Result := inherited GetRVFExtraPropertyCount;
  2017.   if VShift<>0 then
  2018.     inc(Result);
  2019.   if VShiftAbs then
  2020.     inc(Result);
  2021.   if Spacing<>1 then
  2022.     inc(Result);
  2023. end;
  2024. {------------------------------------------------------------------------------}
  2025. procedure TRVRectItemInfo.SaveRVFExtraProperties(Stream: TStream);
  2026. begin
  2027.   inherited;
  2028.   if VShift<>0 then
  2029.     WriteRVFExtraIntPropertyStr(Stream, rvepVShift, VShift);
  2030.   if VShiftAbs then
  2031.     WriteRVFExtraIntPropertyStr(Stream, rvepVShiftAbs, 1);
  2032.   if Spacing<>1 then
  2033.     WriteRVFExtraIntPropertyStr(Stream, rvepSpacing, Spacing);
  2034. end;
  2035. {------------------------------------------------------------------------------}
  2036. function TRVRectItemInfo.GetVShiftCSS(RVStyle: TRVStyle): String;
  2037. begin
  2038.   Result := '';
  2039.   if (VShift=0) or (GetImageHeight(RVStyle)=0) or (VAlign<>rvvaBaseLine) then
  2040.     exit;
  2041.   if VShiftAbs then
  2042.     Result := Format('vertical-align : %d', [VShift])
  2043.   else
  2044.     Result := Format('vertical-align : %d', [MulDiv(GetImageHeight(RVStyle),VShift,100)])
  2045. end;
  2046. {------------------------------------------------------------------------------}
  2047. function TRVRectItemInfo.SetExtraIntProperty(Prop: TRVExtraItemProperty; Value: Integer): Boolean;
  2048. begin
  2049.   Result := True;
  2050.   case Prop of
  2051.     rvepVShift:
  2052.       VShift := Value;
  2053.     rvepVShiftAbs:
  2054.       VShiftAbs := Value<>0;
  2055.     rvepSpacing:
  2056.       begin
  2057.         Spacing := Value;
  2058.         if Spacing<0 then
  2059.           Spacing := 0;
  2060.       end;
  2061.     else
  2062.       Result := inherited SetExtraIntProperty(Prop, Value);
  2063.   end;
  2064. end;
  2065. {------------------------------------------------------------------------------}
  2066. function TRVRectItemInfo.GetExtraIntProperty(Prop: TRVExtraItemProperty; var Value: Integer): Boolean;
  2067. begin
  2068.   Result := True;
  2069.   case Prop of
  2070.     rvepVShift:
  2071.       Value := VShift;
  2072.     rvepVShiftAbs:
  2073.       Value := ord(VShiftAbs);
  2074.     rvepSpacing:
  2075.       Value := Spacing;
  2076.     else
  2077.       Result := inherited GetExtraIntProperty(Prop, Value);
  2078.   end;
  2079. end;
  2080. {================================ TRVControlItemInfo ==========================}
  2081. constructor TRVControlItemInfo.CreateEx(RVData: TPersistent; AControl: TControl; AVAlign: TRVVAlign);
  2082. begin
  2083.   inherited Create(RVData);
  2084.   StyleNo  := rvsComponent;
  2085.   Control  := AControl;
  2086.   VAlign   := AVAlign;
  2087.   FVisible := True;
  2088. end;
  2089. {------------------------------------------------------------------------------}
  2090. constructor TRVControlItemInfo.Create(RVData: TPersistent);
  2091. begin
  2092.   inherited Create(RVData);
  2093.   StyleNo  := rvsComponent;
  2094.   FVisible := True;
  2095. end;
  2096. {------------------------------------------------------------------------------}
  2097. destructor TRVControlItemInfo.Destroy;
  2098. begin
  2099.   Control.Free;
  2100.   inherited Destroy;
  2101. end;
  2102. {------------------------------------------------------------------------------}
  2103. procedure TRVControlItemInfo.Assign(Source: TCustomRVItemInfo);
  2104. begin
  2105.   if Source is TRVControlItemInfo then begin
  2106.     PercentWidth := TRVControlItemInfo(Source).PercentWidth;
  2107.     FResizable   := TRVControlItemInfo(Source).FResizable;
  2108.     FVisible     := TRVControlItemInfo(Source).FVisible;
  2109.   end;
  2110.   inherited Assign(Source);
  2111. end;
  2112. {------------------------------------------------------------------------------}
  2113. procedure TRVControlItemInfo.AdjustInserted(x, y: Integer; adjusty: Boolean);
  2114. begin
  2115.   Control.Left := x+Spacing;
  2116.   Control.Tag  := y+Spacing;
  2117.   if adjusty then
  2118.     RV_Tag2Y(Control);
  2119.   Control.Visible := FVisible;    
  2120. end;
  2121. {------------------------------------------------------------------------------}
  2122. function TRVControlItemInfo.GetHeight: Integer;
  2123. begin
  2124.   Result := Control.Height+Spacing*2;
  2125. end;
  2126. {------------------------------------------------------------------------------}
  2127. function TRVControlItemInfo.GetImageHeight(RVStyle: TRVStyle): Integer;
  2128. begin
  2129.   Result := Control.Height;
  2130. end;
  2131. {------------------------------------------------------------------------------}
  2132. function TRVControlItemInfo.GetWidth: Integer;
  2133. begin
  2134.   Result := Control.Width+Spacing*2;
  2135. end;
  2136. {------------------------------------------------------------------------------}
  2137. function TRVControlItemInfo.GetImageWidth(RVStyle: TRVStyle): Integer;
  2138. begin
  2139.   Result := Control.Width;
  2140. end;
  2141. {------------------------------------------------------------------------------}
  2142. function TRVControlItemInfo.GetMinWidth(sad: PRVScreenAndDevice; Canvas: TCanvas;
  2143.                                         RVData: TPersistent): Integer;
  2144. begin
  2145.   if PercentWidth<>0 then
  2146.     Result := 20
  2147.   else
  2148.     Result := Control.Width+Spacing*2;
  2149.   if sad<>nil then
  2150.     Result := MulDiv(Result, sad.ppixDevice, sad.ppixScreen);
  2151. end;
  2152. {------------------------------------------------------------------------------}
  2153. function TRVControlItemInfo.CreatePrintingDrawItem(RVData: TObject; const sad: TRVScreenAndDevice): TRVDrawLineInfo;
  2154. begin
  2155.   if not GetBoolValueEx(rvbpPrintToBMP, nil) or (MinHeightOnPage=0) then begin
  2156.     Result := TRVDrawLineInfo.Create;
  2157.     exit;
  2158.   end;
  2159.   Result := TRVMultiImagePrintInfo.Create(Self);
  2160.   Result.Width  := MulDiv(GetWidth, sad.ppixDevice, sad.ppixScreen);
  2161.   Result.Height := MulDiv(GetHeight, sad.ppiyDevice, sad.ppiyScreen);
  2162.   TRVMultiImagePrintInfo(Result).sad := sad;
  2163. end;
  2164. {------------------------------------------------------------------------------}
  2165. function TRVControlItemInfo.PrintToBitmap(Bkgnd: TBitmap; Preview: Boolean;
  2166.   RichView: TRVScroller; dli: TRVDrawLineInfo; Part: Integer;
  2167.   ColorMode: TRVColorMode): Boolean;
  2168. var ctrlbmp: TBitmap;
  2169.     Top: Integer;
  2170. begin
  2171.   Result := False;
  2172.   if not FVisible then
  2173.     exit;  
  2174.   ctrlbmp := nil;
  2175.   if Assigned(TPrintableRV(RichView).RVPrint.OnPrintComponent) then
  2176.     TPrintableRV(RichView).RVPrint.OnPrintComponent(TPrintableRV(RichView).RVPrint, Control, ctrlbmp)
  2177.   else
  2178.     ctrlbmp := DrawControl(Control);
  2179.   if (dli is TRVMultiImagePrintInfo) and (Part>=0) then
  2180.     Top := -TRVImagePrintPart(TRVMultiImagePrintInfo(dli).PartsList[Part]).ImgTop
  2181.   else
  2182.     Top := 0;
  2183.   if (ctrlbmp<>nil) then
  2184.     try
  2185.       Result := True;
  2186.       if MinHeightOnPage<=0 then begin
  2187.         if ctrlbmp.Width>bkgnd.Width then
  2188.           bkgnd.Width := ctrlbmp.Width;
  2189.         if ctrlbmp.Height>bkgnd.Height then
  2190.           bkgnd.Height := ctrlbmp.Height;
  2191.         Bkgnd.Canvas.Draw((Bkgnd.Width-ctrlbmp.Width) div 2,
  2192.           (Bkgnd.Height-ctrlbmp.Height) div 2, ctrlbmp);
  2193.         end
  2194.       else
  2195.         Bkgnd.Canvas.Draw(0, Top, ctrlbmp);
  2196.     finally
  2197.       ctrlbmp.Free;
  2198.     end;
  2199. end;
  2200. {------------------------------------------------------------------------------}
  2201. procedure TRVControlItemInfo.Paint(x, y: Integer; Canvas: TCanvas;
  2202.   State: TRVItemDrawStates; Style: TRVStyle; dli: TRVDrawLineInfo);
  2203. begin
  2204.   if not FVisible then
  2205.     exit;
  2206.   if (rvidsCurrent in State) and (Style.CurrentItemColor<>clNone) then begin
  2207.     Canvas.Pen.Width := 1;
  2208.     Canvas.Pen.Color := Style.CurrentItemColor;
  2209.     Canvas.Pen.Style := psSolid;
  2210.     Canvas.Rectangle(x-1,y-1,
  2211.       x+Control.Width+Spacing*2+1, y+Control.Height+Spacing*2+1);
  2212.   end;
  2213.   if (rvidsSelected in State) then begin
  2214.     if rvidsControlFocused in State then
  2215.       Canvas.Pen.Color := Style.SelColor
  2216.     else
  2217.       Canvas.Pen.Color := Style.InactiveSelColor;
  2218.     if Canvas.Pen.Color<>clNone then begin
  2219.       Canvas.Pen.Width := 1;
  2220.       Canvas.Pen.Style := psSolid;
  2221.       Canvas.Rectangle(x,y,
  2222.         x+Control.Width+Spacing*2, y+Control.Height+Spacing*2);
  2223.     end;
  2224.   end
  2225. end;
  2226. {------------------------------------------------------------------------------}
  2227. function TRVControlItemInfo.OwnsControl(AControl: TControl): Boolean;
  2228. begin
  2229.   Result := (AControl=Control);
  2230. end;
  2231. {------------------------------------------------------------------------------}
  2232. {$IFNDEF RVDONOTUSEHTML}
  2233. procedure TRVControlItemInfo.SaveToHTML(Stream: TStream; RVData: TPersistent;
  2234.   ItemNo: Integer; const Text, Path: String; const imgSavePrefix: String;
  2235.   var imgSaveNo: Integer; CurrentFileColor: TColor; SaveOptions: TRVSaveOptions;
  2236.   UseCSS: Boolean; Bullets: TRVList);
  2237. var s: String;
  2238. begin
  2239.   s := TCustomRVData(RVData).SaveComponentToFile(Path, Control, rvsfHTML);
  2240.   if s<>'' then
  2241.     RVWrite(Stream,s);
  2242. end;
  2243. {$ENDIF}
  2244. {------------------------------------------------------------------------------}
  2245. function TRVControlItemInfo.ReadRVFLine(const s: String;
  2246.   RVData: TPersistent; ReadType, LineNo, LineCount: Integer;
  2247.   var Name: String; var ReadMode: TRVFReadMode;
  2248.   var ReadState: TRVFReadState): Boolean;
  2249. var ControlClass: TControlClass;
  2250. begin
  2251.   Result := True;
  2252.   case ReadType of
  2253.     1: // ask owner
  2254.       begin
  2255.         case LineNo of
  2256.           0:
  2257.             begin
  2258.               Name := s;
  2259.               Control := TCustomRVData(RVData).RVFControlNeeded(s, Tag);