/* * 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.hyperlink; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.TextSelection; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorRegistry; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; import org.robotframework.ide.eclipse.main.plugin.RedImages; import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile; import org.robotframework.ide.eclipse.main.plugin.tableeditor.RobotFormEditor; import org.robotframework.ide.eclipse.main.plugin.tableeditor.RobotFormEditor.RobotEditorOpeningException; import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.SuiteSourceEditor; import com.google.common.annotations.VisibleForTesting; /** * @author Michal Anglart * */ public class SuiteFileSourceRegionHyperlink implements RedHyperlink { private final IRegion source; private final IRegion destination; private final RobotSuiteFile destinationFile; private final String additionalLabelDecoration; private final String elementName; public SuiteFileSourceRegionHyperlink(final IRegion from, final RobotSuiteFile toFile, final IRegion to) { this(from, toFile, to, "", ""); } public SuiteFileSourceRegionHyperlink(final IRegion from, final RobotSuiteFile toFile, final IRegion to, final String additionalLabelDecoration, final String elementName) { this.source = from; this.destinationFile = toFile; this.destination = to; this.additionalLabelDecoration = additionalLabelDecoration; this.elementName = elementName; } @Override public IRegion getHyperlinkRegion() { return source; } @VisibleForTesting public IRegion getDestinationRegion() { return destination; } @VisibleForTesting public RobotSuiteFile getDestinationFile() { return destinationFile; } @Override public String getTypeLabel() { return null; } @Override public String getHyperlinkText() { return "Open Definition " + elementName(); } @Override public String elementName() { return elementName; } @Override public String getLabelForCompoundHyperlinksDialog() { return destinationFile.getName(); } @Override public String additionalLabelDecoration() { return additionalLabelDecoration; } @Override public ImageDescriptor getImage() { return RedImages.getImageForFileWithExtension(destinationFile.getFileExtension()); } @Override public void open() { final IEditorRegistry editorRegistry = PlatformUI.getWorkbench().getEditorRegistry(); final IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); final IEditorDescriptor desc = editorRegistry.findEditor(RobotFormEditor.ID); try { final IEditorPart ed = page.openEditor(new FileEditorInput(destinationFile.getFile()), desc.getId()); if (ed instanceof RobotFormEditor) { // it can be ErrorEditorPart if something went wrong final RobotFormEditor editor = (RobotFormEditor) ed; final SuiteSourceEditor sourcePage = editor.activateSourcePage(); if (destination != null) { sourcePage.getSelectionProvider() .setSelection(new TextSelection(destination.getOffset(), destination.getLength())); } } } catch (final PartInitException e) { throw new RobotEditorOpeningException("Unable to open editor for file: " + destinationFile.getName(), e); } } }