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
00033 U_NAMESPACE_BEGIN
00034
00035 class NumberFormat;
00036 class DateFormat;
00037
00267 class U_I18N_API MessageFormat : public Format {
00268 public:
00274 enum EFormatNumber {
00280 kMaxFormat = 10
00281 };
00282
00292 MessageFormat(const UnicodeString& pattern,
00293 UErrorCode &status);
00294
00303 MessageFormat(const UnicodeString& pattern,
00304 const Locale& newLocale,
00305 UErrorCode& status);
00316 MessageFormat(const UnicodeString& pattern,
00317 const Locale& newLocale,
00318 UParseError& parseError,
00319 UErrorCode& status);
00324 MessageFormat(const MessageFormat&);
00325
00330 const MessageFormat& operator=(const MessageFormat&);
00331
00336 virtual ~MessageFormat();
00337
00343 virtual Format* clone(void) const;
00344
00352 virtual UBool operator==(const Format& other) const;
00353
00360 virtual void setLocale(const Locale& theLocale);
00361
00368 virtual const Locale& getLocale(void) const;
00369
00378 virtual void applyPattern(const UnicodeString& pattern,
00379 UErrorCode& status);
00390 virtual void applyPattern(const UnicodeString& pattern,
00391 UParseError& parseError,
00392 UErrorCode& status);
00393
00402 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00403
00417 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00418
00430 virtual void setFormats(const Format** newFormats,int32_t cnt);
00431
00432
00443 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00444
00454 virtual void setFormat(int32_t formatNumber, const Format& format);
00455
00467 virtual const Format** getFormats(int32_t& count) const;
00468
00483 UnicodeString& format( const Formattable* source,
00484 int32_t count,
00485 UnicodeString& appendTo,
00486 FieldPosition& ignore,
00487 UErrorCode& status) const;
00488
00503 static UnicodeString& format( const UnicodeString& pattern,
00504 const Formattable* arguments,
00505 int32_t count,
00506 UnicodeString& appendTo,
00507 UErrorCode& status);
00508
00526 virtual UnicodeString& format(const Formattable& obj,
00527 UnicodeString& appendTo,
00528 FieldPosition& pos,
00529 UErrorCode& status) const;
00530
00545 UnicodeString& format(const Formattable& obj,
00546 UnicodeString& appendTo,
00547 UErrorCode& status) const;
00548
00562 virtual Formattable* parse( const UnicodeString& source,
00563 ParsePosition& pos,
00564 int32_t& count) const;
00565
00577 virtual Formattable* parse( const UnicodeString& source,
00578 int32_t& count,
00579 UErrorCode& status) const;
00580
00593 virtual void parseObject(const UnicodeString& source,
00594 Formattable& result,
00595 ParsePosition& pos) const;
00596
00616 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00617 UErrorCode& status);
00618
00630 virtual UClassID getDynamicClassID(void) const;
00631
00643 static UClassID U_EXPORT2 getStaticClassID(void);
00644
00645 private:
00646
00647 Locale fLocale;
00648 UnicodeString fPattern;
00649 Format** formatAliases;
00650 int32_t formatAliasesCapacity;
00651
00652 MessageFormat();
00653
00654
00655
00656
00657
00658
00659
00660
00661 class Subformat {
00662 public:
00666 Format* format;
00670 int32_t offset;
00674 int32_t arg;
00675
00681 Subformat& operator=(const Subformat& that) {
00682 format = that.format ? that.format->clone() : NULL;
00683 offset = that.offset;
00684 arg = that.arg;
00685 return *this;
00686 }
00687
00691 UBool operator==(const Subformat& that) const {
00692
00693 return offset == that.offset &&
00694 arg == that.arg &&
00695 ((format == that.format) ||
00696 (*format == *that.format));
00697 }
00698
00702 UBool operator!=(const Subformat& that) const {
00703 return !operator==(that);
00704 }
00705 };
00706
00711 Subformat* subformats;
00712 int32_t subformatCount;
00713 int32_t subformatCapacity;
00714
00723 Formattable::Type* argTypes;
00724 int32_t argTypeCount;
00725 int32_t argTypeCapacity;
00726
00727
00728 UBool allocateSubformats(int32_t capacity);
00729 UBool allocateArgTypes(int32_t capacity);
00730
00738 NumberFormat* defaultNumberFormat;
00739 DateFormat* defaultDateFormat;
00740
00745 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00746 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00747
00754 static int32_t findKeyword( const UnicodeString& s,
00755 const UChar * const *list);
00756
00773 UnicodeString& format( const Formattable* arguments,
00774 int32_t cnt,
00775 UnicodeString& appendTo,
00776 FieldPosition& status,
00777 int32_t recursionProtection,
00778 UErrorCode& success) const;
00779
00780 void makeFormat(int32_t offsetNumber,
00781 UnicodeString* segments,
00782 UParseError& parseError,
00783 UErrorCode& success);
00784
00788 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
00789
00799 static void copyAndFixQuotes(const UnicodeString& appendTo, int32_t start, int32_t end, UnicodeString& target);
00800
00809 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
00810 listCount = argTypeCount;
00811 return argTypes;
00812 }
00813
00814 friend class MessageFormatAdapter;
00815 };
00816
00817 inline UnicodeString&
00818 MessageFormat::format(const Formattable& obj,
00819 UnicodeString& appendTo,
00820 UErrorCode& status) const {
00821 return Format::format(obj, appendTo, status);
00822 }
00823 U_NAMESPACE_END
00824
00825 #endif
00826
00827 #endif // _MSGFMT
00828
00829