/*******************************************************************************
* 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)
* 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.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.internal.ole.win32.COM;
import org.eclipse.swt.internal.ole.win32.COMObject;
import org.eclipse.swt.internal.ole.win32.GUID;
import org.eclipse.swt.internal.ole.win32.IDispatch;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleControlSite;
import org.eclipse.swt.ole.win32.OleEvent;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.OleListener;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class GetEventsFromIE {
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");
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();
}
int getAddress() {
return iDispatch.getAddress();
}
private void createCOMInterfaces() {
iDispatch = new COMObject(new int[] { 2, 0, 0, 1, 3, 4, 8 }) {
public int method0(int[] args) {
return QueryInterface(args[0], args[1]);
}
public int method1(int[] args) {
return AddRef();
}
public int method2(int[] args) {
return Release();
}
// method3 GetTypeInfoCount - not implemented
// method4 GetTypeInfo - not implemented
// method5 GetIDsOfNames - not implemented
public int method6(int[] args) {
return Invoke(args[0], args[1], args[2], 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, int riid, int lcid, int dwFlags, int pDispParams,
int pVarResult, int pExcepInfo, 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(int riid, 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 int[] { iDispatch.getAddress() }, 4);
AddRef();
return COM.S_OK;
}
COM.MoveMemory(ppvObject, new int[] { 0 }, 4);
return COM.E_NOINTERFACE;
}
int Release() {
refCount--;
if (refCount == 0) {
disposeCOMInterfaces();
}
return refCount;
}
}