00001
00002
00003
00004
00005
00006
00007
00008
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) U_NOEXCEPT;
00072
00077 virtual ~FormattedDateInterval() U_OVERRIDE;
00078
00080 FormattedDateInterval(const FormattedDateInterval&) = delete;
00081
00083 FormattedDateInterval& operator=(const FormattedDateInterval&) = delete;
00084
00089 FormattedDateInterval& operator=(FormattedDateInterval&& src) U_NOEXCEPT;
00090
00092 UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
00093
00095 UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
00096
00098 Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
00099
00101 UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_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
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
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 = NULL,
00999 UnicodeString* extendedBestSkeleton = NULL);
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
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
01208
01209 #endif
01210
01211 #endif // _DTITVFMT_H__
01212