ICU 49.1.1
49.1.1
|
00001 /* 00002 * Copyright (C) 2007-2012, 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 00322 class U_I18N_API MessageFormat : public Format { 00323 public: 00324 #ifndef U_HIDE_OBSOLETE_API 00325 00330 enum EFormatNumber { 00336 kMaxFormat = 10 00337 }; 00338 #endif /* U_HIDE_OBSOLETE_API */ 00339 00349 MessageFormat(const UnicodeString& pattern, 00350 UErrorCode &status); 00351 00360 MessageFormat(const UnicodeString& pattern, 00361 const Locale& newLocale, 00362 UErrorCode& status); 00373 MessageFormat(const UnicodeString& pattern, 00374 const Locale& newLocale, 00375 UParseError& parseError, 00376 UErrorCode& status); 00381 MessageFormat(const MessageFormat&); 00382 00387 const MessageFormat& operator=(const MessageFormat&); 00388 00393 virtual ~MessageFormat(); 00394 00400 virtual Format* clone(void) const; 00401 00409 virtual UBool operator==(const Format& other) const; 00410 00416 virtual void setLocale(const Locale& theLocale); 00417 00424 virtual const Locale& getLocale(void) const; 00425 00434 virtual void applyPattern(const UnicodeString& pattern, 00435 UErrorCode& status); 00446 virtual void applyPattern(const UnicodeString& pattern, 00447 UParseError& parseError, 00448 UErrorCode& status); 00449 00468 virtual void applyPattern(const UnicodeString& pattern, 00469 UMessagePatternApostropheMode aposMode, 00470 UParseError* parseError, 00471 UErrorCode& status); 00472 00477 UMessagePatternApostropheMode getApostropheMode() const { 00478 return msgPattern.getApostropheMode(); 00479 } 00480 00489 virtual UnicodeString& toPattern(UnicodeString& appendTo) const; 00490 00507 virtual void adoptFormats(Format** formatsToAdopt, int32_t count); 00508 00523 virtual void setFormats(const Format** newFormats, int32_t cnt); 00524 00525 00540 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt); 00541 00551 virtual void setFormat(int32_t formatNumber, const Format& format); 00552 00561 virtual StringEnumeration* getFormatNames(UErrorCode& status); 00562 00576 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status); 00577 00591 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status); 00592 00607 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status); 00608 00621 virtual const Format** getFormats(int32_t& count) const; 00622 00623 00624 using Format::format; 00625 00643 UnicodeString& format(const Formattable* source, 00644 int32_t count, 00645 UnicodeString& appendTo, 00646 FieldPosition& ignore, 00647 UErrorCode& status) const; 00648 00666 static UnicodeString& format(const UnicodeString& pattern, 00667 const Formattable* arguments, 00668 int32_t count, 00669 UnicodeString& appendTo, 00670 UErrorCode& status); 00671 00692 virtual UnicodeString& format(const Formattable& obj, 00693 UnicodeString& appendTo, 00694 FieldPosition& pos, 00695 UErrorCode& status) const; 00696 00711 UnicodeString& format(const Formattable& obj, 00712 UnicodeString& appendTo, 00713 UErrorCode& status) const; 00714 00715 00734 UnicodeString& format(const UnicodeString* argumentNames, 00735 const Formattable* arguments, 00736 int32_t count, 00737 UnicodeString& appendTo, 00738 UErrorCode& status) const; 00752 virtual Formattable* parse(const UnicodeString& source, 00753 ParsePosition& pos, 00754 int32_t& count) const; 00755 00771 virtual Formattable* parse(const UnicodeString& source, 00772 int32_t& count, 00773 UErrorCode& status) const; 00774 00787 virtual void parseObject(const UnicodeString& source, 00788 Formattable& result, 00789 ParsePosition& pos) const; 00790 00810 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern, 00811 UErrorCode& status); 00812 00813 00821 UBool usesNamedArguments() const; 00822 00823 00824 #ifndef U_HIDE_INTERNAL_API 00825 00835 int32_t getArgTypeCount() const; 00836 #endif /* U_HIDE_INTERNAL_API */ 00837 00849 virtual UClassID getDynamicClassID(void) const; 00850 00862 static UClassID U_EXPORT2 getStaticClassID(void); 00863 00864 #ifndef U_HIDE_INTERNAL_API 00865 00875 static UBool equalFormats(const void* left, const void* right); 00876 #endif /* U_HIDE_INTERNAL_API */ 00877 00878 private: 00879 00880 Locale fLocale; 00881 MessagePattern msgPattern; 00882 Format** formatAliases; // see getFormats 00883 int32_t formatAliasesCapacity; 00884 00885 MessageFormat(); // default constructor not implemented 00886 00893 class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector { 00894 public: 00895 PluralSelectorProvider(const Locale* loc); 00896 virtual ~PluralSelectorProvider(); 00897 virtual UnicodeString select(double number, UErrorCode& ec) const; 00898 00899 void reset(const Locale* loc); 00900 private: 00901 const Locale* locale; 00902 PluralRules* rules; 00903 }; 00904 00913 Formattable::Type* argTypes; 00914 int32_t argTypeCount; 00915 int32_t argTypeCapacity; 00916 00922 UBool hasArgTypeConflicts; 00923 00924 // Variable-size array management 00925 UBool allocateArgTypes(int32_t capacity, UErrorCode& status); 00926 00934 NumberFormat* defaultNumberFormat; 00935 DateFormat* defaultDateFormat; 00936 00937 UHashtable* cachedFormatters; 00938 UHashtable* customFormatArgStarts; 00939 00940 PluralSelectorProvider pluralProvider; 00941 00946 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const; 00947 const DateFormat* getDefaultDateFormat(UErrorCode&) const; 00948 00955 static int32_t findKeyword( const UnicodeString& s, 00956 const UChar * const *list); 00957 00963 UnicodeString& format(const Formattable* arguments, 00964 const UnicodeString *argumentNames, 00965 int32_t cnt, 00966 UnicodeString& appendTo, 00967 FieldPosition* pos, 00968 UErrorCode& status) const; 00969 00987 void format(int32_t msgStart, 00988 double pluralNumber, 00989 const Formattable* arguments, 00990 const UnicodeString *argumentNames, 00991 int32_t cnt, 00992 AppendableWrapper& appendTo, 00993 FieldPosition* pos, 00994 UErrorCode& success) const; 00995 00996 UnicodeString getArgName(int32_t partIndex); 00997 00998 void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status); 00999 01000 void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status); 01001 01002 int32_t nextTopLevelArgStart(int32_t partIndex) const; 01003 01004 UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber); 01005 01006 void cacheExplicitFormats(UErrorCode& status); 01007 01008 Format* createAppropriateFormat(UnicodeString& type, 01009 UnicodeString& style, 01010 Formattable::Type& formattableType, 01011 UParseError& parseError, 01012 UErrorCode& ec); 01013 01014 const Formattable* getArgFromListByName(const Formattable* arguments, 01015 const UnicodeString *argumentNames, 01016 int32_t cnt, UnicodeString& name) const; 01017 01018 Formattable* parse(int32_t msgStart, 01019 const UnicodeString& source, 01020 ParsePosition& pos, 01021 int32_t& count, 01022 UErrorCode& ec) const; 01023 01024 FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength, 01025 FieldPosition* fp, const Formattable* argId) const; 01026 01027 Format* getCachedFormatter(int32_t argumentNumber) const; 01028 01029 UnicodeString getLiteralStringUntilNextArgument(int32_t from) const; 01030 01031 void copyObjects(const MessageFormat& that, UErrorCode& ec); 01032 01033 void formatComplexSubMessage(int32_t msgStart, 01034 double pluralNumber, 01035 const Formattable* arguments, 01036 const UnicodeString *argumentNames, 01037 int32_t cnt, 01038 AppendableWrapper& appendTo, 01039 UErrorCode& success) const; 01040 01044 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const; 01045 01054 const Formattable::Type* getArgTypeList(int32_t& listCount) const { 01055 listCount = argTypeCount; 01056 return argTypes; 01057 } 01058 01062 void resetPattern(); 01063 01069 class U_I18N_API DummyFormat : public Format { 01070 public: 01071 virtual UBool operator==(const Format&) const; 01072 virtual Format* clone() const; 01073 virtual UnicodeString& format(const Formattable&, 01074 UnicodeString& appendTo, 01075 FieldPosition&, 01076 UErrorCode& status) const; 01077 virtual void parseObject(const UnicodeString&, 01078 Formattable&, 01079 ParsePosition&) const; 01080 virtual UClassID getDynamicClassID() const; 01081 }; 01082 01083 friend class MessageFormatAdapter; // getFormatTypeList() access 01084 }; 01085 01086 inline UnicodeString& 01087 MessageFormat::format(const Formattable& obj, 01088 UnicodeString& appendTo, 01089 UErrorCode& status) const { 01090 return Format::format(obj, appendTo, status); 01091 } 01092 01093 01094 U_NAMESPACE_END 01095 01096 #endif /* #if !UCONFIG_NO_FORMATTING */ 01097 01098 #endif // _MSGFMT 01099 //eof