haiku/src/apps/terminal/PrefWindow.cpp

192 lines
4.1 KiB
C++

/*
* Copyright 2007-2009, Haiku, Inc. All rights reserved.
* Copyright 2003-2004 Kian Duffy, myob@users.sourceforge.net
* Parts Copyright 1998-1999 Kazuho Okui and Takashi Murai.
* All rights reserved. Distributed under the terms of the MIT license.
*/
#include "AppearPrefView.h"
#include "PrefHandler.h"
#include "PrefWindow.h"
#include "TermConst.h"
#include <Alert.h>
#include <Box.h>
#include <Button.h>
#include <Catalog.h>
#include <FilePanel.h>
#include <GroupLayoutBuilder.h>
#include <LayoutBuilder.h>
#include <Locale.h>
#include <Path.h>
#include <stdio.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Terminal PrefWindow"
PrefWindow::PrefWindow(const BMessenger& messenger)
:
BWindow(BRect(0, 0, 375, 185), "Terminal settings",
B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS),
fPreviousPref(new PrefHandler(PrefHandler::Default())),
fSavePanel(NULL),
fDirty(false),
fTerminalMessenger(messenger)
{
BString app = B_TRANSLATE_SYSTEM_NAME("Terminal");
BString title = B_TRANSLATE_COMMENT("%app% settings", "window title");
title.ReplaceFirst("%app%", app);
SetTitle(title);
BLayoutBuilder::Group<>(this, B_VERTICAL)
.AddGroup(B_VERTICAL)
.SetInsets(B_USE_WINDOW_SPACING)
.Add(fAppearanceView = new AppearancePrefView(
B_TRANSLATE("Appearance"), fTerminalMessenger))
.AddGroup(B_HORIZONTAL)
.Add(fDefaultsButton = new BButton("defaultsbutton",
B_TRANSLATE("Defaults"), new BMessage(MSG_DEFAULTS_PRESSED),
B_WILL_DRAW))
.Add(fRevertButton = new BButton("revertbutton",
B_TRANSLATE("Revert"), new BMessage(MSG_REVERT_PRESSED),
B_WILL_DRAW))
.AddGlue()
.Add(fSaveAsFileButton = new BButton("savebutton",
B_TRANSLATE("Save to file" B_UTF8_ELLIPSIS),
new BMessage(MSG_SAVEAS_PRESSED), B_WILL_DRAW))
.End()
.End();
fRevertButton->SetEnabled(fDirty);
AddShortcut('Q', B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED));
AddShortcut('W', B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED));
CenterOnScreen();
Show();
}
PrefWindow::~PrefWindow()
{
}
void
PrefWindow::Quit()
{
fTerminalMessenger.SendMessage(MSG_PREF_CLOSED);
delete fPreviousPref;
delete fSavePanel;
BWindow::Quit();
}
bool
PrefWindow::QuitRequested()
{
if (fDirty)
_Save();
return true;
}
void
PrefWindow::_SaveAs()
{
if (!fSavePanel) {
BMessenger messenger(this);
fSavePanel = new BFilePanel(B_SAVE_PANEL, &messenger);
}
fSavePanel->Show();
}
void
PrefWindow::_SaveRequested(BMessage *msg)
{
entry_ref dirref;
const char* filename;
msg->FindRef("directory", &dirref);
msg->FindString("name", &filename);
BDirectory dir(&dirref);
BPath path(&dir, filename);
PrefHandler::Default()->SaveAsText(path.Path(), PREFFILE_MIMETYPE,
TERM_SIGNATURE);
}
void
PrefWindow::_Save()
{
delete fPreviousPref;
fPreviousPref = new PrefHandler(PrefHandler::Default());
PrefHandler::Default()->SaveDefaultAsText();
fDirty = false;
}
void
PrefWindow::_Revert()
{
if (fDirty) {
PrefHandler::SetDefault(new PrefHandler(fPreviousPref));
fTerminalMessenger.SendMessage(MSG_HALF_FONT_CHANGED);
fTerminalMessenger.SendMessage(MSG_COLOR_CHANGED);
fTerminalMessenger.SendMessage(MSG_TAB_TITLE_SETTING_CHANGED);
fTerminalMessenger.SendMessage(MSG_WINDOW_TITLE_SETTING_CHANGED);
fAppearanceView->Revert();
fDirty = false;
fRevertButton->SetEnabled(fDirty);
}
}
void
PrefWindow::MessageReceived(BMessage* msg)
{
switch (msg->what) {
case MSG_SAVEAS_PRESSED:
_SaveAs();
break;
case MSG_REVERT_PRESSED:
_Revert();
break;
case MSG_DEFAULTS_PRESSED:
PrefHandler::SetDefault(new PrefHandler(false));
fTerminalMessenger.SendMessage(MSG_HALF_FONT_CHANGED);
fTerminalMessenger.SendMessage(MSG_COLOR_CHANGED);
fTerminalMessenger.SendMessage(MSG_TAB_TITLE_SETTING_CHANGED);
fTerminalMessenger.SendMessage(MSG_WINDOW_TITLE_SETTING_CHANGED);
fAppearanceView->Revert();
// fallthrough
case MSG_PREF_MODIFIED:
fDirty = true;
fRevertButton->SetEnabled(fDirty);
break;
case B_SAVE_REQUESTED:
_SaveRequested(msg);
break;
default:
BWindow::MessageReceived(msg);
break;
}
}