1/*
2 * Copyright 2004-2011, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Andrew McCall <mccall@@digitalparadise.co.uk>
7 *		Julun <host.haiku@gmx.de>
8 *		Hamish Morrison <hamish@lavabit.com>
9 */
10
11#include "TimeWindow.h"
12
13#include <Application.h>
14#include <Button.h>
15#include <Catalog.h>
16#include <LayoutBuilder.h>
17#include <LocaleRoster.h>
18#include <Message.h>
19#include <Screen.h>
20#include <SeparatorView.h>
21#include <TabView.h>
22
23#include "BaseView.h"
24#include "ClockView.h"
25#include "DateTimeView.h"
26#include "NetworkTimeView.h"
27#include "TimeMessages.h"
28#include "TimeSettings.h"
29#include "ZoneView.h"
30
31
32#undef B_TRANSLATION_CONTEXT
33#define B_TRANSLATION_CONTEXT "Time"
34
35TTimeWindow::TTimeWindow()
36	:
37	BWindow(BRect(0, 0, 0, 0), B_TRANSLATE_SYSTEM_NAME("Time"), B_TITLED_WINDOW,
38		B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS)
39{
40	_InitWindow();
41	_AlignWindow();
42
43	AddShortcut('A', B_COMMAND_KEY, new BMessage(B_ABOUT_REQUESTED));
44}
45
46
47TTimeWindow::~TTimeWindow()
48{
49}
50
51
52bool
53TTimeWindow::QuitRequested()
54{
55	TimeSettings().SetLeftTop(Frame().LeftTop());
56
57	fBaseView->StopWatchingAll(fTimeZoneView);
58	fBaseView->StopWatchingAll(fDateTimeView);
59
60	be_app->PostMessage(B_QUIT_REQUESTED);
61
62	return BWindow::QuitRequested();
63}
64
65
66void
67TTimeWindow::MessageReceived(BMessage* message)
68{
69	switch(message->what) {
70		case H_USER_CHANGE:
71			fBaseView->ChangeTime(message);
72			// To make sure no old time message is in the queue
73			_SendTimeChangeFinished();
74			_SetRevertStatus();
75			break;
76
77		case B_ABOUT_REQUESTED:
78			be_app->PostMessage(B_ABOUT_REQUESTED);
79			break;
80
81		case B_LOCALE_CHANGED:
82		{
83			BLocaleRoster::Default()->Refresh();
84			fDateTimeView->MessageReceived(message);
85			break;
86		}
87
88		case kMsgRevert:
89			fDateTimeView->MessageReceived(message);
90			fTimeZoneView->MessageReceived(message);
91			fNetworkTimeView->MessageReceived(message);
92			fClockView->MessageReceived(message);
93			fRevertButton->SetEnabled(false);
94			break;
95
96		case kRTCUpdate:
97			fDateTimeView->MessageReceived(message);
98			fTimeZoneView->MessageReceived(message);
99			_SetRevertStatus();
100			break;
101
102		case kMsgChange:
103			_SetRevertStatus();
104			break;
105
106		case kSelectClockTab:
107			// focus the clock tab (last one)
108			fTabView->Select(fTabView->CountTabs() - 1);
109			break;
110
111		case kShowHideTime:
112			fClockView->MessageReceived(message);
113			break;
114
115		default:
116			BWindow::MessageReceived(message);
117			break;
118	}
119}
120
121
122void
123TTimeWindow::_InitWindow()
124{
125	SetPulseRate(500000);
126
127	fDateTimeView = new DateTimeView(B_TRANSLATE("Date and time"));
128	fTimeZoneView = new TimeZoneView(B_TRANSLATE("Time zone"));
129	fNetworkTimeView = new NetworkTimeView(B_TRANSLATE("Network time"));
130	fClockView = new ClockView(B_TRANSLATE("Clock"));
131
132	fBaseView = new TTimeBaseView("baseView");
133	fBaseView->StartWatchingAll(fDateTimeView);
134	fBaseView->StartWatchingAll(fTimeZoneView);
135
136	fTabView = new BTabView("tabView", B_WIDTH_FROM_WIDEST);
137	fTabView->AddTab(fDateTimeView);
138	fTabView->AddTab(fTimeZoneView);
139	fTabView->AddTab(fNetworkTimeView);
140	fTabView->AddTab(fClockView);
141	fTabView->SetBorder(B_NO_BORDER);
142
143	fBaseView->AddChild(fTabView);
144
145	fRevertButton = new BButton("revert", B_TRANSLATE("Revert"),
146		new BMessage(kMsgRevert));
147	fRevertButton->SetEnabled(false);
148	fRevertButton->SetTarget(this);
149	fRevertButton->SetExplicitAlignment(
150		BAlignment(B_ALIGN_LEFT, B_ALIGN_MIDDLE));
151
152	BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
153		.SetInsets(0, B_USE_DEFAULT_SPACING, 0, 0)
154		.Add(fBaseView)
155		.Add(new BSeparatorView(B_HORIZONTAL))
156		.AddGroup(B_HORIZONTAL)
157			.Add(fRevertButton)
158			.SetInsets(B_USE_WINDOW_SPACING, B_USE_DEFAULT_SPACING,
159				B_USE_DEFAULT_SPACING, B_USE_WINDOW_SPACING);
160}
161
162
163void
164TTimeWindow::_AlignWindow()
165{
166	MoveTo(TimeSettings().LeftTop());
167	MoveOnScreen();
168}
169
170
171void
172TTimeWindow::_SendTimeChangeFinished()
173{
174	BMessenger messenger(fDateTimeView);
175	BMessage msg(kChangeTimeFinished);
176	messenger.SendMessage(&msg);
177}
178
179
180void
181TTimeWindow::_SetRevertStatus()
182{
183	fRevertButton->SetEnabled(fDateTimeView->CheckCanRevert()
184		|| fTimeZoneView->CheckCanRevert()
185		|| fNetworkTimeView->CheckCanRevert()
186		|| fClockView->CheckCanRevert());
187}
188