1/*
2 * Copyright 2004-2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Mike Berg <mike@berg-net.us>
7 *		Julun <host.haiku@gmx.de>
8 */
9
10
11#include "BaseView.h"
12
13#include <DateTime.h>
14#include <OS.h>
15
16#include "TimeMessages.h"
17
18
19TTimeBaseView::TTimeBaseView(const char* name)
20	:
21	BGroupView(name, B_VERTICAL, 0),
22	fMessage(H_TIME_UPDATE)
23{
24	SetFlags(Flags() | B_PULSE_NEEDED);
25}
26
27
28TTimeBaseView::~TTimeBaseView()
29{
30}
31
32
33void
34TTimeBaseView::Pulse()
35{
36	if (IsWatched())
37		_SendNotices();
38}
39
40
41void
42TTimeBaseView::AttachedToWindow()
43{
44	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
45	SetLowUIColor(ViewUIColor());
46}
47
48
49void
50TTimeBaseView::ChangeTime(BMessage* message)
51{
52	bool isTime;
53	if (message->FindBool("time", &isTime) != B_OK)
54		return;
55
56	BDateTime dateTime = BDateTime::CurrentDateTime(B_LOCAL_TIME);
57
58	if (isTime) {
59		BTime time = dateTime.Time();
60		int32 hour;
61		if (message->FindInt32("hour", &hour) != B_OK)
62			hour  = time.Hour();
63
64		int32 minute;
65		if (message->FindInt32("minute", &minute) != B_OK)
66			minute = time.Minute();
67
68		int32 second;
69		if (message->FindInt32("second", &second) != B_OK)
70			second = time.Second();
71
72		time.SetTime(hour, minute, second);
73		dateTime.SetTime(time);
74	} else {
75		BDate date = dateTime.Date();
76		int32 day;
77		if (message->FindInt32("day", &day) != B_OK)
78			day = date.Day();
79
80		int32 year;
81		if (message->FindInt32("year", &year) != B_OK)
82			year = date.Year();
83
84		int32 month;
85		if (message->FindInt32("month", &month) != B_OK)
86			month = date.Month();
87
88		date.SetDate(year, month, day);
89		dateTime.SetDate(date);
90	}
91
92	set_real_time_clock(dateTime.Time_t());
93}
94
95
96void
97TTimeBaseView::_SendNotices()
98{
99	fMessage.MakeEmpty();
100
101	BDate date = BDate::CurrentDate(B_LOCAL_TIME);
102	fMessage.AddInt32("day", date.Day());
103	fMessage.AddInt32("year", date.Year());
104	fMessage.AddInt32("month", date.Month());
105
106	BTime time = BTime::CurrentTime(B_LOCAL_TIME);
107	fMessage.AddInt32("hour", time.Hour());
108	fMessage.AddInt32("minute", time.Minute());
109	fMessage.AddInt32("second", time.Second());
110
111	SendNotices(H_TM_CHANGED, &fMessage);
112}
113
114