/*
* Copyright 2007 Guy Van den Broeck
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.outerj.daisy.diff.html.ancestor;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.eclipse.compare.rangedifferencer.RangeDifference;
import org.outerj.daisy.diff.html.ancestor.tagtostring.TagToString;
import org.outerj.daisy.diff.html.ancestor.tagtostring.TagToStringFactory;
import org.outerj.daisy.diff.html.dom.TagNode;
import org.outerj.daisy.diff.html.modification.HtmlLayoutChange;
public class ChangeTextGenerator {
private List<HtmlLayoutChange> htmlLayoutChanges = null;
private AncestorComparator ancestorComparator;
private AncestorComparator other;
private TagToStringFactory factory;
private Locale locale;
private static final int MAX_OUTPUT_LINE_LENGTH = 55; // Lines won't go
// longer than this
// unless a single
// word it longer
// than this.
public ChangeTextGenerator(AncestorComparator ancestorComparator,
AncestorComparator other, Locale locale) {
this.ancestorComparator = ancestorComparator;
this.other = other;
this.factory = new TagToStringFactory();
this.locale = locale;
htmlLayoutChanges = new ArrayList<HtmlLayoutChange>();
}
public ChangeText getChanged(RangeDifference... differences) {
ChangeText txt = new ChangeText(
ChangeTextGenerator.MAX_OUTPUT_LINE_LENGTH);
boolean rootlistopened = false;
if (differences.length > 1) {
txt.addHtml("<ul class='changelist'>");
rootlistopened = true;
}
for (int j = 0; j < differences.length; j++) {
RangeDifference d = differences[j];
boolean lvl1listopened = false;
if (rootlistopened) {
txt.addHtml("<li>");
}
if (d.leftLength() + d.rightLength() > 1) {
txt.addHtml("<ul class='changelist'>");
lvl1listopened = true;
}
// left are the old ones
for (int i = d.leftStart(); i < d.leftEnd(); i++) {
if (lvl1listopened)
txt.addHtml("<li>");
// add a bullet for a old tag
addTagOld(txt, other.getAncestor(i));
if (lvl1listopened)
txt.addHtml("</li>");
}
// right are the new ones
for (int i = d.rightStart(); i < d.rightEnd(); i++) {
if (lvl1listopened)
txt.addHtml("<li>");
// add a bullet for a new tag
addTagNew(txt, this.getAncestor(i));
if (lvl1listopened)
txt.addHtml("</li>");
}
if (lvl1listopened) {
txt.addHtml("</ul>");
}
if (rootlistopened) {
txt.addHtml("</li>");
}
}
if (rootlistopened) {
txt.addHtml("</ul>");
}
return txt;
}
private void addTagOld(ChangeText txt, TagNode ancestor) {
TagToString tagToString = factory.create(ancestor, locale);
tagToString.getRemovedDescription(txt);
htmlLayoutChanges.add(tagToString.getHtmlLayoutChange());
}
private void addTagNew(ChangeText txt, TagNode ancestor) {
TagToString tagToString = factory.create(ancestor, locale);
tagToString.getAddedDescription(txt);
htmlLayoutChanges.add(tagToString.getHtmlLayoutChange());
}
private TagNode getAncestor(int i) {
return ancestorComparator.getAncestor(i);
}
/**
* @return the htmlChange
*/
public List<HtmlLayoutChange> getHtmlLayoutChanges() {
return htmlLayoutChanges;
}
}