| [541] | 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, 
 | 
|---|
 | 41 |   //kt mshtml_tlb, 
 | 
|---|
 | 42 |   MSHTML_EWB,
 | 
|---|
 | 43 |   EmbeddedED;
 | 
|---|
 | 44 | 
 | 
|---|
 | 45 | type
 | 
|---|
 | 46 |   tagRECT = TRect;  //kt
 | 
|---|
 | 47 |   
 | 
|---|
 | 48 |   //this is only declared if IE 6 is imported to mshtml_tlb
 | 
|---|
 | 49 |   IHTMLEditHost2 = interface(IHTMLEditHost)
 | 
|---|
 | 50 |     ['{3050F848-98B5-11CF-BB82-00AA00BDCE0D}']
 | 
|---|
 | 51 |     function  PreDrag: HResult; stdcall;
 | 
|---|
 | 52 |   end;
 | 
|---|
 | 53 | 
 | 
|---|
 | 54 |   TEditHost = class(TInterfacedObject, IHTMLEditHost, IHTMLEditHost2)
 | 
|---|
 | 55 |   private
 | 
|---|
 | 56 |     function SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; stdcall;
 | 
|---|
 | 57 |     function PreDrag: HResult; stdcall;
 | 
|---|
 | 58 | 
 | 
|---|
 | 59 |   public
 | 
|---|
 | 60 |     FSnapEnabled: Boolean;
 | 
|---|
 | 61 |     FGridX: Integer;
 | 
|---|
 | 62 |     FGridY: Integer;
 | 
|---|
 | 63 |     //kt FExtSnapRect: TSnapRect;
 | 
|---|
 | 64 |     FOnPreDrag: TNotifyEventEx;
 | 
|---|
 | 65 |     constructor Create(Ovner: TEmbeddedED);
 | 
|---|
 | 66 |     procedure BeforeDestruction; override;
 | 
|---|
 | 67 |     function QueryService(const rsid, iid: TGuid; out Obj): HResult;
 | 
|---|
 | 68 |   end;
 | 
|---|
 | 69 | 
 | 
|---|
 | 70 | implementation
 | 
|---|
 | 71 |   uses ActiveX, ComObj, IeConst;
 | 
|---|
 | 72 | 
 | 
|---|
 | 73 | const
 | 
|---|
 | 74 |   SID_SHTMLEditHost: TGUID = '{3050F6A0-98B5-11CF-BB82-00AA00BDCE0B}';
 | 
|---|
 | 75 | 
 | 
|---|
 | 76 | //------------------------------------------------------------------------------
 | 
|---|
 | 77 | function TEditHost.QueryService(const rsid, iid: TGuid; out Obj): HResult;
 | 
|---|
 | 78 | const
 | 
|---|
 | 79 |   IID_IHTMLEditHost2: TGUID = '{3050F848-98B5-11CF-BB82-00AA00BDCE0D}';
 | 
|---|
 | 80 | begin
 | 
|---|
 | 81 |   //asm int 3 end; //trap
 | 
|---|
 | 82 |   //we only come heir if TEmbeddedED is queryed for SID_SHTMLEDitHost
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 |   //MSHTML asks either for a IHTMLEditHost or a IHTMLEditHost2
 | 
|---|
 | 85 |   if IsEqualGUID(iid, IID_IHTMLEditHost2)
 | 
|---|
 | 86 |      then IUnknown(obj) := self as IHTMLEditHost2  //new in IE 6
 | 
|---|
 | 87 |      else IUnknown(obj) := self as IHTMLEditHost;
 | 
|---|
 | 88 | 
 | 
|---|
 | 89 |   Result := S_OK;
 | 
|---|
 | 90 | end;
 | 
|---|
 | 91 | //------------------------------------------------------------------------------
 | 
|---|
 | 92 | function TEditHost.PreDrag: HResult; stdcall;
 | 
|---|
 | 93 | var
 | 
|---|
 | 94 |   Cancel: Boolean;
 | 
|---|
 | 95 | begin
 | 
|---|
 | 96 |   //asm int 3 end; //trap
 | 
