classpath
[Top][All Lists]
Advanced

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

java.text.SimpleDateFormat


From: Guilhem Lavaux
Subject: java.text.SimpleDateFormat
Date: Sun, 11 Apr 2004 09:14:37 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030630

Hi,

Here is patch to implement attributes in SimpleDateFormat.

ChangeLog entry:

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

        * java/text/SimpleDateFormat.java:
        (formatWithAttribute): New method. It implements
        the formatting process with attributes.
        (format): Use formatWithAttribute.
        (formatToCharacterIterator): New method. Use
        formatWithAttribute.

Cheers,

Guilhem.
Index: java/text/SimpleDateFormat.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/text/SimpleDateFormat.java,v
retrieving revision 1.25
diff -u -b -B -r1.25 SimpleDateFormat.java
--- java/text/SimpleDateFormat.java     28 Nov 2003 23:33:06 -0000      1.25
+++ java/text/SimpleDateFormat.java     10 Apr 2004 17:07:21 -0000
@@ -39,16 +39,21 @@
 
 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
@@ -411,109 +416,164 @@
    * 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) {
+    // 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)
+         {
        FieldSizePair p = (FieldSizePair) o;
        int beginIndex = buffer.length();
-       switch (p.field) {
+           
+           switch (p.field)
+             {
        case ERA_FIELD:
-         buffer.append(formatData.eras[calendar.get(Calendar.ERA)]);
+               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));
+                   temp = String.valueOf (calendar.get (Calendar.YEAR));
+                   buffer.append (temp.substring (temp.length() - 2));
            }
          else
-           withLeadingZeros(calendar.get(Calendar.YEAR), p.size, buffer);
+                 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);
+                 withLeadingZeros (calendar.get (Calendar.MONTH) + 1, p.size, 
buffer);
          else if (p.size < 4)
-           buffer.append(formatData.shortMonths[calendar.get(Calendar.MONTH)]);
+                 buffer.append (formatData.shortMonths[calendar.get 
(Calendar.MONTH)]);
          else
-           buffer.append(formatData.months[calendar.get(Calendar.MONTH)]);
+                 buffer.append (formatData.months[calendar.get 
(Calendar.MONTH)]);
          break;
        case DATE_FIELD:
-         withLeadingZeros(calendar.get(Calendar.DATE),p.size,buffer);
+               buffer.setDefaultAttribute (DateFormat.Field.DAY_OF_MONTH);
+               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);
+               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
-         withLeadingZeros(calendar.get(Calendar.HOUR_OF_DAY),p.size,buffer);
+               buffer.setDefaultAttribute (DateFormat.Field.HOUR_OF_DAY0);
+               withLeadingZeros (calendar.get (Calendar.HOUR_OF_DAY), p.size, 
buffer);
          break;
        case MINUTE_FIELD:
-         withLeadingZeros(calendar.get(Calendar.MINUTE),p.size,buffer);
+               buffer.setDefaultAttribute (DateFormat.Field.MINUTE);
+               withLeadingZeros (calendar.get (Calendar.MINUTE),
+                                 p.size, buffer);
          break;
        case SECOND_FIELD:
-         withLeadingZeros(calendar.get(Calendar.SECOND),p.size,buffer);
+               buffer.setDefaultAttribute (DateFormat.Field.SECOND);
+               withLeadingZeros(calendar.get (Calendar.SECOND), 
+                                p.size, buffer);
          break;
        case MILLISECOND_FIELD:
-         withLeadingZeros(calendar.get(Calendar.MILLISECOND),p.size,buffer);
+               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)]);
+                 buffer.append (formatData.shortWeekdays[calendar.get 
(Calendar.DAY_OF_WEEK)]);
          else
-           
buffer.append(formatData.weekdays[calendar.get(Calendar.DAY_OF_WEEK)]);
+                 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);
+               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:
-         
withLeadingZeros(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH),p.size,buffer);
+               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:
-         withLeadingZeros(calendar.get(Calendar.WEEK_OF_YEAR),p.size,buffer);
+               buffer.setDefaultAttribute (DateFormat.Field.WEEK_OF_YEAR);
+               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);
+               buffer.setDefaultAttribute (DateFormat.Field.WEEK_OF_MONTH);
+               withLeadingZeros (calendar.get (Calendar.WEEK_OF_MONTH),
+                                 p.size, buffer);
          break;
        case AM_PM_FIELD:
-         buffer.append(formatData.ampms[calendar.get(Calendar.AM_PM)]);
+               buffer.setDefaultAttribute (DateFormat.Field.AM_PM);
+               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);
+               buffer.setDefaultAttribute (DateFormat.Field.HOUR1);
+               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);
+               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;
+               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);
+               String zoneID = zone.getDisplayName (isDST, p.size > 3 ? 
TimeZone.LONG : TimeZone.SHORT);
+               buffer.append (zoneID);
          break;
        default:
-         throw new IllegalArgumentException("Illegal pattern character");
+               throw new IllegalArgumentException ("Illegal pattern character 
" + p.field);
        }
-       if (pos != null && p.field == pos.getField())
+           if (pos != null && (buffer.getDefaultAttribute() == 
pos.getFieldAttribute()
+                               || p.field == pos.getField()))
          {
            pos.setBeginIndex(beginIndex);
            pos.setEndIndex(buffer.length());
          }
-      } else {
-       buffer.append(o.toString());
+         } 
+      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--)

Attachment: pgp4JIgnKQkKQ.pgp
Description: PGP signature


reply via email to

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