/*=============================================================================#
# Copyright (c) 2007-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.editors;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.services.IServiceLocator;
import de.walware.ecommons.ltk.core.model.IModelElement;
import de.walware.ecommons.ltk.ui.ElementNameComparator;
import de.walware.ecommons.ltk.ui.sourceediting.SourceEditor2OutlinePage;
import de.walware.ecommons.ui.SharedMessages;
import de.walware.ecommons.ui.SharedUIResources;
import de.walware.ecommons.ui.actions.HandlerCollection;
import de.walware.ecommons.ui.util.DialogUtil;
import de.walware.ecommons.ui.util.UIAccess;
import de.walware.statet.base.ui.IStatetUIMenuIds;
import de.walware.statet.r.core.model.IRElement;
import de.walware.statet.r.core.model.RElementName;
import de.walware.statet.r.core.model.RModel;
import de.walware.statet.r.core.refactoring.RRefactoring;
import de.walware.statet.r.internal.ui.RUIMessages;
import de.walware.statet.r.internal.ui.RUIPlugin;
import de.walware.statet.r.launching.RCodeLaunching;
import de.walware.statet.r.ui.RLabelProvider;
import de.walware.statet.r.ui.RUI;
/**
* Outline page for R sources
*/
public class ROutlinePage extends SourceEditor2OutlinePage {
private static final ViewerComparator ALPHA_COMPARATOR = new ElementNameComparator(RElementName.NAMEONLY_COMPARATOR);
private class AlphaSortAction extends ToggleAction {
public AlphaSortAction() {
super("sort.alphabetically.enabled", false, 2); //$NON-NLS-1$
setText(SharedMessages.ToggleSortAction_name);
setImageDescriptor(SharedUIResources.getImages().getDescriptor(SharedUIResources.LOCTOOL_SORT_ALPHA_IMAGE_ID));
setToolTipText(SharedMessages.ToggleSortAction_tooltip);
}
@Override
protected void configure(final boolean on) {
final TreeViewer viewer = getViewer();
if (UIAccess.isOkToUse(viewer)) {
viewer.setComparator(on ? ALPHA_COMPARATOR : null);
}
}
}
private class FilterCommonVariables extends ToggleAction {
public FilterCommonVariables() {
super("filter.common_var.enabled", false, 2); //$NON-NLS-1$
setText(RUIMessages.Outline_HideGeneralVariables_name);
setImageDescriptor(RUI.getImageDescriptor(RUIPlugin.IMG_LOCTOOL_FILTER_GENERAL));
setToolTipText(RUIMessages.Outline_HideGeneralVariables_name);
}
@Override
protected void configure(final boolean on) {
final TreeViewer viewer = getViewer();
fFilter.hideCommonVariables = on;
if (UIAccess.isOkToUse(viewer)) {
viewer.refresh(false);
}
}
}
private class FilterLocalDefinitions extends ToggleAction {
public FilterLocalDefinitions() {
super("filter.local.enabled", false, 2); //$NON-NLS-1$
setText(RUIMessages.Outline_HideLocalElements_name);
setImageDescriptor(RUI.getImageDescriptor(RUIPlugin.IMG_LOCTOOL_FILTER_LOCAL));
setToolTipText(RUIMessages.Outline_HideLocalElements_name);
}
@Override
protected void configure(final boolean on) {
final TreeViewer viewer = getViewer();
fFilter.hideLocalDefinitions = on;
if (UIAccess.isOkToUse(viewer)) {
viewer.refresh(false);
}
}
}
private class ContentFilter implements IModelElement.Filter {
private boolean hideCommonVariables;
private boolean hideLocalDefinitions;
@Override
public boolean include(final IModelElement element) {
switch (element.getElementType()) {
case IRElement.R_ARGUMENT:
return false;
case IRElement.R_GENERAL_VARIABLE:
return !hideCommonVariables;
case IRElement.R_GENERAL_LOCAL_VARIABLE:
return !hideCommonVariables && !hideLocalDefinitions;
case IRElement.R_COMMON_LOCAL_FUNCTION:
return !hideLocalDefinitions;
default:
return true;
}
};
}
private final ContentFilter fFilter = new ContentFilter();
public ROutlinePage(final REditor editor) {
super(editor, RModel.TYPE_ID, RRefactoring.getFactory(),
"de.walware.r.menu.ROutlineViewContextMenu"); //$NON-NLS-1$
}
@Override
protected IDialogSettings getDialogSettings() {
return DialogUtil.getDialogSettings(RUIPlugin.getDefault(), "ROutlineView"); //$NON-NLS-1$
}
@Override
protected IModelElement.Filter getContentFilter() {
return fFilter;
}
@Override
protected void configureViewer(final TreeViewer viewer) {
super.configureViewer(viewer);
viewer.setLabelProvider(new RLabelProvider());
}
@Override
protected void contributeToActionBars(final IServiceLocator serviceLocator,
final IActionBars actionBars, final HandlerCollection handlers) {
super.contributeToActionBars(serviceLocator, actionBars, handlers);
final IToolBarManager toolBarManager = actionBars.getToolBarManager();
toolBarManager.appendToGroup(SharedUIResources.VIEW_SORT_MENU_ID,
new AlphaSortAction());
toolBarManager.appendToGroup(SharedUIResources.VIEW_FILTER_MENU_ID,
new FilterCommonVariables());
toolBarManager.appendToGroup(SharedUIResources.VIEW_FILTER_MENU_ID,
new FilterLocalDefinitions());
}
@Override
protected void contextMenuAboutToShow(final IMenuManager m) {
super.contextMenuAboutToShow(m);
final IPageSite site = getSite();
if (m.find(IStatetUIMenuIds.GROUP_SUBMIT_MENU_ID) == null) {
m.insertBefore(SharedUIResources.ADDITIONS_MENU_ID,
new Separator(IStatetUIMenuIds.GROUP_SUBMIT_MENU_ID) );
}
m.appendToGroup(IStatetUIMenuIds.GROUP_SUBMIT_MENU_ID,
new CommandContributionItem(new CommandContributionItemParameter(
site, null, RCodeLaunching.SUBMIT_SELECTION_COMMAND_ID, null,
null, null, null,
null, "R", null, //$NON-NLS-1$
CommandContributionItem.STYLE_PUSH, null, false) ));
m.appendToGroup(IStatetUIMenuIds.GROUP_SUBMIT_MENU_ID,
new CommandContributionItem(new CommandContributionItemParameter(
site, null, RCodeLaunching.SUBMIT_UPTO_SELECTION_COMMAND_ID, null,
null, null, null,
null, "U", null, //$NON-NLS-1$
CommandContributionItem.STYLE_PUSH, null, false) ));
m.add(new Separator(IStatetUIMenuIds.GROUP_ADD_MORE_ID));
}
}