|---|
 | 97 | 
 | 
|---|
 | 98 |   result := S_OK;
 | 
|---|
 | 99 | 
 | 
|---|
 | 100 |   if assigned(FOnPreDrag)
 | 
|---|
 | 101 |      then begin
 | 
|---|
 | 102 |         FOnPreDrag(Self, Cancel);
 | 
|---|
 | 103 |         if not Cancel
 | 
|---|
 | 104 |            then result := S_FALSE;
 | 
|---|
 | 105 |      end;
 | 
|---|
 | 106 | end;
 | 
|---|
 | 107 | 
 | 
|---|
 | 108 | //------------------------------------------------------------------------------
 | 
|---|
 | 109 | function TEditHost.SnapRect(const pIElement: IHTMLElement; var prcNew: tagRECT; eHandle: _ELEMENT_CORNER): HResult; stdcall;
 | 
|---|
 | 110 | 
 | 
|---|
 | 111 |   //-------------------------------------------------------------
 | 
|---|
 | 112 |   function GetNextAviablePoint(aPoint, GridSpacing, Offset: integer): Integer;
 | 
|---|
 | 113 |   begin
 | 
|---|
 | 114 |      result := ((aPoint + (GridSpacing div 2)) div GridSpacing) * GridSpacing + Offset;
 | 
|---|
 | 115 |   end;
 | 
|---|
 | 116 |   //-------------------------------------------------------------
 | 
|---|
 | 117 | var
 | 
|---|
 | 118 |   Width : Integer;
 | 
|---|
 | 119 |   Height: Integer;
 | 
|---|
 | 120 |   aElement: IHTMLElement2;
 | 
|---|
 | 121 | 
 | 
|---|
 | 122 |   P: tagPOINT;
 | 
|---|
 | 123 |   Pr: tagRECT;
 | 
|---|
 | 124 |   aDisplays: IDisplayServices;
 | 
|---|
 | 125 |   aevent: IHTMLEventObj;
 | 
|---|
 | 126 | begin
 | 
|---|
 | 127 |   //asm int 3 end; //trap
 | 
|---|
 | 128 | 
 | 
|---|
 | 129 |   { //kt
 | 
|---|
 | 130 |   If assigned(FExtSnapRect)
 | 
|---|
 | 131 |      then begin
 | 
|---|
 | 132 |         FExtSnapRect(Self, pIElement, prcNew, eHandle, Result);
 | 
|---|
 | 133 |         exit;
 | 
|---|
 | 134 |      end;
 | 
|---|
 | 135 |   }
 | 
|---|
 | 136 | 
 | 
|---|
 | 137 |   //dont snap if not enabled or the Control key is down
 | 
|---|
 | 138 |   if (not FSnapEnabled) or (GetAsyncKeyState(VK_CONTROL) < 0)
 | 
|---|
 | 139 |      then begin
 | 
|---|
 | 140 |         result := S_FALSE; //do default handling
 | 
|---|
 | 141 |         exit;
 | 
|---|
 | 142 |      end;
 | 
|---|
 | 143 | 
 | 
|---|
 | 144 |   result := S_OK;
 | 
|---|
 | 145 | 
 | 
|---|
 | 146 |   case eHandle of
 | 
|---|
 | 147 |      ELEMENT_CORNER_NONE:          // Code for moving the element
 | 
|---|
 | 148 |         begin
 | 
|---|
 | 149 |            Width := prcNew.right - prcNew.left;
 | 
|---|
 | 150 |            Height := prcNew.bottom - prcNew.top;
 | 
|---|
 | 151 | 
 | 
|---|
 | 152 |            prcNew.top := GetNextAviablePoint(prcNew.top, FGridY, -2);
 | 
|---|
 | 153 |            prcNew.left := GetNextAviablePoint(prcNew.left, FGridX, -2);
 | 
|---|
 | 154 |            prcNew.bottom := prcNew.top + Height;
 | 
|---|
 | 155 |            prcNew.right := prcNew.left + Width;
 | 
|---|
 | 156 |         end;
 | 
|---|
 | 157 | 
 | 
