ICU 49.1.1  49.1.1
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 
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