[kaffe] CVS kaffe (guilhem): java.text.Format.Field implementation last part + fixes for java.text

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Tue Aug 26 08:06:01 2003


PatchSet 3982 
Date: 2003/08/26 15:03:08
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
java.text.Format.Field implementation last part + fixes for java.text

Implemented java.text.DecimalFormat.formatToCharacterIterator but
handling of CURRENT, PERCENT, PERMILLE is still missing.
Added serialVersionUID for Field classes.
Removed an extra state in CollationElement.

Members: 
	ChangeLog:1.1579->1.1580 
	libraries/javalib/java/text/DateFormat.java:1.14->1.15 
	libraries/javalib/java/text/DecimalFormat.java:1.18->1.19 
	libraries/javalib/java/text/Format.java:1.11->1.12 
	libraries/javalib/java/text/MessageFormat.java:1.18->1.19 
	libraries/javalib/java/text/NumberFormat.java:1.16->1.17 
	libraries/javalib/java/text/RuleBasedCollator.java:1.13->1.14 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1579 kaffe/ChangeLog:1.1580
--- kaffe/ChangeLog:1.1579	Tue Aug 26 14:14:44 2003
+++ kaffe/ChangeLog	Tue Aug 26 15:03:08 2003
@@ -8,6 +8,24 @@
 	
 2003-08-26  Guilhem Lavaux <guilhem@kaffe.org>
 
+	* libraries/javalib/java/text/DecimalFormat.java:
+	(formatToCharacterAttribute) new method.
+	(formatInternal) renamed from format(double) and added attributes
+	handling
+	(addAttribute) added a final method to add attributes in vectors
+	(format(double)) use formatInternal
+
+	* libraries/javalib/java/text/NumberFormat.java,
+	libraries/javalib/java/text/MessageFormat.java,
+	libraries/javalib/java/text/DateFormat.java,
+	libraries/javalib/java/text/DecimalFormat.java:
+	Added serialVersionUID to Field subclasses.
+
+	* libraries/javalib/java/text/RuleBasedCollator.java:
+	Removed an extra unused state of CollationElement.
+
+2003-08-26  Guilhem Lavaux <guilhem@kaffe.org>
+
 	* libraries/javalib/java/text/SimpleDateFormat.java:
 	(formatWithAttribute) Added a if branch condition when we are not
 	setting attributes for an iterator.
Index: kaffe/libraries/javalib/java/text/DateFormat.java
diff -u kaffe/libraries/javalib/java/text/DateFormat.java:1.14 kaffe/libraries/javalib/java/text/DateFormat.java:1.15
--- kaffe/libraries/javalib/java/text/DateFormat.java:1.14	Mon Aug 25 06:14:48 2003
+++ kaffe/libraries/javalib/java/text/DateFormat.java	Tue Aug 26 15:03:10 2003
@@ -90,6 +90,8 @@
 
   public static class Field extends Format.Field
   {
+    static final long serialVersionUID = 7441350119349544720L;
+    
     private int calendarField;
 
     public static final DateFormat.Field ERA = new Field("era", Calendar.ERA);
Index: kaffe/libraries/javalib/java/text/DecimalFormat.java
diff -u kaffe/libraries/javalib/java/text/DecimalFormat.java:1.18 kaffe/libraries/javalib/java/text/DecimalFormat.java:1.19
--- kaffe/libraries/javalib/java/text/DecimalFormat.java:1.18	Mon Aug 25 06:30:12 2003
+++ kaffe/libraries/javalib/java/text/DecimalFormat.java	Tue Aug 26 15:03:10 2003
@@ -40,6 +40,8 @@
 import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
+import java.util.HashMap;
+import java.util.Vector;
 import java.io.ObjectInputStream;
 import java.io.IOException;
 
@@ -406,9 +408,29 @@
 	    && useExponentialNotation == dup.useExponentialNotation);
   }
 
