1/*
2 * Copyright 2004-2007, Haiku. All rights reserved.
3 * Distributed under the terms of the Haiku License.
4 *
5 * Authors:
6 *		Andrew McCall, mccall@digitalparadise.co.uk
7 *		J��r��me Duval
8 *		Marcus Overhagen
9 */
10
11
12#include "KeyboardMessages.h"
13#include "KeyboardView.h"
14#include "KeyboardWindow.h"
15
16#include <Box.h>
17#include <Button.h>
18#include <Catalog.h>
19#include <GroupLayout.h>
20#include <GroupLayoutBuilder.h>
21#include <Locale.h>
22#include <Message.h>
23#include <Screen.h>
24#include <Slider.h>
25#include <TextControl.h>
26
27#undef B_TRANSLATION_CONTEXT
28#define B_TRANSLATION_CONTEXT "KeyboardWindow"
29
30KeyboardWindow::KeyboardWindow()
31	:
32	BWindow(BRect(0, 0, 200, 200), B_TRANSLATE_SYSTEM_NAME("Keyboard"),
33		B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE
34		| B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS)
35{
36	MoveTo(fSettings.WindowCorner());
37
38	// Add the main settings view
39	fSettingsView = new KeyboardView();
40	BBox* fSettingsBox = new BBox("keyboard_box");
41	fSettingsBox->AddChild(fSettingsView);
42
43	// Add the "Default" button..
44	fDefaultsButton = new BButton(B_TRANSLATE("Defaults"), new BMessage(BUTTON_DEFAULTS));
45
46	// Add the "Revert" button...
47	fRevertButton = new BButton(B_TRANSLATE("Revert"), new BMessage(BUTTON_REVERT));
48	fRevertButton->SetEnabled(false);
49
50	// Build the layout
51	SetLayout(new BGroupLayout(B_VERTICAL));
52
53	AddChild(BGroupLayoutBuilder(B_VERTICAL, 10)
54		.Add(fSettingsBox)
55		.AddGroup(B_HORIZONTAL, 7)
56			.Add(fDefaultsButton)
57			.Add(fRevertButton)
58			.AddGlue()
59		.End()
60		.SetInsets(10, 10, 10, 10)
61	);
62
63	BSlider* slider = (BSlider* )FindView("key_repeat_rate");
64	if (slider !=NULL)
65		slider->SetValue(fSettings.KeyboardRepeatRate());
66
67	slider = (BSlider* )FindView("delay_until_key_repeat");
68	if (slider !=NULL)
69		slider->SetValue(fSettings.KeyboardRepeatDelay());
70
71	fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
72
73	// center window if it would be off-screen
74	BScreen screen;
75	if (screen.Frame().right < Frame().right
76		|| screen.Frame().bottom < Frame().bottom) {
77		CenterOnScreen();
78	}
79
80#ifdef DEBUG
81	fSettings.Dump();
82#endif
83
84	Show();
85}
86
87
88bool
89KeyboardWindow::QuitRequested()
90{
91	fSettings.SetWindowCorner(Frame().LeftTop());
92
93#ifdef DEBUG
94	fSettings.Dump();
95#endif
96
97	be_app->PostMessage(B_QUIT_REQUESTED);
98	return true;
99}
100
101
102void
103KeyboardWindow::MessageReceived(BMessage* message)
104{
105	BSlider* slider = NULL;
106
107	switch (message->what) {
108		case BUTTON_DEFAULTS:
109		{
110			fSettings.Defaults();
111
112			slider = (BSlider* )FindView("key_repeat_rate");
113			if (slider !=NULL)
114				slider->SetValue(fSettings.KeyboardRepeatRate());
115
116			slider = (BSlider* )FindView("delay_until_key_repeat");
117			if (slider !=NULL)
118				slider->SetValue(fSettings.KeyboardRepeatDelay());
119
120			fDefaultsButton->SetEnabled(false);
121
122  			fRevertButton->SetEnabled(true);
123			break;
124		}
125		case BUTTON_REVERT:
126		{
127			fSettings.Revert();
128
129			slider = (BSlider* )FindView("key_repeat_rate");
130			if (slider !=NULL)
131				slider->SetValue(fSettings.KeyboardRepeatRate());
132
133			slider = (BSlider* )FindView("delay_until_key_repeat");
134			if (slider !=NULL)
135				slider->SetValue(fSettings.KeyboardRepeatDelay());
136
137			fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
138
139  			fRevertButton->SetEnabled(false);
140			break;
141		}
142		case SLIDER_REPEAT_RATE:
143		{
144			int32 rate;
145			if (message->FindInt32("be:value", &rate) != B_OK)
146				break;
147			fSettings.SetKeyboardRepeatRate(rate);
148
149			fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
150
151			fRevertButton->SetEnabled(true);
152			break;
153		}
154		case SLIDER_DELAY_RATE:
155		{
156			int32 delay;
157			if (message->FindInt32("be:value", &delay) != B_OK)
158				break;
159
160			// We need to look at the value from the slider and make it "jump"
161			// to the next notch along. Setting the min and max values of the
162			// slider to 1 and 4 doesn't work like the real Keyboard app.
163			if (delay < 375000)
164				delay = 250000;
165			if (delay >= 375000 && delay < 625000)
166				delay = 500000;
167			if (delay >= 625000 && delay < 875000)
168				delay = 750000;
169			if (delay >= 875000)
170				delay = 1000000;
171
172			fSettings.SetKeyboardRepeatDelay(delay);
173
174			slider = (BSlider* )FindView("delay_until_key_repeat");
175			if (slider != NULL)
176				slider->SetValue(delay);
177
178			fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
179
180			fRevertButton->SetEnabled(true);
181			break;
182		}
183
184		default:
185			BWindow::MessageReceived(message);
186			break;
187	}
188}
189