1/*
2 * Copyright 2001-2015, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Rafael Romo
7 *		Stefano Ceccherini (burton666@libero.it)
8 *		Axel D��rfler, axeld@pinc-software.de
9 *		Augustin Cavalier <waddlesplash>
10 */
11
12
13#include "AlertWindow.h"
14#include "Constants.h"
15
16#include <Button.h>
17#include <Catalog.h>
18#include <String.h>
19#include <TextView.h>
20#include <Window.h>
21#include <TimeUnitFormat.h>
22
23
24#undef B_TRANSLATION_CONTEXT
25#define B_TRANSLATION_CONTEXT "Screen"
26
27
28AlertWindow::AlertWindow(BMessenger handler)
29	: BAlert(B_TRANSLATE("Confirm changes"),
30			 "", B_TRANSLATE("Undo"), B_TRANSLATE("Keep")),
31	// we will wait 12 seconds until we send a message
32	fSeconds(12),
33	fHandler(handler)
34{
35	SetType(B_WARNING_ALERT);
36	SetPulseRate(1000000);
37	TextView()->SetStylable(true);
38	TextView()->GetFontAndColor(0, &fOriginalFont);
39	fFont = fOriginalFont;
40	fFont.SetFace(B_BOLD_FACE);
41	UpdateCountdownView();
42}
43
44
45void
46AlertWindow::DispatchMessage(BMessage* message, BHandler* handler)
47{
48	if (message->what == B_PULSE) {
49		if (--fSeconds == 0) {
50			fHandler.SendMessage(BUTTON_UNDO_MSG);
51			PostMessage(B_QUIT_REQUESTED);
52			Hide();
53		} else
54			UpdateCountdownView();
55	}
56
57	BAlert::DispatchMessage(message, handler);
58}
59
60
61void
62AlertWindow::MessageReceived(BMessage* message)
63{
64	switch (message->what) {
65		case 'ALTB': // alert button message
66		{
67			int32 which;
68			if (message->FindInt32("which", &which) == B_OK) {
69				if (which == 1)
70					fHandler.SendMessage(MAKE_INITIAL_MSG);
71				else if (which == 0)
72					fHandler.SendMessage(BUTTON_UNDO_MSG);
73				PostMessage(B_QUIT_REQUESTED);
74				Hide();
75			}
76			break;
77		}
78
79		case B_KEY_DOWN:
80		{
81			int8 val;
82			if (message->FindInt8("byte", &val) == B_OK && val == B_ESCAPE) {
83				fHandler.SendMessage(BUTTON_UNDO_MSG);
84				PostMessage(B_QUIT_REQUESTED);
85				Hide();
86				break;
87			}
88			// fall through
89		}
90
91		default:
92			BAlert::MessageReceived(message);
93			break;
94	}
95}
96
97
98void
99AlertWindow::UpdateCountdownView()
100{
101	BString str1 = B_TRANSLATE("Do you wish to keep these settings?");
102	BString string = str1;
103	string += "\n";
104	string += B_TRANSLATE("Settings will revert in %seconds.");
105
106	BTimeUnitFormat format;
107	BString tmp;
108	format.Format(tmp, fSeconds, B_TIME_UNIT_SECOND);
109
110	string.ReplaceFirst("%seconds", tmp);
111	// The below is black magic, do not touch. We really need to refactor
112	// BTextView sometime...
113	TextView()->SetFontAndColor(0, str1.Length() + 1, &fOriginalFont,
114		B_FONT_ALL);
115	TextView()->SetText(string.String());
116	TextView()->SetFontAndColor(0, str1.Length(), &fFont, B_FONT_ALL);
117}
118