Statistiques
| Révision :

root / tmp / org.txm.libs.javafx / swt / TXMJFXBrowserEditor.java @ 3182

Historique | Voir | Annoter | Télécharger (10,72 ko)

1 3108 mdecorde
/*******************************************************************************
2 3108 mdecorde
 * Copyright (c) 2003, 2016 IBM Corporation and others.
3 3108 mdecorde
 * All rights reserved. This program and the accompanying materials
4 3108 mdecorde
 * are made available under the terms of the Eclipse Public License v1.0
5 3108 mdecorde
 * which accompanies this distribution, and is available at
6 3108 mdecorde
 * http://www.eclipse.org/legal/epl-v10.html
7 3108 mdecorde
 *
8 3108 mdecorde
 * Contributors:
9 3108 mdecorde
 *     IBM Corporation - Initial API and implementation
10 3108 mdecorde
 *
11 3108 mdecorde
 *
12 3108 mdecorde
 *******************************************************************************/
13 3108 mdecorde
package snippet;
14 3108 mdecorde
15 3108 mdecorde
import java.beans.PropertyChangeListener;
16 3108 mdecorde
import java.net.MalformedURLException;
17 3108 mdecorde
import java.net.URL;
18 3108 mdecorde
19 3108 mdecorde
import org.eclipse.core.runtime.Adapters;
20 3108 mdecorde
import org.eclipse.core.runtime.IPath;
21 3108 mdecorde
import org.eclipse.core.runtime.IProgressMonitor;
22 3108 mdecorde
import org.eclipse.jface.action.IAction;
23 3108 mdecorde
import org.eclipse.jface.resource.ImageDescriptor;
24 3108 mdecorde
import org.eclipse.osgi.util.NLS;
25 3108 mdecorde
import org.eclipse.swt.graphics.Image;
26 3108 mdecorde
import org.eclipse.swt.widgets.Composite;
27 3108 mdecorde
import org.eclipse.swt.widgets.Display;
28 3108 mdecorde
import org.eclipse.ui.IActionBars;
29 3108 mdecorde
import org.eclipse.ui.IEditorDescriptor;
30 3108 mdecorde
import org.eclipse.ui.IEditorInput;
31 3108 mdecorde
import org.eclipse.ui.IEditorPart;
32 3108 mdecorde
import org.eclipse.ui.IEditorReference;
33 3108 mdecorde
import org.eclipse.ui.IEditorRegistry;
34 3108 mdecorde
import org.eclipse.ui.IEditorSite;
35 3108 mdecorde
import org.eclipse.ui.IPathEditorInput;
36 3108 mdecorde
import org.eclipse.ui.IWorkbenchPage;
37 3108 mdecorde
import org.eclipse.ui.IWorkbenchWindow;
38 3108 mdecorde
import org.eclipse.ui.PartInitException;
39 3108 mdecorde
import org.eclipse.ui.PlatformUI;
40 3108 mdecorde
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
41 3108 mdecorde
import org.eclipse.ui.internal.browser.BrowserViewer;
42 3108 mdecorde
import org.eclipse.ui.internal.browser.IBrowserViewerContainer;
43 3108 mdecorde
import org.eclipse.ui.internal.browser.ImageResource;
44 3108 mdecorde
import org.eclipse.ui.internal.browser.TextAction;
45 3108 mdecorde
import org.eclipse.ui.internal.browser.Trace;
46 3108 mdecorde
import org.eclipse.ui.internal.browser.WebBrowserEditorInput;
47 3108 mdecorde
import org.eclipse.ui.internal.browser.WebBrowserUIPlugin;
48 3108 mdecorde
import org.eclipse.ui.part.EditorPart;
49 3108 mdecorde
50 3108 mdecorde
/**
51 3108 mdecorde
 * An integrated JFX Web browser (webkit), defined as an editor to make better use of the desktop.
52 3108 mdecorde
 *
53 3108 mdecorde
 * TODO the JFXBrowser has to implements lots of event trigger to be fully functionnal
54 3108 mdecorde
 */
