1f8cc2a74SStefano Ceccherini /* 2c4eae2c1SStefano Ceccherini * Copyright 2007-2008, 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 "PrefHandler.h" 11f8cc2a74SStefano Ceccherini #include "PrefWindow.h" 12f8cc2a74SStefano Ceccherini #include "TermConst.h" 13f8cc2a74SStefano Ceccherini 14f8cc2a74SStefano Ceccherini #include <Alert.h> 15f8cc2a74SStefano Ceccherini #include <Box.h> 16f8cc2a74SStefano Ceccherini #include <Button.h> 17f8cc2a74SStefano Ceccherini #include <FilePanel.h> 18c1ca410bSStefano Ceccherini #include <GroupLayoutBuilder.h> 19c1ca410bSStefano Ceccherini #include <LayoutBuilder.h> 20f8cc2a74SStefano Ceccherini #include <Path.h> 21f8cc2a74SStefano Ceccherini 22f8cc2a74SStefano Ceccherini #include <stdio.h> 23f8cc2a74SStefano Ceccherini 24f8cc2a74SStefano Ceccherini 25a5ec0eebSStefano Ceccherini PrefWindow::PrefWindow(const BMessenger &messenger) 26c1ca410bSStefano Ceccherini : BWindow(BRect(0, 0, 375, 185), "Terminal Preferences", 27f8cc2a74SStefano Ceccherini B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, 28c1ca410bSStefano Ceccherini B_NOT_RESIZABLE|B_NOT_ZOOMABLE|B_AUTO_UPDATE_SIZE_LIMITS), 2956e415ddSStefano Ceccherini fPreviousPref(new PrefHandler(PrefHandler::Default())), 30f8cc2a74SStefano Ceccherini fSavePanel(NULL), 31f8cc2a74SStefano Ceccherini fDirty(false), 32a5ec0eebSStefano Ceccherini fTerminalMessenger(messenger) 33f8cc2a74SStefano Ceccherini { 34c1ca410bSStefano Ceccherini BLayoutBuilder::Group<>(this, B_VERTICAL) 35*64fd88f5SStefano Ceccherini .AddGroup(B_VERTICAL) 36c1ca410bSStefano Ceccherini .SetInsets(10, 10, 10, 10) 37a5ec0eebSStefano Ceccherini .Add(new AppearancePrefView("Appearance", fTerminalMessenger)) 38c1ca410bSStefano Ceccherini .AddGroup(B_HORIZONTAL) 39c1ca410bSStefano Ceccherini .Add(fSaveAsFileButton = new BButton("savebutton", 40c1ca410bSStefano Ceccherini "Save to File" B_UTF8_ELLIPSIS, 41c1ca410bSStefano Ceccherini new BMessage(MSG_SAVEAS_PRESSED), B_WILL_DRAW)) 42c1ca410bSStefano Ceccherini .AddGlue() 43c1ca410bSStefano Ceccherini .Add(fRevertButton = new BButton("revertbutton", 44c1ca410bSStefano Ceccherini "Cancel", new BMessage(MSG_REVERT_PRESSED), 45c1ca410bSStefano Ceccherini B_WILL_DRAW)) 46c1ca410bSStefano Ceccherini .Add(fSaveButton = new BButton("okbutton", "OK", 47c1ca410bSStefano Ceccherini new BMessage(MSG_SAVE_PRESSED), B_WILL_DRAW)) 48c1ca410bSStefano Ceccherini .End() 49c1ca410bSStefano Ceccherini .End(); 50f8cc2a74SStefano Ceccherini 51f8cc2a74SStefano Ceccherini fSaveButton->MakeDefault(true); 52f8cc2a74SStefano Ceccherini 53c4eae2c1SStefano Ceccherini AddShortcut('Q', B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED)); 54c4eae2c1SStefano Ceccherini AddShortcut('W', B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED)); 55f8cc2a74SStefano Ceccherini 56c1ca410bSStefano Ceccherini CenterOnScreen(); 57f8cc2a74SStefano Ceccherini Show(); 58f8cc2a74SStefano Ceccherini } 59f8cc2a74SStefano Ceccherini 60f8cc2a74SStefano Ceccherini 617e99a484SStefano Ceccherini PrefWindow::~PrefWindow() 62f8cc2a74SStefano Ceccherini { 63f8cc2a74SStefano Ceccherini } 64f8cc2a74SStefano Ceccherini 65f8cc2a74SStefano Ceccherini 66f8cc2a74SStefano Ceccherini void 677e99a484SStefano Ceccherini PrefWindow::Quit() 68f8cc2a74SStefano Ceccherini { 69a5ec0eebSStefano Ceccherini fTerminalMessenger.SendMessage(MSG_PREF_CLOSED); 7056e415ddSStefano Ceccherini delete fPreviousPref; 71f8cc2a74SStefano Ceccherini delete fSavePanel; 72f8cc2a74SStefano Ceccherini BWindow::Quit(); 73f8cc2a74SStefano Ceccherini } 74f8cc2a74SStefano Ceccherini 75f8cc2a74SStefano Ceccherini 76f8cc2a74SStefano Ceccherini bool 777e99a484SStefano Ceccherini PrefWindow::QuitRequested() 78f8cc2a74SStefano Ceccherini { 79f8cc2a74SStefano Ceccherini if (!fDirty) 80f8cc2a74SStefano Ceccherini return true; 81f8cc2a74SStefano Ceccherini 82f8cc2a74SStefano Ceccherini BAlert *alert = new BAlert("", "Save changes to this preference panel?", 83f8cc2a74SStefano Ceccherini "Cancel", "Don't Save", "Save", 84f8cc2a74SStefano Ceccherini B_WIDTH_AS_USUAL, B_OFFSET_SPACING, 85f8cc2a74SStefano Ceccherini B_WARNING_ALERT); 86f8cc2a74SStefano Ceccherini alert->SetShortcut(0, B_ESCAPE); 87f8cc2a74SStefano Ceccherini alert->SetShortcut(1, 'd'); 88f8cc2a74SStefano Ceccherini alert->SetShortcut(2, 's'); 89f8cc2a74SStefano Ceccherini 90f8cc2a74SStefano Ceccherini int32 index = alert->Go(); 91f8cc2a74SStefano Ceccherini if (index == 0) 92f8cc2a74SStefano Ceccherini return false; 93f8cc2a74SStefano Ceccherini 94f8cc2a74SStefano Ceccherini if (index == 2) 95f8cc2a74SStefano Ceccherini _Save(); 96f8cc2a74SStefano Ceccherini 97f8cc2a74SStefano Ceccherini return true; 98f8cc2a74SStefano Ceccherini } 99f8cc2a74SStefano Ceccherini 100f8cc2a74SStefano Ceccherini 101f8cc2a74SStefano Ceccherini void 1027e99a484SStefano Ceccherini PrefWindow::_SaveAs() 103f8cc2a74SStefano Ceccherini { 10406a28b54SIngo Weinhold if (!fSavePanel) { 10506a28b54SIngo Weinhold BMessenger messenger(this); 10606a28b54SIngo Weinhold fSavePanel = new BFilePanel(B_SAVE_PANEL, &messenger); 10706a28b54SIngo Weinhold } 108f8cc2a74SStefano Ceccherini 109f8cc2a74SStefano Ceccherini fSavePanel->Show(); 110f8cc2a74SStefano Ceccherini } 111f8cc2a74SStefano Ceccherini 112f8cc2a74SStefano Ceccherini 113f8cc2a74SStefano Ceccherini void 1147e99a484SStefano Ceccherini PrefWindow::_SaveRequested(BMessage *msg) 115f8cc2a74SStefano Ceccherini { 116f8cc2a74SStefano Ceccherini entry_ref dirref; 117f8cc2a74SStefano Ceccherini const char *filename; 118f8cc2a74SStefano Ceccherini 119f8cc2a74SStefano Ceccherini msg->FindRef("directory", &dirref); 120f8cc2a74SStefano Ceccherini msg->FindString("name", &filename); 121f8cc2a74SStefano Ceccherini 122f8cc2a74SStefano Ceccherini BDirectory dir(&dirref); 123f8cc2a74SStefano Ceccherini BPath path(&dir, filename); 124f8cc2a74SStefano Ceccherini 125dc25fe81SStefano Ceccherini PrefHandler::Default()->SaveAsText(path.Path(), PREFFILE_MIMETYPE, TERM_SIGNATURE); 126f8cc2a74SStefano Ceccherini } 127f8cc2a74SStefano Ceccherini 128f8cc2a74SStefano Ceccherini 129f8cc2a74SStefano Ceccherini void 1307e99a484SStefano Ceccherini PrefWindow::_Save() 131f8cc2a74SStefano Ceccherini { 13256e415ddSStefano Ceccherini delete fPreviousPref; 13356e415ddSStefano Ceccherini fPreviousPref = new PrefHandler(PrefHandler::Default()); 134f8cc2a74SStefano Ceccherini 135f8cc2a74SStefano Ceccherini BPath path; 136f8cc2a74SStefano Ceccherini if (PrefHandler::GetDefaultPath(path) == B_OK) { 137dc25fe81SStefano Ceccherini PrefHandler::Default()->SaveAsText(path.Path(), PREFFILE_MIMETYPE); 138f8cc2a74SStefano Ceccherini fDirty = false; 139f8cc2a74SStefano Ceccherini } 140f8cc2a74SStefano Ceccherini } 141f8cc2a74SStefano Ceccherini 142f8cc2a74SStefano Ceccherini 143f8cc2a74SStefano Ceccherini void 1447e99a484SStefano Ceccherini PrefWindow::_Revert() 145f8cc2a74SStefano Ceccherini { 14656e415ddSStefano Ceccherini if (fDirty) { 14756e415ddSStefano Ceccherini PrefHandler::SetDefault(new PrefHandler(fPreviousPref)); 148f8cc2a74SStefano Ceccherini 149a5ec0eebSStefano Ceccherini fTerminalMessenger.SendMessage(MSG_HALF_FONT_CHANGED); 150a5ec0eebSStefano Ceccherini fTerminalMessenger.SendMessage(MSG_COLOR_CHANGED); 151f8cc2a74SStefano Ceccherini 152f8cc2a74SStefano Ceccherini fDirty = false; 153f8cc2a74SStefano Ceccherini } 15456e415ddSStefano Ceccherini } 155f8cc2a74SStefano Ceccherini 156f8cc2a74SStefano Ceccherini 157f8cc2a74SStefano Ceccherini void 1587e99a484SStefano Ceccherini PrefWindow::MessageReceived(BMessage *msg) 159f8cc2a74SStefano Ceccherini { 160f8cc2a74SStefano Ceccherini switch (msg->what) { 161f8cc2a74SStefano Ceccherini case MSG_SAVE_PRESSED: 162f8cc2a74SStefano Ceccherini _Save(); 163f8cc2a74SStefano Ceccherini PostMessage(B_QUIT_REQUESTED); 164f8cc2a74SStefano Ceccherini break; 165f8cc2a74SStefano Ceccherini 166f8cc2a74SStefano Ceccherini case MSG_SAVEAS_PRESSED: 167f8cc2a74SStefano Ceccherini _SaveAs(); 168f8cc2a74SStefano Ceccherini break; 169f8cc2a74SStefano Ceccherini 170f8cc2a74SStefano Ceccherini case MSG_REVERT_PRESSED: 171f8cc2a74SStefano Ceccherini _Revert(); 172f8cc2a74SStefano Ceccherini PostMessage(B_QUIT_REQUESTED); 173f8cc2a74SStefano Ceccherini break; 174f8cc2a74SStefano Ceccherini 175f8cc2a74SStefano Ceccherini case MSG_PREF_MODIFIED: 176f8cc2a74SStefano Ceccherini fDirty = true; 177f8cc2a74SStefano Ceccherini break; 178f8cc2a74SStefano Ceccherini 179f8cc2a74SStefano Ceccherini case B_SAVE_REQUESTED: 180f8cc2a74SStefano Ceccherini _SaveRequested(msg); 181f8cc2a74SStefano Ceccherini break; 182f8cc2a74SStefano Ceccherini 183f8cc2a74SStefano Ceccherini default: 184f8cc2a74SStefano Ceccherini BWindow::MessageReceived(msg); 185f8cc2a74SStefano Ceccherini break; 186f8cc2a74SStefano Ceccherini } 187f8cc2a74SStefano Ceccherini } 188