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

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       TRVScroller: ancestor of all visual             }
  5. {       RichView components.                            }
  6. {       Also contains definition of some types used     }
  7. {       elsewhere.                                      }
  8. {                                                       }
  9. {       Copyright (c) Sergey Tkachenko                  }
  10. {       svt@trichview.com                               }
  11. {       http://www.trichview.com                        }
  12. {                                                       }
  13. {*******************************************************}
  14. unit RVScroll;
  15. interface
  16. uses
  17. {$I RV_Defs.inc}
  18.   Windows, Messages, SysUtils, Classes, Controls, Graphics, Forms,
  19.   {$IFDEF RICHVIEWDEF4}
  20.   ImgList,
  21.   {$ENDIF}
  22.   {$IFNDEF RVDONOTUSEDRAGDROP}
  23.   ActiveX,
  24.   {$ENDIF}
  25.   CommCtrl, RVXPTheme, RVStr;
  26. type
  27.   TRVScroller = class;
  28.   { Bi-di properties of TCustomRichView, TParaInfo, TFontInfo }
  29.   TRVBiDiMode = (
  30.     rvbdUnspecified,       // BiDiMode is not supported / use parent BiDiMode
  31.     rvbdLeftToRight,       // left to right
  32.     rvbdRightToLeft);      // right to left
  33.   { Values for TCustomRichView.Options }
  34.   TRVOption = (
  35.     rvoAllowSelection,      // allows selection; must be set in editor
  36.     rvoSingleClick,         // if set, OnRVDblClick occurs on single click
  37.     rvoScrollToEnd,         // if set, FormatTail scrolls to end
  38.     rvoClientTextWidth,     // text is wrapped when exceed window width
  39.     rvoShowCheckpoints,     // shows checkpoints
  40.     rvoShowPageBreaks,      // shows page breaks
  41.     rvoShowSpecialCharacters, // shows dots in spaces and paragraph marks    
  42.     rvoTagsArePChars,       // tags are pointers to strings allocated by StrNew
  43.     rvoAutoCopyText,        // Default Clipboard copying: copy ANSI text (CF_TEXT)
  44.     rvoAutoCopyUnicodeText, // DCC: copy Unicode text (CF_UNICODETEXT)
  45.     rvoAutoCopyRVF,         // DCC: copy RVF ('RichView Format')
  46.     rvoAutoCopyImage,       // DCC: copy image, if it is selected
  47.     rvoAutoCopyRTF,         // DCC: copy RTF ('Rich Text Format');
  48.     rvoFormatInvalidate,    // Format and FormatTail redraws document
  49.     rvoDblClickSelectsWord, // Double click selects word
  50.     rvoRClickDeselects,     // If set, right click outside selection deselects
  51.     rvoDisallowDrag,        // If set, drag&drop from this TRichView is disabled
  52.     rvoShowItemHints,       // Shows items' hints
  53.     rvoFastFormatting       // Increase performance at the cost of some resources
  54.     );
  55.   TRVOptions = set of TRVOption;
  56.   { Values for TCustomRichView.TabNavigation }
  57.   TRVTabNavigationType = (
  58.     rvtnNone,               // Tab does nothing (the only available option for
  59.                             //   TCustomRichViewEdit)
  60.     rvtnTab,                // Tab and Shift+Tab navigate hypertext links
  61.     rvtnCtrlTab);           // Ctrl+Tab and Ctrl+Shift+Tab navigate hypertext
  62.                             //   links and controls.
  63.   { Values for TCustomRichView.DoInPaletteMode }
  64.   TRVPaletteAction = (
  65.     rvpaDoNothing,          // No special action in 256-color mode (more than 16-
  66.                             //   color images will be displayed incorrectly)
  67.     rvpaAssignPalette,      // In 256-color mode, common palette is assigned to
  68.                             // all bitmaps (inserted images are modified)
  69.     rvpaCreateCopies,       // (default and recommended) In 256-color mode,
  70.                             // paletted copies of all images are created and
  71.                             // displayed 
  72.     rvpaCreateCopiesEx);    // Reserved
  73.   { Values for TCustomRichView.BackgroundStyle }
  74.   TBackgroundStyle = (
  75.     bsNoBitmap,             // color background (no image)
  76.     bsStretched,            // stretched image (BackgroundBitmap)
  77.     bsTiled,                // tiled image
  78.     bsTiledAndScrolled,     // tiled image, scrolled with text
  79.     bsCentered,             // centered image
  80.     bsTopLeft,              // in corners
  81.     bsTopRight,
  82.     bsBottomLeft,
  83.     bsBottomRight);
  84.   TRVDisplayOption = (
  85.     rvdoImages,
  86.     rvdoComponents,
  87.     rvdoBullets);
  88.   TRVDisplayOptions = set of TRVDisplayOption;
  89.   TRVSearchOption = (
  90.     rvsroMatchCase,
  91.     rvsroDown,
  92.     rvsroWholeWord);
  93.   TRVSearchOptions = set of TRVSearchOption;
  94.   TCPEventKind = (
  95.     cpeNone,
  96.     cpeAsSectionStart,
  97.     cpeWhenVisible);
  98.   TRVScrollBarStyle = (
  99.     rvssRegular,
  100.     rvssFlat,
  101.     rvssHotTrack);
  102.   TRVRTFHighlight = (
  103.     rtfhlIgnore,
  104.     rtfhlFixedColors,
  105.     rtfhlColorTable);
  106.   TRVSmartPopupType = (rvsptDropDown, rvsptShowDialog, rvsptSimple);
  107.   {----------------------------------------------------------------------------}
  108.   { TRVScrollerInternalIfcObject: an ancestor class for objects implementing
  109.     COM interfaces. These objects are contained in RVScroller's descendants.
  110.     This class implements:
  111.     - constructor and destructor;
  112.     - methods - wrappers for methods of RVSscroller (this allows to make
  113.       RVScroller's methods protected).
  114.     Used for drag&drop.                                                        }
  115.   {$IFNDEF RVDONOTUSEDRAGDROP}
  116.   TRVScrollerInternalIfcObject = class (TInterfacedObject)
  117.     protected
  118.       FOwner: TRVScroller;
  119.       function OwnerDragEnter(X,Y: Integer): Boolean;
  120.       procedure CallOwnerDragEnterEvent(const DataObj: IDataObject;
  121.         KeyState: Integer; pt: TPoint; PossibleEffects: Integer;
  122.         var Effect: Integer);
  123.       procedure OwnerDragLeave;
  124.       function OwnerDragOver(X,Y: Integer): Boolean;
  125.       procedure CallOwnerDragOverEvent(KeyState: Integer; pt: TPoint;
  126.         PossibleEffects: Integer; var Effect: Integer);
  127.       procedure OwnerReleaseDropTargetObject;
  128.       function OwnerDrop(const DataObj: IDataObject; FMove: Boolean;
  129.         KeyState: Integer; pt: TPoint; PossibleEffects: Integer): Integer;
  130.       function OwnerCanAcceptFormat(Format: Word): Boolean;
  131.     public
  132.       constructor Create(AOwner: TRVScroller);
  133.       destructor Destroy; override;
  134.   end;
  135.   {$ENDIF}
  136. {-----------------------------------------------------------------------}
  137.   TRVScroller = class(TCustomControl)
  138.   private
  139.     FBorderStyle: TBorderStyle;
  140.     FSmallStep: Integer;
  141.     FTracking: Boolean;
  142.     FFullRedraw: Boolean;
  143.     FVScrollVisible, FHScrollVisible, FUpdatingScrollBars: Boolean;
  144.     FVScrollMax, FVScrollPage: Integer;
  145.     FHScrollMax, FHScrollPage: Integer;
  146.     FDoInPaletteMode: TRVPaletteAction;
  147.     FBiDiMode: TRVBiDiMode;
  148.     FUseXPThemes: Boolean;
  149.     {$IFDEF RVFLATSCROLLBARS}
  150.     FScrollBarStyle: TRVScrollBarStyle;
  151.     FScrollBarColor: TColor;
  152.     {$ENDIF}
  153.     { Window messages }
  154.     procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  155.     procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
  156.     procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
  157.     procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  158.     procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED;
  159.     procedure WMQueryNewPalette(var Message: TWMQueryNewPalette); message WM_QUERYNEWPALETTE;
  160.     procedure WMPaletteChanged(var Message: TWMPaletteChanged); message WM_PALETTECHANGED;
  161.     procedure WMThemeChanged(var Message: TMessage); message WM_THEMECHANGED;
  162.     procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
  163.     function GetVScrollMax: Integer;
  164.     function GetHScrollMax: Integer;
  165.     procedure SetVScrollVisible(vis: Boolean);
  166.     procedure SetHScrollVisible(vis: Boolean);
  167.     procedure SetBorderStyle(const Value: TBorderStyle);
  168.     procedure SetDoInPaletteMode(Value: TRVPaletteAction);
  169.     procedure SetVScrollPos(Value: Integer);
  170.     function GetInplaceEditor: TWinControl;
  171.     function GetChosenRVData: TPersistent;
  172.     {$IFDEF RVFLATSCROLLBARS}
  173.     procedure SetScrollBarStyle(const Value: TRVScrollBarStyle);
  174.     procedure SetScrollBarColor(const Value: TColor);
  175.     procedure UpdateScrollStyle(Redraw: Boolean);
  176.     procedure UpdateScrollColor(Redraw: Boolean);
  177.     {$ENDIF}
  178.     procedure CreateThemeHandle; virtual;
  179.     procedure FreeThemeHandle; virtual;
  180.     procedure SetUseXPThemes(const Value: Boolean);
  181.   protected
  182.     FOnVScrolled, FOnHScrolled: TNotifyEvent;
  183.     FVDisableNoScroll: ByteBool;
  184.     HPos, VPos, XSize, YSize: Integer;
  185.     KeyboardScroll: Boolean;
  186.     FChosenItem: TPersistent;
  187.     FChosenRVData: TPersistent;
  188.     FTheme: HTheme;
  189.     FScrollFactor: Integer;
  190.     {$IFDEF RICHVIEWDEF4}
  191.     FWheelStep: Integer;
  192.     function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
  193.     function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
  194.     {$ENDIF}
  195.     procedure SetBiDiModeRV(const Value: TRVBiDiMode); virtual;
  196.     procedure CreateParams(var Params: TCreateParams); override;
  197.     procedure CreateWnd; override;
  198.     procedure AfterCreateWnd1; dynamic;
  199.     procedure AfterCreateWnd2; dynamic;
  200.     procedure DestroyWnd; override;
  201.     function GetPalette: HPALETTE; override;
  202.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  203.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  204.     procedure SetVPos(p: Integer; Redraw: Boolean);virtual;
  205.     procedure SetHPos(p: Integer); virtual;
  206.     procedure ScrollChildren(dx, dy: Integer);
  207.     procedure AfterVScroll; virtual;
  208.     procedure AfterHScroll; virtual;
  209.     function GetDefSmallStep: Integer; dynamic;
  210.     function AllocLogPalette(ColorCount: Integer): PLogPalette;
  211.     procedure FreeLogPalette(var lpLogPal: PLogPalette);
  212.     function GenerateLogPalette: PLogPalette; dynamic;
  213.     //function GetLogPalette(hpal: HPALETTE):PLogPalette;
  214.     procedure UpdatePaletteInfo; dynamic;
  215.     procedure SetVSmallStep(Value: Integer); virtual;
  216.     {$IFNDEF RVDONOTUSEDRAGDROP}
  217.     { OLE drag&drop, related to IDropTarget }
  218.     function OleDragEnter(X,Y: Integer): Boolean; dynamic;
  219.     procedure CallOleDragEnterEvent(const DataObj: IDataObject;
  220.       KeyState: Integer; pt: TPoint; PossibleEffects: Integer;
  221.       var Effect: Integer); dynamic;
  222.     procedure OleDragLeave; dynamic;
  223.     function OleDragOver(X,Y: Integer): Boolean; dynamic;
  224.     procedure CallOleDragOverEvent(KeyState: Integer; pt: TPoint;
  225.       PossibleEffects: Integer; var Effect: Integer); dynamic;
  226.     procedure ReleaseOleDropTargetObject; dynamic;
  227.     function OleDrop(const DataObj: IDataObject; FMove: Boolean;
  228.       KeyState: Integer; pt: TPoint; PossibleEffects: Integer): Integer; dynamic;
  229.     function OleCanAcceptFormat(Format: Word): Boolean; dynamic;
  230.     {$ENDIF}
  231.     property Tracking: Boolean read FTracking write FTracking default True;
  232.     property OnVScrolled: TNotifyEvent read FOnVScrolled write FOnVScrolled;
  233.     property OnHScrolled: TNotifyEvent read FOnHScrolled write FOnHScrolled;
  234.     property DoInPaletteMode: TRVPaletteAction read FDoInPaletteMode write SetDoInPaletteMode;
  235.     property VSmallStep: Integer read FSmallStep write SetVSmallStep;
  236.     property InplaceEditor: TWinControl read GetInplaceEditor;
  237.     property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle;
  238.     {$IFDEF RICHVIEWDEF4}
  239.     property WheelStep: Integer read FWheelStep write FWheelStep default 2;
  240.     {$ENDIF}
  241.     {$IFDEF RVFLATSCROLLBARS}
  242.     property ScrollBarColor: TColor read FScrollBarColor write SetScrollBarColor default clBtnHighlight;
  243.     property ScrollBarStyle: TRVScrollBarStyle read FScrollBarStyle write SetScrollBarStyle default rvssRegular;
  244.     {$ENDIF}
  245.     property FullRedraw: Boolean read FFullRedraw write FFullRedraw;
  246.     property VScrollVisible: Boolean read FVScrollVisible write SetVScrollVisible default True;
  247.     property HScrollVisible: Boolean read FHScrollVisible write SetHScrollVisible default True;
  248.     property VScrollPos: Integer read VPos write SetVScrollPos;
  249.     property HScrollPos: Integer read HPos write SetHPos;
  250.     property VScrollMax: Integer read GetVScrollMax;
  251.     property HScrollMax: Integer read GetHScrollMax;
  252.   public
  253.     { All these public methods are for internal use, except for Create, Destroy
  254.       and ScrollTo }
  255.     { Variables }
  256.     RVPalette: HPALETTE;
  257.     PRVLogPalette: PLogPalette;
  258.     { Create & Destory }
  259.     constructor Create(AOwner: TComponent);override;
  260.     destructor Destroy; override;
  261.     { Size, Scrolling }
  262.     procedure UpdateScrollBars(XS, YS: Integer; UpdateH, UseDNS: Boolean);
  263.     procedure ScrollToNoRedraw(y: Integer);
  264.     procedure ScrollTo(y: Integer);
  265.     { Chosen RVData & Item }
  266.     procedure AssignChosenRVData(RVData: TPersistent; Item: TPersistent);
  267.     procedure SilentReplaceChosenRVData(RVData: TPersistent);
  268.     procedure UnassignChosenRVData(RVData: TPersistent);
  269.     procedure DestroyInplace;
  270.     { Focus }
  271.     function FocusedEx: Boolean;
  272.     procedure SetFocusSilent;
  273.     { Properties }
  274.     property AreaWidth: Integer read XSize;
  275.     property AreaHeight: Integer read YSize;    
  276.     property ChosenRVData: TPersistent read GetChosenRVData;
  277.     property ChosenItem: TPersistent read FChosenItem;
  278.     property BiDiMode: TRVBiDiMode read FBiDiMode write SetBiDiModeRV default rvbdUnspecified;
  279.     property UseXPThemes: Boolean read FUseXPThemes write SetUseXPThemes default True;
  280.     property Canvas;
  281.   end;
  282. const   rvdoALL = [rvdoImages, rvdoComponents, rvdoBullets];
  283. procedure RV_Tag2Y(AControl: TControl);
  284. function RV_GetYByTag(AControl: TControl): Integer;
  285. implementation
  286. uses CRVData, CRVFData, RVItem;
  287. var
  288.   RV_SetScrollProp: function(p1: HWND; index: Integer; newValue: Integer;
  289.     p4: Bool): Bool; stdcall;
  290.   RV_InitializeFlatSB: function(hWnd: HWND): Bool; stdcall;
  291.   RV_UninitializeFlatSB: procedure (hWnd: HWND); stdcall;
  292.   RV_ShowScrollBar: function(hWnd: HWND; wBar: Integer; bShow: BOOL): BOOL; stdcall;
  293.   RV_GetScrollInfo: function(hWnd: HWND; BarFlag: Integer;
  294.     var ScrollInfo: TScrollInfo): BOOL; stdcall;
  295.   RV_GetScrollPos: function(hWnd: HWND; nBar: Integer): Integer; stdcall;
  296.   RV_SetScrollPos: function(hWnd: HWND; nBar, nPos: Integer;
  297.     bRedraw: BOOL): Integer; stdcall;
  298.   RV_SetScrollInfo: function(hWnd: HWND; BarFlag: Integer;
  299.     const ScrollInfo: TScrollInfo; Redraw: BOOL): Integer; stdcall;
  300.   RV_EnableScrollBar: function(hWnd: HWND; wSBflags, wArrows: UINT): BOOL; stdcall;
  301. {------------------------------------------------------}
  302. function RV_GetYByTag(AControl: TControl): Integer;
  303. begin
  304.   if AControl.Tag>10000 then
  305.     Result := 10000
  306.   else if AControl.Tag<-10000 then
  307.     Result := -10000
  308.   else
  309.     Result := AControl.Tag;
  310. end;
  311. {------------------------------------------------------}
  312. procedure RV_Tag2Y(AControl: TControl);
  313. begin
  314.   AControl.Top := RV_GetYByTag(AControl);
  315. end;
  316. {------------------------------------------------------------------------------}
  317. constructor TRVScroller.Create(AOwner: TComponent);
  318. begin
  319.  inherited Create(AOwner);
  320.  FUseXPThemes    := True;
  321.  FSmallStep      := 1;
  322.  KeyboardScroll  := True;
  323.  TabStop         := True;
  324.  FTracking       := True;
  325.  FFullRedraw     := False;
  326.  FVScrollVisible := True;
  327.  FHScrollVisible := True;
  328.  FBorderStyle    := bsNone;
  329.  FScrollFactor   := 1;
  330.  {$IFDEF RICHVIEWDEF4}
  331.  WheelStep       := 2;
  332.  BorderWidth     := 0;
  333.  {$ENDIF}
  334.  {$IFDEF RICHVIEWCBDEF3}
  335.  FDoInPaletteMode := rvpaCreateCopies;
  336.  {$ELSE}
  337.  FDoInPaletteMode := rvpaDoNothing;
  338.  {$ENDIF}
  339.  ControlStyle    := ControlStyle+[csReplicatable]{+[csFramed]};
  340.  {$IFDEF RVFLATSCROLLBARS}
  341.  FScrollBarStyle := rvssRegular;
  342.  FScrollBarColor := clBtnHighlight;
  343.  {$ENDIF}
  344. end;
  345. {------------------------------------------------------------------------------}
  346. destructor TRVScroller.Destroy;
  347. begin
  348.   if RVPalette<>0 then
  349.     DeleteObject(RVPalette);
  350.   FreeLogPalette(PRVLogPalette);
  351.   inherited Destroy;
  352. end;
  353. {------------------------------------------------------------------------------}
  354. procedure TRVScroller.CreateParams(var Params: TCreateParams);
  355. const
  356.   BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER);
  357. begin
  358.   inherited   CreateParams(Params);   //CreateWindow
  359.   with Params do
  360.   begin
  361.     Style := Style or BorderStyles[FBorderStyle];
  362.     if NewStyleControls and Ctl3D and (FBorderStyle = bsSingle) then
  363.     begin
  364.       Style := Style and not WS_BORDER;
  365.       ExStyle := ExStyle or WS_EX_CLIENTEDGE;
  366.     end;
  367.     if BiDiMode=rvbdRightToLeft then
  368.       ExStyle := ExStyle or WS_EX_LEFTSCROLLBAR;
  369.     //WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
  370.   end;
  371.   Params.Style := Params.Style or WS_CLIPCHILDREN or WS_HSCROLL or WS_VSCROLL;
  372.   FVDisableNoScroll := False;
  373. end;
  374. {------------------------------------------------------}
  375. procedure  TRVScroller.CreateWnd;
  376. begin
  377.   inherited CreateWnd;
  378.   FSmallStep := GetDefSmallStep;
  379.   AfterCreateWnd1;
  380.   if {$IFDEF RICHVIEWDEF4} not SysLocale.MiddleEast and {$ENDIF}
  381.      Assigned(RV_InitializeFlatSB) then
  382.     RV_InitializeFlatSB(Handle);
  383.   {$IFDEF RVFLATSCROLLBARS}
  384.   UpdateScrollStyle(False);
  385.   UpdateScrollColor(False);
  386.   {$ENDIF}
  387.   CreateThemeHandle;
  388.   AfterCreateWnd2;
  389. end;
  390. {------------------------------------------------------}
  391. procedure TRVScroller.DestroyWnd;
  392. begin
  393.   inherited DestroyWnd;
  394.   FreeThemeHandle;
  395. end;
  396. {------------------------------------------------------}
  397. procedure TRVScroller.UpdateScrollBars(XS, YS: Integer; UpdateH, UseDNS: Boolean);
  398. var
  399.   ScrollInfo: TScrollInfo;
  400. begin
  401.   if FUpdatingScrollBars or not HandleAllocated then
  402.     exit;
  403.   FUpdatingScrollBars := True;
  404.   try
  405.     ScrollInfo.cbSize := SizeOf(ScrollInfo);
  406.     if UpdateH then begin
  407.       XSize := XS;
  408.       FHScrollPage := ClientWidth;
  409.       FHScrollMax := XSize-1;
  410.       if HScrollVisible then begin
  411.         ScrollInfo.fMask := SIF_ALL;
  412.         ScrollInfo.nMin := 0;
  413.         ScrollInfo.nMax := FHScrollMax;
  414.         ScrollInfo.nPage := ClientWidth;
  415.         if HPos > ScrollInfo.nMax - (Integer(ScrollInfo.nPage)-1) then
  416.           HPos := ScrollInfo.nMax - (Integer(ScrollInfo.nPage)-1);
  417.         if HPos<0 then HPos := 0;
  418.         ScrollInfo.nPos := HPos;
  419.         ScrollInfo.nTrackPos := 0;
  420.         RV_SetScrollInfo(Handle, SB_HORZ, ScrollInfo, True);
  421.         end
  422.       else begin
  423.         ScrollInfo.fMask := SIF_ALL;
  424.         RV_GetScrollInfo(Handle, SB_HORZ, ScrollInfo);
  425.         with ScrollInfo do
  426.           if (nMin<>0) or (nMax<>1) or (nPage<>0) or (nPos<>0) then begin
  427.             fMask := SIF_ALL;
  428.             nMin := 0;
  429.             nMax := 1;
  430.             nPage := 2;
  431.             nPos := 0;
  432.             RV_SetScrollInfo(Handle, SB_HORZ, ScrollInfo, True);
  433.           end;
  434.       end;
  435.     end;
  436.     YSize := YS;
  437.     FVScrollPage := ClientHeight div FSmallStep;
  438. //    if ClientHeight mod FSmallStep >0 then
  439. //      inc(FVScrollPage);
  440.     FVScrollMax := YSize-1;
  441.     if VPos > FVScrollMax - (FVScrollPage-1) then
  442.       VPos := FVScrollMax - (FVScrollPage-1);
  443.     if VPos<0 then VPos := 0;
  444.     if VScrollVisible then begin
  445.       ScrollInfo.cbSize := SizeOf(ScrollInfo);
  446.       ScrollInfo.fMask := SIF_ALL;
  447.       if UseDNS and FVDisableNoScroll then
  448.         ScrollInfo.fMask := ScrollInfo.fMask or SIF_DISABLENOSCROLL;
  449.       ScrollInfo.nMin := 0;
  450.       ScrollInfo.nPage := FVScrollPage;
  451.       ScrollInfo.nMax := FVScrollMax;
  452.       ScrollInfo.nPos := VPos;
  453.       ScrollInfo.nTrackPos := 0;
  454.       RV_SetScrollInfo(Handle, SB_VERT, ScrollInfo, True);
  455.       end
  456.     else begin
  457.       ScrollInfo.fMask := SIF_ALL;
  458.       RV_GetScrollInfo(Handle, SB_VERT, ScrollInfo);
  459.       with ScrollInfo do
  460.         if (nMin<>0) or (nMax<>1) or (nPage<>0) or (nPos<>0) then begin
  461.           fMask := SIF_ALL;
  462.           nMin := 0;
  463.           nMax := 1;
  464.           nPage := 2;
  465.           nPos := 0;
  466.           RV_SetScrollInfo(Handle, SB_VERT, ScrollInfo, True);
  467.         end;
  468.     end;
  469.     {$IFDEF RICHVIEWDEF4}
  470.     if Assigned(OnResize) then
  471.       OnResize(Self);
  472.     {$ENDIF}
  473.   finally
  474.     FUpdatingScrollBars := False;
  475.   end;
  476. end;
  477. {------------------------------------------------------}
  478. procedure TRVScroller.ScrollChildren(dx, dy: Integer);
  479. var i: Integer;
  480. begin
  481.   if (dx=0) and (dy=0) then exit;
  482.   for i:=0 to ControlCount-1 do begin
  483.    if dy<>0 then begin
  484.     Controls[i].Tag := Controls[i].Tag+dy;
  485.     RV_Tag2Y(Controls[i]);
  486.    end;
  487.    if dx<>0 then Controls[i].Left := Controls[i].Left + dx;
  488.   end
  489. end;
  490. {------------------------------------------------------}
  491. procedure TRVScroller.WMHScroll(var Message: TWMHScroll);
  492. begin
  493.   with Message do
  494.     case ScrollCode of
  495.       SB_LINEUP: SetHPos(HPos - FSmallStep*FScrollFactor);
  496.       SB_LINEDOWN: SetHPos(HPos + FSmallStep*FScrollFactor);
  497.       SB_PAGEUP: SetHPos(HPos-ClientWidth);
  498.       SB_PAGEDOWN: SetHPos(HPos+ClientWidth);
  499.       SB_THUMBPOSITION: SetHPos(Pos);
  500.       SB_THUMBTRACK: if FTracking then SetHPos(Pos);
  501.       SB_TOP: SetHPos(0);
  502.       SB_BOTTOM: SetHPos(XSize);
  503.     end;
  504. end;
  505. {------------------------------------------------------}
  506. procedure TRVScroller.WMVScroll(var Message: TWMVScroll);
  507. begin
  508.   with Message do
  509.     case ScrollCode of
  510.       SB_LINEUP: SetVScrollPos(VPos - FScrollFactor);
  511.       SB_LINEDOWN: SetVScrollPos(VPos + FScrollFactor);
  512.       SB_PAGEUP: SetVScrollPos(VPos-(ClientHeight div FSmallStep));
  513.       SB_PAGEDOWN: SetVScrollPos(VPos+(ClientHeight div FSmallStep));
  514.       SB_THUMBPOSITION: SetVScrollPos(Pos);
  515.       SB_THUMBTRACK: if FTracking then SetVScrollPos(Pos);
  516.       SB_TOP: SetVScrollPos(0);
  517.       SB_BOTTOM: SetVScrollPos(YSize);
  518.     end;
  519. end;
  520. {------------------------------------------------------}
  521. procedure TRVScroller.KeyDown(var Key: Word; Shift: TShiftState);
  522. var vScrollNotify, hScrollNotify: Integer;
  523. begin
  524.   inherited KeyDown(Key, Shift);
  525.   if not KeyboardScroll then exit;
  526.   vScrollNotify := -1;
  527.   hScrollNotify := -1;
  528.     case Key of
  529.         VK_UP:
  530.             vScrollNotify := SB_LINEUP;
  531.         VK_PRIOR:
  532.             vScrollNotify := SB_PAGEUP;
  533.         VK_NEXT:
  534.             vScrollNotify := SB_PAGEDOWN;
  535.         VK_DOWN:
  536.             vScrollNotify := SB_LINEDOWN;
  537.         VK_HOME:
  538.             vScrollNotify := SB_TOP;
  539.         VK_END:
  540.             vScrollNotify := SB_BOTTOM;
  541.         VK_LEFT:
  542.             hScrollNotify := SB_LINELEFT;
  543.         VK_RIGHT:
  544.             hScrollNotify := SB_LINERIGHT;
  545.     end;
  546.   if (vScrollNotify <> -1) then
  547.         Perform(WM_VSCROLL, vScrollNotify, 0);
  548.   if (hScrollNotify <> -1) then
  549.         Perform(WM_HSCROLL, hScrollNotify, 0);
  550. end;
  551. {------------------------------------------------------------------------------}
  552. procedure TRVScroller.SetVScrollPos(Value: Integer);
  553. begin
  554.   SetVPos(Value,True);
  555. end;
  556. {------------------------------------------------------------------------------}
  557. procedure TRVScroller.SetVPos(p: Integer; Redraw: Boolean);
  558. var   ScrollInfo: TScrollInfo;
  559.       oldPos: Integer;
  560.       r: TRect;
  561. begin
  562.   if not HandleAllocated then exit;
  563.   OldPos := VPos;
  564.   VPos := p;
  565.   if VScrollVisible then begin
  566.     ScrollInfo.cbSize := SizeOf(ScrollInfo);
  567.     ScrollInfo.nPos := VPos;
  568.     ScrollInfo.fMask := SIF_POS;
  569.     RV_SetScrollInfo(Handle, SB_VERT, ScrollInfo, True);
  570.     RV_GetScrollInfo(Handle, SB_VERT, ScrollInfo);
  571.     VPos := ScrollInfo.nPos;
  572.     end
  573.   else begin
  574.     if VPos > FVScrollMax - (FVScrollPage-1) then
  575.       VPos := FVScrollMax - (FVScrollPage-1);
  576.     if VPos<0 then VPos := 0;
  577.   end;
  578.   r := ClientRect;
  579.   if OldPos-VPos <> 0 then begin
  580.    if not Redraw then begin
  581.      ScrollChildren(0, (OldPos-VPos)*FSmallStep);
  582.      AfterVScroll;
  583.      exit;
  584.    end;
  585.    if FFullRedraw then begin
  586.          ScrollChildren(0, (OldPos-VPos)*FSmallStep);
  587.          Refresh;
  588.        end
  589.    else begin
  590.          ScrollWindowEx(Handle, 0, (OldPos-VPos)*FSmallStep, nil, @r, 0, nil, SW_INVALIDATE {or
  591.                    SW_SCROLLCHILDREN});
  592.          ScrollChildren(0, (OldPos-VPos)*FSmallStep);
  593.          Update;
  594.        end;
  595.    AfterVScroll;
  596.   end;
  597. end;
  598. {------------------------------------------------------}
  599. procedure TRVScroller.SetHPos(p: Integer);
  600. var   ScrollInfo: TScrollInfo;
  601.       oldPos: Integer;
  602.       r: TRect;
  603. begin
  604.   if not HandleAllocated then exit;
  605.   OldPos := HPos;
  606.   HPos := p;
  607.   if HScrollVisible then begin
  608.     ScrollInfo.cbSize := SizeOf(ScrollInfo);
  609.     ScrollInfo.nPos := HPos;
  610.     ScrollInfo.fMask := SIF_POS;
  611.     RV_SetScrollInfo(Handle, SB_HORZ, ScrollInfo, True);
  612.     RV_GetScrollInfo(Handle, SB_HORZ, ScrollInfo);
  613.     HPos := ScrollInfo.nPos;
  614.     end
  615.   else begin
  616.     if HPos > FHScrollMax - (FHScrollPage-1) then
  617.       HPos := FHScrollMax - (FHScrollPage-1);
  618.     if HPos<0 then HPos := 0;
  619.   end;
  620.   r := ClientRect;
  621.   if OldPos-HPos <> 0 then begin
  622.    if FFullRedraw then begin
  623.          ScrollChildren((OldPos-HPos), 0);
  624.          Refresh;
  625.        end
  626.    else begin
  627.          ScrollWindowEx(Handle, (OldPos-HPos), 0,  nil, @r, 0, nil, SW_INVALIDATE{or
  628.                    SW_SCROLLCHILDREN});
  629.          ScrollChildren((OldPos-HPos), 0);
  630.          Update;
  631.        end;
  632.    AfterHScroll;
  633.   end;
  634. end;
  635. {------------------------------------------------------}
  636. procedure TRVScroller.ScrollToNoRedraw(y: Integer);
  637. begin
  638.     SetVPos(y div FSmallStep, False);
  639. end;
  640. {------------------------------------------------------}
  641. procedure TRVScroller.ScrollTo(y: Integer);
  642. begin
  643.     SetVPos(y div FSmallStep, True);
  644. end;
  645. {-------------------------------------------------------}
  646. function TRVScroller.GetVScrollMax: Integer;
  647. var ScrollInfo: TScrollInfo;
  648. begin
  649.   if VScrollVisible then begin
  650.     ScrollInfo.cbSize := SizeOf(ScrollInfo);
  651.     ScrollInfo.nPos := VPos;
  652.     ScrollInfo.fMask := SIF_RANGE or SIF_PAGE;
  653.     RV_GetScrollInfo(Handle, SB_VERT, ScrollInfo);
  654.     Result := ScrollInfo.nMax - Integer(ScrollInfo.nPage)+1;
  655.     end
  656.   else
  657.     Result := FVScrollMax - (FVScrollPage-1);
  658. end;
  659. {-------------------------------------------------------}
  660. function TRVScroller.GetHScrollMax: Integer;
  661. var ScrollInfo: TScrollInfo;
  662. begin
  663.   if HScrollVisible then begin
  664.     ScrollInfo.cbSize := SizeOf(ScrollInfo);
  665.     ScrollInfo.nPos := HPos;
  666.     ScrollInfo.fMask := SIF_RANGE or SIF_PAGE;
  667.     RV_GetScrollInfo(Handle, SB_HORZ, ScrollInfo);
  668.     Result := ScrollInfo.nMax - Integer(ScrollInfo.nPage)+1;
  669.     end
  670.   else
  671.     Result := FHScrollMax - (FHScrollPage-1);
  672. end;
  673. {-------------------------------------------------------}
  674. procedure TRVScroller.SetVScrollVisible(vis: Boolean);
  675. var Changed: Boolean;
  676. begin
  677.   Changed := FVScrollVisible<>vis;
  678.   FVScrollVisible := vis;
  679.   if not HandleAllocated then exit;
  680.   if not (csLoading in ComponentState) then begin
  681.     UpdateScrollBars(XSize, YSize, True, False);
  682.     if FVScrollVisible and Changed and FVDisableNoScroll then begin
  683.       UpdateScrollBars(XSize, YSize, True, True);
  684.       RV_ShowScrollBar(Handle, SB_VERT, True);
  685.     end;
  686.     end
  687.   else
  688.     UpdateScrollBars(XSize, YSize, True, True);
  689. end;
  690. {-------------------------------------------------------}
  691. procedure TRVScroller.SetHScrollVisible(vis: Boolean);
  692. begin
  693.   FHScrollVisible := vis;
  694.   UpdateScrollBars(XSize, YSize, True, True);
  695. end;
  696. {-------------------------------------------------------}
  697. procedure TRVScroller.WMGetDlgCode(var Message: TWMGetDlgCode);
  698. begin
  699.   Message.Result := DLGC_WANTARROWS;
  700. end;
  701. {-------------------------------------------------------}
  702. procedure TRVScroller.AfterVScroll;
  703. begin
  704.   if Assigned(FOnVScrolled) then FOnVScrolled(Self);
  705. end;
  706. {-------------------------------------------------------}
  707. procedure TRVScroller.AfterHScroll;
  708. begin
  709.   if Assigned(FOnHScrolled) then FOnHScrolled(Self);
  710. end;
  711. {-------------------------------------------------------}
  712. procedure TRVScroller.SetBorderStyle(const Value: TBorderStyle);
  713. begin
  714.   if FBorderStyle <> Value then begin
  715.     FBorderStyle := Value;
  716.     RecreateWnd;
  717.   end;
  718. end;
  719. {-------------------------------------------------------}
  720. procedure TRVScroller.CMCtl3DChanged(var Message: TMessage);
  721. begin
  722.   if NewStyleControls and (FBorderStyle = bsSingle) then
  723.     RecreateWnd;
  724.   inherited;
  725. end;
  726. {-------------------------------------------------------}
  727. function TRVScroller.GetDefSmallStep: Integer;
  728. begin
  729.   Result := 10;
  730. end;
  731. {$R-}
  732. function TRVScroller.AllocLogPalette(ColorCount: Integer): PLogPalette;
  733. begin
  734.   Result := PLogPalette(
  735.                 GlobalAlloc(GPTR, SizeOf(TLogPalette) + (ColorCount-1) * SizeOf(TPaletteEntry))
  736.                 );
  737.   Result^.palVersion := $0300;
  738.   Result^.palNumEntries := ColorCount;
  739. end;
  740. {------------------------------------------------------------------------------}
  741. procedure TRVScroller.FreeLogPalette(var lpLogPal: PLogPalette);
  742. begin
  743.   if lpLogPal<>nil then
  744.     GlobalFree(Cardinal(lpLogPal));
  745.   lpLogPal := nil;
  746. end;
  747. {------------------------------------------------------------------------------}
  748. function TRVScroller.GenerateLogPalette: PLogPalette;
  749. var red, green, blue, i: Integer;
  750.     var ColorCount: Integer;
  751. begin
  752.   ColorCount := 6*6*6;
  753.   Result := AllocLogPalette(ColorCount);
  754.   i := 0;
  755.   for blue := 0 to 5 do
  756.     for green := 0 to 5 do
  757.       for red := 0 to 5 do
  758.         with Result^.palPalEntry[i] do begin
  759.           peRed := red*51;
  760.           peGreen := green*51;
  761.           peBlue := blue*51;
  762.           peFlags := 0;
  763.           inc(i);
  764.         end;
  765. end;
  766. {------------------------------------------------------------------------------}
  767. {
  768. function TRVScroller.GetLogPalette(hpal: HPALETTE):PLogPalette;
  769. var ColorCount: Integer;
  770. begin
  771.   Result := nil;
  772.   ColorCount := 0;
  773.   if hpal=0 then
  774.     exit;
  775.   if (GetObject(hpal, 2, @ColorCount)=0) or
  776.      (ColorCount=0) then exit;
  777.   Result := AllocLogPalette(ColorCount);
  778.   GetPaletteEntries(hpal, 0, ColorCount, Result^.palPalEntry);
  779. end;
  780. }
  781. {------------------------------------------------------------------------------}
  782. function IsPaletteMode: Boolean;
  783. var ScreenDC: HDC;
  784. begin
  785.   ScreenDC := CreateCompatibleDC(0);
  786.   Result := (GetDeviceCaps(ScreenDC,RASTERCAPS) and RC_PALETTE)<>0;
  787.   DeleteDC(ScreenDC);
  788. end;
  789. {------------------------------------------------------------------------------}
  790. procedure TRVScroller.SetDoInPaletteMode(Value: TRVPaletteAction);
  791. begin
  792.   if Value<>FDoInPaletteMode then begin
  793.     FDoInPaletteMode := Value;
  794.     UpdatePaletteInfo;
  795.   end;
  796. end;
  797. {------------------------------------------------------------------------------}
  798. procedure TRVScroller.UpdatePaletteInfo;
  799. begin
  800.   if not (csDesigning in ComponentState) and
  801.     (DoInPaletteMode<>rvpaDoNothing) and
  802.     IsPaletteMode then begin
  803.     if RVPalette=0 then begin
  804.       PRVLogPalette := GenerateLogPalette;
  805.       RVPalette := CreatePalette(PRVLogPalette^);
  806.     end;
  807.     end
  808.   else begin
  809.     if RVPalette<>0 then
  810.       DeleteObject(RVPalette);
  811.     RVPalette := 0;
  812.     FreeLogPalette(PRVLogPalette);
  813.   end;
  814. end;
  815. {------------------------------------------------------------------------------}
  816. function TRVScroller.GetPalette: HPALETTE;
  817. begin
  818.   Result := RVPalette;
  819. end;
  820. {------------------------------------------------------------------------------}
  821. procedure TRVScroller.WMQueryNewPalette(var Message: TWMQueryNewPalette);
  822. begin
  823.   inherited;
  824.   Invalidate;
  825. end;
  826. {------------------------------------------------------------------------------}
  827. procedure TRVScroller.WMPaletteChanged(var Message: TWMPaletteChanged);
  828. //var DC: HDC;
  829. begin
  830.   inherited;
  831.   {if (Message.PalChg<>Handle) and (RVPalette<>0) then begin
  832.     DC := GetWindowDC(Handle);
  833.     UpdateColors(DC);
  834.     ReleaseDC(Handle, DC);}
  835.     Invalidate;
  836. {  end;}
  837. end;
  838. {------------------------------------------------------------------------------}
  839. procedure TRVScroller.AssignChosenRVData(RVData: TPersistent; Item: TPersistent);
  840. var Editor: TWinControl;
  841. begin
  842.   if RVData<>FChosenRVData then begin
  843.     DestroyInplace;
  844.     UnassignChosenRVData(FChosenRVData);
  845.     FChosenRVData := RVData;
  846.     FChosenItem   := Item;
  847.   end;
  848.   Editor := InplaceEditor;
  849.   if Editor<>nil then
  850.     Editor.Tag := Editor.Top;
  851. end;
  852. {------------------------------------------------------------------------------}
  853. procedure TRVScroller.SilentReplaceChosenRVData(RVData: TPersistent);
  854. begin
  855.   FChosenRVData := RVData;
  856.   if RVData=nil then
  857.     FChosenItem := nil;
  858. end;
  859. {------------------------------------------------------------------------------}
  860. procedure TRVScroller.UnassignChosenRVData(RVData: TPersistent);
  861. begin
  862.   if (RVData=FChosenRVData) or
  863.      ((FChosenRVData<>nil) and (TCustomRVData(FChosenRVData).GetRVData=RVData)) then begin
  864.     if (FChosenRVData<>nil) and not (csDestroying in ComponentState) then
  865.       TCustomRVFormattedData(TCustomRVFormattedData(FChosenRVData).GetRVData).Deselect(nil,False);
  866.     FChosenRVData := nil;
  867.     if FChosenItem<>nil then
  868.       TCustomRVItemInfo(FChosenItem).CleanUpChosen;
  869.     FChosenItem   := nil;
  870.   end;
  871. end;
  872. {------------------------------------------------------------------------------}
  873. procedure TRVScroller.DestroyInplace;
  874. begin
  875.   InplaceEditor.Free;
  876. end;
  877. {------------------------------------------------------------------------------}
  878. procedure TRVScroller.MouseDown(Button: TMouseButton; Shift: TShiftState;
  879.   X, Y: Integer);
  880. begin
  881.   //DestroyInplace;
  882.   inherited;
  883. end;
  884. {------------------------------------------------------------------------------}
  885. procedure TRVScroller.WMSetFocus(var Message: TWMSetFocus);
  886.   function IsDestroying: Boolean;
  887.   var ctrl: TWinControl;
  888.   begin
  889.     Result := False;
  890.     ctrl := Self;
  891.     while (ctrl<>nil) and (ctrl is TRVScroller) do begin
  892.       Result := (csDestroying in ctrl.ComponentState);
  893.       if Result then
  894.         exit;
  895.       ctrl := ctrl.Parent;
  896.     end;
  897.   end;
  898. begin
  899.   inherited;
  900.   if not IsDestroying and (InplaceEditor<>nil) then
  901.     InplaceEditor.SetFocus;
  902. end;
  903. {------------------------------------------------------------------------------}
  904. procedure TRVScroller.SetVSmallStep(Value: Integer);
  905. begin
  906.   FSmallStep := Value;
  907. end;
  908. {------------------------------------------------------------------------------}
  909. procedure TRVScroller.SetBiDiModeRV(const Value: TRVBiDiMode);
  910. begin
  911.   if FBiDiMode<>Value then begin
  912.     FBiDiMode := Value;
  913.     RecreateWnd;
  914.   end;
  915. end;
  916. {------------------------------------------------------------------------------}
  917. {$IFDEF RVFLATSCROLLBARS}
  918. procedure TRVScroller.SetScrollBarStyle(const Value: TRVScrollBarStyle);
  919. begin
  920.   if Value<>FScrollBarStyle then begin
  921.     FScrollBarStyle := Value;
  922.     UpdateScrollStyle(True);
  923.   end;
  924. end;
  925. {------------------------------------------------------------------------------}
  926. procedure TRVScroller.SetScrollBarColor(const Value: TColor);
  927. begin
  928.   if Value<>FScrollBarColor then begin
  929.     FScrollBarColor := Value;
  930.     UpdateScrollColor(True);
  931.   end;
  932. end;
  933. {------------------------------------------------------------------------------}
  934. procedure TRVScroller.UpdateScrollStyle(Redraw: Boolean);
  935. const
  936.   FSB_FLAT_MODE     = 2;
  937.   FSB_ENCARTA_MODE  = 1;
  938.   FSB_REGULAR_MODE  = 0;
  939.   WSB_PROP_VSTYLE   = $00000100;
  940.   WSB_PROP_HSTYLE   = $00000200;
  941.   Styles: array[TRVScrollBarStyle] of Integer =
  942.   (FSB_REGULAR_MODE, FSB_ENCARTA_MODE, FSB_FLAT_MODE);
  943. begin
  944.   if HandleAllocated and Assigned(RV_SetScrollProp) then begin
  945.     RV_SetScrollProp(Handle, WSB_PROP_HSTYLE, Styles[FScrollBarStyle], Redraw);
  946.     RV_SetScrollProp(Handle, WSB_PROP_VSTYLE, Styles[FScrollBarStyle], Redraw);
  947.   end;
  948. end;
  949. {------------------------------------------------------------------------------}
  950. procedure TRVScroller.UpdateScrollColor(Redraw: Boolean);
  951. begin
  952.   if HandleAllocated and Assigned(RV_SetScrollProp) then begin
  953.     RV_SetScrollProp(Handle, WSB_PROP_HBKGCOLOR, ColorToRGB(FScrollBarColor), Redraw);
  954.     RV_SetScrollProp(Handle, WSB_PROP_VBKGCOLOR, ColorToRGB(FScrollBarColor), Redraw);
  955.   end;
  956. end;
  957. {$ENDIF}
  958. {------------------------------------------------------------------------------}
  959. {$IFDEF RICHVIEWDEF4}
  960. function TRVScroller.DoMouseWheelDown(Shift: TShiftState;
  961.   MousePos: TPoint): Boolean;
  962. var V: Integer;
  963. begin
  964.   inherited DoMouseWheelDown(Shift, MousePos);
  965.   V := 0;
  966.   if not SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @V, 0) then
  967.     V := 3;
  968.   if V<0 then
  969.     VScrollPos := VPos+(ClientHeight div FSmallStep)
  970.   else
  971.     VScrollPos := VScrollPos+Round(WheelStep*V/3);
  972.   Result := WheelStep<>0;
  973. end;
  974. {------------------------------------------------------------------------------}
  975. function TRVScroller.DoMouseWheelUp(Shift: TShiftState;
  976.   MousePos: TPoint): Boolean;
  977. var V: Integer;
  978. begin
  979.   inherited DoMouseWheelUp(Shift, MousePos);
  980.   V := 0;
  981.   if not SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @V, 0) then
  982.     V := 3;
  983.   if V<0 then
  984.     VScrollPos := VPos-(ClientHeight div FSmallStep)
  985.   else
  986.     VScrollPos := VScrollPos-Round(WheelStep*V/3);
  987.   Result := WheelStep<>0;
  988. end;
  989. {$ENDIF}
  990. {------------------------------------------------------------------------------}
  991. procedure InitSB;
  992. {$IFDEF RVFLATSCROLLBARS}
  993. var
  994.   Handle: THandle;
  995. {$ENDIF}
  996. begin
  997.   // Unfortunately, flat scrollbars do not work properly.
  998.   // They are OK in Win2000 + IE5, but when tested in
  999.   // Win95 + IE4, editor window initially always has
  1000.   // wrong and not working scroll bars (they become OK
  1001.   // after manual resizing of window).
  1002.   // I do not know how to defeat it. The problem appears
  1003.   // in DISABLENOSCROLL option.
  1004.   RV_InitializeFlatSB := nil;
  1005.   RV_UninitializeFlatSB := nil;
  1006.   RV_SetScrollProp    := nil;
  1007.   @RV_ShowScrollBar  := @ShowScrollBar;
  1008.   @RV_GetScrollInfo  := @GetScrollInfo;
  1009.   @RV_GetScrollPos   := @GetScrollPos;
  1010.   @RV_SetScrollPos   := @SetScrollPos;
  1011.   @RV_SetScrollInfo  := @SetScrollInfo;
  1012.   @RV_EnableScrollBar:= @EnableScrollBar;
  1013.   {$IFDEF RVFLATSCROLLBARS}
  1014.   Handle := GetModuleHandle('comctl32.dll');
  1015.   if Handle <> 0 then
  1016.   begin
  1017.     @RV_InitializeFlatSB := GetProcAddress(Handle, 'InitializeFlatSB');
  1018.     @RV_UninitializeFlatSB := GetProcAddress(Handle, 'UninitializeFlatSB');
  1019.     @RV_SetScrollProp := GetProcAddress(Handle, 'FlatSB_SetScrollProp');
  1020.     @RV_ShowScrollBar := GetProcAddress(Handle, 'FlatSB_ShowScrollBar');
  1021.     if not Assigned(RV_ShowScrollBar) then
  1022.       @RV_ShowScrollBar := @ShowScrollBar;
  1023.     @RV_GetScrollInfo := GetProcAddress(Handle, 'FlatSB_GetScrollInfo');
  1024.     if not Assigned(RV_GetScrollInfo) then
  1025.       @RV_GetScrollInfo := @GetScrollInfo;
  1026.     @RV_GetScrollPos := GetProcAddress(Handle, 'FlatSB_GetScrollPos');
  1027.     if not Assigned(RV_GetScrollPos) then
  1028.       @RV_GetScrollPos := @GetScrollPos;
  1029.     @RV_SetScrollPos := GetProcAddress(Handle, 'FlatSB_SetScrollPos');
  1030.     if not Assigned(RV_SetScrollPos) then
  1031.       @RV_SetScrollPos := @SetScrollPos;
  1032.     @RV_SetScrollInfo := GetProcAddress(Handle, 'FlatSB_SetScrollInfo');
  1033.     if not Assigned(RV_SetScrollInfo) then
  1034.       @RV_SetScrollInfo := @SetScrollInfo;
  1035.     @RV_EnableScrollBar := GetProcAddress(Handle, 'FlatSB_EnableScrollBar');
  1036.     if not Assigned(RV_EnableScrollBar) then
  1037.       @RV_EnableScrollBar := @EnableScrollBar;
  1038.   end;
  1039.   {$ENDIF}
  1040. end;
  1041. {------------------------------------------------------------------------------}
  1042. function TRVScroller.FocusedEx: Boolean;
  1043. var Editor: TWinControl;
  1044. begin
  1045.   Result := False;
  1046.   Editor := Self;
  1047.   while Editor<>nil do begin
  1048.     if Editor.Focused then begin
  1049.       Result := True;
  1050.       exit;
  1051.     end;
  1052.     if Editor is TRVScroller then
  1053.       Editor := TRVScroller(Editor).InplaceEditor;
  1054.   end;
  1055. end;
  1056. {------------------------------------------------------------------------------}
  1057. function TRVScroller.GetInplaceEditor: TWinControl;
  1058. begin
  1059.   if FChosenRVData=nil then
  1060.     Result := nil
  1061.   else
  1062.     Result := TCustomRVFormattedData(FChosenRVData).GetEditor;
  1063. end;
  1064. {------------------------------------------------------------------------------}
  1065. function TRVScroller.GetChosenRVData: TPersistent;
  1066. begin
  1067.   if FChosenRVData=nil then
  1068.     Result := nil
  1069.   else
  1070.     Result := TCustomRVData(FChosenRVData).GetRVData;
  1071. end;
  1072. {------------------------------------------------------------------------------}
  1073. procedure TRVScroller.SetFocusSilent;
  1074. {$IFNDEF RVNESTEDFORMS}
  1075. {$IFDEF RICHVIEWCBDEF3}
  1076. var Form: TCustomForm;
  1077. {$ELSE}
  1078. var Form: TForm;
  1079. {$ENDIF}
  1080. {$ENDIF}
  1081. begin
  1082.   if not CanFocus then
  1083.     exit;
  1084.   {$IFDEF RVNESTEDFORMS}
  1085.   Windows.SetFocus(Self.Handle);
  1086.   {$ELSE}
  1087.   Form := GetParentForm(Self);
  1088.   if Form<>nil then
  1089.     Form.ActiveControl := Self;
  1090.   {$ENDIF}
  1091. end;
  1092. {------------------------------------------------------------------------------}
  1093. procedure TRVScroller.CreateThemeHandle;
  1094. begin
  1095.   if UseXPThemes and Assigned(RV_IsAppThemed) and RV_IsAppThemed() and
  1096.      RV_IsThemeActive() then
  1097.     FTheme := RV_OpenThemeData(Handle, Pointer(PChar(RVWCEDIT)))
  1098.   else
  1099.     FTheme := 0;
  1100. end;
  1101. {------------------------------------------------------------------------------}
  1102. procedure TRVScroller.FreeThemeHandle;
  1103. begin
  1104.   if FTheme<>0 then
  1105.     RV_CloseThemeData(FTheme);
  1106. end;
  1107. {------------------------------------------------------------------------------}
  1108. procedure TRVScroller.WMThemeChanged(var Message: TMessage);
  1109. begin
  1110.   inherited;
  1111.   FreeThemeHandle;
  1112.   CreateThemeHandle;
  1113.   SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);
  1114.   RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_ERASE);
  1115.   Message.Result := 1;
  1116. end;
  1117. procedure TRVScroller.WMNCPaint(var Message: TMessage);
  1118. var
  1119.   DC: HDC;
  1120.   RC, RW: TRect;
  1121. begin
  1122.   if FTheme=0 then begin
  1123.     inherited;
  1124.     exit;
  1125.   end;
  1126.   if (BorderStyle = bsSingle) then begin
  1127.     DefaultHandler(Message);
  1128.     DC := GetWindowDC(Handle);
  1129.     try
  1130.       Windows.GetClientRect(Handle, RC);
  1131.       if GetWindowLong(Handle, GWL_STYLE) and WS_VSCROLL <> 0 then
  1132.         if (GetWindowLong(Handle, GWL_EXSTYLE) and WS_EX_LEFTSCROLLBAR)<>0 then
  1133.           dec(RC.Left, GetSystemMetrics(SM_CXVSCROLL))
  1134.         else
  1135.           inc(RC.Right, GetSystemMetrics(SM_CXVSCROLL));
  1136.       if GetWindowLong(Handle, GWL_STYLE) and WS_HSCROLL <> 0 then
  1137.         inc(RC.Bottom, GetSystemMetrics(SM_CYHSCROLL));
  1138.       GetWindowRect(Handle, RW);
  1139.       MapWindowPoints(0, Handle, RW, 2);
  1140.       OffsetRect(RC, -RW.Left, -RW.Top);
  1141.       ExcludeClipRect(DC, RC.Left, RC.Top, RC.Right, RC.Bottom);
  1142.       OffsetRect(RW, -RW.Left, -RW.Top);
  1143.       RV_DrawThemeBackground(FTheme, DC, 0, 0, RW, nil);
  1144.       Message.Result := 0;
  1145.     finally
  1146.       ReleaseDC(Handle, DC);
  1147.     end;
  1148.     end
  1149.   else
  1150.     inherited;
  1151. end;
  1152. {------------------------------------------------------------------------------}
  1153. procedure TRVScroller.SetUseXPThemes(const Value: Boolean);
  1154. begin
  1155.   if FUseXPThemes<>Value then begin
  1156.     FUseXPThemes := Value;
  1157.     if HandleAllocated then begin
  1158.       FreeThemeHandle;
  1159.       CreateThemeHandle;
  1160.       SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);
  1161.       RedrawWindow(Handle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_ERASE);
  1162.     end;
  1163.   end;
  1164. end;
  1165. procedure TRVScroller.AfterCreateWnd1;
  1166. begin
  1167.   VPos := 0;
  1168.   HPos := 0;
  1169. end;
  1170. procedure TRVScroller.AfterCreateWnd2;
  1171. begin
  1172.   UpdateScrollBars(ClientWidth, (ClientHeight div FSmallStep), True, True);
  1173. end;
  1174. {$IFNDEF RVDONOTUSEDRAGDROP}
  1175. {------------------------------------------------------------------------------}
  1176. { OLE drag&drop,  All these functions are called by TRVDropTarget, related to
  1177.   IDropTarget.
  1178.   They are overriden in TCustomRichViewEdit.                                   }
  1179. {------------------------------------------------------------------------------}
  1180. { Drag cursor is entered into the control. From IDropTarget.DragEnter.
  1181.   X,Y - client coordinates. Returns - can dropping be accepted                 }
  1182. function TRVScroller.OleDragEnter(X,Y: Integer): Boolean;
  1183. begin
  1184.   Result := False;
  1185. end;
  1186. {------------------------------------------------------------------------------}
  1187. procedure TRVScroller.CallOleDragEnterEvent(const DataObj: IDataObject;
  1188.   KeyState: Integer; pt: TPoint; PossibleEffects: Integer; var Effect: Integer);
  1189. begin
  1190. end;
  1191. {------------------------------------------------------------------------------}
  1192. { Finished. From IDropTarget.DragLeave                                         }
  1193. procedure TRVScroller.OleDragLeave;
  1194. begin
  1195. end;
  1196. {------------------------------------------------------------------------------}
  1197. { Dragging over. From IDropTarget.DragOver.
  1198.   X,Y - client coordinates.
  1199.   Returns - can dropping be accepted at the given position                     }
  1200. function TRVScroller.OleDragOver(X, Y: Integer): Boolean;
  1201. begin
  1202.   Result := False;
  1203. end;
  1204. {------------------------------------------------------------------------------}
  1205. procedure TRVScroller.CallOleDragOverEvent(KeyState: Integer; pt: TPoint;
  1206.   PossibleEffects: Integer; var Effect: Integer);
  1207. begin
  1208.   
  1209. end;
  1210. {------------------------------------------------------------------------------}
  1211. { Dropping. From IDropTarget.Drop. Must return Effects for Drop.               }
  1212. function TRVScroller.OleDrop(const DataObj: IDataObject; FMove: Boolean;
  1213.   KeyState: Integer; pt: TPoint; PossibleEffects: Integer): Integer;
  1214. begin
  1215.   Result := DROPEFFECT_NONE;
  1216. end;
  1217. {------------------------------------------------------------------------------}
  1218. { Is the specified format accepted?                                            }
  1219. function TRVScroller.OleCanAcceptFormat(Format: Word): Boolean;
  1220. begin
  1221.   Result := False;
  1222. end;
  1223. {------------------------------------------------------------------------------}
  1224. { Informs about destroying linked TRVDropTarget object.                        }
  1225. procedure TRVScroller.ReleaseOleDropTargetObject;
  1226. begin
  1227. end;
  1228. {$ENDIF}
  1229. {=========================== TRVScrollerInternalIfcObject =====================}
  1230. {$IFNDEF RVDONOTUSEDRAGDROP}
  1231. constructor TRVScrollerInternalIfcObject.Create(AOwner: TRVScroller);
  1232. begin
  1233.   inherited Create;
  1234.   OleInitialize(nil);
  1235.   FOwner := AOwner;
  1236. end;
  1237. {------------------------------------------------------------------------------}
  1238. destructor TRVScrollerInternalIfcObject.Destroy;
  1239. begin
  1240.   OleUninitialize;
  1241.   inherited;
  1242. end;
  1243. {------------------------------------------------------------------------------}
  1244. procedure TRVScrollerInternalIfcObject.OwnerDragLeave;
  1245. begin
  1246.   FOwner.OleDragLeave;
  1247. end;
  1248. {------------------------------------------------------------------------------}
  1249. function TRVScrollerInternalIfcObject.OwnerDragEnter(X,
  1250.   Y: Integer): Boolean;
  1251. begin
  1252.   Result := FOwner.OleDragEnter(X, Y);
  1253. end;
  1254. {------------------------------------------------------------------------------}
  1255. procedure TRVScrollerInternalIfcObject.CallOwnerDragEnterEvent(const DataObj: IDataObject;
  1256.   KeyState: Integer; pt: TPoint; PossibleEffects: Integer; var Effect: Integer);
  1257. begin
  1258.   FOwner.CallOleDragEnterEvent(DataObj, KeyState, pt, PossibleEffects, Effect);
  1259. end;
  1260. {------------------------------------------------------------------------------}
  1261. function TRVScrollerInternalIfcObject.OwnerDragOver(X, Y: Integer): Boolean;
  1262. begin
  1263.   Result := FOwner.OleDragOver(X, Y);
  1264. end;
  1265. {------------------------------------------------------------------------------}
  1266. procedure TRVScrollerInternalIfcObject.CallOwnerDragOverEvent(KeyState: Integer;
  1267.   pt: TPoint; PossibleEffects: Integer; var Effect: Integer);
  1268. begin
  1269.   FOwner.CallOleDragOverEvent(KeyState, pt, PossibleEffects, Effect);
  1270. end;
  1271. {------------------------------------------------------------------------------}
  1272. function TRVScrollerInternalIfcObject.OwnerDrop(
  1273.   const DataObj: IDataObject; FMove: Boolean;
  1274.   KeyState: Integer; pt: TPoint; PossibleEffects: Integer): Integer;
  1275. begin
  1276.   Result := FOwner.OleDrop(DataObj, FMove, KeyState, pt, PossibleEffects);
  1277. end;
  1278. {------------------------------------------------------------------------------}
  1279. function TRVScrollerInternalIfcObject.OwnerCanAcceptFormat(Format: Word): Boolean;
  1280. begin
  1281.   Result := FOwner.OleCanAcceptFormat(Format);
  1282. end;
  1283. {------------------------------------------------------------------------------}
  1284. procedure TRVScrollerInternalIfcObject.OwnerReleaseDropTargetObject;
  1285. begin
  1286.   FOwner.ReleaseOleDropTargetObject;
  1287. end;
  1288. {$ENDIF}
  1289. initialization
  1290.   InitSB;
  1291. end.