/* * Copyright 2015 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.source.handler; import java.util.Optional; import javax.inject.Named; import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.text.hyperlink.IHyperlinkDetector; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.ui.ISources; import org.robotframework.ide.eclipse.main.plugin.tableeditor.RobotFormEditor; import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.handler.OpenDeclarationHandler.E4OpenDeclarationHandler; import org.robotframework.red.commands.DIParameterizedHandler; /** * @author Michal Anglart */ public class OpenDeclarationHandler extends DIParameterizedHandler<E4OpenDeclarationHandler> { public OpenDeclarationHandler() { super(E4OpenDeclarationHandler.class); } public static class E4OpenDeclarationHandler { @Execute public void openDeclaration(final @Named(ISources.ACTIVE_EDITOR_NAME) RobotFormEditor editor) { final SourceViewer viewer = editor.getSourceEditor().getViewer(); final IRegion hyperlinkRegion = new Region(viewer.getTextWidget().getCaretOffset(), 0); final SourceViewerConfiguration configuration = editor.getSourceEditor().getViewerConfiguration(); final IHyperlinkDetector[] detectors = configuration.getHyperlinkDetectors(viewer); final Optional<IHyperlink> hyperlink = getHyperlink(viewer, hyperlinkRegion, detectors); if (hyperlink.isPresent()) { hyperlink.get().open(); } } } private static Optional<IHyperlink> getHyperlink(final ITextViewer viewer, final IRegion hyperlinkRegion, final IHyperlinkDetector... detectors) { for(final IHyperlinkDetector detector : detectors) { final Optional<IHyperlink> hyperlink = detect(viewer, hyperlinkRegion, detector); if (hyperlink.isPresent()) { return hyperlink; } } return Optional.empty(); } private static Optional<IHyperlink> detect(final ITextViewer viewer, final IRegion hyperlinkRegion, final IHyperlinkDetector detector) { final IHyperlink[] hyperlinks = detector.detectHyperlinks(viewer, hyperlinkRegion, false); if (hyperlinks != null && hyperlinks.length > 0) { return Optional.of(hyperlinks[0]); } return Optional.empty(); } }