AttributedFormatBuffer.java [plain text]
package gnu.java.text;
import java.text.AttributedCharacterIterator;
import java.util.ArrayList;
import java.util.HashMap;
public class AttributedFormatBuffer implements FormatBuffer
{
private StringBuffer buffer;
private ArrayList ranges;
private ArrayList attributes;
private int[] a_ranges;
private HashMap[] a_attributes;
private int startingRange;
AttributedCharacterIterator.Attribute defaultAttr;
public AttributedFormatBuffer(StringBuffer buffer)
{
this.buffer = buffer;
this.ranges = new ArrayList();
this.attributes = new ArrayList();
this.defaultAttr = null;
if (buffer.length() != 0)
{
this.startingRange = buffer.length();
addAttribute(buffer.length(), null);
}
else
this.startingRange = -1;
}
public AttributedFormatBuffer(int prebuffer)
{
this(new StringBuffer(prebuffer));
}
public AttributedFormatBuffer()
{
this(10);
}
private final void addAttribute(int new_range, AttributedCharacterIterator.Attribute attr)
{
HashMap map;
if (attr != null)
{
map = new HashMap();
map.put(attr, attr);
attributes.add(map);
}
else
attributes.add(null);
ranges.add(new Integer(new_range));
}
public void append(String s)
{
if (startingRange < 0)
startingRange = 0;
buffer.append(s);
}
public void append(String s, AttributedCharacterIterator.Attribute attr)
{
setDefaultAttribute(attr);
startingRange = buffer.length();
append(s);
setDefaultAttribute(null);
}
public void append(String s, int[] ranges, HashMap[] attrs)
{
int curPos = buffer.length();
setDefaultAttribute(null);
if (ranges != null)
{
for (int i = 0; i < ranges.length; i++)
{
this.ranges.add(new Integer(ranges[i] + curPos));
this.attributes.add(attrs[i]);
}
}
startingRange = buffer.length();
buffer.append(s);
}
public void append(char c)
{
if (startingRange < 0)
startingRange = buffer.length();
buffer.append(c);
}
public void append(char c, AttributedCharacterIterator.Attribute attr)
{
setDefaultAttribute(attr);
buffer.append(c);
setDefaultAttribute(null);
}
public void setDefaultAttribute(AttributedCharacterIterator.Attribute attr)
{
if (attr == defaultAttr)
return;
int currentPos = buffer.length();
if (startingRange != currentPos && startingRange >= 0)
{
addAttribute(currentPos, defaultAttr);
}
defaultAttr = attr;
startingRange = currentPos;
}
public AttributedCharacterIterator.Attribute getDefaultAttribute()
{
return defaultAttr;
}
public void cutTail(int length)
{
buffer.setLength(buffer.length()-length);
}
public int length()
{
return buffer.length();
}
public void clear()
{
buffer.setLength(0);
ranges.clear();
attributes.clear();
defaultAttr = null;
startingRange = -1;
}
public void sync()
{
if (startingRange < 0 || startingRange == buffer.length())
return;
addAttribute(buffer.length(), defaultAttr);
a_ranges = new int[ranges.size()];
for (int i = 0; i < a_ranges.length; i++)
a_ranges[i] = ((Integer)(ranges.get (i))).intValue();
a_attributes = new HashMap[attributes.size()];
System.arraycopy(attributes.toArray(), 0, a_attributes, 0, a_attributes.length);
}
public StringBuffer getBuffer()
{
return buffer;
}
public int[] getRanges()
{
return a_ranges;
}
public HashMap[] getAttributes()
{
return a_attributes;
}
}