classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

java.text attributes


From: Guilhem Lavaux
Subject: java.text attributes
Date: Sat, 10 Apr 2004 19:42:02 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030630

Hi,

Here are some new classes which will be used in an upcoming patch for java.text to support attributes. These files consists as an interface and two implementations for it. If we want to build attributed iterators we will use one implementation and if not we will use the other (much faster).

By the way, I am moving FormatCharacterIterator.java to gnu.java.text.

I know there may be some code redundancy between FormatCharacterIterator and FormatBuffers but it seems cleanest to me that way for the rest of java.text classes.

ChangeLog entry:

2004-04-10  Guilhem Lavaux <address@hidden>

        * gnu/java/text/FormatBuffer.java,
        gnu/java/text/AttributedFormatBuffer.java,
        gnu/java/text/StringFormatBuffer.java: New classes to implement
        attributed iterators in java.text.

        * gnu/java/text/FormatCharacterIterator.java: Moved from
        java/text.

Cheers,
Guilhem.
/* AttributedFormatBuffer.java -- Implements an attributed FormatBuffer.
   Copyright (C) 2004 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
 
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.text;

import java.text.AttributedCharacterIterator;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * This class is an implementation of a FormatBuffer with attributes.
 * 
 * @author Guilhem Lavaux <address@hidden>
 * @date April 10, 2004
 */
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;

  /**
   * This constructor accepts a StringBuffer. If the buffer contains
   * already some characters they will not be attributed. 
   */
  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);
  }

  /**
   * This method is a helper function for formatters. Given a set of ranges
   * and attributes it adds exactly one attribute for the range of characters
   * comprised between the last entry in 'ranges' and the specified new range.
   *
   * @param new_range A new range to insert in the list.
   * @param new_attribute A new attribute to insert in the list.
   */  
  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;
  }

  /**
   * This method synchronizes the state of the attribute array.
   * After calling it you may call address@hidden #getDefaultAttribute()}.
   */
  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);
  }

  /**
   * This method returns the internal StringBuffer describing
   * the attributed string.
   *
   * @return An instance of StringBuffer which contains the string.
   */
  public StringBuffer getBuffer()
  {
    return buffer;
  }

  /**
   * This method returns the ranges for the attributes.
   *
   * @return An array of int describing the ranges.
   */
  public int[] getRanges()
  {
    return a_ranges;
  }

  /**
   * This method returns the array containing the map on the 
   * attributes.
   *
   * @return An array of address@hidden java.util.Map} containing the 
attributes.
   */
  public HashMap[] getAttributes()
  {
    return a_attributes;
  }
}
/* FormatBuffer.java -- General interface to build attributed strings.
   Copyright (C) 2004 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
 
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.text;

import java.text.AttributedCharacterIterator;
import java.util.HashMap;

/**
 * This interface describes a modifiable buffer which contains attributed
 * characters. The implementation may or may not implements attributes. It
 * aims to greatly simplify and clarify the implementation of java.text 
 * formatters. The buffer may be appended or have its tail cut. It may also
 * be completely cleant up.
 *
 * @author Guilhem Lavaux <address@hidden>
 * @date April 10, 2004
 */
public interface FormatBuffer 
{
  /**
   * This method appends a simple string to the buffer. This part of
   * the buffer will be attributed using the default attribute.
   *
   * @param s The string to append to the buffer.
   */
  public void append(String s);

  /**
   * This method appends a simple string to the buffer. This part of
   * the buffer will have the specified attribute (and only this one).
   * The default attribute may be changed after calling this method.
   *
   * @param s The string to append to the buffer.
   * @param attr Attribute to use for the string in the buffer.
   */
  public void append(String s, AttributedCharacterIterator.Attribute attr);

  /**
   * This method appends a simple string to the buffer. This part of
   * the buffer will be attributed using the specified ranges and attributes.
   * To have an example on how to specify ranges see address@hidden 
gnu.java.text.FormatCharacterIterator}. 
   * 
   * @param s The string to append to the buffer.
   * @param ranges The ranges describing how the attributes should be applied
   * to the string.
   * @param attrs The attributes of the string in the buffer.
   */
  public void append(String s, int[] ranges, HashMap[] attrs);

  /**
   * This method appends a simple char to the buffer. This part of
   * the buffer will be attributed using the default attribute.
   *
   * @param c The character to append to the buffer.
   */
  public void append(char c);

  /**
   * This method appends a simple character to the buffer. This part of
   * the buffer will have the specified attribute (and only this one).
   * The default attribute may be changed after calling this method.
   *
   * @param c The character to append to the buffer.
   * @param attr Attribute to use for the character in the buffer.
   */
  public void append(char c, AttributedCharacterIterator.Attribute attr);

  /**
   * This method changes the current default attribute for the next string
   * or character which will be appended to the buffer.
   *
   * @param attr The attribute which will be used by default.
   */
  public void setDefaultAttribute(AttributedCharacterIterator.Attribute attr);

  /**
   * This method returns the current default attribute for the buffer.
   *
   * @return The default attribute for the buffer.
   */
  public AttributedCharacterIterator.Attribute getDefaultAttribute();

  /**
   * This method cuts the last characters of the buffer. The number of
   * characters to cut is given by "length".
   *
   * @param length Number of characters to cut at the end of the buffer.
   */
  public void cutTail(int length);
  
  /**
   * This method resets completely the buffer.
   */
  public void clear();

  /**
   * This method returns the number of character in the buffer.
   *
   * @return The number of character in the buffer.
   */
  public int length();
}
/* StringFormatBuffer.java -- Implements FormatBuffer using StringBuffer.
   Copyright (C) 2004 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
 
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.text;

import java.text.AttributedCharacterIterator;
import java.util.HashMap;

/**
 * This class is an implementation of a FormatBuffer without attributes.
 * 
 * @author Guilhem Lavaux <address@hidden>
 * @date April 10, 2004
 */
public class StringFormatBuffer implements FormatBuffer
{
  private StringBuffer buffer;
  private AttributedCharacterIterator.Attribute defaultAttr;

  public StringFormatBuffer(int prebuffer)
  {
    buffer = new StringBuffer(prebuffer);
  }

  public StringFormatBuffer(StringBuffer buffer)
  {
    this.buffer = buffer;
  }

  public void append(String s)
  {
    buffer.append(s);
  }
  
  public void append(String s, AttributedCharacterIterator.Attribute attr)
  {
    buffer.append(s);
  }

  public void append(String s, int[] ranges, HashMap[] attrs)
  {
    buffer.append(s);
  }

  public void append(char c)
  {
    buffer.append(c);
  }

  public void append(char c, AttributedCharacterIterator.Attribute attr)
  {
    buffer.append(c);
  }

  public void setDefaultAttribute(AttributedCharacterIterator.Attribute attr)
  {
    defaultAttr = attr;
  }

  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);
  }

  /**
   * This method returns the internal address@hidden java.lang.StringBuffer} 
which 
   * contains the string of character.
   */
  public StringBuffer getBuffer()
  {
    return buffer;
  }
}

Attachment: pgp9OivIed8Jo.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]