/*
* 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.project.build.fix;
import static com.google.common.collect.Lists.newArrayList;
import java.util.List;
import java.util.Optional;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.swt.graphics.Image;
import org.robotframework.ide.eclipse.main.plugin.RedImages;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.red.graphics.ImagesManager;
/**
* @author Michal Anglart
*
*/
public class ChangeImportedPathFixer extends RedSuiteMarkerResolution {
public static List<ChangeImportedPathFixer> createFixersForSameFile(final IFile problematicFile, final IPath invalidPath) {
final List<ChangeImportedPathFixer> fixers = newArrayList();
final String lastSegment = invalidPath.lastSegment();
try {
ResourcesPlugin.getWorkspace().getRoot().accept(new IResourceVisitor() {
@Override
public boolean visit(final IResource resource) throws CoreException {
if (resource.getType() == IResource.FILE && resource.getFullPath().lastSegment().equals(lastSegment)) {
final IPath resRelativePath = createCurrentFileRelativePath(problematicFile, (IFile) resource);
fixers.add(new ChangeImportedPathFixer(resRelativePath));
}
return true;
}
});
} catch (final CoreException e) {
return fixers;
}
return fixers;
}
private static IPath createCurrentFileRelativePath(final IFile from, final IFile to) {
return to.getLocation().makeRelativeTo(from.getLocation()).removeFirstSegments(1);
}
private final IPath validFileRelativePath;
public ChangeImportedPathFixer(final IPath validFileRelativePath) {
this.validFileRelativePath = validFileRelativePath;
}
@Override
public String getLabel() {
return "Change to " + validFileRelativePath.toString();
}
@Override
public Optional<ICompletionProposal> asContentProposal(final IMarker marker, final IDocument document,
final RobotSuiteFile suiteModel) {
final String toInsert = validFileRelativePath.toString();
final Image image = ImagesManager
.getImage(RedImages.getImageForFileWithExtension(validFileRelativePath.getFileExtension()));
try {
final int charStart = (int) marker.getAttribute(IMarker.CHAR_START);
final int charEnd = (int) marker.getAttribute(IMarker.CHAR_END);
final IRegion regionToChange = new Region(charStart, charEnd - charStart);
return Optional.<ICompletionProposal> of(
new CompletionProposal(toInsert, charStart, charEnd - charStart, toInsert.length(), image,
getLabel(), null, Snippets.createSnippetInfo(document, regionToChange, toInsert)));
} catch (final CoreException e) {
return Optional.empty();
}
}
}