2004-05-05 Guilhem Lavaux <guilhem@kaffe.org>
authorGuilhem Lavaux <guilhem@kaffe.org>
Tue, 4 May 2004 22:14:12 +0000 (22:14 +0000)
committerMichael Koch <mkoch@gcc.gnu.org>
Tue, 4 May 2004 22:14:12 +0000 (22:14 +0000)
* java/text/SimpleDateFormat.java:
(formatWithAttribute): New method. It implements
the formatting process with attributes.
(format): Use formatWithAttribute.
(formatToCharacterIterator): New method. Use
formatWithAttribute.

From-SVN: r81493

libjava/ChangeLog
libjava/java/text/SimpleDateFormat.java

index ad5a349306a974f8a37b2f1685f3128323f10323..3e419de7c668b962f30e649942251b9a451562b8 100644 (file)
@@ -1,3 +1,12 @@
+2004-05-05  Guilhem Lavaux <guilhem@kaffe.org>
+
+       * java/text/SimpleDateFormat.java:
+       (formatWithAttribute): New method. It implements
+       the formatting process with attributes.
+       (format): Use formatWithAttribute.
+       (formatToCharacterIterator): New method. Use
+       formatWithAttribute.
+
 2004-05-05  Guilhem Lavaux <guilhem@kaffe.org>
 
        * java/text/MessageFormat.java:
index 69ce391db8d19e09e32847b649811e067350478e..5f3614eefcf287a51d287c32e9466b9a081d90c7 100644 (file)
@@ -39,16 +39,21 @@ exception statement from your version. */
 
 package java.text;
 
+import gnu.java.text.AttributedFormatBuffer;
+import gnu.java.text.FormatBuffer;
+import gnu.java.text.FormatCharacterIterator;
+import gnu.java.text.StringFormatBuffer;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.Iterator;
 import java.util.Locale;
-import java.util.TimeZone;
 import java.util.SimpleTimeZone;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.TimeZone;
 
 /**
  * SimpleDateFormat provides convenient methods for parsing and formatting
@@ -82,7 +87,7 @@ public class SimpleDateFormat extends DateFormat
   // This string is specified in the JCL.  We set it here rather than
   // do a DateFormatSymbols(Locale.US).getLocalPatternChars() since
   // someone could theoretically change those values (though unlikely).
-  private static final String standardChars = "GyMdkHmsSEDFwWahKz";
+  private static final String standardChars = "GyMdkHmsSEDFwWahKzZ";
 
   private void readObject(ObjectInputStream stream)
     throws IOException, ClassNotFoundException
@@ -411,109 +416,164 @@ public class SimpleDateFormat extends DateFormat
    * appending to the specified StringBuffer.  The input StringBuffer
    * is returned as output for convenience.
    */
