ICU 73.2  73.2
dtitvfmt.h
Go to the documentation of this file.
00001 // © 2016 and later: Unicode, Inc. and others.
00002 // License & terms of use: http://www.unicode.org/copyright.html
00003 /********************************************************************************
00004 * Copyright (C) 2008-2016, International Business Machines Corporation and
00005 * others. All Rights Reserved.
00006 *******************************************************************************
00007 *
00008 * File DTITVFMT.H
00009 *
00010 *******************************************************************************
00011 */
00012 
00013 #ifndef __DTITVFMT_H__
00014 #define __DTITVFMT_H__
00015 
00016 
00017 #include "unicode/utypes.h"
00018 
00019 #if U_SHOW_CPLUSPLUS_API
00020 
00026 #if !UCONFIG_NO_FORMATTING
00027 
00028 #include "unicode/ucal.h"
00029 #include "unicode/smpdtfmt.h"
00030 #include "unicode/dtintrv.h"
00031 #include "unicode/dtitvinf.h"
00032 #include "unicode/dtptngen.h"
00033 #include "unicode/formattedvalue.h"
00034 #include "unicode/udisplaycontext.h"
00035 
00036 U_NAMESPACE_BEGIN
00037 
00038 
00039 class FormattedDateIntervalData;
00040 class DateIntervalFormat;
00041 
00059 class U_I18N_API FormattedDateInterval : public UMemory, public FormattedValue {
00060   public:
00065     FormattedDateInterval() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
00066 
00071     FormattedDateInterval(FormattedDateInterval&& src) noexcept;
00072 
00077     virtual ~FormattedDateInterval() override;
00078 
00080     FormattedDateInterval(const FormattedDateInterval&) = delete;
00081 
00083     FormattedDateInterval& operator=(const FormattedDateInterval&) = delete;
00084 
00089     FormattedDateInterval& operator=(FormattedDateInterval&& src) noexcept;
00090 
00092     UnicodeString toString(UErrorCode& status) const override;
00093 
00095     UnicodeString toTempString(UErrorCode& status) const override;
00096 
00098     Appendable &appendTo(Appendable& appendable, UErrorCode& status) const override;
00099 
00101     UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override;
00102 
00103   private:
00104     FormattedDateIntervalData *fData;
00105     UErrorCode fErrorCode;
00106     explicit FormattedDateInterval(FormattedDateIntervalData *results)
00107         : fData(results), fErrorCode(U_ZERO_ERROR) {}
00108     explicit FormattedDateInterval(UErrorCode errorCode)
00109         : fData(nullptr), fErrorCode(errorCode) {}
00110     friend class DateIntervalFormat;
00111 };
00112 
00113 
00300 class U_I18N_API DateIntervalFormat : public Format {
00301 public:
00302 
00316     static DateIntervalFormat* U_EXPORT2 createInstance(
00317                                                const UnicodeString& skeleton,
00318                                                UErrorCode& status);
00319 
00354     static DateIntervalFormat* U_EXPORT2 createInstance(
00355                                                const UnicodeString& skeleton,
00356                                                const Locale& locale,
00357                                                UErrorCode& status);
00358 
00374     static DateIntervalFormat* U_EXPORT2 createInstance(
00375                                               const UnicodeString& skeleton,
00376                                               const DateIntervalInfo& dtitvinf,
00377                                               UErrorCode& status);
00378 
00419     static DateIntervalFormat* U_EXPORT2 createInstance(
00420                                               const UnicodeString& skeleton,
00421                                               const Locale& locale,
00422                                               const DateIntervalInfo& dtitvinf,
00423                                               UErrorCode& status);
00424 
00429     virtual ~DateIntervalFormat();
00430 
00437     virtual DateIntervalFormat* clone() const override;
00438 
00446     virtual bool operator==(const Format& other) const override;
00447 
00455     bool operator!=(const Format& other) const;
00456 
00457 
00458     using Format::format;
00459 
00479     virtual UnicodeString& format(const Formattable& obj,
00480                                   UnicodeString& appendTo,
00481                                   FieldPosition& fieldPosition,
00482                                   UErrorCode& status) const override;
00483 
00484 
00485 
00501     UnicodeString& format(const DateInterval* dtInterval,
00502                           UnicodeString& appendTo,
00503                           FieldPosition& fieldPosition,
00504                           UErrorCode& status) const ;
00505 
00516     FormattedDateInterval formatToValue(
00517         const DateInterval& dtInterval,
00518         UErrorCode& status) const;
00519 
00543     UnicodeString& format(Calendar& fromCalendar,
00544                           Calendar& toCalendar,
00545                           UnicodeString& appendTo,
00546                           FieldPosition& fieldPosition,
00547                           UErrorCode& status) const ;
00548 
00565     FormattedDateInterval formatToValue(
00566         Calendar& fromCalendar,
00567         Calendar& toCalendar,
00568         UErrorCode& status) const;
00569 
00596     virtual void parseObject(const UnicodeString& source,
00597                              Formattable& result,
00598                              ParsePosition& parse_pos) const override;
00599 
00600 
00607     const DateIntervalInfo* getDateIntervalInfo(void) const;
00608 
00609 
00616     void setDateIntervalInfo(const DateIntervalInfo& newIntervalPatterns,
00617                              UErrorCode& status);
00618 
00619 
00631     const DateFormat* getDateFormat(void) const;
00632 
00638     virtual const TimeZone& getTimeZone(void) const;
00639 
00646     virtual void adoptTimeZone(TimeZone* zoneToAdopt);
00647 
00653     virtual void setTimeZone(const TimeZone& zone);
00654 
00667     virtual void setContext(UDisplayContext value, UErrorCode& status);
00668 
00679     virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
00680 
00692     static UClassID U_EXPORT2 getStaticClassID(void);
00693 
00705     virtual UClassID getDynamicClassID(void) const override;
00706 
00707 protected:
00708 
00713     DateIntervalFormat(const DateIntervalFormat&);
00714 
00719     DateIntervalFormat& operator=(const DateIntervalFormat&);
00720 
00721 private:
00722 
00723     /*
00724      * This is for ICU internal use only. Please do not use.
00725      * Save the interval pattern information.
00726      * Interval pattern consists of 2 single date patterns and the separator.
00727      * For example, interval pattern "MMM d - MMM d, yyyy" consists
00728      * a single date pattern "MMM d", another single date pattern "MMM d, yyyy",
00729      * and a separator "-".
00730      * The pattern is divided into 2 parts. For above example,
00731      * the first part is "MMM d - ", and the second part is "MMM d, yyyy".
00732      * Also, the first date appears in an interval pattern could be
00733      * the earlier date or the later date.
00734      * And such information is saved in the interval pattern as well.
00735      */
00736     struct PatternInfo {
00737         UnicodeString firstPart;
00738         UnicodeString secondPart;
00752         UBool         laterDateFirst;
00753     };
00754 
00755 
00760     DateIntervalFormat();
00761 
00780     DateIntervalFormat(const Locale& locale, DateIntervalInfo* dtItvInfo,
00781                        const UnicodeString* skeleton, UErrorCode& status);
00782 
00783 
00796     static DateIntervalFormat* U_EXPORT2 create(const Locale& locale,
00797                                                 DateIntervalInfo* dtitvinf,
00798                                                 const UnicodeString* skeleton,
00799                                                 UErrorCode& status);
00800 
00806     void fallbackFormatRange(
00807         Calendar& fromCalendar,
00808         Calendar& toCalendar,
00809         UnicodeString& appendTo,
00810         int8_t& firstIndex,
00811         FieldPositionHandler& fphandler,
00812         UErrorCode& status) const;
00813 
00836     UnicodeString& fallbackFormat(Calendar& fromCalendar,
00837                                   Calendar& toCalendar,
00838                                   UBool fromToOnSameDay,
00839                                   UnicodeString& appendTo,
00840                                   int8_t& firstIndex,
00841                                   FieldPositionHandler& fphandler,
00842                                   UErrorCode& status) const;
00843 
00844 
00845 
00880     void initializePattern(UErrorCode& status);
00881 
00882 
00883 
00891     void setFallbackPattern(UCalendarDateFields field,
00892                             const UnicodeString& skeleton,
00893                             UErrorCode& status);
00894     
00895 
00896 
00906     UnicodeString normalizeHourMetacharacters(const UnicodeString& skeleton) const;
00907 
00908 
00909 
00934     static void  U_EXPORT2 getDateTimeSkeleton(const UnicodeString& skeleton,
00935                                     UnicodeString& date,
00936                                     UnicodeString& normalizedDate,
00937                                     UnicodeString& time,
00938                                     UnicodeString& normalizedTime);
00939 
00940 
00941 
00965     UBool setSeparateDateTimePtn(const UnicodeString& dateSkeleton,
00966                                  const UnicodeString& timeSkeleton);
00967 
00968 
00969 
00970 
00994     UBool setIntervalPattern(UCalendarDateFields field,
00995                              const UnicodeString* skeleton,
00996                              const UnicodeString* bestSkeleton,
00997                              int8_t differenceInfo,
00998                              UnicodeString* extendedSkeleton = nullptr,
00999                              UnicodeString* extendedBestSkeleton = nullptr);
01000 
01030     static void U_EXPORT2 adjustFieldWidth(
01031                             const UnicodeString& inputSkeleton,
01032                             const UnicodeString& bestMatchSkeleton,
01033                             const UnicodeString& bestMatchIntervalPattern,
01034                             int8_t differenceInfo,
01035                             UBool suppressDayPeriodField,
01036                             UnicodeString& adjustedIntervalPattern);
01037 
01045     static void U_EXPORT2 findReplaceInPattern(UnicodeString& targetString,
01046                                                const UnicodeString& strToReplace,
01047                                                const UnicodeString& strToReplaceWith);
01048 
01060     void concatSingleDate2TimeInterval(UnicodeString& format,
01061                                        const UnicodeString& datePattern,
01062                                        UCalendarDateFields field,
01063                                        UErrorCode& status);
01064 
01071     static UBool U_EXPORT2 fieldExistsInSkeleton(UCalendarDateFields field,
01072                                                  const UnicodeString& skeleton);
01073 
01074 
01080     static int32_t  U_EXPORT2 splitPatternInto2Part(const UnicodeString& intervalPattern);
01081 
01082 
01088     void setIntervalPattern(UCalendarDateFields field,
01089                             const UnicodeString& intervalPattern);
01090 
01091 
01098     void setIntervalPattern(UCalendarDateFields field,
01099                             const UnicodeString& intervalPattern,
01100                             UBool laterDateFirst);
01101 
01102 
01112     void setPatternInfo(UCalendarDateFields field,
01113                         const UnicodeString* firstPart,
01114                         const UnicodeString* secondPart,
01115                         UBool laterDateFirst);
01116 
01142     UnicodeString& formatImpl(Calendar& fromCalendar,
01143                               Calendar& toCalendar,
01144                               UnicodeString& appendTo,
01145                               int8_t& firstIndex,
01146                               FieldPositionHandler& fphandler,
01147                               UErrorCode& status) const ;
01148 
01150     UnicodeString& formatIntervalImpl(const DateInterval& dtInterval,
01151                               UnicodeString& appendTo,
01152                               int8_t& firstIndex,
01153                               FieldPositionHandler& fphandler,
01154                               UErrorCode& status) const;
01155 
01156 
01157     // from calendar field to pattern letter
01158     static const char16_t fgCalendarFieldToPatternLetter[];
01159 
01160 
01164     DateIntervalInfo*     fInfo;
01165 
01169     SimpleDateFormat*     fDateFormat;
01170 
01176     Calendar* fFromCalendar;
01177     Calendar* fToCalendar;
01178 
01179     Locale fLocale;
01180 
01184     UnicodeString fSkeleton;
01185     PatternInfo fIntervalPatterns[DateIntervalInfo::kIPI_MAX_INDEX];
01186 
01190     UnicodeString* fDatePattern;
01191     UnicodeString* fTimePattern;
01192     UnicodeString* fDateTimeFormat;
01193 
01197     UDisplayContext fCapitalizationContext;
01198 };
01199 
01200 inline bool
01201 DateIntervalFormat::operator!=(const Format& other) const  {
01202     return !operator==(other);
01203 }
01204 
01205 U_NAMESPACE_END
01206 
01207 #endif /* #if !UCONFIG_NO_FORMATTING */
01208 
01209 #endif /* U_SHOW_CPLUSPLUS_API */
01210 
01211 #endif // _DTITVFMT_H__
01212 //eof