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
00024 #if !UCONFIG_NO_FORMATTING
00025
00026 #include "unicode/ucal.h"
00027 #include "unicode/smpdtfmt.h"
00028 #include "unicode/dtintrv.h"
00029 #include "unicode/dtitvinf.h"
00030 #include "unicode/dtptngen.h"
00031 #include "unicode/formattedvalue.h"
00032
00033 U_NAMESPACE_BEGIN
00034
00035
00036 class FormattedDateIntervalData;
00037 class DateIntervalFormat;
00038
00039 #ifndef U_HIDE_DRAFT_API
00040
00057 class U_I18N_API FormattedDateInterval : public UMemory, public FormattedValue {
00058 public:
00063 FormattedDateInterval() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
00064
00069 FormattedDateInterval(FormattedDateInterval&& src) U_NOEXCEPT;
00070
00075 virtual ~FormattedDateInterval() U_OVERRIDE;
00076
00078 FormattedDateInterval(const FormattedDateInterval&) = delete;
00079
00081 FormattedDateInterval& operator=(const FormattedDateInterval&) = delete;
00082
00087 FormattedDateInterval& operator=(FormattedDateInterval&& src) U_NOEXCEPT;
00088
00090 UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
00091
00093 UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
00094
00096 Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
00097
00099 UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
00100
00101 private:
00102 FormattedDateIntervalData *fData;
00103 UErrorCode fErrorCode;
00104 explicit FormattedDateInterval(FormattedDateIntervalData *results)
00105 : fData(results), fErrorCode(U_ZERO_ERROR) {}
00106 explicit FormattedDateInterval(UErrorCode errorCode)
00107 : fData(nullptr), fErrorCode(errorCode) {}
00108 friend class DateIntervalFormat;
00109 };
00110 #endif
00111
00112
00298 class U_I18N_API DateIntervalFormat : public Format {
00299 public:
00300
00314 static DateIntervalFormat* U_EXPORT2 createInstance(
00315 const UnicodeString& skeleton,
00316 UErrorCode& status);
00317
00352 static DateIntervalFormat* U_EXPORT2 createInstance(
00353 const UnicodeString& skeleton,
00354 const Locale& locale,
00355 UErrorCode& status);
00356
00372 static DateIntervalFormat* U_EXPORT2 createInstance(
00373 const UnicodeString& skeleton,
00374 const DateIntervalInfo& dtitvinf,
00375 UErrorCode& status);
00376
00417 static DateIntervalFormat* U_EXPORT2 createInstance(
00418 const UnicodeString& skeleton,
00419 const Locale& locale,
00420 const DateIntervalInfo& dtitvinf,
00421 UErrorCode& status);
00422
00427 virtual ~DateIntervalFormat();
00428
00435 virtual Format* clone(void) const;
00436
00444 virtual UBool operator==(const Format& other) const;
00445
00453 UBool operator!=(const Format& other) const;
00454
00455
00456 using Format::format;
00457
00477 virtual UnicodeString& format(const Formattable& obj,
00478 UnicodeString& appendTo,
00479 FieldPosition& fieldPosition,
00480 UErrorCode& status) const ;
00481
00482
00483
00499 UnicodeString& format(const DateInterval* dtInterval,
00500 UnicodeString& appendTo,
00501 FieldPosition& fieldPosition,
00502 UErrorCode& status) const ;
00503
00504 #ifndef U_HIDE_DRAFT_API
00505
00515 FormattedDateInterval formatToValue(
00516 const DateInterval& dtInterval,
00517 UErrorCode& status) const;
00518 #endif
00519
00543 UnicodeString& format(Calendar& fromCalendar,
00544 Calendar& toCalendar,
00545 UnicodeString& appendTo,
00546 FieldPosition& fieldPosition,
00547 UErrorCode& status) const ;
00548
00549 #ifndef U_HIDE_DRAFT_API
00550
00566 FormattedDateInterval formatToValue(
00567 Calendar& fromCalendar,
00568 Calendar& toCalendar,
00569 UErrorCode& status) const;
00570 #endif
00571
00598 virtual void parseObject(const UnicodeString& source,
00599 Formattable& result,
00600 ParsePosition& parse_pos) const;
00601
00602
00609 const DateIntervalInfo* getDateIntervalInfo(void) const;
00610
00611
00618 void setDateIntervalInfo(const DateIntervalInfo& newIntervalPatterns,
00619 UErrorCode& status);
00620
00621
00633 const DateFormat* getDateFormat(void) const;
00634
00640 virtual const TimeZone& getTimeZone(void) const;
00641
00648 virtual void adoptTimeZone(TimeZone* zoneToAdopt);
00649
00655 virtual void setTimeZone(const TimeZone& zone);
00656
00668 static UClassID U_EXPORT2 getStaticClassID(void);
00669
00681 virtual UClassID getDynamicClassID(void) const;
00682
00683 protected:
00684
00689 DateIntervalFormat(const DateIntervalFormat&);
00690
00695 DateIntervalFormat& operator=(const DateIntervalFormat&);
00696
00697 private:
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712 struct PatternInfo {
00713 UnicodeString firstPart;
00714 UnicodeString secondPart;
00728 UBool laterDateFirst;
00729 };
00730
00731
00736 DateIntervalFormat();
00737
00756 DateIntervalFormat(const Locale& locale, DateIntervalInfo* dtItvInfo,
00757 const UnicodeString* skeleton, UErrorCode& status);
00758
00759
00772 static DateIntervalFormat* U_EXPORT2 create(const Locale& locale,
00773 DateIntervalInfo* dtitvinf,
00774 const UnicodeString* skeleton,
00775 UErrorCode& status);
00776
00782 void fallbackFormatRange(
00783 Calendar& fromCalendar,
00784 Calendar& toCalendar,
00785 UnicodeString& appendTo,
00786 int8_t& firstIndex,
00787 FieldPositionHandler& fphandler,
00788 UErrorCode& status) const;
00789
00812 UnicodeString& fallbackFormat(Calendar& fromCalendar,
00813 Calendar& toCalendar,
00814 UBool fromToOnSameDay,
00815 UnicodeString& appendTo,
00816 int8_t& firstIndex,
00817 FieldPositionHandler& fphandler,
00818 UErrorCode& status) const;
00819
00820
00821
00856 void initializePattern(UErrorCode& status);
00857
00858
00859
00867 void setFallbackPattern(UCalendarDateFields field,
00868 const UnicodeString& skeleton,
00869 UErrorCode& status);
00870
00871
00872
00897 static void U_EXPORT2 getDateTimeSkeleton(const UnicodeString& skeleton,
00898 UnicodeString& date,
00899 UnicodeString& normalizedDate,
00900 UnicodeString& time,
00901 UnicodeString& normalizedTime);
00902
00903
00904
00928 UBool setSeparateDateTimePtn(const UnicodeString& dateSkeleton,
00929 const UnicodeString& timeSkeleton);
00930
00931
00932
00933
00957 UBool setIntervalPattern(UCalendarDateFields field,
00958 const UnicodeString* skeleton,
00959 const UnicodeString* bestSkeleton,
00960 int8_t differenceInfo,
00961 UnicodeString* extendedSkeleton = NULL,
00962 UnicodeString* extendedBestSkeleton = NULL);
00963
00992 static void U_EXPORT2 adjustFieldWidth(
00993 const UnicodeString& inputSkeleton,
00994 const UnicodeString& bestMatchSkeleton,
00995 const UnicodeString& bestMatchIntervalPattern,
00996 int8_t differenceInfo,
00997 UnicodeString& adjustedIntervalPattern);
00998
01010 void concatSingleDate2TimeInterval(UnicodeString& format,
01011 const UnicodeString& datePattern,
01012 UCalendarDateFields field,
01013 UErrorCode& status);
01014
01021 static UBool U_EXPORT2 fieldExistsInSkeleton(UCalendarDateFields field,
01022 const UnicodeString& skeleton);
01023
01024
01030 static int32_t U_EXPORT2 splitPatternInto2Part(const UnicodeString& intervalPattern);
01031
01032
01038 void setIntervalPattern(UCalendarDateFields field,
01039 const UnicodeString& intervalPattern);
01040
01041
01048 void setIntervalPattern(UCalendarDateFields field,
01049 const UnicodeString& intervalPattern,
01050 UBool laterDateFirst);
01051
01052
01062 void setPatternInfo(UCalendarDateFields field,
01063 const UnicodeString* firstPart,
01064 const UnicodeString* secondPart,
01065 UBool laterDateFirst);
01066
01092 UnicodeString& formatImpl(Calendar& fromCalendar,
01093 Calendar& toCalendar,
01094 UnicodeString& appendTo,
01095 int8_t& firstIndex,
01096 FieldPositionHandler& fphandler,
01097 UErrorCode& status) const ;
01098
01100 UnicodeString& formatIntervalImpl(const DateInterval& dtInterval,
01101 UnicodeString& appendTo,
01102 int8_t& firstIndex,
01103 FieldPositionHandler& fphandler,
01104 UErrorCode& status) const;
01105
01106
01107
01108 static const char16_t fgCalendarFieldToPatternLetter[];
01109
01110
01114 DateIntervalInfo* fInfo;
01115
01119 SimpleDateFormat* fDateFormat;
01120
01126 Calendar* fFromCalendar;
01127 Calendar* fToCalendar;
01128
01129 Locale fLocale;
01130
01134 UnicodeString fSkeleton;
01135 PatternInfo fIntervalPatterns[DateIntervalInfo::kIPI_MAX_INDEX];
01136
01140 UnicodeString* fDatePattern;
01141 UnicodeString* fTimePattern;
01142 UnicodeString* fDateTimeFormat;
01143 };
01144
01145 inline UBool
01146 DateIntervalFormat::operator!=(const Format& other) const {
01147 return !operator==(other);
01148 }
01149
01150 U_NAMESPACE_END
01151
01152 #endif
01153
01154 #endif // _DTITVFMT_H__
01155