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