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/messagepattern.h"
00032 #include "unicode/parseerr.h"
00033 #include "unicode/plurfmt.h"
00034 #include "unicode/plurrule.h"
00035
00036 U_CDECL_BEGIN
00037
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
00323 class U_I18N_API MessageFormat : public Format {
00324 public:
00325 #ifndef U_HIDE_OBSOLETE_API
00326
00331 enum EFormatNumber {
00337 kMaxFormat = 10
00338 };
00339 #endif
00340
00350 MessageFormat(const UnicodeString& pattern,
00351 UErrorCode &status);
00352
00361 MessageFormat(const UnicodeString& pattern,
00362 const Locale& newLocale,
00363 UErrorCode& status);
00374 MessageFormat(const UnicodeString& pattern,
00375 const Locale& newLocale,
00376 UParseError& parseError,
00377 UErrorCode& status);
00382 MessageFormat(const MessageFormat&);
00383
00388 const MessageFormat& operator=(const MessageFormat&);
00389
00394 virtual ~MessageFormat();
00395
00401 virtual Format* clone(void) const;
00402
00410 virtual UBool operator==(const Format& other) const;
00411
00417 virtual void setLocale(const Locale& theLocale);
00418
00425 virtual const Locale& getLocale(void) const;
00426
00435 virtual void applyPattern(const UnicodeString& pattern,
00436 UErrorCode& status);
00447 virtual void applyPattern(const UnicodeString& pattern,
00448 UParseError& parseError,
00449 UErrorCode& status);
00450
00469 virtual void applyPattern(const UnicodeString& pattern,
00470 UMessagePatternApostropheMode aposMode,
00471 UParseError* parseError,
00472 UErrorCode& status);
00473
00478 UMessagePatternApostropheMode getApostropheMode() const {
00479 return msgPattern.getApostropheMode();
00480 }
00481
00490 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00491
00508 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00509
00524 virtual void setFormats(const Format** newFormats, int32_t cnt);
00525
00526
00541 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00542
00552 virtual void setFormat(int32_t formatNumber, const Format& format);
00553
00562 virtual StringEnumeration* getFormatNames(UErrorCode& status);
00563
00577 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00578
00592 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00593
00608 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00609
00622 virtual const Format** getFormats(int32_t& count) const;
00623
00624
00625 using Format::format;
00626
00644 UnicodeString& format(const Formattable* source,
00645 int32_t count,
00646 UnicodeString& appendTo,
00647 FieldPosition& ignore,
00648 UErrorCode& status) const;
00649
00667 static UnicodeString& format(const UnicodeString& pattern,
00668 const Formattable* arguments,
00669 int32_t count,
00670 UnicodeString& appendTo,
00671 UErrorCode& status);
00672
00693 virtual UnicodeString& format(const Formattable& obj,
00694 UnicodeString& appendTo,
00695 FieldPosition& pos,
00696 UErrorCode& status) const;
00697
00716 UnicodeString& format(const UnicodeString* argumentNames,
00717 const Formattable* arguments,
00718 int32_t count,
00719 UnicodeString& appendTo,
00720 UErrorCode& status) const;
00734 virtual Formattable* parse(const UnicodeString& source,
00735 ParsePosition& pos,
00736 int32_t& count) const;
00737
00753 virtual Formattable* parse(const UnicodeString& source,
00754 int32_t& count,
00755 UErrorCode& status) const;
00756
00769 virtual void parseObject(const UnicodeString& source,
00770 Formattable& result,
00771 ParsePosition& pos) const;
00772
00792 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00793 UErrorCode& status);
00794
00795
00803 UBool usesNamedArguments() const;
00804
00805
00806 #ifndef U_HIDE_INTERNAL_API
00807
00817 int32_t getArgTypeCount() const;
00818 #endif
00819
00831 virtual UClassID getDynamicClassID(void) const;
00832
00844 static UClassID U_EXPORT2 getStaticClassID(void);
00845
00846 #ifndef U_HIDE_INTERNAL_API
00847
00857 static UBool equalFormats(const void* left, const void* right);
00858 #endif
00859
00860 private:
00861
00862 Locale fLocale;
00863 MessagePattern msgPattern;
00864 Format** formatAliases;
00865 int32_t formatAliasesCapacity;
00866
00867 MessageFormat();
00868
00875 class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00876 public:
00877 PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
00878 virtual ~PluralSelectorProvider();
00879 virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const;
00880
00881 void reset();
00882 private:
00883 const MessageFormat &msgFormat;
00884 PluralRules* rules;
00885 UPluralType type;
00886 };
00887
00896 Formattable::Type* argTypes;
00897 int32_t argTypeCount;
00898 int32_t argTypeCapacity;
00899
00905 UBool hasArgTypeConflicts;
00906
00907
00908 UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00909
00917 NumberFormat* defaultNumberFormat;
00918 DateFormat* defaultDateFormat;
00919
00920 UHashtable* cachedFormatters;
00921 UHashtable* customFormatArgStarts;
00922
00923 PluralSelectorProvider pluralProvider;
00924 PluralSelectorProvider ordinalProvider;
00925
00930 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00931 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00932
00939 static int32_t findKeyword( const UnicodeString& s,
00940 const UChar * const *list);
00941
00947 UnicodeString& format(const Formattable* arguments,
00948 const UnicodeString *argumentNames,
00949 int32_t cnt,
00950 UnicodeString& appendTo,
00951 FieldPosition* pos,
00952 UErrorCode& status) const;
00953
00971 void format(int32_t msgStart,
00972 const void *plNumber,
00973 const Formattable* arguments,
00974 const UnicodeString *argumentNames,
00975 int32_t cnt,
00976 AppendableWrapper& appendTo,
00977 FieldPosition* pos,
00978 UErrorCode& success) const;
00979
00980 UnicodeString getArgName(int32_t partIndex);
00981
00982 void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
00983
00984 void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
00985
00986 int32_t nextTopLevelArgStart(int32_t partIndex) const;
00987
00988 UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
00989
00990 void cacheExplicitFormats(UErrorCode& status);
00991
00992 Format* createAppropriateFormat(UnicodeString& type,
00993 UnicodeString& style,
00994 Formattable::Type& formattableType,
00995 UParseError& parseError,
00996 UErrorCode& ec);
00997
00998 const Formattable* getArgFromListByName(const Formattable* arguments,
00999 const UnicodeString *argumentNames,
01000 int32_t cnt, UnicodeString& name) const;
01001
01002 Formattable* parse(int32_t msgStart,
01003 const UnicodeString& source,
01004 ParsePosition& pos,
01005 int32_t& count,
01006 UErrorCode& ec) const;
01007
01008 FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01009 FieldPosition* fp, const Formattable* argId) const;
01010
01016 int32_t findOtherSubMessage(int32_t partIndex) const;
01017
01023 int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const;
01024
01025 Format* getCachedFormatter(int32_t argumentNumber) const;
01026
01027 UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
01028
01029 void copyObjects(const MessageFormat& that, UErrorCode& ec);
01030
01031 void formatComplexSubMessage(int32_t msgStart,
01032 const void *plNumber,
01033 const Formattable* arguments,
01034 const UnicodeString *argumentNames,
01035 int32_t cnt,
01036 AppendableWrapper& appendTo,
01037 UErrorCode& success) const;
01038
01042 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
01043
01051 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01052 listCount = argTypeCount;
01053 return argTypes;
01054 }
01055
01059 void resetPattern();
01060
01065 class U_I18N_API DummyFormat : public Format {
01066 public:
01067 virtual UBool operator==(const Format&) const;
01068 virtual Format* clone() const;
01069 virtual UnicodeString& format(const Formattable& obj,
01070 UnicodeString& appendTo,
01071 UErrorCode& status) const;
01072 virtual UnicodeString& format(const Formattable&,
01073 UnicodeString& appendTo,
01074 FieldPosition&,
01075 UErrorCode& status) const;
01076 virtual UnicodeString& format(const Formattable& obj,
01077 UnicodeString& appendTo,
01078 FieldPositionIterator* posIter,
01079 UErrorCode& status) const;
01080 virtual void parseObject(const UnicodeString&,
01081 Formattable&,
01082 ParsePosition&) const;
01083 };
01084
01085 friend class MessageFormatAdapter;
01086 };
01087
01088 U_NAMESPACE_END
01089
01090 #endif
01091
01092 #endif // _MSGFMT
01093