Componentes.Terceros.DevExp.../internal/x.44/1/ExpressWeb Framework/Sources/cxWebHTMLEvents.pas
2009-06-29 12:09:02 +00:00

1477 lines
52 KiB
ObjectPascal

{*******************************************************************}
{ }
{ ExpressWeb Framework by Developer Express }
{ Designer Module }
{ }
{ Copyright (c) 2000-2009 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 EXPRESSWEB FRAMEWORK AND ALL }
{ ACCOMPANYING VCL CLASSES AS PART OF AN EXECUTABLE WEB }
{ APPLICATION 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 cxWebHTMLEvents;
interface
uses Classes, Windows, MSHTML_TLB,
cxWebHTMLEdIntf;
type
TcxHTMLEventSinkClass = class of TcxCustomHTMLEventSink;
TcxHTMLProcEvent = procedure(const AEventObject: IHTMLEventObj) of object;
TcxHTMLFuncEvent = function(const AEventObject: IHTMLEventObj): WordBool of object;
TcxCustomEventSink = class(TInterfacedObject, IUnknown, IDispatch, IcxEventSink)
private
FCookie: Integer;
FSource: IUnknown;
protected
function SinkIID: TGUID; virtual;
{ IUnknown }
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
{ IDispatch }
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
{ IcxEventSink }
procedure Connect(const ASource: IUnknown);
procedure Disconnect;
procedure ImplConnect(const ASource: IUnknown); virtual;
procedure ImplDisconnect; virtual;
function GetSource: IUnknown;
property Source: IUnknown read FSource;
end;
TcxCustomHTMLEventSink = class(TcxCustomEventSink, IDispatch)
private
FBehavior: IcxHTMLBehavior;
FOnHelp: TcxHTMLFuncEvent;
FOnClick: TcxHTMLFuncEvent;
FOnDblClick: TcxHTMLFuncEvent;
FOnKeyPress: TcxHTMLFuncEvent;
FOnKeyDown: TcxHTMLProcEvent;
FOnKeyUp: TcxHTMLProcEvent;
FOnMouseOut: TcxHTMLProcEvent;
FOnMouseOver: TcxHTMLProcEvent;
FOnMouseMove: TcxHTMLProcEvent;
FOnMouseDown: TcxHTMLProcEvent;
FOnMouseUp: TcxHTMLProcEvent;
FOnSelectStart: TcxHTMLFuncEvent;
FOnFilterChange: TcxHTMLProcEvent;
FOnDragStart: TcxHTMLFuncEvent;
FOnBeforeUpdate: TcxHTMLFuncEvent;
FOnAfterUpdate: TcxHTMLProcEvent;
FOnErrorUpdate: TcxHTMLFuncEvent;
FOnRowExit: TcxHTMLFuncEvent;
FOnRowEnter: TcxHTMLProcEvent;
FOnDatasetChanged: TcxHTMLProcEvent;
FOnDataAvailable: TcxHTMLProcEvent;
FOnDatasetComplete: TcxHTMLProcEvent;
FOnLoseCapture: TcxHTMLProcEvent;
FOnPropertyChange: TcxHTMLProcEvent;
FOnScroll: TcxHTMLProcEvent;
FOnFocus: TcxHTMLProcEvent;
FOnBlur: TcxHTMLProcEvent;
FOnResize: TcxHTMLProcEvent;
FOnDrag: TcxHTMLFuncEvent;
FOnDragEnd: TcxHTMLProcEvent;
FOnDragEnter: TcxHTMLFuncEvent;
FOnDragOver: TcxHTMLFuncEvent;
FOnDragLeave: TcxHTMLProcEvent;
FOnDrop: TcxHTMLFuncEvent;
FOnBeforeCut: TcxHTMLFuncEvent;
FOnCut: TcxHTMLFuncEvent;
FOnBeforeCopy: TcxHTMLFuncEvent;
FOnCopy: TcxHTMLFuncEvent;
FOnBeforePaste: TcxHTMLFuncEvent;
FOnPaste: TcxHTMLFuncEvent;
FOnContextMenu: TcxHTMLFuncEvent;
FOnRowsDelete: TcxHTMLProcEvent;
FOnRowsInserted: TcxHTMLProcEvent;
FOnCellChange: TcxHTMLProcEvent;
FOnReadyStateChange: TcxHTMLProcEvent;
FOnBeforeEditFocus: TcxHTMLProcEvent;
FOnLayoutComplete: TcxHTMLProcEvent;
FOnPage: TcxHTMLProcEvent;
FOnMouseEnter: TcxHTMLProcEvent;
FOnMouseLeave: TcxHTMLProcEvent;
FOnActivate: TcxHTMLProcEvent;
FOnDeactivate: TcxHTMLProcEvent;
FOnBeforeDeactivate: TcxHTMLFuncEvent;
FOnBeforeActivate: TcxHTMLFuncEvent;
FOnFocusIn: TcxHTMLProcEvent;
FOnFocusOut: TcxHTMLProcEvent;
FOnMove: TcxHTMLProcEvent;
FOnControlSelect: TcxHTMLFuncEvent;
FOnMoveStart: TcxHTMLFuncEvent;
FOnMoveEnd: TcxHTMLProcEvent;
FOnResizeStart: TcxHTMLFuncEvent;
FOnResizeEnd: TcxHTMLProcEvent;
FOnMouseWheel: TcxHTMLFuncEvent;
protected
{ IDispatch }
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
function DoHTMLEvent(const AEventObject: IHTMLEventObj; AMemberID: Integer;
var AResult: Variant): HRESULT; virtual;
function DoHelp(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoClick(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoDblClick(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoKeyPress(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoKeyDown(const AEventObject: IHTMLEventObj); virtual;
procedure DoKeyUp(const AEventObject: IHTMLEventObj); virtual;
procedure DoMouseOut(const AEventObject: IHTMLEventObj); virtual;
procedure DoMouseOver(const AEventObject: IHTMLEventObj); virtual;
procedure DoMouseMove(const AEventObject: IHTMLEventObj); virtual;
procedure DoMouseDown(const AEventObject: IHTMLEventObj); virtual;
procedure DoMouseUp(const AEventObject: IHTMLEventObj); virtual;
function DoSelectStart(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoFilterChange(const AEventObject: IHTMLEventObj); virtual;
function DoBeforeUpdate(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoAfterUpdate(const AEventObject: IHTMLEventObj); virtual;
function DoErrorUpdate(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoRowExit(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoRowEnter(const AEventObject: IHTMLEventObj); virtual;
procedure DoDatasetChanged(const AEventObject: IHTMLEventObj); virtual;
procedure DoDataAvailable(const AEventObject: IHTMLEventObj); virtual;
procedure DoDatasetComplete(const AEventObject: IHTMLEventObj); virtual;
procedure DoLoseCapture(const AEventObject: IHTMLEventObj); virtual;
procedure DoPropertyChange(const AEventObject: IHTMLEventObj); virtual;
procedure DoScroll(const AEventObject: IHTMLEventObj); virtual;
procedure DoFocus(const AEventObject: IHTMLEventObj); virtual;
procedure DoBlur(const AEventObject: IHTMLEventObj); virtual;
procedure DoResize(const AEventObject: IHTMLEventObj); virtual;
function DoDragStart(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoDrag(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoDragEnd(const AEventObject: IHTMLEventObj); virtual;
function DoDragEnter(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoDragOver(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoDragLeave(const AEventObject: IHTMLEventObj); virtual;
function DoDrop(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoBeforeCut(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoCut(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoBeforeCopy(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoCopy(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoBeforePaste(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoPaste(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoContextMenu(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoRowsDelete(const AEventObject: IHTMLEventObj); virtual;
procedure DoRowsInserted(const AEventObject: IHTMLEventObj); virtual;
procedure DoCellChange(const AEventObject: IHTMLEventObj); virtual;
procedure DoReadyStateChange(const AEventObject: IHTMLEventObj); virtual;
procedure DoBeforeEditFocus(const AEventObject: IHTMLEventObj); virtual;
procedure DoLayoutComplete(const AEventObject: IHTMLEventObj); virtual;
procedure DoPage(const AEventObject: IHTMLEventObj); virtual;
procedure DoMouseEnter(const AEventObject: IHTMLEventObj); virtual;
procedure DoMouseLeave(const AEventObject: IHTMLEventObj); virtual;
procedure DoActivate(const AEventObject: IHTMLEventObj); virtual;
procedure DoDeactivate(const AEventObject: IHTMLEventObj); virtual;
function DoBeforeDeactivate(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoBeforeActivate(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoFocusIn(const AEventObject: IHTMLEventObj); virtual;
procedure DoFocusOut(const AEventObject: IHTMLEventObj); virtual;
procedure DoMove(const AEventObject: IHTMLEventObj); virtual;
function DoControlSelect(const AEventObject: IHTMLEventObj): Boolean; virtual;
function DoMoveStart(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoMoveEnd(const AEventObject: IHTMLEventObj); virtual;
function DoResizeStart(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoResizeEnd(const AEventObject: IHTMLEventObj); virtual;
function DoMouseWheel(const AEventObject: IHTMLEventObj): Boolean; virtual;
public
constructor Create(ABehavior: IcxHTMLBehavior); virtual;
property Behavior: IcxHTMLBehavior read FBehavior;
property OnHelp: TcxHTMLFuncEvent read FOnHelp write FOnHelp;
property OnClick: TcxHTMLFuncEvent read FOnClick write FOnClick;
property OnDblClick: TcxHTMLFuncEvent read FOnDblClick write FOnDblClick;
property OnKeyPress: TcxHTMLFuncEvent read FOnKeyPress write FOnKeyPress;
property OnKeyDown: TcxHTMLProcEvent read FOnKeyDown write FOnKeyDown;
property OnKeyUp: TcxHTMLProcEvent read FOnKeyUp write FOnKeyUp;
property OnMouseOut: TcxHTMLProcEvent read FOnMouseOut write FOnMouseOut;
property OnMouseOver: TcxHTMLProcEvent read FOnMouseOver write FOnMouseOver;
property OnMouseMove: TcxHTMLProcEvent read FOnMouseMove write FOnMouseMove;
property OnMouseDown: TcxHTMLProcEvent read FOnMouseDown write FOnMouseDown;
property OnMouseUp: TcxHTMLProcEvent read FOnMouseUp write FOnMouseUp;
property OnSelectStart: TcxHTMLFuncEvent read FOnSelectStart write FOnSelectStart;
property OnFilterChange: TcxHTMLProcEvent read FOnFilterChange write FOnFilterChange;
property OnDragStart: TcxHTMLFuncEvent read FOnDragStart write FOnDragStart;
property OnBeforeUpdate: TcxHTMLFuncEvent read FOnBeforeUpdate write FOnBeforeUpdate;
property OnAfterUpdate: TcxHTMLProcEvent read FOnAfterUpdate write FOnAfterUpdate;
property OnErrorUpdate: TcxHTMLFuncEvent read FOnErrorUpdate write FOnErrorUpdate;
property OnRowExit: TcxHTMLFuncEvent read FOnRowExit write FOnRowExit;
property OnRowEnter: TcxHTMLProcEvent read FOnRowEnter write FOnRowEnter;
property OnDatasetChanged: TcxHTMLProcEvent read FOnDatasetChanged write FOnDatasetChanged;
property OnDataAvailable: TcxHTMLProcEvent read FOnDataAvailable write FOnDataAvailable;
property OnDatasetComplete: TcxHTMLProcEvent read FOnDatasetComplete write FOnDatasetComplete;
property OnLoseCapture: TcxHTMLProcEvent read FOnLoseCapture write FOnLoseCapture;
property OnPropertyChange: TcxHTMLProcEvent read FOnPropertyChange write FOnPropertyChange;
property OnScroll: TcxHTMLProcEvent read FOnScroll write FOnScroll;
property OnFocus: TcxHTMLProcEvent read FOnFocus write FOnFocus;
property OnBlur: TcxHTMLProcEvent read FOnBlur write FOnBlur;
property OnResize: TcxHTMLProcEvent read FOnResize write FOnResize;
property OnDrag: TcxHTMLFuncEvent read FOnDrag write FOnDrag;
property OnDragEnd: TcxHTMLProcEvent read FOnDragEnd write FOnDragEnd;
property OnDragEnter: TcxHTMLFuncEvent read FOnDragEnter write FOnDragEnter;
property OnDragOver: TcxHTMLFuncEvent read FOnDragOver write FOnDragOver;
property OnDragLeave: TcxHTMLProcEvent read FOnDragLeave write FOnDragLeave;
property OnDrop: TcxHTMLFuncEvent read FOnDrop write FOnDrop;
property OnBeforeCut: TcxHTMLFuncEvent read FOnBeforeCut write FOnBeforeCut;
property OnCut: TcxHTMLFuncEvent read FOnCut write FOnCut;
property OnBeforeCopy: TcxHTMLFuncEvent read FOnBeforeCopy write FOnBeforeCopy;
property OnCopy: TcxHTMLFuncEvent read FOnCopy write FOnCopy;
property OnBeforePaste: TcxHTMLFuncEvent read FOnBeforePaste write FOnBeforePaste;
property OnPaste: TcxHTMLFuncEvent read FOnPaste write FOnPaste;
property OnContextMenu: TcxHTMLFuncEvent read FOnContextMenu write FOnContextMenu;
property OnRowsDelete: TcxHTMLProcEvent read FOnRowsDelete write FOnRowsDelete;
property OnRowsInserted: TcxHTMLProcEvent read FOnRowsInserted write FOnRowsInserted;
property OnCellChange: TcxHTMLProcEvent read FOnCellChange write FOnCellChange;
property OnReadyStateChange: TcxHTMLProcEvent read FOnReadyStateChange write FOnReadyStateChange;
property OnBeforeEditFocus: TcxHTMLProcEvent read FOnBeforeEditFocus write FOnBeforeEditFocus;
property OnLayoutComplete: TcxHTMLProcEvent read FOnLayoutComplete write FOnLayoutComplete;
property OnPage: TcxHTMLProcEvent read FOnPage write FOnPage;
property OnMouseEnter: TcxHTMLProcEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TcxHTMLProcEvent read FOnMouseLeave write FOnMouseLeave;
property OnActivate: TcxHTMLProcEvent read FOnActivate write FOnActivate;
property OnDeactivate: TcxHTMLProcEvent read FOnDeactivate write FOnDeactivate;
property OnBeforeDeactivate: TcxHTMLFuncEvent read FOnBeforeDeactivate write FOnBeforeDeactivate;
property OnBeforeActivate: TcxHTMLFuncEvent read FOnBeforeActivate write FOnBeforeActivate;
property OnFocusIn: TcxHTMLProcEvent read FOnFocusIn write FOnFocusIn;
property OnFocusOut: TcxHTMLProcEvent read FOnFocusOut write FOnFocusOut;
property OnMove: TcxHTMLProcEvent read FOnMove write FOnMove;
property OnControlSelect: TcxHTMLFuncEvent read FOnControlSelect write FOnControlSelect;
property OnMoveStart: TcxHTMLFuncEvent read FOnMoveStart write FOnMoveStart;
property OnMoveEnd: TcxHTMLProcEvent read FOnMoveEnd write FOnMoveEnd;
property OnResizeStart: TcxHTMLFuncEvent read FOnResizeStart write FOnResizeStart;
property OnResizeEnd: TcxHTMLProcEvent read FOnResizeEnd write FOnResizeEnd;
property OnMouseWheel: TcxHTMLFuncEvent read FOnMouseWheel write FOnMouseWheel;
end;
TcxHTMLDocEventSink = class(TcxCustomHTMLEventSink)
private
FOnSelectionChange: TcxHTMLProcEvent;
FOnStop: TcxHTMLFuncEvent;
protected
function SinkIID: TGUID; override;
function DoHTMLEvent(const AEventObject: IHTMLEventObj; AMemberID: Integer;
var AResult: Variant): HRESULT; override;
procedure DoSelectionChange(const AEventObject: IHTMLEventObj); virtual;
function DoStop(const AEventObject: IHTMLEventObj): Boolean; virtual;
procedure DoBeforeEditFocus(const AEventObject: IHTMLEventObj); override;
public
property OnSelectionChange: TcxHTMLProcEvent read FOnSelectionChange write FOnSelectionChange;
property OnStop: TcxHTMLFuncEvent read FOnStop write FOnStop;
end;
TcxHTMLEWFCtrlEventSink = class(TcxCustomHTMLEventSink)
private
FResizing: Boolean;
protected
procedure DoBeforeEditFocus(const AEventObject: IHTMLEventObj); override;
procedure DoResizeEnd(const AEventObject: IHTMLEventObj); override;
function DoResizeStart(const AEventObject: IHTMLEventObj): Boolean; override;
public
property IsResizing: Boolean read FResizing;
end;
TcxHTMLSelectState = (hssNone, hssStart, hssSelecting);
TcxHTMLSelectRegionSink = class(TcxCustomHTMLEventSink)
private
FState: TcxHTMLSelectState;
FSelectingRect: TRect;
FOnRectSelect: TcxHTMLRegionSelectEvent;
FDeltaX: Integer;
FDeltaY: Integer;
function GetNormalSelectRect: TRect;
procedure Snap(const ACurValue, ADelta: Integer; var ANewValue: Integer);
protected
function SinkIID: TGUID; override;
procedure DoMouseDown(const AEventObject: IHTMLEventObj); override;
procedure DoMouseMove(const AEventObject: IHTMLEventObj); override;
procedure DoMouseUp(const AEventObject: IHTMLEventObj); override;
procedure DoBeforeEditFocus(const AEventObject: IHTMLEventObj); override;
procedure DoRectSelect(const AEventObject: IHTMLEventObj; const ARect: TRect); virtual;
function IsOwnEvent(const AEventObject: IHTMLEventObj): Boolean;
public
property NormalSelectRect: TRect read GetNormalSelectRect;
property OnRectSelect: TcxHTMLRegionSelectEvent read FOnRectSelect write FOnRectSelect;
property State: TcxHTMLSelectState read FState;
end;
function IsDocumentReady(ADocument: IHTMLDocument2): Boolean;
function IsPointInClient(const AElement: IHTMLElement; const X, Y: Integer): Boolean;
function GetClientRect(const AElement: IHTMLElement; var ARect: TRect): Boolean;
const
DISPID_HTMLELEMENTEVENTS2_ONHELP = -2147418102;
DISPID_HTMLELEMENTEVENTS2_ONCLICK = -600;
DISPID_HTMLELEMENTEVENTS2_ONDBLCLICK = -601;
DISPID_HTMLELEMENTEVENTS2_ONKEYPRESS = -603;
DISPID_HTMLELEMENTEVENTS2_ONKEYDOWN = -602;
DISPID_HTMLELEMENTEVENTS2_ONKEYUP = -604;
DISPID_HTMLELEMENTEVENTS2_ONMOUSEOUT = -2147418103;
DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER = -2147418104;
DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE = -606;
DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN = -605;
DISPID_HTMLELEMENTEVENTS2_ONMOUSEUP = -607;
DISPID_HTMLELEMENTEVENTS2_ONSELECTSTART = -2147418100;
DISPID_HTMLELEMENTEVENTS2_ONFILTERCHANGE = -2147418095;
DISPID_HTMLELEMENTEVENTS2_ONDRAGSTART = -2147418101;
DISPID_HTMLELEMENTEVENTS2_ONBEFOREUPDATE = -2147418108;
DISPID_HTMLELEMENTEVENTS2_ONAFTERUPDATE = -2147418107;
DISPID_HTMLELEMENTEVENTS2_ONERRORUPDATE = -2147418099;
DISPID_HTMLELEMENTEVENTS2_ONROWEXIT = -2147418106;
DISPID_HTMLELEMENTEVENTS2_ONROWENTER = -2147418105;
DISPID_HTMLELEMENTEVENTS2_ONDATASETCHANGED = -2147418098;
DISPID_HTMLELEMENTEVENTS2_ONDATAAVAILABLE = -2147418097;
DISPID_HTMLELEMENTEVENTS2_ONDATASETCOMPLETE = -2147418096;
DISPID_HTMLELEMENTEVENTS2_ONLOSECAPTURE = -2147418094;
DISPID_HTMLELEMENTEVENTS2_ONPROPERTYCHANGE = -2147418093;
DISPID_HTMLELEMENTEVENTS2_ONSCROLL = 1014;
DISPID_HTMLELEMENTEVENTS2_ONFOCUS = -2147418111;
DISPID_HTMLELEMENTEVENTS2_ONBLUR = -2147418112;
DISPID_HTMLELEMENTEVENTS2_ONRESIZE = 1016;
DISPID_HTMLELEMENTEVENTS2_ONDRAG = -2147418092;
DISPID_HTMLELEMENTEVENTS2_ONDRAGEND = -2147418091;
DISPID_HTMLELEMENTEVENTS2_ONDRAGENTER = -2147418090;
DISPID_HTMLELEMENTEVENTS2_ONDRAGOVER = -2147418089;
DISPID_HTMLELEMENTEVENTS2_ONDRAGLEAVE = -2147418088;
DISPID_HTMLELEMENTEVENTS2_ONDROP = -2147418087;
DISPID_HTMLELEMENTEVENTS2_ONBEFORECUT = -2147418083;
DISPID_HTMLELEMENTEVENTS2_ONCUT = -2147418086;
DISPID_HTMLELEMENTEVENTS2_ONBEFORECOPY = -2147418082;
DISPID_HTMLELEMENTEVENTS2_ONCOPY = -2147418085;
DISPID_HTMLELEMENTEVENTS2_ONBEFOREPASTE = -2147418081;
DISPID_HTMLELEMENTEVENTS2_ONPASTE = -2147418084;
DISPID_HTMLELEMENTEVENTS2_ONCONTEXTMENU = 1023;
DISPID_HTMLELEMENTEVENTS2_ONROWSDELETE = -2147418080;
DISPID_HTMLELEMENTEVENTS2_ONROWSINSERTED = -2147418079;
DISPID_HTMLELEMENTEVENTS2_ONCELLCHANGE = -2147418078;
DISPID_HTMLELEMENTEVENTS2_ONREADYSTATECHANGE = -609;
DISPID_HTMLELEMENTEVENTS2_ONBEFOREEDITFOCUS = 1027;
DISPID_HTMLELEMENTEVENTS2_ONLAYOUTCOMPLETE = 1030;
DISPID_HTMLELEMENTEVENTS2_ONPAGE = 1031;
DISPID_HTMLELEMENTEVENTS2_ONMOUSEENTER = 1042;
DISPID_HTMLELEMENTEVENTS2_ONMOUSELEAVE = 1043;
DISPID_HTMLELEMENTEVENTS2_ONACTIVATE = 1044;
DISPID_HTMLELEMENTEVENTS2_ONDEACTIVATE = 1045;
DISPID_HTMLELEMENTEVENTS2_ONBEFOREDEACTIVATE = 1034;
DISPID_HTMLELEMENTEVENTS2_ONBEFOREACTIVATE = 1047;
DISPID_HTMLELEMENTEVENTS2_ONFOCUSIN = 1048;
DISPID_HTMLELEMENTEVENTS2_ONFOCUSOUT = 1049;
DISPID_HTMLELEMENTEVENTS2_ONMOVE = 1035;
DISPID_HTMLELEMENTEVENTS2_ONCONTROLSELECT = 1036;
DISPID_HTMLELEMENTEVENTS2_ONMOVESTART = 1038;
DISPID_HTMLELEMENTEVENTS2_ONMOVEEND = 1039;
DISPID_HTMLELEMENTEVENTS2_ONRESIZESTART = 1040;
DISPID_HTMLELEMENTEVENTS2_ONRESIZEEND = 1041;
DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL = 1033;
DISPID_HTMLDOCUMENTEVENTS2_ONSTOP = 1026;
DISPID_HTMLDOCUMENTEVENTS2_ONSELECTIONCHANGE = 1037;
implementation
uses ComObj, ActiveX, SysUtils;
function IsDocumentReady(ADocument: IHTMLDocument2): Boolean;
begin
Result := SameText(ADocument.readyState, 'complete'); // Do not localize
end;
function IsPointInClient(const AElement: IHTMLElement; const X, Y: Integer): Boolean;
var
Element2: IHTMLElement2;
begin
if Supports(AElement, IHTMLElement2, Element2) then
Result := Element2.componentFromPoint(X, Y) = ''
else
Result := False;
end;
function GetClientRect(const AElement: IHTMLElement; var ARect: TRect): Boolean;
var
Element2: IHTMLElement2;
begin
if (AElement <> nil) then
begin
Element2 := AElement as IHTMLElement2;
ARect.Left := AElement.offsetLeft + Element2.clientLeft;
ARect.Top := AElement.offsetTop + Element2.clientTop;
ARect.Right := ARect.Left + Element2.clientWidth;
ARect.Bottom := ARect.Top + Element2.clientHeight;
Result := True;
end
else
Result := False;
end;
{ TcxCustomEventSink }
function TcxCustomEventSink.SinkIID: TGUID;
begin
Result := DIID_HTMLElementEvents2;
end;
procedure TcxCustomEventSink.Connect(const ASource: IInterface);
begin
ImplConnect(ASource);
end;
procedure TcxCustomEventSink.Disconnect;
begin
ImplDisconnect;
end;
procedure TcxCustomEventSink.ImplConnect(const ASource: IInterface);
begin
Assert(ASource <> nil);
Disconnect;
InterfaceConnect(ASource, SinkIID, Self, FCookie);
FSource := ASource;
end;
procedure TcxCustomEventSink.ImplDisconnect;
begin
if FSource <> nil then
begin
InterfaceDisconnect(FSource, SinkIID, FCookie);
FSource := nil;
end;
end;
function TcxCustomEventSink.QueryInterface(const IID: TGUID;
out Obj): HResult;
begin
Result := E_NOINTERFACE;
if GetInterface(IID, Obj) then
Result := S_OK
else
if IsEqualIID(IID, SinkIID) and GetInterface(IDispatch, Obj) then
Result := S_OK;
end;
function TcxCustomEventSink.GetIDsOfNames(const IID: TGUID;
Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
Result := E_NOTIMPL;
end;
function TcxCustomEventSink.GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
begin
Pointer(TypeInfo) := nil;
Result := E_NOTIMPL;
end;
function TcxCustomEventSink.GetTypeInfoCount(
out Count: Integer): HResult;
begin
Count := 0;
Result := E_NOTIMPL;
end;
function TcxCustomEventSink.Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
ArgErr: Pointer): HResult;
begin
Result := DISP_E_MEMBERNOTFOUND;
end;
function TcxCustomEventSink.GetSource: IUnknown;
begin
Result := FSource;
end;
{ TcxCustomHTMLEventSink }
constructor TcxCustomHTMLEventSink.Create(ABehavior: IcxHTMLBehavior);
begin
FBehavior := ABehavior;
end;
function TcxCustomHTMLEventSink.DoHTMLEvent(
const AEventObject: IHTMLEventObj; AMemberID: Integer;
var AResult: Variant): HRESULT;
procedure ReturnBoolResult(const EventResult: Boolean);
begin
TVarData(AResult).VType := varBoolean;
TVarData(AResult).VBoolean := EventResult;
end;
begin
Result := S_OK;
case AMemberID of
DISPID_HTMLELEMENTEVENTS2_ONHELP:
ReturnBoolResult(DoHelp(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONCLICK:
ReturnBoolResult(DoClick(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONDBLCLICK:
ReturnBoolResult(DoDblClick(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONKEYPRESS:
ReturnBoolResult(DoKeyPress(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONKEYDOWN:
DoKeyDown(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONKEYUP:
DoKeyUp(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOUSEOUT:
DoMouseOut(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER:
DoMouseOver(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE:
DoMouseMove(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN:
DoMouseDown(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOUSEUP:
DoMouseUp(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONSELECTSTART:
ReturnBoolResult(DoSelectStart(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONFILTERCHANGE:
DoFilterChange(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONBEFOREUPDATE:
ReturnBoolResult(DoBeforeUpdate(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONAFTERUPDATE:
DoAfterUpdate(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONERRORUPDATE:
ReturnBoolResult(DoErrorUpdate(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONROWEXIT:
ReturnBoolResult(DoRowExit(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONROWENTER:
DoRowEnter(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONDATASETCHANGED:
DoDatasetChanged(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONDATAAVAILABLE:
DoDataAvailable(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONDATASETCOMPLETE:
DoDatasetComplete(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONLOSECAPTURE:
DoLoseCapture(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONPROPERTYCHANGE:
DoPropertyChange(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONSCROLL:
DoScroll(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONFOCUS:
DoFocus(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONBLUR:
DoBlur(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONRESIZE:
DoResize(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONDRAGSTART:
ReturnBoolResult(DoDragStart(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONDRAG:
ReturnBoolResult(DoDrag(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONDRAGEND:
DoDragEnd(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONDRAGENTER:
ReturnBoolResult(DoDragEnter(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONDRAGOVER:
ReturnBoolResult(DoDragOver(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONDRAGLEAVE:
DoDragLeave(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONDROP:
ReturnBoolResult(DoDrop(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONBEFORECUT:
ReturnBoolResult(DoBeforeCut(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONCUT:
ReturnBoolResult(DoCut(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONBEFORECOPY:
ReturnBoolResult(DoBeforeCopy(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONCOPY:
ReturnBoolResult(DoCopy(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONBEFOREPASTE:
ReturnBoolResult(DoBeforePaste(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONPASTE:
ReturnBoolResult(DoPaste(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONCONTEXTMENU:
ReturnBoolResult(DoContextMenu(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONROWSDELETE:
DoRowsDelete(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONROWSINSERTED:
DoRowsInserted(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONCELLCHANGE:
DoCellChange(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONREADYSTATECHANGE:
DoReadyStateChange(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONBEFOREEDITFOCUS:
DoBeforeEditFocus(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONLAYOUTCOMPLETE:
DoLayoutComplete(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONPAGE:
DoPage(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOUSEENTER:
DoMouseEnter(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOUSELEAVE:
DoMouseLeave(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONACTIVATE:
DoActivate(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONDEACTIVATE:
DoDeactivate(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONBEFOREDEACTIVATE:
ReturnBoolResult(DoBeforeDeactivate(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONBEFOREACTIVATE:
ReturnBoolResult(DoBeforeActivate(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONFOCUSIN:
DoFocusIn(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONFOCUSOUT:
DoFocusOut(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOVE:
DoMove(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONCONTROLSELECT:
ReturnBoolResult(DoControlSelect(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONMOVESTART:
ReturnBoolResult(DoMoveStart(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONMOVEEND:
DoMoveEnd(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONRESIZESTART:
ReturnBoolResult(DoResizeStart(AEventObject));
DISPID_HTMLELEMENTEVENTS2_ONRESIZEEND:
DoResizeEnd(AEventObject);
DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL:
ReturnBoolResult(DoMouseWheel(AEventObject));
else
Result := DISP_E_MEMBERNOTFOUND;
end;
end;
function TcxCustomHTMLEventSink.Invoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
ArgErr: Pointer): HResult;
function GetHTMLEventParam(out AParam: IHTMLEventObj): Boolean;
var
DispParams: TDispParams absolute Params;
Param: TVariantArg;
begin
AParam := nil;
Result := (DispParams.cArgs = 1) and
(Flags and DISPATCH_METHOD = DISPATCH_METHOD);
if Result then
begin
Param := PVariantArgList(DispParams.rgvarg)^[0];
Result := (Param.vt = VT_DISPATCH) or (Param.vt = VT_UNKNOWN);
if Result then
Supports(IInterface(Param.unkVal), IHTMLEventObj, AParam);
end;
end;
var
EventObject: IHTMLEventObj;
begin
if GetHTMLEventParam(EventObject) then
Result := DoHTMLEvent(EventObject, DispID, Variant(VarResult^))
else
Result := DISP_E_MEMBERNOTFOUND;
end;
function TcxCustomHTMLEventSink.DoControlSelect(
const AEventObject: IHTMLEventObj): Boolean;
begin
Result := True;
if Assigned(FOnControlSelect) then
Result := FOnControlSelect(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoMouseDown(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMouseDown) then
FOnMouseDown(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoMouseMove(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMouseMove) then
FOnMouseMove(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoMouseUp(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMouseUp) then
FOnMouseUp(AEventObject);
end;
function TcxCustomHTMLEventSink.DoCut(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnCut) then
Result := FOnCut(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoCopy(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnCopy) then
Result := FOnCopy(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoPaste(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnPaste) then
Result := FOnPaste(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoActivate(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnActivate) then
FOnActivate(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoAfterUpdate(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnAfterUpdate) then
FOnAfterUpdate(AEventObject);
end;
function TcxCustomHTMLEventSink.DoBeforeActivate(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnBeforeActivate) then
Result := FOnBeforeActivate(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoBeforeCopy(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnBeforeCopy) then
Result := FOnBeforeCopy(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoBeforeCut(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnBeforeCut) then
Result := FOnBeforeCut(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoBeforeDeactivate(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnBeforeDeactivate) then
Result := FOnBeforeDeactivate(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoBeforePaste(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnBeforePaste) then
Result := FOnBeforePaste(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoBeforeUpdate(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnBeforeUpdate) then
Result := FOnBeforeUpdate(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoBlur(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnBlur) then
FOnBlur(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoCellChange(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnCellChange) then
FOnCellChange(AEventObject);
end;
function TcxCustomHTMLEventSink.DoClick(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnClick) then
Result := FOnClick(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoContextMenu(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnContextMenu) then
Result := FOnContextMenu(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoDataAvailable(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnDataAvailable) then
FOnDataAvailable(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoDatasetChanged(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnDatasetChanged) then
FOnDatasetChanged(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoDatasetComplete(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnDatasetComplete) then
FOnDatasetComplete(AEventObject);
end;
function TcxCustomHTMLEventSink.DoDblClick(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnDblClick) then
Result := FOnDblClick(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoDeactivate(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnDeactivate) then
FOnDeactivate(AEventObject);
end;
function TcxCustomHTMLEventSink.DoDrag(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnDrag) then
Result := FOnDrag(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoDragEnd(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnDragEnd) then
FOnDragEnd(AEventObject);
end;
function TcxCustomHTMLEventSink.DoDragEnter(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnDragEnter) then
Result := FOnDragEnter(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoDragLeave(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnDragLeave) then
FOnDragLeave(AEventObject);
end;
function TcxCustomHTMLEventSink.DoDragOver(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnDragOver) then
Result := FOnDragOver(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoDragStart(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnDragStart) then
Result := FOnDragStart(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoDrop(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnDrop) then
Result := FOnDrop(AEventObject)
else
Result := True;
end;
function TcxCustomHTMLEventSink.DoErrorUpdate(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnErrorUpdate) then
Result := FOnErrorUpdate(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoFilterChange(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnFilterChange) then
FOnFilterChange(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoFocus(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnFocus) then
FOnFocus(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoFocusIn(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnFocusIn) then
FOnFocusIn(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoFocusOut(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnFocusOut) then
FOnFocusOut(AEventObject);
end;
function TcxCustomHTMLEventSink.DoHelp(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnHelp) then
Result := FOnHelp(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoKeyDown(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnKeyDown) then
FOnKeyDown(AEventObject);
end;
function TcxCustomHTMLEventSink.DoKeyPress(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnKeyPress) then
Result := FOnKeyPress(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoKeyUp(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnKeyUp) then
FOnKeyUp(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoLayoutComplete(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnLayoutComplete) then
FOnLayoutComplete(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoLoseCapture(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnLoseCapture) then
FOnLoseCapture(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoMouseEnter(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMouseEnter) then
FOnMouseEnter(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoMouseLeave(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMouseLeave) then
FOnMouseLeave(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoMouseOut(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMouseOut) then
FOnMouseOut(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoMouseOver(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMouseOver) then
FOnMouseOver(AEventObject);
end;
function TcxCustomHTMLEventSink.DoMouseWheel(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnMouseWheel) then
Result := FOnMouseWheel(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoMove(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMove) then
FOnMove(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoMoveEnd(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnMoveEnd) then
FOnMoveEnd(AEventObject);
end;
function TcxCustomHTMLEventSink.DoMoveStart(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnMoveStart) then
Result := FOnMoveStart(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoPage(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnPage) then
FOnPage(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoPropertyChange(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnPropertyChange) then
FOnPropertyChange(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoReadyStateChange(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnReadyStateChange) then
FOnReadyStateChange(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoResize(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnResize) then
FOnResize(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoResizeEnd(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnResizeEnd) then
FOnResizeEnd(AEventObject);
end;
function TcxCustomHTMLEventSink.DoResizeStart(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnResizeStart) then
Result := FOnResizeStart(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoRowEnter(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnRowEnter) then
FOnRowEnter(AEventObject);
end;
function TcxCustomHTMLEventSink.DoRowExit(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnRowExit) then
Result := FOnRowExit(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoRowsDelete(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnRowsDelete) then
FOnRowsDelete(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoRowsInserted(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnRowsInserted) then
FOnRowsInserted(AEventObject);
end;
procedure TcxCustomHTMLEventSink.DoScroll(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnScroll) then
FOnScroll(AEventObject);
end;
function TcxCustomHTMLEventSink.DoSelectStart(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnSelectStart) then
Result := FOnSelectStart(AEventObject)
else
Result := True;
end;
procedure TcxCustomHTMLEventSink.DoBeforeEditFocus(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnBeforeEditFocus) then
FOnBeforeEditFocus(AEventObject);
end;
{ TcxHTMLDocEventSink }
function TcxHTMLDocEventSink.SinkIID: TGUID;
begin
Result := DIID_HTMLDocumentEvents2;
end;
procedure TcxHTMLDocEventSink.DoBeforeEditFocus(
const AEventObject: IHTMLEventObj);
var
Doc2: IHTMLDocument2;
begin
if Supports(Source, IHTMLDocument2, Doc2) then
AEventObject.returnValue := IsDocumentReady(Doc2);
inherited;
end;
function TcxHTMLDocEventSink.DoHTMLEvent(
const AEventObject: IHTMLEventObj; AMemberID: Integer;
var AResult: Variant): HRESULT;
procedure ReturnBoolResult(const EventResult: Boolean);
begin
TVarData(AResult).VType := varBoolean;
TVarData(AResult).VBoolean := EventResult;
end;
begin
Result := S_OK;
case AMemberID of
DISPID_HTMLDOCUMENTEVENTS2_ONSELECTIONCHANGE:
DoSelectionChange(AEventObject);
DISPID_HTMLDOCUMENTEVENTS2_ONSTOP:
ReturnBoolResult(DoStop(AEventObject));
else
Result := inherited DoHTMLEvent(AEventObject, AMemberID, AResult);
end;
end;
procedure TcxHTMLDocEventSink.DoSelectionChange(
const AEventObject: IHTMLEventObj);
begin
if Assigned(FOnSelectionChange) then
FOnSelectionChange(AEventObject);
end;
function TcxHTMLDocEventSink.DoStop(
const AEventObject: IHTMLEventObj): Boolean;
begin
if Assigned(FOnStop) then
Result := FOnStop(AEventObject)
else
Result := True;
end;
{ TcxHTMLEWFCtrlEventSink }
procedure TcxHTMLEWFCtrlEventSink.DoBeforeEditFocus(
const AEventObject: IHTMLEventObj);
begin
AEventObject.returnValue := False;
AEventObject.cancelBubble := True;
inherited;
end;
procedure TcxHTMLEWFCtrlEventSink.DoResizeEnd(
const AEventObject: IHTMLEventObj);
begin
FResizing := False;
inherited;
end;
function TcxHTMLEWFCtrlEventSink.DoResizeStart(
const AEventObject: IHTMLEventObj): Boolean;
begin
FResizing := True;
Result := inherited DoResizeStart(AEventObject);
end;
{ TcxHTMLSelectRegionSink }
function TcxHTMLSelectRegionSink.GetNormalSelectRect: TRect;
var
Pos: Integer;
begin
Result := FSelectingRect;
if Result.Left > Result.Right then
begin
Pos := Result.Left;
Result.Left := Result.Right;
Result.Right := Pos;
end;
if Result.Top > Result.Bottom then
begin
Pos := Result.Top;
Result.Top := Result.Bottom;
Result.Bottom := Pos;
end;
end;
procedure TcxHTMLSelectRegionSink.Snap(const ACurValue, ADelta: Integer; var ANewValue: Integer);
var
I: Integer;
begin
I := ANewValue;
if I > ACurValue then
Inc(I, ADelta);
I := (I div ADelta) * ADelta;
if ((ADelta < 4) and (Abs(I - ANewValue) < 2) ) or
(Abs(I - ANewValue) < (ADelta div 2)) then
ANewValue := I
else
ANewValue := ACurValue;
end;
function TcxHTMLSelectRegionSink.SinkIID: TGUID;
begin
Result := DIID_HTMLTextContainerEvents2;
end;
procedure TcxHTMLSelectRegionSink.DoMouseDown(const AEventObject: IHTMLEventObj);
function GetClipRect(var R: TRect): Boolean;
var
Global: tagPOINT;
Element2: IHTMLElement2;
Doc2: IHTMLDocument2;
Win3: IHTMLWindow3;
begin
if (Behavior.Element <> nil) and
Supports(Behavior.Element.document, IHTMLDocument2, Doc2) and
Supports(Doc2.parentWindow, IHTMLWindow3, Win3) then
begin
Element2 := Behavior.Element as IHTMLElement2;
Global := tagPOINT(Point(Element2.clientLeft, Element2.clientTop));
Inc(Global.X, Win3.screenLeft);
Inc(Global.Y, Win3.screenTop);
R.TopLeft := TPoint(Global);
R.Right := R.Left + Element2.clientWidth;
R.Bottom := R.Top + Element2.clientHeight;
Result := True;
end
else
Result := False;
end;
var
Rect: TRect;
RightLoc, BottomLoc: Integer;
begin
inherited;
if (AEventObject.button = 1) {Left mouse button} and
IsOwnEvent(AEventObject) and
IsPointInClient(AEventObject.srcElement, AEventObject.clientX, AEventObject.clientY) then
begin
if GetClipRect(Rect) then
ClipCursor(@Rect);
FState := hssStart;
FDeltaX := Behavior.Namespace.GetEditorInfo.GridXSize;
FDeltaY := Behavior.Namespace.GetEditorInfo.GridYSize;
RightLoc := AEventObject.offsetX;
BottomLoc := AEventObject.offsetY;
if Behavior.Namespace.GetEditorInfo.IsToolSelected and
Behavior.Namespace.GetEditorInfo.SnapToGrid then
begin
RightLoc := ((RightLoc + FDeltaX div 2) div FDeltaX) * FDeltaX;
BottomLoc := ((BottomLoc + FDeltaY div 2) div FDeltaY) * FDeltaY;
end;
FSelectingRect := Bounds(RightLoc, BottomLoc, 0, 0);
end;
end;
procedure TcxHTMLSelectRegionSink.DoMouseMove(const AEventObject: IHTMLEventObj);
function IsRealMoving: Boolean;
begin
Result := (Abs(FSelectingRect.Left - AEventObject.offsetX) > 3) or
(Abs(FSelectingRect.Top - AEventObject.offsetY) > 3);
end;
var
R: TRect;
RightLoc, BottomLoc: Integer;
begin
inherited;
if (AEventObject.button = 1) {Left mouse button} and
(FState <> hssNone) and IsRealMoving then
begin
if FState <> hssSelecting then
Behavior.PaintSite.InvalidatePainterInfo;
RightLoc := AEventObject.offsetX;
BottomLoc := AEventObject.offsetY;
if Behavior.Namespace.GetEditorInfo.IsToolSelected and
Behavior.Namespace.GetEditorInfo.SnapToGrid then
begin
Snap(FSelectingRect.Right, FDeltaX, RightLoc);
Snap(FSelectingRect.Bottom, FDeltaY, BottomLoc);
end;
FState := hssSelecting;
R := NormalSelectRect;
InflateRect(R, 1, 1);
if Behavior.Namespace.GetEditorInfo.IsToolSelected then
InflateRect(R, 1, 1);
Behavior.PaintSite.InvalidateRect(@R);
FSelectingRect.Right := RightLoc;
FSelectingRect.Bottom := BottomLoc;
R := NormalSelectRect;
Behavior.PaintSite.InvalidateRect(@R);
AEventObject.returnValue := False;
end;
end;
procedure TcxHTMLSelectRegionSink.DoMouseUp(const AEventObject: IHTMLEventObj);
var
R: TRect;
LocState: TcxHTMLSelectState;
RightLoc, BottomLoc: Integer;
begin
inherited;
LocState := FState;
FState := hssNone;
if (LocState <> hssNone) then
ClipCursor(nil);
if (LocState = hssSelecting) then
begin
RightLoc := AEventObject.offsetX;
BottomLoc := AEventObject.offsetY;
if Behavior.Namespace.GetEditorInfo.IsToolSelected and
Behavior.Namespace.GetEditorInfo.SnapToGrid then
begin
Snap(FSelectingRect.Right, FDeltaX, RightLoc);
Snap(FSelectingRect.Bottom, FDeltaY, BottomLoc);
end;
FSelectingRect.Right := RightLoc;
FSelectingRect.Bottom := BottomLoc;
R := NormalSelectRect;
Behavior.PaintSite.InvalidateRect(@R);
Behavior.PaintSite.InvalidatePainterInfo;
(AEventObject.SrcElement.document as IHTMLDocument2).selection.empty;
DoRectSelect(AEventObject, R);
end;
end;
procedure TcxHTMLSelectRegionSink.DoRectSelect(const AEventObject: IHTMLEventObj; const ARect: TRect);
begin
if Assigned(FOnRectSelect) then
FOnRectSelect(AEventObject, ARect);
end;
function TcxHTMLSelectRegionSink.IsOwnEvent(
const AEventObject: IHTMLEventObj): Boolean;
var
Element: IHTMLElement;
begin
Result := False;
if (AEventObject = nil) or (AEventObject.srcElement = nil) then Exit;
if Supports(Source, IHTMLElement, Element) then
Result := AEventObject.srcElement.sourceIndex = Element.sourceIndex;
end;
procedure TcxHTMLSelectRegionSink.DoBeforeEditFocus(
const AEventObject: IHTMLEventObj);
function IsTableEvent: Boolean;
var
Doc2: IHTMLDocument2;
Element: IHTMLElement;
begin
Element := nil;
if (AEventObject <> nil) and (AEventObject.srcElement <> nil) and
Supports(AEventObject.srcElement.document, IHTMLDocument2, Doc2) then
Element := Doc2.elementFromPoint(AEventObject.clientX, AEventObject.clientY);
Result := (Element <> nil) and
(Supports(Element, IHTMLTableCell) or Supports(Element, IHTMLTableCaption));
end;
begin
if IsOwnEvent(AEventObject) then
if not IsTableEvent then
begin
AEventObject.returnValue := False;
AEventObject.cancelBubble := True;
end;
inherited;
end;
end.