|
ICU 73.2
73.2
|
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
1.7.6.1