/*=============================================================================#
# Copyright (c) 2011-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.actions;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.console.TextConsoleViewer;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.PageBookView;
import de.walware.ecommons.ts.ITool;
import de.walware.ecommons.ts.IToolRunnable;
import de.walware.ecommons.ts.IToolService;
import de.walware.ecommons.ts.ui.IToolRunnableDecorator;
import de.walware.ecommons.ui.util.UIAccess;
import de.walware.statet.nico.core.runtime.ToolProcess;
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.nico.ui.console.NIConsolePage;
import de.walware.statet.r.console.core.IRBasicAdapter;
import de.walware.statet.r.console.core.RConsoleTool;
import de.walware.statet.r.internal.console.ui.Messages;
public class AdjustWidthHandler extends AbstractHandler {
private static class AdjustWidthRunnable implements IToolRunnable, IToolRunnableDecorator {
private final int fWidth;
public AdjustWidthRunnable(final int width) {
fWidth = width;
}
@Override
public String getTypeId() {
return "r/console/width"; //$NON-NLS-1$
}
@Override
public Image getImage() {
return ConsolePlugin.getImage(IConsoleConstants.IMG_VIEW_CONSOLE);
}
@Override
public String getLabel() {
return Messages.AdjustWidth_task;
}
@Override
public boolean isRunnableIn(final ITool tool) {
return (tool.isProvidingFeatureSet(RConsoleTool.R_BASIC_FEATURESET_ID));
}
@Override
public boolean changed(final int event, final ITool tool) {
if (event == MOVING_FROM) {
return false;
}
return true;
}
@Override
public void run(final IToolService service,
final IProgressMonitor monitor) throws CoreException {
final IRBasicAdapter r = (IRBasicAdapter) service;
r.submitToConsole("options(width = "+fWidth+"L)", monitor); //$NON-NLS-1$ //$NON-NLS-2$
}
}
public AdjustWidthHandler() {
}
@Override
public void setEnabled(final Object evaluationContext) {
setBaseEnabled((evaluationContext instanceof IEvaluationContext)
&& isValid((ToolProcess) ((IEvaluationContext) evaluationContext)
.getVariable(NicoUI.TOOL_SOURCE_ID) ));
}
private boolean isValid(final ToolProcess process) {
return (process != null && process.getMainType() == RConsoleTool.TYPE
&& !process.isTerminated() );
}
@Override
public Object execute(final ExecutionEvent event) throws ExecutionException {
final ToolSessionUIData session = NicoUI.getToolRegistry().getActiveToolSession(
UIAccess.getActiveWorkbenchPage(true) );
if (!isValid(session.getProcess())) {
return null;
}
final NIConsole console = session.getConsole();
if (console == null) {
return null;
}
final IConsoleView consoleView = NicoUITools.getConsoleView(console, session.getPage());
if (consoleView == null || !(consoleView instanceof PageBookView)) {
return null;
}
consoleView.display(console);
final IPage page = ((PageBookView) consoleView).getCurrentPage();
if (page instanceof NIConsolePage && ((NIConsolePage) page).getConsole() == console) {
int width = getWidth(((NIConsolePage) page).getOutputViewer());
if (width >= 0) {
if (width < 10) {
width = 10;
}
console.getProcess().getQueue().add(new AdjustWidthRunnable(width));
}
}
return null;
}
private int getWidth(final TextConsoleViewer viewer) {
if (UIAccess.isOkToUse(viewer)) {
final GC gc = new GC(Display.getCurrent());
try {
gc.setFont(viewer.getTextWidget().getFont());
final FontMetrics fontMetrics = gc.getFontMetrics();
final int charWidth = fontMetrics.getAverageCharWidth();
final int clientWidth = viewer.getTextWidget().getClientArea().width;
return clientWidth/charWidth;
}
finally {
gc.dispose();
}
}
return -1;
}
}