/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.snippets; /* * OLE and ActiveX example snippet: get events from IE control (win32 only) * * This snippet only runs as-is on 32-bit architectures because it uses * java integers to represent native pointers. "long" comments are included * throughout the snippet to show where int should be changed to long in * order to run on a 64-bit architecture. * * NOTE: This snippet uses internal SWT packages that are * subject to change without notice. * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ */ import org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.ole.win32.*; import org.eclipse.swt.internal.ole.win32.*; import org.eclipse.swt.internal.win32.OS; public class Snippet123 { public static void main(String[] args) { final Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); OleControlSite controlSite; try { OleFrame frame = new OleFrame(shell, SWT.NONE); controlSite = new OleControlSite(frame, SWT.NONE, "Shell.Explorer"); controlSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE); } catch (SWTError e) { System.out.println("Unable to open activeX control"); display.dispose(); return; } shell.open(); // IWebBrowser final OleAutomation webBrowser = new OleAutomation(controlSite); // When a new document is loaded, access the document object for the new page. int DownloadComplete = 104; controlSite.addEventListener(DownloadComplete, new OleListener() { public void handleEvent(OleEvent event) { int[] htmlDocumentID = webBrowser.getIDsOfNames(new String[]{"Document"}); if (htmlDocumentID == null) return; Variant pVarResult = webBrowser.getProperty(htmlDocumentID[0]); if (pVarResult == null || pVarResult.getType() == 0) return; //IHTMLDocument2 OleAutomation htmlDocument = pVarResult.getAutomation(); // Request to be notified of click, double click and key down events EventDispatch myDispatch = new EventDispatch(EventDispatch.onclick); IDispatch idispatch = new IDispatch(myDispatch.getAddress()); Variant dispatch = new Variant(idispatch); htmlDocument.setProperty(EventDispatch.onclick, dispatch); myDispatch = new EventDispatch(EventDispatch.ondblclick); idispatch = new IDispatch(myDispatch.getAddress()); dispatch = new Variant(idispatch); htmlDocument.setProperty(EventDispatch.ondblclick, dispatch); myDispatch = new EventDispatch(EventDispatch.onkeydown); idispatch = new IDispatch(myDispatch.getAddress()); dispatch = new Variant(idispatch); htmlDocument.setProperty(EventDispatch.onkeydown, dispatch); //Remember to release OleAutomation Object htmlDocument.dispose(); } }); // Navigate to a web site int[] ids = webBrowser.getIDsOfNames(new String[]{"Navigate", "URL"}); Variant[] rgvarg = new Variant[] {new Variant("http://www.google.com")}; int[] rgdispidNamedArgs = new int[]{ids[1]}; webBrowser.invoke(ids[0], rgvarg, rgdispidNamedArgs); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } //Remember to release OleAutomation Object webBrowser.dispose(); display.dispose(); } } // EventDispatch implements a simple IDispatch interface which will be called // when the event is fired. class EventDispatch { private COMObject iDispatch; private int refCount = 0; private int eventID; final static int onhelp = 0x8001177d; final static int onclick = 0x80011778; final static int ondblclick = 0x80011779; final static int onkeyup = 0x80011776; final static int onkeydown = 0x80011775; final static int onkeypress = 0x80011777; final static int onmouseup = 0x80011773; final static int onmousedown = 0x80011772; final static int onmousemove = 0x80011774; final static int onmouseout = 0x80011771; final static int onmouseover = 0x80011770; final static int onreadystatechange = 0x80011789; final static int onafterupdate = 0x80011786; final static int onrowexit= 0x80011782; final static int onrowenter = 0x80011783; final static int ondragstart = 0x80011793; final static int onselectstart = 0x80011795; EventDispatch(int eventID) { this.eventID = eventID; createCOMInterfaces(); } long /*int*/ getAddress() { return iDispatch.getAddress(); } private void createCOMInterfaces() { iDispatch = new COMObject(new int[]{2, 0, 0, 1, 3, 4, 8}){ public long /*int*/ method0(long /*int*/[] args) {return QueryInterface(args[0], args[1]);} public long /*int*/ method1(long /*int*/[] args) {return AddRef();} public long /*int*/ method2(long /*int*/[] args) {return Release();} // method3 GetTypeInfoCount - not implemented // method4 GetTypeInfo - not implemented // method5 GetIDsOfNames - not implemented public long /*int*/ method6(long /*int*/[] args) {return Invoke((int)/*64*/args[0], args[1], (int)/*64*/args[2], (int)/*64*/args[3], args[4], args[5], args[6], args[7]);} }; } private void disposeCOMInterfaces() { if (iDispatch != null) iDispatch.dispose(); iDispatch = null; } private int AddRef() { refCount++; return refCount; } private int Invoke(int dispIdMember, long /*int*/ riid, int lcid, int dwFlags, long /*int*/ pDispParams, long /*int*/ pVarResult, long /*int*/ pExcepInfo, long /*int*/ pArgErr) { switch (eventID) { case onhelp: System.out.println("onhelp"); break; case onclick: System.out.println("onclick"); break; case ondblclick: System.out.println("ondblclick"); break; case onkeyup: System.out.println("onkeyup"); break; case onkeydown: System.out.println("onkeydown"); break; case onkeypress: System.out.println("onkeypress"); break; case onmouseup: System.out.println("onmouseup"); break; case onmousedown: System.out.println("onmousedown"); break; case onmousemove: System.out.println("onmousemove"); break; case onmouseout: System.out.println("onmouseout"); break; case onmouseover: System.out.println("onmouseover"); break; case onreadystatechange: System.out.println("onreadystatechange"); break; case onafterupdate: System.out.println("onafterupdate"); break; case onrowexit: System.out.println("onrowexit"); break; case onrowenter: System.out.println("onrowenter"); break; case ondragstart: System.out.println("ondragstart"); break; case onselectstart: System.out.println("onselectstart"); break; } return COM.S_OK; } private int QueryInterface(long /*int*/ riid, long /*int*/ ppvObject) { if (riid == 0 || ppvObject == 0) return COM.E_INVALIDARG; GUID guid = new GUID(); COM.MoveMemory(guid, riid, GUID.sizeof); if (COM.IsEqualGUID(guid, COM.IIDIUnknown) || COM.IsEqualGUID(guid, COM.IIDIDispatch)) { COM.MoveMemory(ppvObject, new long /*int*/[] {iDispatch.getAddress()}, OS.PTR_SIZEOF); AddRef(); return COM.S_OK; } COM.MoveMemory(ppvObject, new long /*int*/[] {0}, OS.PTR_SIZEOF); return COM.E_NOINTERFACE; } int Release() { refCount--; if (refCount == 0) { disposeCOMInterfaces(); } return refCount; } }