cxrichedit.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,877 行 · 第 1/5 页

PAS
1,877
字号
{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressEditors                                               }
{                                                                    }
{       Copyright (c) 1998-2008 Developer Express Inc.               }
{       ALL RIGHTS RESERVED                                          }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSEDITORS AND ALL                }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}

unit cxRichEdit;

{$I cxVer.inc}

interface

uses
  Variants, Windows, Messages, ActiveX, OleDlg, OleConst, OleCtnrs, Classes,
  ClipBrd, ComCtrls, Controls, Dialogs, Forms, Graphics,
  Menus, RichEdit, StdCtrls, SysUtils, cxClasses, cxContainer,
  cxControls, cxEdit, cxDrawTextUtils, cxGraphics, cxLookAndFeels, cxMemo,
  cxScrollbar, cxTextEdit;

(*$HPPEMIT 'DECLARE_DINTERFACE_TYPE(IOleLink);'*)

type
  TcxRichEditStreamMode = (resmSelection, resmPlainRtf, resmRtfNoObjs, resmUnicode, resmTextIzed);
  TcxRichEditStreamModes = set of TcxRichEditStreamMode;

  TcxTextRange = record
    chrg: TCharRange;
    lpstrText: PAnsiChar;
  end;

  TReObject = packed record
    cbStruct: DWORD;        // Size of structure
    cp: Cardinal;           // Character position of object
    clsid: TCLSID;          // Class ID of object
    oleobj: IOleObject;     // OLE object interface
    stg: IStorage;          // Associated storage interface
    olesite: IOLEClientSite;// Associated client site interface
    sizel: TSize;           // Size of object (may be 0,0)
    dvaspect: DWORD;        // Display aspect to use
    dwFlags: DWORD;         // Object status flags
    dwUser: DWORD;          // Dword for user's use
  end;

  TcxCustomRichEdit = class;
  
  TcxRichEditURLClickEvent = procedure(Sender: TcxCustomRichEdit; const URLText: string;
    Button: TMouseButton) of object;
  TcxRichEditURLMoveEvent = procedure(Sender: TcxCustomRichEdit; const URLText: string) of object;
  TcxRichEditQueryInsertObjectEvent = procedure(Sender: TcxCustomRichEdit; var AAllowInsertObject: Boolean;
    const ACLSID: TCLSID) of object;

  TcxCustomRichEditViewInfo = class(TcxCustomMemoViewInfo)
  public
    DrawBitmap: HBITMAP;
    IsDrawBitmapDirty: Boolean;
    PrevDrawBitmapSize: TSize;
    constructor Create; override;
    destructor Destroy; override;
    procedure DrawNativeStyleEditBackground(ACanvas: TcxCanvas; ADrawBackground: Boolean;
      ABackgroundStyle: TcxEditBackgroundPaintingStyle; ABackgroundBrush: TBrushHandle); override;
    procedure DrawText(ACanvas: TcxCanvas); override;
    function GetUpdateRegion(AViewInfo: TcxContainerViewInfo): TcxRegion; override;
    function NeedShowHint(ACanvas: TcxCanvas; const P: TPoint;
      const AVisibleBounds: TRect; out AText: TCaption;
      out AIsMultiLine: Boolean; out ATextRect: TRect): Boolean; override;
    procedure Paint(ACanvas: TcxCanvas); override;
  end;

  TcxCustomRichEditProperties = class;

  TcxCustomRichEditViewData = class(TcxCustomMemoViewData)
  private
    function GetProperties: TcxCustomRichEditProperties;
  protected
    function InternalGetEditContentSize(ACanvas: TcxCanvas;
      const AEditValue: TcxEditValue;
      const AEditSizeProperties: TcxEditSizeProperties): TSize; override;
  public
    procedure Calculate(ACanvas: TcxCanvas; const ABounds: TRect; const P: TPoint;
      Button: TcxMouseButton; Shift: TShiftState; AViewInfo: TcxCustomEditViewInfo;
      AIsMouseEvent: Boolean); override;
    property Properties: TcxCustomRichEditProperties read GetProperties;
  end;

  {IRichEditOleCallback}

  TcxRichInnerEdit = class;

  IcxRichEditOleCallback = interface(IUnknown)
    ['{00020D00-0000-0000-C000-000000000046}']
    function GetNewStorage(out stg: IStorage): HRESULT; stdcall;
    function GetInPlaceContext(out Frame: IOleInPlaceFrame;
      out Doc: IOleInPlaceUIWindow; lpFrameInfo: POleInPlaceFrameInfo): HRESULT; stdcall;
    function ShowContainerUI(fShow: BOOL): HRESULT; stdcall;
    function QueryInsertObject(const clsid: TCLSID; stg: IStorage; cp: longint): HRESULT; stdcall;
    function DeleteObject(oleobj: IOLEObject): HRESULT; stdcall;
    function QueryAcceptData(dataobj: IDataObject; var cfFormat: TClipFormat;
      reco: DWORD; fReally: BOOL; hMetaPict: HGLOBAL): HRESULT; stdcall;
    function ContextSensitiveHelp(fEnterMode: BOOL): HRESULT; stdcall;
    function GetClipboardData(const chrg: TCharRange; reco: DWORD;
      out dataobj: IDataObject): HRESULT; stdcall;
    function GetDragDropEffect(fDrag: BOOL; grfKeyState: DWORD;
      var dwEffect: DWORD): HRESULT; stdcall;
    function GetContextMenu(seltype: Word; oleobj: IOleObject;
      const chrg: TCharRange; var menu: HMENU): HRESULT; stdcall;
  end;

  { IRichEditOle }

  IcxRichEditOle = interface(IUnknown)
    ['{00020D00-0000-0000-C000-000000000046}']
    function GetClientSite(out clientSite: IOleClientSite): HResult; stdcall;
    function GetObjectCount: HResult; stdcall;
    function GetLinkCount: HResult; stdcall;
    function GetObject(iob: Longint; out reobject: TReObject;
      dwFlags: DWORD): HResult; stdcall;
    function InsertObject(var reobject: TReObject): HResult; stdcall;
    function ConvertObject(iob: Longint; rclsidNew: TIID;
      lpstrUserTypeNew: LPCSTR): HResult; stdcall;
    function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;
    function SetHostNames(lpstrContainerApp: LPCSTR;
      lpstrContainerObj: LPCSTR): HResult; stdcall;
    function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;
    function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;
    function HandsOffStorage(iob: Longint): HResult; stdcall;
    function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;
    function InPlaceDeactivate: HResult; stdcall;
    function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
    function GetClipboardData(var chrg: TCharRange; reco: DWORD;
      out dataobj: IDataObject): HResult; stdcall;
    function ImportDataObject(dataobj: IDataObject; cf: TClipFormat;
      hMetaPict: HGLOBAL): HResult; stdcall;
  end;

  { TcxRichEditOleCallback }

  TcxRichEditOleCallback = class(TcxIUnknownObject, IcxRichEditOleCallback)
  private
    FEdit: TcxRichInnerEdit;
    FDocParentForm: IVCLFrameForm;
    FParentFrame: IVCLFrameForm;
    FAccelTable: HAccel;
    FAccelCount: Integer;
    procedure AssignParentFrame;
    procedure CreateAccelTable;
    procedure DestroyAccelTable;
  protected
    property ParentFrame: IVCLFrameForm read FParentFrame;
    property DocParentForm: IVCLFrameForm read FDocParentForm;
  public
    constructor Create(AOwner: TcxRichInnerEdit);

    //IRichEditOleCallback
    function ContextSensitiveHelp(fEnterMode: BOOL): HRESULT; stdcall;
    function DeleteObject(oleobj: IOLEObject): HRESULT; stdcall;
    function GetClipboardData(const chrg: TCharRange; reco: DWORD;
      out dataobj: IDataObject): HRESULT; stdcall;
    function GetContextMenu(seltype: Word; oleobj: IOleObject;
      const chrg: TCharRange; var menu: HMENU): HRESULT; stdcall;
    function GetDragDropEffect(fDrag: BOOL; grfKeyState: DWORD;
      var dwEffect: DWORD): HRESULT; stdcall;
    function GetInPlaceContext(out Frame: IOleInPlaceFrame;
      out Doc: IOleInPlaceUIWindow; lpFrameInfo: POleInPlaceFrameInfo): HRESULT; stdcall;
    function GetNewStorage(out stg: IStorage): HRESULT; stdcall;
    function QueryInsertObject(const clsid: TCLSID; stg: IStorage; cp: longint): HRESULT; stdcall;
    function QueryAcceptData(dataobj: IDataObject; var cfFormat: TClipFormat;
      reco: DWORD; fReally: BOOL; hMetaPict: HGLOBAL): HRESULT; stdcall;
    function ShowContainerUI(fShow: BOOL): HRESULT; stdcall;
  end;

  { TcxCustomRichEditProperties }

  TcxCustomRichEditProperties = class(TcxCustomMemoProperties)
  private
    FAllowObjects: Boolean;
    FAutoURLDetect: Boolean;
    FHideScrollBars: Boolean;
    FMemoMode: Boolean;
    FPlainText: Boolean;
    FPlainTextChanged: Boolean;
    FSelectionBar: Boolean;
    FStreamModes: TcxRichEditStreamModes;
    FOnQueryInsertObject: TcxRichEditQueryInsertObjectEvent;
    FOnProtectChange: TRichEditProtectChange;
    FOnResizeRequest: TRichEditResizeEvent;
    FOnSaveClipboard: TRichEditSaveClipboard;
    FOnSelectionChange: TNotifyEvent;
    FOnURLClick: TcxRichEditURLClickEvent;
    FOnURLMove: TcxRichEditURLMoveEvent;
    procedure SetAllowObjects(const Value: Boolean);
    procedure SetAutoURLDetect(const Value: Boolean);
    procedure SetHideScrollBars(Value: Boolean);
    procedure SetMemoMode(Value: Boolean);
    procedure SetPlainText(Value: Boolean);
    procedure SetSelectionBar(Value: Boolean);
    procedure SetStreamModes(const Value: TcxRichEditStreamModes);
    procedure SetOnQueryInsertObject(Value: TcxRichEditQueryInsertObjectEvent);
  protected
    function CanValidate: Boolean; override;
    class function GetViewDataClass: TcxCustomEditViewDataClass; override;
    property PlainTextChanged: Boolean read FPlainTextChanged;
  public
    constructor Create(AOwner: TPersistent); override;

    procedure Assign(Source: TPersistent); override;
    class function GetContainerClass: TcxContainerClass; override;
    function GetDisplayText(const AEditValue: TcxEditValue;
      AFullText: Boolean = False; AIsInplace: Boolean = True): WideString; override;
    function GetSupportedOperations: TcxEditSupportedOperations; override;
    class function GetViewInfoClass: TcxContainerViewInfoClass; override;
    function IsResetEditClass: Boolean; override;
    property AllowObjects: Boolean read FAllowObjects write SetAllowObjects default False;
    property AutoURLDetect: Boolean read FAutoURLDetect write SetAutoURLDetect default False;
    property PlainText: Boolean read FPlainText write SetPlainText default False;
    // !!!
    property HideScrollBars: Boolean read FHideScrollBars
      write SetHideScrollBars default True;
    property MemoMode: Boolean read FMemoMode write SetMemoMode default False;
    property SelectionBar: Boolean read FSelectionBar write SetSelectionBar
      default False;
    property StreamModes: TcxRichEditStreamModes read FStreamModes
      write SetStreamModes default [];
    property OnQueryInsertObject: TcxRichEditQueryInsertObjectEvent read FOnQueryInsertObject
      write SetOnQueryInsertObject;
    property OnProtectChange: TRichEditProtectChange read FOnProtectChange
      write FOnProtectChange;
    property OnResizeRequest: TRichEditResizeEvent read FOnResizeRequest
      write FOnResizeRequest;
    property OnSaveClipboard: TRichEditSaveClipboard read FOnSaveClipboard
      write FOnSaveClipboard;
    property OnSelectionChange: TNotifyEvent read FOnSelectionChange
      write FOnSelectionChange;
    property OnURLClick: TcxRichEditURLClickEvent read FOnURLClick
      write FOnURLClick;
    property OnURLMove: TcxRichEditURLMoveEvent read FOnURLMove
      write FOnURLMove;
  end;

  { TcxRichEditProperties }

  TcxRichEditProperties = class(TcxCustomRichEditProperties)
  published
    property Alignment;
    property AllowObjects;
    property AssignedValues;
    property AutoSelect;
    property AutoURLDetect;
    property ClearKey;
    property HideScrollBars;
    property HideSelection;
    property ImeMode;
    property ImeName;
    property MaxLength;
    property MemoMode;
    property OEMConvert;
    property PlainText;
    property ReadOnly;
    property ScrollBars;
    property SelectionBar;
    property StreamModes;
    property VisibleLineCount;
    property WantReturns;
    property WantTabs;
    property WordWrap;
    property OnQueryInsertObject;
    property OnChange;
    property OnEditValueChanged;
    property OnProtectChange;
    property OnResizeRequest;
    property OnSaveClipboard;
    property OnSelectionChange;
    property OnURLClick;
    property OnURLMove;
  end;

  { TcxOleUILinkInfo }

  TcxOleUILinkInfo = class(TcxIUnknownObject, IOleUILinkInfo)
  private
    FRichEdit: TcxRichInnerEdit;
    FReObject: TReObject;
    FOleLink: IOleLink;
  public
    constructor Create(AOwner: TcxRichInnerEdit; AReObject: TReObject);
    destructor Destroy; override;

    //IOleUILinkInfo
    function GetLastUpdate(dwLink: Longint; var LastUpdate: TFileTime): HResult; stdcall;

    //IOleUILinkContainer
    function GetNextLink(dwLink: Longint): Longint; stdcall;
    function SetLinkUpdateOptions(dwLink: Longint; dwUpdateOpt: Longint): HResult; stdcall;
    function GetLinkUpdateOptions(dwLink: Longint;
      var dwUpdateOpt: Longint): HResult; stdcall;
    function SetLinkSource(dwLink: Longint; pszDisplayName: PChar;
      lenFileName: Longint; var chEaten: Longint;
      fValidateSource: BOOL): HResult; stdcall;
    function GetLinkSource(dwLink: Longint; var pszDisplayName: PChar;
      var lenFileName: Longint; var pszFullLinkType: PChar;
      var pszShortLinkType: PChar; var fSourceAvailable: BOOL;
      var fIsSelected: BOOL): HResult; stdcall;
    function OpenLinkSource(dwLink: Longint): HResult; stdcall;
    function UpdateLink(dwLink: Longint; fErrorMessage: BOOL;
      fErrorAction: BOOL): HResult; stdcall;
    function CancelLink(dwLink: Longint): HResult; stdcall;
  end;

  { TcxOleUIObjInfo }

  TcxOleUIObjInfo = class(TcxIUnknownObject, IOleUIObjInfo)
  private
    FRichEdit: TcxRichInnerEdit;
    FReObject: TReObject;

    function GetObjectDataSize: Integer;
  public
    constructor Create(AOwner: TcxRichInnerEdit; AReObject: TReObject);

    //IOleUIObjInfo
    function GetObjectInfo(dwObject: Longint;
      var dwObjSize: Longint; var lpszLabel: PChar;
      var lpszType: PChar; var lpszShortType: PChar;
      var lpszLocation: PChar): HResult; stdcall;
    function GetConvertInfo(dwObject: Longint; var ClassID: TCLSID;
      var wFormat: Word; var ConvertDefaultClassID: TCLSID;
      var lpClsidExclude: PCLSID; var cClsidExclude: Longint): HResult; stdcall;
    function ConvertObject(dwObject: Longint; const clsidNew: TCLSID): HResult; stdcall;
    function GetViewInfo(dwObject: Longint; var hMetaPict: HGlobal;
      var dvAspect: Longint; var nCurrentScale: Integer): HResult; stdcall;
    function SetViewInfo(dwObject: Longint; hMetaPict: HGlobal;
      dvAspect: Longint; nCurrentScale: Integer;
      bRelativeToOrig: BOOL): HResult; stdcall;
  end;

  { TcxCustomRichEdit }

  TcxCustomRichEdit = class(TcxCustomMemo)
  private
    FEditPopupMenu: TComponent;
    FIsNullEditValue: Boolean;
    FLastLineCount: Integer;
    FPropertiesChange: Boolean;
    procedure DoProtectChange(Sender: TObject; AStartPos, AEndPos: Integer;
      var AAllowChange: Boolean);
    procedure DoSaveClipboard(Sender: TObject; ANumObjects, ANumChars: Integer;
      var ASaveClipboard: Boolean);
    procedure EditPopupMenuClick(Sender: TObject);
    function GetLines: TStrings;

⌨️ 快捷键说明

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