msgfmt.h

Go to the documentation of this file.
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 
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  /* U_HIDE_OBSOLETE_API */
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 
00712     UnicodeString& format(const Formattable& obj,
00713                           UnicodeString& appendTo,
00714                           UErrorCode& status) const;
00715 
00716 
00735     UnicodeString& format(const UnicodeString* argumentNames,
00736                           const Formattable* arguments,
00737                           int32_t count,
00738                           UnicodeString& appendTo,
00739                           UErrorCode& status) const;
00753     virtual Formattable* parse(const UnicodeString& source,
00754                                ParsePosition& pos,
00755                                int32_t& count) const;
00756 
00772     virtual Formattable* parse(const UnicodeString& source,
00773                                int32_t& count,
00774                                UErrorCode& status) const;
00775 
00788     virtual void parseObject(const UnicodeString& source,
00789                              Formattable& result,
00790                              ParsePosition& pos) const;
00791 
00811     static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00812         UErrorCode& status);
00813 
00814 
00822     UBool usesNamedArguments() const;
00823 
00824 
00825 #ifndef U_HIDE_INTERNAL_API
00826 
00836     int32_t getArgTypeCount() const;
00837 #endif  /* U_HIDE_INTERNAL_API */
00838 
00850     virtual UClassID getDynamicClassID(void) const;
00851 
00863     static UClassID U_EXPORT2 getStaticClassID(void);
00864 
00865 #ifndef U_HIDE_INTERNAL_API
00866 
00876     static UBool equalFormats(const void* left, const void* right);
00877 #endif  /* U_HIDE_INTERNAL_API */
00878 
00879 private:
00880 
00881     Locale              fLocale;
00882     MessagePattern      msgPattern;
00883     Format**            formatAliases; // see getFormats
00884     int32_t             formatAliasesCapacity;
00885 
00886     MessageFormat(); // default constructor not implemented
00887 
00894     class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00895     public:
00896         PluralSelectorProvider(const Locale* loc, UPluralType type);
00897         virtual ~PluralSelectorProvider();
00898         virtual UnicodeString select(double number, UErrorCode& ec) const;
00899 
00900         void reset(const Locale* loc);
00901     private:
00902         const Locale* locale;
00903         PluralRules* rules;
00904         UPluralType type;
00905     };
00906 
00915     Formattable::Type* argTypes;
00916     int32_t            argTypeCount;
00917     int32_t            argTypeCapacity;
00918 
00924     UBool hasArgTypeConflicts;
00925 
00926     // Variable-size array management
00927     UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00928 
00936     NumberFormat* defaultNumberFormat;
00937     DateFormat*   defaultDateFormat;
00938 
00939     UHashtable* cachedFormatters;
00940     UHashtable* customFormatArgStarts;
00941 
00942     PluralSelectorProvider pluralProvider;
00943     PluralSelectorProvider ordinalProvider;
00944 
00949     const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00950     const DateFormat*   getDefaultDateFormat(UErrorCode&) const;
00951 
00958     static int32_t findKeyword( const UnicodeString& s,
00959                                 const UChar * const *list);
00960 
00966     UnicodeString& format(const Formattable* arguments,
00967                           const UnicodeString *argumentNames,
00968                           int32_t cnt,
00969                           UnicodeString& appendTo,
00970                           FieldPosition* pos,
00971                           UErrorCode& status) const;
00972 
00990     void format(int32_t msgStart,
00991                 double pluralNumber,
00992                 const Formattable* arguments,
00993                 const UnicodeString *argumentNames,
00994                 int32_t cnt,
00995                 AppendableWrapper& appendTo,
00996                 FieldPosition* pos,
00997                 UErrorCode& success) const;
00998 
00999     UnicodeString getArgName(int32_t partIndex);
01000 
01001     void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01002 
01003     void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01004 
01005     int32_t nextTopLevelArgStart(int32_t partIndex) const;
01006 
01007     UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
01008 
01009     void cacheExplicitFormats(UErrorCode& status);
01010 
01011     Format* createAppropriateFormat(UnicodeString& type,
01012                                     UnicodeString& style,
01013                                     Formattable::Type& formattableType,
01014                                     UParseError& parseError,
01015                                     UErrorCode& ec);
01016 
01017     const Formattable* getArgFromListByName(const Formattable* arguments,
01018                                             const UnicodeString *argumentNames,
01019                                             int32_t cnt, UnicodeString& name) const;
01020 
01021     Formattable* parse(int32_t msgStart,
01022                        const UnicodeString& source,
01023                        ParsePosition& pos,
01024                        int32_t& count,
01025                        UErrorCode& ec) const;
01026 
01027     FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01028                                   FieldPosition* fp, const Formattable* argId) const;
01029 
01030     Format* getCachedFormatter(int32_t argumentNumber) const;
01031 
01032     UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
01033 
01034     void copyObjects(const MessageFormat& that, UErrorCode& ec);
01035 
01036     void formatComplexSubMessage(int32_t msgStart,
01037                                  double pluralNumber,
01038                                  const Formattable* arguments,
01039                                  const UnicodeString *argumentNames,
01040                                  int32_t cnt,
01041                                  AppendableWrapper& appendTo,
01042                                  UErrorCode& success) const;
01043 
01047     NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
01048 
01057     const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01058         listCount = argTypeCount;
01059         return argTypes;
01060     }
01061 
01065     void resetPattern();
01066 
01072     class U_I18N_API DummyFormat : public Format {
01073     public:
01074         virtual UBool operator==(const Format&) const;
01075         virtual Format* clone() const;
01076         virtual UnicodeString& format(const Formattable& obj,
01077                               UnicodeString& appendTo,
01078                               UErrorCode& status) const;
01079         virtual UnicodeString& format(const Formattable&,
01080                                       UnicodeString& appendTo,
01081                                       FieldPosition&,
01082                                       UErrorCode& status) const;
01083         virtual UnicodeString& format(const Formattable& obj,
01084                                       UnicodeString& appendTo,
01085                                       FieldPositionIterator* posIter,
01086                                       UErrorCode& status) const;
01087         virtual void parseObject(const UnicodeString&,
01088                                  Formattable&,
01089                                  ParsePosition&) const;
01090         virtual UClassID getDynamicClassID() const;
01091     };
01092 
01093     friend class MessageFormatAdapter; // getFormatTypeList() access
01094 };
01095 
01096 inline UnicodeString&
01097 MessageFormat::format(const Formattable& obj,
01098                       UnicodeString& appendTo,
01099                       UErrorCode& status) const {
01100     return Format::format(obj, appendTo, status);
01101 }
01102 
01103 
01104 U_NAMESPACE_END
01105 
01106 #endif /* #if !UCONFIG_NO_FORMATTING */
01107 
01108 #endif // _MSGFMT
01109 //eof

Generated on 25 Nov 2014 for ICU 50.1.2 by  doxygen 1.4.7