Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals

msgfmt.h

00001 /*
00002 * Copyright (C) {1997-2004}, International Business Machines Corporation and others. All Rights Reserved.
00003 ********************************************************************************
00004 *
00005 * File MSGFMT.H
00006 *
00007 * Modification History:
00008 *
00009 *   Date        Name        Description
00010 *   02/19/97    aliu        Converted from java.
00011 *   03/20/97    helena      Finished first cut of implementation.
00012 *   07/22/98    stephen     Removed operator!= (defined in Format)
00013 *   08/19/2002  srl         Removing Javaisms
00014 ********************************************************************************
00015 */
00016 
00017 #ifndef MSGFMT_H
00018 #define MSGFMT_H
00019 
00020 #include "unicode/utypes.h"
00021 
00022 #if !UCONFIG_NO_FORMATTING
00023 
00024 #include "unicode/format.h"
00025 #include "unicode/locid.h"
00026 #include "unicode/parseerr.h"
00027 
00028 U_NAMESPACE_BEGIN
00029 
00030 class NumberFormat;
00031 class DateFormat;
00032 
00246 class U_I18N_API MessageFormat : public Format {
00247 public:
00253     enum EFormatNumber {
00259         kMaxFormat = 10
00260     };
00261 
00271     MessageFormat(const UnicodeString& pattern,
00272                   UErrorCode &status);
00273 
00282     MessageFormat(const UnicodeString& pattern,
00283                   const Locale& newLocale,
00284                         UErrorCode& status);
00295     MessageFormat(const UnicodeString& pattern,
00296                   const Locale& newLocale,
00297                   UParseError& parseError,
00298                   UErrorCode& status);
00303     MessageFormat(const MessageFormat&);
00304 
00309     const MessageFormat& operator=(const MessageFormat&);
00310 
00315     virtual ~MessageFormat();
00316 
00322     virtual Format* clone(void) const;
00323 
00331     virtual UBool operator==(const Format& other) const;
00332 
00339     virtual void setLocale(const Locale& theLocale);
00340 
00347     virtual const Locale& getLocale(void) const;
00348 
00357     virtual void applyPattern(const UnicodeString& pattern,
00358                               UErrorCode& status);
00369     virtual void applyPattern(const UnicodeString& pattern,
00370                              UParseError& parseError,
00371                              UErrorCode& status);
00372 
00381     virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00382 
00396     virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00397 
00409     virtual void setFormats(const Format** newFormats,int32_t cnt);
00410 
00411 
00422     virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00423 
00433     virtual void setFormat(int32_t formatNumber, const Format& format);
00434 
00446     virtual const Format** getFormats(int32_t& count) const;
00447 
00462     UnicodeString& format(  const Formattable* source,
00463                             int32_t count,
00464                             UnicodeString& appendTo,
00465                             FieldPosition& ignore,
00466                             UErrorCode& status) const;
00467 
00482     static UnicodeString& format(   const UnicodeString& pattern,
00483                                     const Formattable* arguments,
00484                                     int32_t count,
00485                                     UnicodeString& appendTo,
00486                                     UErrorCode& status);
00487 
00505     virtual UnicodeString& format(const Formattable& obj,
00506                                   UnicodeString& appendTo,
00507                                   FieldPosition& pos,
00508                                   UErrorCode& status) const;
00509 
00524     UnicodeString& format(const Formattable& obj,
00525                           UnicodeString& appendTo,
00526                           UErrorCode& status) const;
00527 
00541     virtual Formattable* parse( const UnicodeString& source,
00542                                 ParsePosition& pos,
00543                                 int32_t& count) const;
00544 
00556     virtual Formattable* parse( const UnicodeString& source,
00557                                 int32_t& count,
00558                                 UErrorCode& status) const;
00559 
00572     virtual void parseObject(const UnicodeString& source,
00573                              Formattable& result,
00574                              ParsePosition& pos) const;
00575 
00587     virtual UClassID getDynamicClassID(void) const;
00588 
00600     static UClassID U_EXPORT2 getStaticClassID(void);
00601     
00602 private:
00603 
00604     Locale              fLocale;
00605     UnicodeString       fPattern;
00606     Format**            formatAliases; // see getFormats
00607     int32_t             formatAliasesCapacity;
00608 
00609     MessageFormat(); // default constructor not implemented
00610 
00611     /*
00612      * A structure representing one subformat of this MessageFormat.
00613      * Each subformat has a Format object, an offset into the plain
00614      * pattern text fPattern, and an argument number.  The argument
00615      * number corresponds to the array of arguments to be formatted.
00616      * @internal
00617      */
00618     class Subformat {
00619     public:
00623         Format* format; // formatter
00627         int32_t offset; // offset into fPattern
00631         int32_t arg;    // 0-based argument number
00632 
00638         Subformat& operator=(const Subformat& that) {
00639             format = that.format ? that.format->clone() : NULL;
00640             offset = that.offset;
00641             arg = that.arg;
00642             return *this;
00643         }
00644 
00648         UBool operator==(const Subformat& that) const {
00649             // Do cheap comparisons first
00650             return offset == that.offset &&
00651                    arg == that.arg &&
00652                    ((format == that.format) || // handles NULL
00653                     (*format == *that.format));
00654         }
00655 
00659         UBool operator!=(const Subformat& that) const {
00660             return !operator==(that);
00661         }
00662     };
00663 
00668     Subformat* subformats;
00669     int32_t    subformatCount;
00670     int32_t    subformatCapacity;
00671 
00680     Formattable::Type* argTypes;
00681     int32_t            argTypeCount;
00682     int32_t            argTypeCapacity;
00683 
00684     // Variable-size array management
00685     UBool allocateSubformats(int32_t capacity);
00686     UBool allocateArgTypes(int32_t capacity);
00687 
00695     NumberFormat* defaultNumberFormat;
00696     DateFormat*   defaultDateFormat;
00697 
00702     const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00703     const DateFormat*   getDefaultDateFormat(UErrorCode&) const;
00704 
00711     static int32_t findKeyword( const UnicodeString& s,
00712                                 const UChar * const *list);
00713 
00730     UnicodeString&  format( const Formattable* arguments,
00731                             int32_t cnt,
00732                             UnicodeString& appendTo,
00733                             FieldPosition& status,
00734                             int32_t recursionProtection,
00735                             UErrorCode& success) const;
00736 
00737     void             makeFormat(int32_t offsetNumber,
00738                                 UnicodeString* segments,
00739                                 UParseError& parseError,
00740                                 UErrorCode& success);
00741 
00745     NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
00746 
00756     static void copyAndFixQuotes(const UnicodeString& appendTo, int32_t start, int32_t end, UnicodeString& target);
00757 
00766     const Formattable::Type* getArgTypeList(int32_t& listCount) const {
00767         listCount = argTypeCount;
00768         return argTypes; 
00769     }
00770 
00771     friend class MessageFormatAdapter; // getFormatTypeList() access
00772 };
00773 
00774 inline UnicodeString&
00775 MessageFormat::format(const Formattable& obj,
00776                       UnicodeString& appendTo,
00777                       UErrorCode& status) const {
00778     return Format::format(obj, appendTo, status);
00779 }
00780 U_NAMESPACE_END
00781 
00782 #endif /* #if !UCONFIG_NO_FORMATTING */
00783 
00784 #endif // _MSGFMT
00785 //eof
00786 

Generated on Tue Jul 26 00:39:58 2005 for ICU 3.2 by  doxygen 1.3.9.1