diff --git a/icu4j/src/com/ibm/icu/dev/test/calendar/CalendarTest.java b/icu4j/src/com/ibm/icu/dev/test/calendar/CalendarTest.java index df2e3d61c0e..4cd94399605 100755 --- a/icu4j/src/com/ibm/icu/dev/test/calendar/CalendarTest.java +++ b/icu4j/src/com/ibm/icu/dev/test/calendar/CalendarTest.java @@ -5,8 +5,8 @@ ******************************************************************************* * * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/calendar/CalendarTest.java,v $ - * $Date: 2000/10/17 18:32:50 $ - * $Revision: 1.5 $ + * $Date: 2000/10/17 20:55:09 $ + * $Revision: 1.6 $ * ***************************************************************************************** */ @@ -62,8 +62,7 @@ public class CalendarTest extends TestFmwk { cal.setTimeZone(UTC); // Get a format to use for printing dates in the calendar system we're testing - // TODO: This is kind of ugly right now . - DateFormat format = Calendar.getDateTimeFormat(cal, DateFormat.SHORT, -1, Locale.getDefault()); + DateFormat format = DateFormat.getDateTimeInstance(cal, DateFormat.SHORT, -1, Locale.getDefault()); ((SimpleDateFormat)format).applyPattern(pattern); DateFormat testFmt = (DateFormat)format.clone(); diff --git a/icu4j/src/com/ibm/icu/text/DateFormat.java b/icu4j/src/com/ibm/icu/text/DateFormat.java index d5d5d3be24b..a42cd43859b 100755 --- a/icu4j/src/com/ibm/icu/text/DateFormat.java +++ b/icu4j/src/com/ibm/icu/text/DateFormat.java @@ -669,4 +669,108 @@ public abstract class DateFormat extends Format { * Create a new date format. */ protected DateFormat() {} + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + //------------------------------------------------------------------------- + // Public static interface for creating custon DateFormats for different + // types of Calendars. + //------------------------------------------------------------------------- + + /** + * Create a {@link DateFormat} object that can be used to format dates in + * the calendar system specified by cal. + *

+ * @param cal The calendar system for which a date format is desired. + * + * @param dateStyle The type of date format desired. This can be + * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, + * etc. + * + * @param locale The locale for which the date format is desired. + */ + static public DateFormat getDateInstance(Calendar cal, int dateStyle, Locale locale) + { + return getDateTimeInstance(cal, locale, dateStyle, -1); + } + + /** + * Create a {@link DateFormat} object that can be used to format times in + * the calendar system specified by cal. + *

+ * Note: When this functionality is moved into the core JDK, this method + * will probably be replaced by a new overload of {@link DateFormat#getInstance}. + *

+ * @param cal The calendar system for which a time format is desired. + * + * @param timeStyle The type of time format desired. This can be + * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, + * etc. + * + * @param locale The locale for which the time format is desired. + * + * @see DateFormat#getTimeInstance + */ + static public DateFormat getTimeInstance(Calendar cal, int timeStyle, Locale locale) + { + return getDateTimeInstance(cal, locale, -1, timeStyle); + } + + /** + * Create a {@link DateFormat} object that can be used to format dates and times in + * the calendar system specified by cal. + *

+ * Note: When this functionality is moved into the core JDK, this method + * will probably be replaced by a new overload of {@link DateFormat#getInstance}. + *

+ * @param cal The calendar system for which a date/time format is desired. + * + * @param dateStyle The type of date format desired. This can be + * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, + * etc. + * + * @param timeStyle The type of time format desired. This can be + * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, + * etc. + * + * @param locale The locale for which the date/time format is desired. + * + * @see DateFormat#getDateTimeInstance + */ + static public DateFormat getDateTimeInstance(Calendar cal, int dateStyle, + int timeStyle, Locale locale) + { + return getDateTimeInstance(cal, locale, dateStyle, timeStyle); + } + + /** + * Private utility method to retrive a date and/or time format + * for the specified calendar and locale. This method has knowledge of + * (and is partly copied from) the corresponding code in SimpleDateFormat, + * but it knows how to find the right resource bundle based on the calendar class. + *

+ * @param cal The calendar system whose date/time format is desired. + * + * @param timeStyle The type of time format desired. This can be + * DateFormat.SHORT, etc, or -1 if the time + * of day should not be included in the format. + * + * @param dateStyle The type of date format desired. This can be + * DateFormat.SHORT, etc, or -1 if the date + * should not be included in the format. + * + * @param loc The locale for which the date/time format is desired. + * + * @see DateFormat#getDateTimeInstance + */ + static private DateFormat getDateTimeInstance(Calendar cal, Locale loc, + int dateStyle, int timeStyle) + { + //if (cal instanceof com.ibm.util.Calendar) { + // return ((com.ibm.util.Calendar)cal).getDateTimeFormat(dateStyle,timeStyle,loc); + //} else { + // return formatHelper(cal, loc, dateStyle, timeStyle); + //} + return cal.getDateTimeFormat(dateStyle,timeStyle,loc); + } } diff --git a/icu4j/src/com/ibm/icu/text/DateFormatSymbols.java b/icu4j/src/com/ibm/icu/text/DateFormatSymbols.java index 36ab75b87db..b0761c81563 100755 --- a/icu4j/src/com/ibm/icu/text/DateFormatSymbols.java +++ b/icu4j/src/com/ibm/icu/text/DateFormatSymbols.java @@ -5,8 +5,8 @@ ******************************************************************************* * * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/text/DateFormatSymbols.java,v $ - * $Date: 2000/05/26 22:31:43 $ - * $Revision: 1.5 $ + * $Date: 2000/10/17 20:54:59 $ + * $Revision: 1.6 $ * ***************************************************************************************** */ @@ -21,6 +21,9 @@ import java.util.Vector; import java.util.Enumeration; import java.text.resources.DateFormatZoneData; import com.ibm.util.Utility; +import com.ibm.util.Calendar; +import com.ibm.util.GregorianCalendar; +import java.util.MissingResourceException; /** * DateFormatSymbols is a public class for encapsulating @@ -601,4 +604,179 @@ public class DateFormatSymbols implements Serializable, Cloneable { return true; } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + /** + * Get the {@link DateFormatSymbols} object that should be used to format a + * calendar system's dates in the given locale. + *

+ * Subclassing:
+ * When creating a new Calendar subclass, you must create the + * {@link ResourceBundle ResourceBundle} + * containing its {@link DateFormatSymbols DateFormatSymbols} in a specific place. + * The resource bundle name is based on the calendar's fully-specified + * class name, with ".resources" inserted at the end of the package name + * (just before the class name) and "Symbols" appended to the end. + * For example, the bundle corresponding to "com.ibm.util.HebrewCalendar" + * is "com.ibm.util.resources.HebrewCalendarSymbols". + *

+ * Within the ResourceBundle, this method searches for five keys: + *

+ *

+ * @param cal The calendar system whose date format symbols are desired. + * @param locale The locale whose symbols are desired. + * + * @see DateFormatSymbols#DateFormatSymbols(java.util.Locale) + */ + public DateFormatSymbols(Calendar cal, Locale locale) { + this(locale); // old-style construction + if (cal != null) { + ResourceBundle bundle = null; + try { + bundle = getDateFormatBundle(cal, locale); + } catch (MissingResourceException e) { + if (!(cal instanceof GregorianCalendar)) { + // Ok for symbols to be missing for a Gregorian calendar, but + // not for any other type. + throw e; + } + } + constructCalendarSpecific(bundle); + } + } + + /** + * Fetch a custom calendar's DateFormatSymbols out of the given resource + * bundle. Symbols that are not overridden are inherited from the + * default DateFormatSymbols for the locale. + * @see DateFormatSymbols#DateFormatSymbols + */ + public DateFormatSymbols(ResourceBundle bundle, Locale locale) { + // Get the default symbols for the locale, since most + // calendars will only need to override month names and will + // want everything else the same + this(locale); // old-style construction + constructCalendarSpecific(bundle); + } + + private void constructCalendarSpecific(ResourceBundle bundle) { + + // Fetch the day names from the resource bundle. If they're not found, + // it's ok; we'll just use the default ones. + // Allow a null ResourceBundle just for the sake of completeness; + // this is useful for calendars that don't have any overridden symbols + + if (bundle != null) { + try { + String[] temp = bundle.getStringArray("DayNames"); + setWeekdays(temp); + setShortWeekdays(temp); + + temp = bundle.getStringArray("DayAbbreviations"); + setShortWeekdays( temp ); + } catch (MissingResourceException e) {} + + try { + String[] temp = bundle.getStringArray("MonthNames"); + setMonths( temp ); + setShortMonths( temp ); + + temp = bundle.getStringArray("MonthAbbreviations"); + setShortMonths( temp ); + } catch (MissingResourceException e) {} + + try { + String[] temp = bundle.getStringArray("Eras"); + setEras( temp ); + } catch (MissingResourceException e) {} + } + } + +//~ private static final java.text.DateFormatSymbols oldStyleSymbols(DateFormatSymbols syms, Locale loc) { +//~ java.text.DateFormatSymbols result = new java.text.DateFormatSymbols(loc); +//~ result.setAmPmStrings(syms.getAmPmStrings()); +//~ result.setEras(syms.getEras()); +//~ result.setLocalPatternChars(syms.getLocalPatternChars()); +//~ result.setMonths(syms.getMonths()); +//~ result.setShortMonths(syms.getShortMonths()); +//~ result.setShortWeekdays(syms.getShortWeekdays()); +//~ result.setWeekdays(syms.getWeekdays()); +//~ result.setZoneStrings(syms.getZoneStrings()); +//~ return result; +//~ } + + /** + * Find the ResourceBundle containing the date format information for + * a specified calendar subclass in a given locale. + *

+ * The resource bundle name is based on the calendar's fully-specified + * class name, with ".resources" inserted at the end of the package name + * (just before the class name) and "Symbols" appended to the end. + * For example, the bundle corresponding to "com.ibm.util.HebrewCalendar" + * is "com.ibm.util.resources.HebrewCalendarSymbols". + */ + static public ResourceBundle getDateFormatBundle(Calendar cal, Locale locale) + throws MissingResourceException { + + // Find the calendar's class name, which we're going to use to construct the + // resource bundle name. + String fullName = cal.getClass().getName(); + int lastDot = fullName.lastIndexOf('.'); + String className = fullName.substring(lastDot+1); + + // The name of the ResourceBundle itself is the calendar's fully-qualified + // name, with ".resources" inserted in the package and "Symbols" appended + String bundleName = fullName.substring(0, lastDot+1) + "resources." + + className + "Symbols"; + + ResourceBundle result = null; + try { + result = ResourceBundle.getBundle(bundleName, locale); + } + catch (MissingResourceException e) { + if (!(cal instanceof GregorianCalendar)) { + // Ok for symbols to be missing for a Gregorian calendar, but + // not for any other type. + throw e; + } + } + return result; + } } diff --git a/icu4j/src/com/ibm/icu/util/Calendar.java b/icu4j/src/com/ibm/icu/util/Calendar.java index 7a8bf07801e..4b97799c44a 100755 --- a/icu4j/src/com/ibm/icu/util/Calendar.java +++ b/icu4j/src/com/ibm/icu/util/Calendar.java @@ -364,7 +364,7 @@ import com.ibm.text.SimpleDateFormat; * @see GregorianCalendar * @see TimeZone * @see DateFormat - * @version $Revision: 1.8 $ $Date: 2000/10/17 18:26:44 $ + * @version $Revision: 1.9 $ $Date: 2000/10/17 20:54:49 $ * @author Mark Davis, David Goldsmith, Chen-Lieh Huang, Alan Liu, Laura Werner * @since JDK1.1 */ @@ -2006,250 +2006,10 @@ public abstract class Calendar implements Serializable, Cloneable { } //------------------------------------------------------------------------- - // Public static interface for creating custon DateFormats for different - // types of Calendars. + // Interface for creating custon DateFormats for different types of Calendars //------------------------------------------------------------------------- - - /** - * Create a {@link DateFormat} object that can be used to format dates in - * the calendar system specified by cal. - *

- * Note: When this functionality is moved into the core JDK, this method - * will probably be replaced by a new overload of {@link DateFormat#getInstance}. - *

- * @param cal The calendar system for which a date format is desired. - * - * @param dateStyle The type of date format desired. This can be - * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, - * etc. - * - * @param locale The locale for which the date format is desired. - * - * @see DateFormat#getDateInstance - */ - static public DateFormat getDateFormat(Calendar cal, int dateStyle, Locale locale) - { - return getDateTimeFormat(cal, locale, dateStyle, -1); - } - - /** - * Create a {@link DateFormat} object that can be used to format times in - * the calendar system specified by cal. - *

- * Note: When this functionality is moved into the core JDK, this method - * will probably be replaced by a new overload of {@link DateFormat#getInstance}. - *

- * @param cal The calendar system for which a time format is desired. - * - * @param timeStyle The type of time format desired. This can be - * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, - * etc. - * - * @param locale The locale for which the time format is desired. - * - * @see DateFormat#getTimeInstance - */ - static public DateFormat getTimeFormat(Calendar cal, int timeStyle, Locale locale) - { - return getDateTimeFormat(cal, locale, -1, timeStyle); - } - - /** - * Create a {@link DateFormat} object that can be used to format dates and times in - * the calendar system specified by cal. - *

- * Note: When this functionality is moved into the core JDK, this method - * will probably be replaced by a new overload of {@link DateFormat#getInstance}. - *

- * @param cal The calendar system for which a date/time format is desired. - * - * @param dateStyle The type of date format desired. This can be - * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, - * etc. - * - * @param timeStyle The type of time format desired. This can be - * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, - * etc. - * - * @param locale The locale for which the date/time format is desired. - * - * @see DateFormat#getDateTimeInstance - */ - static public DateFormat getDateTimeFormat(Calendar cal, int dateStyle, - int timeStyle, Locale locale) - { - return getDateTimeFormat(cal, locale, dateStyle, timeStyle); - } - /** - * Get the {@link DateFormatSymbols} object that should be used to format a - * calendar system's dates in the given locale. - *

- * Note: When this functionality is moved into the core JDK, this method - * will probably be replace by a new constructor on DateFormatSymbols. - *

- * Subclassing:
- * When creating a new Calendar subclass, you must create the - * {@link ResourceBundle ResourceBundle} - * containing its {@link DateFormatSymbols DateFormatSymbols} in a specific place. - * The resource bundle name is based on the calendar's fully-specified - * class name, with ".resources" inserted at the end of the package name - * (just before the class name) and "Symbols" appended to the end. - * For example, the bundle corresponding to "com.ibm.util.HebrewCalendar" - * is "com.ibm.util.resources.HebrewCalendarSymbols". - *

- * Within the ResourceBundle, this method searches for five keys: - *

- *

- * @param cal The calendar system whose date format symbols are desired. - * @param locale The locale whose symbols are desired. - * - * @see DateFormatSymbols#DateFormatSymbols(java.util.Locale) - */ - static public DateFormatSymbols getDateFormatSymbols(Calendar cal, - Locale locale) - { - ResourceBundle bundle = null; - try { - bundle = getDateFormatBundle(cal, locale); - } - catch (MissingResourceException e) { - if (!(cal instanceof GregorianCalendar)) { - // Ok for symbols to be missing for a Gregorian calendar, but - // not for any other type. - throw e; - } - } - return getDateFormatSymbols(null, bundle, locale); - } - - /** - * Fetch a custom calendar's DateFormatSymbols out of the given resource - * bundle. Symbols that are not overridden are inherited from the - * default DateFormatSymbols for the locale. - * @see DateFormatSymbols#DateFormatSymbols - */ - static protected DateFormatSymbols getDateFormatSymbols(DateFormatSymbols result, - ResourceBundle bundle, - Locale locale) - { - // Get the default symbols for the locale, since most calendars will only - // need to override month names and will want everything else the same - if (result == null) { - result = new DateFormatSymbols(locale); - } - - // - // Fetch the day names from the resource bundle. If they're not found, - // it's ok; we'll just use the default ones. - // Allow a null ResourceBundle just for the sake of completeness; - // this is useful for calendars that don't have any overridden symbols - // - if (bundle != null) { - try { - String[] temp = bundle.getStringArray("DayNames"); - result.setWeekdays(temp); - result.setShortWeekdays(temp); - - temp = bundle.getStringArray("DayAbbreviations"); - result.setShortWeekdays( temp ); - } - catch (MissingResourceException e) { - } - - try { - String[] temp = bundle.getStringArray("MonthNames"); - result.setMonths( temp ); - result.setShortMonths( temp ); - - temp = bundle.getStringArray("MonthAbbreviations"); - result.setShortMonths( temp ); - } - catch (MissingResourceException e) { - } - - try { - String[] temp = bundle.getStringArray("Eras"); - result.setEras( temp ); - } - catch (MissingResourceException e) { - } - } - return result; - } - - protected DateFormatSymbols getDateFormatSymbols(Locale locale) { - return getDateFormatSymbols(null, getDateFormatBundle(this, locale), locale); - } - - /** - * Private utility method to retrive a date and/or time format - * for the specified calendar and locale. This method has knowledge of - * (and is partly copied from) the corresponding code in SimpleDateFormat, - * but it knows how to find the right resource bundle based on the calendar class. - *

- * @param cal The calendar system whose date/time format is desired. - * - * @param timeStyle The type of time format desired. This can be - * DateFormat.SHORT, etc, or -1 if the time - * of day should not be included in the format. - * - * @param dateStyle The type of date format desired. This can be - * DateFormat.SHORT, etc, or -1 if the date - * should not be included in the format. - * - * @param loc The locale for which the date/time format is desired. - * - * @see DateFormat#getDateTimeInstance - */ - static private DateFormat getDateTimeFormat(Calendar cal, Locale loc, - int dateStyle, int timeStyle) - { - //if (cal instanceof com.ibm.util.Calendar) { - return ((com.ibm.util.Calendar)cal).getDateTimeFormat(dateStyle,timeStyle,loc); - //} else { - // return formatHelper(cal, loc, dateStyle, timeStyle); - //} - } - - protected DateFormat getDateTimeFormat(int dateStyle, int timeStyle, Locale loc) { + public DateFormat getDateTimeFormat(int dateStyle, int timeStyle, Locale loc) { return formatHelper(this, loc, dateStyle, timeStyle); } @@ -2261,15 +2021,16 @@ public abstract class Calendar implements Serializable, Cloneable { DateFormat result = null; DateFormatSymbols symbols = null; - ResourceBundle bundle = getDateFormatBundle(cal, loc); + ResourceBundle bundle = DateFormatSymbols.getDateFormatBundle(cal, loc); if (bundle != null) { //if (cal instanceof com.ibm.util.Calendar) { - symbols = ((com.ibm.util.Calendar)cal).getDateFormatSymbols(loc); + // symbols = ((com.ibm.util.Calendar)cal).getDateFormatSymbols(loc); //} else { // symbols = getDateFormatSymbols(null, bundle, loc); //} - + symbols = new DateFormatSymbols(cal, loc); + try { String[] patterns = bundle.getStringArray("DateTimePatterns"); @@ -2313,58 +2074,7 @@ public abstract class Calendar implements Serializable, Cloneable { result.setCalendar(cal); return result; } - - private static final java.text.DateFormatSymbols oldStyleSymbols(DateFormatSymbols syms, Locale loc) { - java.text.DateFormatSymbols result = new java.text.DateFormatSymbols(loc); - result.setAmPmStrings(syms.getAmPmStrings()); - result.setEras(syms.getEras()); - result.setLocalPatternChars(syms.getLocalPatternChars()); - result.setMonths(syms.getMonths()); - result.setShortMonths(syms.getShortMonths()); - result.setShortWeekdays(syms.getShortWeekdays()); - result.setWeekdays(syms.getWeekdays()); - result.setZoneStrings(syms.getZoneStrings()); - return result; - } - /** - * Find the ResourceBundle containing the date format information for - * a specified calendar subclass in a given locale. - *

- * The resource bundle name is based on the calendar's fully-specified - * class name, with ".resources" inserted at the end of the package name - * (just before the class name) and "Symbols" appended to the end. - * For example, the bundle corresponding to "com.ibm.util.HebrewCalendar" - * is "com.ibm.util.resources.HebrewCalendarSymbols". - */ - static protected ResourceBundle getDateFormatBundle(Calendar cal, Locale locale) - throws MissingResourceException - { - // Find the calendar's class name, which we're going to use to construct the - // resource bundle name. - String fullName = cal.getClass().getName(); - int lastDot = fullName.lastIndexOf('.'); - String className = fullName.substring(lastDot+1); - - // The name of the ResourceBundle itself is the calendar's fully-qualified - // name, with ".resources" inserted in the package and "Symbols" appended - String bundleName = fullName.substring(0, lastDot+1) + "resources." - + className + "Symbols"; - - ResourceBundle result = null; - try { - result = ResourceBundle.getBundle(bundleName, locale); - } - catch (MissingResourceException e) { - if (!(cal instanceof GregorianCalendar)) { - // Ok for symbols to be missing for a Gregorian calendar, but - // not for any other type. - throw e; - } - } - return result; - } - //------------------------------------------------------------------------- // Protected utility methods for use by subclasses. These are very handy // for implementing add, roll, and computeFields. diff --git a/icu4j/src/com/ibm/test/calendar/CalendarTest.java b/icu4j/src/com/ibm/test/calendar/CalendarTest.java index acf5482cb0f..276cec86aa0 100755 --- a/icu4j/src/com/ibm/test/calendar/CalendarTest.java +++ b/icu4j/src/com/ibm/test/calendar/CalendarTest.java @@ -5,8 +5,8 @@ ******************************************************************************* * * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/test/calendar/Attic/CalendarTest.java,v $ - * $Date: 2000/10/17 18:32:50 $ - * $Revision: 1.5 $ + * $Date: 2000/10/17 20:55:09 $ + * $Revision: 1.6 $ * ***************************************************************************************** */ @@ -62,8 +62,7 @@ public class CalendarTest extends TestFmwk { cal.setTimeZone(UTC); // Get a format to use for printing dates in the calendar system we're testing - // TODO: This is kind of ugly right now . - DateFormat format = Calendar.getDateTimeFormat(cal, DateFormat.SHORT, -1, Locale.getDefault()); + DateFormat format = DateFormat.getDateTimeInstance(cal, DateFormat.SHORT, -1, Locale.getDefault()); ((SimpleDateFormat)format).applyPattern(pattern); DateFormat testFmt = (DateFormat)format.clone(); diff --git a/icu4j/src/com/ibm/text/DateFormat.java b/icu4j/src/com/ibm/text/DateFormat.java index d5d5d3be24b..a42cd43859b 100755 --- a/icu4j/src/com/ibm/text/DateFormat.java +++ b/icu4j/src/com/ibm/text/DateFormat.java @@ -669,4 +669,108 @@ public abstract class DateFormat extends Format { * Create a new date format. */ protected DateFormat() {} + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + //------------------------------------------------------------------------- + // Public static interface for creating custon DateFormats for different + // types of Calendars. + //------------------------------------------------------------------------- + + /** + * Create a {@link DateFormat} object that can be used to format dates in + * the calendar system specified by cal. + *

+ * @param cal The calendar system for which a date format is desired. + * + * @param dateStyle The type of date format desired. This can be + * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, + * etc. + * + * @param locale The locale for which the date format is desired. + */ + static public DateFormat getDateInstance(Calendar cal, int dateStyle, Locale locale) + { + return getDateTimeInstance(cal, locale, dateStyle, -1); + } + + /** + * Create a {@link DateFormat} object that can be used to format times in + * the calendar system specified by cal. + *

+ * Note: When this functionality is moved into the core JDK, this method + * will probably be replaced by a new overload of {@link DateFormat#getInstance}. + *

+ * @param cal The calendar system for which a time format is desired. + * + * @param timeStyle The type of time format desired. This can be + * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, + * etc. + * + * @param locale The locale for which the time format is desired. + * + * @see DateFormat#getTimeInstance + */ + static public DateFormat getTimeInstance(Calendar cal, int timeStyle, Locale locale) + { + return getDateTimeInstance(cal, locale, -1, timeStyle); + } + + /** + * Create a {@link DateFormat} object that can be used to format dates and times in + * the calendar system specified by cal. + *

+ * Note: When this functionality is moved into the core JDK, this method + * will probably be replaced by a new overload of {@link DateFormat#getInstance}. + *

+ * @param cal The calendar system for which a date/time format is desired. + * + * @param dateStyle The type of date format desired. This can be + * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, + * etc. + * + * @param timeStyle The type of time format desired. This can be + * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, + * etc. + * + * @param locale The locale for which the date/time format is desired. + * + * @see DateFormat#getDateTimeInstance + */ + static public DateFormat getDateTimeInstance(Calendar cal, int dateStyle, + int timeStyle, Locale locale) + { + return getDateTimeInstance(cal, locale, dateStyle, timeStyle); + } + + /** + * Private utility method to retrive a date and/or time format + * for the specified calendar and locale. This method has knowledge of + * (and is partly copied from) the corresponding code in SimpleDateFormat, + * but it knows how to find the right resource bundle based on the calendar class. + *

+ * @param cal The calendar system whose date/time format is desired. + * + * @param timeStyle The type of time format desired. This can be + * DateFormat.SHORT, etc, or -1 if the time + * of day should not be included in the format. + * + * @param dateStyle The type of date format desired. This can be + * DateFormat.SHORT, etc, or -1 if the date + * should not be included in the format. + * + * @param loc The locale for which the date/time format is desired. + * + * @see DateFormat#getDateTimeInstance + */ + static private DateFormat getDateTimeInstance(Calendar cal, Locale loc, + int dateStyle, int timeStyle) + { + //if (cal instanceof com.ibm.util.Calendar) { + // return ((com.ibm.util.Calendar)cal).getDateTimeFormat(dateStyle,timeStyle,loc); + //} else { + // return formatHelper(cal, loc, dateStyle, timeStyle); + //} + return cal.getDateTimeFormat(dateStyle,timeStyle,loc); + } } diff --git a/icu4j/src/com/ibm/text/DateFormatSymbols.java b/icu4j/src/com/ibm/text/DateFormatSymbols.java index 66f739142d4..f4ef070fd08 100755 --- a/icu4j/src/com/ibm/text/DateFormatSymbols.java +++ b/icu4j/src/com/ibm/text/DateFormatSymbols.java @@ -5,8 +5,8 @@ ******************************************************************************* * * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/text/Attic/DateFormatSymbols.java,v $ - * $Date: 2000/05/26 22:31:43 $ - * $Revision: 1.5 $ + * $Date: 2000/10/17 20:54:59 $ + * $Revision: 1.6 $ * ***************************************************************************************** */ @@ -21,6 +21,9 @@ import java.util.Vector; import java.util.Enumeration; import java.text.resources.DateFormatZoneData; import com.ibm.util.Utility; +import com.ibm.util.Calendar; +import com.ibm.util.GregorianCalendar; +import java.util.MissingResourceException; /** * DateFormatSymbols is a public class for encapsulating @@ -601,4 +604,179 @@ public class DateFormatSymbols implements Serializable, Cloneable { return true; } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + /** + * Get the {@link DateFormatSymbols} object that should be used to format a + * calendar system's dates in the given locale. + *

+ * Subclassing:
+ * When creating a new Calendar subclass, you must create the + * {@link ResourceBundle ResourceBundle} + * containing its {@link DateFormatSymbols DateFormatSymbols} in a specific place. + * The resource bundle name is based on the calendar's fully-specified + * class name, with ".resources" inserted at the end of the package name + * (just before the class name) and "Symbols" appended to the end. + * For example, the bundle corresponding to "com.ibm.util.HebrewCalendar" + * is "com.ibm.util.resources.HebrewCalendarSymbols". + *

+ * Within the ResourceBundle, this method searches for five keys: + *

+ *

+ * @param cal The calendar system whose date format symbols are desired. + * @param locale The locale whose symbols are desired. + * + * @see DateFormatSymbols#DateFormatSymbols(java.util.Locale) + */ + public DateFormatSymbols(Calendar cal, Locale locale) { + this(locale); // old-style construction + if (cal != null) { + ResourceBundle bundle = null; + try { + bundle = getDateFormatBundle(cal, locale); + } catch (MissingResourceException e) { + if (!(cal instanceof GregorianCalendar)) { + // Ok for symbols to be missing for a Gregorian calendar, but + // not for any other type. + throw e; + } + } + constructCalendarSpecific(bundle); + } + } + + /** + * Fetch a custom calendar's DateFormatSymbols out of the given resource + * bundle. Symbols that are not overridden are inherited from the + * default DateFormatSymbols for the locale. + * @see DateFormatSymbols#DateFormatSymbols + */ + public DateFormatSymbols(ResourceBundle bundle, Locale locale) { + // Get the default symbols for the locale, since most + // calendars will only need to override month names and will + // want everything else the same + this(locale); // old-style construction + constructCalendarSpecific(bundle); + } + + private void constructCalendarSpecific(ResourceBundle bundle) { + + // Fetch the day names from the resource bundle. If they're not found, + // it's ok; we'll just use the default ones. + // Allow a null ResourceBundle just for the sake of completeness; + // this is useful for calendars that don't have any overridden symbols + + if (bundle != null) { + try { + String[] temp = bundle.getStringArray("DayNames"); + setWeekdays(temp); + setShortWeekdays(temp); + + temp = bundle.getStringArray("DayAbbreviations"); + setShortWeekdays( temp ); + } catch (MissingResourceException e) {} + + try { + String[] temp = bundle.getStringArray("MonthNames"); + setMonths( temp ); + setShortMonths( temp ); + + temp = bundle.getStringArray("MonthAbbreviations"); + setShortMonths( temp ); + } catch (MissingResourceException e) {} + + try { + String[] temp = bundle.getStringArray("Eras"); + setEras( temp ); + } catch (MissingResourceException e) {} + } + } + +//~ private static final java.text.DateFormatSymbols oldStyleSymbols(DateFormatSymbols syms, Locale loc) { +//~ java.text.DateFormatSymbols result = new java.text.DateFormatSymbols(loc); +//~ result.setAmPmStrings(syms.getAmPmStrings()); +//~ result.setEras(syms.getEras()); +//~ result.setLocalPatternChars(syms.getLocalPatternChars()); +//~ result.setMonths(syms.getMonths()); +//~ result.setShortMonths(syms.getShortMonths()); +//~ result.setShortWeekdays(syms.getShortWeekdays()); +//~ result.setWeekdays(syms.getWeekdays()); +//~ result.setZoneStrings(syms.getZoneStrings()); +//~ return result; +//~ } + + /** + * Find the ResourceBundle containing the date format information for + * a specified calendar subclass in a given locale. + *

+ * The resource bundle name is based on the calendar's fully-specified + * class name, with ".resources" inserted at the end of the package name + * (just before the class name) and "Symbols" appended to the end. + * For example, the bundle corresponding to "com.ibm.util.HebrewCalendar" + * is "com.ibm.util.resources.HebrewCalendarSymbols". + */ + static public ResourceBundle getDateFormatBundle(Calendar cal, Locale locale) + throws MissingResourceException { + + // Find the calendar's class name, which we're going to use to construct the + // resource bundle name. + String fullName = cal.getClass().getName(); + int lastDot = fullName.lastIndexOf('.'); + String className = fullName.substring(lastDot+1); + + // The name of the ResourceBundle itself is the calendar's fully-qualified + // name, with ".resources" inserted in the package and "Symbols" appended + String bundleName = fullName.substring(0, lastDot+1) + "resources." + + className + "Symbols"; + + ResourceBundle result = null; + try { + result = ResourceBundle.getBundle(bundleName, locale); + } + catch (MissingResourceException e) { + if (!(cal instanceof GregorianCalendar)) { + // Ok for symbols to be missing for a Gregorian calendar, but + // not for any other type. + throw e; + } + } + return result; + } } diff --git a/icu4j/src/com/ibm/util/Calendar.java b/icu4j/src/com/ibm/util/Calendar.java index 7a8bf07801e..4b97799c44a 100755 --- a/icu4j/src/com/ibm/util/Calendar.java +++ b/icu4j/src/com/ibm/util/Calendar.java @@ -364,7 +364,7 @@ import com.ibm.text.SimpleDateFormat; * @see GregorianCalendar * @see TimeZone * @see DateFormat - * @version $Revision: 1.8 $ $Date: 2000/10/17 18:26:44 $ + * @version $Revision: 1.9 $ $Date: 2000/10/17 20:54:49 $ * @author Mark Davis, David Goldsmith, Chen-Lieh Huang, Alan Liu, Laura Werner * @since JDK1.1 */ @@ -2006,250 +2006,10 @@ public abstract class Calendar implements Serializable, Cloneable { } //------------------------------------------------------------------------- - // Public static interface for creating custon DateFormats for different - // types of Calendars. + // Interface for creating custon DateFormats for different types of Calendars //------------------------------------------------------------------------- - - /** - * Create a {@link DateFormat} object that can be used to format dates in - * the calendar system specified by cal. - *

- * Note: When this functionality is moved into the core JDK, this method - * will probably be replaced by a new overload of {@link DateFormat#getInstance}. - *

- * @param cal The calendar system for which a date format is desired. - * - * @param dateStyle The type of date format desired. This can be - * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, - * etc. - * - * @param locale The locale for which the date format is desired. - * - * @see DateFormat#getDateInstance - */ - static public DateFormat getDateFormat(Calendar cal, int dateStyle, Locale locale) - { - return getDateTimeFormat(cal, locale, dateStyle, -1); - } - - /** - * Create a {@link DateFormat} object that can be used to format times in - * the calendar system specified by cal. - *

- * Note: When this functionality is moved into the core JDK, this method - * will probably be replaced by a new overload of {@link DateFormat#getInstance}. - *

- * @param cal The calendar system for which a time format is desired. - * - * @param timeStyle The type of time format desired. This can be - * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, - * etc. - * - * @param locale The locale for which the time format is desired. - * - * @see DateFormat#getTimeInstance - */ - static public DateFormat getTimeFormat(Calendar cal, int timeStyle, Locale locale) - { - return getDateTimeFormat(cal, locale, -1, timeStyle); - } - - /** - * Create a {@link DateFormat} object that can be used to format dates and times in - * the calendar system specified by cal. - *

- * Note: When this functionality is moved into the core JDK, this method - * will probably be replaced by a new overload of {@link DateFormat#getInstance}. - *

- * @param cal The calendar system for which a date/time format is desired. - * - * @param dateStyle The type of date format desired. This can be - * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, - * etc. - * - * @param timeStyle The type of time format desired. This can be - * {@link DateFormat#SHORT}, {@link DateFormat#MEDIUM}, - * etc. - * - * @param locale The locale for which the date/time format is desired. - * - * @see DateFormat#getDateTimeInstance - */ - static public DateFormat getDateTimeFormat(Calendar cal, int dateStyle, - int timeStyle, Locale locale) - { - return getDateTimeFormat(cal, locale, dateStyle, timeStyle); - } - /** - * Get the {@link DateFormatSymbols} object that should be used to format a - * calendar system's dates in the given locale. - *

- * Note: When this functionality is moved into the core JDK, this method - * will probably be replace by a new constructor on DateFormatSymbols. - *

- * Subclassing:
- * When creating a new Calendar subclass, you must create the - * {@link ResourceBundle ResourceBundle} - * containing its {@link DateFormatSymbols DateFormatSymbols} in a specific place. - * The resource bundle name is based on the calendar's fully-specified - * class name, with ".resources" inserted at the end of the package name - * (just before the class name) and "Symbols" appended to the end. - * For example, the bundle corresponding to "com.ibm.util.HebrewCalendar" - * is "com.ibm.util.resources.HebrewCalendarSymbols". - *

- * Within the ResourceBundle, this method searches for five keys: - *

- *

- * @param cal The calendar system whose date format symbols are desired. - * @param locale The locale whose symbols are desired. - * - * @see DateFormatSymbols#DateFormatSymbols(java.util.Locale) - */ - static public DateFormatSymbols getDateFormatSymbols(Calendar cal, - Locale locale) - { - ResourceBundle bundle = null; - try { - bundle = getDateFormatBundle(cal, locale); - } - catch (MissingResourceException e) { - if (!(cal instanceof GregorianCalendar)) { - // Ok for symbols to be missing for a Gregorian calendar, but - // not for any other type. - throw e; - } - } - return getDateFormatSymbols(null, bundle, locale); - } - - /** - * Fetch a custom calendar's DateFormatSymbols out of the given resource - * bundle. Symbols that are not overridden are inherited from the - * default DateFormatSymbols for the locale. - * @see DateFormatSymbols#DateFormatSymbols - */ - static protected DateFormatSymbols getDateFormatSymbols(DateFormatSymbols result, - ResourceBundle bundle, - Locale locale) - { - // Get the default symbols for the locale, since most calendars will only - // need to override month names and will want everything else the same - if (result == null) { - result = new DateFormatSymbols(locale); - } - - // - // Fetch the day names from the resource bundle. If they're not found, - // it's ok; we'll just use the default ones. - // Allow a null ResourceBundle just for the sake of completeness; - // this is useful for calendars that don't have any overridden symbols - // - if (bundle != null) { - try { - String[] temp = bundle.getStringArray("DayNames"); - result.setWeekdays(temp); - result.setShortWeekdays(temp); - - temp = bundle.getStringArray("DayAbbreviations"); - result.setShortWeekdays( temp ); - } - catch (MissingResourceException e) { - } - - try { - String[] temp = bundle.getStringArray("MonthNames"); - result.setMonths( temp ); - result.setShortMonths( temp ); - - temp = bundle.getStringArray("MonthAbbreviations"); - result.setShortMonths( temp ); - } - catch (MissingResourceException e) { - } - - try { - String[] temp = bundle.getStringArray("Eras"); - result.setEras( temp ); - } - catch (MissingResourceException e) { - } - } - return result; - } - - protected DateFormatSymbols getDateFormatSymbols(Locale locale) { - return getDateFormatSymbols(null, getDateFormatBundle(this, locale), locale); - } - - /** - * Private utility method to retrive a date and/or time format - * for the specified calendar and locale. This method has knowledge of - * (and is partly copied from) the corresponding code in SimpleDateFormat, - * but it knows how to find the right resource bundle based on the calendar class. - *

- * @param cal The calendar system whose date/time format is desired. - * - * @param timeStyle The type of time format desired. This can be - * DateFormat.SHORT, etc, or -1 if the time - * of day should not be included in the format. - * - * @param dateStyle The type of date format desired. This can be - * DateFormat.SHORT, etc, or -1 if the date - * should not be included in the format. - * - * @param loc The locale for which the date/time format is desired. - * - * @see DateFormat#getDateTimeInstance - */ - static private DateFormat getDateTimeFormat(Calendar cal, Locale loc, - int dateStyle, int timeStyle) - { - //if (cal instanceof com.ibm.util.Calendar) { - return ((com.ibm.util.Calendar)cal).getDateTimeFormat(dateStyle,timeStyle,loc); - //} else { - // return formatHelper(cal, loc, dateStyle, timeStyle); - //} - } - - protected DateFormat getDateTimeFormat(int dateStyle, int timeStyle, Locale loc) { + public DateFormat getDateTimeFormat(int dateStyle, int timeStyle, Locale loc) { return formatHelper(this, loc, dateStyle, timeStyle); } @@ -2261,15 +2021,16 @@ public abstract class Calendar implements Serializable, Cloneable { DateFormat result = null; DateFormatSymbols symbols = null; - ResourceBundle bundle = getDateFormatBundle(cal, loc); + ResourceBundle bundle = DateFormatSymbols.getDateFormatBundle(cal, loc); if (bundle != null) { //if (cal instanceof com.ibm.util.Calendar) { - symbols = ((com.ibm.util.Calendar)cal).getDateFormatSymbols(loc); + // symbols = ((com.ibm.util.Calendar)cal).getDateFormatSymbols(loc); //} else { // symbols = getDateFormatSymbols(null, bundle, loc); //} - + symbols = new DateFormatSymbols(cal, loc); + try { String[] patterns = bundle.getStringArray("DateTimePatterns"); @@ -2313,58 +2074,7 @@ public abstract class Calendar implements Serializable, Cloneable { result.setCalendar(cal); return result; } - - private static final java.text.DateFormatSymbols oldStyleSymbols(DateFormatSymbols syms, Locale loc) { - java.text.DateFormatSymbols result = new java.text.DateFormatSymbols(loc); - result.setAmPmStrings(syms.getAmPmStrings()); - result.setEras(syms.getEras()); - result.setLocalPatternChars(syms.getLocalPatternChars()); - result.setMonths(syms.getMonths()); - result.setShortMonths(syms.getShortMonths()); - result.setShortWeekdays(syms.getShortWeekdays()); - result.setWeekdays(syms.getWeekdays()); - result.setZoneStrings(syms.getZoneStrings()); - return result; - } - /** - * Find the ResourceBundle containing the date format information for - * a specified calendar subclass in a given locale. - *

- * The resource bundle name is based on the calendar's fully-specified - * class name, with ".resources" inserted at the end of the package name - * (just before the class name) and "Symbols" appended to the end. - * For example, the bundle corresponding to "com.ibm.util.HebrewCalendar" - * is "com.ibm.util.resources.HebrewCalendarSymbols". - */ - static protected ResourceBundle getDateFormatBundle(Calendar cal, Locale locale) - throws MissingResourceException - { - // Find the calendar's class name, which we're going to use to construct the - // resource bundle name. - String fullName = cal.getClass().getName(); - int lastDot = fullName.lastIndexOf('.'); - String className = fullName.substring(lastDot+1); - - // The name of the ResourceBundle itself is the calendar's fully-qualified - // name, with ".resources" inserted in the package and "Symbols" appended - String bundleName = fullName.substring(0, lastDot+1) + "resources." - + className + "Symbols"; - - ResourceBundle result = null; - try { - result = ResourceBundle.getBundle(bundleName, locale); - } - catch (MissingResourceException e) { - if (!(cal instanceof GregorianCalendar)) { - // Ok for symbols to be missing for a Gregorian calendar, but - // not for any other type. - throw e; - } - } - return result; - } - //------------------------------------------------------------------------- // Protected utility methods for use by subclasses. These are very handy // for implementing add, roll, and computeFields.