xref: /haiku/headers/private/shared/CalendarView.h (revision 13581b3d2a71545960b98fefebc5225b5bf29072)
1 /*
2  * Copyright 2007-2011, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _CALENDAR_VIEW_H_
6 #define _CALENDAR_VIEW_H_
7 
8 
9 #include "DateTime.h"
10 
11 
12 #include <DateFormat.h>
13 #include <Invoker.h>
14 #include <List.h>
15 #include <Locale.h>
16 #include <String.h>
17 #include <View.h>
18 
19 
20 class BMessage;
21 
22 
23 namespace BPrivate {
24 
25 
26 class BCalendarView : public BView, public BInvoker {
27 public:
28 								BCalendarView(BRect frame, const char* name,
29 									uint32 resizeMask = B_FOLLOW_LEFT_TOP,
30 									uint32 flags = B_WILL_DRAW | B_FRAME_EVENTS
31 										| B_NAVIGABLE | B_PULSE_NEEDED);
32 
33 								BCalendarView(const char* name,
34 									uint32 flags = B_WILL_DRAW | B_FRAME_EVENTS
35 										| B_NAVIGABLE | B_PULSE_NEEDED);
36 
37 	virtual						~BCalendarView();
38 
39 								BCalendarView(BMessage* archive);
40 	static 	BArchivable*		Instantiate(BMessage* archive);
41 	virtual status_t			Archive(BMessage* archive,
42 									bool deep = true) const;
43 
44 	virtual void				AttachedToWindow();
45 
46 	virtual void				FrameResized(float width, float height);
47 
48 	virtual void				Draw(BRect updateRect);
49 
50 	virtual void				DrawDay(BView* owner, BRect frame,
51 									const char* text, bool isSelected = false,
52 									bool isEnabled = true, bool focus = false,
53 									bool highlight = false);
54 	virtual void				DrawDayName(BView* owner, BRect frame,
55 									const char* text);
56 	virtual void				DrawWeekNumber(BView* owner, BRect frame,
57 									const char* text);
58 
59 			uint32				SelectionCommand() const;
60 			BMessage*			SelectionMessage() const;
61 	virtual void				SetSelectionMessage(BMessage* message);
62 
63 			uint32				InvocationCommand() const;
64 			BMessage*			InvocationMessage() const;
65 	virtual void				SetInvocationMessage(BMessage* message);
66 
67 	virtual void				MakeFocus(bool state = true);
68 	virtual status_t			Invoke(BMessage* message = NULL);
69 
70 	virtual void				MouseDown(BPoint where);
71 
72 	virtual void				KeyDown(const char* bytes, int32 numBytes);
73 
74 	virtual void				Pulse();
75 
76 	virtual void				ResizeToPreferred();
77 	virtual void				GetPreferredSize(float* width, float* height);
78 
79 	virtual	BSize				MaxSize();
80 	virtual	BSize				MinSize();
81 	virtual	BSize				PreferredSize();
82 
83 			int32				Day() const;
84 			int32				Month() const;
85 			int32				Year() const;
86 
87 			bool				SetDay(int32 day);
88 			bool				SetMonth(int32 month);
89 			bool				SetYear(int32 year);
90 
91 			BDate				Date() const;
92 			bool				SetDate(const BDate& date);
93 			bool				SetDate(int32 year, int32 month, int32 day);
94 
95 			BWeekday			StartOfWeek() const;
96 			void				SetStartOfWeek(BWeekday startOfWeek);
97 
98 			bool				IsDayNameHeaderVisible() const;
99 			void				SetDayNameHeaderVisible(bool visible);
100 			void				UpdateDayNameHeader();
101 
102 			bool				IsWeekNumberHeaderVisible() const;
103 			void				SetWeekNumberHeaderVisible(bool visible);
104 
105 private:
106 			struct 				Selection {
107 									Selection()
108 										: row(0), column(0)
109 									{
110 									}
111 
112 									void
113 									SetTo(int32 _row, int32 _column)
114 									{
115 										row = _row;
116 										column = _column;
117 									}
118 
119 									int32 row;
120 									int32 column;
121 
122 									Selection& operator=(const Selection& s)
123 									{
124 										row = s.row;
125 										column = s.column;
126 										return *this;
127 									}
128 
129 									bool operator==(const Selection& s) const
130 									{
131 										return row == s.row
132 											&& column == s.column;
133 									}
134 
135 									bool operator!=(const Selection& s) const
136 									{
137 										return row != s.row
138 											|| column != s.column;
139 									}
140 								};
141 
142 			void				_InitObject();
143 
144 			void				_SetToDay();
145 			void				_SetToCurrentDay();
146 			void				_GetYearMonthForSelection(
147 									const Selection& selection, int32* year,
148 									int32* month) const;
149 			void				_GetPreferredSize(float* width, float* height);
150 
151 			void				_SetupDayNames();
152 			void				_SetupDayNumbers();
153 			void				_SetupWeekNumbers();
154 
155 			void				_PopulateDayNames(BDateFormatStyle style);
156 
157 			void				_DrawDays();
158 			void				_DrawFocusRect();
159 			void				_DrawDayHeader();
160 			void				_DrawWeekHeader();
161 			void				_DrawDay(int32 curRow, int32 curColumn,
162 									int32 row, int32 column, int32 counter,
163 									BRect frame, const char* text,
164 									bool focus = false, bool highlight = false);
165 			void				_DrawItem(BView* owner, BRect frame,
166 									const char* text, bool isSelected = false,
167 									bool isEnabled = true, bool focus = false,
168 									bool highlight = false);
169 
170 			void				_UpdateSelection();
171 			void				_UpdateCurrentDay();
172 			void				_UpdateCurrentDate();
173 
174 			BRect				_FirstCalendarItemFrame() const;
175 			BRect				_SetNewSelectedDay(const BPoint& where);
176 
177 			BRect				_RectOfDay(const Selection& selection) const;
178 
179 private:
180 			BMessage*			fSelectionMessage;
181 
182 			BDate				fDate;
183 			BDate				fCurrentDate;
184 
185 			Selection			fFocusedDay;
186 			Selection			fNewFocusedDay;
187 			bool				fFocusChanged;
188 
189 			Selection			fSelectedDay;
190 			Selection			fNewSelectedDay;
191 			bool				fSelectionChanged;
192 
193 			Selection			fCurrentDay;
194 			Selection			fNewCurrentDay;
195 			bool				fCurrentDayChanged;
196 
197 			int32				fStartOfWeek;
198 			bool				fDayNameHeaderVisible;
199 			bool				fWeekNumberHeaderVisible;
200 
201 			BString				fDayNames[7];
202 			BString				fWeekNumbers[6];
203 			BString				fDayNumbers[6][7];
204 
205 			// hide copy constructor & assignment
206 								BCalendarView(const BCalendarView& view);
207 			BCalendarView&		operator=(const BCalendarView& view);
208 };
209 
210 
211 }	// namespace BPrivate
212 
213 
214 #endif	// _CALENDAR_VIEW_H_
215