| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.welcome.internal.webbrowser; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.ole.win32.*; |
| import org.eclipse.swt.widgets.*; |
| |
| /** |
| * ActiveX based web browser control. |
| */ |
| public class WebBrowser implements OleListener { |
| // Generated from typelib filename: shdocvw.dll |
| |
| // Constants for WebBrowser CommandStateChange |
| |
| public static final short CSC_UPDATECOMMANDS = -1; |
| public static final short CSC_NAVIGATEFORWARD = 1; |
| public static final short CSC_NAVIGATEBACK = 2; |
| |
| // Web Browser Control Events |
| public static final int BeforeNavigate = 100; |
| // Fired when a new hyperlink is being navigated to. |
| public static final int NavigateComplete = 101; |
| // Fired when the document being navigated to becomes visible and enters the navigation stack. |
| public static final int StatusTextChange = 102; |
| // Statusbar text changed. |
| public static final int ProgressChange = 108; |
| // Fired when download progress is updated. |
| public static final int DownloadComplete = 104; |
| // Download of page complete. |
| public static final int CommandStateChange = 105; |
| // The enabled state of a command changed |
| public static final int DownloadBegin = 106; |
| // Download of a page started. |
| public static final int NewWindow = 107; |
| // Fired when a new window should be created. |
| public static final int TitleChange = 113; |
| // Document title changed. |
| public static final int FrameBeforeNavigate = 200; |
| // Fired when a new hyperlink is being navigated to in a frame. |
| public static final int FrameNavigateComplete = 201; |
| // Fired when a new hyperlink is being navigated to in a frame. |
| public static final int FrameNewWindow = 204; |
| // Fired when a new window should be created. |
| public static final int Quit = 103; |
| // Fired when application is quiting. |
| public static final int WindowMove = 109; |
| // Fired when window has been moved. |
| public static final int WindowResize = 110; |
| // Fired when window has been sized. |
| public static final int WindowActivate = 111; |
| // Fired when window has been activated. |
| public static final int PropertyChange = 112; |
| // Fired when the PutProperty method has been called. |
| public static final int BeforeNavigate2 = 250; |
| // Fired when a new hyperlink is being navigated to. |
| public static final int NewWindow2 = 251; |
| // Fired when a new window should be created. |
| public static final int DocumentComplete = 259; |
| // Fired when the document being navigated to reaches ReadyState_Complete. |
| |
| // Web Browser properties |
| public static final int DISPID_READYSTATE = -525; |
| |
| // Web Browser state |
| public static final int READYSTATE_UNINITIALIZED = 0; |
| public static final int READYSTATE_LOADING = 1; |
| public static final int READYSTATE_LOADED = 2; |
| public static final int READYSTATE_INTERACTIVE = 3; |
| public static final int READYSTATE_COMPLETE = 4; |
| |
| // Keep track of the whether it is possible to navigate in the forward and backward directions |
| private boolean backwardEnabled; |
| private boolean forwardEnabled; |
| |
| // The automation object and Control associated with the main OLE control |
| private OleAutomation oleObject; |
| private BrowserControlSite controlSite; |
| |
| // The OLE frame (there should only be one) |
| private OleFrame controlFrame; |
| |
| //private NestedPrintDelegate aPrintDelegate = null; |
| |
| /** |
| */ |
| public WebBrowser(Composite parent) { |
| |
| // Create the OLE frame. |
| controlFrame = createOleFrame(parent); |
| |
| // Creates the IE5 OLE Control |
| // The constructor also registers all the necessary OLE listeners. |
| // for now, only catch the execption if creating and activating the |
| // control fails. No checking if the correct version of the OLE control |
| // is installed. |
| try { |
| controlSite = |
| new BrowserControlSite( |
| controlFrame, |
| SWT.NONE, |
| "Shell.Explorer"); |
| controlSite.setBrowser(this); |
| oleObject = new OleAutomation(controlSite); |
| |
| backwardEnabled = false; |
| forwardEnabled = false; |
| |
| // Listen for changes to the Command States |
| controlSite.addEventListener(CommandStateChange, this); |
| |
| // initialize control |
| controlSite.doVerb(OLE.OLEIVERB_SHOW); |
| |
| // create print Delegate (has to be done early, here!). |
| //aPrintDelegate = new NestedPrintDelegate(this, oleObject, controlSite); |
| |
| } catch (Exception e) { |
| String id = "org.eclipse.update.ui.win32"; |
| IStatus status = |
| new Status(IStatus.ERROR, id, IStatus.OK, e.getMessage(), e); |
| Platform.getPlugin("org.eclipse.core.runtime").getLog().log(status); |
| } |
| } |
| /** |
| */ |
| public int back() { |
| |
| if (!backwardEnabled) |
| return OLE.S_FALSE; |
| forwardEnabled = true; |
| |
| // dispid=100, type=METHOD, name="GoBack" |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 100; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = oleObject.getIDsOfNames(new String[] { "GoBack" }); |
| int dispIdMember = rgdispid[0]; |
| |
| Variant pVarResult = oleObject.invoke(dispIdMember); |
| |
| if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY) |
| return 0; |
| return pVarResult.getInt(); |
| } |
| /** |
| */ |
| public int copy() { |
| int result = controlSite.queryStatus(OLE.OLECMDID_COPY); |
| if ((result & OLE.OLECMDF_ENABLED) == OLE.OLECMDF_ENABLED) { |
| result = |
| controlSite.exec( |
| OLE.OLECMDID_COPY, |
| OLE.OLECMDEXECOPT_DODEFAULT, |
| null, |
| null); |
| } |
| return result; |
| } |
| protected OleFrame createOleFrame(Composite parent) { |
| if (controlFrame == null) { |
| controlFrame = new OleFrame(parent, SWT.NONE); |
| controlFrame.setLayoutData( |
| new GridData( |
| GridData.GRAB_HORIZONTAL |
| | GridData.GRAB_VERTICAL |
| | GridData.HORIZONTAL_ALIGN_FILL |
| | GridData.VERTICAL_ALIGN_FILL)); |
| } |
| return controlFrame; |
| |
| } |
| /** |
| * clean up |
| */ |
| public void dispose() { |
| //** clean up |
| if (oleObject != null) |
| oleObject.dispose(); |
| oleObject = null; |
| |
| if (controlSite != null) |
| controlSite.dispose(); |
| controlSite = null; |
| |
| if (controlFrame != null) |
| controlFrame.dispose(); |
| controlFrame = null; |
| |
| } |
| /** |
| */ |
| public int forward() { |
| if (!forwardEnabled) |
| return OLE.S_FALSE; |
| backwardEnabled = true; |
| // dispid=101, type=METHOD, name="GoForward" |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 101; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = oleObject.getIDsOfNames(new String[] { "GoForward" }); |
| int dispIdMember = rgdispid[0]; |
| |
| Variant pVarResult = oleObject.invoke(dispIdMember); |
| if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY) |
| return 0; |
| return pVarResult.getInt(); |
| } |
| public Control getControl() { |
| return controlFrame; |
| } |
| /** |
| */ |
| public String getLocationName() { |
| // dispid=210, type=PROPGET, name="LocationName" |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 210; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = |
| oleObject.getIDsOfNames(new String[] { "LocationName" }); |
| int dispIdMember = rgdispid[0]; |
| Variant pVarResult = oleObject.getProperty(dispIdMember); |
| if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY) |
| return null; |
| return pVarResult.getString(); |
| } |
| /** |
| */ |
| public String getLocationURL() { |
| // dispid=211, type=PROPGET, name="LocationURL" |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 211; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = |
| oleObject.getIDsOfNames(new String[] { "LocationURL" }); |
| int dispIdMember = rgdispid[0]; |
| |
| Variant pVarResult = oleObject.getProperty(dispIdMember); |
| if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY) |
| return null; |
| return pVarResult.getString(); |
| } |
| protected OleFrame getOleFrame() { |
| return controlFrame; |
| |
| } |
| |
| public BrowserControlSite getControlSite() { |
| return controlSite; |
| } |
| /** |
| */ |
| public int getReadyState() { |
| // dispid=4294966771, type=PROPGET, name="ReadyState" |
| // READYSTATE_UNINITIALIZED = 0; |
| // READYSTATE_LOADING = 1; |
| // READYSTATE_LOADED = 2; |
| // READYSTATE_INTERACTIVE = 3; |
| // READYSTATE_COMPLETE = 4; |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = -525; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = oleObject.getIDsOfNames(new String[] { "ReadyState" }); |
| int dispIdMember = rgdispid[0]; |
| |
| Variant pVarResult = oleObject.getProperty(dispIdMember); |
| if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY) |
| return -1; |
| return pVarResult.getInt(); |
| } |
| /** |
| */ |
| public void handleEvent(OleEvent event) { |
| switch (event.type) { |
| case (CommandStateChange) : |
| int command = 0; |
| boolean enabled = false; |
| |
| Variant varResult = event.arguments[0]; |
| if (varResult != null && varResult.getType() != OLE.VT_EMPTY) { |
| command = varResult.getInt(); |
| } |
| |
| varResult = event.arguments[1]; |
| if (varResult != null && varResult.getType() != OLE.VT_EMPTY) { |
| enabled = varResult.getBoolean(); |
| } |
| |
| if (command == CSC_NAVIGATEBACK) |
| backwardEnabled = enabled; |
| if (command == CSC_NAVIGATEFORWARD) |
| forwardEnabled = enabled; |
| |
| return; |
| |
| case (DocumentComplete) : |
| varResult = event.arguments[0]; |
| return; |
| } |
| //throw new OleError(OLE.ERROR_NOT_IMPLEMENTED); |
| } |
| /** |
| */ |
| public int home() { |
| // dispid=102, type=METHOD, name="GoHome" |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 102; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = oleObject.getIDsOfNames(new String[] { "GoHome" }); |
| int dispIdMember = rgdispid[0]; |
| |
| Variant pVarResult = oleObject.invoke(dispIdMember); |
| if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY) |
| return 0; |
| return pVarResult.getInt(); |
| } |
| /** |
| */ |
| public int navigate(String url) { |
| return navigate(oleObject, url); |
| } |
| /** |
| */ |
| protected int navigate(OleAutomation aOleAutomation, String url) { |
| //if (Logger.DEBUG) |
| //Logger.logDebugMessage("WebBrowser", "navigate to: " + url); |
| // dispid=104, type=METHOD, name="Navigate" |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 104; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| // Here we are looking up the id of the argument as well |
| int[] rgdispid = |
| aOleAutomation.getIDsOfNames(new String[] { "Navigate", "URL" }); |
| int dispIdMember = rgdispid[0]; |
| |
| Variant[] rgvarg = new Variant[1]; |
| rgvarg[0] = new Variant(url); |
| int[] rgdispidNamedArgs = new int[1]; |
| rgdispidNamedArgs[0] = rgdispid[1]; // identifier of argument |
| Variant pVarResult = |
| aOleAutomation.invoke(dispIdMember, rgvarg, rgdispidNamedArgs); |
| if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY) |
| return 0; |
| return pVarResult.getInt(); |
| |
| } |
| /** |
| */ |
| public int print() { |
| return print(controlSite, true); |
| } |
| /** |
| */ |
| protected int print(BrowserControlSite aControlSite, boolean promptuser) { |
| |
| int result = aControlSite.queryStatus(OLE.OLECMDID_PRINT); |
| |
| if ((result & OLE.OLECMDF_ENABLED) == OLE.OLECMDF_ENABLED) { |
| if (promptuser) |
| result = |
| aControlSite.exec( |
| OLE.OLECMDID_PRINT, |
| OLE.OLECMDEXECOPT_PROMPTUSER, |
| null, |
| null); |
| else |
| result = |
| aControlSite.exec( |
| OLE.OLECMDID_PRINT, |
| OLE.OLECMDEXECOPT_DONTPROMPTUSER, |
| null, |
| null); |
| } |
| |
| //if (Logger.DEBUG) |
| //Logger.logDebugMessage("WebBrowser", "exec returns: " + Integer.toString(result)); |
| return result; |
| } |
| |
| /** |
| * Refresh the currently viewed page. |
| */ |
| public void refresh() { |
| |
| // dispid= 4294966746, type=METHOD, name="Refresh" |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 4294966746; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = oleObject.getIDsOfNames(new String[] { "Refresh" }); |
| int dispIdMember = rgdispid[0]; |
| |
| oleObject.invokeNoReply(dispIdMember); |
| } |
| /** |
| */ |
| public int search() { |
| // dispid=103, type=METHOD, name="GoSearch" |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 103; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = oleObject.getIDsOfNames(new String[] { "GoSearch" }); |
| int dispIdMember = rgdispid[0]; |
| |
| Variant pVarResult = oleObject.invoke(dispIdMember); |
| if (pVarResult == null || pVarResult.getType() == OLE.VT_EMPTY) |
| return 0; |
| return pVarResult.getInt(); |
| } |
| /** |
| */ |
| public void stop() { |
| // dispid=106, type=METHOD, name="Stop" |
| |
| // You can hard code the DISPID if you know it before hand - this is of course the fastest way |
| //int dispIdMember = 106; |
| |
| // Alternatively, you can look up the DISPID dynamically |
| int[] rgdispid = oleObject.getIDsOfNames(new String[] { "Stop" }); |
| int dispIdMember = rgdispid[0]; |
| |
| //Variant pVarResult = oleObject.invoke(dispIdMember); |
| oleObject.invoke(dispIdMember); |
| } |
| /** |
| * Gets the forwardEnabled |
| * @return Returns a boolean |
| */ |
| public boolean isForwardEnabled() { |
| return forwardEnabled; |
| } |
| |
| /** |
| * Gets the backwardEnabled |
| * @return Returns a boolean |
| */ |
| public boolean isBackwardEnabled() { |
| return backwardEnabled; |
| } |
| } |