1f8cc2a74SStefano Ceccherini /* 2f8cc2a74SStefano Ceccherini * Copyright 2007, Haiku, Inc. 3f8cc2a74SStefano Ceccherini * Copyright 2003-2004 Kian Duffy, myob@users.sourceforge.net 4f8cc2a74SStefano Ceccherini * Parts Copyright 1998-1999 Kazuho Okui and Takashi Murai. 5f8cc2a74SStefano Ceccherini * All rights reserved. Distributed under the terms of the MIT license. 6f8cc2a74SStefano Ceccherini */ 7f8cc2a74SStefano Ceccherini 8f8cc2a74SStefano Ceccherini 9f8cc2a74SStefano Ceccherini #include "AppearPrefView.h" 10f8cc2a74SStefano Ceccherini #include "MenuUtil.h" 11f8cc2a74SStefano Ceccherini #include "PrefHandler.h" 12f8cc2a74SStefano Ceccherini #include "PrefWindow.h" 13f8cc2a74SStefano Ceccherini #include "PrefView.h" 1437b209afSStefano Ceccherini #include "Shell.h" 15f8cc2a74SStefano Ceccherini #include "TermConst.h" 16f8cc2a74SStefano Ceccherini 17f8cc2a74SStefano Ceccherini #include <Alert.h> 18f8cc2a74SStefano Ceccherini #include <Box.h> 19f8cc2a74SStefano Ceccherini #include <Button.h> 20f8cc2a74SStefano Ceccherini #include <FilePanel.h> 21f8cc2a74SStefano Ceccherini #include <Path.h> 22f8cc2a74SStefano Ceccherini #include <Screen.h> 23f8cc2a74SStefano Ceccherini 24f8cc2a74SStefano Ceccherini #include <stdio.h> 25f8cc2a74SStefano Ceccherini 26f8cc2a74SStefano Ceccherini 277e99a484SStefano Ceccherini PrefWindow::PrefWindow(BMessenger messenger) 28f8cc2a74SStefano Ceccherini : BWindow(_CenteredRect(BRect(0, 0, 350, 215)), "Terminal Settings", 29f8cc2a74SStefano Ceccherini B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, 30f8cc2a74SStefano Ceccherini B_NOT_RESIZABLE|B_NOT_ZOOMABLE), 31*dc25fe81SStefano Ceccherini fPrefTemp(new PrefHandler(PrefHandler::Default())), 32f8cc2a74SStefano Ceccherini fSavePanel(NULL), 33f8cc2a74SStefano Ceccherini fDirty(false), 34f8cc2a74SStefano Ceccherini fPrefDlgMessenger(messenger) 35f8cc2a74SStefano Ceccherini { 36f8cc2a74SStefano Ceccherini BRect rect; 37f8cc2a74SStefano Ceccherini 38f8cc2a74SStefano Ceccherini BView *top = new BView(Bounds(), "topview", B_FOLLOW_NONE, B_WILL_DRAW); 39f8cc2a74SStefano Ceccherini top->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 40f8cc2a74SStefano Ceccherini AddChild(top); 41f8cc2a74SStefano Ceccherini 42f8cc2a74SStefano Ceccherini rect = top->Bounds(); 43f8cc2a74SStefano Ceccherini rect.bottom *= .75; 44f8cc2a74SStefano Ceccherini AppearancePrefView *prefView= new AppearancePrefView(rect, "Appearance", 45f8cc2a74SStefano Ceccherini fPrefDlgMessenger); 46f8cc2a74SStefano Ceccherini top->AddChild(prefView); 47f8cc2a74SStefano Ceccherini 4866eba86fSAxel Dörfler fSaveAsFileButton = new BButton(BRect(0, 0, 1, 1), "savebutton", "Save to File" B_UTF8_ELLIPSIS, 49f8cc2a74SStefano Ceccherini new BMessage(MSG_SAVEAS_PRESSED), B_FOLLOW_TOP, B_WILL_DRAW); 50f8cc2a74SStefano Ceccherini fSaveAsFileButton->ResizeToPreferred(); 51f8cc2a74SStefano Ceccherini fSaveAsFileButton->MoveTo(5, top->Bounds().Height() - 5 - 52f8cc2a74SStefano Ceccherini fSaveAsFileButton->Bounds().Height()); 53f8cc2a74SStefano Ceccherini top->AddChild(fSaveAsFileButton); 54f8cc2a74SStefano Ceccherini 55f8cc2a74SStefano Ceccherini fSaveButton = new BButton(BRect(0, 0, 1, 1), "okbutton", "OK", 56f8cc2a74SStefano Ceccherini new BMessage(MSG_SAVE_PRESSED), B_FOLLOW_TOP, B_WILL_DRAW); 57f8cc2a74SStefano Ceccherini fSaveButton->ResizeToPreferred(); 58f8cc2a74SStefano Ceccherini fSaveButton->MoveTo(top->Bounds().Width() - 5 - fSaveButton->Bounds().Width(), 59f8cc2a74SStefano Ceccherini top->Bounds().Height() - 5 - fSaveButton->Bounds().Height()); 60f8cc2a74SStefano Ceccherini fSaveButton->MakeDefault(true); 61f8cc2a74SStefano Ceccherini top->AddChild(fSaveButton); 62f8cc2a74SStefano Ceccherini 63f8cc2a74SStefano Ceccherini fRevertButton = new BButton(BRect(0, 0, 1, 1), "revertbutton", 64f8cc2a74SStefano Ceccherini "Cancel", new BMessage(MSG_REVERT_PRESSED), B_FOLLOW_TOP, B_WILL_DRAW); 65f8cc2a74SStefano Ceccherini fRevertButton->ResizeToPreferred(); 66f8cc2a74SStefano Ceccherini fRevertButton->MoveTo(fSaveButton->Frame().left - 10 - 67f8cc2a74SStefano Ceccherini fRevertButton->Bounds().Width(), top->Bounds().Height() - 5 - 68f8cc2a74SStefano Ceccherini fRevertButton->Bounds().Height()); 69f8cc2a74SStefano Ceccherini top->AddChild(fRevertButton); 70f8cc2a74SStefano Ceccherini 71f8cc2a74SStefano Ceccherini AddShortcut((ulong)'Q', (ulong)B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED)); 72f8cc2a74SStefano Ceccherini AddShortcut((ulong)'W', (ulong)B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED)); 73f8cc2a74SStefano Ceccherini 74f8cc2a74SStefano Ceccherini Show(); 75f8cc2a74SStefano Ceccherini } 76f8cc2a74SStefano Ceccherini 77f8cc2a74SStefano Ceccherini 787e99a484SStefano Ceccherini PrefWindow::~PrefWindow() 79f8cc2a74SStefano Ceccherini { 80f8cc2a74SStefano Ceccherini } 81f8cc2a74SStefano Ceccherini 82f8cc2a74SStefano Ceccherini 83f8cc2a74SStefano Ceccherini void 847e99a484SStefano Ceccherini PrefWindow::Quit() 85f8cc2a74SStefano Ceccherini { 86f8cc2a74SStefano Ceccherini fPrefDlgMessenger.SendMessage(MSG_PREF_CLOSED); 87f8cc2a74SStefano Ceccherini delete fPrefTemp; 88f8cc2a74SStefano Ceccherini delete fSavePanel; 89f8cc2a74SStefano Ceccherini BWindow::Quit(); 90f8cc2a74SStefano Ceccherini } 91f8cc2a74SStefano Ceccherini 92f8cc2a74SStefano Ceccherini 93f8cc2a74SStefano Ceccherini bool 947e99a484SStefano Ceccherini PrefWindow::QuitRequested() 95f8cc2a74SStefano Ceccherini { 96f8cc2a74SStefano Ceccherini if (!fDirty) 97f8cc2a74SStefano Ceccherini return true; 98f8cc2a74SStefano Ceccherini 99f8cc2a74SStefano Ceccherini BAlert *alert = new BAlert("", "Save changes to this preference panel?", 100f8cc2a74SStefano Ceccherini "Cancel", "Don't Save", "Save", 101f8cc2a74SStefano Ceccherini B_WIDTH_AS_USUAL, B_OFFSET_SPACING, 102f8cc2a74SStefano Ceccherini B_WARNING_ALERT); 103f8cc2a74SStefano Ceccherini alert->SetShortcut(0, B_ESCAPE); 104f8cc2a74SStefano Ceccherini alert->SetShortcut(1, 'd'); 105f8cc2a74SStefano Ceccherini alert->SetShortcut(2, 's'); 106f8cc2a74SStefano Ceccherini 107f8cc2a74SStefano Ceccherini int32 index = alert->Go(); 108f8cc2a74SStefano Ceccherini if (index == 0) 109f8cc2a74SStefano Ceccherini return false; 110f8cc2a74SStefano Ceccherini 111f8cc2a74SStefano Ceccherini if (index == 2) 112f8cc2a74SStefano Ceccherini _Save(); 113f8cc2a74SStefano Ceccherini 114f8cc2a74SStefano Ceccherini return true; 115f8cc2a74SStefano Ceccherini } 116f8cc2a74SStefano Ceccherini 117f8cc2a74SStefano Ceccherini 118f8cc2a74SStefano Ceccherini void 1197e99a484SStefano Ceccherini PrefWindow::_SaveAs() 120f8cc2a74SStefano Ceccherini { 121f8cc2a74SStefano Ceccherini if (!fSavePanel) 122f8cc2a74SStefano Ceccherini fSavePanel = new BFilePanel(B_SAVE_PANEL, new BMessenger(this)); 123f8cc2a74SStefano Ceccherini 124f8cc2a74SStefano Ceccherini fSavePanel->Show(); 125f8cc2a74SStefano Ceccherini } 126f8cc2a74SStefano Ceccherini 127f8cc2a74SStefano Ceccherini 128f8cc2a74SStefano Ceccherini void 1297e99a484SStefano Ceccherini PrefWindow::_SaveRequested(BMessage *msg) 130f8cc2a74SStefano Ceccherini { 131f8cc2a74SStefano Ceccherini entry_ref dirref; 132f8cc2a74SStefano Ceccherini const char *filename; 133f8cc2a74SStefano Ceccherini 134f8cc2a74SStefano Ceccherini msg->FindRef("directory", &dirref); 135f8cc2a74SStefano Ceccherini msg->FindString("name", &filename); 136f8cc2a74SStefano Ceccherini 137f8cc2a74SStefano Ceccherini BDirectory dir(&dirref); 138f8cc2a74SStefano Ceccherini BPath path(&dir, filename); 139f8cc2a74SStefano Ceccherini 140*dc25fe81SStefano Ceccherini PrefHandler::Default()->SaveAsText(path.Path(), PREFFILE_MIMETYPE, TERM_SIGNATURE); 141f8cc2a74SStefano Ceccherini } 142f8cc2a74SStefano Ceccherini 143f8cc2a74SStefano Ceccherini 144f8cc2a74SStefano Ceccherini void 1457e99a484SStefano Ceccherini PrefWindow::_Save() 146f8cc2a74SStefano Ceccherini { 147f8cc2a74SStefano Ceccherini delete fPrefTemp; 148*dc25fe81SStefano Ceccherini fPrefTemp = new PrefHandler(PrefHandler::Default()); 149f8cc2a74SStefano Ceccherini 150f8cc2a74SStefano Ceccherini BPath path; 151f8cc2a74SStefano Ceccherini if (PrefHandler::GetDefaultPath(path) == B_OK) { 152*dc25fe81SStefano Ceccherini PrefHandler::Default()->SaveAsText(path.Path(), PREFFILE_MIMETYPE); 153f8cc2a74SStefano Ceccherini fDirty = false; 154f8cc2a74SStefano Ceccherini } 155f8cc2a74SStefano Ceccherini } 156f8cc2a74SStefano Ceccherini 157f8cc2a74SStefano Ceccherini 158f8cc2a74SStefano Ceccherini void 1597e99a484SStefano Ceccherini PrefWindow::_Revert() 160f8cc2a74SStefano Ceccherini { 161*dc25fe81SStefano Ceccherini PrefHandler::SetDefault(new PrefHandler(fPrefTemp)); 162f8cc2a74SStefano Ceccherini 163f8cc2a74SStefano Ceccherini fPrefDlgMessenger.SendMessage(MSG_HALF_FONT_CHANGED); 164f8cc2a74SStefano Ceccherini fPrefDlgMessenger.SendMessage(MSG_COLOR_CHANGED); 165f8cc2a74SStefano Ceccherini fPrefDlgMessenger.SendMessage(MSG_INPUT_METHOD_CHANGED); 166f8cc2a74SStefano Ceccherini 167f8cc2a74SStefano Ceccherini fDirty = false; 168f8cc2a74SStefano Ceccherini } 169f8cc2a74SStefano Ceccherini 170f8cc2a74SStefano Ceccherini 171f8cc2a74SStefano Ceccherini void 1727e99a484SStefano Ceccherini PrefWindow::MessageReceived(BMessage *msg) 173f8cc2a74SStefano Ceccherini { 174f8cc2a74SStefano Ceccherini switch (msg->what) { 175f8cc2a74SStefano Ceccherini case MSG_SAVE_PRESSED: 176f8cc2a74SStefano Ceccherini _Save(); 177f8cc2a74SStefano Ceccherini PostMessage(B_QUIT_REQUESTED); 178f8cc2a74SStefano Ceccherini break; 179f8cc2a74SStefano Ceccherini 180f8cc2a74SStefano Ceccherini case MSG_SAVEAS_PRESSED: 181f8cc2a74SStefano Ceccherini _SaveAs(); 182f8cc2a74SStefano Ceccherini break; 183f8cc2a74SStefano Ceccherini 184f8cc2a74SStefano Ceccherini case MSG_REVERT_PRESSED: 185f8cc2a74SStefano Ceccherini _Revert(); 186f8cc2a74SStefano Ceccherini PostMessage(B_QUIT_REQUESTED); 187f8cc2a74SStefano Ceccherini break; 188f8cc2a74SStefano Ceccherini 189f8cc2a74SStefano Ceccherini case MSG_PREF_MODIFIED: 190f8cc2a74SStefano Ceccherini fDirty = true; 191f8cc2a74SStefano Ceccherini break; 192f8cc2a74SStefano Ceccherini 193f8cc2a74SStefano Ceccherini case B_SAVE_REQUESTED: 194f8cc2a74SStefano Ceccherini _SaveRequested(msg); 195f8cc2a74SStefano Ceccherini break; 196f8cc2a74SStefano Ceccherini 197f8cc2a74SStefano Ceccherini default: 198f8cc2a74SStefano Ceccherini BWindow::MessageReceived(msg); 199f8cc2a74SStefano Ceccherini break; 200f8cc2a74SStefano Ceccherini } 201f8cc2a74SStefano Ceccherini } 202f8cc2a74SStefano Ceccherini 203f8cc2a74SStefano Ceccherini 204f8cc2a74SStefano Ceccherini BRect 2057e99a484SStefano Ceccherini PrefWindow::_CenteredRect(BRect rect) 206f8cc2a74SStefano Ceccherini { 207f8cc2a74SStefano Ceccherini BRect screenRect = BScreen().Frame(); 208f8cc2a74SStefano Ceccherini 209f8cc2a74SStefano Ceccherini screenRect.InsetBy(10,10); 210f8cc2a74SStefano Ceccherini 211f8cc2a74SStefano Ceccherini float x = screenRect.left + (screenRect.Width() - rect.Width()) / 2; 212f8cc2a74SStefano Ceccherini float y = screenRect.top + (screenRect.Height() - rect.Height()) / 3; 213f8cc2a74SStefano Ceccherini 214f8cc2a74SStefano Ceccherini rect.OffsetTo(x, y); 215f8cc2a74SStefano Ceccherini 216f8cc2a74SStefano Ceccherini return rect; 217f8cc2a74SStefano Ceccherini } 218