00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef MSGFMT_H
00018 #define MSGFMT_H
00019
00020 #include "unicode/utypes.h"
00021
00027 #if !UCONFIG_NO_FORMATTING
00028
00029 #include "unicode/format.h"
00030 #include "unicode/locid.h"
00031 #include "unicode/parseerr.h"
00032 #include "unicode/uchar.h"
00033
00034 U_NAMESPACE_BEGIN
00035
00036 class NumberFormat;
00037 class DateFormat;
00038
00306 class U_I18N_API MessageFormat : public Format {
00307 public:
00313 enum EFormatNumber {
00319 kMaxFormat = 10
00320 };
00321
00331 MessageFormat(const UnicodeString& pattern,
00332 UErrorCode &status);
00333
00342 MessageFormat(const UnicodeString& pattern,
00343 const Locale& newLocale,
00344 UErrorCode& status);
00355 MessageFormat(const UnicodeString& pattern,
00356 const Locale& newLocale,
00357 UParseError& parseError,
00358 UErrorCode& status);
00363 MessageFormat(const MessageFormat&);
00364
00369 const MessageFormat& operator=(const MessageFormat&);
00370
00375 virtual ~MessageFormat();
00376
00382 virtual Format* clone(void) const;
00383
00391 virtual UBool operator==(const Format& other) const;
00392
00399 virtual void setLocale(const Locale& theLocale);
00400
00407 virtual const Locale& getLocale(void) const;
00408
00417 virtual void applyPattern(const UnicodeString& pattern,
00418 UErrorCode& status);
00429 virtual void applyPattern(const UnicodeString& pattern,
00430 UParseError& parseError,
00431 UErrorCode& status);
00432
00441 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00442
00456 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00457
00469 virtual void setFormats(const Format** newFormats, int32_t cnt);
00470
00471
00482 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00483
00493 virtual void setFormat(int32_t formatNumber, const Format& format);
00494
00503 virtual StringEnumeration* getFormatNames(UErrorCode& status);
00504
00518 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00519
00533 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00534
00549 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00550
00551
00563 virtual const Format** getFormats(int32_t& count) const;
00564
00579 UnicodeString& format( const Formattable* source,
00580 int32_t count,
00581 UnicodeString& appendTo,
00582 FieldPosition& ignore,
00583 UErrorCode& status) const;
00584
00599 static UnicodeString& format(const UnicodeString& pattern,
00600 const Formattable* arguments,
00601 int32_t count,
00602 UnicodeString& appendTo,
00603 UErrorCode& status);
00604
00622 virtual UnicodeString& format(const Formattable& obj,
00623 UnicodeString& appendTo,
00624 FieldPosition& pos,
00625 UErrorCode& status) const;
00626
00641 UnicodeString& format(const Formattable& obj,
00642 UnicodeString& appendTo,
00643 UErrorCode& status) const;
00644
00645
00664 UnicodeString& format(const UnicodeString* argumentNames,
00665 const Formattable* arguments,
00666 int32_t count,
00667 UnicodeString& appendTo,
00668 UErrorCode& status) const;
00682 virtual Formattable* parse( const UnicodeString& source,
00683 ParsePosition& pos,
00684 int32_t& count) const;
00685
00700 virtual Formattable* parse( const UnicodeString& source,
00701 int32_t& count,
00702 UErrorCode& status) const;
00703
00716 virtual void parseObject(const UnicodeString& source,
00717 Formattable& result,
00718 ParsePosition& pos) const;
00719
00739 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00740 UErrorCode& status);
00741
00749 UBool usesNamedArguments() const;
00750
00762 virtual UClassID getDynamicClassID(void) const;
00763
00775 static UClassID U_EXPORT2 getStaticClassID(void);
00776
00777 private:
00778
00779 Locale fLocale;
00780 UnicodeString fPattern;
00781 Format** formatAliases;
00782 int32_t formatAliasesCapacity;
00783 UProperty idStart;
00784 UProperty idContinue;
00785
00786 MessageFormat();
00787
00788
00789
00790
00791
00792
00793
00794
00795 class Subformat;
00796
00801 Subformat* subformats;
00802 int32_t subformatCount;
00803 int32_t subformatCapacity;
00804
00813 Formattable::Type* argTypes;
00814 int32_t argTypeCount;
00815 int32_t argTypeCapacity;
00816
00821 UBool isArgNumeric;
00822
00823
00824 UBool allocateSubformats(int32_t capacity);
00825 UBool allocateArgTypes(int32_t capacity);
00826
00834 NumberFormat* defaultNumberFormat;
00835 DateFormat* defaultDateFormat;
00836
00841 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00842 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00843
00850 static int32_t findKeyword( const UnicodeString& s,
00851 const UChar * const *list);
00852
00869 UnicodeString& format( const Formattable* arguments,
00870 int32_t cnt,
00871 UnicodeString& appendTo,
00872 FieldPosition& status,
00873 int32_t recursionProtection,
00874 UErrorCode& success) const;
00875
00876 UnicodeString& format( const Formattable* arguments,
00877 const UnicodeString *argumentNames,
00878 int32_t cnt,
00879 UnicodeString& appendTo,
00880 FieldPosition& status,
00881 int32_t recursionProtection,
00882 UErrorCode& success) const;
00883
00884 void makeFormat(int32_t offsetNumber,
00885 UnicodeString* segments,
00886 UParseError& parseError,
00887 UErrorCode& success);
00888
00892 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
00893
00903 static void copyAndFixQuotes(const UnicodeString& appendTo, int32_t start, int32_t end, UnicodeString& target);
00904
00913 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
00914 listCount = argTypeCount;
00915 return argTypes;
00916 }
00917
00923 UBool isLegalArgName(const UnicodeString& argName) const;
00924
00925 friend class MessageFormatAdapter;
00926 };
00927
00928 inline UnicodeString&
00929 MessageFormat::format(const Formattable& obj,
00930 UnicodeString& appendTo,
00931 UErrorCode& status) const {
00932 return Format::format(obj, appendTo, status);
00933 }
00934 U_NAMESPACE_END
00935
00936 #endif
00937
00938 #endif // _MSGFMT
00939
00940