-  public StringBuffer format (double number, StringBuffer dest,
-			      FieldPosition fieldPos)
+  private final void addAttribute(Vector ranges, Vector attributes,
+				  int new_range, Format.Field new_attribute)
+  {
+    HashMap map;
+
+    if (new_attribute != null)
+      {
+	map = new HashMap();
+	map.put(new_attribute, new_attribute);
+	attributes.add(map);
+      }
+    else
+      attributes.add(null);
+
+    ranges.add(new Integer(new_range));
+  }
+
+  protected StringBuffer formatInternal (double number, StringBuffer dest,
+					 FieldPosition fieldPos, Vector ranges,
+					 Vector attributes)
   {
+    boolean set_attributes = (ranges != null && attributes != null);
+   
     // A very special case.
     if (Double.isNaN(number))
       {
@@ -432,6 +454,14 @@
 	else
 	  {
 	    dest.append(symbols.getMinusSign());
+	    if (set_attributes)
+	      {
+		addAttribute(ranges, attributes, dest.length(),
+			     NumberFormat.Field.SIGN);
+		addAttribute(ranges, attributes, 
+			     dest.length()+positivePrefix.length(),
+			     null);
+	      }
 	    dest.append(positivePrefix);
 	  }
 	number = - number;
@@ -477,12 +507,23 @@
 
 	    // Append group separator if required.
 	    if (groupingUsed && count > 0 && groupingSize != 0 && count % groupingSize == 0)
-	      dest.insert(index, symbols.getGroupingSeparator());
+	      {
+		if (set_attributes)
+		  {
+		    addAttribute(ranges, attributes, dest.length(),
+				 NumberFormat.Field.INTEGER);
+		    addAttribute(ranges, attributes, dest.length()+1,
+				 NumberFormat.Field.GROUPING_SEPARATOR);
+		  }
 
+		dest.insert(index, symbols.getGroupingSeparator());
+	      }
 	    dest.insert(index, (char) (symbols.getZeroDigit() + dig));
 
 	    ++count;
 	  }
+	if (set_attributes)
+	  addAttribute(ranges, attributes, dest.length(), NumberFormat.Field.INTEGER); 
 
 	integerEndIndex = dest.length();
 
@@ -525,6 +566,15 @@
 	    || total_digits > 0)
 	  {
 	    dest.insert(decimal_index, symbols.getDecimalSeparator());
+	    
+	    if (set_attributes)
+	      {
+		addAttribute(ranges, attributes, decimal_index + 1,
+			     NumberFormat.Field.DECIMAL_SEPARATOR);
+		addAttribute(ranges, attributes, dest.length(),
+			     NumberFormat.Field.FRACTION);
+	      }
+	    
 	    if (fieldPos != null && 
 		(fieldPos.getField() == FRACTION_FIELD ||
 		 fieldPos.getFieldAttribute() == NumberFormat.Field.FRACTION))
@@ -538,10 +588,17 @@
 	if (useExponentialNotation)
 	  {
 	    dest.append(symbols.getExponential());
+	    if (set_attributes)
+	      addAttribute(ranges, attributes, dest.length(),
+			   NumberFormat.Field.EXPONENT_SYMBOL);
+	    
 	    if (exponent < 0)
 	      {
 		dest.append (symbols.getMinusSign ());
 		exponent = - exponent;
+		if (set_attributes)
+		  addAttribute(ranges, attributes, dest.length(),
+			       NumberFormat.Field.EXPONENT_SIGN);
 	      }
 	    index = dest.length();
 	    for (count = 0;
@@ -551,7 +608,11 @@
 		long dig = exponent % 10;
 		exponent /= 10;
 		dest.insert(index, (char) (symbols.getZeroDigit() + dig));
+
 	      }
+	    if (set_attributes)
+	      addAttribute(ranges, attributes, dest.length(),
+			   NumberFormat.Field.EXPONENT);
 	  }
       }
 
@@ -567,6 +628,40 @@
 		? negativeSuffix
 		: positiveSuffix);
     return dest;