-  public StringBuffer format(Date date, StringBuffer buffer, FieldPosition pos)
+  final private void formatWithAttribute(Date date, FormatBuffer buffer, FieldPosition pos)
   {
     String temp;
+    AttributedCharacterIterator.Attribute attribute;
     calendar.setTime(date);
-    
-    // go through ArrayList, filling in fields where applicable, else toString
-    Iterator i = tokens.iterator();
-    while (i.hasNext()) {
-      Object o = i.next();
-      if (o instanceof FieldSizePair) {
-       FieldSizePair p = (FieldSizePair) o;
-       int beginIndex = buffer.length();
-       switch (p.field) {
-       case ERA_FIELD:
-         buffer.append(formatData.eras[calendar.get(Calendar.ERA)]);
-         break;
-       case YEAR_FIELD:
-         // If we have two digits, then we truncate.  Otherwise, we
-         // use the size of the pattern, and zero pad.
-         if (p.size == 2)
-           {
-             temp = String.valueOf(calendar.get(Calendar.YEAR));
-             buffer.append(temp.substring(temp.length() - 2));
-           }
-         else
-           withLeadingZeros(calendar.get(Calendar.YEAR), p.size, buffer);
-         break;
-       case MONTH_FIELD:
-         if (p.size < 3)
-           withLeadingZeros(calendar.get(Calendar.MONTH)+1,p.size,buffer);
-         else if (p.size < 4)
-           buffer.append(formatData.shortMonths[calendar.get(Calendar.MONTH)]);
-         else
-           buffer.append(formatData.months[calendar.get(Calendar.MONTH)]);
-         break;
-       case DATE_FIELD:
-         withLeadingZeros(calendar.get(Calendar.DATE),p.size,buffer);
-         break;
-       case HOUR_OF_DAY1_FIELD: // 1-24
-         withLeadingZeros(((calendar.get(Calendar.HOUR_OF_DAY)+23)%24)+1,p.size,buffer);
-         break;
-       case HOUR_OF_DAY0_FIELD: // 0-23
-         withLeadingZeros(calendar.get(Calendar.HOUR_OF_DAY),p.size,buffer);
-         break;
-       case MINUTE_FIELD:
-         withLeadingZeros(calendar.get(Calendar.MINUTE),p.size,buffer);
-         break;
-       case SECOND_FIELD:
-         withLeadingZeros(calendar.get(Calendar.SECOND),p.size,buffer);
-         break;
-       case MILLISECOND_FIELD:
-         withLeadingZeros(calendar.get(Calendar.MILLISECOND),p.size,buffer);
-         break;
-       case DAY_OF_WEEK_FIELD:
-         if (p.size < 4)
-           buffer.append(formatData.shortWeekdays[calendar.get(Calendar.DAY_OF_WEEK)]);
-         else
-           buffer.append(formatData.weekdays[calendar.get(Calendar.DAY_OF_WEEK)]);
-         break;
-       case DAY_OF_YEAR_FIELD:
-         withLeadingZeros(calendar.get(Calendar.DAY_OF_YEAR),p.size,buffer);
-         break;
-       case DAY_OF_WEEK_IN_MONTH_FIELD:
-         withLeadingZeros(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH),p.size,buffer);
-         break;
-       case WEEK_OF_YEAR_FIELD:
-         withLeadingZeros(calendar.get(Calendar.WEEK_OF_YEAR),p.size,buffer);
-         break;
-       case WEEK_OF_MONTH_FIELD:
-         withLeadingZeros(calendar.get(Calendar.WEEK_OF_MONTH),p.size,buffer);
-         break;
-       case AM_PM_FIELD:
-         buffer.append(formatData.ampms[calendar.get(Calendar.AM_PM)]);
-         break;
-       case HOUR1_FIELD: // 1-12
-         withLeadingZeros(((calendar.get(Calendar.HOUR)+11)%12)+1,p.size,buffer);
-         break;
-       case HOUR0_FIELD: // 0-11
-         withLeadingZeros(calendar.get(Calendar.HOUR),p.size,buffer);
-         break;
-       case TIMEZONE_FIELD:
-         TimeZone zone = calendar.getTimeZone();
-         boolean isDST = calendar.get(Calendar.DST_OFFSET) != 0;
-         // FIXME: XXX: This should be a localized time zone.
-         String zoneID = zone.getDisplayName(isDST, p.size > 3 ? TimeZone.LONG : TimeZone.SHORT);
-         buffer.append(zoneID);
-         break;
-       default:
-         throw new IllegalArgumentException("Illegal pattern character");
-       }
-       if (pos != null && p.field == pos.getField())
+
+    // go through vector, filling in fields where applicable, else toString
+    Iterator iter = tokens.iterator();
+    while (iter.hasNext())
+      {
+       Object o = iter.next();
+       if (o instanceof FieldSizePair)
          {
-           pos.setBeginIndex(beginIndex);
-           pos.setEndIndex(buffer.length());
-         }
-      } else {
-       buffer.append(o.toString());
+           FieldSizePair p = (FieldSizePair) o;
+           int beginIndex = buffer.length();
+           
+           switch (p.field)
+             {
+             case ERA_FIELD:
+               buffer.append (formatData.eras[calendar.get (Calendar.ERA)], DateFormat.Field.ERA);
+               break;
+             case YEAR_FIELD:
+               // If we have two digits, then we truncate.  Otherwise, we
+               // use the size of the pattern, and zero pad.
+               buffer.setDefaultAttribute (DateFormat.Field.YEAR);
+               if (p.size == 2)
+                 {
+                   temp = String.valueOf (calendar.get (Calendar.YEAR));
+                   buffer.append (temp.substring (temp.length() - 2));
+                 }
+               else
+                 withLeadingZeros (calendar.get (Calendar.YEAR), p.size, buffer);
+               break;
+             case MONTH_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.MONTH);
+               if (p.size < 3)
+                 withLeadingZeros (calendar.get (Calendar.MONTH) + 1, p.size, buffer);
+               else if (p.size < 4)
+                 buffer.append (formatData.shortMonths[calendar.get (Calendar.MONTH)]);
+               else
+                 buffer.append (formatData.months[calendar.get (Calendar.MONTH)]);
+               break;
+             case DATE_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.DAY_OF_MONTH);
+               withLeadingZeros (calendar.get (Calendar.DATE), p.size, buffer);
+               break;
+             case HOUR_OF_DAY1_FIELD: // 1-24
+               buffer.setDefaultAttribute(DateFormat.Field.HOUR_OF_DAY1);
+               withLeadingZeros ( ((calendar.get (Calendar.HOUR_OF_DAY) + 23) % 24) + 1, 
+                                  p.size, buffer);
+               break;
+             case HOUR_OF_DAY0_FIELD: // 0-23
+               buffer.setDefaultAttribute (DateFormat.Field.HOUR_OF_DAY0);
+               withLeadingZeros (calendar.get (Calendar.HOUR_OF_DAY), p.size, buffer);
+               break;
+             case MINUTE_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.MINUTE);
+               withLeadingZeros (calendar.get (Calendar.MINUTE),
+                                 p.size, buffer);
+               break;
+             case SECOND_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.SECOND);
+               withLeadingZeros(calendar.get (Calendar.SECOND), 
+                                p.size, buffer);
+               break;
+             case MILLISECOND_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.MILLISECOND);
+               withLeadingZeros (calendar.get (Calendar.MILLISECOND), p.size, buffer);
+               break;
+             case DAY_OF_WEEK_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.DAY_OF_WEEK);
+               if (p.size < 4)
+                 buffer.append (formatData.shortWeekdays[calendar.get (Calendar.DAY_OF_WEEK)]);
+               else
+                 buffer.append (formatData.weekdays[calendar.get (Calendar.DAY_OF_WEEK)]);
+               break;
+             case DAY_OF_YEAR_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.DAY_OF_YEAR);
+               withLeadingZeros (calendar.get (Calendar.DAY_OF_YEAR), p.size, buffer);
+               break;
+             case DAY_OF_WEEK_IN_MONTH_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.DAY_OF_WEEK_IN_MONTH);
+               withLeadingZeros (calendar.get (Calendar.DAY_OF_WEEK_IN_MONTH), 
+                                p.size, buffer);
+               break;
+             case WEEK_OF_YEAR_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.WEEK_OF_YEAR);
+               withLeadingZeros (calendar.get (Calendar.WEEK_OF_YEAR),
+                                 p.size, buffer);
+               break;
+             case WEEK_OF_MONTH_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.WEEK_OF_MONTH);
+               withLeadingZeros (calendar.get (Calendar.WEEK_OF_MONTH),
+                                 p.size, buffer);
+               break;
+             case AM_PM_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.AM_PM);
+               buffer.append (formatData.ampms[calendar.get (Calendar.AM_PM)]);
+               break;
+             case HOUR1_FIELD: // 1-12
+               buffer.setDefaultAttribute (DateFormat.Field.HOUR1);
+               withLeadingZeros (((calendar.get (Calendar.HOUR) + 11) % 12) + 1, p.size, buffer);
+               break;
+             case HOUR0_FIELD: // 0-11
+               buffer.setDefaultAttribute (DateFormat.Field.HOUR0);
+               withLeadingZeros (calendar.get (Calendar.HOUR), p.size, buffer);
+               break;
+             case TIMEZONE_FIELD:
+               buffer.setDefaultAttribute (DateFormat.Field.TIME_ZONE);
+               TimeZone zone = calendar.getTimeZone();
+               boolean isDST = calendar.get (Calendar.DST_OFFSET) != 0;
+               // FIXME: XXX: This should be a localized time zone.
+               String zoneID = zone.getDisplayName (isDST, p.size > 3 ? TimeZone.LONG : TimeZone.SHORT);
+               buffer.append (zoneID);
+               break;
+             default:
+               throw new IllegalArgumentException ("Illegal pattern character " + p.field);
+             }
+           if (pos != null && (buffer.getDefaultAttribute() == pos.getFieldAttribute()
+                               || p.field == pos.getField()))
+             {
+               pos.setBeginIndex(beginIndex);
+               pos.setEndIndex(buffer.length());
+             }
+         } 
+      else
+       {  
+         buffer.append(o.toString(), null);
+       }
       }
-    }
+  }
+  
+  public StringBuffer format(Date date, StringBuffer buffer, FieldPosition pos)
+  {
+    formatWithAttribute(date, new StringFormatBuffer (buffer), pos);
+
     return buffer;
   }
 
-  private void withLeadingZeros(int value, int length, StringBuffer buffer) 
+  public AttributedCharacterIterator formatToCharacterIterator(Object date)
+    throws IllegalArgumentException
+  {
+    if (date == null)
+      throw new NullPointerException("null argument");
+    if (!(date instanceof Date))
+      throw new IllegalArgumentException("argument should be an instance of java.util.Date");
+
+    AttributedFormatBuffer buf = new AttributedFormatBuffer();
+    formatWithAttribute((Date)date, buf,
+                       null);
+    buf.sync();
+        
+    return new FormatCharacterIterator(buf.getBuffer().toString(),
+                                      buf.getRanges(),
+                                      buf.getAttributes());
+  }
+
+  private void withLeadingZeros(int value, int length, FormatBuffer buffer) 
   {
     String valStr = String.valueOf(value);
     for (length -= valStr.length(); length > 0; length--)