xref: /haiku/src/preferences/time/BaseView.cpp (revision 3d4afef9cba2f328e238089d4609d00d4b1524f3)
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 
19 TTimeBaseView::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 
28 TTimeBaseView::~TTimeBaseView()
29 {
30 }
31 
32 
33 void
34 TTimeBaseView::Pulse()
35 {
36 	if (IsWatched())
37 		_SendNotices();
38 }
39 
40 
41 void
42 TTimeBaseView::AttachedToWindow()
43 {
44 	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
45 	SetLowUIColor(ViewUIColor());
46 }
47 
48 
49 void
50 TTimeBaseView::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 
96 void
97 TTimeBaseView::_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