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
00291 class U_I18N_API MessageFormat : public Format {
00292 public:
00298 enum EFormatNumber {
00304 kMaxFormat = 10
00305 };
00306
00316 MessageFormat(const UnicodeString& pattern,
00317 UErrorCode &status);
00318
00327 MessageFormat(const UnicodeString& pattern,
00328 const Locale& newLocale,
00329 UErrorCode& status);
00340 MessageFormat(const UnicodeString& pattern,
00341 const Locale& newLocale,
00342 UParseError& parseError,
00343 UErrorCode& status);
00348 MessageFormat(const MessageFormat&);
00349
00354 const MessageFormat& operator=(const MessageFormat&);
00355
00360 virtual ~MessageFormat();
00361
00367 virtual Format* clone(void) const;
00368
00376 virtual UBool operator==(const Format& other) const;
00377
00384 virtual void setLocale(const Locale& theLocale);
00385
00392 virtual const Locale& getLocale(void) const;
00393
00402 virtual void applyPattern(const UnicodeString& pattern,
00403 UErrorCode& status);
00414 virtual void applyPattern(const UnicodeString& pattern,
00415 UParseError& parseError,
00416 UErrorCode& status);
00417
00426 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00427
00444 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00445
00460 virtual void setFormats(const Format** newFormats, int32_t cnt);
00461
00462
00477 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00478
00488 virtual void setFormat(int32_t formatNumber, const Format& format);
00489
00498 virtual StringEnumeration* getFormatNames(UErrorCode& status);
00499
00513 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00514
00528 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00529
00544 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00545
00558 virtual const Format** getFormats(int32_t& count) const;
00559
00560
00561 using Format::format;
00562
00580 UnicodeString& format(const Formattable* source,
00581 int32_t count,
00582 UnicodeString& appendTo,
00583 FieldPosition& ignore,
00584 UErrorCode& status) const;
00585
00603 static UnicodeString& format(const UnicodeString& pattern,
00604 const Formattable* arguments,
00605 int32_t count,
00606 UnicodeString& appendTo,
00607 UErrorCode& status);
00608
00629 virtual UnicodeString& format(const Formattable& obj,
00630 UnicodeString& appendTo,
00631 FieldPosition& pos,
00632 UErrorCode& status) const;
00633
00648 UnicodeString& format(const Formattable& obj,
00649 UnicodeString& appendTo,
00650 UErrorCode& status) const;
00651
00652
00671 UnicodeString& format(const UnicodeString* argumentNames,
00672 const Formattable* arguments,
00673 int32_t count,
00674 UnicodeString& appendTo,
00675 UErrorCode& status) const;
00689 virtual Formattable* parse(const UnicodeString& source,
00690 ParsePosition& pos,
00691 int32_t& count) const;
00692
00708 virtual Formattable* parse(const UnicodeString& source,
00709 int32_t& count,
00710 UErrorCode& status) const;
00711
00724 virtual void parseObject(const UnicodeString& source,
00725 Formattable& result,
00726 ParsePosition& pos) const;
00727
00747 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00748 UErrorCode& status);
00749
00757 UBool usesNamedArguments() const;
00758
00759
00770 int32_t getArgTypeCount() const;
00771
00783 virtual UClassID getDynamicClassID(void) const;
00784
00796 static UClassID U_EXPORT2 getStaticClassID(void);
00797
00798 private:
00799
00800 Locale fLocale;
00801 UnicodeString fPattern;
00802 Format** formatAliases;
00803 int32_t formatAliasesCapacity;
00804 UProperty idStart;
00805 UProperty idContinue;
00806
00807 MessageFormat();
00808
00809
00810
00811
00812
00813
00814
00815
00816 class Subformat;
00817
00822 Subformat* subformats;
00823 int32_t subformatCount;
00824 int32_t subformatCapacity;
00825
00834 Formattable::Type* argTypes;
00835 int32_t argTypeCount;
00836 int32_t argTypeCapacity;
00837
00842 UBool isArgNumeric;
00843
00844
00845 UBool allocateSubformats(int32_t capacity);
00846 UBool allocateArgTypes(int32_t capacity);
00847
00855 NumberFormat* defaultNumberFormat;
00856 DateFormat* defaultDateFormat;
00857
00862 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00863 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00864
00871 static int32_t findKeyword( const UnicodeString& s,
00872 const UChar * const *list);
00873
00890 UnicodeString& format( const Formattable* arguments,
00891 int32_t cnt,
00892 UnicodeString& appendTo,
00893 FieldPosition& status,
00894 int32_t recursionProtection,
00895 UErrorCode& success) const;
00896
00897 UnicodeString& format( const Formattable* arguments,
00898 const UnicodeString *argumentNames,
00899 int32_t cnt,
00900 UnicodeString& appendTo,
00901 FieldPosition& status,
00902 int32_t recursionProtection,
00903 UErrorCode& success) const;
00904
00905 void makeFormat(int32_t offsetNumber,
00906 UnicodeString* segments,
00907 UParseError& parseError,
00908 UErrorCode& success);
00909
00913 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
00914
00924 static void copyAndFixQuotes(const UnicodeString& appendTo, int32_t start, int32_t end, UnicodeString& target);
00925
00934 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
00935 listCount = argTypeCount;
00936 return argTypes;
00937 }
00938
00944 UBool isLegalArgName(const UnicodeString& argName) const;
00945
00946 friend class MessageFormatAdapter;
00947 };
00948
00949 inline UnicodeString&
00950 MessageFormat::format(const Formattable& obj,
00951 UnicodeString& appendTo,
00952 UErrorCode& status) const {
00953 return Format::format(obj, appendTo, status);
00954 }
00955
00956 U_NAMESPACE_END
00957
00958 #endif
00959
00960 #endif // _MSGFMT
00961