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
00035 U_NAMESPACE_BEGIN
00036
00037
00038 class FormattedDateIntervalData;
00039 class DateIntervalFormat;
00040
00058 class U_I18N_API FormattedDateInterval : public UMemory, public FormattedValue {
00059 public:
00064 FormattedDateInterval() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
00065
00070 FormattedDateInterval(FormattedDateInterval&& src) U_NOEXCEPT;
00071
00076 virtual ~FormattedDateInterval() U_OVERRIDE;
00077
00079 FormattedDateInterval(const FormattedDateInterval&) = delete;
00080
00082 FormattedDateInterval& operator=(const FormattedDateInterval&) = delete;
00083
00088 FormattedDateInterval& operator=(FormattedDateInterval&& src) U_NOEXCEPT;
00089
00091 UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
00092
00094 UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
00095
00097 Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
00098
00100 UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
00101
00102 private:
00103 FormattedDateIntervalData *fData;
00104 UErrorCode fErrorCode;
00105 explicit FormattedDateInterval(FormattedDateIntervalData *results)
00106 : fData(results), fErrorCode(U_ZERO_ERROR) {}
00107 explicit FormattedDateInterval(UErrorCode errorCode)
00108 : fData(nullptr), fErrorCode(errorCode) {}
00109 friend class DateIntervalFormat;
00110 };
00111
00112
00299 class U_I18N_API DateIntervalFormat : public Format {
00300 public:
00301
00315 static DateIntervalFormat* U_EXPORT2 createInstance(
00316 const UnicodeString& skeleton,
00317 UErrorCode& status);
00318
00353 static DateIntervalFormat* U_EXPORT2 createInstance(
00354 const UnicodeString& skeleton,
00355 const Locale& locale,
00356 UErrorCode& status);
00357
00373 static DateIntervalFormat* U_EXPORT2 createInstance(
00374 const UnicodeString& skeleton,
00375 const DateIntervalInfo& dtitvinf,
00376 UErrorCode& status);
00377
00418 static DateIntervalFormat* U_EXPORT2 createInstance(
00419 const UnicodeString& skeleton,
00420 const Locale& locale,
00421 const DateIntervalInfo& dtitvinf,
00422 UErrorCode& status);
00423
00428 virtual ~DateIntervalFormat();
00429
00436 virtual DateIntervalFormat* clone() const;
00437
00445 virtual UBool operator==(const Format& other) const;
00446
00454 UBool operator!=(const Format& other) const;
00455
00456
00457 using Format::format;
00458
00478 virtual UnicodeString& format(const Formattable& obj,
00479 UnicodeString& appendTo,
00480 FieldPosition& fieldPosition,
00481 UErrorCode& status) const ;
00482
00483
00484
00500 UnicodeString& format(const DateInterval* dtInterval,
00501 UnicodeString& appendTo,
00502 FieldPosition& fieldPosition,
00503 UErrorCode& status) const ;
00504
00515 FormattedDateInterval formatToValue(
00516 const DateInterval& dtInterval,
00517 UErrorCode& status) const;
00518
00542 UnicodeString& format(Calendar& fromCalendar,
00543 Calendar& toCalendar,
00544 UnicodeString& appendTo,
00545 FieldPosition& fieldPosition,
00546 UErrorCode& status) const ;
00547
00564 FormattedDateInterval formatToValue(
00565 Calendar& fromCalendar,
00566 Calendar& toCalendar,
00567 UErrorCode& status) const;
00568
00595 virtual void parseObject(const UnicodeString& source,
00596 Formattable& result,
00597 ParsePosition& parse_pos) const;
00598
00599
00606 const DateIntervalInfo* getDateIntervalInfo(void) const;
00607
00608
00615 void setDateIntervalInfo(const DateIntervalInfo& newIntervalPatterns,
00616 UErrorCode& status);
00617
00618
00630 const DateFormat* getDateFormat(void) const;
00631
00637 virtual const TimeZone& getTimeZone(void) const;
00638
00645 virtual void adoptTimeZone(TimeZone* zoneToAdopt);
00646
00652 virtual void setTimeZone(const TimeZone& zone);
00653
00665 static UClassID U_EXPORT2 getStaticClassID(void);
00666
00678 virtual UClassID getDynamicClassID(void) const;
00679
00680 protected:
00681
00686 DateIntervalFormat(const DateIntervalFormat&);
00687
00692 DateIntervalFormat& operator=(const DateIntervalFormat&);
00693
00694 private:
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709 struct PatternInfo {
00710 UnicodeString firstPart;
00711 UnicodeString secondPart;
00725 UBool laterDateFirst;
00726 };
00727
00728
00733 DateIntervalFormat();
00734
00753 DateIntervalFormat(const Locale& locale, DateIntervalInfo* dtItvInfo,
00754 const UnicodeString* skeleton, UErrorCode& status);
00755
00756
00769 static DateIntervalFormat* U_EXPORT2 create(const Locale& locale,
00770 DateIntervalInfo* dtitvinf,
00771 const UnicodeString* skeleton,
00772 UErrorCode& status);
00773
00779 void fallbackFormatRange(
00780 Calendar& fromCalendar,
00781 Calendar& toCalendar,
00782 UnicodeString& appendTo,
00783 int8_t& firstIndex,
00784 FieldPositionHandler& fphandler,
00785 UErrorCode& status) const;
00786
00809 UnicodeString& fallbackFormat(Calendar& fromCalendar,
00810 Calendar& toCalendar,
00811 UBool fromToOnSameDay,
00812 UnicodeString& appendTo,
00813 int8_t& firstIndex,
00814 FieldPositionHandler& fphandler,
00815 UErrorCode& status) const;
00816
00817
00818
00853 void initializePattern(UErrorCode& status);
00854
00855
00856
00864 void setFallbackPattern(UCalendarDateFields field,
00865 const UnicodeString& skeleton,
00866 UErrorCode& status);
00867
00868
00869
00894 static void U_EXPORT2 getDateTimeSkeleton(const UnicodeString& skeleton,
00895 UnicodeString& date,
00896 UnicodeString& normalizedDate,
00897 UnicodeString& time,
00898 UnicodeString& normalizedTime);
00899
00900
00901
00925 UBool setSeparateDateTimePtn(const UnicodeString& dateSkeleton,
00926 const UnicodeString& timeSkeleton);
00927
00928
00929
00930
00954 UBool setIntervalPattern(UCalendarDateFields field,
00955 const UnicodeString* skeleton,
00956 const UnicodeString* bestSkeleton,
00957 int8_t differenceInfo,
00958 UnicodeString* extendedSkeleton = NULL,
00959 UnicodeString* extendedBestSkeleton = NULL);
00960
00989 static void U_EXPORT2 adjustFieldWidth(
00990 const UnicodeString& inputSkeleton,
00991 const UnicodeString& bestMatchSkeleton,
00992 const UnicodeString& bestMatchIntervalPattern,
00993 int8_t differenceInfo,
00994 UnicodeString& adjustedIntervalPattern);
00995
01007 void concatSingleDate2TimeInterval(UnicodeString& format,
01008 const UnicodeString& datePattern,
01009 UCalendarDateFields field,
01010 UErrorCode& status);
01011
01018 static UBool U_EXPORT2 fieldExistsInSkeleton(UCalendarDateFields field,
01019 const UnicodeString& skeleton);
01020
01021
01027 static int32_t U_EXPORT2 splitPatternInto2Part(const UnicodeString& intervalPattern);
01028
01029
01035 void setIntervalPattern(UCalendarDateFields field,
01036 const UnicodeString& intervalPattern);
01037
01038
01045 void setIntervalPattern(UCalendarDateFields field,
01046 const UnicodeString& intervalPattern,
01047 UBool laterDateFirst);
01048
01049
01059 void setPatternInfo(UCalendarDateFields field,
01060 const UnicodeString* firstPart,
01061 const UnicodeString* secondPart,
01062 UBool laterDateFirst);
01063
01089 UnicodeString& formatImpl(Calendar& fromCalendar,
01090 Calendar& toCalendar,
01091 UnicodeString& appendTo,
01092 int8_t& firstIndex,
01093 FieldPositionHandler& fphandler,
01094 UErrorCode& status) const ;
01095
01097 UnicodeString& formatIntervalImpl(const DateInterval& dtInterval,
01098 UnicodeString& appendTo,
01099 int8_t& firstIndex,
01100 FieldPositionHandler& fphandler,
01101 UErrorCode& status) const;
01102
01103
01104
01105 static const char16_t fgCalendarFieldToPatternLetter[];
01106
01107
01111 DateIntervalInfo* fInfo;
01112
01116 SimpleDateFormat* fDateFormat;
01117
01123 Calendar* fFromCalendar;
01124 Calendar* fToCalendar;
01125
01126 Locale fLocale;
01127
01131 UnicodeString fSkeleton;
01132 PatternInfo fIntervalPatterns[DateIntervalInfo::kIPI_MAX_INDEX];
01133
01137 UnicodeString* fDatePattern;
01138 UnicodeString* fTimePattern;
01139 UnicodeString* fDateTimeFormat;
01140 };
01141
01142 inline UBool
01143 DateIntervalFormat::operator!=(const Format& other) const {
01144 return !operator==(other);
01145 }
01146
01147 U_NAMESPACE_END
01148
01149 #endif
01150
01151 #endif
01152
01153 #endif // _DTITVFMT_H__
01154