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 <Message.h>
18#include <Screen.h>
19#include <TabView.h>
20
21#include "BaseView.h"
22#include "ClockView.h"
23#include "DateTimeView.h"
24#include "NetworkTimeView.h"
25#include "TimeMessages.h"
26#include "TimeSettings.h"
27#include "ZoneView.h"
28
29
30#undef B_TRANSLATION_CONTEXT
31#define B_TRANSLATION_CONTEXT "Time"
32
33TTimeWindow::TTimeWindow()
34	:
35	BWindow(BRect(0, 0, 0, 0), B_TRANSLATE_SYSTEM_NAME("Time"), B_TITLED_WINDOW,
36		B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS)
37{
38	_InitWindow();
39	_AlignWindow();
40
41	AddShortcut('A', B_COMMAND_KEY, new BMessage(B_ABOUT_REQUESTED));
42}
43
44
45TTimeWindow::~TTimeWindow()
46{
47}
48
49
50bool
51TTimeWindow::QuitRequested()
52{
53	TimeSettings().SetLeftTop(Frame().LeftTop());
54
55	fBaseView->StopWatchingAll(fTimeZoneView);
56	fBaseView->StopWatchingAll(fDateTimeView);
57
58	be_app->PostMessage(B_QUIT_REQUESTED);
59
60	return BWindow::QuitRequested();
61}
62
63
64void
65TTimeWindow::MessageReceived(BMessage* message)
66{
67	switch(message->what) {
68		case H_USER_CHANGE:
69			fBaseView->ChangeTime(message);
70			// To make sure no old time message is in the queue
71			_SendTimeChangeFinished();
72			_SetRevertStatus();
73			break;
74
75		case B_ABOUT_REQUESTED:
76			be_app->PostMessage(B_ABOUT_REQUESTED);
77			break;
78
79		case kMsgRevert:
80			fDateTimeView->MessageReceived(message);
81			fTimeZoneView->MessageReceived(message);
82			fNetworkTimeView->MessageReceived(message);
83			fClockView->MessageReceived(message);
84			fRevertButton->SetEnabled(false);
85			break;
86
87		case kRTCUpdate:
88			fDateTimeView->MessageReceived(message);
89			fTimeZoneView->MessageReceived(message);
90			_SetRevertStatus();
91			break;
92
93		case kMsgChange:
94			_SetRevertStatus();
95			break;
96
97		case kSelectClockTab:
98			// focus the clock tab (last one)
99			fTabView->Select(fTabView->CountTabs() - 1);
100			break;
101
102		case kShowHideTime:
103			fClockView->MessageReceived(message);
104			break;
105
106		default:
107			BWindow::MessageReceived(message);
108			break;
109	}
110}
111
112
113void
114TTimeWindow::_InitWindow()
115{
116	SetPulseRate(500000);
117
118	fDateTimeView = new DateTimeView(B_TRANSLATE("Date and time"));
119	fTimeZoneView = new TimeZoneView(B_TRANSLATE("Time zone"));
120	fNetworkTimeView = new NetworkTimeView(B_TRANSLATE("Network time"));
121	fClockView = new ClockView(B_TRANSLATE("Clock"));
122
123	fBaseView = new TTimeBaseView("baseView");
124	fBaseView->StartWatchingAll(fDateTimeView);
125	fBaseView->StartWatchingAll(fTimeZoneView);
126
127	fTabView = new BTabView("tabView");
128	fTabView->AddTab(fDateTimeView);
129	fTabView->AddTab(fTimeZoneView);
130	fTabView->AddTab(fNetworkTimeView);
131	fTabView->AddTab(fClockView);
132
133	fBaseView->AddChild(fTabView);
134
135	fRevertButton = new BButton("revert", B_TRANSLATE("Revert"),
136		new BMessage(kMsgRevert));
137	fRevertButton->SetEnabled(false);
138	fRevertButton->SetTarget(this);
139	fRevertButton->SetExplicitAlignment(
140		BAlignment(B_ALIGN_LEFT, B_ALIGN_MIDDLE));
141
142	BLayoutBuilder::Group<>(this, B_VERTICAL, B_USE_DEFAULT_SPACING)
143		.Add(fBaseView)
144		.Add(fRevertButton)
145		.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
146			B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING);
147}
148
149
150void
151TTimeWindow::_AlignWindow()
152{
153	BPoint pt = TimeSettings().LeftTop();
154	MoveTo(pt);
155
156	BRect frame = Frame();
157	BRect screen = BScreen().Frame();
158	if (!frame.Intersects(screen.InsetByCopy(50.0, 50.0))) {
159		BRect bounds(Bounds());
160		BPoint leftTop((screen.Width() - bounds.Width()) / 2.0,
161			(screen.Height() - bounds.Height()) / 2.0);
162
163		MoveTo(leftTop);
164	}
165}
166
167
168void
169TTimeWindow::_SendTimeChangeFinished()
170{
171	BMessenger messenger(fDateTimeView);
172	BMessage msg(kChangeTimeFinished);
173	messenger.SendMessage(&msg);
174}
175
176
177void
178TTimeWindow::_SetRevertStatus()
179{
180	fRevertButton->SetEnabled(fDateTimeView->CheckCanRevert()
181		|| fTimeZoneView->CheckCanRevert()
182		|| fNetworkTimeView->CheckCanRevert()
183		|| fClockView->CheckCanRevert());
184}
185