package org.juxtasoftware.resource.sidebyside;
import java.util.Iterator;
import java.util.List;
import org.juxtasoftware.resource.sidebyside.SideBySideView.Change;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class DiffInjector implements OverlapInjector<Change> {
private List<Change> changes;
private Iterator<Change> changeItr;
private Change currChange = null;
private boolean tagStarted = false;
private boolean useMultipleColors = false;
@Override
public void initialize(List<Change> data) {
this.changes = data;
this.changeItr = this.changes.iterator();
if ( this.changeItr.hasNext() ) {
this.currChange = this.changeItr.next();
}
}
@Override
public List<Change> getData() {
return this.changes;
}
@Override
public boolean hasContent(long pos) {
if ( this.currChange == null) {
return false;
}
if ( this.currChange.getRange().getStart() <= pos && this.tagStarted == false ||
this.currChange.getRange().getEnd() <= pos && this.tagStarted == true ) {
return true;
}
return false;
}
@Override
public void restartContent( StringBuilder line ) {
if ( this.tagStarted ) {
line.append("</span>");
line.append("<span id=\"diff-").append(this.currChange.getId()).append("-continued\"");
line.append(" class=\"diff\"");
line.append(" juxta:range=\"").append(this.currChange.getRange().getStart());
line.append(",").append(this.currChange.getRange().getEnd()).append("\"");
line.append(" juxta:connect-to=\"").append(this.currChange.getConnectedId()).append("\"").append("\">");
}
}
@Override
public boolean injectContentStart(StringBuilder line, long currPositon) {
if ( this.currChange != null && this.tagStarted == false ) {
if ( this.currChange.getRange().getStart() <= currPositon) {
line.append("<span id=\"diff-").append(currChange.getId()).append("\"");
String typeStr = currChange.getType().toString().toLowerCase();
if ( this.useMultipleColors == false ) {
typeStr = "change";
}
line.append(" class=\"diff "+typeStr +"\"");
line.append(" juxta:range=\"").append(this.currChange.getRange().getStart());
line.append(",").append(this.currChange.getRange().getEnd()).append("\"");
line.append(" juxta:connect-to=\"").append(currChange.getConnectedId()).append("\"").append("\">");
this.tagStarted = true;
return true;
}
}
return false;
}
@Override
public boolean injectContentEnd(StringBuilder line, long currPosition) {
if ( this.currChange != null && this.tagStarted == true ) {
if ( this.currChange.getRange().getEnd() <= currPosition) {
line.append("</span>");
this.tagStarted = false;
this.currChange = null;
if ( this.changeItr.hasNext() ) {
this.currChange = this.changeItr.next();
}
return true;
}
}
return false;
}
public void useMultipleColors(Boolean multiColorSidebySide) {
this.useMultipleColors = multiColorSidebySide;
}
}