diff options
author | Grant Gayed <ggayed> | 2007-04-26 18:13:09 +0000 |
---|---|---|
committer | Grant Gayed <ggayed> | 2007-04-26 18:13:09 +0000 |
commit | 2bb7fabcebd018e4b43543176e9365a42a54d0ed (patch) | |
tree | 4e1e2954660d6c9ee1a9bde1c9bfdebbd22a98e1 | |
parent | ebe9f6ca97b7bf0b21408692ee7fec3f5c0b8f45 (diff) | |
download | eclipse.platform.swt-2bb7fabcebd018e4b43543176e9365a42a54d0ed.tar.gz eclipse.platform.swt-2bb7fabcebd018e4b43543176e9365a42a54d0ed.tar.xz eclipse.platform.swt-2bb7fabcebd018e4b43543176e9365a42a54d0ed.zip |
49696
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java | 206 | ||||
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/COM.java | 10 |
2 files changed, 216 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java index 2b6af84407..2d30ab1d6b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Browser/win32/org/eclipse/swt/browser/IE.java @@ -22,6 +22,7 @@ class IE extends WebBrowser { OleFrame frame; OleControlSite site; OleAutomation auto; + OleListener mouseListener; boolean back, forward, navigate, delaySetText, ignoreDispose; Point location; @@ -149,6 +150,12 @@ public void create(Composite parent, int style) { site.doVerb(OLE.OLEIVERB_INPLACEACTIVATE); auto = new OleAutomation(site); + mouseListener = new OleListener() { + public void handleEvent (OleEvent e) { + handleMouseEvent(e); + } + }; + Listener listener = new Listener() { public void handleEvent(Event e) { switch (e.type) { @@ -161,6 +168,7 @@ public void create(Composite parent, int style) { ignoreDispose = true; browser.notifyListeners (e.type, e); e.type = SWT.NONE; + mouseListener = null; if (auto != null) auto.dispose(); auto = null; break; @@ -332,6 +340,14 @@ public void create(Composite parent, int style) { Variant varResult = event.arguments[0]; IDispatch dispatch = varResult.getDispatch(); if (globalDispatch == 0) globalDispatch = dispatch.getAddress(); + + OleAutomation webBrowser = varResult.getAutomation(); + varResult = event.arguments[1]; + Variant variant = new Variant(auto); + IDispatch top = variant.getDispatch(); + boolean isTop = top.getAddress() == dispatch.getAddress(); + hookMouseListeners(webBrowser, isTop); + webBrowser.dispose(); break; } case NewWindow2: { @@ -736,4 +752,194 @@ public void stop() { int[] rgdispid = auto.getIDsOfNames(new String[] { "Stop" }); //$NON-NLS-1$ auto.invoke(rgdispid[0]); } + +void handleMouseEvent (OleEvent e) { + Variant arg = e.arguments[0]; + OleAutomation event = arg.getAutomation(); + int[] rgdispid = event.getIDsOfNames(new String[]{ "type" }); //$NON-NLS-1$ + int dispIdMember = rgdispid[0]; + Variant pVarResult = event.getProperty(dispIdMember); + String eventType = pVarResult.getString(); + pVarResult.dispose(); + + /* + * Feature in IE. MouseOver/MouseOut events are fired any time the mouse enters + * or exits any element within the Browser. To ensure that SWT events are only + * fired for mouse movements into or out of the Browser, do not fire an event if + * the element being exited (on MouseOver) or entered (on MouseExit) is within + * the Browser. + */ + if (eventType.equals("mouseover")) { //$NON-NLS-1$ + rgdispid = event.getIDsOfNames(new String[] { "fromElement" }); //$NON-NLS-1$ + dispIdMember = rgdispid[0]; + pVarResult = event.getProperty(dispIdMember); + boolean isInternal = pVarResult.getType() != COM.VT_EMPTY; + pVarResult.dispose(); + if (isInternal) { + event.dispose(); + return; + } + } + if (eventType.equals("mouseout")) { //$NON-NLS-1$ + rgdispid = event.getIDsOfNames(new String[] { "toElement" }); //$NON-NLS-1$ + dispIdMember = rgdispid[0]; + pVarResult = event.getProperty(dispIdMember); + boolean isInternal = pVarResult.getType() != COM.VT_EMPTY; + pVarResult.dispose(); + if (isInternal) { + event.dispose(); + return; + } + } + + int x, y, mask = 0; + Event newEvent = new Event(); + newEvent.widget = browser; + + rgdispid = event.getIDsOfNames(new String[] { "clientX" }); //$NON-NLS-1$ + dispIdMember = rgdispid[0]; + pVarResult = event.getProperty(dispIdMember); + x = pVarResult.getInt(); + newEvent.x = x; + pVarResult.dispose(); + + rgdispid = event.getIDsOfNames(new String[] { "clientY" }); //$NON-NLS-1$ + dispIdMember = rgdispid[0]; + pVarResult = event.getProperty(dispIdMember); + y = pVarResult.getInt(); + newEvent.y = y; + pVarResult.dispose(); + + rgdispid = event.getIDsOfNames(new String[] { "ctrlKey" }); //$NON-NLS-1$ + dispIdMember = rgdispid[0]; + pVarResult = event.getProperty(dispIdMember); + if (pVarResult.getBoolean()) mask |= SWT.CTRL; + pVarResult.dispose(); + + rgdispid = event.getIDsOfNames(new String[] { "altKey" }); //$NON-NLS-1$ + dispIdMember = rgdispid[0]; + pVarResult = event.getProperty(dispIdMember); + if (pVarResult.getBoolean()) mask |= SWT.ALT; + pVarResult.dispose(); + + rgdispid = event.getIDsOfNames(new String[] { "shiftKey" }); //$NON-NLS-1$ + dispIdMember = rgdispid[0]; + pVarResult = event.getProperty(dispIdMember); + if (pVarResult.getBoolean()) mask |= SWT.SHIFT; + pVarResult.dispose(); + + newEvent.stateMask = mask; + + rgdispid = event.getIDsOfNames(new String[] { "button" }); //$NON-NLS-1$ + dispIdMember = rgdispid[0]; + pVarResult = event.getProperty(dispIdMember); + int button = pVarResult.getInt(); + pVarResult.dispose(); + switch (button) { + case 1: button = 1; break; + case 2: button = 3; break; + case 4: button = 2; break; + }; + + event.dispose(); + + if (eventType.equals("mousedown")) { //$NON-NLS-1$ + newEvent.type = SWT.MouseDown; + newEvent.button = button; + newEvent.count = 1; + } else if (eventType.equals("mouseup")) { //$NON-NLS-1$ + newEvent.type = SWT.MouseUp; + newEvent.button = button; + newEvent.count = 1; + } else if (eventType.equals("mousemove")) { //$NON-NLS-1$ + newEvent.type = SWT.MouseMove; + } else if (eventType.equals("mouseover")) { //$NON-NLS-1$ + newEvent.type = SWT.MouseEnter; + } else if (eventType.equals("mouseout")) { //$NON-NLS-1$ + newEvent.type = SWT.MouseExit; + } else if (eventType.equals("dragstart")) { //$NON-NLS-1$ + newEvent.type = SWT.DragDetect; + } + + browser.notifyListeners(newEvent.type, newEvent); + + if (eventType.equals("dblclick")) { //$NON-NLS-1$ + newEvent = new Event (); + newEvent.widget = browser; + newEvent.type = SWT.MouseDoubleClick; + newEvent.x = x; newEvent.y = y; + newEvent.stateMask = mask; + newEvent.type = SWT.MouseDoubleClick; + newEvent.button = 1; /* dblclick only comes for button 1 and does not set the button property */ + newEvent.count = 2; + browser.notifyListeners (newEvent.type, newEvent); + } +} + +void hookMouseListeners(OleAutomation webBrowser, final boolean isTop) { + int[] rgdispid = webBrowser.getIDsOfNames(new String[]{ "Document" }); //$NON-NLS-1$ + int dispIdMember = rgdispid[0]; + Variant pVarResult = webBrowser.getProperty(dispIdMember); + if (pVarResult == null) return; + if (pVarResult.getType() == COM.VT_EMPTY) { + pVarResult.dispose(); + return; + } + final OleAutomation document = pVarResult.getAutomation(); + pVarResult.dispose(); + + OleListener stopListener = new OleListener () { + public void handleEvent(OleEvent event) { + unhookMouseListeners (document, isTop); + char[] buffer = (COM.IIDIHTMLDocumentEvents2 + '\0').toCharArray(); + GUID guid = new GUID(); + if (COM.IIDFromString(buffer, guid) == COM.S_OK) { + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONSTOP, this); + } + } + }; + + /* + * Feature of IE. ONSTOP is fired for a document that is replaced by navigating to + * a new document, but it is not fired for a document that is replaced by a Back or + * Forward operation. As a result, it's possible that the current document may + * already have mouse listeners hooked on it from a previous viewing. Unhook mouse + * listeners from the current document before hooking our mouse listeners to ensure + * that multiple sets of events will not be received. + */ + unhookMouseListeners (document, isTop); + char[] buffer = (COM.IIDIHTMLDocumentEvents2 + '\0').toCharArray(); + GUID guid = new GUID(); + if (COM.IIDFromString(buffer, guid) == COM.S_OK) { + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONSTOP, stopListener); + } + + site.addEventListener(document, COM.IIDIHTMLDocumentEvents2, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEDOWN, mouseListener); + site.addEventListener(document, COM.IIDIHTMLDocumentEvents2, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEUP, mouseListener); + site.addEventListener(document, COM.IIDIHTMLDocumentEvents2, COM.DISPID_HTMLDOCUMENTEVENTS_ONDBLCLICK, mouseListener); + site.addEventListener(document, COM.IIDIHTMLDocumentEvents2, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEMOVE, mouseListener); + site.addEventListener(document, COM.IIDIHTMLDocumentEvents2, COM.DISPID_HTMLDOCUMENTEVENTS_ONDRAGSTART, mouseListener); + site.addEventListener(document, COM.IIDIHTMLDocumentEvents2, COM.DISPID_HTMLDOCUMENTEVENTS_ONSTOP, stopListener); + /* ensure that enter/exit are only fired once, by the top-level document */ + if (isTop) { + site.addEventListener(document, COM.IIDIHTMLDocumentEvents2, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEOVER, mouseListener); + site.addEventListener(document, COM.IIDIHTMLDocumentEvents2, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEOUT, mouseListener); + } +} + +void unhookMouseListeners(OleAutomation document, boolean isTop) { + char[] buffer = (COM.IIDIHTMLDocumentEvents2 + '\0').toCharArray(); + GUID guid = new GUID(); + if (COM.IIDFromString(buffer, guid) == COM.S_OK) { + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEDOWN, mouseListener); + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEUP, mouseListener); + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONDBLCLICK, mouseListener); + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEMOVE, mouseListener); + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONDRAGSTART, mouseListener); + if (isTop) { + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEOVER, mouseListener); + site.removeEventListener(document, guid, COM.DISPID_HTMLDOCUMENTEVENTS_ONMOUSEOUT, mouseListener); + } + } +} } diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/COM.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/COM.java index a4721c1b94..b7d2cfaa8e 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/COM.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/ole/win32/COM.java @@ -57,6 +57,7 @@ public class COM extends OS { //public static final GUID IIDIExternalConnection = IIDFromString("{00000019-0000-0000-C000-000000000046}"); //$NON-NLS-1$ public static final GUID IIDIFont = IIDFromString("{BEF6E002-A874-101A-8BBA-00AA00300CAB}"); //$NON-NLS-1$ //public static final GUID IIDIFontDisp = IIDFromString("{BEF6E003-A874-101A-8BBA-00AA00300CAB}"); //$NON-NLS-1$ + public static final /*GUID*/ String IIDIHTMLDocumentEvents2 = /*IIDFromString(*/"{3050F613-98B5-11CF-BB82-00AA00BDCE0B}"/*)*/; public static final GUID IIDIInternetSecurityManager = IIDFromString("{79eac9ee-baf9-11ce-8c82-00aa004ba90b}"); //$NON-NLS-1$ //public static final GUID IIDILockBytes = IIDFromString("{0000000A-0000-0000-C000-000000000046}"); //$NON-NLS-1$ //public static final GUID IIDIMalloc = IIDFromString("{00000002-0000-0000-C000-000000000046}"); //$NON-NLS-1$ @@ -200,6 +201,15 @@ public class COM extends OS { public static final int DISPID_FONT_UNDER = 5; public static final int DISPID_FONT_WEIGHT = 7; public static final int DISPID_FORECOLOR = -513; + public static final int DISPID_HTMLDOCUMENTEVENTS_ONDBLCLICK = 0xFFFFFDA7; + public static final int DISPID_HTMLDOCUMENTEVENTS_ONDRAGSTART = 0x8001000B; + public static final int DISPID_HTMLDOCUMENTEVENTS_ONMOUSEOUT = 0x80010009; + public static final int DISPID_HTMLDOCUMENTEVENTS_ONMOUSEOVER = 0x80010008; + public static final int DISPID_HTMLDOCUMENTEVENTS_ONMOUSEMOVE = 0xFFFFFDA2; + public static final int DISPID_HTMLDOCUMENTEVENTS_ONMOUSEDOWN = 0xFFFFFDA3; + public static final int DISPID_HTMLDOCUMENTEVENTS_ONMOUSEUP = 0xFFFFFDA1; + public static final int DISPID_HTMLDOCUMENTEVENTS_ONSTOP = 0x00000402; + //public static final int DISPID_READYSTATE = -525; //public static final int DISPID_READYSTATECHANGE = -609; public static final int DRAGDROP_S_DROP = 0x00040100; |