/* ****************************************************************************** * 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 org.eclipse.core.runtime.SafeRunner; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; import org.xmind.ui.browser.BrowserSupport; import org.xmind.ui.browser.IBrowser; 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 InternalBrowserView extends ViewPart implements IBrowserViewerContainer { private class OpenInExternalAction extends Action { /** * */ public OpenInExternalAction() { super(BrowserMessages.BrowserView_OpenInExternalBrowser_text, BrowserImages.getImageDescriptor(BrowserImages.BROWSER)); setToolTipText( BrowserMessages.BrowserView_OpenInExternalBrowser_toolTip); } /* * (non-Javadoc) * * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { if (viewer == null || viewer.getControl() == null || viewer.getControl().isDisposed()) return; IBrowser browser = BrowserSupport.getInstance() .createBrowser(IBrowserSupport.AS_EXTERNAL); try { browser.openURL(viewer.getURL()); } catch (PartInitException e) { BrowserPlugin.log(e); } } } public static final String BROWSER_VIEW_ID = "org.xmind.ui.BrowserView"; //$NON-NLS-1$ private static final String GROUP_CONTROLS = "org.xmind.ui.browser.controls"; //$NON-NLS-1$ private static final String KEY_STYLE = "style"; //$NON-NLS-1$ private BrowserViewer viewer; private String clientId; private int style; private ActionContributionItem backActionItem = null; private ActionContributionItem forwardActionItem = null; private ActionContributionItem stopRefreshActionItem = null; public void setClientId(String clientId) { this.clientId = clientId; } public void changeStyle(int newStyle) { if ((newStyle & IBrowserSupport.NO_LOCATION_BAR) != 0 && (newStyle & IBrowserSupport.NO_EXTRA_CONTRIBUTIONS) != 0) { newStyle |= IBrowserSupport.NO_TOOLBAR; } this.style = newStyle; if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) { int oldStyle = viewer.getStyle(); viewer.changeStyle(newStyle); boolean hadNoToolBar = (oldStyle & IBrowserSupport.NO_TOOLBAR) != 0; boolean hasNoToolBar = (newStyle & IBrowserSupport.NO_TOOLBAR) != 0; if (hasNoToolBar && !hadNoToolBar) { IToolBarManager toolBar = getViewSite().getActionBars() .getToolBarManager(); removeControls(toolBar); toolBar.update(true); } else if (hadNoToolBar && !hasNoToolBar) { IToolBarManager toolBar = getViewSite().getActionBars() .getToolBarManager(); addControls(toolBar); toolBar.update(true); } } } private void removeControls(IToolBarManager toolBar) { if (backActionItem != null) { toolBar.remove(backActionItem); backActionItem.dispose(); backActionItem = null; } if (forwardActionItem != null) { toolBar.remove(forwardActionItem); forwardActionItem.dispose(); forwardActionItem = null; } if (stopRefreshActionItem != null) { toolBar.remove(stopRefreshActionItem); stopRefreshActionItem.dispose(); stopRefreshActionItem = null; } } private void addControls(IToolBarManager toolBar) { stopRefreshActionItem = new ActionContributionItem( viewer.getStopRefreshAction()); toolBar.prependToGroup(GROUP_CONTROLS, stopRefreshActionItem); forwardActionItem = new ActionContributionItem( viewer.getForwardAction()); toolBar.prependToGroup(GROUP_CONTROLS, forwardActionItem); backActionItem = new ActionContributionItem(viewer.getBackAction()); toolBar.prependToGroup(GROUP_CONTROLS, backActionItem); } @Override public void saveState(IMemento memento) { memento.putInteger(KEY_STYLE, style); super.saveState(memento); } @Override public void init(IViewSite site, IMemento memento) throws PartInitException { this.clientId = site.getSecondaryId(); Integer styleValue = memento == null ? null : memento.getInteger(KEY_STYLE); this.style = styleValue == null ? SWT.NONE : styleValue.intValue(); super.init(site, memento); } public void createPartControl(final Composite parent) { viewer = new BrowserViewer(parent, style, this); initActions(); final Image defaultImage = getTitleImage(); viewer.getBusyIndicator() .addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (!parent.isDisposed()) { parent.getDisplay().asyncExec(new Runnable() { public void run() { if (!parent.isDisposed() && defaultImage != null && !defaultImage.isDisposed()) { Image currentImage = viewer .getBusyIndicator() .getCurrentImage(); if (currentImage == null || !viewer.getBusyIndicator() .isAnimating()) { setTitleImage(defaultImage); } else { setTitleImage(currentImage); } } } }); } } }); } /** * */ private void initActions() { IActionBars actionBars = getViewSite().getActionBars(); OpenInExternalAction openInExternalAction = new OpenInExternalAction(); IMenuManager menu = actionBars.getMenuManager(); menu.add(new GroupMarker(GROUP_CONTROLS)); menu.add(openInExternalAction); menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); // IToolBarManager toolBar = actionBars.getToolBarManager(); // toolBar.add(new GroupMarker(GROUP_CONTROLS)); // toolBar.add(openInExternalAction); // toolBar.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); registerAction(actionBars, new CopyAction(viewer)); registerAction(actionBars, new CutAction(viewer)); registerAction(actionBars, new PasteAction(viewer)); registerAction(actionBars, new DeleteAction(viewer)); // if ((style & IBrowserSupport.NO_TOOLBAR) != 0) { // addControls(toolBar); // } } private void registerAction(IActionBars actionBars, IAction action) { actionBars.setGlobalActionHandler(action.getId(), action); } public void setFocus() { viewer.setFocus(); } public void openURL(String url) { if (viewer != null && !viewer.getControl().isDisposed()) { viewer.setURL(url); } } public BrowserViewer getViewer() { return viewer; } @SuppressWarnings("unchecked") public Object getAdapter(Class adapter) { if (adapter == IBrowserViewer.class) return viewer; if (adapter == IBrowserViewerContainer.class) return this; return super.getAdapter(adapter); } public boolean close() { try { getSite().getPage().hideView(this); return true; } catch (Exception e) { return false; } } public IActionBars getActionBars() { return getViewSite().getActionBars(); } public String getClientId() { return clientId; } public void openInExternalBrowser(String url) { BrowserUtil.gotoUrl(url); } /* * (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 { IBrowser browser = BrowserSupport.getInstance().createBrowser( IBrowserSupport.AS_EDITOR, getClientId()); browser.openURL(""); //$NON-NLS-1$ if (browser instanceof InternalBrowser) { IWorkbenchPart part = ((InternalBrowser) browser).getPart(); if (part instanceof InternalBrowserEditor) { ret[0] = ((InternalBrowserEditor) part).getViewer() .getBrowser(); } } } }); return ret[0]; } }