/*=============================================================================#
# Copyright (c) 2012-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.ui.dataeditor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.IWorkbenchPage;
import de.walware.ecommons.ts.ISystemRunnable;
import de.walware.ecommons.ts.ITool;
import de.walware.ecommons.ts.IToolService;
import de.walware.ecommons.ts.util.ToolCommandHandlerUtil;
import de.walware.ecommons.ui.util.UIAccess;
import de.walware.statet.nico.core.runtime.ToolProcess;
import de.walware.rj.data.RObject;
import de.walware.rj.data.RObjectFactory;
import de.walware.rj.eclient.AbstractRToolCommandHandler;
import de.walware.rj.eclient.IRToolService;
import de.walware.rj.services.RService;
import de.walware.statet.r.console.core.IRDataAdapter;
import de.walware.statet.r.core.data.ICombinedRElement;
import de.walware.statet.r.core.model.RElementName;
public class ShowElementCommandHandler extends AbstractRToolCommandHandler {
private static class CheckRunnable implements ISystemRunnable {
private final ToolProcess tool;
private final RElementName elementName;
public CheckRunnable(final ToolProcess tool, final RElementName elementName) {
this.tool= tool;
this.elementName= elementName;
}
@Override
public boolean isRunnableIn(final ITool tool) {
return (tool == this.tool);
}
@Override
public String getTypeId() {
return "r/dataeditor/open"; //$NON-NLS-1$
}
@Override
public String getLabel() {
return "Show R Element";
}
@Override
public boolean changed(final int event, final ITool tool) {
switch (event) {
case MOVING_FROM:
case MOVING_TO:
return false;
default:
return true;
}
}
@Override
public void run(final IToolService service,
final IProgressMonitor monitor) throws CoreException {
final RObject[] data= ((IRDataAdapter) service).findData(this.elementName.getSegmentName(),
null, true, "combined", RObjectFactory.F_ONLY_STRUCT, RService.DEPTH_REFERENCE,
monitor );
if (data == null) {
return;
}
final ICombinedRElement foundEnv= (ICombinedRElement) data[1];
final List<RElementName> segments= new ArrayList<>();
segments.add(foundEnv.getElementName());
RElementName.addSegments(segments, this.elementName);
doOpen(this.tool, RElementName.create(segments));
}
}
private static void doOpen(final ToolProcess tool, final RElementName name) {
UIAccess.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
final IWorkbenchPage page= UIAccess.getActiveWorkbenchPage(true);
if (page == null) {
return;
}
RDataEditor.open(page, tool, name, null);
}
});
}
public static final String SHOW_ELEMENT_COMMAND_ID= "showElement"; //$NON-NLS-1$
public ShowElementCommandHandler() {
}
@Override
protected IStatus execute(final String id, final IRToolService r, final Map<String, Object> data,
final IProgressMonitor monitor) throws CoreException {
if (id.equals(SHOW_ELEMENT_COMMAND_ID)) {
final ToolProcess tool= (ToolProcess) r.getTool();
final String elementName= ToolCommandHandlerUtil.getCheckedData(data, "elementName",
String.class, true);
final RElementName rElementName= RElementName.parseDefault(elementName);
if (rElementName != null) {
if (rElementName.getScope() != null) {
doOpen(tool, rElementName);
}
else {
tool.getQueue().addHot(new CheckRunnable(tool, rElementName));
}
}
return Status.OK_STATUS;
}
return null;
}
}