| // © 2016 and later: Unicode, Inc. and others. | 
 | // License & terms of use: http://www.unicode.org/copyright.html | 
 | /* | 
 | ******************************************************************************* | 
 | * Copyright (C) 2007-2016, International Business Machines Corporation and    * | 
 | * others. All Rights Reserved.                                                * | 
 | ******************************************************************************* | 
 | */ | 
 |  | 
 | #ifndef RELDTFMT_H | 
 | #define RELDTFMT_H | 
 |  | 
 | #include "unicode/utypes.h" | 
 |  | 
 | /** | 
 |  * \file | 
 |  * \brief C++ API: Format and parse relative dates and times. | 
 |  */ | 
 |  | 
 | #if !UCONFIG_NO_FORMATTING | 
 |  | 
 | #include "unicode/datefmt.h" | 
 | #include "unicode/smpdtfmt.h" | 
 | #include "unicode/brkiter.h" | 
 |  | 
 | U_NAMESPACE_BEGIN | 
 |  | 
 | // forward declarations | 
 | class DateFormatSymbols; | 
 | class SimpleFormatter; | 
 |  | 
 | // internal structure used for caching strings | 
 | struct URelativeString; | 
 |  | 
 | /** | 
 |  * This class is normally accessed using the kRelative or k...Relative values of EStyle as | 
 |  * parameters to DateFormat::createDateInstance. | 
 |  * | 
 |  * Example: | 
 |  *     DateFormat *fullrelative = DateFormat::createDateInstance(DateFormat::kFullRelative, loc); | 
 |  * | 
 |  * @internal ICU 3.8 | 
 |  */ | 
 |  | 
 | class RelativeDateFormat : public DateFormat { | 
 | public: | 
 |     RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatStyle dateStyle, const Locale& locale, UErrorCode& status); | 
 |  | 
 |     // overrides | 
 |     /** | 
 |      * Copy constructor. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     RelativeDateFormat(const RelativeDateFormat&); | 
 |  | 
 |     /** | 
 |      * Assignment operator. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     RelativeDateFormat& operator=(const RelativeDateFormat&); | 
 |  | 
 |     /** | 
 |      * Destructor. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     virtual ~RelativeDateFormat(); | 
 |  | 
 |     /** | 
 |      * Clone this Format object polymorphically. The caller owns the result and | 
 |      * should delete it when done. | 
 |      * @return    A copy of the object. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     virtual Format* clone(void) const; | 
 |  | 
 |     /** | 
 |      * Return true if the given Format objects are semantically equal. Objects | 
 |      * of different subclasses are considered unequal. | 
 |      * @param other    the object to be compared with. | 
 |      * @return         true if the given Format objects are semantically equal. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     virtual UBool operator==(const Format& other) const; | 
 |  | 
 |  | 
 |     using DateFormat::format; | 
 |  | 
 |     /** | 
 |      * Format a date or time, which is the standard millis since 24:00 GMT, Jan | 
 |      * 1, 1970. Overrides DateFormat pure virtual method. | 
 |      * <P> | 
 |      * Example: using the US locale: "yyyy.MM.dd e 'at' HH:mm:ss zzz" ->> | 
 |      * 1996.07.10 AD at 15:08:56 PDT | 
 |      * | 
 |      * @param cal       Calendar set to the date and time to be formatted | 
 |      *                  into a date/time string. | 
 |      * @param appendTo  Output parameter to receive result. | 
 |      *                  Result is appended to existing contents. | 
 |      * @param pos       The formatting position. On input: an alignment field, | 
 |      *                  if desired. On output: the offsets of the alignment field. | 
 |      * @return          Reference to 'appendTo' parameter. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     virtual UnicodeString& format(  Calendar& cal, | 
 |                                     UnicodeString& appendTo, | 
 |                                     FieldPosition& pos) const; | 
 |  | 
 |     /** | 
 |      * Format an object to produce a string. This method handles Formattable | 
 |      * objects with a UDate type. If a the Formattable object type is not a Date, | 
 |      * then it returns a failing UErrorCode. | 
 |      * | 
 |      * @param obj       The object to format. Must be a Date. | 
 |      * @param appendTo  Output parameter to receive result. | 
 |      *                  Result is appended to existing contents. | 
 |      * @param pos       On input: an alignment field, if desired. | 
 |      *                  On output: the offsets of the alignment field. | 
 |      * @param status    Output param filled with success/failure status. | 
 |      * @return          Reference to 'appendTo' parameter. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     virtual UnicodeString& format(const Formattable& obj, | 
 |                                   UnicodeString& appendTo, | 
 |                                   FieldPosition& pos, | 
 |                                   UErrorCode& status) const; | 
 |  | 
 |  | 
 |     /** | 
 |      * Parse a date/time string beginning at the given parse position. For | 
 |      * example, a time text "07/10/96 4:5 PM, PDT" will be parsed into a Date | 
 |      * that is equivalent to Date(837039928046). | 
 |      * <P> | 
 |      * By default, parsing is lenient: If the input is not in the form used by | 
 |      * this object's format method but can still be parsed as a date, then the | 
 |      * parse succeeds. Clients may insist on strict adherence to the format by | 
 |      * calling setLenient(false). | 
 |      * | 
 |      * @param text  The date/time string to be parsed | 
 |      * @param cal   a Calendar set to the date and time to be formatted | 
 |      *              into a date/time string. | 
 |      * @param pos   On input, the position at which to start parsing; on | 
 |      *              output, the position at which parsing terminated, or the | 
 |      *              start position if the parse failed. | 
 |      * @return      A valid UDate if the input could be parsed. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     virtual void parse( const UnicodeString& text, | 
 |                         Calendar& cal, | 
 |                         ParsePosition& pos) const; | 
 |  | 
 |     /** | 
 |      * Parse a date/time string starting at the given parse position. For | 
 |      * example, a time text "07/10/96 4:5 PM, PDT" will be parsed into a Date | 
 |      * that is equivalent to Date(837039928046). | 
 |      * <P> | 
 |      * By default, parsing is lenient: If the input is not in the form used by | 
 |      * this object's format method but can still be parsed as a date, then the | 
 |      * parse succeeds. Clients may insist on strict adherence to the format by | 
 |      * calling setLenient(false). | 
 |      * | 
 |      * @see DateFormat::setLenient(boolean) | 
 |      * | 
 |      * @param text  The date/time string to be parsed | 
 |      * @param pos   On input, the position at which to start parsing; on | 
 |      *              output, the position at which parsing terminated, or the | 
 |      *              start position if the parse failed. | 
 |      * @return      A valid UDate if the input could be parsed. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     UDate parse( const UnicodeString& text, | 
 |                  ParsePosition& pos) const; | 
 |  | 
 |  | 
 |     /** | 
 |      * Parse a date/time string. For example, a time text "07/10/96 4:5 PM, PDT" | 
 |      * will be parsed into a UDate that is equivalent to Date(837039928046). | 
 |      * Parsing begins at the beginning of the string and proceeds as far as | 
 |      * possible.  Assuming no parse errors were encountered, this function | 
 |      * doesn't return any information about how much of the string was consumed | 
 |      * by the parsing.  If you need that information, use the version of | 
 |      * parse() that takes a ParsePosition. | 
 |      * | 
 |      * @param text  The date/time string to be parsed | 
 |      * @param status Filled in with U_ZERO_ERROR if the parse was successful, and with | 
 |      *              an error value if there was a parse error. | 
 |      * @return      A valid UDate if the input could be parsed. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     virtual UDate parse( const UnicodeString& text, | 
 |                         UErrorCode& status) const; | 
 |  | 
 |     /** | 
 |      * Return a single pattern string generated by combining the patterns for the | 
 |      * date and time formatters associated with this object. | 
 |      * @param result Output param to receive the pattern. | 
 |      * @return       A reference to 'result'. | 
 |      * @internal ICU 4.2 technology preview | 
 |      */ | 
 |     virtual UnicodeString& toPattern(UnicodeString& result, UErrorCode& status) const; | 
 |  | 
 |     /** | 
 |      * Get the date pattern for the the date formatter associated with this object. | 
 |      * @param result Output param to receive the date pattern. | 
 |      * @return       A reference to 'result'. | 
 |      * @internal ICU 4.2 technology preview | 
 |      */ | 
 |     virtual UnicodeString& toPatternDate(UnicodeString& result, UErrorCode& status) const; | 
 |  | 
 |     /** | 
 |      * Get the time pattern for the the time formatter associated with this object. | 
 |      * @param result Output param to receive the time pattern. | 
 |      * @return       A reference to 'result'. | 
 |      * @internal ICU 4.2 technology preview | 
 |      */ | 
 |     virtual UnicodeString& toPatternTime(UnicodeString& result, UErrorCode& status) const; | 
 |  | 
 |     /** | 
 |      * Apply the given unlocalized date & time pattern strings to this relative date format. | 
 |      * (i.e., after this call, this formatter will format dates and times according to | 
 |      * the new patterns) | 
 |      * | 
 |      * @param datePattern   The date pattern to be applied. | 
 |      * @param timePattern   The time pattern to be applied. | 
 |      * @internal ICU 4.2 technology preview | 
 |      */ | 
 |     virtual void applyPatterns(const UnicodeString& datePattern, const UnicodeString& timePattern, UErrorCode &status); | 
 |  | 
 |     /** | 
 |      * Gets the date/time formatting symbols (this is an object carrying | 
 |      * the various strings and other symbols used in formatting: e.g., month | 
 |      * names and abbreviations, time zone names, AM/PM strings, etc.) | 
 |      * @return a copy of the date-time formatting data associated | 
 |      * with this date-time formatter. | 
 |      * @internal ICU 4.8 | 
 |      */ | 
 |     virtual const DateFormatSymbols* getDateFormatSymbols(void) const; | 
 |  | 
 |     /** | 
 |      * Set a particular UDisplayContext value in the formatter, such as | 
 |      * UDISPCTX_CAPITALIZATION_FOR_STANDALONE. Note: For getContext, see | 
 |      * DateFormat. | 
 |      * @param value The UDisplayContext value to set. | 
 |      * @param status Input/output status. If at entry this indicates a failure | 
 |      *               status, the function will do nothing; otherwise this will be | 
 |      *               updated with any new status from the function.  | 
 |      * @internal ICU 53 | 
 |      */ | 
 |     virtual void setContext(UDisplayContext value, UErrorCode& status); | 
 |  | 
 | private: | 
 |     SimpleDateFormat *fDateTimeFormatter; | 
 |     UnicodeString fDatePattern; | 
 |     UnicodeString fTimePattern; | 
 |     SimpleFormatter *fCombinedFormat;  // the {0} {1} format. | 
 |  | 
 |     UDateFormatStyle fDateStyle; | 
 |     Locale  fLocale; | 
 |  | 
 |     int32_t fDatesLen;    // Length of array | 
 |     URelativeString *fDates; // array of strings | 
 |  | 
 |     UBool fCombinedHasDateAtStart; | 
 |     UBool fCapitalizationInfoSet; | 
 |     UBool fCapitalizationOfRelativeUnitsForUIListMenu; | 
 |     UBool fCapitalizationOfRelativeUnitsForStandAlone; | 
 | #if !UCONFIG_NO_BREAK_ITERATION | 
 |     BreakIterator* fCapitalizationBrkIter; | 
 | #else | 
 |     UObject* fCapitalizationBrkIter; | 
 | #endif | 
 |  | 
 |     /** | 
 |      * Get the string at a specific offset. | 
 |      * @param day day offset ( -1, 0, 1, etc.. ) | 
 |      * @param len on output, length of string. | 
 |      * @return the string, or NULL if none at that location. | 
 |      */ | 
 |     const UChar *getStringForDay(int32_t day, int32_t &len, UErrorCode &status) const; | 
 |  | 
 |     /** | 
 |      * Load the Date string array | 
 |      */ | 
 |     void loadDates(UErrorCode &status); | 
 |  | 
 |     /** | 
 |      * Set fCapitalizationOfRelativeUnitsForUIListMenu, fCapitalizationOfRelativeUnitsForStandAlone | 
 |      */ | 
 |     void initCapitalizationContextInfo(const Locale& thelocale); | 
 |  | 
 |     /** | 
 |      * @return the number of days in "until-now" | 
 |      */ | 
 |     static int32_t dayDifference(Calendar &until, UErrorCode &status); | 
 |  | 
 |     /** | 
 |      * initializes fCalendar from parameters.  Returns fCalendar as a convenience. | 
 |      * @param adoptZone  Zone to be adopted, or NULL for TimeZone::createDefault(). | 
 |      * @param locale Locale of the calendar | 
 |      * @param status Error code | 
 |      * @return the newly constructed fCalendar | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     Calendar* initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status); | 
 |  | 
 | public: | 
 |     /** | 
 |      * Return the class ID for this class. This is useful only for comparing to | 
 |      * a return value from getDynamicClassID(). For example: | 
 |      * <pre> | 
 |      * .   Base* polymorphic_pointer = createPolymorphicObject(); | 
 |      * .   if (polymorphic_pointer->getDynamicClassID() == | 
 |      * .       erived::getStaticClassID()) ... | 
 |      * </pre> | 
 |      * @return          The class ID for all objects of this class. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void); | 
 |  | 
 |     /** | 
 |      * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This | 
 |      * method is to implement a simple version of RTTI, since not all C++ | 
 |      * compilers support genuine RTTI. Polymorphic operator==() and clone() | 
 |      * methods call this method. | 
 |      * | 
 |      * @return          The class ID for this object. All objects of a | 
 |      *                  given class have the same class ID.  Objects of | 
 |      *                  other classes have different class IDs. | 
 |      * @internal ICU 3.8 | 
 |      */ | 
 |     virtual UClassID getDynamicClassID(void) const; | 
 | }; | 
 |  | 
 |  | 
 | U_NAMESPACE_END | 
 |  | 
 | #endif /* #if !UCONFIG_NO_FORMATTING */ | 
 |  | 
 | #endif // RELDTFMT_H |