/*=============================================================================#
# 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.debug.ui;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.IEditorStatusLine;
import de.walware.ecommons.ui.util.UIAccess;
import de.walware.statet.nico.core.runtime.SubmitType;
import de.walware.statet.nico.core.runtime.ToolController;
import de.walware.statet.nico.ui.NicoUI;
import de.walware.statet.nico.ui.NicoUITools;
import de.walware.statet.nico.ui.ToolSessionUIData;
import de.walware.statet.nico.ui.console.NIConsole;
import de.walware.statet.r.console.core.RConsoleTool;
import de.walware.statet.r.launching.IRCodeSubmitConnector;
/**
* Connector for NICO consoles.
*/
public class RControllerCodeLaunchConnector implements IRCodeSubmitConnector {
public static final String ID = "de.walware.statet.r.launching.RNewConsoleConnector"; //$NON-NLS-1$
public static interface CommandsCreator {
IStatus submitTo(final ToolController controller);
}
@Override
public boolean submit(final List<String> lines, final boolean gotoConsole) throws CoreException {
return submit(new CommandsCreator() {
@Override
public IStatus submitTo(final ToolController controller) {
return controller.submit(lines, SubmitType.EDITOR);
}
}, gotoConsole);
}
public boolean submit(final CommandsCreator rCommands, final boolean gotoConsole) throws CoreException {
final AtomicReference<ToolSessionUIData> info= new AtomicReference<>();
UIAccess.checkedSyncExec(new UIAccess.CheckedRunnable() {
@Override
public void run() throws CoreException {
final IWorkbenchPage page = UIAccess.getActiveWorkbenchPage(true);
info.set(NicoUI.getToolRegistry().getActiveToolSession(page));
}
});
final ToolController controller = NicoUITools.accessController(RConsoleTool.TYPE, info.get().getProcess());
final IStatus status = rCommands.submitTo(controller);
if (status.getSeverity() >= IStatus.ERROR) {
throw new CoreException(status);
}
final NIConsole console = info.get().getConsole();
if (console != null) {
NicoUITools.showConsole(console, info.get().getPage(), gotoConsole);
}
return true;
}
@Override
public void gotoConsole() throws CoreException {
final IWorkbenchPage page = UIAccess.getActiveWorkbenchPage(true);
final ToolSessionUIData info = NicoUI.getToolRegistry().getActiveToolSession(page);
final NIConsole console = info.getConsole();
if (console != null) {
NicoUITools.showConsole(console, page, true);
return;
}
else {
// TODO Move to registry actions/throw exceptions
final IWorkbenchPart part = page.getActivePart();
if (part != null) {
final IEditorStatusLine statusLine = (IEditorStatusLine) part.getAdapter(IEditorStatusLine.class);
if (statusLine != null) {
statusLine.setMessage(true, RLaunchingMessages.SubmitCode_error_NoRSession_message, null);
}
}
Display.getCurrent().beep();
}
}
}