ICU 4.8.1.1
4.8.1.1
|
00001 /* 00002 * Copyright (C) 2007-2011, International Business Machines Corporation and 00003 * others. All Rights Reserved. 00004 ******************************************************************************** 00005 * 00006 * File MSGFMT.H 00007 * 00008 * Modification History: 00009 * 00010 * Date Name Description 00011 * 02/19/97 aliu Converted from java. 00012 * 03/20/97 helena Finished first cut of implementation. 00013 * 07/22/98 stephen Removed operator!= (defined in Format) 00014 * 08/19/2002 srl Removing Javaisms 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/messagepattern.h" 00032 #include "unicode/parseerr.h" 00033 #include "unicode/plurfmt.h" 00034 #include "unicode/plurrule.h" 00035 00036 U_CDECL_BEGIN 00037 // Forward declaration. 00038 struct UHashtable; 00039 typedef struct UHashtable UHashtable; 00040 U_CDECL_END 00041 00042 U_NAMESPACE_BEGIN 00043 00044 class AppendableWrapper; 00045 class DateFormat; 00046 class NumberFormat; 00047 00318 class U_I18N_API MessageFormat : public Format { 00319 public: 00325 enum EFormatNumber { 00331 kMaxFormat = 10 00332 }; 00333 00343 MessageFormat(const UnicodeString& pattern, 00344 UErrorCode &status); 00345 00354 MessageFormat(const UnicodeString& pattern, 00355 const Locale& newLocale, 00356 UErrorCode& status); 00367 MessageFormat(const UnicodeString& pattern, 00368 const Locale& newLocale, 00369 UParseError& parseError, 00370 UErrorCode& status); 00375 MessageFormat(const MessageFormat&); 00376 00381 const MessageFormat& operator=(const MessageFormat&); 00382 00387 virtual ~MessageFormat(); 00388 00394 virtual Format* clone(void) const; 00395 00403 virtual UBool operator==(const Format& other) const; 00404 00410 virtual void setLocale(const Locale& theLocale); 00411 00418 virtual const Locale& getLocale(void) const; 00419 00428 virtual void applyPattern(const UnicodeString& pattern, 00429 UErrorCode& status); 00440 virtual void applyPattern(const UnicodeString& pattern, 00441 UParseError& parseError, 00442 UErrorCode& status); 00443 00462 virtual void applyPattern(const UnicodeString& pattern, 00463 UMessagePatternApostropheMode aposMode, 00464 UParseError* parseError, 00465 UErrorCode& status); 00466 00471 UMessagePatternApostropheMode getApostropheMode() const { 00472 return msgPattern.getApostropheMode(); 00473 } 00474 00483 virtual UnicodeString& toPattern(UnicodeString& appendTo) const; 00484 00501 virtual void adoptFormats(Format** formatsToAdopt, int32_t count); 00502 00517 virtual void setFormats(const Format** newFormats, int32_t cnt); 00518 00519 00534 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt); 00535 00545 virtual void setFormat(int32_t formatNumber, const Format& format); 00546 00555 virtual StringEnumeration* getFormatNames(UErrorCode& status); 00556 00570 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status); 00571 00585 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status); 00586 00601 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status); 00602 00615 virtual const Format** getFormats(int32_t& count) const; 00616 00617 00618 using Format::format; 00619 00637 UnicodeString& format(const Formattable* source, 00638 int32_t count, 00639 UnicodeString& appendTo, 00640 FieldPosition& ignore, 00641 UErrorCode& status) const; 00642 00660 static UnicodeString& format(const UnicodeString& pattern, 00661 const Formattable* arguments, 00662 int32_t count, 00663 UnicodeString& appendTo, 00664 UErrorCode& status); 00665 00686 virtual UnicodeString& format(const Formattable& obj, 00687 UnicodeString& appendTo, 00688 FieldPosition& pos, 00689 UErrorCode& status) const; 00690 00705 UnicodeString& format(const Formattable& obj, 00706 UnicodeString& appendTo, 00707 UErrorCode& status) const; 00708 00709 00728 UnicodeString& format(const UnicodeString* argumentNames, 00729 const Formattable* arguments, 00730 int32_t count, 00731 UnicodeString& appendTo, 00732 UErrorCode& status) const; 00746 virtual Formattable* parse(const UnicodeString& source, 00747 ParsePosition& pos, 00748 int32_t& count) const; 00749 00765 virtual Formattable* parse(const UnicodeString& source, 00766 int32_t& count, 00767 UErrorCode& status) const; 00768 00781 virtual void parseObject(const UnicodeString& source, 00782 Formattable& result, 00783 ParsePosition& pos) const; 00784 00804 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern, 00805 UErrorCode& status); 00806 00807 00815 UBool usesNamedArguments() const; 00816 00817 00828 int32_t getArgTypeCount() const; 00829 00841 virtual UClassID getDynamicClassID(void) const; 00842 00854 static UClassID U_EXPORT2 getStaticClassID(void); 00855 00866 static UBool equalFormats(const void* left, const void* right); 00867 00868 private: 00869 00870 Locale fLocale; 00871 MessagePattern msgPattern; 00872 Format** formatAliases; // see getFormats 00873 int32_t formatAliasesCapacity; 00874 00875 MessageFormat(); // default constructor not implemented 00876 00883 class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector { 00884 public: 00885 PluralSelectorProvider(const Locale* loc); 00886 virtual ~PluralSelectorProvider(); 00887 virtual UnicodeString select(double number, UErrorCode& ec) const; 00888 00889 void reset(const Locale* loc); 00890 private: 00891 const Locale* locale; 00892 PluralRules* rules; 00893 }; 00894 00903 Formattable::Type* argTypes; 00904 int32_t argTypeCount; 00905 int32_t argTypeCapacity; 00906 00912 UBool hasArgTypeConflicts; 00913 00914 // Variable-size array management 00915 UBool allocateArgTypes(int32_t capacity, UErrorCode& status); 00916 00924 NumberFormat* defaultNumberFormat; 00925 DateFormat* defaultDateFormat; 00926 00927 UHashtable* cachedFormatters; 00928 UHashtable* customFormatArgStarts; 00929 00930 PluralSelectorProvider pluralProvider; 00931 00936 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const; 00937 const DateFormat* getDefaultDateFormat(UErrorCode&) const; 00938 00945 static int32_t findKeyword( const UnicodeString& s, 00946 const UChar * const *list); 00947 00953 UnicodeString& format(const Formattable* arguments, 00954 const UnicodeString *argumentNames, 00955 int32_t cnt, 00956 UnicodeString& appendTo, 00957 FieldPosition* pos, 00958 UErrorCode& status) const; 00959 00977 void format(int32_t msgStart, 00978 double pluralNumber, 00979 const Formattable* arguments, 00980 const UnicodeString *argumentNames, 00981 int32_t cnt, 00982 AppendableWrapper& appendTo, 00983 FieldPosition* pos, 00984 UErrorCode& success) const; 00985 00986 UnicodeString getArgName(int32_t partIndex); 00987 00988 void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status); 00989 00990 void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status); 00991 00992 int32_t nextTopLevelArgStart(int32_t partIndex) const; 00993 00994 UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber); 00995 00996 void cacheExplicitFormats(UErrorCode& status); 00997 00998 Format* createAppropriateFormat(UnicodeString& type, 00999 UnicodeString& style, 01000 Formattable::Type& formattableType, 01001 UParseError& parseError, 01002 UErrorCode& ec); 01003 01004 const Formattable* getArgFromListByName(const Formattable* arguments, 01005 const UnicodeString *argumentNames, 01006 int32_t cnt, UnicodeString& name) const; 01007 01008 Formattable* parse(int32_t msgStart, 01009 const UnicodeString& source, 01010 ParsePosition& pos, 01011 int32_t& count, 01012 UErrorCode& ec) const; 01013 01014 FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength, 01015 FieldPosition* fp, const Formattable* argId) const; 01016 01017 Format* getCachedFormatter(int32_t argumentNumber) const; 01018 01019 UnicodeString getLiteralStringUntilNextArgument(int32_t from) const; 01020 01021 void copyObjects(const MessageFormat& that, UErrorCode& ec); 01022 01023 void formatComplexSubMessage(int32_t msgStart, 01024 double pluralNumber, 01025 const Formattable* arguments, 01026 const UnicodeString *argumentNames, 01027 int32_t cnt, 01028 AppendableWrapper& appendTo, 01029 UErrorCode& success) const; 01030 01034 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const; 01035 01044 const Formattable::Type* getArgTypeList(int32_t& listCount) const { 01045 listCount = argTypeCount; 01046 return argTypes; 01047 } 01048 01052 void resetPattern(); 01053 01059 class U_I18N_API DummyFormat : public Format { 01060 public: 01061 virtual UBool operator==(const Format&) const; 01062 virtual Format* clone() const; 01063 virtual UnicodeString& format(const Formattable&, 01064 UnicodeString& appendTo, 01065 FieldPosition&, 01066 UErrorCode& status) const; 01067 virtual void parseObject(const UnicodeString&, 01068 Formattable&, 01069 ParsePosition&) const; 01070 virtual UClassID getDynamicClassID() const; 01071 }; 01072 01073 friend class MessageFormatAdapter; // getFormatTypeList() access 01074 }; 01075 01076 inline UnicodeString& 01077 MessageFormat::format(const Formattable& obj, 01078 UnicodeString& appendTo, 01079 UErrorCode& status) const { 01080 return Format::format(obj, appendTo, status); 01081 } 01082 01083 01084 U_NAMESPACE_END 01085 01086 #endif /* #if !UCONFIG_NO_FORMATTING */ 01087 01088 #endif // _MSGFMT 01089 //eof