blob: e9ba5d4c2d1ab5537f35ff18656df505372f1078 [file] [log] [blame]
/*******************************************************************************
* 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 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.examples.ole.win32;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.part.*;
/**
* Ole uses <code>org.eclipse.swt</code> to demonstrate Win32 OLE / ActiveX
* integration.
*
* @see ViewPart
*/
public class OleBrowserView extends ViewPart {
private Composite displayArea;
private OleFrame webFrame;
private OleWebBrowser webBrowser;
private Text webUrl;
private OleControlSite webControlSite;
private ProgressBar webProgress;
private Label webStatus;
private Button webNavigateButton;
private ToolItem webCommandBackward;
private ToolItem webCommandForward;
private ToolItem webCommandHome;
private ToolItem webCommandStop;
private ToolItem webCommandRefresh;
private ToolItem webCommandSearch;
private boolean activated = false;
private static final int DISPID_AMBIENT_DLCONTROL = -5512;
private static final int DLCTL_NO_SCRIPTS = 0x80;
/**
* Constructs the OLE browser view.
*/
public OleBrowserView() {
OlePlugin.initResources();
}
/**
* Creates the example.
*
* @see ViewPart#createPartControl
*/
public void createPartControl(Composite parent) {
displayArea = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3;
displayArea.setLayout(gridLayout);
createToolbar();
createBrowserFrame();
createStatusArea();
createBrowserControl();
}
/**
* Cleanup
*/
public void dispose() {
if (activated) {
webControlSite.deactivateInPlaceClient();
activated = false;
}
if (webBrowser != null) webBrowser.dispose();
webBrowser = null;
super.dispose();
}
/**
* Called when we must grab focus.
*
* @see org.eclipse.ui.part.ViewPart#setFocus
*/
public void setFocus() {
webUrl.setFocus();
}
/**
* Creates the Web browser toolbar.
*/
private void createToolbar() {
// Add a toolbar
ToolBar bar = new ToolBar(displayArea, SWT.NONE);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
bar.setLayoutData(gridData);
// Add a button to navigate backwards through previously visited web sites
webCommandBackward = new ToolItem(bar, SWT.NONE);
webCommandBackward.setToolTipText(OlePlugin.getResourceString("browser.Back.tooltip"));
webCommandBackward.setText(OlePlugin.getResourceString("browser.Back.text"));
webCommandBackward.setImage(OlePlugin.images[OlePlugin.biBack]);
webCommandBackward.setEnabled(false);
webCommandBackward.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (webBrowser == null) return;
webBrowser.GoBack();
}
});
// Add a button to navigate forward through previously visited web sites
webCommandForward = new ToolItem(bar, SWT.NONE);
webCommandForward.setToolTipText(OlePlugin.getResourceString("browser.Forward.tooltip"));
webCommandForward.setText(OlePlugin.getResourceString("browser.Forward.text"));
webCommandForward.setImage(OlePlugin.images[OlePlugin.biForward]);
webCommandForward.setEnabled(false);
webCommandForward.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (webBrowser == null) return;
webBrowser.GoForward();
}
});
// Add a separator
new ToolItem(bar, SWT.SEPARATOR);
// Add a button to navigate to the Home page
webCommandHome = new ToolItem(bar, SWT.NONE);
webCommandHome.setToolTipText(OlePlugin.getResourceString("browser.Home.tooltip"));
webCommandHome.setText(OlePlugin.getResourceString("browser.Home.text"));
webCommandHome.setImage(OlePlugin.images[OlePlugin.biHome]);
webCommandHome.setEnabled(false);
webCommandHome.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (webBrowser == null) return;
webBrowser.GoHome();
}
});
// Add a button to abort web page loading
webCommandStop = new ToolItem(bar, SWT.NONE);
webCommandStop.setToolTipText(OlePlugin.getResourceString("browser.Stop.tooltip"));
webCommandStop.setText(OlePlugin.getResourceString("browser.Stop.text"));
webCommandStop.setImage(OlePlugin.images[OlePlugin.biStop]);
webCommandStop.setEnabled(false);
webCommandStop.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (webBrowser == null) return;
webBrowser.Stop();
}
});
// Add a button to refresh the current web page
webCommandRefresh = new ToolItem(bar, SWT.NONE);
webCommandRefresh.setToolTipText(OlePlugin.getResourceString("browser.Refresh.tooltip"));
webCommandRefresh.setText(OlePlugin.getResourceString("browser.Refresh.text"));
webCommandRefresh.setImage(OlePlugin.images[OlePlugin.biRefresh]);
webCommandRefresh.setEnabled(false);
webCommandRefresh.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (webBrowser == null) return;
webBrowser.Refresh();
}
});
// Add a separator
new ToolItem(bar, SWT.SEPARATOR);
// Add a button to search the web
webCommandSearch = new ToolItem(bar, SWT.NONE);
webCommandSearch.setToolTipText(OlePlugin.getResourceString("browser.Search.tooltip"));
webCommandSearch.setText(OlePlugin.getResourceString("browser.Search.text"));
webCommandSearch.setImage(OlePlugin.images[OlePlugin.biSearch]);
webCommandSearch.setEnabled(false);
webCommandSearch.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (webBrowser == null) return;
webBrowser.GoSearch();
}
});
// Add a text area for Users to enter a url
Composite addressBar = new Composite(displayArea, SWT.NONE);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
gridData.horizontalSpan = 3;
addressBar.setLayoutData(gridData);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3;
addressBar.setLayout(gridLayout);
Label addressLabel = new Label(addressBar, SWT.NONE);
gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
addressLabel.setLayoutData(gridData);
addressLabel.setText(OlePlugin.getResourceString("browser.Address.label"));
addressLabel.setFont(OlePlugin.browserFont);
webUrl = new Text(addressBar, SWT.SINGLE | SWT.BORDER);
webUrl.setFont(OlePlugin.browserFont);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
webUrl.setLayoutData(gridData);
webUrl.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
webNavigateButton.getShell().setDefaultButton(webNavigateButton);
}
});
// Add a button to navigate to the web site specified in the Text area defined above
webNavigateButton = new Button(addressBar, SWT.PUSH);
gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
webNavigateButton.setLayoutData(gridData);
webNavigateButton.setText(OlePlugin.getResourceString("browser.Go.text"));
webNavigateButton.setFont(OlePlugin.browserFont);
webNavigateButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (webBrowser == null) return;
webBrowser.Navigate(webUrl.getText());
}
});
}
/**
* Creates the Web browser OleFrame.
*/
private void createBrowserFrame() {
// Every control must have an associated OleFrame:
webFrame = new OleFrame(displayArea, SWT.NONE);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
gridData.horizontalSpan = 3;
webFrame.setLayoutData(gridData);
}
/**
* Creates the Web browser status area.
*/
private void createStatusArea() {
// Add a progress bar to display downloading progress information
webProgress = new ProgressBar(displayArea, SWT.BORDER);
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.BEGINNING;
gridData.verticalAlignment = GridData.FILL;
webProgress.setLayoutData(gridData);
// Add a label for displaying status messages as they are received from the control
webStatus = new Label(displayArea, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
gridData.horizontalSpan = 2;
webStatus.setLayoutData(gridData);
webStatus.setFont(OlePlugin.browserFont);
}
/**
* Creates Web browser control.
*/
private void createBrowserControl() {
try {
// Create an Automation object for access to extended capabilities
webControlSite = new OleControlSite(webFrame, SWT.NONE, "Shell.Explorer");
Variant download = new Variant(DLCTL_NO_SCRIPTS);
webControlSite.setSiteProperty(DISPID_AMBIENT_DLCONTROL, download);
OleAutomation oleAutomation = new OleAutomation(webControlSite);
webBrowser = new OleWebBrowser(oleAutomation);
} catch (SWTException ex) {
// Creation may have failed because control is not installed on machine
Label label = new Label(webFrame, SWT.BORDER);
OlePlugin.logError(OlePlugin.getResourceString("error.CouldNotCreateBrowserControl"), ex);
label.setText(OlePlugin.getResourceString("error.CouldNotCreateBrowserControl"));
return;
}
// Respond to ProgressChange events by updating the Progress bar
webControlSite.addEventListener(OleWebBrowser.ProgressChange, new OleListener() {
public void handleEvent(OleEvent event) {
Variant progress = event.arguments[0];
Variant maxProgress = event.arguments[1];
if (progress == null || maxProgress == null)
return;
webProgress.setMaximum(maxProgress.getInt());
webProgress.setSelection(progress.getInt());
}
});
// Respond to StatusTextChange events by updating the Status Text label
webControlSite.addEventListener(OleWebBrowser.StatusTextChange, new OleListener() {
public void handleEvent(OleEvent event) {
Variant statusText = event.arguments[0];
if (statusText == null) return;
String text = statusText.getString();
if (text != null)
webStatus.setText(text);
}
});
// Listen for changes to the ready state and print out the current state
webControlSite.addPropertyListener(OleWebBrowser.DISPID_READYSTATE, new OleListener() {
public void handleEvent(OleEvent event) {
if (event.detail == OLE.PROPERTY_CHANGING) return;
int state = webBrowser.getReadyState();
switch (state) {
case OleWebBrowser.READYSTATE_UNINITIALIZED:
webStatus.setText(
OlePlugin.getResourceString("browser.State.Uninitialized.text"));
webCommandBackward.setEnabled(false);
webCommandForward.setEnabled(false);
webCommandHome.setEnabled(false);
webCommandRefresh.setEnabled(false);
webCommandStop.setEnabled(false);
webCommandSearch.setEnabled(false);
break;
case OleWebBrowser.READYSTATE_LOADING:
webStatus.setText(
OlePlugin.getResourceString("browser.State.Loading.text"));
webCommandHome.setEnabled(true);
webCommandRefresh.setEnabled(true);
webCommandStop.setEnabled(true);
webCommandSearch.setEnabled(true);
break;
case OleWebBrowser.READYSTATE_LOADED:
webStatus.setText(
OlePlugin.getResourceString("browser.State.Loaded.text"));
webCommandStop.setEnabled(true);
break;
case OleWebBrowser.READYSTATE_INTERACTIVE:
webStatus.setText(
OlePlugin.getResourceString("browser.State.Interactive.text"));
webCommandStop.setEnabled(true);
break;
case OleWebBrowser.READYSTATE_COMPLETE:
webStatus.setText(
OlePlugin.getResourceString("browser.State.Complete.text"));
webCommandStop.setEnabled(false);
break;
}
}
});
// Listen for changes to the active command states
webControlSite.addEventListener(OleWebBrowser.CommandStateChange, new OleListener() {
public void handleEvent(OleEvent event) {
if (event.type != OleWebBrowser.CommandStateChange) return;
final int commandID =
(event.arguments[0] != null) ? event.arguments[0].getInt() : 0;
final boolean commandEnabled =
(event.arguments[1] != null) ? event.arguments[1].getBoolean() : false;
switch (commandID) {
case OleWebBrowser.CSC_NAVIGATEBACK:
webCommandBackward.setEnabled(commandEnabled);
break;
case OleWebBrowser.CSC_NAVIGATEFORWARD:
webCommandForward.setEnabled(commandEnabled);
break;
}
}
});
// in place activate the ActiveX control
activated = (webControlSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE) == OLE.S_OK);
if (activated) webBrowser.GoHome();
}
}