/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.hyperlink.detectors;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Optional;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.nebula.widgets.nattable.data.IRowDataProvider;
import org.robotframework.ide.eclipse.main.plugin.RedPlugin;
import org.robotframework.ide.eclipse.main.plugin.hyperlink.SuiteFileTableElementHyperlink;
import org.robotframework.ide.eclipse.main.plugin.model.RobotDefinitionSetting;
import org.robotframework.ide.eclipse.main.plugin.model.RobotFileInternalElement;
import org.robotframework.ide.eclipse.main.plugin.model.RobotModel;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.ide.eclipse.main.plugin.model.locators.VariableDefinitionLocator;
import org.robotframework.ide.eclipse.main.plugin.model.locators.VariableDefinitionLocator.VariableDetector;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.DocumentUtilities;
import com.google.common.annotations.VisibleForTesting;
public class TableHyperlinksToVariablesDetector extends HyperlinksToVariablesDetector
implements ITableHyperlinksDetector {
private final RobotModel model;
private final IRowDataProvider<? extends Object> dataProvider;
public TableHyperlinksToVariablesDetector(final IRowDataProvider<? extends Object> dataProvider) {
this(RedPlugin.getModelManager().getModel(), dataProvider);
}
@VisibleForTesting
public TableHyperlinksToVariablesDetector(final RobotModel model,
final IRowDataProvider<? extends Object> dataProvider) {
this.model = model;
this.dataProvider = dataProvider;
}
@SuppressWarnings("rawtypes")
@Override
public List<IHyperlink> detectHyperlinks(final int row, final int column, final String label, final int indexInLabel) {
Object rowObject = dataProvider.getRowObject(row);
if (rowObject instanceof Entry) {
rowObject = ((Entry) rowObject).getValue();
}
if (rowObject instanceof RobotFileInternalElement) {
final RobotFileInternalElement element = (RobotFileInternalElement) rowObject;
final RobotSuiteFile suiteFile = element.getSuiteFile();
final Optional<IRegion> fromRegion = DocumentUtilities.findVariable(label, indexInLabel);
if (fromRegion.isPresent()) {
final String realName = label.substring(fromRegion.get().getOffset(),
fromRegion.get().getOffset() + fromRegion.get().getLength());
final List<IHyperlink> hyperlinks = new ArrayList<>();
final VariableDetector varDetector = createDetector(suiteFile, fromRegion.get(), realName, hyperlinks);
final VariableDefinitionLocator locator = new VariableDefinitionLocator(suiteFile.getFile(), model);
locator.locateVariableDefinitionWithLocalScope(varDetector, element);
return hyperlinks;
}
}
return new ArrayList<>();
}
@Override
protected IHyperlink createLocalVariableHyperlink(final RobotFileInternalElement element, final String varName,
final IRegion fromRegion, final RobotSuiteFile suiteFile, final IRegion destination) {
// because Arguments element is masking under keyword definition in table
final RobotFileInternalElement realElement = element instanceof RobotDefinitionSetting
&& ((RobotDefinitionSetting) element).isArguments() ? (RobotFileInternalElement) element.getParent()
: element;
return new SuiteFileTableElementHyperlink(fromRegion, suiteFile, realElement, varName);
}
@Override
protected IHyperlink createResourceVariableHyperlink(final RobotFileInternalElement element, final String varName,
final IRegion fromRegion, final RobotSuiteFile suiteFile, final IRegion destination) {
return new SuiteFileTableElementHyperlink(fromRegion, suiteFile, element, varName);
}
}