|---|
 | 158 |      ELEMENT_CORNER_TOP:           // Code for resizing the element
 | 
|---|
 | 159 |            prcNew.top := GetNextAviablePoint(prcNew.top, FGridY, -2);
 | 
|---|
 | 160 | 
 | 
|---|
 | 161 |      ELEMENT_CORNER_LEFT:          // Code for resizing the element
 | 
|---|
 | 162 |            prcNew.left := GetNextAviablePoint(prcNew.left, FGridX, -2);
 | 
|---|
 | 163 | 
 | 
|---|
 | 164 |      ELEMENT_CORNER_BOTTOM:        // Code for resizing the element
 | 
|---|
 | 165 |            prcNew.bottom := GetNextAviablePoint(prcNew.bottom, FGridY, 1);
 | 
|---|
 | 166 | 
 | 
|---|
 | 167 |      ELEMENT_CORNER_RIGHT:         // Code for resizing the element
 | 
|---|
 | 168 |            prcNew.right := GetNextAviablePoint(prcNew.right, FGridX, 1);
 | 
|---|
 | 169 | 
 | 
|---|
 | 170 |      ELEMENT_CORNER_TOPLEFT:       // Code for resizing the element
 | 
|---|
 | 171 |         begin
 | 
|---|
 | 172 |            prcNew.top := GetNextAviablePoint(prcNew.top, FGridY, -2);
 | 
|---|
 | 173 |            prcNew.left := GetNextAviablePoint(prcNew.left, FGridX, -2);
 | 
|---|
 | 174 |         end;
 | 
|---|
 | 175 | 
 | 
|---|
 | 176 |      ELEMENT_CORNER_TOPRIGHT:      // Code for resizing the element
 | 
|---|
 | 177 |         begin
 | 
|---|
 | 178 |            prcNew.top := GetNextAviablePoint(prcNew.top, FGridY, -2);
 | 
|---|
 | 179 |            prcNew.right := GetNextAviablePoint(prcNew.right, FGridX, 1);
 | 
|---|
 | 180 |         end;
 | 
|---|
 | 181 | 
 | 
|---|
 | 182 |      ELEMENT_CORNER_BOTTOMLEFT:    // Code for resizing the element
 | 
|---|
 | 183 |         begin
 | 
|---|
 | 184 |            prcNew.left := GetNextAviablePoint(prcNew.left, FGridX, -2);
 | 
|---|
 | 185 |            prcNew.bottom := GetNextAviablePoint(prcNew.bottom, FGridY, 1);
 | 
|---|
 | 186 |         end;
 | 
|---|
 | 187 | 
 | 
|---|
 | 188 |      ELEMENT_CORNER_BOTTOMRIGHT:   // Code for resizing the element
 | 
|---|
 | 189 |         begin
 | 
|---|
 | 190 |            prcNew.bottom := GetNextAviablePoint(prcNew.bottom, FGridY, 1);
 | 
|---|
 | 191 |            prcNew.right := GetNextAviablePoint(prcNew.right, FGridX, 1);
 | 
|---|
 | 192 |         end;
 | 
|---|
 | 193 |    end;
 | 
|---|
 | 194 | end;
 | 
|---|
 | 195 | 
 | 
|---|
 | 196 | 
 | 
|---|
 | 197 | //------------------------------------------------------------------------------
 | 
|---|
 | 198 | constructor TEditHost.Create(Ovner: TEmbeddedED);
 | 
|---|
 | 199 | begin
 | 
|---|
 | 200 |   Inherited Create;
 | 
|---|
 | 201 |   _AddRef;  //dont die automatically
 | 
|---|
 | 202 | end;
 | 
|---|
 | 203 | //------------------------------------------------------------------------------
 | 
|---|
 | 204 | procedure TEditHost.BeforeDestruction;
 | 
|---|
 | 205 | begin
 | 
|---|
 | 206 |   FRefCount := 0;
 | 
|---|
 | 207 | end;
 | 
|---|
 | 208 | //------------------------------------------------------------------------------
 | 
|---|
 | 209 | end.
 | 
|---|
 | 210 |  
 | 
|---|