00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef MSGFMT_H
00020 #define MSGFMT_H
00021
00022 #include "unicode/utypes.h"
00023
00029 #if !UCONFIG_NO_FORMATTING
00030
00031 #include "unicode/format.h"
00032 #include "unicode/locid.h"
00033 #include "unicode/messagepattern.h"
00034 #include "unicode/parseerr.h"
00035 #include "unicode/plurfmt.h"
00036 #include "unicode/plurrule.h"
00037
00038 U_CDECL_BEGIN
00039
00040 struct UHashtable;
00041 typedef struct UHashtable UHashtable;
00042 U_CDECL_END
00043
00044 U_NAMESPACE_BEGIN
00045
00046 class AppendableWrapper;
00047 class DateFormat;
00048 class NumberFormat;
00049
00325 class U_I18N_API MessageFormat : public Format {
00326 public:
00327 #ifndef U_HIDE_OBSOLETE_API
00328
00333 enum EFormatNumber {
00339 kMaxFormat = 10
00340 };
00341 #endif
00342
00352 MessageFormat(const UnicodeString& pattern,
00353 UErrorCode &status);
00354
00363 MessageFormat(const UnicodeString& pattern,
00364 const Locale& newLocale,
00365 UErrorCode& status);
00376 MessageFormat(const UnicodeString& pattern,
00377 const Locale& newLocale,
00378 UParseError& parseError,
00379 UErrorCode& status);
00384 MessageFormat(const MessageFormat&);
00385
00390 const MessageFormat& operator=(const MessageFormat&);
00391
00396 virtual ~MessageFormat();
00397
00403 virtual Format* clone(void) const;
00404
00412 virtual UBool operator==(const Format& other) const;
00413
00419 virtual void setLocale(const Locale& theLocale);
00420
00427 virtual const Locale& getLocale(void) const;
00428
00437 virtual void applyPattern(const UnicodeString& pattern,
00438 UErrorCode& status);
00449 virtual void applyPattern(const UnicodeString& pattern,
00450 UParseError& parseError,
00451 UErrorCode& status);
00452
00471 virtual void applyPattern(const UnicodeString& pattern,
00472 UMessagePatternApostropheMode aposMode,
00473 UParseError* parseError,
00474 UErrorCode& status);
00475
00480 UMessagePatternApostropheMode getApostropheMode() const {
00481 return msgPattern.getApostropheMode();
00482 }
00483
00492 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00493
00510 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00511
00526 virtual void setFormats(const Format** newFormats, int32_t cnt);
00527
00528
00543 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00544
00554 virtual void setFormat(int32_t formatNumber, const Format& format);
00555
00564 virtual StringEnumeration* getFormatNames(UErrorCode& status);
00565
00579 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00580
00594 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00595
00610 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00611
00624 virtual const Format** getFormats(int32_t& count) const;
00625
00626
00627 using Format::format;
00628
00646 UnicodeString& format(const Formattable* source,
00647 int32_t count,
00648 UnicodeString& appendTo,
00649 FieldPosition& ignore,
00650 UErrorCode& status) const;
00651
00669 static UnicodeString& format(const UnicodeString& pattern,
00670 const Formattable* arguments,
00671 int32_t count,
00672 UnicodeString& appendTo,
00673 UErrorCode& status);
00674
00695 virtual UnicodeString& format(const Formattable& obj,
00696 UnicodeString& appendTo,
00697 FieldPosition& pos,
00698 UErrorCode& status) const;
00699
00718 UnicodeString& format(const UnicodeString* argumentNames,
00719 const Formattable* arguments,
00720 int32_t count,
00721 UnicodeString& appendTo,
00722 UErrorCode& status) const;
00736 virtual Formattable* parse(const UnicodeString& source,
00737 ParsePosition& pos,
00738 int32_t& count) const;
00739
00755 virtual Formattable* parse(const UnicodeString& source,
00756 int32_t& count,
00757 UErrorCode& status) const;
00758
00771 virtual void parseObject(const UnicodeString& source,
00772 Formattable& result,
00773 ParsePosition& pos) const;
00774
00794 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00795 UErrorCode& status);
00796
00797
00805 UBool usesNamedArguments() const;
00806
00807
00808 #ifndef U_HIDE_INTERNAL_API
00809
00819 int32_t getArgTypeCount() const;
00820 #endif
00821
00833 virtual UClassID getDynamicClassID(void) const;
00834
00846 static UClassID U_EXPORT2 getStaticClassID(void);
00847
00848 #ifndef U_HIDE_INTERNAL_API
00849
00859 static UBool equalFormats(const void* left, const void* right);
00860 #endif
00861
00862 private:
00863
00864 Locale fLocale;
00865 MessagePattern msgPattern;
00866 Format** formatAliases;
00867 int32_t formatAliasesCapacity;
00868
00869 MessageFormat();
00870
00877 class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00878 public:
00879 PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
00880 virtual ~PluralSelectorProvider();
00881 virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const;
00882
00883 void reset();
00884 private:
00885 const MessageFormat &msgFormat;
00886 PluralRules* rules;
00887 UPluralType type;
00888 };
00889
00898 Formattable::Type* argTypes;
00899 int32_t argTypeCount;
00900 int32_t argTypeCapacity;
00901
00907 UBool hasArgTypeConflicts;
00908
00909
00910 UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00911
00919 NumberFormat* defaultNumberFormat;
00920 DateFormat* defaultDateFormat;
00921
00922 UHashtable* cachedFormatters;
00923 UHashtable* customFormatArgStarts;
00924
00925 PluralSelectorProvider pluralProvider;
00926 PluralSelectorProvider ordinalProvider;
00927
00932 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00933 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00934
00941 static int32_t findKeyword( const UnicodeString& s,
00942 const char16_t * const *list);
00943
00949 UnicodeString& format(const Formattable* arguments,
00950 const UnicodeString *argumentNames,
00951 int32_t cnt,
00952 UnicodeString& appendTo,
00953 FieldPosition* pos,
00954 UErrorCode& status) const;
00955
00973 void format(int32_t msgStart,
00974 const void *plNumber,
00975 const Formattable* arguments,
00976 const UnicodeString *argumentNames,
00977 int32_t cnt,
00978 AppendableWrapper& appendTo,
00979 FieldPosition* pos,
00980 UErrorCode& success) const;
00981
00982 UnicodeString getArgName(int32_t partIndex);
00983
00984 void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
00985
00986 void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
00987
00988 int32_t nextTopLevelArgStart(int32_t partIndex) const;
00989
00990 UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
00991
00992 void cacheExplicitFormats(UErrorCode& status);
00993
00994 Format* createAppropriateFormat(UnicodeString& type,
00995 UnicodeString& style,
00996 Formattable::Type& formattableType,
00997 UParseError& parseError,
00998 UErrorCode& ec);
00999
01000 const Formattable* getArgFromListByName(const Formattable* arguments,
01001 const UnicodeString *argumentNames,
01002 int32_t cnt, UnicodeString& name) const;
01003
01004 Formattable* parse(int32_t msgStart,
01005 const UnicodeString& source,
01006 ParsePosition& pos,
01007 int32_t& count,
01008 UErrorCode& ec) const;
01009
01010 FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01011 FieldPosition* fp, const Formattable* argId) const;
01012
01018 int32_t findOtherSubMessage(int32_t partIndex) const;
01019
01025 int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) 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 const void *plNumber,
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
01053 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01054 listCount = argTypeCount;
01055 return argTypes;
01056 }
01057
01061 void resetPattern();
01062
01067 class U_I18N_API DummyFormat : public Format {
01068 public:
01069 virtual UBool operator==(const Format&) const;
01070 virtual Format* clone() const;
01071 virtual UnicodeString& format(const Formattable& obj,
01072 UnicodeString& appendTo,
01073 UErrorCode& status) const;
01074 virtual UnicodeString& format(const Formattable&,
01075 UnicodeString& appendTo,
01076 FieldPosition&,
01077 UErrorCode& status) const;
01078 virtual UnicodeString& format(const Formattable& obj,
01079 UnicodeString& appendTo,
01080 FieldPositionIterator* posIter,
01081 UErrorCode& status) const;
01082 virtual void parseObject(const UnicodeString&,
01083 Formattable&,
01084 ParsePosition&) const;
01085 };
01086
01087 friend class MessageFormatAdapter;
01088 };
01089
01090 U_NAMESPACE_END
01091
01092 #endif
01093
01094 #endif // _MSGFMT
01095