1 | { ******************************************** }
|
---|
2 | { UEditHost ver 1.0 (Oct. 10, 2003) }
|
---|
3 | { }
|
---|
4 | { For Delphi 4, 5 and 6 }
|
---|
5 | { }
|
---|
6 | { Copyright (C) 1999-2003, Kurt Senfer. }
|
---|
7 | { All Rights Reserved. }
|
---|
8 | { }
|
---|
9 | { Support@ks.helpware.net }
|
---|
10 | { }
|
---|
11 | { Documentation and updated versions: }
|
---|
12 | { }
|
---|
13 | { http://KS.helpware.net }
|
---|
14 | { }
|
---|
15 | { ******************************************** }
|
---|
16 | {
|
---|
17 | This library is free software; you can redistribute it and/or
|
---|
18 | modify it under the terms of the GNU Lesser General Public
|
---|
19 | License as published by the Free Software Foundation; either
|
---|
20 | version 2.1 of the License, or (at your option) any later version.
|
---|
21 |
|
---|
22 | This library is distributed in the hope that it will be useful,
|
---|
23 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
24 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
25 | Lesser General Public License for more details.
|
---|
26 |
|
---|
27 | You should have received a copy of the GNU Lesser General Public
|
---|
28 | License along with this library; if not, write to the Free Software
|
---|
29 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
30 | }
|
---|
31 |
|
---|
32 |
|
---|
33 | unit UEditHost;
|
---|
34 |
|
---|
35 | //this unit implements a combined IHTMLEditHost & IHTMLEditHost2 interface.
|
---|
36 |
|
---|
37 | interface
|
---|
38 |
|
---|
39 | uses
|
---|
40 | windows, Classes, mshtml_tlb, EmbeddedED;
|
---|
41 |
|
---|
42 | type
|
---|
43 |
|
---|
44 | //this is only declared if IE 6 is imported to mshtml_tlb
|
---|
45 | IHTMLEditHost2 = interface(IHTMLEditHost)
|
---|
46 | ['{3050F848-98B5-11CF-BB82-00AA00BDCE0D}']
|
---|
47 | function PreDrag: HResult; stdcall;
|
---|
48 | end;
|
---|
49 |
|
---|
50 | TEditHost = class(TInterfacedObject, IHTMLEditHost, IHTMLEditHost2)
|
---|
51 | private
|
---|
52 | function SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; stdcall;
|
---|
53 | function PreDrag: HResult; stdcall;
|
---|
54 |
|
---|
55 | public
|
---|
56 | FSnapEnabled: Boolean;
|
---|
57 | FGridX: Integer;
|
---|
58 | FGridY: Integer;
|
---|
59 | FExtSnapRect: TSnapRect;
|
---|
60 | FOnPreDrag: TNotifyEventEx;
|
---|
61 | constructor Create(Ovner: TEmbeddedED);
|
---|
62 | procedure BeforeDestruction; override;
|
---|
63 | function QueryService(const rsid, iid: TGuid; out Obj): HResult;
|
---|
64 | end;
|
---|
65 |
|
---|
66 | implementation
|
---|
67 | uses ActiveX, ComObj, IeConst;
|
---|
68 |
|
---|
69 | const
|
---|
70 | SID_SHTMLEditHost: TGUID = '{3050F6A0-98B5-11CF-BB82-00AA00BDCE0B}';
|
---|
71 |
|
---|
72 | //------------------------------------------------------------------------------
|
---|
73 | function TEditHost.QueryService(const rsid, iid: TGuid; out Obj): HResult;
|
---|
74 | const
|
---|
75 | IID_IHTMLEditHost2: TGUID = '{3050F848-98B5-11CF-BB82-00AA00BDCE0D}';
|
---|
76 | begin
|
---|
77 | //asm int 3 end; //trap
|
---|
78 | //we only come heir if TEmbeddedED is queryed for SID_SHTMLEDitHost
|
---|
79 |
|
---|
80 | //MSHTML asks either for a IHTMLEditHost or a IHTMLEditHost2
|
---|
81 | if IsEqualGUID(iid, IID_IHTMLEditHost2)
|
---|
82 | then IUnknown(obj) := self as IHTMLEditHost2 //new in IE 6
|
---|
83 | else IUnknown(obj) := self as IHTMLEditHost;
|
---|
84 |
|
---|
85 | Result := S_OK;
|
---|
86 | end;
|
---|
87 | //------------------------------------------------------------------------------
|
---|
88 | function TEditHost.PreDrag: HResult; stdcall;
|
---|
89 | var
|
---|
90 | Cancel: Boolean;
|
---|
91 | begin
|
---|
92 | //asm int 3 end; //trap
|
---|
93 |
|
---|
94 | result := S_OK;
|
---|
95 |
|
---|
96 | if assigned(FOnPreDrag)
|
---|
97 | then begin
|
---|
98 | FOnPreDrag(Self, Cancel);
|
---|
99 | if not Cancel
|
---|
100 | then result := S_FALSE;
|
---|
101 | end;
|
---|
102 | end;
|
---|
103 | //------------------------------------------------------------------------------
|
---|
104 | function TEditHost.SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; stdcall;
|
---|
105 |
|
---|
106 | //-------------------------------------------------------------
|
---|
107 | function GetNextAviablePoint(aPoint, GridSpacing, Offset: integer): Integer;
|
---|
108 | begin
|
---|
109 | result := ((aPoint + (GridSpacing div 2)) div GridSpacing) * GridSpacing + Offset;
|
---|
110 | end;
|
---|
111 | //-------------------------------------------------------------
|
---|
112 | var
|
---|
113 | Width : Integer;
|
---|
114 | Height: Integer;
|
---|
115 | aElement: IHTMLElement2;
|
---|
116 |
|
---|
117 | P: tagPOINT;
|
---|
118 | Pr: tagRECT;
|
---|
119 | aDisplays: IDisplayServices;
|
---|
120 | aevent: IHTMLEventObj;
|
---|
121 | begin
|
---|
122 | //asm int 3 end; //trap
|
---|
123 |
|
---|
124 | If assigned(FExtSnapRect)
|
---|
125 | then begin
|
---|
126 | FExtSnapRect(Self, pIElement, prcNew, eHandle, Result);
|
---|
127 | exit;
|
---|
128 | end;
|
---|
129 |
|
---|
130 |
|
---|
131 | //dont snap if not enabled or the Control key is down
|
---|
132 | if (not FSnapEnabled) or (GetAsyncKeyState(VK_CONTROL) < 0)
|
---|
133 | then begin
|
---|
134 | result := S_FALSE; //do default handling
|
---|
135 | exit;
|
---|
136 | end;
|
---|
137 |
|
---|
138 | result := S_OK;
|
---|
139 |
|
---|
140 | case eHandle of
|
---|
141 | ELEMENT_CORNER_NONE: // Code for moving the element
|
---|
142 | begin
|
---|
143 | Width := prcNew.right - prcNew.left;
|
---|
144 | Height := prcNew.bottom - prcNew.top;
|
---|
145 |
|
---|
146 | prcNew.top := GetNextAviablePoint(prcNew.top, FGridY, -2);
|
---|
147 | prcNew.left := GetNextAviablePoint(prcNew.left, FGridX, -2);
|
---|
148 | prcNew.bottom := prcNew.top + Height;
|
---|
149 | prcNew.right := prcNew.left + Width;
|
---|
150 | end;
|
---|
151 |
|
---|
152 | ELEMENT_CORNER_TOP: // Code for resizing the element
|
---|
153 | prcNew.top := GetNextAviablePoint(prcNew.top, FGridY, -2);
|
---|
154 |
|
---|
155 | ELEMENT_CORNER_LEFT: // Code for resizing the element
|
---|
156 | prcNew.left := GetNextAviablePoint(prcNew.left, FGridX, -2);
|
---|
157 |
|
---|
158 | ELEMENT_CORNER_BOTTOM: // Code for resizing the element
|
---|
159 | prcNew.bottom := GetNextAviablePoint(prcNew.bottom, FGridY, 1);
|
---|
160 |
|
---|
161 | ELEMENT_CORNER_RIGHT: // Code for resizing the element
|
---|
162 | prcNew.right := GetNextAviablePoint(prcNew.right, FGridX, 1);
|
---|
163 |
|
---|
164 | ELEMENT_CORNER_TOPLEFT: // Code for resizing the element
|
---|
165 | begin
|
---|
166 | prcNew.top := GetNextAviablePoint(prcNew.top, FGridY, -2);
|
---|
167 | prcNew.left := GetNextAviablePoint(prcNew.left, FGridX, -2);
|
---|
168 | end;
|
---|
169 |
|
---|
170 | ELEMENT_CORNER_TOPRIGHT: // Code for resizing the element
|
---|
171 | begin
|
---|
172 | prcNew.top := GetNextAviablePoint(prcNew.top, FGridY, -2);
|
---|
173 | prcNew.right := GetNextAviablePoint(prcNew.right, FGridX, 1);
|
---|
174 | end;
|
---|
175 |
|
---|
176 | ELEMENT_CORNER_BOTTOMLEFT: // Code for resizing the element
|
---|
177 | begin
|
---|
178 | prcNew.left := GetNextAviablePoint(prcNew.left, FGridX, -2);
|
---|
179 | prcNew.bottom := GetNextAviablePoint(prcNew.bottom, FGridY, 1);
|
---|
180 | end;
|
---|
181 |
|
---|
182 | ELEMENT_CORNER_BOTTOMRIGHT: // Code for resizing the element
|
---|
183 | begin
|
---|
184 | prcNew.bottom := GetNextAviablePoint(prcNew.bottom, FGridY, 1);
|
---|
185 | prcNew.right := GetNextAviablePoint(prcNew.right, FGridX, 1);
|
---|
186 | end;
|
---|
187 | end;
|
---|
188 | end;
|
---|
189 | //------------------------------------------------------------------------------
|
---|
190 | constructor TEditHost.Create(Ovner: TEmbeddedED);
|
---|
191 | begin
|
---|
192 | Inherited Create;
|
---|
193 | _AddRef; //dont die automatically
|
---|
194 | end;
|
---|
195 | //------------------------------------------------------------------------------
|
---|
196 | procedure TEditHost.BeforeDestruction;
|
---|
197 | begin
|
---|
198 | FRefCount := 0;
|
---|
199 | end;
|
---|
200 | //------------------------------------------------------------------------------
|
---|
201 | end.
|
---|
202 |
|
---|