/*
* 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 java.util.Optional;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.robotframework.ide.eclipse.main.plugin.RedImages;
import org.robotframework.ide.eclipse.main.plugin.RedPlugin;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.ide.eclipse.main.plugin.model.RobotVariablesSection;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.DocumentUtilities;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.assist.RedCompletionBuilder;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.assist.RedCompletionProposal;
import org.robotframework.red.graphics.ImagesManager;
import com.google.common.base.Strings;
/**
* @author Michal Anglart
*
*/
public class CreateVariableFixer extends RedSuiteMarkerResolution {
private final String variableName;
public CreateVariableFixer(final String variableName) {
this.variableName = variableName;
}
@Override
public String getLabel() {
return "Define " + variableName + " in Variables table";
}
@Override
public Optional<ICompletionProposal> asContentProposal(final IMarker marker, final IDocument document,
final RobotSuiteFile suiteModel) {
if (variableName == null) {
return Optional.empty();
}
final String lineDelimiter = DocumentUtilities.getDelimiter(document);
final boolean isTsvFile = suiteModel.getFileExtension().equals("tsv");
final String separator = RedPlugin.getDefault().getPreferences().getSeparatorToUse(isTsvFile);
final Optional<RobotVariablesSection> section = suiteModel.findSection(RobotVariablesSection.class);
final String toInsert;
int offsetOfChange;
final String variableDefinition = lineDelimiter + variableName + separator;
if (section.isPresent()) {
try {
toInsert = variableDefinition;
final int line = section.get().getHeaderLine();
final IRegion lineInformation = document.getLineInformation(line - 1);
offsetOfChange = lineInformation.getOffset() + lineInformation.getLength();
} catch (final BadLocationException e) {
return Optional.empty();
}
} else {
toInsert = Strings.repeat(lineDelimiter, 2) + "*** Variables ***" + variableDefinition;
offsetOfChange = document.getLength();
}
final IRegion regionOfChange = new Region(offsetOfChange, 0);
final String info = Snippets.createSnippetInfo(document, regionOfChange, toInsert);
final RedCompletionProposal proposal = RedCompletionBuilder.newProposal()
.willPut(toInsert)
.byInsertingAt(regionOfChange.getOffset())
.secondaryPopupShouldBeDisplayedUsingHtml(info)
.thenCursorWillStopAtTheEndOfInsertion()
.displayedLabelShouldBe(getLabel())
.proposalsShouldHaveIcon(ImagesManager.getImage(RedImages.getRobotVariableImage()))
.create();
return Optional.<ICompletionProposal> of(proposal);
}
}