xref: /haiku/src/preferences/time/DateTimeView.cpp (revision 1cae077af90d277902626fb74f34c2239351d4f0)
1e4289a54SKarsten Heimrich /*
2e4289a54SKarsten Heimrich  * Copyright 2004-2007, Haiku, Inc. All Rights Reserved.
3e4289a54SKarsten Heimrich  * Distributed under the terms of the MIT License.
4e4289a54SKarsten Heimrich  *
5e4289a54SKarsten Heimrich  * Authors:
6e4289a54SKarsten Heimrich  *		Andrew McCall <mccall@@digitalparadise.co.uk>
7e4289a54SKarsten Heimrich  *		Mike Berg <mike@berg-net.us>
8e4289a54SKarsten Heimrich  *		Julun <host.haiku@gmx.de>
9*1cae077aSStephan Aßmus  *		Philippe Saint-Pierre <stpere@gmail.com>
10e4289a54SKarsten Heimrich  */
11e4289a54SKarsten Heimrich 
12e4289a54SKarsten Heimrich #include "DateTimeView.h"
13e4289a54SKarsten Heimrich #include "AnalogClock.h"
14e4289a54SKarsten Heimrich #include "CalendarView.h"
15e4289a54SKarsten Heimrich #include "DateTimeEdit.h"
16e4289a54SKarsten Heimrich #include "TimeMessages.h"
17*1cae077aSStephan Aßmus #include "DateTime.h"
18e4289a54SKarsten Heimrich 
19e4289a54SKarsten Heimrich 
20*1cae077aSStephan Aßmus #include <Button.h>
21e4289a54SKarsten Heimrich #include <CheckBox.h>
22e4289a54SKarsten Heimrich #include <Entry.h>
23e4289a54SKarsten Heimrich #include <File.h>
24e4289a54SKarsten Heimrich #include <FindDirectory.h>
25e4289a54SKarsten Heimrich #include <Message.h>
26e4289a54SKarsten Heimrich #include <Path.h>
27e4289a54SKarsten Heimrich #include <RadioButton.h>
28e4289a54SKarsten Heimrich #include <String.h>
29e4289a54SKarsten Heimrich #include <StringView.h>
30e4289a54SKarsten Heimrich #include <Window.h>
31*1cae077aSStephan Aßmus #include <time.h>
32e4289a54SKarsten Heimrich 
33e4289a54SKarsten Heimrich 
34e4289a54SKarsten Heimrich #ifdef HAIKU_TARGET_PLATFORM_HAIKU
35e4289a54SKarsten Heimrich #	include <syscalls.h>
36e4289a54SKarsten Heimrich #else
37a22279faSAxel Dörfler extern "C" void _kset_tzfilename_(const char *name, size_t length, bool isGMT);
38e4289a54SKarsten Heimrich #	define _kern_set_tzfilename _kset_tzfilename_
39e4289a54SKarsten Heimrich #endif
40e4289a54SKarsten Heimrich 
41e4289a54SKarsten Heimrich 
42e4289a54SKarsten Heimrich DateTimeView::DateTimeView(BRect frame)
4385b69a94SKarsten Heimrich 	: BView(frame, "dateTimeView", B_FOLLOW_NONE, B_WILL_DRAW | B_NAVIGABLE_JUMP),
44e4289a54SKarsten Heimrich 	  fGmtTime(NULL),
4585b69a94SKarsten Heimrich 	  fUseGmtTime(false),
46*1cae077aSStephan Aßmus 	  fInitialized(false),
47*1cae077aSStephan Aßmus 	  fSystemTimeAtStart(system_time())
48e4289a54SKarsten Heimrich {
49e4289a54SKarsten Heimrich 	_ReadRTCSettings();
5085b69a94SKarsten Heimrich 	_InitView();
51*1cae077aSStephan Aßmus 
52*1cae077aSStephan Aßmus 	// record the current time to enable revert.
53*1cae077aSStephan Aßmus 	time(&fTimeAtStart);
54e4289a54SKarsten Heimrich }
55e4289a54SKarsten Heimrich 
56e4289a54SKarsten Heimrich 
57e4289a54SKarsten Heimrich DateTimeView::~DateTimeView()
58e4289a54SKarsten Heimrich {
59e4289a54SKarsten Heimrich 	_WriteRTCSettings();
60e4289a54SKarsten Heimrich }
61e4289a54SKarsten Heimrich 
62e4289a54SKarsten Heimrich 
63e4289a54SKarsten Heimrich void
64e4289a54SKarsten Heimrich DateTimeView::AttachedToWindow()
65e4289a54SKarsten Heimrich {
66e4289a54SKarsten Heimrich 	if (Parent())
67e4289a54SKarsten Heimrich 		SetViewColor(Parent()->ViewColor());
68e4289a54SKarsten Heimrich 
69e4289a54SKarsten Heimrich 	if (!fInitialized) {
70e4289a54SKarsten Heimrich 		fInitialized = true;
7185b69a94SKarsten Heimrich 
7285b69a94SKarsten Heimrich 		fGmtTime->SetTarget(this);
7385b69a94SKarsten Heimrich 		fLocalTime->SetTarget(this);
7485b69a94SKarsten Heimrich 		fCalendarView->SetTarget(this);
75*1cae077aSStephan Aßmus 		fRevertButton->SetTarget(this);
76e4289a54SKarsten Heimrich 	}
77e4289a54SKarsten Heimrich }
78e4289a54SKarsten Heimrich 
79e4289a54SKarsten Heimrich 
80e4289a54SKarsten Heimrich void
81e4289a54SKarsten Heimrich DateTimeView::Draw(BRect /*updateRect*/)
82e4289a54SKarsten Heimrich {
83e4289a54SKarsten Heimrich 	rgb_color viewcolor = ViewColor();
84e4289a54SKarsten Heimrich 	rgb_color dark = tint_color(viewcolor, B_DARKEN_4_TINT);
85e4289a54SKarsten Heimrich 	rgb_color light = tint_color(viewcolor, B_LIGHTEN_MAX_TINT);
86e4289a54SKarsten Heimrich 
87e4289a54SKarsten Heimrich 	//draw a separator line
88e4289a54SKarsten Heimrich 	BRect bounds(Bounds());
8985b69a94SKarsten Heimrich 	BPoint start(bounds.Width() / 2.0f, bounds.top + 5.0f);
9085b69a94SKarsten Heimrich 	BPoint end(bounds.Width() / 2.0, bounds.bottom - 5.0f);
91e4289a54SKarsten Heimrich 
92e4289a54SKarsten Heimrich 	BeginLineArray(2);
93e4289a54SKarsten Heimrich 		AddLine(start, end, dark);
94e4289a54SKarsten Heimrich 		start.x++;
95e4289a54SKarsten Heimrich 		end.x++;
96e4289a54SKarsten Heimrich 		AddLine(start, end, light);
97e4289a54SKarsten Heimrich 	EndLineArray();
98e4289a54SKarsten Heimrich 
99e4289a54SKarsten Heimrich 	fTimeEdit->Draw(bounds);
100e4289a54SKarsten Heimrich 	fDateEdit->Draw(bounds);
101e4289a54SKarsten Heimrich }
102e4289a54SKarsten Heimrich 
103e4289a54SKarsten Heimrich 
104e4289a54SKarsten Heimrich void
105e4289a54SKarsten Heimrich DateTimeView::MessageReceived(BMessage *message)
106e4289a54SKarsten Heimrich {
107e4289a54SKarsten Heimrich 	int32 change;
108e4289a54SKarsten Heimrich 	switch(message->what) {
109e4289a54SKarsten Heimrich 		case B_OBSERVER_NOTICE_CHANGE:
110e4289a54SKarsten Heimrich 			message->FindInt32(B_OBSERVE_WHAT_CHANGE, &change);
111e4289a54SKarsten Heimrich 			switch(change) {
112e4289a54SKarsten Heimrich 				case H_TM_CHANGED:
113e4289a54SKarsten Heimrich 					_UpdateDateTime(message);
114e4289a54SKarsten Heimrich 					break;
115e4289a54SKarsten Heimrich 
116e4289a54SKarsten Heimrich 				default:
117e4289a54SKarsten Heimrich 					BView::MessageReceived(message);
118e4289a54SKarsten Heimrich 					break;
119e4289a54SKarsten Heimrich 			}
120e4289a54SKarsten Heimrich 		break;
121e4289a54SKarsten Heimrich 
122e4289a54SKarsten Heimrich 		case kDayChanged:
123e4289a54SKarsten Heimrich 		{
124e4289a54SKarsten Heimrich 			BMessage msg(*message);
125e4289a54SKarsten Heimrich 			msg.what = H_USER_CHANGE;
126e4289a54SKarsten Heimrich 			msg.AddBool("time", false);
127e4289a54SKarsten Heimrich 			Window()->PostMessage(&msg);
128*1cae077aSStephan Aßmus 			break;
129*1cae077aSStephan Aßmus 		}
130e4289a54SKarsten Heimrich 
131e4289a54SKarsten Heimrich 		case kRTCUpdate:
132*1cae077aSStephan Aßmus 			fUseGmtTime = fGmtTime->Value() == B_CONTROL_ON;
133e4289a54SKarsten Heimrich 			_UpdateGmtSettings();
134*1cae077aSStephan Aßmus 			CheckCanRevert();
135*1cae077aSStephan Aßmus 			break;
136*1cae077aSStephan Aßmus 
137*1cae077aSStephan Aßmus 		case kMsgRevert:
138*1cae077aSStephan Aßmus 			_Revert();
139*1cae077aSStephan Aßmus 			fRevertButton->SetEnabled(false);
140e4289a54SKarsten Heimrich 			break;
141e4289a54SKarsten Heimrich 
142e4289a54SKarsten Heimrich 		default:
143e4289a54SKarsten Heimrich 			BView::MessageReceived(message);
144e4289a54SKarsten Heimrich 			break;
145e4289a54SKarsten Heimrich 	}
146e4289a54SKarsten Heimrich }
147e4289a54SKarsten Heimrich 
148e4289a54SKarsten Heimrich 
149e4289a54SKarsten Heimrich void
150*1cae077aSStephan Aßmus DateTimeView::CheckCanRevert()
151*1cae077aSStephan Aßmus {
152*1cae077aSStephan Aßmus 	// check GMT vs Local setting
153*1cae077aSStephan Aßmus 	bool enable = fUseGmtTime != fOldUseGmtTime;
154*1cae077aSStephan Aßmus 
155*1cae077aSStephan Aßmus 	// check for changed time
156*1cae077aSStephan Aßmus 	time_t unchangedNow = fTimeAtStart + _PrefletUptime();
157*1cae077aSStephan Aßmus 	time_t changedNow;
158*1cae077aSStephan Aßmus 	time(&changedNow);
159*1cae077aSStephan Aßmus 
160*1cae077aSStephan Aßmus 	enable = enable || (changedNow != unchangedNow);
161*1cae077aSStephan Aßmus 
162*1cae077aSStephan Aßmus 	fRevertButton->SetEnabled(enable);
163*1cae077aSStephan Aßmus }
164*1cae077aSStephan Aßmus 
165*1cae077aSStephan Aßmus 
166*1cae077aSStephan Aßmus void
167*1cae077aSStephan Aßmus DateTimeView::_Revert()
168*1cae077aSStephan Aßmus {
169*1cae077aSStephan Aßmus 	// Set the clock and calendar as they were at launch time +
170*1cae077aSStephan Aßmus 	// time ellapsed since application launch.
171*1cae077aSStephan Aßmus 
172*1cae077aSStephan Aßmus 	fUseGmtTime = fOldUseGmtTime;
173*1cae077aSStephan Aßmus 	_UpdateGmtSettings();
174*1cae077aSStephan Aßmus 
175*1cae077aSStephan Aßmus 	if (fUseGmtTime)
176*1cae077aSStephan Aßmus 		fGmtTime->SetValue(B_CONTROL_ON);
177*1cae077aSStephan Aßmus 	else
178*1cae077aSStephan Aßmus 		fLocalTime->SetValue(B_CONTROL_ON);
179*1cae077aSStephan Aßmus 
180*1cae077aSStephan Aßmus 	time_t timeNow = fTimeAtStart + _PrefletUptime();
181*1cae077aSStephan Aßmus 	struct tm result;
182*1cae077aSStephan Aßmus 	struct tm* timeInfo;
183*1cae077aSStephan Aßmus 	timeInfo = localtime_r(&timeNow, &result);
184*1cae077aSStephan Aßmus 
185*1cae077aSStephan Aßmus 	BDateTime dateTime = BDateTime::CurrentDateTime(B_LOCAL_TIME);
186*1cae077aSStephan Aßmus 	BTime time = dateTime.Time();
187*1cae077aSStephan Aßmus 	BDate date = dateTime.Date();
188*1cae077aSStephan Aßmus 	time.SetTime(timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec % 60);
189*1cae077aSStephan Aßmus 	date.SetDate(timeInfo->tm_year + 1900, timeInfo->tm_mon + 1,
190*1cae077aSStephan Aßmus 		timeInfo->tm_mday);
191*1cae077aSStephan Aßmus 	dateTime.SetTime(time);
192*1cae077aSStephan Aßmus 	dateTime.SetDate(date);
193*1cae077aSStephan Aßmus 
194*1cae077aSStephan Aßmus 	set_real_time_clock(dateTime.Time_t());
195*1cae077aSStephan Aßmus }
196*1cae077aSStephan Aßmus 
197*1cae077aSStephan Aßmus 
198*1cae077aSStephan Aßmus time_t
199*1cae077aSStephan Aßmus DateTimeView::_PrefletUptime() const
200*1cae077aSStephan Aßmus {
201*1cae077aSStephan Aßmus 	return (time_t)((system_time() - fSystemTimeAtStart) / 1000000);
202*1cae077aSStephan Aßmus }
203*1cae077aSStephan Aßmus 
204*1cae077aSStephan Aßmus 
205*1cae077aSStephan Aßmus void
206e4289a54SKarsten Heimrich DateTimeView::_InitView()
207e4289a54SKarsten Heimrich {
208e4289a54SKarsten Heimrich 	font_height fontHeight;
209e4289a54SKarsten Heimrich 	be_plain_font->GetHeight(&fontHeight);
21085b69a94SKarsten Heimrich 	float textHeight = fontHeight.descent + fontHeight.ascent
21185b69a94SKarsten Heimrich 		+ fontHeight.leading + 6.0;	// 6px border
212e4289a54SKarsten Heimrich 
213e4289a54SKarsten Heimrich 	// left side
21485b69a94SKarsten Heimrich 	BRect bounds = Bounds();
21585b69a94SKarsten Heimrich 	bounds.InsetBy(10.0, 10.0);
21685b69a94SKarsten Heimrich 	bounds.top += textHeight + 10.0;
217e4289a54SKarsten Heimrich 
21885b69a94SKarsten Heimrich 	fCalendarView = new BCalendarView(bounds, "calendar");
219e4289a54SKarsten Heimrich 	fCalendarView->SetWeekNumberHeaderVisible(false);
22085b69a94SKarsten Heimrich 	fCalendarView->ResizeToPreferred();
221e4289a54SKarsten Heimrich 	fCalendarView->SetSelectionMessage(new BMessage(kDayChanged));
222e4289a54SKarsten Heimrich 	fCalendarView->SetInvocationMessage(new BMessage(kDayChanged));
223e4289a54SKarsten Heimrich 
22485b69a94SKarsten Heimrich 	bounds.top -= textHeight + 10.0;
22585b69a94SKarsten Heimrich 	bounds.bottom = bounds.top + textHeight;
22685b69a94SKarsten Heimrich 	bounds.right = fCalendarView->Frame().right;
227e4289a54SKarsten Heimrich 
22885b69a94SKarsten Heimrich 	fDateEdit = new TDateEdit(bounds, "dateEdit", 3);
22985b69a94SKarsten Heimrich 	AddChild(fDateEdit);
23085b69a94SKarsten Heimrich 	AddChild(fCalendarView);
23185b69a94SKarsten Heimrich 
23285b69a94SKarsten Heimrich 	// right side, 2px extra for separator
23385b69a94SKarsten Heimrich 	bounds.OffsetBy(bounds.Width() + 22.0, 0.0);
23485b69a94SKarsten Heimrich 	fTimeEdit = new TTimeEdit(bounds, "timeEdit", 4);
235e4289a54SKarsten Heimrich 	AddChild(fTimeEdit);
236e4289a54SKarsten Heimrich 
23785b69a94SKarsten Heimrich 	bounds = fCalendarView->Frame();
23885b69a94SKarsten Heimrich 	bounds.OffsetBy(bounds.Width() + 22.0, 0.0);
239e4289a54SKarsten Heimrich 
24085b69a94SKarsten Heimrich 	fClock = new TAnalogClock(bounds, "analogClock");
241e4289a54SKarsten Heimrich 	AddChild(fClock);
242e4289a54SKarsten Heimrich 
243e4289a54SKarsten Heimrich 	// clock radio buttons
24485b69a94SKarsten Heimrich 	bounds.top = fClock->Frame().bottom + 10.0;
24585b69a94SKarsten Heimrich 	BStringView *text = new BStringView(bounds, "clockSetTo", "Clock set to:");
246e4289a54SKarsten Heimrich 	AddChild(text);
247e4289a54SKarsten Heimrich 	text->ResizeToPreferred();
248e4289a54SKarsten Heimrich 
24985b69a94SKarsten Heimrich 	bounds.left += 10.0f;
25085b69a94SKarsten Heimrich 	bounds.top = text->Frame().bottom;
25185b69a94SKarsten Heimrich 	fLocalTime = new BRadioButton(bounds, "localTime", "Local Time",
252e4289a54SKarsten Heimrich 		new BMessage(kRTCUpdate));
253e4289a54SKarsten Heimrich 	AddChild(fLocalTime);
254e4289a54SKarsten Heimrich 	fLocalTime->ResizeToPreferred();
255e4289a54SKarsten Heimrich 
25685b69a94SKarsten Heimrich 	bounds.left = fLocalTime->Frame().right + 10.0;
25785b69a94SKarsten Heimrich 	fGmtTime = new BRadioButton(bounds, "greenwichMeanTime", "GMT",
25885b69a94SKarsten Heimrich 		new BMessage(kRTCUpdate));
259e4289a54SKarsten Heimrich 	AddChild(fGmtTime);
260e4289a54SKarsten Heimrich 	fGmtTime->ResizeToPreferred();
261e4289a54SKarsten Heimrich 
26285b69a94SKarsten Heimrich 	if (fUseGmtTime)
263e4289a54SKarsten Heimrich 		fGmtTime->SetValue(B_CONTROL_ON);
26485b69a94SKarsten Heimrich 	else
26585b69a94SKarsten Heimrich 		fLocalTime->SetValue(B_CONTROL_ON);
26685b69a94SKarsten Heimrich 
267*1cae077aSStephan Aßmus 	fOldUseGmtTime = fUseGmtTime;
268*1cae077aSStephan Aßmus 
269*1cae077aSStephan Aßmus 	BRect rect = Bounds();
270*1cae077aSStephan Aßmus 
271*1cae077aSStephan Aßmus 	rect.left = 10;
272*1cae077aSStephan Aßmus 	rect.top = rect.bottom - 10;
273*1cae077aSStephan Aßmus 
274*1cae077aSStephan Aßmus 	fRevertButton = new BButton(rect, "revert", "Revert",
275*1cae077aSStephan Aßmus 		new BMessage(kMsgRevert), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW);
276*1cae077aSStephan Aßmus 
277*1cae077aSStephan Aßmus 	fRevertButton->ResizeToPreferred();
278*1cae077aSStephan Aßmus 	fRevertButton->SetEnabled(false);
279*1cae077aSStephan Aßmus 	float buttonHeight = fRevertButton->Bounds().Height();
280*1cae077aSStephan Aßmus 	fRevertButton->MoveBy(0, -buttonHeight);
281*1cae077aSStephan Aßmus 	AddChild(fRevertButton);
282*1cae077aSStephan Aßmus 
28385b69a94SKarsten Heimrich 	ResizeTo(fClock->Frame().right + 10.0, fGmtTime->Frame().bottom + 10.0);
284e4289a54SKarsten Heimrich }
285e4289a54SKarsten Heimrich 
286e4289a54SKarsten Heimrich 
287e4289a54SKarsten Heimrich void
288e4289a54SKarsten Heimrich DateTimeView::_ReadRTCSettings()
289e4289a54SKarsten Heimrich {
290e4289a54SKarsten Heimrich 	BPath path;
291e4289a54SKarsten Heimrich 	if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK)
292e4289a54SKarsten Heimrich 		return;
293e4289a54SKarsten Heimrich 
294e4289a54SKarsten Heimrich 	path.Append("RTC_time_settings");
295e4289a54SKarsten Heimrich 
296e4289a54SKarsten Heimrich 	BEntry entry(path.Path());
297e4289a54SKarsten Heimrich 	if (entry.Exists()) {
29885b69a94SKarsten Heimrich 		BFile file(&entry, B_READ_ONLY);
299e4289a54SKarsten Heimrich 		if (file.InitCheck() == B_OK) {
30085b69a94SKarsten Heimrich 			char buffer[6];
30185b69a94SKarsten Heimrich 			file.Read(buffer, 6);
30285b69a94SKarsten Heimrich 			if (strncmp(buffer, "gmt", 3) == 0)
30385b69a94SKarsten Heimrich 				fUseGmtTime = true;
304e4289a54SKarsten Heimrich 		}
30585b69a94SKarsten Heimrich 	} else
30685b69a94SKarsten Heimrich 		_UpdateGmtSettings();
307e4289a54SKarsten Heimrich }
308e4289a54SKarsten Heimrich 
309e4289a54SKarsten Heimrich 
310e4289a54SKarsten Heimrich void
311e4289a54SKarsten Heimrich DateTimeView::_WriteRTCSettings()
312e4289a54SKarsten Heimrich {
313e4289a54SKarsten Heimrich 	BPath path;
314e4289a54SKarsten Heimrich 	if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK)
315e4289a54SKarsten Heimrich 		return;
316e4289a54SKarsten Heimrich 
317e4289a54SKarsten Heimrich 	path.Append("RTC_time_settings");
318e4289a54SKarsten Heimrich 
319e4289a54SKarsten Heimrich 	BFile file(path.Path(), B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY);
320e4289a54SKarsten Heimrich 	if (file.InitCheck() == B_OK) {
32185b69a94SKarsten Heimrich 		if (fUseGmtTime)
322e4289a54SKarsten Heimrich 			file.Write("gmt", 3);
32385b69a94SKarsten Heimrich 		else
32485b69a94SKarsten Heimrich 			file.Write("local", 5);
325e4289a54SKarsten Heimrich 	}
326e4289a54SKarsten Heimrich }
327e4289a54SKarsten Heimrich 
328e4289a54SKarsten Heimrich 
329e4289a54SKarsten Heimrich void
330e4289a54SKarsten Heimrich DateTimeView::_UpdateGmtSettings()
331e4289a54SKarsten Heimrich {
332e4289a54SKarsten Heimrich 	_WriteRTCSettings();
333e4289a54SKarsten Heimrich 
334e4289a54SKarsten Heimrich 	BPath path;
335e4289a54SKarsten Heimrich 	if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK)
336e4289a54SKarsten Heimrich 		return;
337e4289a54SKarsten Heimrich 
338e4289a54SKarsten Heimrich 	path.Append("timezone");
339e4289a54SKarsten Heimrich 	BEntry entry(path.Path(), true);
340e4289a54SKarsten Heimrich 
341e4289a54SKarsten Heimrich 	if (!entry.Exists())
342e4289a54SKarsten Heimrich 		return;
343e4289a54SKarsten Heimrich 
344e4289a54SKarsten Heimrich 	entry.GetPath(&path);
345e4289a54SKarsten Heimrich 
346e4289a54SKarsten Heimrich 	// take the existing timezone and set it's gmt use
34785b69a94SKarsten Heimrich 	_kern_set_tzfilename(path.Path(), B_PATH_NAME_LENGTH, fUseGmtTime);
348e4289a54SKarsten Heimrich }
349e4289a54SKarsten Heimrich 
350e4289a54SKarsten Heimrich 
351e4289a54SKarsten Heimrich void
352e4289a54SKarsten Heimrich DateTimeView::_UpdateDateTime(BMessage *message)
353e4289a54SKarsten Heimrich {
354e4289a54SKarsten Heimrich 	int32 day;
355e4289a54SKarsten Heimrich 	int32 month;
356e4289a54SKarsten Heimrich 	int32 year;
357e4289a54SKarsten Heimrich 	if (message->FindInt32("month", &month) == B_OK
358e4289a54SKarsten Heimrich 		&& message->FindInt32("day", &day) == B_OK
359e4289a54SKarsten Heimrich 		&& message->FindInt32("year", &year) == B_OK)
360e4289a54SKarsten Heimrich 	{
361e4289a54SKarsten Heimrich 		fDateEdit->SetDate(year, month, day);
362e4289a54SKarsten Heimrich 		fCalendarView->SetDate(year, month, day);
363e4289a54SKarsten Heimrich 	}
364e4289a54SKarsten Heimrich 
365e4289a54SKarsten Heimrich 	int32 hour;
366e4289a54SKarsten Heimrich 	int32 minute;
367e4289a54SKarsten Heimrich 	int32 second;
368e4289a54SKarsten Heimrich 	if (message->FindInt32("hour", &hour) == B_OK
369e4289a54SKarsten Heimrich 		&& message->FindInt32("minute", &minute) == B_OK
370e4289a54SKarsten Heimrich 		&& message->FindInt32("second", &second) == B_OK)
371e4289a54SKarsten Heimrich 	{
372e4289a54SKarsten Heimrich 		fClock->SetTime(hour, minute, second);
37385b69a94SKarsten Heimrich 		fTimeEdit->SetTime(hour, minute, second);
374e4289a54SKarsten Heimrich 	}
375e4289a54SKarsten Heimrich }
376