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
00041 #ifndef U_HIDE_DRAFT_API
00042
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 #endif
00113
00114
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;
00438
00446 virtual UBool operator==(const Format& other) const;
00447
00455 UBool 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 ;
00483
00484
00485
00501 UnicodeString& format(const DateInterval* dtInterval,
00502 UnicodeString& appendTo,
00503 FieldPosition& fieldPosition,
00504 UErrorCode& status) const ;
00505
00506 #ifndef U_HIDE_DRAFT_API
00507
00517 FormattedDateInterval formatToValue(
00518 const DateInterval& dtInterval,
00519 UErrorCode& status) const;
00520 #endif
00521
00545 UnicodeString& format(Calendar& fromCalendar,
00546 Calendar& toCalendar,
00547 UnicodeString& appendTo,
00548 FieldPosition& fieldPosition,
00549 UErrorCode& status) const ;
00550
00551 #ifndef U_HIDE_DRAFT_API
00552
00568 FormattedDateInterval formatToValue(
00569 Calendar& fromCalendar,
00570 Calendar& toCalendar,
00571 UErrorCode& status) const;
00572 #endif
00573
00600 virtual void parseObject(const UnicodeString& source,
00601 Formattable& result,
00602 ParsePosition& parse_pos) const;
00603
00604
00611 const DateIntervalInfo* getDateIntervalInfo(void) const;
00612
00613
00620 void setDateIntervalInfo(const DateIntervalInfo& newIntervalPatterns,
00621 UErrorCode& status);
00622
00623
00635 const DateFormat* getDateFormat(void) const;
00636
00642 virtual const TimeZone& getTimeZone(void) const;
00643
00650 virtual void adoptTimeZone(TimeZone* zoneToAdopt);
00651
00657 virtual void setTimeZone(const TimeZone& zone);
00658
00670 static UClassID U_EXPORT2 getStaticClassID(void);
00671
00683 virtual UClassID getDynamicClassID(void) const;
00684
00685 protected:
00686
00691 DateIntervalFormat(const DateIntervalFormat&);
00692
00697 DateIntervalFormat& operator=(const DateIntervalFormat&);
00698
00699 private:
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714 struct PatternInfo {
00715 UnicodeString firstPart;
00716 UnicodeString secondPart;
00730 UBool laterDateFirst;
00731 };
00732
00733
00738 DateIntervalFormat();
00739
00758 DateIntervalFormat(const Locale& locale, DateIntervalInfo* dtItvInfo,
00759 const UnicodeString* skeleton, UErrorCode& status);
00760
00761
00774 static DateIntervalFormat* U_EXPORT2 create(const Locale& locale,
00775 DateIntervalInfo* dtitvinf,
00776 const UnicodeString* skeleton,
00777 UErrorCode& status);
00778
00784 void fallbackFormatRange(
00785 Calendar& fromCalendar,
00786 Calendar& toCalendar,
00787 UnicodeString& appendTo,
00788 int8_t& firstIndex,
00789 FieldPositionHandler& fphandler,
00790 UErrorCode& status) const;
00791
00814 UnicodeString& fallbackFormat(Calendar& fromCalendar,
00815 Calendar& toCalendar,
00816 UBool fromToOnSameDay,
00817 UnicodeString& appendTo,
00818 int8_t& firstIndex,
00819 FieldPositionHandler& fphandler,
00820 UErrorCode& status) const;
00821
00822
00823
00858 void initializePattern(UErrorCode& status);
00859
00860
00861
00869 void setFallbackPattern(UCalendarDateFields field,
00870 const UnicodeString& skeleton,
00871 UErrorCode& status);
00872
00873
00874
00899 static void U_EXPORT2 getDateTimeSkeleton(const UnicodeString& skeleton,
00900 UnicodeString& date,
00901 UnicodeString& normalizedDate,
00902 UnicodeString& time,
00903 UnicodeString& normalizedTime);
00904
00905
00906
00930 UBool setSeparateDateTimePtn(const UnicodeString& dateSkeleton,
00931 const UnicodeString& timeSkeleton);
00932
00933
00934
00935
00959 UBool setIntervalPattern(UCalendarDateFields field,
00960 const UnicodeString* skeleton,
00961 const UnicodeString* bestSkeleton,
00962 int8_t differenceInfo,
00963 UnicodeString* extendedSkeleton = NULL,
00964 UnicodeString* extendedBestSkeleton = NULL);
00965
00994 static void U_EXPORT2 adjustFieldWidth(
00995 const UnicodeString& inputSkeleton,
00996 const UnicodeString& bestMatchSkeleton,
00997 const UnicodeString& bestMatchIntervalPattern,
00998 int8_t differenceInfo,
00999 UnicodeString& adjustedIntervalPattern);
01000
01012 void concatSingleDate2TimeInterval(UnicodeString& format,
01013 const UnicodeString& datePattern,
01014 UCalendarDateFields field,
01015 UErrorCode& status);
01016
01023 static UBool U_EXPORT2 fieldExistsInSkeleton(UCalendarDateFields field,
01024 const UnicodeString& skeleton);
01025
01026
01032 static int32_t U_EXPORT2 splitPatternInto2Part(const UnicodeString& intervalPattern);
01033
01034
01040 void setIntervalPattern(UCalendarDateFields field,
01041 const UnicodeString& intervalPattern);
01042
01043
01050 void setIntervalPattern(UCalendarDateFields field,
01051 const UnicodeString& intervalPattern,
01052 UBool laterDateFirst);
01053
01054
01064 void setPatternInfo(UCalendarDateFields field,
01065 const UnicodeString* firstPart,
01066 const UnicodeString* secondPart,
01067 UBool laterDateFirst);
01068
01094 UnicodeString& formatImpl(Calendar& fromCalendar,
01095 Calendar& toCalendar,
01096 UnicodeString& appendTo,
01097 int8_t& firstIndex,
01098 FieldPositionHandler& fphandler,
01099 UErrorCode& status) const ;
01100
01102 UnicodeString& formatIntervalImpl(const DateInterval& dtInterval,
01103 UnicodeString& appendTo,
01104 int8_t& firstIndex,
01105 FieldPositionHandler& fphandler,
01106 UErrorCode& status) const;
01107
01108
01109
01110 static const char16_t fgCalendarFieldToPatternLetter[];
01111
01112
01116 DateIntervalInfo* fInfo;
01117
01121 SimpleDateFormat* fDateFormat;
01122
01128 Calendar* fFromCalendar;
01129 Calendar* fToCalendar;
01130
01131 Locale fLocale;
01132
01136 UnicodeString fSkeleton;
01137 PatternInfo fIntervalPatterns[DateIntervalInfo::kIPI_MAX_INDEX];
01138
01142 UnicodeString* fDatePattern;
01143 UnicodeString* fTimePattern;
01144 UnicodeString* fDateTimeFormat;
01145 };
01146
01147 inline UBool
01148 DateIntervalFormat::operator!=(const Format& other) const {
01149 return !operator==(other);
01150 }
01151
01152 U_NAMESPACE_END
01153
01154 #endif
01155
01156 #endif
01157
01158 #endif // _DTITVFMT_H__
01159