1/*
2 * Copyright 2010-2014, Haiku, Inc.
3 * Distributed under the terms of the MIT Licence.
4 */
5#ifndef _B_DATE_FORMAT_H_
6#define _B_DATE_FORMAT_H_
7
8
9#include <DateTime.h>
10#include <DateTimeFormat.h>
11#include <Format.h>
12#include <FormattingConventions.h>
13#include <Language.h>
14#include <Locker.h>
15
16
17#ifndef U_ICU_NAMESPACE
18  #define U_ICU_NAMESPACE icu
19#endif
20namespace U_ICU_NAMESPACE {
21	class DateFormat;
22}
23
24
25class BString;
26class BTimeZone;
27
28
29enum BWeekday {
30	B_WEEKDAY_MONDAY = 1,
31	B_WEEKDAY_TUESDAY,
32	B_WEEKDAY_WEDNESDAY,
33	B_WEEKDAY_THURSDAY,
34	B_WEEKDAY_FRIDAY,
35	B_WEEKDAY_SATURDAY,
36	B_WEEKDAY_SUNDAY,
37};
38
39
40class BDateFormat: public BFormat {
41public:
42								BDateFormat(const BLocale* locale = NULL);
43								BDateFormat(const BLanguage& language,
44									const BFormattingConventions& format);
45								BDateFormat(const BDateFormat &other);
46	virtual						~BDateFormat();
47
48			status_t			GetDateFormat(BDateFormatStyle style,
49									BString& outFormat) const;
50			void				SetDateFormat(BDateFormatStyle style,
51									const BString& format);
52
53								// formatting
54
55			ssize_t				Format(char* string, const size_t maxSize,
56									const time_t time,
57									const BDateFormatStyle style) const;
58			status_t			Format(BString& string, const time_t time,
59									const BDateFormatStyle style,
60									const BTimeZone* timeZone = NULL) const;
61			status_t			Format(BString& string, const BDate& time,
62									const BDateFormatStyle style,
63									const BTimeZone* timeZone = NULL) const;
64			status_t			Format(BString& string,
65									int*& fieldPositions, int& fieldCount,
66									const time_t time,
67									const BDateFormatStyle style) const;
68
69			status_t			GetFields(BDateElement*& fields,
70									int& fieldCount, BDateFormatStyle style
71									) const;
72
73			status_t			GetStartOfWeek(BWeekday* weekday) const;
74			status_t			GetMonthName(int month, BString& outName,
75									const BDateFormatStyle style
76									= B_FULL_DATE_FORMAT) const;
77			status_t			GetDayName(int day, BString& outName,
78									const BDateFormatStyle style
79									= B_FULL_DATE_FORMAT) const;
80
81								// parsing
82
83			status_t			Parse(BString source, BDateFormatStyle style,
84									BDate& output);
85
86private:
87			int					_ConvertDayNumberToICU(int day) const;
88
89			U_ICU_NAMESPACE::DateFormat*	_CreateDateFormatter(
90									const BDateFormatStyle style) const;
91
92};
93
94
95inline int
96BDateFormat::_ConvertDayNumberToICU(int day) const
97{
98	return day == 7 ? 1 : day + 1;
99}
100
101
102#endif	// _B_DATE_FORMAT_H_
103