+  }
+
+  public StringBuffer format (double number, StringBuffer dest,
+			      FieldPosition fieldPos)
+  {
+    return formatInternal (number, dest, fieldPos, null, null);
+  }
+
+  public AttributedCharacterIterator formatToCharacterIterator (Object value)
+  {
+    Vector ranges = new Vector();
+    Vector attributes = new Vector();
+    StringBuffer sbuf = new StringBuffer();
+    
+    if (value instanceof Number)
+      formatInternal(((Number) value).doubleValue(), sbuf, null, ranges, attributes);
+    else
+      throw new IllegalArgumentException 
+	("Cannot format given Object as a Number");
+
+    int[] int_ranges = new int[ranges.size()];
+    HashMap[] array_attributes = new HashMap[ranges.size()];
+    
+    for (int i=0;i<int_ranges.length;i++)
+      int_ranges[i] = ((Integer)ranges.elementAt(i)).intValue();
+
+    System.arraycopy(attributes.toArray(), 0, array_attributes, 0, array_attributes.length);
+
+    /*
+     * TODO: Reparse buffer to find the position of currency, percent, permille.
+     * As current classpath implementation preformat prefixes and suffixes we are
+     * not able to place attributes just when symbols arrive. 
+     */
+    return new FormatCharacterIterator (sbuf.toString(), int_ranges, array_attributes);
   }
 
   public StringBuffer format (long number, StringBuffer dest,
Index: kaffe/libraries/javalib/java/text/Format.java
diff -u kaffe/libraries/javalib/java/text/Format.java:1.11 kaffe/libraries/javalib/java/text/Format.java:1.12
--- kaffe/libraries/javalib/java/text/Format.java:1.11	Mon Aug 25 06:14:48 2003
+++ kaffe/libraries/javalib/java/text/Format.java	Tue Aug 26 15:03:10 2003
@@ -67,6 +67,8 @@
 
   public static class Field extends AttributedCharacterIterator.Attribute
   {
+    static final long serialVersionUID = 276966692217360283L;
+   
     public Field(String name)
     {
       super(name);
Index: kaffe/libraries/javalib/java/text/MessageFormat.java
diff -u kaffe/libraries/javalib/java/text/MessageFormat.java:1.18 kaffe/libraries/javalib/java/text/MessageFormat.java:1.19
--- kaffe/libraries/javalib/java/text/MessageFormat.java:1.18	Mon Aug 25 06:14:48 2003
+++ kaffe/libraries/javalib/java/text/MessageFormat.java	Tue Aug 26 15:03:10 2003
@@ -149,6 +149,8 @@
 
   public static class Field extends Format.Field
   {
+    static final long serialVersionUID = 7899943957617360810L;
+
     /**
      * This is the attribute set for all characters produced
      * by MessageFormat during a formatting.
Index: kaffe/libraries/javalib/java/text/NumberFormat.java
diff -u kaffe/libraries/javalib/java/text/NumberFormat.java:1.16 kaffe/libraries/javalib/java/text/NumberFormat.java:1.17
--- kaffe/libraries/javalib/java/text/NumberFormat.java:1.16	Mon Aug 25 06:14:48 2003
+++ kaffe/libraries/javalib/java/text/NumberFormat.java	Tue Aug 26 15:03:10 2003
@@ -82,6 +82,8 @@
 
   public static class Field extends Format.Field
   {
+    static final long serialVersionUID = 7494728892700160890L;
+
     /**
      * Attribute set to all characters containing digits of the integer
      * part.
Index: kaffe/libraries/javalib/java/text/RuleBasedCollator.java
diff -u kaffe/libraries/javalib/java/text/RuleBasedCollator.java:1.13 kaffe/libraries/javalib/java/text/RuleBasedCollator.java:1.14
--- kaffe/libraries/javalib/java/text/RuleBasedCollator.java:1.13	Mon Aug 25 06:14:48 2003
+++ kaffe/libraries/javalib/java/text/RuleBasedCollator.java	Tue Aug 26 15:03:10 2003
@@ -196,8 +196,7 @@
     static final int RESET = 4;
     static final int IGNORE = 5;
     static final int INVERSE_SECONDARY = 6;
-    static final int NEW_SEQUENCE = 7; /* For expansion */
-
+    
     int comparisonType;
     String textElement;
     int hashText;