/*=============================================================================#
# Copyright (c) 2006-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.console.ui.page;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.help.IContextProvider;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.swt.events.HelpEvent;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.eclipse.ui.services.IServiceLocator;
import de.walware.jcommons.collections.ImCollections;
import de.walware.ecommons.ui.SharedUIResources;
import de.walware.ecommons.ui.actions.HandlerCollection;
import de.walware.ecommons.ui.actions.HandlerContributionItem;
import de.walware.ecommons.ui.util.UIAccess;
import de.walware.statet.nico.core.runtime.IRemoteEngineController;
import de.walware.statet.nico.ui.NicoUI;
import de.walware.statet.nico.ui.console.NIConsole;
import de.walware.statet.nico.ui.console.NIConsolePage;
import de.walware.statet.r.console.core.RConsoleTool;
import de.walware.statet.r.console.core.RProcess;
import de.walware.statet.r.console.ui.IRConsoleHelpContextIds;
import de.walware.statet.r.console.ui.RConsole;
import de.walware.statet.r.console.ui.tools.ChangeWorkingDirectoryWizard;
import de.walware.statet.r.core.RCodeStyleSettings;
import de.walware.statet.r.core.pkgmanager.IRPkgManager;
import de.walware.statet.r.core.pkgmanager.RPkgUtil;
import de.walware.statet.r.core.renv.IREnv;
import de.walware.statet.r.internal.console.ui.Messages;
import de.walware.statet.r.ui.RUIHelp;
import de.walware.statet.r.ui.editors.IRSourceEditor;
import de.walware.statet.r.ui.pkgmanager.OpenRPkgManagerHandler;
import de.walware.statet.r.ui.pkgmanager.StartAction;
import de.walware.statet.r.ui.rhelp.OpenRHelpHandler;
public class RConsolePage extends NIConsolePage {
private IContextProvider fHelpContextProvider;
public RConsolePage(final RConsole console, final IConsoleView view) {
super(console, view);
}
@Override
public RConsole getConsole() {
return (RConsole) super.getConsole();
}
@Override
public void createControl(final Composite parent) {
super.createControl(parent);
}
@Override
protected RInputConfigurator createInputEditorConfigurator() {
return new RInputConfigurator(this, (IRSourceEditor) getInputGroup());
}
@Override
protected RConsoleEditor createInputGroup() {
return new RConsoleEditor(this);
}
@Override
protected void initActions(final IServiceLocator serviceLocator, final HandlerCollection handlers) {
super.initActions(serviceLocator, handlers);
final IContextService contextService = (IContextService) serviceLocator.getService(IContextService.class);
contextService.activateContext("de.walware.statet.r.actionSets.RSessionTools"); //$NON-NLS-1$
fHelpContextProvider = RUIHelp.createEnrichedRHelpContextProvider(
getInputGroup().getViewer(), IRConsoleHelpContextIds.R_CONSOLE );
getInputGroup().getViewer().getTextWidget().addHelpListener(new HelpListener() {
@Override
public void helpRequested(final HelpEvent e) {
PlatformUI.getWorkbench().getHelpSystem().displayHelp(fHelpContextProvider.getContext(null));
}
});
}
@Override
protected void contributeToActionBars(final IServiceLocator serviceLocator,
final IActionBars actionBars, final HandlerCollection handlers) {
super.contributeToActionBars(serviceLocator, actionBars, handlers);
final IMenuManager menuManager = actionBars.getMenuManager();
menuManager.appendToGroup(NICO_CONTROL_MENU_ID,
new CommandContributionItem(new CommandContributionItemParameter(
getSite(), null, NicoUI.PAUSE_COMMAND_ID, null,
null, null, null,
null, null, null,
CommandContributionItem.STYLE_CHECK, null, false)));
if (getConsole().getProcess().isProvidingFeatureSet(IRemoteEngineController.FEATURE_SET_ID)) {
menuManager.appendToGroup(NICO_CONTROL_MENU_ID,
new CommandContributionItem(new CommandContributionItemParameter(
getSite(), null, NicoUI.DISCONNECT_COMMAND_ID, null,
null, null, null,
null, null, null,
CommandContributionItem.STYLE_PUSH, null, false)));
menuManager.appendToGroup(NICO_CONTROL_MENU_ID,
new CommandContributionItem(new CommandContributionItemParameter(
getSite(), null, NicoUI.RECONNECT_COMMAND_ID, null,
null, null, null,
null, null, null,
CommandContributionItem.STYLE_PUSH, null, false)));
}
menuManager.insertBefore(SharedUIResources.ADDITIONS_MENU_ID, new Separator("workspace")); //$NON-NLS-1$
menuManager.appendToGroup("workspace", //$NON-NLS-1$
new ChangeWorkingDirectoryWizard.ChangeAction(this));
menuManager.insertBefore(SharedUIResources.ADDITIONS_MENU_ID, new Separator("view")); //$NON-NLS-1$
final RProcess process = (RProcess) getConsole().getProcess();
final IREnv rEnv = (IREnv) process.getAdapter(IREnv.class);
if (process.isProvidingFeatureSet(RConsoleTool.R_DATA_FEATURESET_ID) && rEnv != null) {
menuManager.appendToGroup(NICO_CONTROL_MENU_ID,
new HandlerContributionItem(new CommandContributionItemParameter(
getSite(), null, HandlerContributionItem.NO_COMMAND_ID, null,
null, null, null,
"Open Package Manager", "P", null,
CommandContributionItem.STYLE_PUSH, null, false ),
new OpenRPkgManagerHandler((RProcess) getTool(), getSite().getShell()) ));
final MenuManager rEnvMenu = new MenuManager("R &Environment");
menuManager.appendToGroup(NICO_CONTROL_MENU_ID, rEnvMenu);
rEnvMenu.add(new HandlerContributionItem(new CommandContributionItemParameter(
getSite(), null, HandlerContributionItem.NO_COMMAND_ID, null,
null, null, null,
"Open Package Manager", "P", null,
CommandContributionItem.STYLE_PUSH, null, false ),
new OpenRPkgManagerHandler((RProcess) getTool(), getSite().getShell()) ));
if (RPkgUtil.DEBUG) {
rEnvMenu.add(new HandlerContributionItem(new CommandContributionItemParameter(
getSite(), null, HandlerContributionItem.NO_COMMAND_ID, null,
null, null, null,
"Open Package Manager - Clean", null, null, //$NON-NLS-1$
CommandContributionItem.STYLE_PUSH, null, false ),
new OpenRPkgManagerHandler((RProcess) getTool(), getSite().getShell()) {
@Override
protected IRPkgManager getPackageManager() {
final IRPkgManager packageManager = super.getPackageManager();
packageManager.clear();
return packageManager;
}
}));
rEnvMenu.add(new HandlerContributionItem(new CommandContributionItemParameter(
getSite(), null, HandlerContributionItem.NO_COMMAND_ID, null,
null, null, null,
"Open Package Manager - Install 'zic'", null, null, //$NON-NLS-1$
CommandContributionItem.STYLE_PUSH, null, false ),
new OpenRPkgManagerHandler((RProcess) getTool(), getSite().getShell()) {
@Override
protected StartAction getStartAction() {
return new StartAction(StartAction.INSTALL, ImCollections.newList("zic")); //$NON-NLS-1$
}
}));
}
rEnvMenu.add(new HandlerContributionItem(new CommandContributionItemParameter(
getSite(), null, HandlerContributionItem.NO_COMMAND_ID, null,
null, null, null,
"Open R Help", "H", null,
CommandContributionItem.STYLE_PUSH, null, false ),
new OpenRHelpHandler(rEnv, process, true) ));
rEnvMenu.add(new Separator());
rEnvMenu.add(new CommandContributionItem(new CommandContributionItemParameter(
getSite(), null, "de.walware.statet.r.commands.UpdateREnvIndex", null, //$NON-NLS-1$
null, null, null,
"Update &index (changes)", null, null,
CommandContributionItem.STYLE_PUSH, null, false )));
rEnvMenu.add(new CommandContributionItem(new CommandContributionItemParameter(
getSite(), null, "de.walware.statet.r.commands.ResetREnvIndex", null, //$NON-NLS-1$
null, null, null,
"Reset inde&x (completely)", null, null,
CommandContributionItem.STYLE_PUSH, null, false)));
}
}
@Override
protected void fillOutputContextMenu(final IMenuManager menuManager) {
super.fillOutputContextMenu(menuManager);
menuManager.appendToGroup("view", //$NON-NLS-1$
new CommandContributionItem(new CommandContributionItemParameter(
getSite(), null, NIConsole.ADJUST_OUTPUT_WIDTH_COMMAND_ID, null,
null, null, null,
Messages.AdjustWidth_label, Messages.AdjustWidth_mnemonic, null,
CommandContributionItem.STYLE_PUSH, null, false )));
}
@Override
public Object getAdapter(final Class required) {
if (IContextProvider.class.equals(required)) {
return fHelpContextProvider;
}
return super.getAdapter(required);
}
@Override
protected void handleSettingsChanged(final Set<String> groupIds, final Map<String, Object> options) {
super.handleSettingsChanged(groupIds, options);
if (groupIds.contains(RCodeStyleSettings.INDENT_GROUP_ID)
&& UIAccess.isOkToUse(getOutputViewer())) {
final RCodeStyleSettings codeStyle = (getConsole()).getRCodeStyle();
if (codeStyle.isDirty()) {
getOutputViewer().setTabWidth(codeStyle.getTabSize());
}
}
}
@Override
protected void collectContextMenuPreferencePages(final List<String> pageIds) {
super.collectContextMenuPreferencePages(pageIds);
pageIds.add("de.walware.statet.r.preferencePages.REditorOptions"); //$NON-NLS-1$
pageIds.add("de.walware.statet.r.preferencePages.RTextStyles"); //$NON-NLS-1$
}
}