xref: /haiku/src/apps/deskcalc/CalcApplication.cpp (revision 7b3e89c0944ae1efa9a8fc66c7303874b7a344b2)
1 /*
2  * Copyright 2006-2015 Haiku, Inc. All Rights Reserved.
3  * Copyright 1997, 1998 R3 Software Ltd. All Rights Reserved.
4  * Distributed under the terms of the MIT License.
5  *
6  * Authors:
7  *		Stephan Aßmus, superstippi@gmx.de
8  *		John Scipione, jscipione@gmail.com
9  *		Timothy Wayper, timmy@wunderbear.com
10  */
11 
12 
13 #include "CalcApplication.h"
14 
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <string.h>
18 
19 #include <Catalog.h>
20 #include <ControlLook.h>
21 #include <Directory.h>
22 #include <File.h>
23 #include <FindDirectory.h>
24 #include <Path.h>
25 
26 #include "CalcView.h"
27 #include "CalcWindow.h"
28 
29 
30 #undef B_TRANSLATION_CONTEXT
31 #define B_TRANSLATION_CONTEXT "CalcApplication"
32 
33 
34 static const char* kSettingsFileName = "DeskCalc_settings";
35 const char* kAppName = B_TRANSLATE_SYSTEM_NAME("DeskCalc");
36 const char* kSignature = "application/x-vnd.Haiku-DeskCalc";
37 
38 
39 CalcApplication::CalcApplication()
40 	:
41 	BApplication(kSignature),
42 	fCalcWindow(NULL)
43 {
44 }
45 
46 
47 CalcApplication::~CalcApplication()
48 {
49 }
50 
51 
52 void
53 CalcApplication::ReadyToRun()
54 {
55 	BMessage settings;
56 	_LoadSettings(settings);
57 
58 	BRect frame(0, 0, be_control_look->DefaultLabelSpacing() * 37.0f,
59 		be_control_look->DefaultLabelSpacing() * 23.0f);
60 	fCalcWindow = new CalcWindow(frame, &settings);
61 
62 	// reveal window
63 	fCalcWindow->Show();
64 }
65 
66 
67 void
68 CalcApplication::AboutRequested()
69 {
70 	fCalcWindow->View()->MessageReceived(new BMessage(B_ABOUT_REQUESTED));
71 }
72 
73 
74 bool
75 CalcApplication::QuitRequested()
76 {
77 	// save current user preferences
78 	_SaveSettings();
79 
80 	return true;
81 }
82 
83 
84 // #pragma mark -
85 
86 
87 void
88 CalcApplication::_LoadSettings(BMessage& archive)
89 {
90 	// locate preferences file
91 	BFile prefsFile;
92 	if (_InitSettingsFile(&prefsFile, false) < B_OK) {
93 		printf("no preference file found.\n");
94 		return;
95 	}
96 
97 	// unflatten settings data
98 	if (archive.Unflatten(&prefsFile) < B_OK) {
99 		printf("error unflattening settings.\n");
100 	}
101 }
102 
103 
104 void
105 CalcApplication::_SaveSettings()
106 {
107 	if (!fCalcWindow->Lock())
108 		return;
109 
110 	// archive the current state of the calculator
111 	BMessage archive;
112 	status_t ret = fCalcWindow->SaveSettings(&archive);
113 
114 	fCalcWindow->Unlock();
115 
116 	if (ret < B_OK) {
117 		fprintf(stderr, "CalcApplication::_SaveSettings() - error from window: "
118 			"%s\n", strerror(ret));
119 		return;
120 	}
121 
122 	// flatten entire acrhive and write to settings file
123 	BFile prefsFile;
124 	ret = _InitSettingsFile(&prefsFile, true);
125 	if (ret < B_OK) {
126 		fprintf(stderr, "CalcApplication::_SaveSettings() - "
127 			"error creating file: %s\n", strerror(ret));
128 		return;
129 	}
130 
131 	ret = archive.Flatten(&prefsFile);
132 	if (ret < B_OK) {
133 		fprintf(stderr, "CalcApplication::_SaveSettings() - error flattening "
134 			"to file: %s\n", strerror(ret));
135 		return;
136 	}
137 }
138 
139 
140 status_t
141 CalcApplication::_InitSettingsFile(BFile* file, bool write)
142 {
143 	// find user settings directory
144 	BPath prefsPath;
145 	status_t ret = find_directory(B_USER_SETTINGS_DIRECTORY, &prefsPath);
146 	if (ret < B_OK)
147 		return ret;
148 
149 	ret = prefsPath.Append(kSettingsFileName);
150 	if (ret < B_OK)
151 		return ret;
152 
153 	if (write) {
154 		ret = file->SetTo(prefsPath.Path(),
155 			B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY);
156 	} else
157 		ret = file->SetTo(prefsPath.Path(), B_READ_ONLY);
158 
159 	return ret;
160 }
161