/*=============================================================================# # Copyright (c) 2010-2016 Stephan Wahlbrink (WalWare.de) and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # # Contributors: # Stephan Wahlbrink - initial API and implementation #=============================================================================*/ package de.walware.statet.r.internal.ui.rhelp; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.services.IServiceLocator; import de.walware.ecommons.ui.actions.SimpleContributionItem; import de.walware.ecommons.ui.breadcrumb.AbstractBreadcrumb; import de.walware.ecommons.ui.breadcrumb.BreadcrumbViewer; import de.walware.statet.r.core.RCore; import de.walware.statet.r.core.renv.IREnv; import de.walware.statet.r.core.rhelp.IREnvHelp; import de.walware.statet.r.core.rhelp.IRHelpManager; import de.walware.statet.r.core.rhelp.IRHelpPage; import de.walware.statet.r.core.rhelp.IRPkgHelp; public class RHelpBreadcrumb extends AbstractBreadcrumb { private class RHelpBreadcrumbViewer extends BreadcrumbViewer { public RHelpBreadcrumbViewer(final Composite parent) { super(parent, SWT.HORIZONTAL); } @Override protected void configureDropDownViewer(final TreeViewer viewer, final Object input) { viewer.setContentProvider(new RHelpContentProvider()); viewer.setLabelProvider(new RHelpLabelProvider()); } @Override public void fillDropDownContextMenu(final IMenuManager manager, final Object selection) { if (selection instanceof IREnv) { final IREnv rEnv = (IREnv) selection; manager.add(new SimpleContributionItem( NLS.bind("Show overview of ''{0}''", rEnv.getName()), "o") { @Override protected void execute() throws ExecutionException { RHelpBreadcrumb.this.reveal(selection); setFocusToInput(); } }); manager.add(new SimpleContributionItem( NLS.bind("Show current page in ''{0}''", rEnv.getName()), "p") { @Override protected void execute() throws ExecutionException { switchTo((IREnv) selection); } }); } } } private class RHelpContentProvider implements ITreeContentProvider { @Override public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { } @Override public void dispose() { } @Override public Object[] getElements(final Object inputElement) { return getChildren(inputElement); } @Override public Object getParent(final Object element) { if (element instanceof IREnv || element instanceof String) { return fHelpManager; } if (element instanceof IRPkgHelp) { return ((IRPkgHelp) element).getREnv(); } if (element instanceof IRHelpPage) { return ((IRHelpPage) element).getPackage(); } if (element instanceof Object[]) { return ((Object[]) element)[0]; } return null; } @Override public boolean hasChildren(final Object element) { if (element instanceof IRHelpManager) { return true; } if (element instanceof IREnv) { return fHelpManager.hasHelp((IREnv) element); } if (element instanceof IRPkgHelp) { return !((IRPkgHelp) element).getHelpPages().isEmpty(); } return false; } @Override public Object[] getChildren(final Object element) { if (element instanceof IRHelpManager) { return fHelpManager.getREnvWithHelp().toArray(); } if (element instanceof IREnv) { final IREnvHelp help = fHelpManager.getHelp((IREnv) element); if (help != null) { try { return help.getPkgs().toArray(); } finally { help.unlock(); } } return new Object[0]; } if (element instanceof IRPkgHelp) { return ((IRPkgHelp) element).getHelpPages().toArray(); } return new Object[0]; } } private final IRHelpManager fHelpManager = RCore.getRHelpManager(); private final RHelpViewPage fPage; private RHelpLabelProvider fLabelProvider; public RHelpBreadcrumb(final RHelpViewPage page) { fPage = page; } @Override public void setInput(Object element) { if (element == null) { element = fHelpManager; } if (fLabelProvider != null) { // fLabelProvider.setFocusObject(element); } super.setInput(element); } @Override protected BreadcrumbViewer createViewer(final Composite parent) { final RHelpBreadcrumbViewer viewer = new RHelpBreadcrumbViewer(parent); fLabelProvider = new RHelpLabelProvider(0); viewer.setLabelProvider(fLabelProvider); viewer.setToolTipLabelProvider(new RHelpLabelProvider(RHelpLabelProvider.TOOLTIP)); viewer.setContentProvider(new RHelpContentProvider()); return viewer; } @Override protected boolean hasInputFocus() { return fPage.isBrowserFocusControl(); } @Override protected void setFocusToInput() { fPage.setFocusToBrowser(); } @Override protected IServiceLocator getParentServiceLocator() { return fPage.getSite(); } @Override protected boolean reveal(final Object element) { final String url = fHelpManager.toHttpUrl(element, RHelpUIServlet.BROWSE_TARGET); if (url != null) { fPage.setUrl(url); return true; } return false; } protected void switchTo(final IREnv rEnv) { final String url = fHelpManager.toHttpUrl(fPage.getCurrentUrl(), rEnv, RHelpUIServlet.BROWSE_TARGET); if (url != null) { setFocusToInput(); fPage.setUrl(url); } } @Override protected boolean open(final Object element) { return false; } }