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

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       TRVStyle: settings and formatting for           }
  5. {       RichView.                                       }
  6. {       (registered on "RichView" page of               }
  7. {       the Component Palette)                          }
  8. {       Declarations of types used elsewhere.           }
  9. {                                                       }
  10. {       Copyright (c) Sergey Tkachenko                  }
  11. {       svt@trichview.com                               }
  12. {       http://www.trichview.com                        }
  13. {                                                       }
  14. {*******************************************************}
  15. unit RVStyle;
  16. interface
  17. {$R RVStyle}
  18. {$I RV_Defs.inc}
  19. {$IFDEF RICHVIEWDEF6}
  20. {$WARN SYMBOL_DEPRECATED OFF}
  21. {$ENDIF}
  22. uses
  23.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  24.   {$IFNDEF RVDONOTUSEINI}
  25.   IniFiles, Registry,
  26.   {$ENDIF}
  27.   {$IFDEF RICHVIEWDEF4}
  28.   ImgList,
  29.   {$ENDIF}
  30.   RVClasses, RVMapWht, RVScroll;
  31.  {---------------------------------------------------------------------------- }
  32.  
  33. const
  34.   { Cursors }
  35.   crJump = 101; // hand point, used as a default value for TRVStyle.JumpCursor
  36.                 // property
  37.   crRVFlipArrow = 106; // arrow to top right, used as a default value for
  38.                 // TRVStyle.LineSelectCursor property
  39.   { Indices for TRVStyle.TextStyles in its default state }
  40.   rvsNormal     = 0;
  41.   rvsHeading    = 1;
  42.   rvsSubheading = 2;
  43.   rvsKeyword    = 3;
  44.   rvsJump1      = 4;
  45.   rvsJump2      = 5;
  46.   { Standard item types (styles) }
  47.   rvsBreak      = -1; // "break" - horizontal line
  48.   rvsCheckpoint = -2; // "checkpoint" (not an item, for internal use)
  49.   rvsPicture    = -3; // picture (in class inherited from TGraphic)
  50.   rvsHotspot    = -4; // "hotspot": hypertext image from image-list
  51.   rvsComponent  = -5; // component (inherited from TControl)
  52.   rvsBullet     = -6; // "bullet": image from image-list
  53.   rvsBack       = -7; // background (not an item)
  54.   rvsVersionInfo= -8; // version info (not an item, for internal use)
  55.   rvsDocProperty= -9; // document property (not an item, for internal use)
  56.   rvsHotPicture = -10; // "hot picture": hypertext picture
  57.   rvsListMarker = -11; // list marker (paragraph bullet/numbering)
  58.   rvsTab        = -12; // tab character
  59.   LAST_DEFAULT_STYLE_NO = rvsJump2;
  60.   { constant used for representing default text style for paragraph }
  61.   rvsDefStyle = MaxInt;
  62.  {---------------------------------------------------------------------------- }
  63. type
  64.   { Structure containing information for resolutions of screen and some
  65.     device, for internal use }
  66.   TRVScreenAndDevice = record
  67.        ppixScreen, ppiyScreen, ppixDevice, ppiyDevice: Integer;
  68.        LeftMargin, RightMargin: Integer;
  69.    end;
  70.   PRVScreenAndDevice= ^TRVScreenAndDevice;
  71.   TParaInfo = class;
  72.   { Saving format }
  73.   TRVSaveFormat = (rvsfText, rvsfHTML, rvsfRTF, rvsfRVF);
  74.   { Loading format }
  75.   TRVLoadFormat = (rvlfText, rvlfHTML { not implemented }, rvlfRTF, rvlfRVF,
  76.     rvlfURL, rvlfOther);
  77.   { Part of RTF file, used in TCustomRichView.OnSaveRTFExtra }
  78.   TRVRTFSaveArea = (
  79.     rv_rtfs_TextStyle, // in character attributes
  80.     rv_rtfs_ParaStyle, // in paragraph attributes
  81.     rv_rtfs_CellProps, // in table cell
  82.     rv_rtfs_RowProps,  // in table row
  83.     rv_rtfs_Doc);      // at the beginning of document
  84.   { Part of HTML file, used in TCustomRichView.OnSaveHTMLExtra }
  85.   TRVHTMLSaveArea = (
  86.     rv_thms_Head,      // <HEAD>*</HEAD>
  87.     rv_thms_BodyAttribute, // <BODY *>
  88.     rv_thms_Body,      // <BODY>*
  89.     rv_thms_End       // *</BODY>
  90.     );  
  91.   { Values for TCustomRichView.RTFReadProperties.UnicodeMode }
  92.   TRVReaderUnicode = (
  93.     rvruMixed,         // Use ANSI text as possible, Unicode if necessary
  94.     rvruNoUnicode,     // Use only ANSI text, ignore Unicode in RTF
  95.     rvruOnlyUnicode);  // Use Unicode text, convert all text from RTF to Unicode
  96.   { Values for TCustomRichView.RTFReadProperties.TextStyleMode and
  97.     .ParaStyleMode }
  98.   TRVReaderStyleMode = (
  99.     rvrsUseSpecified,  // Use the specified style
  100.                        // (TCustomRichView.RTFReadProperties.TextStyleNo or
  101.                        // .ParaStyleNo)
  102.     rvrsUseClosest,    // Use the most similar of existing styles, do not
  103.                        // modify collection of styles
  104.     rvrsAddIfNeeded);  // Add new styles if necessary (result is the most
  105.                        // similar to the original RTF
  106.   { Values for TCustomRichView.RVFTextStylesReadMode and
  107.     .RVFParaStylesReadMode }
  108.   TRVFReaderStyleMode = (
  109.     rvf_sIgnore,       // Ignore styles in RVF.
  110.     rvf_sInsertMap,    // RVF loading: styles from RVF replace previous styles.
  111.                        // RVF inserting: use the most similar of existing
  112.                        // styles, do not modify collection of styles.
  113.     rvf_sInsertMerge); // RVF loading: styles from RVF replace previous styles.
  114.                        // RVF inserting: add new styles if necessary
  115.   { Values for TCustomRVPrint.ColorMode }
  116.   TRVColorMode = (
  117.     rvcmColor,         // Colors are not changed
  118.     rvcmPrinterColor,  // Colors are not changed, except for some system colors
  119.                        // converted to black and white
  120.     rvcmGrayScale,     // Colors are converted to shades of gray
  121.     rvcmBlackAndWhite, // Colors are converted to black and white
  122.     rvcmBlackOnWhite); // Black text on white background
  123.   { Code page, for example TRVStyle.DefCodePage }
  124.   TRVCodePage = type cardinal;
  125.   { Background style of item (for example, of table or table cell }
  126.   TRVItemBackgroundStyle = (
  127.     rvbsColor,         // no image
  128.     rvbsStretched,     // stretched image
  129.     rvbsTiled,         // tiled image
  130.     rvbsCentered);     // image in center
  131.   { Reference to information about "checkpoint" }
  132.   TCheckpointData = type Pointer;
  133.   TRVStyle = class;
  134.   { Text properties, used in TRVStyle.OnDrawStyleText }
  135.   TRVTextDrawState = (
  136.     rvtsSelected,      // selected
  137.     rvtsHover,         // under mouse
  138.     rvtsItemStart,     // starting item
  139.     rvtsItemEnd,       // ending item
  140.     rvtsDrawItemStart, // starting drawing item
  141.     rvtsDrawItemEnd,   // ending drawing item
  142.     rvtsControlFocused, // set if TRichView has input focus
  143.     rvtsSpecialCharacters); // display dots in spaces
  144.   TRVTextDrawStates = set of TRVTextDrawState;
  145.   { Type of page break }
  146.   TRVPageBreakType = (
  147.   rvpbSoftPageBreak,   // "soft" page break (created automatically)
  148.   rvpbPageBreak);      // page break set by user
  149.   { Visual style of "break" (horizontal line), not used }
  150.   TRVBreakStyle =
  151.     (rvbsLine,          // line of the given width
  152.      rvbsRectangle,     // rectangle of the given height (border width=1)
  153.      rvbs3d);           // sunken rectangle of the given height (border width=1)
  154.   { Vertical alignment of item }
  155.   TRVVAlign = (
  156.     rvvaBaseline,      // bottom of picture -> baseline
  157.     rvvaMiddle         // center of picture -> baseline
  158.     // may be in future:
  159.     //rvvaAbsTop,      // top of picture    -> top of line
  160.     //rvvaAbsBottom,   // bottom of picture -> bottom of line
  161.     //rvvaAbsMiddle  // center of picture -> center of line
  162.     );
  163.   { Types of paragraph border, TParaInfo.Border.Style }
  164.   TRVBorderStyle = (rvbNone, rvbSingle, rvbDouble, rvbTriple,
  165.     rvbThickInside, rvbThickOutside);
  166.   { Paragraph list type, TRVListLevel.ListType property }
  167.   TRVListType = (rvlstBullet, rvlstPicture, rvlstImageList,
  168.     rvlstDecimal, rvlstLowerAlpha, rvlstUpperAlpha, rvlstLowerRoman,
  169.     rvlstUpperRoman, rvlstImageListCounter
  170.     {$IFNDEF RVDONOTUSEUNICODE}
  171.     ,rvlstUnicodeBullet
  172.     {$ENDIF});
  173.   { Alignment of paragraph marker, TRVListLevel.MarkerAlignment property }
  174.   TRVMarkerAlignment = (rvmaLeft, rvmaRight, rvmaCenter);
  175.   { Options for paragraph bullets/numbering, TRVListLevel.Options }
  176.   TRVListLevelOption = (
  177.     rvloContinuous, // (reserved for future use, must always be set)
  178.     rvloLevelReset, // Reset numbering on each level - normal behavior
  179.     rvloLegalStyleNumbering); // Use decimal representation of numbering of
  180.                     // other levels
  181.   TRVListLevelOptions = set of TRVListLevelOption;
  182.   TRVMarkerFormatString = type String;
  183.   {$IFNDEF RVDONOTUSEUNICODE}
  184.   {$IFDEF RICHVIEWCBDEF3}
  185.   TRVMarkerFormatStringW = type WideString;
  186.   {$ENDIF}
  187.   {$ENDIF}
  188.   { Options for saving/loading RVF files/streams }
  189.   TRVFOption = (
  190.     rvfoSavePicturesBody, // Save pictures (if not set - images are requested
  191.                           // in event)
  192.     rvfoSaveControlsBody, // Save controls (if not set - controls are
  193.                           // requested in event)
  194.     rvfoIgnoreUnknownPicFmt, // Ignore pictures of unknown types
  195.                              // (if not set - report error)
  196.     rvfoIgnoreUnknownCtrls,  // Ignore controls of unknown types
  197.                              // (if not set - report error)
  198.     rvfoConvUnknownStylesToZero, // Convert unknown text, paragraph or list
  199.                                  // styles to 0-th styke (if not set - report error)
  200.     rvfoConvLargeImageIdxToZero, // Convert too large image indices in "bullets"
  201.                                  // and "hotspots" to 0 (if not set - report error)
  202.     rvfoSaveBinary,       // Binary RVF saving mode
  203.     rvfoUseStyleNames,    // (Obsolete)
  204.     rvfoSaveBack,         // Save background
  205.     rvfoLoadBack,         // Load background
  206.     rvfoSaveTextStyles,   // Save collection of text styles (RVStyle.TextStyles)
  207.     rvfoSaveParaStyles,   // Save collections of paragraph and list styles
  208.                           // (RVStyle.ParaStyles and .ListStyles)
  209.     rvfoSaveLayout,       // Save layout properties (margins, etc.)
  210.     rvfoLoadLayout,       // Load layout properties
  211.     rvfoSaveDocProperties,// Save DocProperties stringlist
  212.     rvfoLoadDocProperties // Load DocProperties stringlist
  213.     );
  214.   TRVFOptions = set of TRVFOption;
  215.   { Operation, see TRichView.OnProgress event. }
  216.   TRVLongOperation = (
  217.     rvloLoading,          // Saving
  218.     rvloConverting);      // Not used by the component. Allows to call
  219.   { Operation progress, see TRichView.OnProgress event. }
  220.   TRVProgressStage = (
  221.     rvpstgStarting,       // The operation is about to begin
  222.     rvpstgRunning,        // The operation is underway and has not yet completed
  223.     rvpstgEnding);        // The operation has just completed
  224.   { Warnings for loading RVF files/streams }
  225.   TRVFWarning = (
  226.     rvfwUnknownPicFmt, // Picture of unknown/unregistered type (use RegisterClass)
  227.     rvfwUnknownCtrls,  // Control of unknown/unregistered type (use RegisterClass)
  228.     rvfwConvUnknownStyles, // Invalid index of text/paragraph/list style
  229.     rvfwConvLargeImageIdx, // Invalid image index in "bullet" or "hotspot"
  230.     rvfwConvToUnicode,     // Mismatched Unicode/ANSI type of text
  231.                            // (was converted to Unicode)
  232.     rvfwConvFromUnicode,   // Mismatched Unicode/ANSI type of text
  233.                            // (was converted to ANSI)
  234.     rvfwInvalidPicture, // Invalid picture data (was replaced with
  235.                          // RVStyle.InvalidPicture.Graphic)
  236.     rvfwUnknownStyleProperties); // Unknown properties of items in the collections
  237.                            // of text/paragraph/lists. Probably, RVF was saved with
  238.                            // newer version of component 
  239.   TRVFWarnings = set of TRVFWarning;
  240.   { Action with controls inserted in TRichView, parameter of
  241.     TCustomRichView.OnControlAction }
  242.   TRVControlAction = (
  243.     rvcaAfterRVFLoad,      // Control is loaded from RVF file or stream
  244.     rvcaDestroy,           // Control is being destroyed (in TCustomRichView)
  245.     rvcaMoveToUndoList,    // Control is moved from editor to undo/redo buffer
  246.     rvcaMoveFromUndoList,  // Control is moved from undo/redo buffer back to editor
  247.     rvcaDestroyInUndoList, // Control is being destroyed (in undo buffer)
  248.     rvcaBeforeRVFSave,     // Before saving control to RVF file or stream
  249.     rvcaAfterRVFSave);     // After saving control to RVF file or stream
  250.   { Action with items, parameter of TCustomRichView.OnItemAction }
  251.   TRVItemAction = (
  252.     rviaInserting,         // Before insertion in TCustomRichView
  253.     rviaInserted,          // After insertion in TCustomRichView
  254.     rviaTextModifying,     // Text of item is being modified as a result of
  255.                            // editing operation
  256.     rviaDestroying,        // Item is being destroyed
  257.     rviaMovingToUndoList); // Item is moved to undo/redo buffer
  258.   { Options for protected text, TFontInfo.Protection property }
  259.   TRVProtectOption = (
  260.     rvprStyleProtect,   // Protect from ApplyTextStyle
  261.     rvprModifyProtect,  // Protect from text modifying (but not from
  262.                         // deletion as a whole)
  263.     rvprDeleteProtect,  // Protect from deletion as a whole
  264.     rvprConcateProtect, // Protect from concatenation with adjacent text
  265.     rvprRVFInsertProtect, // Protect from insertion from RVF
  266.     rvprDoNotAutoSwitch, // TCustomRichViewEdit.CurTextStyleNo will never
  267.                         // be set to the text of this style automatically
  268.     rvprParaStartProtect, // (See the help file)
  269.     rvprSticking,       // Disallows inserting between protected text items
  270.     rvprStickToTop,     // If this text is at the beginning, disallow inserting
  271.                         // before it
  272.     rvprStickToBottom); // If this text is at the end, disallow inserting
  273.                         // after it
  274.   TRVProtectOptions = set of TRVProtectOption;
  275.   { Options for paragraph styles, TParaInfo.Options property }
  276.   TRVParaOption = (
  277.     rvpaoNoWrap,         // Disallow word wrapping
  278.     rvpaoReadOnly,       // Disallow changes in paragraph (but it can be deleted
  279.                          // as a whole
  280.     rvpaoStyleProtect,   // Protect from ApplyParaStyle
  281.     rvpaoDoNotWantReturns, // Ignore ENTER key
  282.     rvpaoKeepLinesTogether, // Print the whole paragraph on one page, if possible
  283.     rvpaoKeepWithNext); // Print this paragraph on the same page as the next one
  284.   TRVParaOptions = set of TRVParaOption;
  285.   { Options for text styles, TTextInfo.Options property }
  286.   TRVTextOption = (
  287.     rvteoHTMLCode,  // Save text to HTML as is
  288.     rvteoRTFCode);  // Save text to RTF as is
  289.   TRVTextOptions = set of TRVTextOption;
  290.   { Options for saving HTML files, TCustomRichView.SaveHTML and SaveHTMLEx methods }
  291.   TRVSaveOption = (
  292.     rvsoOverrideImages, // Overwrite image files (if not set - use unique)
  293.     rvsoFirstOnly,      // Save only heading part of HTML
  294.     rvsoMiddleOnly,     // Save only middle part of HTML (document itself)
  295.     rvsoLastOnly,       // Save only ending part of HTML
  296.     rvsoDefault0Style,  // Do not save properties for the 0-th text style
  297.                         //   (only for SaveHTML)
  298.     rvsoNoHypertextImageBorders, // Supress borders for hypertext images
  299.     rvsoImageSizes,     // Write image size
  300.     rvsoForceNonTextCSS,// Always use CSS for non-text items
  301.     rvsoUseCheckpointsNames, // Use "checkpoint names" instead of indices
  302.     rvsoMarkersAsText,  // Save paragraph bullets/numbering without <UL>/<OL>
  303.     rvsoInlineCSS,      // Write CSS directly in <P> and <SPAN> tags
  304.                         //   (only for SaveHTMLEx)
  305.     rvsoNoDefCSSStyle,  // Use named CSS for all text styles, even for
  306.                         //   TextStyles[0] (by default, properties of
  307.                         //   TextStyles[0] are assigned to BODY and TABLE).
  308.                         //   This option generates larger HTML (not recommended).
  309.                         //   (only for SaveHTMLEx)
  310.     rvsoUseItemImageFileNames, // If set, images having specified
  311.                         //   (in extra string properties) file names will not
  312.                         //   be saved, but their file names will be written
  313.                         //   in HTML (relative to the HTML file path)
  314.     rvsoXHTML,          // Save XHTML (only for SaveHTMLEx)
  315.     rvsoUTF8);          // Use UTF8 encoding
  316.   TRVSaveOptions = set of TRVSaveOption;
  317.   { Options for saving RTF files, TCustomRichView.RTFOptions }
  318.   TRVRTFOption = (
  319.     rvrtfSaveStyleSheet,    // Save style sheet
  320.     rvrtfDuplicateUnicode,  // Save optional ANSI representation of Unicode text
  321.     rvrtfSaveEMFAsWMF,      // Save 32-bit metafiles as 16-bit metafiles
  322.                             // (more compatible RTF)
  323.     rvrtfSaveJpegAsJpeg,    // Save TJpegImage as jpeg (less compatible RTF)
  324.     rvrtfSaveBitmapDefault, // Save "exotic" picture types as bitmaps (if not
  325.                             // set - as metafiles)
  326.     rvrtfSaveEMFDefault);   // Save "exotic" picture types as 32-bit metafiles
  327.   TRVRTFOptions = set of TRVRTFOption;
  328.   { Advanced font styles, TFontInfo.StyleEx }
  329.   TRVFontStyle = (
  330.     rvfsOverline,   // Line above text
  331.     rvfsAllCaps    // All capitals
  332.     {$IFDEF RVTEXTFOOTNOTES}
  333.     , rvfsFootnotes
  334.     {$ENDIF}
  335.     );
  336.   TRVFontStyles = set of TRVFontStyle;
  337.   { Paragraph alignment, TParaInfo.Alignment }
  338.   TRVAlignment = (rvaLeft, rvaRight, rvaCenter, rvaJustify);
  339. {$IFNDEF RVDONOTUSEINI}
  340. {$IFDEF RICHVIEWDEF4}
  341.   TRVIniFile = TCustomIniFile;
  342. {$ELSE}
  343.   TRVIniFile = TIniFile;
  344. {$ENDIF}
  345. {$ENDIF}
  346.   { Parameters of TRVStyle.SaveCSS }
  347.   TRVSaveCSSOption = (
  348.     rvcssOnlyDifference,      // do not use
  349.     rvcssIgnoreLeftAlignment, // do not use
  350.     rvcssNoDefCSSStyle,       // see rvsoNoDefCSSStyle
  351.     rvcssUTF8);               // convert font names to UTF8
  352.   TRVSaveCSSOptions = set of TRVSaveCSSOption;
  353.   { Enumeration of properties of TFontInfo }
  354.   TRVFontInfoProperty = (
  355.     rvfiFontName, rvfiSize, rvfiCharset, rvfiUnicode,
  356.     rvfiBold, rvfiItalic, rvfiUnderline, rvfiStrikeout,
  357.     rvfiOverline, rvfiAllCaps,
  358.     {$IFDEF RVTEXTFOOTNOTES}
  359.     rvfiFootnotes,
  360.     {$ENDIF}
  361.     rvfiVShift, rvfiColor, rvfiBackColor,
  362.     rvfiJump, rvfiHoverBackColor, rvfiHoverColor, rvfiJumpCursor,
  363.     rvfiNextStyleNo, rvfiProtection, rvfiCharScale, rvfiBaseStyleNo,
  364.     rvfiBiDiMode, rvfiCharSpacing, rvfiHTMLCode, rvfiRTFCode,
  365.     {$IFDEF RVLANGUAGEPROPERTY}
  366.     rvfiLanguage,
  367.     {$ENDIF}
  368.     rvfiCustom);
  369.   { Enumeration of properies of TParaInfo }
  370.   TRVParaInfoProperty = (
  371.     rvpiFirstIndent, rvpiLeftIndent, rvpiRightIndent,
  372.     rvpiSpaceBefore, rvpiSpaceAfter, rvpiAlignment,
  373.     rvpiNextParaNo, rvpiDefStyleNo, rvpiLineSpacing, rvpiLineSpacingType,
  374.     rvpiBackground_Color,
  375.     rvpiBackground_BO_Left, rvpiBackground_BO_Top,
  376.     rvpiBackground_BO_Right, rvpiBackground_BO_Bottom,
  377.     rvpiBorder_Color, rvpiBorder_Style,
  378.     rvpiBorder_Width, rvpiBorder_InternalWidth,
  379.     rvpiBorder_BO_Left, rvpiBorder_BO_Top,
  380.     rvpiBorder_BO_Right, rvpiBorder_BO_Bottom,
  381.     rvpiBorder_Vis_Left, rvpiBorder_Vis_Top,
  382.     rvpiBorder_Vis_Right, rvpiBorder_Vis_Bottom,
  383.     rvpiNoWrap, rvpiReadOnly, rvpiStyleProtect, rvpiDoNotWantReturns,
  384.     rvpiKeepLinesTogether, rvpiKeepWithNext, rvpiTabs,
  385.     rvpiBiDiMode, rvpiCustom);
  386.   TRVParaInfoProperty1 = rvpiFirstIndent..rvpiBorder_Vis_Bottom;
  387.   TRVParaInfoProperty2 = rvpiNoWrap..rvpiBiDiMode;
  388.   TRVFontInfoProperties = set of TRVFontInfoProperty;
  389.   TRVParaInfoProperties = set of TRVParaInfoProperty;
  390.   TRVParaInfoProperties1 = set of TRVParaInfoProperty1;
  391.   TRVParaInfoProperties2 = set of TRVParaInfoProperty2;  
  392.   { Type of line spacing, TParaInfo.LineSpacingType }
  393.   TRVLineSpacingType = (
  394.     rvlsPercent,        // TParaInfo.LineSpacing specifies spacing in percents
  395.     rvlsSpaceBetween    // ... in pixels
  396.     {, rvlsAtLeast});
  397.   { Mode of merging collections of styles, for internal use }
  398.   TRVStyleMergeMode = (
  399.     rvs_merge_SmartMerge, // Reuse styles, add if necessary
  400.     rvs_merge_Map,        // Use the most similar of existing styles. Do not add styles
  401.     rvs_merge_Append);    // Append one collection to another
  402.   { Text selection mode }
  403.   TRVSelectionMode = (
  404.     rvsmChar,       // Select by characters
  405.     rvsmWord,       // Select by word
  406.     rvsmParagraph); // Select by paragraphs
  407.   { Text selection style }
  408.   TRVSelectionStyle = (
  409.     rvssItems,      // Highlighted items
  410.     rvssLines);     // Highlighted lines (like in Word). Not supported,
  411.                     // if BiDiMode<>rvbdUnspecified
  412.   { Tab alignment (relative to text after the tab) }
  413.   TRVTabAlign = ( rvtaLeft, rvtaRight, rvtaCenter );
  414.   { Type for TRVStyleTemplate.Id and references to it }
  415.   TRVStyleTemplateId = type Integer;
  416.   { Type for TRVStyleTemplate.Name }
  417.   TRVStyleTemplateName = type String;
  418.   { Characters shown in "show special characters" mode.
  419.     Type of RVVisibleSpecialCharacters variable }
  420.   TRVSpecialCharacter = (rvscSpace, rvscNBSP, rvscParagraph, rvscSoftHyphen);
  421.   TRVSpecialCharacters = set of TRVSpecialCharacter;
  422.   { --------------------- Types for events of TRVStyle ----------------------- }
  423.   TRVDrawTextBackEvent = procedure (Sender: TRVStyle; Canvas: TCanvas;
  424.     StyleNo: Integer; Left, Top, Width, Height: Integer;
  425.     DrawState: TRVTextDrawStates; var DoDefault: Boolean) of object;
  426.   TRVApplyStyleEvent = procedure (Sender: TRVStyle; Canvas: TCanvas;
  427.     StyleNo: Integer; var DoDefault: Boolean) of object;
  428.   TRVApplyStyleColorEvent = procedure (Sender: TRVStyle; Canvas: TCanvas;
  429.     StyleNo: Integer; DrawState: TRVTextDrawStates;
  430.     var DoDefault: Boolean) of object;
  431.   TRVDrawStyleTextEvent = procedure (Sender: TRVStyle; const s: String;
  432.     Canvas: TCanvas; StyleNo: Integer; SpaceBefore,
  433.     Left, Top, Width, Height: Integer;
  434.     DrawState: TRVTextDrawStates; var DoDefault: Boolean) of object;
  435.   TRVStyleHoverSensitiveEvent = procedure (Sender: TRVStyle; StyleNo: Integer;
  436.     var Sensitive: Boolean) of object;
  437.   TRVDrawCheckpointEvent = procedure (Sender: TRVStyle; Canvas: TCanvas;
  438.     X,Y, ItemNo, XShift: Integer; RaiseEvent: Boolean; Control: TControl;
  439.     var DoDefault: Boolean) of object;
  440.   TRVDrawPageBreakEvent = procedure (Sender: TRVStyle; Canvas: TCanvas;
  441.     Y, XShift: Integer; PageBreakType: TRVPageBreakType; Control: TControl;
  442.     var DoDefault: Boolean) of object;
  443.   TRVDrawParaRectEvent = procedure (Sender: TRVStyle; Canvas: TCanvas;
  444.     ParaNo: Integer; ARect: TRect; var DoDefault: Boolean) of object;
  445.   { ---------------------------------------------------------------------------
  446.     TCustomRVInfo: ancestor class for text, paragraph and list styles
  447.     (TFontInfo, TParaInfo, TRVListInfo)
  448.     Properties:
  449.     - BaseStyleNo - index of base style (reserved for future use)
  450.     - StyleName   - name of style
  451.     - Standard    - if True, this is a "real" style; if False, this style
  452.                     represents formatting and can be deleted by
  453.                     TCustomRichView.DeleteUnusedStyles
  454.     - StyleTemplateId - id of TRVStyle.StyleTemplates collection item,
  455.                     or value <= 0 for no style template.
  456.   }
  457.   TCustomRVInfo = class(TCollectionItem)
  458.     private
  459.       FBaseStyleNo: Integer;
  460.       FName: String;
  461.       FStandard: Boolean;
  462.       {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  463.       FStyleTemplateId: TRVStyleTemplateId;
  464.       {$ENDIF}
  465.     protected
  466.       function IsSimpleEqual(Value: TCustomRVInfo; IgnoreReferences: Boolean;
  467.         IgnoreID: Boolean{$IFDEF RICHVIEWDEF4}=True{$ENDIF}): Boolean; dynamic;
  468.       function IsSimpleEqualEx(Value: TCustomRVInfo; Mapping: TRVIntegerList): Boolean; dynamic;
  469.       function SimilarityValue(Value: TCustomRVInfo): Integer; dynamic;
  470.     public
  471.       constructor Create(Collection: TCollection); override;
  472.       procedure Assign(Source: TPersistent); override;
  473.       {$IFDEF RICHVIEWCBDEF3}
  474.       function GetDisplayName: String; override;
  475.       {$ENDIF}
  476.       {$IFNDEF RVDONOTUSEINI}
  477.       procedure SaveToINI(ini: TRVIniFile; const Section, fs: String);
  478.       procedure LoadFromINI(ini: TRVIniFile; const Section, fs, DefName: String);
  479.       {$ENDIF}
  480.     published
  481.       property BaseStyleNo: Integer read FBaseStyleNo write FBaseStyleNo default -1;
  482.       property StyleName: String    read FName        write FName;
  483.       property Standard: Boolean    read FStandard    write FStandard default True;
  484.       {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  485.       property StyleTemplateId: TRVStyleTemplateId read FStyleTemplateId write FStyleTemplateId default -1;
  486.       {$ENDIF}
  487.   end;
  488.   { ---------------------------------------------------------------------------
  489.     TCustomRVFontInfo: ancestor of TFontInfo and TRVSTFontInfo
  490.     Properties:
  491.     - Charset, FontName, Size, Style, Color - see properties for TFont
  492.       (FontName = Name)
  493.     - VShift - vertical offet of text, % of text height.
  494.       Positive values - up, negative values - down.
  495.     - BackColor - color of text background, clNone for transparent
  496.     - HoverBackColor - color of text background under mouse (only for hypertext),
  497.       clNone for no effect
  498.     - HoverColor - color of text under mouse (only for hypertext), clNone to
  499.       use TRVStyle.HoverColor
  500.     -  StyleEx - advanced visual text styles, see TRVFontStyles
  501.     - Jump - if true, this text is a hypertext
  502.     - JumpCursor - cursor for hypertext
  503.     - CharScale - horizontal character scale value, %
  504.     - CharSpacing - spacing between characters, pixels
  505.     - BiDiMode - bi-di mode of text
  506.     - Language - text language (enabled by RVLANGUAGEPROPERTY compiler define)
  507.     - Protection - protection options, see TRVProtectOptions
  508.     - Options - see TRVTextOptions
  509.   }
  510.   TCustomRVFontInfo = class(TCustomRVInfo)
  511.   private
  512.     { Private declarations }
  513.     FBiDiMode: TRVBiDiMode;
  514.     FJump: Boolean;
  515.     FJumpCursor: TCursor;
  516.     FFontName: TFontName;
  517.     FSize: Integer;
  518.     FColor, FBackColor, FHoverColor, FHoverBackColor: TColor;
  519.     FStyle: TFontStyles;
  520.     FStyleEx: TRVFontStyles;
  521.     FVShift: Integer;
  522.     {$IFDEF RICHVIEWCBDEF3}
  523.     FCharset: TFontCharset;
  524.     {$ENDIF}
  525.     {$IFDEF RVLANGUAGEPROPERTY}
  526.     FLanguage: Cardinal;
  527.     {$ENDIF}
  528.     FProtection: TRVProtectOptions;
  529.     FOptions: TRVTextOptions;
  530.     FCharScale, FCharSpacing: Integer;
  531.     {$IFDEF RVTEXTFOOTNOTES}
  532.     FFootNote: String;
  533.     {$ENDIF}
  534.     procedure SingleSymbolsReader(reader: TReader);
  535.   protected
  536.     procedure DefineProperties(Filer: TFiler);override;
  537.     function IsSimpleEqual(Value: TCustomRVInfo; IgnoreReferences: Boolean;
  538.       IgnoreID: Boolean{$IFDEF RICHVIEWDEF4}=True{$ENDIF}): Boolean; override;
  539.     function SimilarityValue(Value: TCustomRVInfo): Integer; override;
  540.   public
  541.     { Public declarations }
  542.     constructor Create(Collection: TCollection); override;
  543.     procedure Assign(Source: TPersistent); override;
  544.     procedure AssignTo(Dest: TPersistent); override;
  545.     procedure AssignSelectedProperties(Source: TCustomRVFontInfo; Props: TRVFontInfoProperties);
  546.     procedure AssignToLogFont(var LogFont: TLogFont; Canvas: TCanvas; CanUseCustomPPI: Boolean);
  547.     procedure Apply(Canvas: TCanvas; DefBiDiMode: TRVBiDiMode; CanUseCustomPPI: Boolean);
  548.     procedure ApplyBiDiMode(Canvas: TCanvas; DefBiDiMode: TRVBiDiMode);
  549.     procedure ApplyColor(Canvas: TCanvas; RVStyle: TRVStyle;
  550.       DrawState: TRVTextDrawStates; Printing: Boolean; ColorMode: TRVColorMode);
  551.     function IsEqual(Value: TCustomRVFontInfo; IgnoreList: TRVFontInfoProperties): Boolean; dynamic;
  552.     {$IFNDEF RVDONOTUSEINI}
  553.     procedure SaveToINI(ini: TRVIniFile; const Section, fs: String); dynamic;
  554.     procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String;
  555.       JumpByDefault: Boolean; DefJumpCursor: TCursor); dynamic;
  556.     {$ENDIF}
  557.     procedure SaveCSSToStream(Stream: TStream; BaseStyle: TCustomRVFontInfo;
  558.       Multiline, UTF8: Boolean);
  559.    published
  560.     { Published declarations }
  561.     {$IFDEF RICHVIEWCBDEF3}
  562.     property Charset: TFontCharset  read FCharset  write FCharset     default DEFAULT_CHARSET;
  563.     {$ENDIF}
  564.     property FontName:  TFontName   read FFontName   write FFontName;
  565.     property Size:      Integer     read FSize       write FSize       default 10;
  566.     property Style:     TFontStyles read FStyle      write FStyle      default [];
  567.     property VShift:    Integer     read FVShift     write FVShift     default 0;
  568.     property Color:     TColor      read FColor      write FColor      default clWindowText;
  569.     property BackColor: TColor      read FBackColor  write FBackColor  default clNone;
  570.     property HoverBackColor: TColor read FHoverBackColor write FHoverBackColor default clNone;
  571.     property HoverColor: TColor     read FHoverColor write FHoverColor default clNone;
  572.     property StyleEx:   TRVFontStyles read FStyleEx  write FStyleEx    default [];
  573.     property Jump:       Boolean    read FJump       write FJump       default False;
  574.     property JumpCursor: TCursor    read FJumpCursor write FJumpCursor default crJump;
  575.     property CharScale: Integer     read FCharScale  write FCharScale  default 100;
  576.     property CharSpacing: Integer   read FCharSpacing write FCharSpacing default 0;
  577.     property BiDiMode: TRVBiDiMode  read FBiDiMode   write FBiDiMode   default rvbdUnspecified;
  578.     {$IFDEF RVLANGUAGEPROPERTY}
  579.     property Language: Cardinal     read FLanguage   write FLanguage  default 0;
  580.     {$ENDIF}
  581.     property Protection: TRVProtectOptions read FProtection write FProtection default [];
  582.     property Options: TRVTextOptions read FOptions write FOptions default [];
  583.     {$IFDEF RVTEXTFOOTNOTES}
  584.     property FootNote: String       read FFootNote   write FFootNote;
  585.     {$ENDIF}
  586.   end;
  587.   { ---------------------------------------------------------------------------
  588.    TFontInfo: text style, item in the collection TRVStyle.TextStyles
  589.     (collection type is TFontInfos)   
  590.     Properties:
  591.     - NextStyleNo - index of text style for the next paragraph, if user
  592.       pressed ENTER at the end of paragraph of this style. -1 for the same style
  593.     - Unicode - if False, this text has ANSI encoding. If True, it is Unicode
  594.     - ModifiedProperties - list of properties which are not inherited
  595.       from StyleTemplate identified by StyleTemplateId property
  596.   }
  597.   TFontInfo = class (TCustomRVFontInfo)
  598.   private
  599.     {$IFNDEF RVDONOTUSEUNICODE}
  600.     FUnicode: Boolean;
  601.     {$ENDIF}
  602.     FNextStyleNo: Integer;
  603.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  604.     FModifiedProperties: TRVFontInfoProperties;
  605.     {$ENDIF}
  606.   protected
  607.     function IsSimpleEqualEx(Value: TCustomRVInfo; Mapping: TRVIntegerList): Boolean; override;
  608.     function IsSimpleEqual(Value: TCustomRVInfo; IgnoreReferences: Boolean;
  609.       IgnoreID: Boolean{$IFDEF RICHVIEWDEF4}=True{$ENDIF}): Boolean; override;
  610.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  611.     procedure ExcludeUnmodifiedProperties(Source: TCustomRVFontInfo;
  612.       PossibleProps: TRVFontInfoProperties);
  613.     {$ENDIF}
  614.   public
  615.     constructor Create(Collection: TCollection); override;
  616.     procedure Assign(Source: TPersistent); override;
  617.     function IsEqual(Value: TCustomRVFontInfo; IgnoreList: TRVFontInfoProperties): Boolean; override;
  618.     procedure Draw(const s: String; Canvas: TCanvas; ThisStyleNo: Integer;
  619.       SpaceBefore, Left, Top, Width, Height: Integer; RVStyle: TRVStyle;
  620.       DrawState: TRVTextDrawStates; Printing, PreviewCorrection: Boolean;
  621.       ColorMode: TRVColorMode; DefBiDiMode: TRVBiDiMode);
  622.     procedure DrawVertical(const s: String; Canvas: TCanvas; // <-  do not ask me what is it :)
  623.       ThisStyleNo: Integer; SpaceBefore, Left, Top, Width, Height: Integer;
  624.       RVStyle: TRVStyle; DrawState: TRVTextDrawStates);
  625.     {$IFNDEF RVDONOTUSEINI}
  626.     procedure SaveToINI(ini: TRVIniFile; const Section, fs: String); override;
  627.     procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String;
  628.       JumpByDefault: Boolean; DefJumpCursor: TCursor); override;
  629.     {$ENDIF}
  630.   published
  631.     property NextStyleNo: Integer   read FNextStyleNo write FNextStyleNo default -1;
  632.     {$IFNDEF RVDONOTUSEUNICODE}
  633.     property Unicode: Boolean       read FUnicode    write FUnicode    default False;
  634.     {$ENDIF}
  635.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  636.     property ModifiedProperties: TRVFontInfoProperties
  637.       read FModifiedProperties write FModifiedProperties default [];
  638.     {$ENDIF}
  639.   end;
  640.   { ---------------------------------------------------------------------------
  641.     TCustomRVInfos: ancestor class for collections of styles
  642.     (TFontInfos, TParaInfos, TRVListInfos)
  643.   }
  644.   TCustomRVInfos = class (TCollection)
  645.   protected
  646.     FOwner: TPersistent;
  647.   public
  648.     constructor Create(ItemClass: TCollectionItemClass; Owner: TPersistent);
  649.     {$IFDEF RICHVIEWCBDEF3}
  650.     function GetOwner: TPersistent; override;
  651.     {$ENDIF}
  652.     procedure AssignTo(Dest: TPersistent); override;
  653.     procedure MergeWith(Styles:TCustomRVInfos; Mode:TRVStyleMergeMode;
  654.       Mapping: TRVIntegerList; TextStyleMapping: TRVIntegerList);
  655.   end;
  656.   {----------------------------------------------------------------------------
  657.     TFontInfos: collection of text styles (of TFontInfo), TRVStyle.TextStyles
  658.     Properties:
  659.     - Items[] - items
  660.     - InvalidItem - returned when accessing item with invalid index
  661.   }
  662.   TFontInfos = class (TCustomRVInfos)
  663.   private
  664.     FInvalidItem: TFontInfo;
  665.     function GetItem(Index: Integer): TFontInfo;
  666.     procedure SetItem(Index: Integer; Value: TFontInfo);
  667.     function GetInvalidItem: TFontInfo;
  668.     procedure SetInvalidItem(const Value: TFontInfo);
  669.   public
  670.     PixelsPerInch: Integer;
  671.     destructor Destroy; override;
  672.     {$IFDEF RICHVIEWCBDEF3}
  673.     function FindStyleWithCharset(BaseStyle: Integer;
  674.       Charset: TFontCharset): Integer;
  675.     {$ENDIF}
  676.     function FindStyleWithFontStyle(BaseStyle: Integer; Value,
  677.       Mask: TFontStyles): Integer;
  678.     function FindStyleWithFontSize(BaseStyle: Integer; Size: Integer): Integer;
  679.     function FindStyleWithColor(BaseStyle: Integer;
  680.       Color, BackColor: TColor): Integer;
  681.     function FindStyleWithFontName(BaseStyle: Integer;
  682.       const FontName: TFontName): Integer;
  683.     function FindSuchStyle(BaseStyle: Integer; Style: TFontInfo;
  684.       Mask: TRVFontInfoProperties): Integer;
  685.     function FindStyleWithFont(BaseStyle: Integer; Font: TFont): Integer;
  686.     function Add: TFontInfo;
  687.     function AddFont(Name: TFontName; Size: Integer; Color, BackColor: TColor;
  688.       Style:TFontStyles): TFontInfo;
  689.     {$IFDEF RICHVIEWCBDEF3}
  690.     function AddFontEx(Name: TFontName; Size: Integer; Color, BackColor: TColor;
  691.       Style:TFontStyles; Charset: TFontCharset): TFontInfo;
  692.     {$ENDIF}
  693.     {$IFNDEF RVDONOTUSEINI}
  694.     procedure SaveToINI(ini: TRVIniFile; const Section: String);
  695.     procedure LoadFromINI(ini: TRVIniFile; const Section: String;
  696.       DefJumpCursor: TCursor); 
  697.     {$ENDIF}
  698.     property Items[Index: Integer]: TFontInfo read GetItem write SetItem; default;
  699.     property InvalidItem: TFontInfo read GetInvalidItem write SetInvalidItem;
  700.   end;
  701.   { ---------------------------------------------------------------------------
  702.     TRVRect: rectangle.
  703.     Properties:
  704.     - Left, Top, Right, Bottom
  705.   }
  706.   TRVRect = class (TPersistent)
  707.     private
  708.       FTop: Integer;
  709.       FLeft: Integer;
  710.       FRight: Integer;
  711.       FBottom: Integer;
  712.       function IsEqualEx(Value: TRVRect; IgnL,IgnT,IgnR,IgnB: Boolean): Boolean;
  713.       function SimilarityValue(Value: TRVRect; Weight: Integer): Integer;
  714.     public
  715.       procedure Assign(Source: TPersistent); override;
  716.       procedure AssignValidProperties(Source: TRVRect; ValL, ValT, ValR, ValB: Boolean);
  717.       procedure SetAll(Value: Integer);
  718.       procedure InflateRect(var Rect: TRect);
  719.       procedure InflateRectSaD(var Rect: TRect; const sad: TRVScreenAndDevice);
  720.       procedure AssignToRect(var Rect: TRect);
  721.       procedure AssignToRectIfGreater(var Rect: TRect);
  722.       function IsEqual(Value: TRVRect): Boolean;
  723.       {$IFNDEF RVDONOTUSEINI}
  724.       procedure SaveToINI(ini: TRVIniFile; const Section, fs: String);
  725.       procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String);
  726.       {$ENDIF}
  727.     published
  728.       property Left: Integer   read FLeft   write FLeft   default 0;
  729.       property Right: Integer  read FRight  write FRight  default 0;
  730.       property Top: Integer    read FTop    write FTop    default 0;
  731.       property Bottom: Integer read FBottom write FBottom default 0;
  732.   end;
  733.   { ---------------------------------------------------------------------------
  734.     TRVBooleanRect: 4 boolean values
  735.     Properties:
  736.     - Left, Top, Right, Bottom
  737.   }
  738.   TRVBooleanRect = class (TPersistent)
  739.     private
  740.       FTop: Boolean;
  741.       FLeft: Boolean;
  742.       FRight: Boolean;
  743.       FBottom: Boolean;
  744.       function IsEqualEx(Value: TRVBooleanRect; IgnL,IgnT,IgnR,IgnB: Boolean): Boolean;
  745.     public
  746.       constructor Create(DefValue: Boolean);
  747.       procedure SetAll(Value: Boolean);
  748.       procedure SetValues(ALeft, ATop, ARight, ABottom: Boolean);
  749.       procedure Assign(Source: TPersistent); override;
  750.       procedure AssignValidProperties(Source: TRVBooleanRect;
  751.          ValL, ValT, ValR, ValB: Boolean);
  752.       function IsEqual(Value: TRVBooleanRect): Boolean;
  753.       function IsEqual2(ALeft, ATop, ARight, ABottom: Boolean): Boolean;
  754.       function IsAllEqual(Value: Boolean): Boolean;
  755.       {$IFNDEF RVDONOTUSEINI}
  756.       procedure SaveToINI(ini: TRVIniFile; const Section, fs: String);
  757.       procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String);
  758.       {$ENDIF}
  759.     published
  760.       property Left: Boolean   read FLeft   write FLeft   default True;
  761.       property Right: Boolean  read FRight  write FRight  default True;
  762.       property Top: Boolean    read FTop    write FTop    default True;
  763.       property Bottom: Boolean read FBottom write FBottom default True;
  764.   end;
  765.   { ---------------------------------------------------------------------------
  766.     TRVBorder: paragraph border
  767.     Properties:
  768.     - Width - [thin] line width
  769.     - InternalWidth - spacing between border lines (for double or triple borders)
  770.     - Color - border color
  771.     - Style - border type, see TRVBorderStyle
  772.     - VisibleBorders - turn on/off border sides
  773.     - BorderOffsets - padding between text and border
  774.   }
  775.   TRVBorder = class (TPersistent)
  776.     private
  777.       FColor: TColor;
  778.       FStyle: TRVBorderStyle;
  779.       FWidth: Integer;
  780.       FInternalWidth: Integer;
  781.       FVisibleBorders: TRVBooleanRect;
  782.       FBorderOffsets: TRVRect;
  783.       procedure SetBorderOffsets(const Value: TRVRect);
  784.       procedure SetVisibleBorders(const Value: TRVBooleanRect);
  785.       function SimilarityValue(Value: TRVBorder): Integer;
  786.     protected
  787.       procedure DoDraw(Rect: TRect; Canvas: TCanvas;
  788.         Width, InternalWidth, OnePixelWidth: Integer;
  789.         ColorMode: TRVColorMode);
  790.     public
  791.       constructor Create;
  792.       destructor Destroy; override;
  793.       procedure Draw(Rect: TRect; Canvas: TCanvas);
  794.       procedure DrawSaD(Rect: TRect; Canvas: TCanvas; const sad: TRVScreenAndDevice;
  795.         ColorMode: TRVColorMode);
  796.       procedure Assign(Source: TPersistent); override;
  797.       function IsEqual(Value: TRVBorder): Boolean;
  798.       function IsEqual_Para(Value: TRVBorder; IgnoreList: TRVParaInfoProperties): Boolean;
  799.       procedure AssignValidProperties(Source: TRVBorder; ValidProperties: TRVParaInfoProperties1);
  800.       {$IFNDEF RVDONOTUSEINI}
  801.       procedure SaveToINI(ini: TRVIniFile; const Section, fs: String);
  802.       procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String);
  803.       {$ENDIF}
  804.       function GetTotalWidth: Integer;
  805.     published
  806.       property Width:         Integer         read FWidth          write FWidth         default 1;
  807.       property InternalWidth: Integer         read FInternalWidth  write FInternalWidth default 1;
  808.       property Color:         TColor          read FColor          write FColor         default clWindowText;
  809.       property Style:         TRVBorderStyle  read FStyle          write FStyle         default rvbNone;
  810.       property VisibleBorders: TRVBooleanRect read FVisibleBorders write SetVisibleBorders;
  811.       property BorderOffsets: TRVRect read FBorderOffsets write SetBorderOffsets;
  812.   end;
  813.   { ---------------------------------------------------------------------------
  814.     TRVBackgroundRect: properties for paragraph background
  815.     Properties:
  816.     - Color - background color (clNone for transparent)
  817.     - BorderOffsets - padding (widths of colored area around paragraph text)
  818.   }
  819.   TRVBackgroundRect = class (TPersistent)
  820.   private
  821.       FBorderOffsets: TRVRect;
  822.       FColor: TColor;
  823.       procedure SetBorderOffsets(const Value: TRVRect);
  824.       function SimilarityValue(Value: TRVBackgroundRect): Integer;
  825.     public
  826.       constructor Create;
  827.       destructor Destroy; override;
  828.       procedure Assign(Source: TPersistent); override;
  829.       procedure PrepareDraw(var Rect: TRect);
  830.       procedure PrepareDrawSaD(var Rect: TRect; const sad: TRVScreenAndDevice);
  831.       procedure Draw(Rect: TRect; Canvas: TCanvas; Printing: Boolean;
  832.         ColorMode: TRVColorMode);
  833.       function IsEqual(Value: TRVBackgroundRect): Boolean;
  834.       function IsEqual_Para(Value: TRVBackgroundRect;
  835.         IgnoreList: TRVParaInfoProperties): Boolean;
  836.       procedure AssignValidProperties(Source: TRVBackgroundRect;
  837.         ValidProperties: TRVParaInfoProperties1);
  838.       {$IFNDEF RVDONOTUSEINI}
  839.       procedure SaveToINI(ini: TRVIniFile; const Section, fs: String);
  840.       procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String);
  841.       {$ENDIF}
  842.     published
  843.       property Color: TColor read FColor write FColor default clNone;
  844.       property BorderOffsets: TRVRect read FBorderOffsets write SetBorderOffsets;
  845.   end;
  846. {$IFNDEF RVDONOTUSETABS}
  847.   {----------------------------------------------------------------------------
  848.     TRVTabInfo: properties of paragraph's tabs.
  849.     Properties:
  850.     - Align - alignment of tab relative to the next text
  851.     - Position - distance between the left (right for RTL) margin and the tab;
  852.         assignment resorts the tab collection
  853.     - Leader - characters to fill the tab   }
  854.   TRVTabInfo = class (TCollectionItem)
  855.     private
  856.       FPosition: Integer;
  857.       FLeader: String;
  858.       FAlign: TRVTabAlign;
  859.       function StoreLeader: Boolean;
  860.       procedure SetPosition(const Value: Integer);
  861.     protected
  862.       {$IFDEF RICHVIEWCBDEF3}
  863.       function GetDisplayName: String; override;
  864.       {$ENDIF}
  865.     public
  866.       function IsEqual(Value: TRVTabInfo): Boolean;
  867.       function SimilarityValue(Value: TRVTabInfo): Integer;
  868.       procedure Assign(Source: TPersistent); override;
  869.       {$IFNDEF RVDONOTUSEINI}
  870.       procedure SaveToINI(ini: TRVIniFile; const Section, fs: String);
  871.       procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String);
  872.       {$ENDIF}
  873.     published
  874.       property Align: TRVTabAlign read FAlign write FAlign default rvtaLeft;
  875.       property Position: Integer read FPosition write SetPosition;
  876.       property Leader: String read FLeader write FLeader stored StoreLeader;
  877.   end;
  878.   {----------------------------------------------------------------------------
  879.   { TRVTabInfos: tabs of paragraphs, type of TParaInfo.Tabs
  880.     (collection of TRVTabInfo)
  881.     Properties:
  882.     Items[] - tabs
  883.   }
  884.   TRVTabInfos = class (TCollection)
  885.     private
  886.       FOwner: TPersistent;
  887.       function GetItem(Index: Integer): TRVTabInfo;
  888.       procedure SetItem(Index: Integer; Value: TRVTabInfo);
  889.     public
  890.       constructor Create(Owner: TPersistent);
  891.       {$IFDEF RICHVIEWCBDEF3}
  892.       function GetOwner: TPersistent;  override;
  893.       {$ENDIF}
  894.       {$IFNDEF RVDONOTUSEINI}
  895.       procedure SaveToINI(ini: TRVIniFile; const Section, fs: String);
  896.       procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String);
  897.       {$ENDIF}
  898.       function Add: TRVTabInfo;
  899.       procedure SortTabs;
  900.       function IsEqual(Value: TRVTabInfos): Boolean;
  901.       function Find(Position: Integer): Integer;
  902.       function SimilarityValue(Value: TRVTabInfos): Integer;
  903.       procedure Intersect(Value: TRVTabInfos);
  904.       procedure AddFrom(Source: TRVTabInfos);
  905.       procedure DeleteList(Positions: TRVIntegerList);
  906.       property Items[Index: Integer]: TRVTabInfo
  907.          read GetItem write SetItem; default;
  908.   end;
  909. {$ENDIF}
  910.   {----------------------------------------------------------------------------
  911.     TCustomRVParaInfo: ancestor of TParaInfo and TRVSTParaInfo
  912.     Properties:
  913.     - FirstIndent - first line indent, pixels (added to LeftIndent, can be negative)
  914.     - LeftIndent, RightIndent, SpaceBefore, SpaceAfter - indents to the left,
  915.       right, top, bottom of the paragraph, pixels
  916.     - Alignment - paragraph alignmentm see TRVAlignment
  917.     - Border - paragraph border, see TRVBorder
  918.     - Background - paragraph background, see TRVBackgroundRect
  919.     - LineSpacing - line spacing value, pixels or percents
  920.     - LineSpacingType - line spacing type, see TRVLineSpacingType
  921.     - Options - see TRVParaOptions
  922.     - BiDiMode - paragraph bi-di mode
  923.   }
  924.   TCustomRVParaInfo = class (TCustomRVInfo)
  925.   private
  926.     FFirstIndent: Integer;
  927.     FLeftIndent: Integer;
  928.     FRightIndent: Integer;
  929.     FSpaceBefore: Integer;
  930.     FSpaceAfter: Integer;
  931.     FLineSpacing: Integer;
  932.     FLineSpacingType: TRVLineSpacingType;
  933.     FAlignment: TRVAlignment;
  934.     FBorder: TRVBorder;
  935.     FBackground: TRVBackgroundRect;
  936.     FOptions: TRVParaOptions;
  937.     FBiDiMode: TRVBiDiMode;
  938.     {$IFNDEF RVDONOTUSETABS}
  939.     FTabs: TRVTabInfos;
  940.     {$ENDIF}
  941.     procedure SetBorder(const Value: TRVBorder);
  942.     procedure SetBackground(const Value: TRVBackgroundRect);
  943.     function ExtraLineSpacing: Boolean;
  944.     {$IFNDEF RVDONOTUSETABS}
  945.     procedure SetTabs(const Value: TRVTabInfos);
  946.     {$ENDIF}
  947.   protected
  948.     function IsSimpleEqual(Value: TCustomRVInfo; IgnoreReferences: Boolean;
  949.       IgnoreID: Boolean{$IFDEF RICHVIEWDEF4}=True{$ENDIF}): Boolean; override;
  950.     function SimilarityValue(Value: TCustomRVInfo): Integer; override;
  951.   public
  952.     constructor Create(Collection: TCollection); override;
  953.     destructor Destroy; override;
  954.     procedure Assign(Source: TPersistent); override;
  955.     procedure AssignSelectedProperties(Source: TCustomRVParaInfo;
  956.       Props: TRVParaInfoProperties);
  957.     {$IFNDEF RVDONOTUSEINI}
  958.     procedure SaveToINI(ini: TRVIniFile; const Section, fs: String); dynamic;
  959.     procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String); dynamic;
  960.     {$ENDIF}
  961.     function IsEqual(Value: TCustomRVParaInfo; IgnoreList: TRVParaInfoProperties): Boolean; dynamic;
  962.     procedure SaveCSSToStream(Stream: TStream; BaseStyle: TParaInfo;
  963.       Multiline, IgnoreLeftAlignment, IgnoreLeftIndents: Boolean);
  964.   published
  965.     property FirstIndent: Integer       read FFirstIndent write FFirstIndent default 0;
  966.     property LeftIndent:  Integer       read FLeftIndent  write FLeftIndent  default 0;
  967.     property RightIndent: Integer       read FRightIndent write FRightIndent default 0;
  968.     property SpaceBefore: Integer       read FSpaceBefore write FSpaceBefore default 0;
  969.     property SpaceAfter:  Integer       read FSpaceAfter  write FSpaceAfter  default 0;
  970.     property Alignment:   TRVAlignment  read FAlignment   write FAlignment   default rvaLeft;
  971.     property Border:      TRVBorder     read FBorder      write SetBorder;
  972.     property Background:  TRVBackgroundRect read FBackground write SetBackground;
  973.     property LineSpacing: Integer       read FLineSpacing write FLineSpacing default 100;
  974.     property LineSpacingType: TRVLineSpacingType read FLineSpacingType write FLineSpacingType default rvlsPercent;
  975.     property Options: TRVParaOptions    read FOptions     write FOptions    default [];
  976.     property BiDiMode: TRVBiDiMode      read FBiDiMode    write FBidiMode default rvbdUnspecified;
  977.     {$IFNDEF RVDONOTUSETABS}
  978.     property Tabs: TRVTabInfos          read FTabs        write SetTabs;
  979.     {$ENDIF}
  980.   end;
  981.   {----------------------------------------------------------------------------
  982.     TParaInfo: paragraph style, item in the collection TRVStyle.ParaStyles
  983.     (collection type is TParaInfos)
  984.     Properties:
  985.     - NextParaNo - index of paragraph style for the next paragraph, if user
  986.       pressed ENTER at the end of paragraph of this style. -1 for the same style
  987.     - DefStyleNo - index of text style used for this paragraph by default
  988.     - ModifiedProperties1, ModifiedProperties2 - list of properties not inherited
  989.       from StyleTemplate identified by StyleTemplateId property
  990.   }
  991.   TParaInfo = class (TCustomRVParaInfo)
  992.   private
  993.     FNextParaNo: Integer;
  994.     FDefStyleNo: Integer;
  995.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  996.     FModifiedProperties1: TRVParaInfoProperties1;
  997.     FModifiedProperties2: TRVParaInfoProperties2;
  998.     {$ENDIF}
  999.   protected
  1000.     function IsSimpleEqualEx(Value: TCustomRVInfo; Mapping: TRVIntegerList): Boolean; override;
  1001.     function IsSimpleEqual(Value: TCustomRVInfo; IgnoreReferences: Boolean;
  1002.       IgnoreID: Boolean{$IFDEF RICHVIEWDEF4}=True{$ENDIF}): Boolean; override;
  1003.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1004.     procedure ExcludeUnmodifiedProperties(Source: TCustomRVParaInfo;
  1005.       PossibleProps: TRVParaInfoProperties);
  1006.     {$ENDIF}
  1007.   public
  1008.     constructor Create(Collection: TCollection); override;
  1009.     procedure Assign(Source: TPersistent); override;
  1010.     function IsEqual(Value: TCustomRVParaInfo; IgnoreList: TRVParaInfoProperties): Boolean; override;
  1011.     {$IFNDEF RVDONOTUSEINI}
  1012.     procedure SaveToINI(ini: TRVIniFile; const Section, fs: String); override;
  1013.     procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String); override;
  1014.     {$ENDIF}
  1015.   published
  1016.     property NextParaNo: Integer        read FNextParaNo  write FNextParaNo default -1;
  1017.     property DefStyleNo: Integer        read FDefStyleNo  write FDefStyleNo default -1;
  1018.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1019.     property ModifiedProperties1: TRVParaInfoProperties1
  1020.       read FModifiedProperties1 write FModifiedProperties1 default [];
  1021.     property ModifiedProperties2: TRVParaInfoProperties2
  1022.       read FModifiedProperties2 write FModifiedProperties2 default [];
  1023.     {$ENDIF}
  1024.   end;
  1025.   { ---------------------------------------------------------------------------
  1026.     TParaInfos: collection of paragraph styles (of TParaInfo), TRVStyle.ParaStyles
  1027.     Properties:
  1028.     - Items[] - items
  1029.     - InvalidItem - returned when accessing item with invalid index
  1030.   }
  1031.   TParaInfos = class(TCustomRVInfos)
  1032.   private
  1033.     FInvalidItem: TParaInfo;
  1034.     function GetItem(Index: Integer): TParaInfo;
  1035.     procedure SetItem(Index: Integer; Value: TParaInfo);
  1036.     function GetInvalidItem: TParaInfo;
  1037.     procedure SetInvalidItem(const Value: TParaInfo);
  1038.   public
  1039.     function Add: TParaInfo;
  1040.     procedure AssignTo(Dest: TPersistent); override;
  1041.     destructor Destroy; override;
  1042.     {$IFNDEF RVDONOTUSEINI}
  1043.     procedure SaveToINI(ini: TRVIniFile; const Section: String);
  1044.     procedure LoadFromINI(ini: TRVIniFile; const Section: String);
  1045.     {$ENDIF}
  1046.     function FindSuchStyle(BaseStyle: Integer; Style: TParaInfo;
  1047.       Mask: TRVParaInfoProperties): Integer;
  1048.     function FindStyleWithAlignment(BaseStyle: Integer;
  1049.       Alignment: TRVAlignment): Integer;
  1050.     property Items[Index: Integer]: TParaInfo
  1051.       read GetItem write SetItem; default;
  1052.     property InvalidItem: TParaInfo read GetInvalidItem write SetInvalidItem;
  1053.   end;
  1054.   { ---------------------------------------------------------------------------
  1055.     TRVMarkerFont: font for paragraph marker.
  1056.     Overrides default values of properties (to Arial, 8pt)
  1057.   }
  1058.   TRVMarkerFont = class (TFont)
  1059.   private
  1060.     function StoreName: Boolean;
  1061.     function StoreHeight: Boolean;
  1062.   public
  1063.     constructor Create;
  1064.     function IsEqual(Font: TFont): Boolean;
  1065.     function IsDefault: Boolean;
  1066.   published
  1067.     {$IFDEF RICHVIEWCBDEF3}
  1068.     property Charset default DEFAULT_CHARSET;
  1069.     {$ENDIF}
  1070.     property Color default clWindowText;
  1071.     property Name stored StoreName;
  1072.     property Style default [];
  1073.     property Height stored StoreHeight;
  1074.   end;
  1075.   { ---------------------------------------------------------------------------
  1076.     TRVListLevel: level of paragraph bullets/numbering. Item of collection
  1077.     RVListInfo.Levels (collection type is TRVListLevelCollection)
  1078.     Properties:
  1079.     - ListType - type of bullets/numbering, see TRVListType
  1080.     - StartFrom - level numbering starts from this value
  1081.     - ImageList, ImageIndex - used if ListType = rvlstImageList or
  1082.       rvlstImageListCounter
  1083.     - FormatString - format string for ListType = rvlstBullet or text numbering
  1084.     - FormatStringW - text, used if ListType = rvlstUnicodeBullet
  1085.     - LeftIndent - left indent (right indent for RTL paragraphs), pixels;
  1086.       overrides setting for paragraph
  1087.     - FirstIndent - first line indent, pixels; added to left indent,
  1088.       overrides setting for paragraph
  1089.     - MarkerIndent - indent of list marker, pixels (see also MarkerAlignment)
  1090.     - MarkerAlignment - alignment of list marker relative to position specified
  1091.       in MarkerIndent
  1092.     - Picture - used if ListType = rvlstPicture
  1093.     - Font - font of list marker, used for text list types
  1094.     - Options - see TRVListLevelOptions
  1095.   }
  1096.   TRVListLevel = class (TCollectionItem)
  1097.   private
  1098.     FListType: TRVListType;
  1099.     FPicture: TPicture;
  1100.     FImageList: TCustomImageList;
  1101.     FImageIndex: Integer;
  1102.     FFormatString: TRVMarkerFormatString;
  1103.     {$IFNDEF RVDONOTUSEUNICODE}
  1104.     {$IFDEF RICHVIEWCBDEF3}
  1105.     FFormatStringW: TRVMarkerFormatStringW;
  1106.     {$ENDIF}
  1107.     {$ENDIF}
  1108.     FLeftIndent, FFirstIndent, FMarkerIndent: Integer;
  1109.     FMarkerAlignment: TRVMarkerAlignment;
  1110.     FFont: TRVMarkerFont;
  1111.     FOptions: TRVListLevelOptions;
  1112.     FStartFrom: Integer;
  1113.     function GetPicture: TPicture;
  1114.     procedure SetPicture(const Value: TPicture);
  1115.     function GetFont: TRVMarkerFont;
  1116.     procedure SetFont(const Value: TRVMarkerFont);
  1117.     function StoreFont: Boolean;
  1118.     function StorePicture: Boolean;
  1119.     procedure ImageListTagWriter(Writer: TWriter);
  1120.     procedure ImageListTagReader(Reader: TReader);
  1121.     {$IFNDEF RVDONOTUSEUNICODE}
  1122.     {$IFDEF RICHVIEWCBDEF3}
  1123.     procedure FormatStringWCodeWriter(Writer: TWriter);
  1124.     procedure FormatStringWCodeReader(Reader: TReader);
  1125.     {$ENDIF}
  1126.     {$ENDIF}
  1127.     procedure FormatStringCodeWriter(Writer: TWriter);
  1128.     procedure FormatStringCodeReader(Reader: TReader);
  1129.     function StoreImageList: Boolean;
  1130.     function GetRVFRVData: TPersistent;
  1131.   protected
  1132.     {$IFDEF RICHVIEWCBDEF3}
  1133.     function GetDisplayName: String; override;
  1134.     {$ENDIF}
  1135.     function IsSimpleEqual(Value: TRVListLevel): Boolean;
  1136.     procedure DefineProperties(Filer: TFiler); override;
  1137.     function SimilarityValue(Value: TRVListLevel): Integer;
  1138.   public
  1139.     constructor Create(Collection: TCollection); override;
  1140.     destructor Destroy; override;
  1141.     procedure Assign(Source: TPersistent); override;
  1142.     function GetHTMLOpenTagForCSS: String;
  1143.     function GetIndentCSSForTextVersion: String;
  1144.     procedure HTMLOpenTag(Stream: TStream; UseCSS: Boolean);
  1145.     procedure HTMLCloseTag(Stream: TStream; UseCSS: Boolean);
  1146.     function HasPicture: Boolean;
  1147.     function UsesFont: Boolean;
  1148.     function HasNumbering: Boolean;
  1149.     function HasVariableWidth: Boolean;
  1150.     {$IFNDEF RVDONOTUSEINI}
  1151.     procedure SaveToINI(ini: TRVIniFile; const Section, fs: String);
  1152.     procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String);
  1153.     {$ENDIF}
  1154.   published
  1155.     property ListType: TRVListType read FListType write FListType default rvlstBullet;
  1156.     property StartFrom: Integer read FStartFrom write FStartFrom default 1;
  1157.     property ImageList: TCustomImageList read FImageList write FImageList stored StoreImageList;
  1158.     property ImageIndex: Integer read FImageIndex write FImageIndex default 0;
  1159.     property FormatString: TRVMarkerFormatString read FFormatString write FFormatString stored False;
  1160.     {$IFNDEF RVDONOTUSEUNICODE}
  1161.     {$IFDEF RICHVIEWCBDEF3}
  1162.     property FormatStringW: TRVMarkerFormatStringW read FFormatStringW write FFormatStringW stored False;
  1163.     {$ENDIF}
  1164.     {$ENDIF}
  1165.     property LeftIndent: Integer read FLeftIndent write FLeftIndent default 0;
  1166.     property FirstIndent: Integer read FFirstIndent write FFirstIndent default 10;
  1167.     property MarkerIndent: Integer read FMarkerIndent write FMarkerIndent default 0;
  1168.     property MarkerAlignment: TRVMarkerAlignment read FMarkerAlignment write FMarkerAlignment default rvmaLeft;
  1169.     property Picture: TPicture read GetPicture write SetPicture stored StorePicture;
  1170.     property Font: TRVMarkerFont read GetFont write SetFont stored StoreFont;
  1171.     property Options: TRVListLevelOptions read FOptions write FOptions default [rvloContinuous, rvloLevelReset];
  1172.   end;
  1173.   { ---------------------------------------------------------------------------
  1174.     TRVListLevelCollection: collection of levels of paragraph bullets/numbering.
  1175.     A type of TRVListInfo.Levels. Type of collection item is TRVListLevel
  1176.     Properties:
  1177.     Items[] - list levels
  1178.   }
  1179.   TRVListLevelCollection = class (TCollection)
  1180.   private
  1181.     FOwner: TPersistent;
  1182.     function GetItem(Index: Integer): TRVListLevel;
  1183.     procedure SetItem(Index: Integer; const Value: TRVListLevel);
  1184.   public
  1185.     constructor Create(Owner: TPersistent);
  1186.     {$IFDEF RICHVIEWCBDEF3}
  1187.     function GetOwner: TPersistent;  override;
  1188.     {$ENDIF}
  1189.     function Add: TRVListLevel;
  1190.     {$IFDEF RICHVIEWDEF4}
  1191.     function Insert(Index: Integer): TRVListLevel;
  1192.     {$ENDIF}
  1193.     function IsSimpleEqual(Value: TRVListLevelCollection): Boolean;
  1194.     property Items[Index: Integer]: TRVListLevel
  1195.        read GetItem write SetItem; default;
  1196.   end;
  1197.   {----------------------------------------------------------------------------
  1198.     TRVListInfo: style of paragraph bullets/numbering, item in the collection
  1199.     TRVStyle.ListStyles (collection type is TRVListInfos)
  1200.     Properties:
  1201.     - Levels[] - collection of list levels; must have at least one item in
  1202.       order to display bullet/numbering
  1203.     - OneLevelPreview - for using in user interface (if True, preview
  1204.       of this paragraph list should show only one level)
  1205.     - ListID (read-only) - a random number for distinguishing lists with the same
  1206.       properties when pasting RVF
  1207.   }
  1208.   TRVListInfo = class (TCustomRVInfo)
  1209.   private
  1210.     FLevels: TRVListLevelCollection;
  1211.     FOneLevelPreview: Boolean;
  1212.     FListID: Integer;
  1213.     procedure SetLevels(const Value: TRVListLevelCollection);
  1214.     function GetListID: Integer;
  1215.     procedure ReadListID(Reader: TReader);
  1216.     procedure WriteListID(Writer: TWriter);
  1217.   protected
  1218.     function SimilarityValue(Value: TCustomRVInfo): Integer; override;
  1219.     procedure DefineProperties(Filer: TFiler); override;
  1220.   public
  1221.     function IsSimpleEqual(Value: TCustomRVInfo; IgnoreReferences: Boolean;
  1222.       IgnoreID: Boolean{$IFDEF RICHVIEWDEF4}=True{$ENDIF}): Boolean; override;
  1223.     function IsSimpleEqualEx(Value: TCustomRVInfo; Mapping: TRVIntegerList): Boolean; override;
  1224.     constructor Create(Collection: TCollection); override;
  1225.     destructor Destroy; override;
  1226.     procedure Assign(Source: TPersistent); override;
  1227.     {$IFNDEF RVDONOTUSEINI}
  1228.     procedure SaveToINI(ini: TRVIniFile; const Section, fs: String); dynamic;
  1229.     procedure LoadFromINI(ini: TRVIniFile; const Section, fs: String); dynamic;
  1230.     {$ENDIF}
  1231.     function HasNumbering: Boolean;
  1232.     function AllNumbered: Boolean;
  1233.     function HasVariableWidth: Boolean;
  1234.     property ListID: Integer read GetListID;
  1235.   published
  1236.     property Levels: TRVListLevelCollection read FLevels write SetLevels;
  1237.     property OneLevelPreview: Boolean read FOneLevelPreview write FOneLevelPreview default False;
  1238.   end;
  1239.   { ---------------------------------------------------------------------------
  1240.     TRVListInfos: collection of styles of paragraph lists (of TRVListInfo),
  1241.     TRVStyle.ListStyles
  1242.     Properties:
  1243.     - Items[] - items
  1244.   }
  1245.   TRVListInfos = class (TCustomRVInfos)
  1246.   private
  1247.     function GetItem(Index: Integer): TRVListInfo;
  1248.     procedure SetItem(Index: Integer; const Value: TRVListInfo);
  1249.     procedure RemoveImageList(ImageList: TCustomImageList);
  1250.   public
  1251.     FRVData: TPersistent;
  1252.     function Add: TRVListInfo;
  1253.     {$IFDEF RICHVIEWDEF4}
  1254.     function Insert(Index: Integer): TRVListInfo;
  1255.     {$ENDIF}
  1256.     {$IFNDEF RVDONOTUSEINI}
  1257.     procedure LoadFromINI(ini: TRVIniFile; const Section: String);
  1258.     procedure SaveToINI(ini: TRVIniFile; const Section: String);
  1259.     {$ENDIF}
  1260.     function FindSuchStyle(Style: TRVListInfo; AddIfNotFound: Boolean): Integer;
  1261.     function FindStyleWithLevels(Levels: TRVListLevelCollection;
  1262.       const StyleNameForAdding: String; AddIfNotFound: Boolean): Integer;
  1263.     property Items[Index: Integer]: TRVListInfo
  1264.        read GetItem write SetItem; default;
  1265.   end;
  1266.   TRVFontInfoClass = class of TFontInfo;
  1267.   TRVParaInfoClass = class of TParaInfo;
  1268.   TRVListInfoClass = class of TRVListInfo;
  1269.   {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1270.   { ---------------------------------------------------------------------------
  1271.     TRVSTFontInfo, TRVSTParaInfo, TRVSTListInfo: classes for properties of
  1272.     TRVStyleTemplate. Hide some properties.
  1273.   }
  1274.   TRVSTFontInfo = class (TCustomRVFontInfo)
  1275.   private
  1276.     {$IFDEF RICHVIEWCBDEF3}
  1277.     FOwner: TPersistent;
  1278.     {$ENDIF}
  1279.     procedure SetNoProp(const Value: Integer);
  1280.   public
  1281.     {$IFDEF RICHVIEWCBDEF3}
  1282.     function GetOwner: TPersistent; override;
  1283.     {$ENDIF}
  1284.   published
  1285.     property StyleTemplateId: Integer write SetNoProp;
  1286.     property StyleName: Integer write SetNoProp;
  1287.     property Standard: Integer write SetNoProp;
  1288.     property BaseStyleNo: Integer write SetNoProp;
  1289.   end;
  1290.   TRVSTParaInfo = class (TCustomRVParaInfo)
  1291.   private
  1292.     {$IFDEF RICHVIEWCBDEF3}
  1293.     FOwner: TPersistent;
  1294.     {$ENDIF}
  1295.     procedure SetNoProp(const Value: Integer);
  1296.   public
  1297.     {$IFDEF RICHVIEWCBDEF3}
  1298.     function GetOwner: TPersistent; override;
  1299.     {$ENDIF}
  1300.   published
  1301.     property StyleTemplateId: Integer write SetNoProp;
  1302.     property StyleName: Integer write SetNoProp;
  1303.     property Standard: Integer write SetNoProp;
  1304.     property BaseStyleNo: Integer write SetNoProp;
  1305.   end;
  1306.   TRVSTListInfo = class (TRVListInfo)
  1307.   private
  1308.     {$IFDEF RICHVIEWCBDEF3}
  1309.     FOwner: TPersistent;
  1310.     {$ENDIF}
  1311.     procedure SetNoProp(const Value: Integer);
  1312.   public
  1313.     {$IFDEF RICHVIEWCBDEF3}
  1314.     function GetOwner: TPersistent; override;
  1315.     {$ENDIF}
  1316.   published
  1317.     property StyleTemplateId: Integer write SetNoProp;
  1318.     property StyleName: Integer write SetNoProp;
  1319.     property Standard: Integer write SetNoProp;
  1320.     property BaseStyleNo: Integer write SetNoProp;
  1321.   end;
  1322.   TRVStyleTemplate = class (TCollectionItem)
  1323.   private
  1324.     FName: TRVStyleTemplateName;
  1325.     FId: TRVStyleTemplateId;
  1326.     FParentId: TRVStyleTemplateId;
  1327.     FTextStyle: TRVSTFontInfo;
  1328.     FParaStyle: TRVSTParaInfo;
  1329.     FListStyle: TRVSTListInfo;
  1330.     FValidTextProperties: TRVFontInfoProperties;
  1331.     FValidParaProperties1: TRVParaInfoProperties1;
  1332.     FValidParaProperties2: TRVParaInfoProperties2;
  1333.     FParent: TRVStyleTemplate;
  1334.     FChildren: TList;
  1335.     function GetId: TRVStyleTemplateId;
  1336.     procedure SetTextStyle(const Value: TRVSTFontInfo);
  1337.     // procedure SetListStyle(const Value: TRVSTListInfo);
  1338.     procedure SetParaStyle(const Value: TRVSTParaInfo);
  1339.     procedure ReadID(Reader: TReader);
  1340.     procedure WriteID(Writer: TWriter);
  1341.     procedure AddChild(Child: TRVStyleTemplate);
  1342.     procedure RemoveChild(Child: TRVStyleTemplate);
  1343.     procedure SetParentId(const Value: TRVStyleTemplateId);
  1344.     procedure UpdateParentReference;
  1345.     procedure SetName(const Value: TRVStyleTemplateName);
  1346.   protected
  1347.     procedure DefineProperties(Filer: TFiler); override;
  1348.     function AssignToTextStyle(ATextStyle: TCustomRVFontInfo;
  1349.       AllowedProps: TRVFontInfoProperties): TRVFontInfoProperties;
  1350.     function AssignToParaStyle(AParaStyle: TCustomRVParaInfo;
  1351.       AllowedProps: TRVParaInfoProperties): TRVParaInfoProperties;
  1352.     procedure AssignTo(Dest: TPersistent); override;
  1353.   public
  1354.     constructor Create(Collection: TCollection); override;
  1355.     destructor Destroy; override;
  1356.     {$IFDEF RICHVIEWCBDEF3}
  1357.     function GetDisplayName: String; override;
  1358.     {$ENDIF}
  1359.     procedure Assign(Source: TPersistent); override;
  1360.     function IsAncestorFor(StyleTemplate: TRVStyleTemplate): Boolean;
  1361.     procedure ExcludeUnmodifiedTextStyleProperties(ATextStyle: TFontInfo;
  1362.       PossibleProps: TRVFontInfoProperties);
  1363.     procedure ExcludeUnmodifiedParaStyleProperties(AParaStyle: TParaInfo;
  1364.       PossibleProps: TRVParaInfoProperties);
  1365.     procedure ApplyToTextStyle(ATextStyle: TCustomRVFontInfo;
  1366.       AParaStyle: TCustomRVParaInfo; OverrideModifiedProperties: Boolean);
  1367.     procedure ApplyToParaStyle(AParaStyle: TCustomRVParaInfo;
  1368.       OverrideModifiedProperties: Boolean);      
  1369.   published
  1370.     property TextStyle: TRVSTFontInfo read FTextStyle write SetTextStyle;
  1371.     property ParaStyle: TRVSTParaInfo read FParaStyle write SetParaStyle;
  1372.     // property ListStyle: TRVSTListInfo read FListStyle write SetListStyle;
  1373.     property ValidTextProperties: TRVFontInfoProperties
  1374.       read FValidTextProperties write FValidTextProperties default [];
  1375.     property ValidParaProperties1: TRVParaInfoProperties1
  1376.       read FValidParaProperties1 write FValidParaProperties1 default [];
  1377.     property ValidParaProperties2: TRVParaInfoProperties2
  1378.       read FValidParaProperties2 write FValidParaProperties2 default [];
  1379.     property Name: TRVStyleTemplateName read FName write SetName;
  1380.     property Id: TRVStyleTemplateId read GetId;
  1381.     property ParentId: TRVStyleTemplateId read FParentId write SetParentId default -1;
  1382.   end;
  1383.   TRVStyleTemplateCollection = class (TCollection)
  1384.   private
  1385.     FNameCounter: Integer;
  1386.     FDefStyleName: String;
  1387.     FNormalStyleTemplate: TRVStyleTemplate;
  1388.     function GetItem(Index: Integer): TRVStyleTemplate;
  1389.     procedure SetItem(Index: Integer; const Value: TRVStyleTemplate);
  1390.     procedure AssignUniqueNameTo(Item: TRVStyleTemplate);
  1391.     function StoreDefStyleName: Boolean;
  1392.     procedure UpdateParentReferences;
  1393.   protected
  1394.     FOwner: TPersistent;
  1395.   public
  1396.     constructor Create(Owner: TPersistent);
  1397.     procedure ResetNameCounter;
  1398.     procedure Sort;
  1399.     function FindById(Id: TRVStyleTemplateId): Integer;
  1400.     function FindByName(const Name: TRVStyleTemplateName): Integer;
  1401.     function GetNormalStyleTemplate: TRVStyleTemplate;
  1402.     procedure AssignToStrings(Strings: TStrings; AssignObjects: Boolean);
  1403.     procedure Assign(Source: TPersistent); override;
  1404.     procedure AssignStyleTemplates(Source: TRVStyleTemplateCollection; CopyIds: Boolean);
  1405.     procedure ClearParaFormat(AParaStyle: TCustomRVParaInfo);
  1406.     procedure ClearTextFormat(ATextStyle: TCustomRVFontInfo; AParaStyle: TCustomRVParaInfo);
  1407.     {$IFDEF RICHVIEWCBDEF3}
  1408.     function GetOwner: TPersistent; override;
  1409.     {$ENDIF}
  1410.     property Items[Index: Integer]: TRVStyleTemplate read GetItem write SetItem; default;
  1411.   published
  1412.     property DefStyleName: String read FDefStyleName write FDefStyleName stored StoreDefStyleName;
  1413.   end;
  1414.   {$ENDIF}
  1415.   { ---------------------------------------------------------------------------
  1416.     TRVStyle: component. Contains properties affecting TCustomRichView.
  1417.     Assign TCustomRichView.Style to TRVStyle object.
  1418.     Properties:
  1419.     - TextStyles - collection of text styles, see TFontInfos, TFontInfo
  1420.     - ParaStyles - collection of paragraph styles, see TParaInfos, TParaInfo
  1421.     - ListStyles - collection of styles of paragraph lists, see TRVListInfos,
  1422.       TRVListInfo
  1423.     - SpacesInTab - a number of space characters used to replace TAB;
  1424.       If zero, TABs will not be replaced but inserted as a special item type.
  1425.     - DefTabWidth - default tab width for the document
  1426.     - JumpCursor - hypertext cursor for non-text items ("hot-pictures",
  1427.       "hotspots")
  1428.     - LineSelectCursor - cursor for line selection (when mouse pointer is
  1429.       above the left margin of RichView
  1430.     - Color - background color, if TCustomRichView.Color = clNone
  1431.     - HoverColor - color of hypertext under mouse (if TFontInfo.HoverColor =
  1432.       clNone), clNone for no effect.
  1433.     - CurrentItemColor - color of border around current image or control in
  1434.       editor. clNone for no effect.
  1435.     - SelColor - background color of selection, clNone for invisible selection
  1436.       (i.s.). Used if TCustomRichView has input focus.
  1437.     - SelTextColor -  color of selected text, clNone for i.s. Used if
  1438.       TCustomRichView has input focus.
  1439.     - InactiveSelColor - background color of selection, clNone for i.s. Used if
  1440.       TCustomRichView does not have input focus.
  1441.     - InactiveSelTextColor - color of selected text, clNone for i.s. Used if
  1442.       TCustomRichView does not have input focus.
  1443.     - CheckpointColor - color of "checkpoints"; used if rvoShowCheckpoints is
  1444.       in TCustomRichView.Options. For "checkpoints" with no "raise-event" flag
  1445.     - CheckpointEvColor - the same, but for "checkpoints" with "raise-event"
  1446.       flag
  1447.     - PageBreakColor - color of explicit page breaks. Used if rvoShowPageBreaks
  1448.       is in TCustomRichView.Options.
  1449.     - SoftPageBreakColor - the same for "soft" (automatic) page breaks
  1450.     - LiveSpellingColor - color of live spelling underline 
  1451.     - SelectionMode: mode of making selection, see TRVSelectionMode
  1452.     - SelectionStyle: visual appearance of selection, see TRVSelectionStyle
  1453.     - FullRedraw - (see the help file)
  1454.     - UseSound - allows beeping on incorrect operations (such as attempting
  1455.       deleting protected text)
  1456.     - DefUnicodeStyle - index (in TextStyles) of style that should be used
  1457.       for Unicode (if Unicode operation is performed in TCustomRichViewEdit
  1458.       but the current style is not Unicode). -1 for no special processing.
  1459.     - DefCodePage - code page for ANSI <-> Unicode conversion
  1460.     - InvalidPicture - picture to replace invalid/damaged pictures
  1461.     Events:
  1462.     - OnApplyStyle: TRVApplyStyleEvent - allows to set additional properties
  1463.       to Canvas then applying text style (by default font, spacing, bidi-mode
  1464.       are set)
  1465.     - OnApplyStyleColor: TRVApplyStyleColorEvent - allows to override color
  1466.       applied to Canvas's font and brush then applying text style
  1467.     - OnDrawStyleText: TRVDrawStyleTextEvent - event for text custom drawing
  1468.     - OnStyleHoverSensitive - asks, if the text should be redrawn when mouse
  1469.       enters/leaves it; used for custom drawing
  1470.     - OnDrawTextBack: TRVDrawTextBackEvent - event for text custom drawing
  1471.       (drawing text background)
  1472.     - OnDrawCheckpoint: TRVDrawCheckpointEvent - allows to override default
  1473.       drawing of "checkpoints"
  1474.     - OnDrawPageBreak: TRVDrawPageBreakEvent - allows to override default
  1475.       drawing of page breaks
  1476.     - OnDrawParaBack: TRVDrawParaRectEvent - custom drawing of paragraph
  1477.       background
  1478.   }
  1479.   TRVStyle = class(TComponent)
  1480.   private
  1481.     { Private declarations }
  1482.     FInvalidPicture: TPicture;
  1483.     FColor, FHoverColor, FCurrentItemColor, FSelColor, FSelTextColor,
  1484.     FInactiveSelColor, FInactiveSelTextColor,
  1485.     FCheckpointColor, FCheckpointEvColor: TColor;
  1486.     FJumpCursor: TCursor;
  1487.     FTextStyles: TFontInfos;
  1488.     FParaStyles: TParaInfos;
  1489.     FListStyles: TRVListInfos;
  1490.     FFullRedraw: Boolean;
  1491.     FSpacesInTab: Integer;
  1492.     FDefTabWidth: Integer;
  1493.     FPageBreakColor, FSoftPageBreakColor: TColor;
  1494.     FLiveSpellingColor: TColor;
  1495.     FOnApplyStyleColor: TRVApplyStyleColorEvent;
  1496.     FOnApplyStyle: TRVApplyStyleEvent;
  1497.     FOnDrawStyleText: TRVDrawStyleTextEvent;
  1498.     FOnStyleHoverSensitive: TRVStyleHoverSensitiveEvent;
  1499.     FOnDrawTextBack: TRVDrawTextBackEvent;
  1500.     FOnDrawCheckpoint: TRVDrawCheckpointEvent;
  1501.     FOnDrawPageBreak: TRVDrawPageBreakEvent;
  1502.     FOnDrawParaBack: TRVDrawParaRectEvent;
  1503.     {$IFNDEF RVDONOTUSEUNICODE}
  1504.     FDefUnicodeStyle: Integer;
  1505.     {$ENDIF}
  1506.     FDefCodePage:TRVCodePage;
  1507.     FUseSound: Boolean;
  1508.     FSelectionMode: TRVSelectionMode;
  1509.     FSelectionStyle: TRVSelectionStyle;
  1510.     FLineSelectCursor: TCursor;
  1511.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1512.     FStyleTemplates: TRVStyleTemplateCollection;
  1513.     {$ENDIF}
  1514.     procedure SetTextStyles(Value: TFontInfos);
  1515.     procedure SetParaStyles(Value: TParaInfos);
  1516.     procedure SetListStyles(Value: TRVListInfos);
  1517.     function GetHoverColorByColor(Color: TColor): TColor;
  1518.     function GetInvalidPicture: TPicture;
  1519.     procedure SetInvalidPicture(const Value: TPicture);
  1520.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1521.     procedure SetStyleTemplates(const Value: TRVStyleTemplateCollection);
  1522.     {$ENDIF}
  1523.   protected
  1524.     { Protected declarations }
  1525.     procedure ReadState(Reader: TReader);override;
  1526.     procedure Notification(AComponent: TComponent;
  1527.       Operation: TOperation); override;
  1528.     procedure Loaded; override;
  1529.   public
  1530.     ItemNo, OffsetInItem: Integer;
  1531.     RVData: TPersistent;
  1532.     procedure ResetTextStyles;
  1533.     procedure ResetParaStyles;
  1534.     { Public declarations }
  1535.     constructor Create(AOwner: TComponent); override;
  1536.     destructor Destroy; override;
  1537.     function GetTextStyleClass: TRVFontInfoClass; virtual;
  1538.     function GetParaStyleClass: TRVParaInfoClass; virtual;
  1539.     function GetListStyleClass: TRVListInfoClass; virtual;
  1540.     procedure GetNextTab(ParaNo, X: Integer; sad: TRVScreenAndDevice;
  1541.       var Position: Integer; var Leader: String; var Align: TRVTabAlign;
  1542.       DefBiDiMode: TRVBiDiMode; LeftIndent, RightIndent: Integer);
  1543.     function AddTextStyle: Integer; {$IFDEF RICHVIEWDEF6}deprecated;{$ENDIF}
  1544.     procedure DeleteTextStyle(Index: Integer); {$IFDEF RICHVIEWDEF6}deprecated;{$ENDIF}
  1545.     {$IFNDEF RVDONOTUSEINI}    
  1546.     procedure SaveINI(const FileName, Section: String); {WARNING: before saving all Section will be removed}
  1547.     procedure LoadINI(const FileName, Section: String);
  1548.     procedure SaveToINI(ini: TRVIniFile; Section: String);
  1549.     procedure LoadFromINI(ini: TRVIniFile; Section: String);
  1550.     {$IFDEF RICHVIEWDEF4}
  1551.     procedure SaveReg(const BaseKey: String); {WARNING: will be created 'RVStyle' subkey. If it
  1552.                                                already exists, all data and subkeys in this 'RVStyle'
  1553.                                                key will be erased}
  1554.     procedure LoadReg(const BaseKey: String);
  1555.     {$ENDIF}
  1556.     {$ENDIF}
  1557.     {$IFNDEF RVDONOTUSEHTML}
  1558.     procedure SaveCSSToStream(Stream: TStream; AOptions: TRVSaveCSSOptions);
  1559.     function SaveCSS(const FileName: String; AOptions: TRVSaveCSSOptions): Boolean;
  1560.     {$ENDIF}
  1561.     function GetHoverColor(StyleNo: Integer): TColor;
  1562.     procedure DrawTextBack(Canvas: TCanvas; ItemNo, StyleNo: Integer;
  1563.       RVData: TPersistent; Left, Top, Width, Height: Integer;
  1564.       DrawState: TRVTextDrawStates);
  1565.     procedure ApplyStyle(Canvas: TCanvas; StyleNo: Integer;
  1566.       DefBiDiMode: TRVBiDiMode; CanUseCustomPPI: Boolean);
  1567.     procedure ApplyStyleColor(Canvas: TCanvas; StyleNo: Integer;
  1568.       DrawState: TRVTextDrawStates; Printing: Boolean; ColorMode: TRVColorMode);
  1569.     procedure DrawStyleText(const s: String; Canvas: TCanvas;
  1570.       ItemNo, OffsetInItem, StyleNo: Integer; RVData: TPersistent;
  1571.       SpaceBefore, Left, Top, Width, Height: Integer;
  1572.       DrawState: TRVTextDrawStates; Printing, PreviewCorrection: Boolean;
  1573.       ColorMode: TRVColorMode; DefBiDiMode: TRVBidiMode);
  1574.     procedure DrawCheckpoint(Canvas: TCanvas; X,Y, AreaLeft, Width: Integer;
  1575.       RVData: TPersistent; ItemNo, XShift: Integer;
  1576.       RaiseEvent: Boolean; Control: TControl);
  1577.     procedure DrawPageBreak(Canvas: TCanvas; Y, XShift: Integer;
  1578.       PageBreakType: TRVPageBreakType; Control: TControl);
  1579.     procedure DrawParaBack(Canvas: TCanvas; ParaNo: Integer; const Rect: TRect;
  1580.       Printing: Boolean; ColorMode: TRVColorMode);
  1581.     function StyleHoverSensitive(StyleNo: Integer): Boolean;
  1582.   published
  1583.     { Published declarations }
  1584.     property TextStyles:  TFontInfos read FTextStyles  write SetTextStyles;
  1585.     property ParaStyles:  TParaInfos read FParaStyles  write SetParaStyles;
  1586.     property ListStyles:  TRVListInfos read FListStyles write SetListStyles;
  1587.     property SpacesInTab: Integer     read FSpacesInTab write FSpacesInTab   default 0;
  1588.     property DefTabWidth: Integer     read FDefTabWidth write FDefTabWidth   default 48;
  1589.     property JumpCursor:  TCursor    read FJumpCursor  write FJumpCursor    default crJump;
  1590.     property LineSelectCursor: TCursor read FLineSelectCursor write FLineSelectCursor default crRVFlipArrow;
  1591.     property FullRedraw:  Boolean    read FFullRedraw  write FFullRedraw    default False;
  1592.     property UseSound:    Boolean    read FUseSound    write FUseSound      default True;
  1593.     property Color:             TColor     read FColor             write FColor             default clWindow;
  1594.     property HoverColor:        TColor     read FHoverColor        write FHoverColor        default clNone;
  1595.     property CurrentItemColor:  TColor     read FCurrentItemColor  write FCurrentItemColor  default clNone;
  1596.     property SelColor:          TColor     read FSelColor          write FSelColor          default clHighlight;
  1597.     property SelTextColor:      TColor     read FSelTextColor      write FSelTextColor      default clHighlightText;
  1598.     property InactiveSelColor:     TColor  read FInactiveSelColor     write FInactiveSelColor      default clHighlight;
  1599.     property InactiveSelTextColor: TColor  read FInactiveSelTextColor write FInactiveSelTextColor  default clHighlightText;
  1600.     property CheckpointColor:   TColor     read FCheckpointColor   write FCheckpointColor   default clGreen;
  1601.     property CheckpointEvColor: TColor     read FCheckpointEvColor write FCheckpointEvColor default clLime;
  1602.     property PageBreakColor:    TColor     read FPageBreakColor    write FPageBreakColor    default clBtnShadow;
  1603.     property SoftPageBreakColor: TColor    read FSoftPageBreakColor  write FSoftPageBreakColor default clBtnFace;
  1604.     property LiveSpellingColor: TColor     read FLiveSpellingColor write FLiveSpellingColor default clRed;
  1605.     property SelectionMode: TRVSelectionMode read FSelectionMode write FSelectionMode default rvsmWord;
  1606.     property SelectionStyle: TRVSelectionStyle read FSelectionStyle write FSelectionStyle default rvssItems;    
  1607.     {$IFNDEF RVDONOTUSEUNICODE}
  1608.     property DefUnicodeStyle:   Integer    read FDefUnicodeStyle   write FDefUnicodeStyle   default -1;
  1609.     {$ENDIF}
  1610.     property DefCodePage:      TRVCodePage read FDefCodePage       write FDefCodePage       default CP_ACP;
  1611.     property InvalidPicture: TPicture      read GetInvalidPicture    write SetInvalidPicture;
  1612.     property OnApplyStyle: TRVApplyStyleEvent read FOnApplyStyle write FOnApplyStyle;
  1613.     property OnApplyStyleColor: TRVApplyStyleColorEvent read FOnApplyStyleColor write FOnApplyStyleColor;
  1614.     property OnDrawStyleText: TRVDrawStyleTextEvent read FOnDrawStyleText write FOnDrawStyleText;
  1615.     property OnStyleHoverSensitive: TRVStyleHoverSensitiveEvent read FOnStyleHoverSensitive write FOnStyleHoverSensitive;
  1616.     property OnDrawTextBack: TRVDrawTextBackEvent read FOnDrawTextBack write FOnDrawTextBack;
  1617.     property OnDrawCheckpoint: TRVDrawCheckpointEvent read FOnDrawCheckpoint write FOnDrawCheckpoint;
  1618.     property OnDrawPageBreak: TRVDrawPageBreakEvent read FOnDrawPageBreak write FOnDrawPageBreak;
  1619.     property OnDrawParaBack: TRVDrawParaRectEvent read FOnDrawParaBack write FOnDrawParaBack;
  1620.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1621.     property StyleTemplates: TRVStyleTemplateCollection read FStyleTemplates write SetStyleTemplates;
  1622.     {$ENDIF}
  1623.   end;
  1624.   procedure RVWrite(Stream: TStream; const s: String);
  1625.   procedure RVWriteLn(Stream: TStream; const s: String);
  1626.   procedure RVWriteX(Stream: TStream; const s: String; Multiline: Boolean);
  1627. const
  1628.   { default value for TCustomRichView.RTFOptions }
  1629.   rvrtfDefault: TRVRTFOptions =
  1630.     [rvrtfDuplicateUnicode, rvrtfSaveEMFAsWMF, rvrtfSaveJpegAsJpeg];
  1631.   { all properties of TFontInfo }
  1632.   RVAllFontInfoProperties: TRVFontInfoProperties =
  1633.     [Low(TRVFontInfoProperty)..High(TRVFontInfoProperty)];
  1634.   { all properties of TParaInfo }
  1635.   RVAllParaInfoProperties: TRVParaInfoProperties =
  1636.     [Low(TRVParaInfoProperty)..High(TRVParaInfoProperty)];
  1637.   { ...divided into 2 parts }
  1638.   RVAllParaInfoProperties1: TRVParaInfoProperties =
  1639.     [Low(TRVParaInfoProperty1)..High(TRVParaInfoProperty1)];
  1640.   RVAllParaInfoProperties2: TRVParaInfoProperties =
  1641.     [Low(TRVParaInfoProperty2)..High(TRVParaInfoProperty2)];
  1642.   { all properties of TRVBackgroundRect }
  1643.   RVAllParaBackgroundProperties: TRVParaInfoProperties =
  1644.     [rvpiBackground_Color..rvpiBackground_BO_Bottom];
  1645.   { all properties of TRVBorder }
  1646.   RVAllParaBorderProperties: TRVParaInfoProperties =
  1647.     [rvpiBorder_Color..rvpiBorder_Vis_Bottom];
  1648.   { If True, Standard properties of styles added from inserted RVF will
  1649.     be reset to False. }
  1650.   RichViewResetStandardFlag: Boolean = True;
  1651.   { If True, 'LstId' pseudo-property will not be saved when storing
  1652.     list styles in RVF. This pseudo-property allows smarter inserting RVF
  1653.     with lists, but does not allow aplications built with older version of
  1654.     TRichView to load new RVFs }
  1655.   RVNoLstIDProperty: Boolean = False;
  1656.   { If True, FindSuchStyle method take StyleName property into account when
  1657.     comparing styles }
  1658.   RichViewCompareStyleNames: Boolean = False;
  1659.   { Visible special characters }
  1660.   RVVisibleSpecialCharacters: TRVSpecialCharacters = [rvscSpace..rvscSoftHyphen];
  1661. implementation
  1662. uses RVUni, RVStr, CRVData, RVItem, RVFuncs, RVFMisc;
  1663. {==============================================================================}
  1664. {$IFNDEF RVDONOTUSEINI}
  1665. const arrNoYes: array [False..True] of String = (RVINIFILENO,RVINIFILEYES);
  1666. { Write integer Value to ini only if it is not equal to DefValue               }
  1667. procedure WriteIntToIniIfNE(ini: TRVIniFile; const Section, Key: String;
  1668.   Value, DefValue: Integer);
  1669. begin
  1670.   if Value<>DefValue then
  1671.     ini.WriteInteger(Section, Key, Value);
  1672. end;
  1673. {------------------------------------------------------------------------------}
  1674. { Write boolean Value to ini only if it is not equal to DefValue.
  1675.   Value is written as "Yes" or "No"                                            }
  1676. procedure WriteBoolToIniIfNE(ini: TRVIniFile; const Section, Key: String;
  1677.                                Value, DefValue: Boolean);
  1678. begin
  1679.   if Value<>DefValue then
  1680.     ini.WriteString(Section, Key, arrNoYes[Value]);
  1681. end;
  1682. {------------------------------------------------------------------------------}
  1683. { Read boolean value ("Yes"/"No" from ini                                      }
  1684. function IniReadBool(ini: TRVIniFile; const Section, Key: String;
  1685.                         DefValue: Boolean): Boolean;
  1686. begin
  1687.   Result := UpperCase(ini.ReadString(Section, Key, arrNoYes[DefValue]))=RVINIFILEYESU;
  1688. end;
  1689. {------------------------------------------------------------------------------}
  1690. { Writing long string to ini. String is splitted on parts by 500 characters.
  1691.   String is written in keys Key+'_'+number. Number is 0-based                  }
  1692. procedure WriteLongStringToINI(ini: TRVIniFile; const Section, Key, Value: String);
  1693. var l,i: Integer;
  1694.     s: String;
  1695. begin
  1696.   i := 0;
  1697.   l := 500;
  1698.   while l<Length(Value) do begin
  1699.     s := Copy(Value, l-500+1, 500);
  1700.     ini.WriteString(Section, Key+'_'+IntToStr(i), s);
  1701.     inc(i);
  1702.     inc(l,500);
  1703.   end;
  1704.   s := Copy(Value, l-500+1, Length(Value));
  1705.   if s<>'' then
  1706.     ini.WriteString(Section, Key+'_'+IntToStr(i), s);
  1707. end;
  1708. {------------------------------------------------------------------------------}
  1709. { Reading strings saved with WriteLongStringToINI                              }
  1710. function ReadLongStringFromINI(ini: TRVIniFile; const Section, Key: String): String;
  1711. var i: Integer;
  1712.     s: String;
  1713. begin
  1714.   Result := '';
  1715.   i := 0;
  1716.   while True do begin
  1717.     s := ini.ReadString(Section, Key+'_'+IntToStr(i), '');
  1718.     if s='' then
  1719.       break;
  1720.     Result := Result+s;
  1721.     inc(i);
  1722.   end;
  1723. end;
  1724. {------------------------------------------------------------------------------}
  1725. { Encoding font styles in string                                               }
  1726. function FontStylesToString(Styles: TFontStyles): String;
  1727. begin
  1728.   Result := '';
  1729.   if fsBold in Styles then
  1730.     Result := Result + 'B';
  1731.   if fsItalic in Styles then
  1732.     Result := Result + 'I';
  1733.   if fsUnderline in Styles then
  1734.     Result := Result + 'U';
  1735.   if fsStrikeOut in Styles then
  1736.     Result := Result + 'S';
  1737. end;
  1738. {------------------------------------------------------------------------------}
  1739. { Decoding string in font styles                                               }
  1740. function StringToFontStyles(const Styles: string): TFontStyles;
  1741. var i: Integer;
  1742. begin
  1743.   Result := [];
  1744.   for i := 1 to Length(Styles) do
  1745.     case Styles[i] of
  1746.       'B','b':
  1747.         Include(Result, fsBold);
  1748.       'I','i':
  1749.         Include(Result, fsItalic);
  1750.       'U','u':
  1751.         Include(Result, fsUnderline);
  1752.       'S','s':
  1753.         Include(Result, fsStrikeOut);
  1754.     end;
  1755. end;
  1756. {------------------------------------------------------------------------------}
  1757. { Encoding font in string like "Arial,8,BI,0,clWindowText,0"                   }
  1758. function FontToString(Font: TFont): String;
  1759. begin
  1760.   with Font do
  1761.     Result := Format('%s,%d,%s,%d,%s,%d', [Name, Height,
  1762.       FontStylesToString(Style), Ord(Pitch), ColorToString(Color),
  1763.       {$IFDEF RICHVIEWCBDEF3} Charset {$ELSE} 0 {$ENDIF}]);
  1764. end;
  1765. {------------------------------------------------------------------------------}
  1766. { Decoding string created with FontToString                                    }
  1767. procedure StringToFont(const s: string; Font: TFont);
  1768. var
  1769.   i,j, State: Integer;
  1770.   s2: string;
  1771. begin
  1772.   i := 1;
  1773.   State := 1;
  1774.   while i<=Length(s) do begin
  1775.     j := i;
  1776.     while (j<=Length(s)) and (s[j]<>',') do
  1777.       inc(j);
  1778.     if (j<=Length(s)) and (s[j]=',') then begin
  1779.       s2 := Copy(s, i, j-i);
  1780.       i := j+1;
  1781.       end
  1782.     else begin
  1783.       s2 := Copy(s, i, j-i+1);
  1784.       i := j;
  1785.     end;
  1786.     case State of
  1787.       1: Font.Name := s2;
  1788.       2: Font.Height := StrToInt(s2);
  1789.       3: Font.Style := StringToFontStyles(s2);
  1790.       4: Font.Pitch := TFontPitch(StrToInt(s2));
  1791.       5: Font.Color := StringToColor(s2);
  1792.       {$IFDEF RICHVIEWCBDEF3}
  1793.       6: Font.Charset := TFontCharset(StrToInt(s2));
  1794.       {$ENDIF}
  1795.     end;
  1796.     inc(State);
  1797.   end;
  1798. end;
  1799. {$ENDIF}
  1800. {------------------------------------------------------------------------------}
  1801. { Are rectangles r1 and r2 equal? }
  1802. function AreRectsEqual(const r1,r2: TRect): Boolean;
  1803. begin
  1804.   Result := (r1.Left=r2.Left) and (r1.Top=r2.Top) and
  1805.     (r1.Bottom=r2.Bottom) and (r1.Right=r2.Right);
  1806. end;
  1807. {------------------------------------------------------------------------------}
  1808. procedure ScaleRect(var R: TRect; sad: TRVScreenAndDevice);
  1809. begin
  1810.   exit;
  1811.   R.Left   := MulDiv(R.Left,   sad.ppixDevice, sad.ppixScreen);
  1812.   R.Right  := MulDiv(R.Right,  sad.ppixDevice, sad.ppixScreen);
  1813.   R.Top    := MulDiv(R.Top,    sad.ppiyDevice, sad.ppiyScreen);
  1814.   R.Bottom := MulDiv(R.Bottom, sad.ppiyDevice, sad.ppiyScreen);
  1815. end;
  1816. (*
  1817. {------------------------------------------------------------------------------}
  1818. procedure IniSavePen(ini: TRVIniFile; const Section,Key: String; Pen: TPen;
  1819.                      DefStyle: TPenStyle; DefColor: TColor);
  1820. begin
  1821.   WriteIntToIniIfNE(ini, Section, Key+'Style', ord(Pen.Style), ord(DefStyle));
  1822.   WriteIntToIniIfNE(ini, Section, Key+'Color', Pen.Color,      DefColor);
  1823.   WriteIntToIniIfNE(ini, Section, Key+'Width', Pen.Width,      1);
  1824.   WriteIntToIniIfNE(ini, Section, Key+'Mode',  ord(Pen.Mode),  ord(pmCopy));
  1825. end;
  1826. {------------------------------------------------------------------------------}
  1827. procedure IniLoadPen(ini: TRVIniFile; const Section,Key: String; Pen: TPen;
  1828.                      DefStyle: TPenStyle; DefColor: TColor);
  1829. begin
  1830.   Pen.Style := TPenStyle(ini.ReadInteger(Section, Key+'Style', ord(DefStyle)));
  1831.   Pen.Color := ini.ReadInteger(Section, Key+'Color', DefColor);
  1832.   Pen.Width := ini.ReadInteger(Section, Key+'Width', 1);
  1833.   Pen.Mode  := TPenMode(ini.ReadInteger(Section, Key+'Mode', ord(pmCopy)));
  1834. end;
  1835. *)
  1836. {=========================== TCustomRVInfo ====================================}
  1837. { Constructor }
  1838. constructor TCustomRVInfo.Create(Collection: TCollection);
  1839. begin
  1840.   inherited Create(Collection);
  1841.   FBaseStyleNo  := -1;
  1842.   FStandard     := True;
  1843.   {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1844.   FStyleTemplateId := -1;
  1845.   {$ENDIF}
  1846. end;
  1847. {------------------------------------------------------------------------------}
  1848. { Assigns properties of Source to Self, if source is TCustomRVInfo }
  1849. procedure TCustomRVInfo.Assign(Source: TPersistent);
  1850. begin
  1851.   if Source is TCustomRVInfo then begin
  1852.     FName        := TCustomRVInfo(Source).FName;
  1853.     FBaseStyleNo := TCustomRVInfo(Source).FBaseStyleNo;
  1854.     FStandard    := TCustomRVInfo(Source).FStandard;
  1855.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1856.     FStyleTemplateId := TCustomRVInfo(Source).FStyleTemplateId;
  1857.     {$ENDIF}
  1858.     end
  1859.   else
  1860.     inherited Assign(Source);
  1861. end;
  1862. {------------------------------------------------------------------------------}
  1863. function TCustomRVInfo.IsSimpleEqual(Value: TCustomRVInfo;
  1864.   IgnoreReferences: Boolean; IgnoreID: Boolean{$IFDEF RICHVIEWDEF4}=True{$ENDIF}): Boolean;
  1865. begin
  1866.   Result := False;
  1867. end;
  1868. {------------------------------------------------------------------------------}
  1869. function TCustomRVInfo.IsSimpleEqualEx(Value: TCustomRVInfo; Mapping: TRVIntegerList): Boolean;
  1870. begin
  1871.   Result := False;
  1872. end;
  1873. {------------------------------------------------------------------------------}
  1874. function TCustomRVInfo.SimilarityValue(Value: TCustomRVInfo): Integer;
  1875. begin
  1876.   Result := 0;
  1877. end;
  1878. {------------------------------------------------------------------------------}
  1879. {$IFNDEF RVDONOTUSEINI}
  1880. { Loads properties from the ini-file, from the section Section.
  1881.   fs is a format string for keys, it is like 'Font%s1', 'Font%s2', etc.
  1882.   DefName is a default style name.                                             }
  1883. procedure TCustomRVInfo.LoadFromINI(ini: TRVIniFile; const Section,
  1884.   fs, DefName: String);
  1885. begin
  1886.   StyleName   := ini.ReadString (Section, Format(fs,[RVINI_STYLENAME]), DefName);
  1887.   BaseStyleNo := ini.ReadInteger(Section, Format(fs,[RVINI_BASESTYLENO]), -1);
  1888.   Standard    := Boolean(ini.ReadInteger(Section, Format(fs,[RVINI_STANDARD]), Integer(True)));
  1889. end;
  1890. {------------------------------------------------------------------------------}
  1891. { Saves properties to the ini-file, in the section Section, using the format
  1892.   string fs for keys. }
  1893. procedure TCustomRVInfo.SaveToINI(ini: TRVIniFile; const Section, fs: String);
  1894. begin
  1895.   ini.WriteString(Section,  Format(fs,[RVINI_STYLENAME]), StyleName);
  1896.   WriteIntToIniIfNE(ini, Section, Format(fs,[RVINI_BASESTYLENO]),BaseStyleNo,-1);
  1897.   WriteIntToIniIfNE(ini, Section, Format(fs,[RVINI_STANDARD]), Integer(Standard), Integer(True));
  1898. end;
  1899. {$ENDIF}
  1900. {------------------------------------------------------------------------------}
  1901. {$IFDEF RICHVIEWCBDEF3}
  1902. { Returns a name of the collection item, for design-time collection editor. }
  1903. function TCustomRVInfo.GetDisplayName: String;
  1904. begin
  1905.   Result := FName;
  1906. end;
  1907. {$ENDIF}
  1908. {============================= TCustomRVInfos =================================}
  1909. { Constructor }
  1910. constructor TCustomRVInfos.Create(ItemClass: TCollectionItemClass;
  1911.                                   Owner: TPersistent);
  1912. begin
  1913.   inherited Create(ItemClass);
  1914.   FOwner := Owner;
  1915. end;
  1916. {------------------------------------------------------------------------------}
  1917. { Allows assigning properties to TStrings: style names are assigned. }
  1918. procedure TCustomRVInfos.AssignTo(Dest: TPersistent);
  1919. var i: Integer;
  1920. begin
  1921.   if Dest is TStrings then begin
  1922.     TStrings(Dest).Clear;
  1923.     for i:=0 to Count-1 do
  1924.       TStrings(Dest).Add(TCustomRVInfo(Items[i]).FName);
  1925.     end
  1926.   else
  1927.     inherited AssignTo(Dest);
  1928. end;
  1929. {------------------------------------------------------------------------------}
  1930. {$IFDEF RICHVIEWCBDEF3}
  1931. { For designtime collection editor. }
  1932. function TCustomRVInfos.GetOwner: TPersistent;
  1933. begin
  1934.   Result := FOwner;
  1935. end;
  1936. {$ENDIF}
  1937. {------------------------------------------------------------------------------}
  1938. { Adds items from Styles according to the method specified in the Mode.
  1939.   Mapping is filled: on exit, Mapping.Count = Styles.Count, and
  1940.   Mapping[i] is an index of the item of this collection which was created basing
  1941.   on Styles[i].
  1942.   Reference properties (BaseStyleNo, NextStyleNo, NextParaNo, DefStyleNo) are
  1943.   adjusted in the added items.
  1944.   If the global variable RichViewResetStandardFlag is True (default), Standard
  1945.   properties of all added styles are set to False.
  1946.   This method assumes that Styles have the same type as Self.
  1947.   Notes:
  1948.   * in rvs_merge_Map mode:
  1949.     - SimilarityValue method of items is used;
  1950.     - the method tries to keep Jump and Unicode properties if possible.
  1951.   * in rvs_merge_SmartMerge mode:
  1952.     - the method tries to map the style to the style with the same index,
  1953.       if possible;
  1954.     - IsSimpleEqualEx method of items is used;
  1955.     - several styles can be mapped in the same style, except for numbered lists:
  1956.       they are always mapped to the unique style.
  1957. }
  1958. procedure TCustomRVInfos.MergeWith(Styles: TCustomRVInfos;
  1959.   Mode: TRVStyleMergeMode; Mapping: TRVIntegerList;
  1960.   TextStyleMapping: TRVIntegerList);
  1961. var i,j,idx,oldcount: Integer;
  1962.     Style: TCustomRVInfo;
  1963.     wht, maxwht: Integer;
  1964.     ForbiddenStyles: TRVIntegerList;
  1965.     {.............................................}
  1966.     procedure AdjustReferences;
  1967.     var i: Integer;
  1968.         Style: TCustomRVInfo;
  1969.     begin
  1970.       for i := oldcount to Count-1 do begin
  1971.         Style := TCustomRVInfo(Items[i]);
  1972.         if RichViewResetStandardFlag then
  1973.           Style.Standard := False;
  1974.         if Style.BaseStyleNo>=0 then
  1975.           Style.BaseStyleNo := Mapping[Style.BaseStyleNo];
  1976.         if (Style is TFontInfo) and (TFontInfo(Style).NextStyleNo>=0) then
  1977.           TFontInfo(Style).NextStyleNo := Mapping[TFontInfo(Style).NextStyleNo];
  1978.         if (Style is TParaInfo) then begin
  1979.           if (TParaInfo(Style).NextParaNo>=0) then
  1980.             TParaInfo(Style).NextParaNo := Mapping[TParaInfo(Style).NextParaNo];
  1981.           if (TParaInfo(Style).DefStyleNo>=0) and (TextStyleMapping<>nil) then
  1982.             TParaInfo(Style).DefStyleNo :=
  1983.               TextStyleMapping[TParaInfo(Style).DefStyleNo];
  1984.         end;
  1985.       end;
  1986.     end;
  1987.     {.............................................}
  1988. begin
  1989.   Mapping.Clear;
  1990.   Mapping.Capacity := Styles.Count;
  1991.   oldcount := Count;
  1992.   case Mode of
  1993.     rvs_merge_Append: // Append one collection to another
  1994.       for i := 0 to Styles.Count-1 do begin
  1995.         Mapping.Add(Count);
  1996.         Add.Assign(Styles.Items[i]);
  1997.       end;
  1998.     rvs_merge_Map: // Use the most similar of existing styles. Do not add styles
  1999.       for i := 0 to Styles.Count-1 do begin
  2000.         Style := TCustomRVInfo(Styles.Items[i]);
  2001.         maxwht := 0;
  2002.         idx := -1;
  2003.         if (Style is TFontInfo) then begin
  2004.           {$IFNDEF RVDONOTUSEUNICODE}
  2005.           for j := 0 to Count-1 do
  2006.             if (TFontInfo(Items[j]).Jump=TFontInfo(Style).Jump) and
  2007.                (TFontInfo(Items[j]).Unicode=TFontInfo(Style).Unicode) then begin
  2008.               wht := Style.SimilarityValue(TFontInfo(Items[j]));
  2009.               if (idx=-1) or (wht>maxwht) then begin
  2010.                 maxwht := wht;
  2011.                 idx := j;
  2012.               end;
  2013.             end;
  2014.           {$ENDIF}
  2015.           if idx=-1 then
  2016.             for j := 0 to Count-1 do
  2017.               if (TCustomRVFontInfo(Items[j]).Jump=TCustomRVFontInfo(Style).Jump) then begin
  2018.                 wht := Style.SimilarityValue(TCustomRVInfo(Items[j]));
  2019.                 if (idx=-1) or (wht>maxwht) then begin
  2020.                   maxwht := wht;
  2021.                   idx := j;
  2022.                 end;
  2023.               end;
  2024.           {$IFNDEF RVDONOTUSEUNICODE}
  2025.           if idx=-1 then
  2026.             for j := 0 to Count-1 do
  2027.               if (TFontInfo(Items[j]).Unicode=TFontInfo(Style).Unicode) then begin
  2028.                 wht := Style.SimilarityValue(TCustomRVInfo(Items[j]));
  2029.                 if (idx=-1) or (wht>maxwht) then begin
  2030.                   maxwht := wht;
  2031.                   idx := j;
  2032.                 end;
  2033.               end;
  2034.           {$ENDIF}
  2035.         end;
  2036.         if idx=-1 then
  2037.           for j := 0 to Count-1 do begin
  2038.             wht := Style.SimilarityValue(TCustomRVInfo(Items[j]));
  2039.             if (idx=-1) or (wht>maxwht) then begin
  2040.               maxwht := wht;
  2041.               idx := j;
  2042.             end;
  2043.           end;
  2044.         Mapping.Add(idx);
  2045.       end;
  2046.     rvs_merge_SmartMerge: // Reuse styles, add if necessary
  2047.       begin
  2048.         if Self is TRVListInfos then
  2049.           ForbiddenStyles := TRVIntegerList.Create
  2050.         else
  2051.           ForbiddenStyles := nil;
  2052.         for i := 0 to Styles.Count-1 do begin
  2053.           idx := -1;
  2054.           Style := TCustomRVInfo(Styles.Items[i]);
  2055.           if (i<Count) and Style.IsSimpleEqualEx(TCustomRVInfo(Items[i]), Mapping) and
  2056.              ((ForbiddenStyles=nil) or (ForbiddenStyles.IndexOf(Pointer(i))<0)) then
  2057.             idx := i;
  2058.           if idx<0 then
  2059.             for j := 0 to Count-1 do
  2060.               if Style.IsSimpleEqualEx(TCustomRVInfo(Items[j]), Mapping) and
  2061.                 ((ForbiddenStyles=nil) or (ForbiddenStyles.IndexOf(Pointer(j))<0)) then begin
  2062.                 idx := j;
  2063.                 break;
  2064.               end;
  2065.           if idx<0 then begin
  2066.             idx := Count;
  2067.             Add.Assign(Styles.Items[i]);
  2068.             if Self is TRVListInfos then
  2069.               TRVListInfo(Items[idx]).FListID := TRVListInfo(Styles.Items[i]).ListID;
  2070.           end;
  2071.           Mapping.Add(idx);
  2072.           if ForbiddenStyles<>nil then begin
  2073.             if TRVListInfo(Style).HasNumbering then
  2074.               ForbiddenStyles.Add(idx);
  2075.           end;
  2076.         end;
  2077.         ForbiddenStyles.Free;
  2078.       end;
  2079.   end;
  2080.   AdjustReferences;
  2081. end;
  2082. {=========================== TCustomRVFontInfo ================================}
  2083. { Constructor }
  2084. constructor TCustomRVFontInfo.Create(Collection: TCollection);
  2085. begin
  2086.  inherited Create(Collection);
  2087.  FFontName  := RVDEFAULTSTYLEFONT;
  2088.  FSize      := 10;
  2089.  FColor     := clWindowText;
  2090.  FBackColor := clNone;
  2091.  FHoverBackColor := clNone;
  2092.  FHoverColor := clNone;
  2093.  FStyle     := [];
  2094.  FStyleEx   := [];
  2095.  {$IFDEF RICHVIEWCBDEF3}
  2096.  FCharset   := DEFAULT_CHARSET;
  2097.  {$ENDIF}
  2098.  Jump       := False;
  2099.  JumpCursor := crJump;
  2100.  FName      := RVDEFAULTTEXTSTYLENAME;
  2101.  FVShift    := 0;
  2102.  FCharScale    := 100;
  2103. end;
  2104. {------------------------------------------------------------------------------}
  2105. { Assigns properties of Source to Self, if it is TCustomRVFontInfo or TFont.   }
  2106. procedure TCustomRVFontInfo.Assign(Source: TPersistent);
  2107. begin
  2108.   if Source is TCustomRVFontInfo then begin
  2109.       FFontName   := TCustomRVFontInfo(Source).FFontName;
  2110.       FSize       := TCustomRVFontInfo(Source).FSize;
  2111.       FColor      := TCustomRVFontInfo(Source).FColor;
  2112.       FBackColor  := TCustomRVFontInfo(Source).FBackColor;
  2113.       FHoverBackColor  := TCustomRVFontInfo(Source).FHoverBackColor;
  2114.       FHoverColor  := TCustomRVFontInfo(Source).FHoverColor;
  2115.       FStyle      := TCustomRVFontInfo(Source).FStyle;
  2116.       FStyleEx    := TCustomRVFontInfo(Source).FStyleEx;
  2117.       {$IFDEF RICHVIEWCBDEF3}
  2118.       FCharset    := TCustomRVFontInfo(Source).FCharset;
  2119.       {$ENDIF}
  2120.       {$IFDEF RVLANGUAGEPROPERTY}
  2121.       FLanguage   := TCustomRVFontInfo(Source).FLanguage;
  2122.       {$ENDIF}
  2123.       FJump       := TCustomRVFontInfo(Source).FJump;
  2124.       FJumpCursor := TCustomRVFontInfo(Source).FJumpCursor;
  2125.       FProtection := TCustomRVFontInfo(Source).FProtection;
  2126.       FOptions    := TCustomRVFontInfo(Source).FOptions;
  2127.       FVShift     := TCustomRVFontInfo(Source).FVShift;
  2128.       FCharScale  := TCustomRVFontInfo(Source).FCharScale;
  2129.       FCharSpacing := TCustomRVFontInfo(Source).FCharSpacing;
  2130.       FBiDiMode   := TCustomRVFontInfo(Source).FBiDiMode;
  2131.       {$IFDEF RVTEXTFOOTNOTES}
  2132.       FFootNote := TCustomRVFontInfo(Source).FFootNote;
  2133.       {$ENDIF}
  2134.       inherited Assign(Source);
  2135.     end
  2136.   else if Source is TFont then begin
  2137.       FFontName := TFont(Source).Name;
  2138.       FSize     := TFont(Source).Size;
  2139.       FColor    := TFont(Source).Color;
  2140.       FStyle    := TFont(Source).Style;
  2141.       {$IFDEF RICHVIEWCBDEF3}
  2142.       FCharset  := TFont(Source).Charset;
  2143.       {$ENDIF}
  2144.     end
  2145.   else
  2146.     inherited Assign(Source);
  2147. end;
  2148. {------------------------------------------------------------------------------}
  2149. { Allows assigning properties to TFont. }
  2150. procedure TCustomRVFontInfo.AssignTo(Dest: TPersistent);
  2151. begin
  2152.   if Dest is TFont then begin
  2153.       TFont(Dest).Name    := FFontName;
  2154.       TFont(Dest).Size    := FSize;
  2155.       TFont(Dest).Color   := FColor;
  2156.       TFont(Dest).Style   := FStyle;
  2157.       {$IFDEF RICHVIEWCBDEF3}
  2158.       TFont(Dest).Charset := FCharset;
  2159.       {$ENDIF}
  2160.     end
  2161.   else
  2162.     inherited AssignTo(Dest);
  2163. end;
  2164. {------------------------------------------------------------------------------}
  2165. { Assigns properties listed in Props to Self. }
  2166. procedure TCustomRVFontInfo.AssignSelectedProperties(
  2167.   Source: TCustomRVFontInfo; Props: TRVFontInfoProperties);
  2168.    {.............................................................}
  2169.    procedure ChangeFontStyle(FontStyle: TFontStyle; TextPropId: TRVFontInfoProperty);
  2170.    begin
  2171.      if TextPropId in Props then
  2172.        if FontStyle in Source.Style then
  2173.          Style := Style+[FontStyle]
  2174.        else
  2175.          Style := Style-[FontStyle];
  2176.    end;
  2177.    {.............................................................}
  2178.    procedure ChangeFontStyleEx(FontStyle: TRVFontStyle; TextPropId: TRVFontInfoProperty);
  2179.    begin
  2180.      if TextPropId in Props then
  2181.        if FontStyle in Source.StyleEx then
  2182.          StyleEx := StyleEx+[FontStyle]
  2183.        else
  2184.          StyleEx := StyleEx-[FontStyle];
  2185.    end;
  2186.    {.............................................................}
  2187.    procedure ChangeTextOption(TextOption: TRVTextOption; TextOptionId: TRVFontInfoProperty);
  2188.    begin
  2189.      if TextOptionId in Props then
  2190.        if TextOption in Source.Options then
  2191.          Options := Options+[TextOption]
  2192.        else
  2193.          Options := Options-[TextOption];
  2194.    end;
  2195.    {.............................................................}
  2196. begin
  2197.   if (rvfiFontName in Props) then
  2198.     FontName := Source.FontName;
  2199.   if (rvfiSize in Props) then
  2200.     Size     := Source.Size;
  2201.   {$IFDEF RICHVIEWCBDEF3}
  2202.   if (rvfiCharset in Props) then
  2203.     Charset  := Source.Charset;
  2204.   {$ENDIF}
  2205.   ChangeFontStyle(fsBold,      rvfiBold);
  2206.   ChangeFontStyle(fsItalic,    rvfiItalic);
  2207.   ChangeFontStyle(fsUnderline, rvfiUnderline);
  2208.   ChangeFontStyle(fsStrikeOut, rvfiStrikeOut);
  2209.   ChangeFontStyleEx(rvfsOverline, rvfiOverline);
  2210.   ChangeFontStyleEx(rvfsAllCaps, rvfiAllCaps);
  2211.   if (rvfiVShift in Props) then
  2212.     VShift := Source.VShift;
  2213.   if (rvfiColor in Props) then
  2214.     Color := Source.Color;
  2215.   if (rvfiBackColor in Props) then
  2216.     BackColor := Source.BackColor;
  2217.   if (rvfiJump in Props) then
  2218.     Jump := Source.Jump;
  2219.   if (rvfiHoverBackColor in Props) then
  2220.     HoverBackColor := Source.HoverBackColor;
  2221.   if (rvfiHoverColor in Props) then
  2222.     HoverColor := Source.HoverColor;
  2223.   if (rvfiJumpCursor in Props) then
  2224.     JumpCursor := Source.JumpCursor;
  2225.   if (rvfiProtection in Props) then
  2226.     Protection := Source.Protection;
  2227.   if (rvfiCharScale in Props) then
  2228.     CharScale := Source.CharScale;
  2229.   if (rvfiBiDiMode in Props) then
  2230.     BiDiMode := Source.BiDiMode;
  2231.   if (rvfiCharSpacing in Props) then
  2232.     CharSpacing := Source.CharSpacing;
  2233.   ChangeTextOption(rvteoHTMLCode, rvfiHTMLCode);
  2234.   ChangeTextOption(rvteoRTFCode,  rvfiRTFCode);
  2235.   {$IFDEF RVLANGUAGEPROPERTY}
  2236.   if (rvfiLanguage in Props) then
  2237.     Language := Source.Language;
  2238.   {$ENDIF}
  2239.   { rvfiBaseStyleNo, rvfiNextStyleNo - not assigned }
  2240.   {$IFDEF RVTEXTFOOTNOTES}
  2241.   { rvfiFootnotes ??? }
  2242.   {$ENDIF}
  2243.   { rvfiUnicode ??? }
  2244. end;
  2245. {------------------------------------------------------------------------------}
  2246. { Assigns properties to TLogFont record. If CanUseCustomPPI and
  2247.   TextStyles.PixelsPerInch is nonzero, it is used instead of
  2248.   Canvas.Font.PixelsPerInch }
  2249. procedure TCustomRVFontInfo.AssignToLogFont(var LogFont: TLogFont; Canvas: TCanvas;
  2250.   CanUseCustomPPI: Boolean);
  2251. var ppi: Integer;
  2252. begin
  2253.   FillChar(LogFont, sizeof(LogFont), 0);
  2254.   with LogFont do begin
  2255.     ppi := 0;
  2256.     if CanUseCustomPPI and (Collection<>nil) then
  2257.       ppi := TFontInfos(Collection).PixelsPerInch;
  2258.     if ppi=0 then
  2259.       ppi := Canvas.Font.PixelsPerInch;
  2260.     lfHeight := -MulDiv(Size, ppi, 72);
  2261.     if fsBold in Style then
  2262.       lfWeight := FW_BOLD
  2263.     else
  2264.       lfWeight := FW_NORMAL;
  2265.     lfItalic := Byte(fsItalic in Style);
  2266.     lfUnderline := Byte(fsUnderline in Style);
  2267.     lfStrikeOut := Byte(fsStrikeOut in Style);
  2268.     {$IFDEF RICHVIEWCBDEF3}
  2269.     lfCharSet := Byte(Charset);
  2270.     {$ENDIF}
  2271.     StrPCopy(lfFaceName, FontName);
  2272.     lfQuality := DEFAULT_QUALITY;
  2273.     lfOutPrecision := OUT_DEFAULT_PRECIS;
  2274.     lfClipPrecision := CLIP_DEFAULT_PRECIS;
  2275.     lfPitchAndFamily := DEFAULT_PITCH;
  2276.   end;
  2277. end;
  2278. {------------------------------------------------------------------------------}
  2279. { Is this item equal to Value (all properties are equal)?
  2280.   if IgnoreReferences=True, NextStyleNo property is ignored, otherwise they
  2281.   must be equal.
  2282.   IgnoreID is not used (used only in TRVListInfo). }
  2283. function TCustomRVFontInfo.IsSimpleEqual(Value: TCustomRVInfo;
  2284.   IgnoreReferences, IgnoreID: Boolean): Boolean;
  2285. begin
  2286.    Result := (Size        = TCustomRVFontInfo(Value).Size   ) and
  2287.              {$IFDEF RICHVIEWCBDEF3}
  2288.              (Charset     = TCustomRVFontInfo(Value).Charset) and
  2289.              {$ENDIF}
  2290.              (Style       = TCustomRVFontInfo(Value).Style  ) and
  2291.              (StyleEx     = TCustomRVFontInfo(Value).StyleEx) and
  2292.              (AnsiCompareText(FontName, TCustomRVFontInfo(Value).FontName)=0) and
  2293.              (VShift      = TCustomRVFontInfo(Value).VShift ) and
  2294.              (Color       = TCustomRVFontInfo(Value).Color  ) and
  2295.              (BackColor   = TCustomRVFontInfo(Value).BackColor) and
  2296.              (Jump        = TCustomRVFontInfo(Value).Jump   ) and
  2297.              {$IFDEF RVLANGUAGEPROPERTY}
  2298.              (Language     = TCustomRVFontInfo(Value).Language) and
  2299.              {$ENDIF}
  2300.              (not Jump or
  2301.               ((HoverColor     = TCustomRVFontInfo(Value).HoverColor    ) and
  2302.                (HoverBackColor = TCustomRVFontInfo(Value).HoverBackColor) and
  2303.                (JumpCursor    = TCustomRVFontInfo(Value).JumpCursor     ))
  2304.              ) and
  2305.              (Protection  = TCustomRVFontInfo(Value).Protection ) and
  2306.              (Options     = TCustomRVFontInfo(Value).Options )    and
  2307.              (CharScale   = TCustomRVFontInfo(Value).CharScale  ) and
  2308.              (CharSpacing = TCustomRVFontInfo(Value).CharSpacing) and
  2309.              (BiDiMode    = TCustomRVFontInfo(Value).BiDiMode  ) and
  2310.              (not RichViewCompareStyleNames or (StyleName=TCustomRVFontInfo(Value).StyleName));
  2311. end;
  2312. {------------------------------------------------------------------------------}
  2313. { Calculates a similarity value between Self and Value.
  2314.   The larger value means more similar. }
  2315. function TCustomRVFontInfo.SimilarityValue(Value: TCustomRVInfo): Integer;
  2316. var fs: TFontStyle;
  2317. begin
  2318.    Result :=
  2319.      RV_CompareInts(TCustomRVFontInfo(Value).Size, Size, RVSMW_FONTSIZE)+
  2320.      RV_CompareInts(TCustomRVFontInfo(Value).VShift, VShift, RVSMW_VSHIFTRATIO)+
  2321.      RV_CompareInts(TCustomRVFontInfo(Value).CharScale, CharScale, RVSMW_CHARSCALE)+
  2322.      RV_CompareInts(TCustomRVFontInfo(Value).CharSpacing, CharSpacing, RVSMW_CHARSPACING)+
  2323.      RV_CompareColors(TCustomRVFontInfo(Value).Color, Color, RVSMW_EACHRGBCOLOR, RVSMW_COLORSET)+
  2324.      RV_CompareColors(TCustomRVFontInfo(Value).BackColor, BackColor, RVSMW_EACHRGBBCOLOR, RVSMW_BCOLORSET);
  2325.    if TCustomRVFontInfo(Value).BiDiMode=BiDiMode then
  2326.      inc(Result, RVSMW_BIDIMODE);
  2327.    if AnsiCompareText(TCustomRVFontInfo(Value).FontName, FontName)=0 then
  2328.      inc(Result, RVSMW_FONTNAME);
  2329.    for fs := Low(TFontStyle) to High(TFontStyle) do
  2330.      if (fs in TCustomRVFontInfo(Value).Style) = (fs in Style) then
  2331.        inc(Result, RVSMW_FONTEACHSTYLE);
  2332.    if (rvfsOverline in TCustomRVFontInfo(Value).StyleEx)=(rvfsOverline in StyleEx) then
  2333.      inc(Result, RVSMW_OVERLINE);
  2334.    if (rvfsAllCaps in TCustomRVFontInfo(Value).StyleEx)=(rvfsAllCaps in StyleEx) then
  2335.      inc(Result, RVSMW_OVERLINE);
  2336.    if ((TCustomRVFontInfo(Value).Style=[]) and (TCustomRVFontInfo(Value).StyleEx=[]))
  2337.       =
  2338.       ((Style=[]) and (StyleEx=[])) then
  2339.      inc(Result, RVSMW_FONTSTYLESET);
  2340.    {$IFDEF RVLANGUAGEPROPERTY}
  2341.    if TCustomRVFontInfo(Value).Language = Language then
  2342.      inc(Result, RVSMW_LANGUAGE);
  2343.    {$ENDIF}
  2344.    if Jump and TCustomRVFontInfo(Value).Jump then begin
  2345.      if TCustomRVFontInfo(Value).JumpCursor=JumpCursor then
  2346.        inc(Result, RVSMW_CURSOR);
  2347.      inc(Result,
  2348.          RV_CompareColors(TCustomRVFontInfo(Value).HoverColor,HoverColor, RVSMW_EACHRGBCOLOR, RVSMW_COLORSET) div 2+
  2349.          RV_CompareColors(TCustomRVFontInfo(Value).HoverBackColor,HoverBackColor, RVSMW_EACHRGBBCOLOR, RVSMW_BCOLORSET) div 2);
  2350.    end;
  2351.    if TCustomRVFontInfo(Value).Protection<>Protection then
  2352.      dec(Result, RVSMW_PROTECTION);
  2353.    if (rvteoHTMLCode in TCustomRVFontInfo(Value).Options)=(rvteoHTMLCode in Options) then
  2354.      inc(Result, RVSMW_SPECIALCODE);
  2355.    if (rvteoRTFCode in TCustomRVFontInfo(Value).Options)=(rvteoRTFCode in Options) then
  2356.      inc(Result, RVSMW_SPECIALCODE);
  2357.   {$IFDEF RICHVIEWCBDEF3}
  2358.   if Charset=TCustomRVFontInfo(Value).Charset then
  2359.     inc(Result, RVSMW_FONTCHARSET)
  2360.   else
  2361.     if (Charset=DEFAULT_CHARSET) or
  2362.        (TCustomRVFontInfo(Value).Charset=DEFAULT_CHARSET) then
  2363.       inc(Result, RVSMW_FONTCHARSET div 4);
  2364.   {$ENDIF}
  2365. end;
  2366. {------------------------------------------------------------------------------}
  2367. { Is this item equal to Value?
  2368.   Equality is determined by comparing all properties NOT included in IgnoreList. } 
  2369. function TCustomRVFontInfo.IsEqual(Value: TCustomRVFontInfo; IgnoreList: TRVFontInfoProperties): Boolean;
  2370. begin
  2371.    Result := ((rvfiSize        in IgnoreList) or (Size        = Value.Size       )) and
  2372.              {$IFDEF RICHVIEWCBDEF3}
  2373.              ((rvfiCharset     in IgnoreList) or (Charset     = Value.Charset    )) and
  2374.              {$ENDIF}
  2375.              ((rvfiBold        in IgnoreList) or ((fsBold       in Style)   = (fsBold       in Value.Style  ))) and
  2376.              ((rvfiItalic      in IgnoreList) or ((fsItalic     in Style)   = (fsItalic     in Value.Style  ))) and
  2377.              ((rvfiUnderline   in IgnoreList) or ((fsUnderline  in Style)   = (fsUnderline  in Value.Style  ))) and
  2378.              ((rvfiStrikeout   in IgnoreList) or ((fsStrikeout  in Style)   = (fsStrikeout  in Value.Style  ))) and
  2379.              ((rvfiOverline    in IgnoreList) or ((rvfsOverline in StyleEx) = (rvfsOverline in Value.StyleEx))) and
  2380.              ((rvfiAllCaps     in IgnoreList) or ((rvfsAllCaps  in StyleEx) = (rvfsAllCaps  in Value.StyleEx))) and
  2381.              ((rvfiFontName    in IgnoreList) or (AnsiCompareText(FontName,Value.FontName)=0)) and
  2382.              ((rvfiVShift      in IgnoreList) or (VShift      = Value.VShift     )) and
  2383.              ((rvfiColor       in IgnoreList) or (Color       = Value.Color      )) and
  2384.              ((rvfiBackColor   in IgnoreList) or (BackColor   = Value.BackColor  )) and
  2385.              ((rvfiJump        in IgnoreList) or (Jump        = Value.Jump       )) and
  2386.              {$IFDEF RVLANGUAGEPROPERTY}
  2387.              ((rvfiLanguage    in IgnoreList) or (Language    = Value.Language   )) and
  2388.              {$ENDIF}
  2389.              (not Jump or
  2390.              ((rvfiHoverColor     in IgnoreList) or (HoverColor     = Value.HoverColor   )) and
  2391.              ((rvfiHoverBackColor in IgnoreList) or (HoverBackColor = Value.HoverBackColor)) and
  2392.              ((rvfiJumpCursor     in IgnoreList) or (JumpCursor     = Value.JumpCursor))
  2393.              ) and
  2394.              ((rvfiProtection  in IgnoreList) or (Protection  = Value.Protection)) and
  2395.              ((rvfiRTFCode     in IgnoreList) or ((rvteoRTFCode in Options)  = (rvteoRTFCode in Value.Options))) and
  2396.              ((rvfiHTMLCode    in IgnoreList) or ((rvteoHTMLCode in Options) = (rvteoHTMLCode in Value.Options))) and
  2397.              ((rvfiCharScale   in IgnoreList) or (CharScale  = Value.CharScale)) and
  2398.              ((rvfiCharSpacing in IgnoreList) or (CharSpacing  = Value.CharSpacing)) and
  2399.              ((rvfiBiDiMode    in IgnoreList) or (BiDiMode  = Value.BiDiMode)) and
  2400.              ((rvfiBaseStyleNo in IgnoreList) or (BaseStyleNo = Value.BaseStyleNo));
  2401.    if Result and RichViewCompareStyleNames then
  2402.      Result := StyleName=Value.StyleName;
  2403. end;
  2404. {------------------------------------------------------------------------------}
  2405. { Applies this text style to the Canvas. Colors are not applied, see ApplyColor.
  2406.   DefBiDiMode is a bi-di mode of paragraph containing text item of this style.
  2407.   Notes:
  2408.   - if FCharScale=100, this method assigns Canvas.Font properties,
  2409.      otherwise it assigns Canvas.Font.Handle.
  2410.   - if CanUseCustomPPI and owning collection is defined and has nonzero
  2411.     PixelsPerInch property, font size is assigned according to this PixelsPerInch.
  2412. }
  2413. procedure TCustomRVFontInfo.Apply(Canvas: TCanvas; DefBiDiMode: TRVBiDiMode;
  2414.   CanUseCustomPPI: Boolean);
  2415. var LogFont: TLogFont;
  2416.     ppi, h: Integer;
  2417.     tm: TTextMetric;
  2418.     Font: TFont;
  2419. begin
  2420. {$IFNDEF RVDONOTUSECHARSCALE}
  2421.   if FCharScale=100 then begin
  2422. {$ENDIF}
  2423.     Font := Canvas.Font;
  2424.     {$IFDEF RVDONOTUSECHARSCALE}
  2425.     if Font.Style<>Style then
  2426.     {$ENDIF}
  2427.       Font.Style := Style;
  2428.     ppi := 0;
  2429.     if CanUseCustomPPI and (Collection<>nil) then
  2430.       ppi := TFontInfos(Collection).PixelsPerInch;
  2431.     if ppi=0 then begin
  2432.       if Font.Size<>Size then
  2433.         Font.Size  := Size
  2434.       end
  2435.     else begin
  2436.       h := - MulDiv(Size, ppi, 72);
  2437.       if Font.Height<>h then
  2438.         Font.Height := h;
  2439.     end;
  2440.     if AnsiCompareText(Font.Name,FontName)<>0 then
  2441.       Font.Name := FontName;
  2442.     {$IFDEF RICHVIEWCBDEF3}
  2443.     if Font.CharSet<>CharSet then
  2444.       Font.CharSet  := CharSet;
  2445.     {$ENDIF}
  2446. {$IFNDEF RVDONOTUSECHARSCALE}
  2447.     end
  2448.   else begin
  2449.     AssignToLogFont(LogFont, Canvas, CanUseCustomPPI);
  2450.     Canvas.Font.Handle := CreateFontIndirect(LogFont);
  2451.     if GetTextMetrics(Canvas.Handle, tm) then
  2452.       LogFont.lfWidth := tm.tmAveCharWidth*FCharScale div 100
  2453.     else
  2454.       LogFont.lfWidth := Canvas.TextWidth('x')*FCharScale div 100;
  2455.     Canvas.Font.Handle := CreateFontIndirect(LogFont);
  2456.   end;
  2457. {$ENDIF}
  2458.   if BiDiMode<>rvbdUnspecified then
  2459.     DefBiDiMode := BiDiMode;
  2460.   case DefBiDiMode of
  2461.     rvbdLeftToRight:
  2462.       begin
  2463.         {$IFNDEF RVDONOTUSECHARSPACING}
  2464.         SetTextCharacterExtra(Canvas.Handle, 0);
  2465.         {$ENDIF}
  2466.         SetTextAlign(Canvas.Handle, TA_LEFT);
  2467.       end;
  2468.     rvbdRightToLeft:
  2469.       begin
  2470.         {$IFNDEF RVDONOTUSECHARSPACING}
  2471.         SetTextCharacterExtra(Canvas.Handle, 0);
  2472.         {$ENDIF}
  2473.         SetTextAlign(Canvas.Handle, TA_RTLREADING);
  2474.       end;
  2475.     else begin
  2476.       {$IFNDEF RVDONOTUSECHARSPACING}
  2477.       SetTextCharacterExtra(Canvas.Handle, FCharSpacing);
  2478.       {$ENDIF}
  2479.     end;
  2480.   end;
  2481. end;
  2482. {------------------------------------------------------------------------------}
  2483. { Applies BiDiMode and CharSpacing to Canvas }
  2484. procedure TCustomRVFontInfo.ApplyBiDiMode(Canvas: TCanvas; DefBiDiMode: TRVBiDiMode);
  2485. begin
  2486.   if BiDiMode<>rvbdUnspecified then
  2487.     DefBiDiMode := BiDiMode;
  2488.   case DefBiDiMode of
  2489.     rvbdLeftToRight:
  2490.       begin
  2491.         {$IFNDEF RVDONOTUSECHARSPACING}
  2492.         SetTextCharacterExtra(Canvas.Handle, 0);
  2493.         {$ENDIF}
  2494.         SetTextAlign(Canvas.Handle, TA_LEFT);
  2495.       end;
  2496.     rvbdRightToLeft:
  2497.       begin
  2498.         {$IFNDEF RVDONOTUSECHARSPACING}
  2499.         SetTextCharacterExtra(Canvas.Handle, 0);
  2500.         {$ENDIF}
  2501.         SetTextAlign(Canvas.Handle, TA_RTLREADING);
  2502.       end;
  2503.     else begin
  2504.       {$IFNDEF RVDONOTUSECHARSPACING}
  2505.       SetTextCharacterExtra(Canvas.Handle, FCharSpacing);
  2506.       {$ENDIF}
  2507.     end;
  2508.   end;
  2509. end;
  2510. {------------------------------------------------------------------------------}
  2511. { Applies color properties of this style to the Canvas.
  2512.   Colors depend on values in DrawState (specifically: rvtsSelected, rvtsHover,
  2513.   rvtsControlFocused).
  2514.   ColorMode is used to adjust colors. }
  2515. procedure TCustomRVFontInfo.ApplyColor(Canvas: TCanvas; RVStyle: TRVStyle;
  2516.   DrawState: TRVTextDrawStates; Printing: Boolean; ColorMode: TRVColorMode);
  2517. begin
  2518.   if rvtsSelected in DrawState then begin
  2519.     Canvas.Brush.Style := bsSolid;
  2520.     if rvtsControlFocused in DrawState then
  2521.       Canvas.Brush.Color := RVStyle.SelColor
  2522.     else
  2523.       Canvas.Brush.Color := RVStyle.InactiveSelColor;
  2524.     {$IFDEF RVUSETEXTHOVERCOLORWITHSELECTED}
  2525.     if rvtsHover in DrawState then begin
  2526.       Canvas.Font.Color := RVStyle.GetHoverColorByColor(HoverColor);
  2527.       if Canvas.Font.Color=clNone then
  2528.         Canvas.Font.Color := Color;
  2529.       end
  2530.     else
  2531.     {$ENDIF}
  2532.     if rvtsControlFocused in DrawState  then
  2533.       Canvas.Font.Color := RVStyle.SelTextColor
  2534.     else
  2535.       Canvas.Font.Color := RVStyle.InactiveSelTextColor;
  2536.     if Canvas.Font.Color=clNone then
  2537.       Canvas.Font.Color  := Color;
  2538.     end
  2539.   else begin
  2540.     if rvtsHover in DrawState then begin
  2541.        Canvas.Font.Color  := RVStyle.GetHoverColorByColor(HoverColor);
  2542.        if Canvas.Font.Color=clNone then
  2543.          Canvas.Font.Color := Color;
  2544.        Canvas.Brush.Color := HoverBackColor;
  2545.        end
  2546.      else if not Printing then begin
  2547.        Canvas.Font.Color  := Color;
  2548.        Canvas.Brush.Color := BackColor;
  2549.        end
  2550.      else
  2551.        case ColorMode of
  2552.          rvcmColor:
  2553.            begin
  2554.              Canvas.Font.Color  := Color;
  2555.              Canvas.Brush.Color := BackColor;
  2556.            end;
  2557.          rvcmPrinterColor:
  2558.            begin
  2559.              Canvas.Font.Color  := RV_GetPrnColor(Color);
  2560.              Canvas.Brush.Color := RV_GetPrnColor(BackColor);
  2561.            end;
  2562.          rvcmGrayScale:
  2563.            begin
  2564.              Canvas.Font.Color  := RV_GetGray(RV_GetPrnColor(Color));
  2565.              Canvas.Brush.Color := RV_GetGray(RV_GetPrnColor(BackColor));
  2566.            end;
  2567.          rvcmBlackAndWhite:
  2568.            begin
  2569.              if BackColor=clNone then begin
  2570.                Canvas.Brush.Color := clNone;
  2571.                if RV_GetPrnColor(Color)<>clWhite then
  2572.                  Canvas.Font.Color  := clBlack