xref: /haiku/src/apps/terminal/PrefWindow.cpp (revision dc25fe8173a381f951765f518a85c287e894cd8c)
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