/* * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and above are dual-licensed * under the Eclipse Public License (EPL), which is available at * http://www.eclipse.org/legal/epl-v10.html and the GNU Lesser General Public * License (LGPL), which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: XMind Ltd. - initial API and implementation */ package org.xmind.ui.internal.browser; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.jface.action.IAction; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; import org.xmind.ui.browser.IBrowserSupport; import org.xmind.ui.browser.IBrowserViewer; import org.xmind.ui.browser.IBrowserViewerContainer; import org.xmind.ui.internal.browser.actions.CopyAction; import org.xmind.ui.internal.browser.actions.CutAction; import org.xmind.ui.internal.browser.actions.DeleteAction; import org.xmind.ui.internal.browser.actions.PasteAction; public class InternalBrowserEditor extends EditorPart implements IBrowserViewerContainer { public static final String BROWSER_EDITOR_ID = "org.xmind.ui.browser.editor"; //$NON-NLS-1$ private BrowserViewer viewer; private String initialURL; private Image image; private Map<String, IAction> actions; private boolean disposed; private boolean lockName; public String getClientId() { return getBrowserEditorInput().getClientId(); } public IAction getAction(String id) { return actions == null ? null : actions.get(id); } public void doSave(IProgressMonitor monitor) { } public void doSaveAs() { } public void init(IEditorSite site, IEditorInput input) throws PartInitException { if (input instanceof BrowserEditorInput) { BrowserEditorInput bei = (BrowserEditorInput) input; initialURL = null; if (bei.getURL() != null) initialURL = bei.getURL(); if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) { viewer.setURL(initialURL); // int style = bei.getStyle(); // if ((style & IBrowserSupport.NO_LOCATION_BAR) != 0 && (style // & IBrowserSupport.NO_EXTRA_CONTRIBUTIONS) != 0) { // style |= IBrowserSupport.NO_TOOLBAR; // } // viewer.changeStyle(style); // site.getWorkbenchWindow().getActivePage().activate(this); // if (initialURL != null // && ((style & IBrowserSupport.NO_TOOLBAR) == 0 && (style // & IBrowserSupport.NO_LOCATION_BAR) == 0)) { // setContentDescription(initialURL); // } else { // setContentDescription(""); //$NON-NLS-1$ // } } setPartName(bei.getName()); setTitleToolTip(bei.getToolTipText()); lockName = bei.isNameLocked(); Image oldImage = image; ImageDescriptor id = bei.getImageDescriptor(); image = id.createImage(); setTitleImage(image); if (oldImage != null && !oldImage.isDisposed()) oldImage.dispose(); } else throw new PartInitException(NLS.bind( BrowserMessages.BrowserEditor_ErrorInvalidEditorInput_message, input.getName())); setSite(site); setInput(input); } public boolean isDirty() { return false; } public boolean isSaveAsAllowed() { return false; } public void dispose() { if (image != null && !image.isDisposed()) image.dispose(); image = null; super.dispose(); disposed = true; } public boolean isDisposed() { return disposed; } public void createPartControl(final Composite parent) { int style = getBrowserEditorInput().getStyle(); viewer = new BrowserViewer(parent, style, this); viewer.setURL(initialURL); addAction(new CopyAction(viewer)); addAction(new CutAction(viewer)); addAction(new PasteAction(viewer)); addAction(new DeleteAction(viewer)); PropertyChangeListener propertyChangeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (lockName) return; if (IBrowserViewer.PROPERTY_TITLE .equals(event.getPropertyName())) { if (event.getNewValue() != null) setPartName((String) event.getNewValue()); } else if (IBrowserViewer.PROPERTY_LOCATION .equals(event.getPropertyName())) { String location = (String) event.getNewValue(); int currentStyle = getBrowserEditorInput().getStyle(); if (location == null || ((currentStyle & IBrowserSupport.NO_TOOLBAR) == 0 && (currentStyle & IBrowserSupport.NO_LOCATION_BAR) == 0)) { location = ""; //$NON-NLS-1$ } Label descriptionLabel = viewer.getDescriptionLabel(); if (descriptionLabel != null && !descriptionLabel.isDisposed()) { descriptionLabel.setText(location); descriptionLabel.setToolTipText(location); } } } }; viewer.addPropertyChangeListener(propertyChangeListener); viewer.getBusyIndicator() .addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (!parent.isDisposed()) { parent.getDisplay().asyncExec(new Runnable() { public void run() { if (!parent.isDisposed() && image != null && !image.isDisposed()) { Image currentImage = viewer .getBusyIndicator() .getCurrentImage(); if (currentImage == null || !viewer.getBusyIndicator() .isAnimating()) { setTitleImage(image); } else { setTitleImage(currentImage); } } } }); } } }); } private void addAction(IAction action) { String actionId = action.getId(); if (actionId == null) return; if (actions == null) actions = new HashMap<String, IAction>(); actions.put(actionId, action); } /** * Returns the web editor input, if available. If the input was of another * type, <code>null</code> is returned. * * @return org.eclipse.ui.internal.browser.IWebBrowserEditorInput */ protected BrowserEditorInput getBrowserEditorInput() { return (BrowserEditorInput) getEditorInput(); } /** * Open the input in the internal Web browser. */ public static void open(BrowserEditorInput input) { IWorkbenchWindow workbenchWindow = BrowserPlugin.getDefault() .getWorkbench().getActiveWorkbenchWindow(); IWorkbenchPage page = workbenchWindow.getActivePage(); try { IEditorReference[] editors = page.getEditorReferences(); int size = editors.length; for (int i = 0; i < size; i++) { if (BROWSER_EDITOR_ID.equals(editors[i].getId())) { IEditorPart editor = editors[i].getEditor(true); if (editor != null && editor instanceof InternalBrowserEditor) { InternalBrowserEditor editor2 = (InternalBrowserEditor) editor; BrowserEditorInput input2 = editor2 .getBrowserEditorInput(); if (input2 == null || input.canReplaceInput(input2)) { editor.init(editor.getEditorSite(), input); return; } } } } page.openEditor(input, InternalBrowserEditor.BROWSER_EDITOR_ID); } catch (Exception e) { } } public void setFocus() { if (viewer != null) viewer.setFocus(); } public BrowserViewer getViewer() { return viewer; } public boolean close() { final boolean[] result = new boolean[1]; Display.getDefault().asyncExec(new Runnable() { public void run() { result[0] = getEditorSite().getPage() .closeEditor(InternalBrowserEditor.this, false); } }); return result[0]; } public IActionBars getActionBars() { return getEditorSite().getActionBars(); } public void openInExternalBrowser(String url) { BrowserUtil.gotoUrl(url); } public void setText(String html) { if (viewer != null && !viewer.getControl().isDisposed()) { viewer.setText(html); } } /* * (non-Javadoc) * * @see org.xmind.ui.browser.IBrowserViewerContainer#openNewBrowser() */ public Browser openNewBrowser() { final Browser[] ret = new Browser[1]; SafeRunner.run(new SafeRunnable() { public void run() throws Exception { final BrowserEditorInput input = new BrowserEditorInput("", //$NON-NLS-1$ getNewSecondaryId(), getBrowserEditorInput().getStyle()); IEditorPart editor = getSite().getPage().openEditor(input, BROWSER_EDITOR_ID); if (editor instanceof InternalBrowserEditor) { ret[0] = ((InternalBrowserEditor) editor).getViewer() .getBrowser(); } } }); return ret[0]; } private static Map<String, Integer> numbers = new HashMap<String, Integer>(); private String getNewSecondaryId() { Integer num = numbers.get(getClientId()); if (num == null) { num = Integer.valueOf(1); } else { num = Integer.valueOf(num.intValue() + 1); } numbers.put(getClientId(), num); return getClientId() + "-" + num.toString(); //$NON-NLS-1$ } }