blob: ba6ca1a14fd890c13efcae6342a1c14f83208071 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2017, 2019 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.r.ui.util;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.ecommons.models.core.util.ElementPartition;
import org.eclipse.statet.ltk.ui.ElementNameProvider;
import org.eclipse.statet.r.core.data.CombinedRElement;
import org.eclipse.statet.r.core.model.RElementName;
import org.eclipse.statet.rj.data.RObject;
@NonNullByDefault
public class RElementInputUtils {
public static class DoubleClickListener implements IDoubleClickListener {
private final AbstractTreeViewer viewer;
public DoubleClickListener(final AbstractTreeViewer viewer) {
this.viewer= viewer;
}
@Override
public void doubleClick(final DoubleClickEvent event) {
final IStructuredSelection selection= (IStructuredSelection) event.getSelection();
if (selection.size() != 1) {
return;
}
final Object element= selection.getFirstElement();
if (element instanceof RObject) {
final RObject object= (RObject) element;
switch (object.getRObjectType()) {
case RObject.TYPE_ENVIRONMENT:
case RObject.TYPE_LIST:
case RObject.TYPE_DATAFRAME:
case RObject.TYPE_S4OBJECT:
case RObject.TYPE_REFERENCE:
this.viewer.setExpandedState(element, !this.viewer.getExpandedState(element));
}
}
}
}
public static void addDoubleClickExpansion(final AbstractTreeViewer viewer) {
viewer.addDoubleClickListener(new DoubleClickListener(viewer));
}
public static @Nullable RElementName getRElementName(final TreePath treePath,
final ITreeSelection selection) {
if (selection instanceof ElementNameProvider) {
return (RElementName) ((ElementNameProvider) selection).getElementName(treePath);
}
if (treePath.getSegmentCount() == 0) {
return null;
}
final List<RElementName> names= new ArrayList<>(treePath.getSegmentCount() + 4);
int segmentIdx= 0;
while (segmentIdx < treePath.getSegmentCount()) {
final Object segment= treePath.getSegment(segmentIdx++);
if (segment instanceof ElementPartition) {
continue;
}
final CombinedRElement rElement= RElementInputContentProvider.getCombinedRElement(segment);
if (rElement == null) {
return null;
}
RElementName.addSegments(names, rElement.getElementName());
}
return RElementName.create(names);
}
private RElementInputUtils() {}
}