55 3108 mdecorde
public class TXMJFXBrowserEditor extends EditorPart implements IBrowserViewerContainer {
56 3108 mdecorde
57 3108 mdecorde
        protected static final String PROPERTY_TITLE = "title"; //$NON-NLS-1$
58 3108 mdecorde
59 3108 mdecorde
        public static final String WEB_BROWSER_EDITOR_ID = "org.txm.rcp.editors.TXMJFXBrowserEditor"; //$NON-NLS-1$
60 3108 mdecorde
61 3108 mdecorde
        protected JFXBrowserViewer webBrowser;
62 3108 mdecorde
63 3108 mdecorde
        protected String initialURL;
64 3108 mdecorde
65 3108 mdecorde
        protected Image image;
66 3108 mdecorde
67 3108 mdecorde
        protected TextAction cutAction;
68 3108 mdecorde
69 3108 mdecorde
        protected TextAction copyAction;
70 3108 mdecorde
71 3108 mdecorde
        protected TextAction pasteAction;
72 3108 mdecorde
73 3108 mdecorde
        private boolean disposed;
74 3108 mdecorde
75 3108 mdecorde
        private boolean lockName;
76 3108 mdecorde
77 3108 mdecorde
        /**
78 3108 mdecorde
         * WebBrowserEditor constructor comment.
79 3108 mdecorde
         */
80 3108 mdecorde
        public TXMJFXBrowserEditor() {
81 3108 mdecorde
                super();
82 3108 mdecorde
        }
83 3108 mdecorde
84 3108 mdecorde
        @Override
85 3108 mdecorde
        public void createPartControl(Composite parent) {
86 3108 mdecorde
                WebBrowserEditorInput input = getWebBrowserEditorInput();
87 3108 mdecorde
88 3108 mdecorde
                int style = 0;
89 3108 mdecorde
                if (input == null || input.isLocationBarLocal()) {
90 3108 mdecorde
                        style += BrowserViewer.LOCATION_BAR;
91 3108 mdecorde
                }
92 3108 mdecorde
                if (input == null || input.isToolbarLocal()) {
93 3108 mdecorde
                        style += BrowserViewer.BUTTON_BAR;
94 3108 mdecorde
                }
95 3108 mdecorde
                webBrowser = new JFXBrowserViewer(parent, style);
96 3108 mdecorde
97 3108 mdecorde
                webBrowser.setURL(initialURL);
98 3108 mdecorde
                webBrowser.setContainer(this);
99 3108 mdecorde
100 3108 mdecorde
                if (input == null || input.isLocationBarLocal()) {
101 3108 mdecorde
                        // cutAction = new TextAction(webBrowser, TextAction.CUT);
102 3108 mdecorde
                        // copyAction = new TextAction(webBrowser, TextAction.COPY);
103 3108 mdecorde
                        // pasteAction = new TextAction(webBrowser, TextAction.PASTE);
104 3108 mdecorde
                }
105 3108 mdecorde
106 3108 mdecorde
                if (!lockName) {
107 3108 mdecorde
                        PropertyChangeListener propertyChangeListener = event -> {
108 3108 mdecorde
                                if (PROPERTY_TITLE.equals(event.getPropertyName())) {
109 3108 mdecorde
                                        setPartName((String) event.getNewValue());
110 3108 mdecorde
                                }
111 3108 mdecorde
                        };
112 3108 mdecorde
                        webBrowser.addPropertyChangeListener(propertyChangeListener);
113 3108 mdecorde
                }
114 3108 mdecorde
        }
115 3108 mdecorde
116 3108 mdecorde
        @Override
117 3108 mdecorde
        public void setPartName(String partName) {
118 3108 mdecorde
                super.setPartName(partName);
119 3108 mdecorde
        }
120 3108 mdecorde
121 3108 mdecorde
        @Override
122 3108 mdecorde
        public void setTitleImage(Image titleImage) {
123 3108 mdecorde
                super.setTitleImage(titleImage);
124 3108 mdecorde
        }
125 3108 mdecorde
126 3108 mdecorde
        @Override
127 3108 mdecorde
        public void dispose() {
128 3108 mdecorde
                if (image != null && !image.isDisposed())
129 3108 mdecorde
                        image.dispose();
130 3108 mdecorde
                image = null;
131 3108 mdecorde
132 3108 mdecorde
                super.dispose();
133 3108 mdecorde
                // mark this instance as disposed to avoid stale references
134 3108 mdecorde
                disposed = true;
135 3108 mdecorde
        }
136 3108 mdecorde
137 3108 mdecorde
        public boolean isDisposed() {
138 3108 mdecorde
                return disposed;
139 3108 mdecorde
        }
140 3108 mdecorde
141 3108 mdecorde
        @Override
142 3108 mdecorde
        public void doSave(IProgressMonitor monitor) {
143 3108 mdecorde
                // do nothing
144 3108 mdecorde
        }
145 3108 mdecorde
146 3108 mdecorde
        @Override
147 3108 mdecorde
        public void doSaveAs() {
148 3108 mdecorde
                // do nothing
149 3108 mdecorde
        }
150 3108 mdecorde
151 3108 mdecorde
        /**
152 3108 mdecorde
         * Returns the copy action.
153 3108 mdecorde
         *
154 3108 mdecorde
         * @return org.eclipse.jface.action.IAction
155 3108 mdecorde
         */
156 3108 mdecorde
        public IAction getCopyAction() {
157 3108 mdecorde
                return copyAction;
158 3108 mdecorde
        }
159 3108 mdecorde
160 3108 mdecorde
        /**
161 3108 mdecorde
         * Returns the cut action.
162 3108 mdecorde
         *
163 3108 mdecorde
         * @return org.eclipse.jface.action.IAction
164 3108 mdecorde
         */
165 3108 mdecorde
        public IAction getCutAction() {
166 3108 mdecorde
                return cutAction;
167 3108 mdecorde
        }
168 3108 mdecorde
169 3108 mdecorde
        /**
170 3108 mdecorde
         * Returns the web editor input, if available. If the input was of
171 3108 mdecorde
         * another type, <code>null</code> is returned.
172 3108 mdecorde
         *
173 3108 mdecorde
         * @return org.eclipse.ui.internal.browser.IWebBrowserEditorInput
174 3108 mdecorde
         */
175 3108 mdecorde
        protected WebBrowserEditorInput getWebBrowserEditorInput() {
176 3108 mdecorde
                IEditorInput input = getEditorInput();
177 3108 mdecorde
                if (input instanceof WebBrowserEditorInput)
178 3108 mdecorde
                        return (WebBrowserEditorInput) input;
179 3108 mdecorde
                return null;
180 3108 mdecorde
        }
181 3108 mdecorde
182 3108 mdecorde
        /**
183 3108 mdecorde
         * Returns the paste action.
184 3108 mdecorde
         *
185 3108 mdecorde
         * @return org.eclipse.jface.action.IAction
186 3108 mdecorde
         */
187 3108 mdecorde
        public IAction getPasteAction() {
188 3108 mdecorde
                return pasteAction;
189 3108 mdecorde
        }
190 3108 mdecorde
191 3108 mdecorde
        @Override
192 3108 mdecorde
        public void init(IEditorSite site, IEditorInput input) throws PartInitException {
193 3108 mdecorde
                Trace.trace(Trace.FINEST, "Opening browser: " + input); //$NON-NLS-1$
194 3108 mdecorde
                if (input instanceof IPathEditorInput) {
195 3108 mdecorde
                        IPathEditorInput pei = (IPathEditorInput) input;
196 3108 mdecorde
                        final IPath path = pei.getPath();
197 3108 mdecorde
                        URL url = null;
198 3108 mdecorde
                        try {
199 3108 mdecorde
                                if (path != null) {
200 3108 mdecorde
                                        setPartName(path.lastSegment());
201 3108 mdecorde
                                        url = path.toFile().toURI().toURL();
202 3108 mdecorde
                                }
203 3108 mdecorde
                                if (url != null)
204 3108 mdecorde
                                        initialURL = url.toExternalForm();
205 3108 mdecorde
                        }
206 3108 mdecorde
                        catch (Exception e) {
207 3108 mdecorde
                                Trace.trace(Trace.SEVERE, "Error getting URL to file"); //$NON-NLS-1$
208 3108 mdecorde
                        }
209 3108 mdecorde
                        if (webBrowser != null) {
210 3108 mdecorde
                                if (initialURL != null)
211 3108 mdecorde
                                        webBrowser.setURL(initialURL);
212 3108 mdecorde
                                site.getWorkbenchWindow().getActivePage().activate(this);
213 3108 mdecorde
                        }
214 3108 mdecorde
215 3108 mdecorde
                        if (url != null)
216 3108 mdecorde
                                setTitleToolTip(url.getFile());
217 3108 mdecorde
218 3108 mdecorde
                        Image oldImage = image;
219 3108 mdecorde
                        ImageDescriptor id = ImageResource.getImageDescriptor(ImageResource.IMG_INTERNAL_BROWSER);
220 3108 mdecorde
                        image = id.createImage();
221 3108 mdecorde
222 3108 mdecorde
                        setTitleImage(image);
223 3108 mdecorde
                        if (oldImage != null && !oldImage.isDisposed())
224 3108 mdecorde
                                oldImage.dispose();
225 3108 mdecorde
                        // addResourceListener(file);
226 3108 mdecorde
                }
227 3108 mdecorde
                else if (input instanceof WebBrowserEditorInput) {
228 3108 mdecorde
                        WebBrowserEditorInput wbei = (WebBrowserEditorInput) input;
229 3108 mdecorde
                        initialURL = null;
230 3108 mdecorde
                        if (wbei.getURL() != null)
231 3108 mdecorde
                                initialURL = wbei.getURL().toExternalForm();
232 3108 mdecorde
                        if (webBrowser != null) {
233 3108 mdecorde
                                webBrowser.setURL(initialURL);
234 3108 mdecorde
                                site.getWorkbenchWindow().getActivePage().activate(this);
235 3108 mdecorde
                        }
236 3108 mdecorde
237 3108 mdecorde
                        setPartName(wbei.getName());
238 3108 mdecorde
                        setTitleToolTip(wbei.getToolTipText());
239 3108 mdecorde
                        lockName = false;
240 3108 mdecorde
241 3108 mdecorde
                        Image oldImage = image;
242 3108 mdecorde
                        ImageDescriptor id = wbei.getImageDescriptor();
243 3108 mdecorde
                        image = id.createImage();
244 3108 mdecorde
245 3108 mdecorde
                        setTitleImage(image);
246 3108 mdecorde
                        if (oldImage != null && !oldImage.isDisposed())
247 3108 mdecorde
                                oldImage.dispose();
248 3108 mdecorde
                }
249 3108 mdecorde
                else {
250 3108 mdecorde
                        IPathEditorInput pinput = Adapters.adapt(input, IPathEditorInput.class);
251 3108 mdecorde
                        if (pinput != null) {
252 3108 mdecorde
                                init(site, pinput);
253 3108 mdecorde
                        }
254 3108 mdecorde
                        else {
255 3108 mdecorde
                                throw new PartInitException(NLS.bind(org.eclipse.ui.internal.browser.Messages.errorInvalidEditorInput, input.getName()));
256 3108 mdecorde
                        }
257 3108 mdecorde
                }
258 3108 mdecorde
259 3108 mdecorde
                setSite(site);
260 3108 mdecorde
                setInput(input);
261 3108 mdecorde
        }
262 3108 mdecorde
263 3108 mdecorde
        @Override
264 3108 mdecorde
        public boolean isDirty() {
265 3108 mdecorde
                return false;
266 3108 mdecorde
        }
267 3108 mdecorde
268 3108 mdecorde
        @Override
269 3108 mdecorde
        public boolean isSaveAsAllowed() {
270 3108 mdecorde
                return false;
271 3108 mdecorde
        }
272 3108 mdecorde
273 3108 mdecorde
        /**
274 3108 mdecorde
         * Open the input in the internal Web browser.
275 3108 mdecorde
         */
276 3108 mdecorde
        public static void open(WebBrowserEditorInput input) {
277 3108 mdecorde
                IWorkbenchWindow workbenchWindow = WebBrowserUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow();
278 3108 mdecorde
                IWorkbenchPage page = workbenchWindow.getActivePage();
279 3108 mdecorde
280 3108 mdecorde
                try {
281 3108 mdecorde
                        IEditorReference[] editors = page.getEditorReferences();
282 3108 mdecorde
                        int size = editors.length;
283 3108 mdecorde
                        for (int i = 0; i < size; i++) {
284 3108 mdecorde
                                if (WEB_BROWSER_EDITOR_ID.equals(editors[i].getId())) {
285 3108 mdecorde
                                        IEditorPart editor = editors[i].getEditor(true);
286 3108 mdecorde
                                        if (editor != null && editor instanceof TXMJFXBrowserEditor) {
287 3108 mdecorde
                                                TXMJFXBrowserEditor webEditor = (TXMJFXBrowserEditor) editor;
288 3108 mdecorde
                                                WebBrowserEditorInput input2 = webEditor.getWebBrowserEditorInput();
289 3108 mdecorde
                                                if (input2 == null || input.canReplaceInput(input2)) {
290 3108 mdecorde
                                                        editor.init(editor.getEditorSite(), input);
291 3108 mdecorde
                                                        return;
292 3108 mdecorde
                                                }
293 3108 mdecorde
                                        }
294 3108 mdecorde
                                }
295 3108 mdecorde
                        }
296 3108 mdecorde
297 3108 mdecorde
                        page.openEditor(input, TXMJFXBrowserEditor.WEB_BROWSER_EDITOR_ID);
298 3108 mdecorde
                }
299 3108 mdecorde
                catch (Exception e) {
300 3108 mdecorde
                        Trace.trace(Trace.SEVERE, "Error opening Web browser", e); //$NON-NLS-1$
301 3108 mdecorde
                }
302 3108 mdecorde
        }
303 3108 mdecorde
304 3108 mdecorde
        /*
305 3108 mdecorde
         * Asks this part to take focus within the workbench.
306 3108 mdecorde
         */
307 3108 mdecorde
        @Override
308 3108 mdecorde
        public void setFocus() {
309 3108 mdecorde
                if (webBrowser != null)
310 3108 mdecorde
                        webBrowser.setFocus();
311 3108 mdecorde
        }
312 3108 mdecorde
313 3108 mdecorde
        /**
314 3108 mdecorde
         * Close the editor correctly.
315 3108 mdecorde
         */
316 3108 mdecorde
        @Override
317 3108 mdecorde
        public boolean close() {
318 3108 mdecorde
                final boolean[] result = new boolean[1];
319 3108 mdecorde
                Display.getDefault()
320 3108 mdecorde
                                .asyncExec(() -> result[0] = getEditorSite().getPage().closeEditor(TXMJFXBrowserEditor.this, false));
321 3108 mdecorde
                return result[0];
322 3108 mdecorde
        }
323 3108 mdecorde
324 3108 mdecorde
        @Override
325 3108 mdecorde
        public IActionBars getActionBars() {
326 3108 mdecorde
                return getEditorSite().getActionBars();
327 3108 mdecorde
        }
328 3108 mdecorde
329 3108 mdecorde
        @Override
330 3108 mdecorde
        public void openInExternalBrowser(String url) {
331 3108 mdecorde
                final IEditorInput input = getEditorInput();
332 3108 mdecorde
                final String id = getEditorSite().getId();
333 3108 mdecorde
                Runnable runnable = () -> doOpenExternalEditor(id, input);
334 3108 mdecorde
                Display display = getSite().getShell().getDisplay();
335 3108 mdecorde
                close();
336 3108 mdecorde
                display.asyncExec(runnable);
337 3108 mdecorde
        }
338 3108 mdecorde
339 3108 mdecorde
        protected void doOpenExternalEditor(String id, IEditorInput input) {
340 3108 mdecorde
                IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
341 3108 mdecorde
                String name = input.getName();
342 3108 mdecorde
                IEditorDescriptor[] editors = registry.getEditors(name);
343 3108 mdecorde
                IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
344 3108 mdecorde
345 3108 mdecorde
                String editorId = null;
346 3108 mdecorde
                for (IEditorDescriptor editor : editors) {
347 3108 mdecorde
                        if (editor.getId().equals(id))
348 3108 mdecorde
                                continue;
349 3108 mdecorde
                        editorId = editor.getId();
350 3108 mdecorde
                        break;
351 3108 mdecorde
                }
352 3108 mdecorde
353 3108 mdecorde
                IEditorDescriptor ddesc = registry.getDefaultEditor(name);
354 3108 mdecorde
                if (ddesc != null && ddesc.getId().equals(id)) {
355 3108 mdecorde
                        int dot = name.lastIndexOf('.');
356 3108 mdecorde
                        String ext = name;
357 3108 mdecorde
                        if (dot != -1)
358 3108 mdecorde
                                ext = "*." + name.substring(dot + 1); //$NON-NLS-1$
359 3108 mdecorde
                        registry.setDefaultEditor(ext, null);
360 3108 mdecorde
                }
361 3108 mdecorde
362 3108 mdecorde
                if (editorId == null) {
363 3108 mdecorde
                        // no editor
364 3108 mdecorde
                        // next check with the OS for an external editor
365 3108 mdecorde
                        if (registry.isSystemExternalEditorAvailable(name))
366 3108 mdecorde
                                editorId = IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID;
367 3108 mdecorde
                }
368 3108 mdecorde
369 3108 mdecorde
                if (editorId != null) {
370 3108 mdecorde
                        try {
371 3108 mdecorde
                                page.openEditor(input, editorId);
372 3108 mdecorde
                                return;
373 3108 mdecorde
                        }
374 3108 mdecorde
                        catch (PartInitException e) {
375 3108 mdecorde
                                // ignore
376 3108 mdecorde
                        }
377 3108 mdecorde
                }
378 3108 mdecorde
379 3108 mdecorde
                // no registered editor - open using browser support
380 3108 mdecorde
                try {
381 3108 mdecorde
                        URL theURL = new URL(webBrowser.getURL());
382 3108 mdecorde
                        IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
383 3108 mdecorde
                        support.getExternalBrowser().openURL(theURL);
384 3108 mdecorde
                }
385 3108 mdecorde
                catch (MalformedURLException e) {
386 3108 mdecorde
                        // TODO handle this
387 3108 mdecorde
                }
388 3108 mdecorde
                catch (PartInitException e) {
389 3108 mdecorde
                        // TODO handle this
390 3108 mdecorde
                }
391 3108 mdecorde
        }
392 3108 mdecorde
}