xref: /haiku/src/apps/launchbox/App.cpp (revision c237c4ce593ee823d9867fd997e51e4c447f5623)
1 /*
2  * Copyright 2006-2011, Stephan Aßmus <superstippi@gmx.de>.
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 
6 #include "App.h"
7 
8 #include <stdio.h>
9 
10 #include <Catalog.h>
11 #include <Entry.h>
12 #include <Message.h>
13 #include <String.h>
14 #include <Directory.h>
15 #include <File.h>
16 
17 #include "support.h"
18 
19 #include "MainWindow.h"
20 
21 #undef B_TRANSLATION_CONTEXT
22 #define B_TRANSLATION_CONTEXT "LaunchBox"
23 
24 
25 App::App()
26 	:
27 	BApplication("application/x-vnd.Haiku-LaunchBox"),
28 	fSettingsChanged(false),
29 	fNamePanelSize(200, 50),
30 	fAutoStart(false)
31 {
32 	SetPulseRate(3000000);
33 }
34 
35 
36 App::~App()
37 {
38 }
39 
40 
41 bool
42 App::QuitRequested()
43 {
44 	_StoreSettingsIfNeeded();
45 	return true;
46 }
47 
48 
49 void
50 App::ReadyToRun()
51 {
52 	bool windowAdded = false;
53 	BRect frame(50.0, 50.0, 65.0, 100.0);
54 
55 	BMessage settings;
56 	status_t status = load_settings(&settings, "main_settings", "LaunchBox");
57 	if (status >= B_OK) {
58 		BMessage windowMessage;
59 		for (int32 i = 0; settings.FindMessage("window", i, &windowMessage)
60 				>= B_OK; i++) {
61 			BString string;
62 			string << i + 1;
63 			BString name(B_TRANSLATE("Pad %1"));
64 			name.ReplaceFirst("%1", string);
65 			BMessage* windowSettings = new BMessage(windowMessage);
66 			MainWindow* window = new MainWindow(name.String(), frame,
67 				windowSettings);
68 			window->Show();
69 			windowAdded = true;
70 			frame.OffsetBy(10.0, 10.0);
71 			windowMessage.MakeEmpty();
72 		}
73 		BSize size;
74 		if (settings.FindSize("name panel size", &size) == B_OK)
75 			fNamePanelSize = size;
76 		bool auto_start;
77 		if (settings.FindBool("autostart", &auto_start) == B_OK)
78 			fAutoStart = auto_start;
79 	}
80 
81 	if (!windowAdded) {
82 		MainWindow* window = new MainWindow(B_TRANSLATE("Pad 1"), frame, true);
83 		window->Show();
84 	}
85 }
86 
87 
88 void
89 App::MessageReceived(BMessage* message)
90 {
91 	switch (message->what) {
92 		case MSG_ADD_WINDOW: {
93 			BMessage* settings = new BMessage('sett');
94 			bool wasCloned = message->FindMessage("window", settings) == B_OK;
95 			BString string;
96 			string << CountWindows() + 1;
97 			BString name(B_TRANSLATE("Pad %1"));
98 			name.ReplaceFirst("%1", string);
99 			MainWindow* window = new MainWindow(name.String(),
100 				BRect(50.0, 50.0, 65.0, 100.0), settings);
101 			if (wasCloned)
102 				window->MoveBy(10, 10);
103 			window->Show();
104 			fSettingsChanged = true;
105 			break;
106 		}
107 		case MSG_TOGGLE_AUTOSTART:
108 			ToggleAutoStart();
109 			break;
110 		case MSG_SETTINGS_CHANGED:
111 			fSettingsChanged = true;
112 			break;
113 		default:
114 			BApplication::MessageReceived(message);
115 			break;
116 	}
117 }
118 
119 
120 void
121 App::Pulse()
122 {
123 	_StoreSettingsIfNeeded();
124 }
125 
126 
127 void
128 App::SetNamePanelSize(const BSize& size)
129 {
130 	if (Lock()) {
131 		fNamePanelSize = size;
132 		Unlock();
133 	}
134 }
135 
136 
137 void
138 App::ToggleAutoStart()
139 {
140 	fSettingsChanged = true;
141 	fAutoStart = !AutoStart();
142 }
143 
144 
145 BSize
146 App::NamePanelSize()
147 {
148 	BSize size;
149 	if (Lock()) {
150 		size = fNamePanelSize;
151 		Unlock();
152 	}
153 	return size;
154 }
155 
156 
157 void
158 App::_StoreSettingsIfNeeded()
159 {
160 	if (!fSettingsChanged)
161 		return;
162 
163 	BMessage settings('sett');
164 	for (int32 i = 0; BWindow* window = WindowAt(i); i++) {
165 		if (MainWindow* padWindow = dynamic_cast<MainWindow*>(window)) {
166 			if (padWindow->Lock()) {
167 				BMessage* windowSettings = padWindow->Settings();
168 				if (windowSettings) {
169 					padWindow->SaveSettings(windowSettings);
170 					settings.AddMessage("window", windowSettings);
171 				}
172 				padWindow->Unlock();
173 			}
174 		}
175 	}
176 	settings.AddSize("name panel size", fNamePanelSize);
177 	settings.AddBool("autostart", AutoStart());
178 
179 	save_settings(&settings, "main_settings", "LaunchBox");
180 
181 	fSettingsChanged = false;
182 }