]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.editors/src/org/simantics/editors/Browser.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.editors / src / org / simantics / editors / Browser.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.editors;\r
13 \r
14 import org.eclipse.core.runtime.IProgressMonitor;\r
15 import org.eclipse.jface.resource.ImageDescriptor;\r
16 import org.eclipse.jface.resource.JFaceResources;\r
17 import org.eclipse.jface.resource.LocalResourceManager;\r
18 import org.eclipse.swt.SWT;\r
19 import org.eclipse.swt.browser.LocationEvent;\r
20 import org.eclipse.swt.browser.LocationListener;\r
21 import org.eclipse.swt.browser.ProgressEvent;\r
22 import org.eclipse.swt.browser.ProgressListener;\r
23 import org.eclipse.swt.browser.StatusTextEvent;\r
24 import org.eclipse.swt.browser.StatusTextListener;\r
25 import org.eclipse.swt.graphics.Image;\r
26 import org.eclipse.swt.layout.FillLayout;\r
27 import org.eclipse.swt.layout.GridData;\r
28 import org.eclipse.swt.layout.GridLayout;\r
29 import org.eclipse.swt.widgets.Composite;\r
30 import org.eclipse.swt.widgets.Event;\r
31 import org.eclipse.swt.widgets.Label;\r
32 import org.eclipse.swt.widgets.Listener;\r
33 import org.eclipse.swt.widgets.ProgressBar;\r
34 import org.eclipse.swt.widgets.Shell;\r
35 import org.eclipse.swt.widgets.Text;\r
36 import org.eclipse.swt.widgets.ToolBar;\r
37 import org.eclipse.swt.widgets.ToolItem;\r
38 import org.eclipse.ui.IEditorInput;\r
39 import org.eclipse.ui.IEditorSite;\r
40 import org.eclipse.ui.PartInitException;\r
41 import org.eclipse.ui.part.EditorPart;\r
42 \r
43 /**\r
44  * Web Browser\r
45  * Visiblity of controls (back, forward, url, ...) can be configured with the BrowserInput\r
46  * \r
47  * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
48  *\r
49  */\r
50 public class Browser extends EditorPart {\r
51 \r
52     public static final String ID = "org.simantics.editors.browser";\r
53 \r
54     org.eclipse.swt.browser.Browser browser;\r
55     ToolBar toolbar;\r
56     LocalResourceManager resourceManager;\r
57 \r
58     private final ImageDescriptor BACK_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/browser/arrow_left.png");\r
59     private final ImageDescriptor FORWARD_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/browser/arrow_right.png");\r
60     private final ImageDescriptor STOP_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/browser/stop.png");\r
61     private final ImageDescriptor REFRESH_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/browser/arrow_rotate_clockwise.png");\r
62 \r
63     private Shell fsShell;\r
64 \r
65     public Browser() {\r
66 \r
67     }\r
68 \r
69     @Override\r
70     public void doSave(IProgressMonitor monitor) {\r
71 \r
72     }\r
73 \r
74     @Override\r
75     public void doSaveAs() {\r
76 \r
77     }\r
78 \r
79     @Override\r
80     public void init(IEditorSite site, IEditorInput input)\r
81     throws PartInitException {\r
82         if (!(input instanceof BrowserInput))\r
83             throw new PartInitException("Input must be instance of BrowserInput");\r
84         setSite(site);\r
85         setInput(input);\r
86 \r
87         // Set initial part name according to the name given by IEditorInput\r
88         setPartName(getEditorInput().getName());\r
89     }\r
90 \r
91     @Override\r
92     public boolean isDirty() {\r
93         return false;\r
94     }\r
95 \r
96     @Override\r
97     public boolean isSaveAsAllowed() {\r
98         return false;\r
99     }\r
100 \r
101     @Override\r
102     public void createPartControl(Composite parent) {\r
103         resourceManager = new LocalResourceManager(JFaceResources.getResources(), parent);\r
104         Image backImage = resourceManager.createImage(BACK_IMAGE);\r
105         Image forwardImage = resourceManager.createImage(FORWARD_IMAGE);\r
106         Image stopImage = resourceManager.createImage(STOP_IMAGE);\r
107         Image refreshImage = resourceManager.createImage(REFRESH_IMAGE);\r
108 \r
109         // http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet128.java\r
110         BrowserInput input = (BrowserInput)getEditorInput();\r
111         boolean fullscreen = input.isFullscreen();\r
112         if (fullscreen) {\r
113             fsShell = new Shell(parent.getDisplay());\r
114 \r
115             fsShell.setLayout(new GridLayout(1,false));\r
116             fsShell.setLayout(new FillLayout());\r
117             parent = new Composite(fsShell,SWT.NONE);\r
118             fsShell.open();\r
119             fsShell.setFullScreen(true);\r
120             parent.setLayout(new FillLayout());\r
121         }\r
122 \r
123         String url = input.getUrl().toString();\r
124         boolean showControls = input.isShowControls();\r
125         if (showControls) {\r
126             Composite composite = new Composite(parent, SWT.NONE);\r
127             GridLayout gridLayout = new GridLayout();\r
128             gridLayout.numColumns = 3;\r
129             composite.setLayout(gridLayout);\r
130             toolbar = new ToolBar(composite, SWT.NONE);\r
131             ToolItem itemBack = new ToolItem(toolbar, SWT.PUSH);\r
132             itemBack.setText("Back");\r
133             itemBack.setImage(backImage);\r
134             ToolItem itemForward = new ToolItem(toolbar, SWT.PUSH);\r
135             itemForward.setText("Forward");\r
136             itemForward.setImage(forwardImage);\r
137             ToolItem itemStop = new ToolItem(toolbar, SWT.PUSH);\r
138             itemStop.setText("Stop");\r
139             itemStop.setImage(stopImage);\r
140             ToolItem itemRefresh = new ToolItem(toolbar, SWT.PUSH);\r
141             itemRefresh.setText("Refresh");\r
142             itemRefresh.setImage(refreshImage);\r
143             // ToolItem itemGo = new ToolItem(toolbar, SWT.PUSH);\r
144             // itemGo.setText("Go");\r
145 \r
146             GridData data = new GridData();\r
147             data.grabExcessHorizontalSpace = true;\r
148             data.grabExcessVerticalSpace = false;\r
149             data.horizontalAlignment = SWT.FILL;\r
150             data.verticalAlignment = SWT.CENTER;\r
151             data.horizontalSpan = 3;\r
152             toolbar.setLayoutData(data);\r
153 \r
154             Label labelAddress = new Label(composite, SWT.NONE);\r
155             labelAddress.setText("Address");\r
156 \r
157             final Text location = new Text(composite, SWT.BORDER);\r
158             data = new GridData();\r
159             data.horizontalAlignment = GridData.FILL;\r
160             data.horizontalSpan = 2;\r
161             data.grabExcessHorizontalSpace = true;\r
162             location.setLayoutData(data);\r
163 \r
164             browser = new org.eclipse.swt.browser.Browser(composite, input.getBrowserStyle());\r
165 \r
166             data = new GridData();\r
167             data.grabExcessHorizontalSpace = true;\r
168             data.grabExcessVerticalSpace = true;\r
169             data.horizontalAlignment = SWT.FILL;\r
170             data.verticalAlignment = SWT.FILL;\r
171             data.horizontalSpan = 3;\r
172             browser.setLayoutData(data);\r
173 \r
174             final Label statusl = new Label(composite, SWT.NONE);\r
175             data = new GridData(GridData.FILL_HORIZONTAL);\r
176             data.horizontalSpan = 2;\r
177             statusl.setLayoutData(data);\r
178 \r
179             final ProgressBar progressBar = new ProgressBar(composite, SWT.NONE);\r
180             data = new GridData();\r
181             data.horizontalAlignment = GridData.END;\r
182             progressBar.setLayoutData(data);\r
183 \r
184             browser.addProgressListener(new ProgressListener() {\r
185                 @Override\r
186                 public void changed(ProgressEvent event) {\r
187                     if (event.total == 0)\r
188                         return;\r
189                     int ratio = event.current * 100 / event.total;\r
190                     progressBar.setSelection(ratio);\r
191                 }\r
192 \r
193                 @Override\r
194                 public void completed(ProgressEvent event) {\r
195                     progressBar.setSelection(0);\r
196                 }\r
197             });\r
198             browser.addStatusTextListener(new StatusTextListener() {\r
199                 @Override\r
200                 public void changed(StatusTextEvent event) {\r
201                     statusl.setText(event.text);\r
202                 }\r
203             });\r
204             browser.addLocationListener(new LocationListener() {\r
205                 @Override\r
206                 public void changed(LocationEvent event) {\r
207                     if (event.top)\r
208                         location.setText(event.location);\r
209                     scheduleSetPartName();\r
210                 }\r
211 \r
212                 @Override\r
213                 public void changing(LocationEvent event) {\r
214                 }\r
215             });\r
216 \r
217             Listener listener = new Listener() {\r
218                 @Override\r
219                 public void handleEvent(Event event) {\r
220                     ToolItem item = (ToolItem) event.widget;\r
221                     String string = item.getText();\r
222                     if (string.equals("Back"))\r
223                         browser.back();\r
224                     else if (string.equals("Forward"))\r
225                         browser.forward();\r
226                     else if (string.equals("Stop"))\r
227                         browser.stop();\r
228                     else if (string.equals("Refresh"))\r
229                         browser.refresh();\r
230                     // else if (string.equals("Go"))\r
231                     // browser.setUrl(location.getText());\r
232                 }\r
233             };\r
234 \r
235             itemBack.addListener(SWT.Selection, listener);\r
236             itemForward.addListener(SWT.Selection, listener);\r
237             itemStop.addListener(SWT.Selection, listener);\r
238             itemRefresh.addListener(SWT.Selection, listener);\r
239         } else { // !showControls\r
240             browser = new org.eclipse.swt.browser.Browser(parent, input.getBrowserStyle());\r
241             browser.addLocationListener(new LocationListener() {\r
242                 @Override\r
243                 public void changed(LocationEvent event) {\r
244                     scheduleSetPartName();\r
245                 }\r
246                 @Override\r
247                 public void changing(LocationEvent event) {\r
248                 }\r
249             });\r
250         }\r
251 \r
252         browser.setUrl(url);\r
253 \r
254         if (fullscreen) {\r
255             fsShell.layout(true, true);\r
256         }\r
257     }\r
258 \r
259     protected void scheduleSetPartName() {\r
260         browser.getDisplay().asyncExec(new Runnable() {\r
261             @Override\r
262             public void run() {\r
263                 if (browser.isDisposed())\r
264                     return;\r
265                 String name = getEditorInput().getName();\r
266                 setPartName(name);\r
267             }\r
268         });\r
269     }\r
270 \r
271     @Override\r
272     public void setFocus() {\r
273         browser.setFocus();\r
274     }\r
275 \r
276     @Override\r
277     public void dispose() {\r
278         if (fsShell != null)\r
279             fsShell.dispose();\r
280         super.dispose();\r
281     }\r
282 \r
283     public org.eclipse.swt.browser.Browser getBrowser() {\r
284         return browser;\r
285     }\r
286 \r
287 }\r