/*
* Copyright 2016 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.List;
import java.util.Optional;
import javax.swing.text.BadLocationException;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.rf.ide.core.testdata.model.RobotFile;
import org.rf.ide.core.testdata.text.read.RobotLine;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.separators.Separator.SeparatorType;
import org.rf.ide.core.testdata.text.read.separators.TokenSeparatorBuilder.FileFormat;
import org.robotframework.ide.eclipse.main.plugin.RedImages;
import org.robotframework.ide.eclipse.main.plugin.model.RobotKeywordCall;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSettingsSection;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.red.graphics.ImagesManager;
import com.google.common.collect.Range;
public class MetadataKeyInSameColumnFixer extends RedSuiteMarkerResolution {
public MetadataKeyInSameColumnFixer() {
}
@Override
public String getLabel() {
return "Split Metadata key from setting declaration.";
}
@Override
public Optional<ICompletionProposal> asContentProposal(final IMarker marker, final IDocument document,
final RobotSuiteFile suiteModel) {
Optional<ICompletionProposal> proposal = Optional.empty();
final Optional<RobotSettingsSection> section = suiteModel.findSection(RobotSettingsSection.class);
if (section.isPresent()) {
final Range<Integer> range = getRange(marker);
final List<RobotKeywordCall> metadataSettings = section.get().getMetadataSettings();
for (final RobotKeywordCall robotKeywordCall : metadataSettings) {
if (range.contains(robotKeywordCall.getDefinitionPosition().getOffset())) {
try {
proposal = createProposal(document, robotKeywordCall, suiteModel);
} catch (final BadLocationException e) {
e.printStackTrace();
}
}
}
}
return proposal;
}
private Optional<ICompletionProposal> createProposal(final IDocument document,
final RobotKeywordCall robotKeywordCall, final RobotSuiteFile suiteModel) throws BadLocationException {
final RobotToken metadataDec = robotKeywordCall.getLinkedElement().getDeclaration();
final String metaText = metadataDec.getRaw().endsWith(":") ? "Metadata:" : "Metadata";
final int offset = metadataDec.getStartOffset();
final String correctedMetadata = new StringBuilder().append(metaText)
.append(getSeparator(suiteModel, offset))
.toString();
final ICompletionProposal proposal = new CompletionProposal(correctedMetadata, offset,
metadataDec.getRaw().length(), offset, ImagesManager.getImage(RedImages.getUserKeywordImage()),
getLabel(), null, null);
return Optional.of(proposal);
}
private String getSeparator(final RobotSuiteFile suiteModel, final int offset) {
String separator = " ";
final RobotFile fileModel = suiteModel.getLinkedElement();
final FileFormat fileFormat = fileModel.getParent().getFileFormat();
if (fileFormat == FileFormat.TSV) {
separator = "\t";
} else {
final Optional<Integer> line = fileModel.getRobotLineIndexBy(offset);
if (line.isPresent()) {
final RobotLine robotLine = fileModel.getFileContent().get(line.get());
final SeparatorType separatorForLine = robotLine.getSeparatorForLine().get();
if (separatorForLine == SeparatorType.PIPE) {
separator = " | ";
} else {
separator = " ";
}
}
}
return separator;
}
private Range<Integer> getRange(final IMarker marker) {
try {
return Range.closed((Integer) marker.getAttribute(IMarker.CHAR_START),
(Integer) marker.getAttribute(IMarker.CHAR_END));
} catch (final CoreException e) {
throw new IllegalStateException("Given marker should have offsets defined", e);
}
}
}