ICU 4.8.1.1  4.8.1.1
msgfmt.h
Go to the documentation of this file.
00001 /*
00002 * Copyright (C) 2007-2011, 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 
00318 class U_I18N_API MessageFormat : public Format {
00319 public:
00325     enum EFormatNumber {
00331         kMaxFormat = 10
00332     };
00333 
00343     MessageFormat(const UnicodeString& pattern,
00344                   UErrorCode &status);
00345 
00354     MessageFormat(const UnicodeString& pattern,
00355                   const Locale& newLocale,
00356                         UErrorCode& status);
00367     MessageFormat(const UnicodeString& pattern,
00368                   const Locale& newLocale,
00369                   UParseError& parseError,
00370                   UErrorCode& status);
00375     MessageFormat(const MessageFormat&);
00376 
00381     const MessageFormat& operator=(const MessageFormat&);
00382 
00387     virtual ~MessageFormat();
00388 
00394     virtual Format* clone(void) const;
00395 
00403     virtual UBool operator==(const Format& other) const;
00404 
00410     virtual void setLocale(const Locale& theLocale);
00411 
00418     virtual const Locale& getLocale(void) const;
00419 
00428     virtual void applyPattern(const UnicodeString& pattern,
00429                               UErrorCode& status);
00440     virtual void applyPattern(const UnicodeString& pattern,
00441                              UParseError& parseError,
00442                              UErrorCode& status);
00443 
00462     virtual void applyPattern(const UnicodeString& pattern,
00463                               UMessagePatternApostropheMode aposMode,
00464                               UParseError* parseError,
00465                               UErrorCode& status);
00466 
00471     UMessagePatternApostropheMode getApostropheMode() const {
00472         return msgPattern.getApostropheMode();
00473     }
00474 
00483     virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00484 
00501     virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00502 
00517     virtual void setFormats(const Format** newFormats, int32_t cnt);
00518 
00519 
00534     virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00535 
00545     virtual void setFormat(int32_t formatNumber, const Format& format);
00546 
00555     virtual StringEnumeration* getFormatNames(UErrorCode& status);
00556 
00570     virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00571 
00585     virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00586 
00601     virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00602 
00615     virtual const Format** getFormats(int32_t& count) const;
00616 
00617 
00618     using Format::format;
00619 
00637     UnicodeString& format(const Formattable* source,
00638                           int32_t count,
00639                           UnicodeString& appendTo,
00640                           FieldPosition& ignore,
00641                           UErrorCode& status) const;
00642 
00660     static UnicodeString& format(const UnicodeString& pattern,
00661                                  const Formattable* arguments,
00662                                  int32_t count,
00663                                  UnicodeString& appendTo,
00664                                  UErrorCode& status);
00665 
00686     virtual UnicodeString& format(const Formattable& obj,
00687                                   UnicodeString& appendTo,
00688                                   FieldPosition& pos,
00689                                   UErrorCode& status) const;
00690 
00705     UnicodeString& format(const Formattable& obj,
00706                           UnicodeString& appendTo,
00707                           UErrorCode& status) const;
00708 
00709 
00728     UnicodeString& format(const UnicodeString* argumentNames,
00729                           const Formattable* arguments,
00730                           int32_t count,
00731                           UnicodeString& appendTo,
00732                           UErrorCode& status) const;
00746     virtual Formattable* parse(const UnicodeString& source,
00747                                ParsePosition& pos,
00748                                int32_t& count) const;
00749 
00765     virtual Formattable* parse(const UnicodeString& source,
00766                                int32_t& count,
00767                                UErrorCode& status) const;
00768 
00781     virtual void parseObject(const UnicodeString& source,
00782                              Formattable& result,
00783                              ParsePosition& pos) const;
00784 
00804     static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00805         UErrorCode& status);
00806 
00807 
00815     UBool usesNamedArguments() const;
00816 
00817 
00828     int32_t getArgTypeCount() const;
00829 
00841     virtual UClassID getDynamicClassID(void) const;
00842 
00854     static UClassID U_EXPORT2 getStaticClassID(void);
00855 
00866     static UBool equalFormats(const void* left, const void* right);
00867 
00868 private:
00869 
00870     Locale              fLocale;
00871     MessagePattern      msgPattern;
00872     Format**            formatAliases; // see getFormats
00873     int32_t             formatAliasesCapacity;
00874 
00875     MessageFormat(); // default constructor not implemented
00876 
00883     class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00884     public:
00885         PluralSelectorProvider(const Locale* loc);
00886         virtual ~PluralSelectorProvider();
00887         virtual UnicodeString select(double number, UErrorCode& ec) const;
00888 
00889         void reset(const Locale* loc);
00890     private:
00891         const Locale* locale;
00892         PluralRules* rules;
00893     };
00894 
00903     Formattable::Type* argTypes;
00904     int32_t            argTypeCount;
00905     int32_t            argTypeCapacity;
00906 
00912     UBool hasArgTypeConflicts;
00913 
00914     // Variable-size array management
00915     UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00916 
00924     NumberFormat* defaultNumberFormat;
00925     DateFormat*   defaultDateFormat;
00926 
00927     UHashtable* cachedFormatters;
00928     UHashtable* customFormatArgStarts;
00929 
00930     PluralSelectorProvider pluralProvider;
00931 
00936     const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00937     const DateFormat*   getDefaultDateFormat(UErrorCode&) const;
00938 
00945     static int32_t findKeyword( const UnicodeString& s,
00946                                 const UChar * const *list);
00947 
00953     UnicodeString& format(const Formattable* arguments,
00954                           const UnicodeString *argumentNames,
00955                           int32_t cnt,
00956                           UnicodeString& appendTo,
00957                           FieldPosition* pos,
00958                           UErrorCode& status) const;
00959 
00977     void format(int32_t msgStart,
00978                 double pluralNumber,
00979                 const Formattable* arguments,
00980                 const UnicodeString *argumentNames,
00981                 int32_t cnt,
00982                 AppendableWrapper& appendTo,
00983                 FieldPosition* pos,
00984                 UErrorCode& success) const;
00985 
00986     UnicodeString getArgName(int32_t partIndex);
00987 
00988     void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
00989 
00990     void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
00991 
00992     int32_t nextTopLevelArgStart(int32_t partIndex) const;
00993 
00994     UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
00995 
00996     void cacheExplicitFormats(UErrorCode& status);
00997 
00998     Format* createAppropriateFormat(UnicodeString& type,
00999                                     UnicodeString& style,
01000                                     Formattable::Type& formattableType,
01001                                     UParseError& parseError,
01002                                     UErrorCode& ec);
01003 
01004     const Formattable* getArgFromListByName(const Formattable* arguments,
01005                                             const UnicodeString *argumentNames,
01006                                             int32_t cnt, UnicodeString& name) const;
01007 
01008     Formattable* parse(int32_t msgStart,
01009                        const UnicodeString& source,
01010                        ParsePosition& pos,
01011                        int32_t& count,
01012                        UErrorCode& ec) const;
01013 
01014     FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01015                                   FieldPosition* fp, const Formattable* argId) const;
01016 
01017     Format* getCachedFormatter(int32_t argumentNumber) const;
01018 
01019     UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
01020 
01021     void copyObjects(const MessageFormat& that, UErrorCode& ec);
01022 
01023     void formatComplexSubMessage(int32_t msgStart,
01024                                  double pluralNumber,
01025                                  const Formattable* arguments,
01026                                  const UnicodeString *argumentNames,
01027                                  int32_t cnt,
01028                                  AppendableWrapper& appendTo,
01029                                  UErrorCode& success) const;
01030 
01034     NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
01035 
01044     const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01045         listCount = argTypeCount;
01046         return argTypes;
01047     }
01048 
01052     void resetPattern();
01053 
01059     class U_I18N_API DummyFormat : public Format {
01060     public:
01061         virtual UBool operator==(const Format&) const;
01062         virtual Format* clone() const;
01063         virtual UnicodeString& format(const Formattable&,
01064                                       UnicodeString& appendTo,
01065                                       FieldPosition&,
01066                                       UErrorCode& status) const;
01067         virtual void parseObject(const UnicodeString&,
01068                                  Formattable&,
01069                                  ParsePosition&) const;
01070         virtual UClassID getDynamicClassID() const;
01071     };
01072 
01073     friend class MessageFormatAdapter; // getFormatTypeList() access
01074 };
01075 
01076 inline UnicodeString&
01077 MessageFormat::format(const Formattable& obj,
01078                       UnicodeString& appendTo,
01079                       UErrorCode& status) const {
01080     return Format::format(obj, appendTo, status);
01081 }
01082 
01083 
01084 U_NAMESPACE_END
01085 
01086 #endif /* #if !UCONFIG_NO_FORMATTING */
01087 
01088 #endif // _MSGFMT
01089 //eof
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines