package org.jbehave.eclipse.editor.text;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ui.texteditor.MarkerUtilities;
import org.jbehave.eclipse.Activator;
import org.jbehave.eclipse.editor.EditorUtils;
import org.jbehave.eclipse.util.New;
public class MarkData {
private Integer lineNumber, columnNumber;
private Integer offsetStart, offsetEnd;
public String message;
public int markerSeverity;
private Map<String, Object> attributes = New.hashMap();
public MarkData message(String message) {
this.message = message;
return this;
}
public MarkData offsetStart(int offsetStart) {
this.offsetStart = offsetStart;
return this;
}
public MarkData offsetEnd(int offsetEnd) {
this.offsetEnd = offsetEnd;
return this;
}
public MarkData line(int lineNumber) {
this.lineNumber = lineNumber;
return this;
}
public MarkData column(int columnNumber) {
this.columnNumber = columnNumber;
return this;
}
public MarkData info() {
return severity(IMarker.SEVERITY_INFO);
}
public MarkData warning() {
return severity(IMarker.SEVERITY_WARNING);
}
public MarkData error() {
return severity(IMarker.SEVERITY_ERROR);
}
public MarkData severity(int markerSeverity) {
this.markerSeverity = markerSeverity;
return this;
}
public MarkData attribute(String key, String value) {
attributes.put(key, value);
return this;
}
public MarkData attribute(String key, int value) {
attributes.put(key, value);
return this;
}
public void applyTo(IFile file, IDocument document, String markerId) {
try {
Map<String, Object> map = createAttributes(file, document);
MarkerUtilities.createMarker(file, map, markerId);
} catch (Exception ee) {
Activator.logError("Unable to apply marks on <" + file + ">", ee);
}
}
public Map<String, Object> createAttributes(IFile file, IDocument document) throws BadLocationException {
Map<String, Object> map = new HashMap<String, Object>(attributes);
int lineNb = lineNumber(document);
if(lineNb>=0)
MarkerUtilities.setLineNumber(map, lineNb);
MarkerUtilities.setMessage(map, message);
map.put(IMarker.LOCATION, file.getFullPath().toString());
defineCharStart(document, map);
defineCharEnd(document, map);
map.put(IMarker.SEVERITY, Integer.valueOf(markerSeverity));
return map;
}
private int lineNumber(IDocument document) throws BadLocationException {
if(lineNumber!=null)
return lineNumber;
else if(offsetStart!=null)
return document.getLineOfOffset(offsetStart);
else
return -1;
}
private void defineCharStart(IDocument document, Map<String, Object> map) {
if(offsetStart!=null) {
map.put(IMarker.CHAR_START, offsetStart);
}
else if (lineNumber!=null && columnNumber!=null) {
Integer charStart = EditorUtils.getCharStart(document, lineNumber, columnNumber);
if (charStart != null)
map.put(IMarker.CHAR_START, charStart);
}
}
private void defineCharEnd(IDocument document, Map<String, Object> map) {
if(offsetEnd!=null) {
map.put(IMarker.CHAR_END, offsetEnd);
}
else if (lineNumber!=null && columnNumber!=null) {
Integer charEnd = EditorUtils.getCharEnd(document, lineNumber, columnNumber);
if (charEnd != null)
map.put(IMarker.CHAR_END, charEnd);
}
}
@Override
public String toString() {
return "MarkData [offsetStart=" + offsetStart + ", offsetEnd=" + offsetEnd + ", message=" + message
+ ", markerSeverity=" + markerSeverity + "]";
}
}