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 15#include "support.h" 16 17#include "MainWindow.h" 18 19#undef B_TRANSLATION_CONTEXT 20#define B_TRANSLATION_CONTEXT "LaunchBox" 21 22App::App() 23 : 24 BApplication("application/x-vnd.Haiku-LaunchBox"), 25 fSettingsChanged(false), 26 fNamePanelSize(200, 50) 27{ 28 SetPulseRate(3000000); 29} 30 31 32App::~App() 33{ 34} 35 36 37bool 38App::QuitRequested() 39{ 40 _StoreSettingsIfNeeded(); 41 return true; 42} 43 44 45void 46App::ReadyToRun() 47{ 48 bool windowAdded = false; 49 BRect frame(50.0, 50.0, 65.0, 100.0); 50 51 BMessage settings; 52 status_t status = load_settings(&settings, "main_settings", "LaunchBox"); 53 if (status >= B_OK) { 54 BMessage windowMessage; 55 for (int32 i = 0; settings.FindMessage("window", i, &windowMessage) 56 >= B_OK; i++) { 57 BString string; 58 string << i + 1; 59 BString name(B_TRANSLATE("Pad %1")); 60 name.ReplaceFirst("%1", string); 61 BMessage* windowSettings = new BMessage(windowMessage); 62 MainWindow* window = new MainWindow(name.String(), frame, 63 windowSettings); 64 window->Show(); 65 windowAdded = true; 66 frame.OffsetBy(10.0, 10.0); 67 windowMessage.MakeEmpty(); 68 } 69 BSize size; 70 if (settings.FindSize("name panel size", &size) == B_OK) 71 fNamePanelSize = size; 72 } 73 74 if (!windowAdded) { 75 MainWindow* window = new MainWindow(B_TRANSLATE("Pad 1"), frame, true); 76 window->Show(); 77 } 78} 79 80 81void 82App::MessageReceived(BMessage* message) 83{ 84 switch (message->what) { 85 case MSG_ADD_WINDOW: { 86 BMessage* settings = new BMessage('sett'); 87 bool wasCloned = message->FindMessage("window", settings) == B_OK; 88 BString string; 89 string << CountWindows() + 1; 90 BString name(B_TRANSLATE("Pad %1")); 91 name.ReplaceFirst("%1", string); 92 MainWindow* window = new MainWindow(name.String(), 93 BRect(50.0, 50.0, 65.0, 100.0), settings); 94 if (wasCloned) 95 window->MoveBy(10, 10); 96 window->Show(); 97 fSettingsChanged = true; 98 break; 99 } 100 case MSG_SETTINGS_CHANGED: 101 fSettingsChanged = true; 102 break; 103 default: 104 BApplication::MessageReceived(message); 105 break; 106 } 107} 108 109 110void 111App::Pulse() 112{ 113 _StoreSettingsIfNeeded(); 114} 115 116 117void 118App::SetNamePanelSize(const BSize& size) 119{ 120 if (Lock()) { 121 fNamePanelSize = size; 122 Unlock(); 123 } 124} 125 126 127BSize 128App::NamePanelSize() 129{ 130 BSize size; 131 if (Lock()) { 132 size = fNamePanelSize; 133 Unlock(); 134 } 135 return size; 136} 137 138 139void 140App::_StoreSettingsIfNeeded() 141{ 142 if (!fSettingsChanged) 143 return; 144 145 BMessage settings('sett'); 146 for (int32 i = 0; BWindow* window = WindowAt(i); i++) { 147 if (MainWindow* padWindow = dynamic_cast<MainWindow*>(window)) { 148 if (padWindow->Lock()) { 149 BMessage* windowSettings = padWindow->Settings(); 150 if (windowSettings) { 151 padWindow->SaveSettings(windowSettings); 152 settings.AddMessage("window", windowSettings); 153 } 154 padWindow->Unlock(); 155 } 156 } 157 } 158 settings.AddSize("name panel size", fNamePanelSize); 159 160 save_settings(&settings, "main_settings", "LaunchBox"); 161 162 fSettingsChanged = false; 163} 164