/*
* Copyright 2017 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.tableeditor.handler;
import java.util.List;
import java.util.Optional;
import javax.inject.Named;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISources;
import org.robotframework.ide.eclipse.main.plugin.hyperlink.detectors.ITableHyperlinksDetector;
import org.robotframework.ide.eclipse.main.plugin.hyperlink.detectors.TableHyperlinksToKeywordsDetector;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.DISectionEditorPart;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.ISectionEditorPart;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.RobotFormEditor;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.SelectionLayerAccessor;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.handler.OpenDeclarationForTablesHandler.E4OpenDeclarationForTablesHandler;
import org.robotframework.red.commands.DIParameterizedHandler;
public class OpenDeclarationForTablesHandler extends DIParameterizedHandler<E4OpenDeclarationForTablesHandler> {
public OpenDeclarationForTablesHandler() {
super(E4OpenDeclarationForTablesHandler.class);
}
public static class E4OpenDeclarationForTablesHandler {
@Execute
public void openDeclarationForTables(final @Named(ISources.ACTIVE_EDITOR_NAME) RobotFormEditor editor) {
final IEditorPart editorPart = editor.getActiveEditor();
if (editorPart instanceof DISectionEditorPart) {
@SuppressWarnings("unchecked")
final DISectionEditorPart<ISectionEditorPart> part = (DISectionEditorPart<ISectionEditorPart>) editorPart;
final List<ITableHyperlinksDetector> detectors = part.getDetectors();
final SelectionLayerAccessor accessor = part.getSelectionLayerAccessor();
final PositionCoordinate[] positions = accessor.getSelectedPositions();
if (positions.length == 1) {
final int row = positions[0].getRowPosition();
final int column = positions[0].getColumnPosition();
final String label = accessor.getLabelFromCell(row, column);
final Optional<IHyperlink> hyperlink = getHyperlink(row, column, label, detectors);
if (hyperlink.isPresent()) {
hyperlink.get().open();
}
}
}
}
}
private static Optional<IHyperlink> getHyperlink(final int row, final int column, final String label,
final List<ITableHyperlinksDetector> detectors) {
final java.util.Optional<TableHyperlinksToKeywordsDetector> keywordDetector = detectors.stream()
.filter(TableHyperlinksToKeywordsDetector.class::isInstance)
.map(TableHyperlinksToKeywordsDetector.class::cast)
.findFirst();
if (keywordDetector.isPresent()) {
final Optional<IHyperlink> hyperlink = detect(row, column, label, keywordDetector.get());
if (hyperlink.isPresent()) {
return hyperlink;
}
}
for (final ITableHyperlinksDetector detector : detectors) {
final Optional<IHyperlink> hyperlink = detect(row, column, label, detector);
if (hyperlink.isPresent()) {
return hyperlink;
}
}
return Optional.empty();
}
private static Optional<IHyperlink> detect(final int row, final int column, final String label,
final ITableHyperlinksDetector detector) {
final List<IHyperlink> hyperlinks = detector.detectHyperlinks(row, column, label, 0);
if (hyperlinks != null && hyperlinks.size() > 0) {
return Optional.of(hyperlinks.get(0));
}
return Optional.empty();
}
}