--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.editors;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.resource.JFaceResources;\r
+import org.eclipse.jface.resource.LocalResourceManager;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.browser.LocationEvent;\r
+import org.eclipse.swt.browser.LocationListener;\r
+import org.eclipse.swt.browser.ProgressEvent;\r
+import org.eclipse.swt.browser.ProgressListener;\r
+import org.eclipse.swt.browser.StatusTextEvent;\r
+import org.eclipse.swt.browser.StatusTextListener;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.layout.FillLayout;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.eclipse.swt.widgets.ProgressBar;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.swt.widgets.Text;\r
+import org.eclipse.swt.widgets.ToolBar;\r
+import org.eclipse.swt.widgets.ToolItem;\r
+import org.eclipse.ui.IEditorInput;\r
+import org.eclipse.ui.IEditorSite;\r
+import org.eclipse.ui.PartInitException;\r
+import org.eclipse.ui.part.EditorPart;\r
+\r
+/**\r
+ * Web Browser\r
+ * Visiblity of controls (back, forward, url, ...) can be configured with the BrowserInput\r
+ * \r
+ * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class Browser extends EditorPart {\r
+\r
+ public static final String ID = "org.simantics.editors.browser";\r
+\r
+ org.eclipse.swt.browser.Browser browser;\r
+ ToolBar toolbar;\r
+ LocalResourceManager resourceManager;\r
+\r
+ private final ImageDescriptor BACK_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/browser/arrow_left.png");\r
+ private final ImageDescriptor FORWARD_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/browser/arrow_right.png");\r
+ private final ImageDescriptor STOP_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/browser/stop.png");\r
+ private final ImageDescriptor REFRESH_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/browser/arrow_rotate_clockwise.png");\r
+\r
+ private Shell fsShell;\r
+\r
+ public Browser() {\r
+\r
+ }\r
+\r
+ @Override\r
+ public void doSave(IProgressMonitor monitor) {\r
+\r
+ }\r
+\r
+ @Override\r
+ public void doSaveAs() {\r
+\r
+ }\r
+\r
+ @Override\r
+ public void init(IEditorSite site, IEditorInput input)\r
+ throws PartInitException {\r
+ if (!(input instanceof BrowserInput))\r
+ throw new PartInitException("Input must be instance of BrowserInput");\r
+ setSite(site);\r
+ setInput(input);\r
+\r
+ // Set initial part name according to the name given by IEditorInput\r
+ setPartName(getEditorInput().getName());\r
+ }\r
+\r
+ @Override\r
+ public boolean isDirty() {\r
+ return false;\r
+ }\r
+\r
+ @Override\r
+ public boolean isSaveAsAllowed() {\r
+ return false;\r
+ }\r
+\r
+ @Override\r
+ public void createPartControl(Composite parent) {\r
+ resourceManager = new LocalResourceManager(JFaceResources.getResources(), parent);\r
+ Image backImage = resourceManager.createImage(BACK_IMAGE);\r
+ Image forwardImage = resourceManager.createImage(FORWARD_IMAGE);\r
+ Image stopImage = resourceManager.createImage(STOP_IMAGE);\r
+ Image refreshImage = resourceManager.createImage(REFRESH_IMAGE);\r
+\r
+ // http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet128.java\r
+ BrowserInput input = (BrowserInput)getEditorInput();\r
+ boolean fullscreen = input.isFullscreen();\r
+ if (fullscreen) {\r
+ fsShell = new Shell(parent.getDisplay());\r
+\r
+ fsShell.setLayout(new GridLayout(1,false));\r
+ fsShell.setLayout(new FillLayout());\r
+ parent = new Composite(fsShell,SWT.NONE);\r
+ fsShell.open();\r
+ fsShell.setFullScreen(true);\r
+ parent.setLayout(new FillLayout());\r
+ }\r
+\r
+ String url = input.getUrl().toString();\r
+ boolean showControls = input.isShowControls();\r
+ if (showControls) {\r
+ Composite composite = new Composite(parent, SWT.NONE);\r
+ GridLayout gridLayout = new GridLayout();\r
+ gridLayout.numColumns = 3;\r
+ composite.setLayout(gridLayout);\r
+ toolbar = new ToolBar(composite, SWT.NONE);\r
+ ToolItem itemBack = new ToolItem(toolbar, SWT.PUSH);\r
+ itemBack.setText("Back");\r
+ itemBack.setImage(backImage);\r
+ ToolItem itemForward = new ToolItem(toolbar, SWT.PUSH);\r
+ itemForward.setText("Forward");\r
+ itemForward.setImage(forwardImage);\r
+ ToolItem itemStop = new ToolItem(toolbar, SWT.PUSH);\r
+ itemStop.setText("Stop");\r
+ itemStop.setImage(stopImage);\r
+ ToolItem itemRefresh = new ToolItem(toolbar, SWT.PUSH);\r
+ itemRefresh.setText("Refresh");\r
+ itemRefresh.setImage(refreshImage);\r
+ // ToolItem itemGo = new ToolItem(toolbar, SWT.PUSH);\r
+ // itemGo.setText("Go");\r
+\r
+ GridData data = new GridData();\r
+ data.grabExcessHorizontalSpace = true;\r
+ data.grabExcessVerticalSpace = false;\r
+ data.horizontalAlignment = SWT.FILL;\r
+ data.verticalAlignment = SWT.CENTER;\r
+ data.horizontalSpan = 3;\r
+ toolbar.setLayoutData(data);\r
+\r
+ Label labelAddress = new Label(composite, SWT.NONE);\r
+ labelAddress.setText("Address");\r
+\r
+ final Text location = new Text(composite, SWT.BORDER);\r
+ data = new GridData();\r
+ data.horizontalAlignment = GridData.FILL;\r
+ data.horizontalSpan = 2;\r
+ data.grabExcessHorizontalSpace = true;\r
+ location.setLayoutData(data);\r
+\r
+ browser = new org.eclipse.swt.browser.Browser(composite, input.getBrowserStyle());\r
+\r
+ data = new GridData();\r
+ data.grabExcessHorizontalSpace = true;\r
+ data.grabExcessVerticalSpace = true;\r
+ data.horizontalAlignment = SWT.FILL;\r
+ data.verticalAlignment = SWT.FILL;\r
+ data.horizontalSpan = 3;\r
+ browser.setLayoutData(data);\r
+\r
+ final Label statusl = new Label(composite, SWT.NONE);\r
+ data = new GridData(GridData.FILL_HORIZONTAL);\r
+ data.horizontalSpan = 2;\r
+ statusl.setLayoutData(data);\r
+\r
+ final ProgressBar progressBar = new ProgressBar(composite, SWT.NONE);\r
+ data = new GridData();\r
+ data.horizontalAlignment = GridData.END;\r
+ progressBar.setLayoutData(data);\r
+\r
+ browser.addProgressListener(new ProgressListener() {\r
+ @Override\r
+ public void changed(ProgressEvent event) {\r
+ if (event.total == 0)\r
+ return;\r
+ int ratio = event.current * 100 / event.total;\r
+ progressBar.setSelection(ratio);\r
+ }\r
+\r
+ @Override\r
+ public void completed(ProgressEvent event) {\r
+ progressBar.setSelection(0);\r
+ }\r
+ });\r
+ browser.addStatusTextListener(new StatusTextListener() {\r
+ @Override\r
+ public void changed(StatusTextEvent event) {\r
+ statusl.setText(event.text);\r
+ }\r
+ });\r
+ browser.addLocationListener(new LocationListener() {\r
+ @Override\r
+ public void changed(LocationEvent event) {\r
+ if (event.top)\r
+ location.setText(event.location);\r
+ scheduleSetPartName();\r
+ }\r
+\r
+ @Override\r
+ public void changing(LocationEvent event) {\r
+ }\r
+ });\r
+\r
+ Listener listener = new Listener() {\r
+ @Override\r
+ public void handleEvent(Event event) {\r
+ ToolItem item = (ToolItem) event.widget;\r
+ String string = item.getText();\r
+ if (string.equals("Back"))\r
+ browser.back();\r
+ else if (string.equals("Forward"))\r
+ browser.forward();\r
+ else if (string.equals("Stop"))\r
+ browser.stop();\r
+ else if (string.equals("Refresh"))\r
+ browser.refresh();\r
+ // else if (string.equals("Go"))\r
+ // browser.setUrl(location.getText());\r
+ }\r
+ };\r
+\r
+ itemBack.addListener(SWT.Selection, listener);\r
+ itemForward.addListener(SWT.Selection, listener);\r
+ itemStop.addListener(SWT.Selection, listener);\r
+ itemRefresh.addListener(SWT.Selection, listener);\r
+ } else { // !showControls\r
+ browser = new org.eclipse.swt.browser.Browser(parent, input.getBrowserStyle());\r
+ browser.addLocationListener(new LocationListener() {\r
+ @Override\r
+ public void changed(LocationEvent event) {\r
+ scheduleSetPartName();\r
+ }\r
+ @Override\r
+ public void changing(LocationEvent event) {\r
+ }\r
+ });\r
+ }\r
+\r
+ browser.setUrl(url);\r
+\r
+ if (fullscreen) {\r
+ fsShell.layout(true, true);\r
+ }\r
+ }\r
+\r
+ protected void scheduleSetPartName() {\r
+ browser.getDisplay().asyncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ if (browser.isDisposed())\r
+ return;\r
+ String name = getEditorInput().getName();\r
+ setPartName(name);\r
+ }\r
+ });\r
+ }\r
+\r
+ @Override\r
+ public void setFocus() {\r
+ browser.setFocus();\r
+ }\r
+\r
+ @Override\r
+ public void dispose() {\r
+ if (fsShell != null)\r
+ fsShell.dispose();\r
+ super.dispose();\r
+ }\r
+\r
+ public org.eclipse.swt.browser.Browser getBrowser() {\r
+ return browser;\r
+ }\r
+\r
+}\r