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 }