1/*
2 * Copyright (c) 2008 Stephan A��mus <superstippi@gmx.de>. All rights reserved.
3 * Distributed under the terms of the MIT/X11 license.
4 *
5 * Copyright (c) 1999 Mike Steed. You are free to use and distribute this
6 * software as long as it is accompanied by it's documentation and this
7 * copyright notice. The software comes with no warranty, etc.
8 */
9
10
11#include "App.h"
12
13#include <stdio.h>
14
15#include <Entry.h>
16#include <File.h>
17#include <FindDirectory.h>
18#include <Node.h>
19#include <Path.h>
20
21#include "DiskUsage.h"
22#include "MainWindow.h"
23
24
25App::App()
26	:
27	BApplication(kAppSignature),
28	fMainWindow(NULL), fSavedRefsReceived(NULL)
29{
30	// Get a reference to the help file.
31	BPath path;
32	if (find_directory(B_BEOS_DOCUMENTATION_DIRECTORY, &path) == B_OK
33		&& path.Append(kHelpFileName) == B_OK) {
34		printf("help file =? %s\n", path.Path());
35		BEntry entry(path.Path());
36		helpFileWasFound = entry.Exists();
37		entry.GetRef(&helpFileRef);
38	} else
39		helpFileWasFound = false;
40}
41
42
43App::~App()
44{
45	delete fSavedRefsReceived;
46}
47
48
49void
50App::ArgvReceived(int32 argc, char** argv)
51{
52	BMessage refsReceived(B_REFS_RECEIVED);
53	for (int32 i = 1; i < argc; i++) {
54		BEntry entry(argv[i], true);
55		entry_ref ref;
56		if (entry.GetRef(&ref) == B_OK)
57			refsReceived.AddRef("refs", &ref);
58	}
59	if (refsReceived.HasRef("refs"))
60		PostMessage(&refsReceived);
61}
62
63
64void
65App::RefsReceived(BMessage* message)
66{
67	if (!message->HasRef("refs") && message->HasRef("dir_ref")) {
68		entry_ref dirRef;
69		if (message->FindRef("dir_ref", &dirRef) == B_OK)
70			message->AddRef("refs", &dirRef);
71	}
72
73	if (fMainWindow == NULL) {
74		// ReadyToRun() has not been called yet, this happens when someone
75		// launches us with a B_REFS_RECEIVED message.
76		delete fSavedRefsReceived;
77		fSavedRefsReceived = new BMessage(*message);
78	} else
79		fMainWindow->PostMessage(message);
80}
81
82
83void
84App::ReadyToRun()
85{
86	BRect frame;
87
88	BPath path;
89	BFile settingsFile;
90	BMessage settings;
91	if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK
92		|| path.Append("DiskUsage") != B_OK
93		|| settingsFile.SetTo(path.Path(), B_READ_ONLY) != B_OK
94		|| settings.Unflatten(&settingsFile) != B_OK
95		|| settings.FindRect("window frame", &frame) != B_OK) {
96		// use default window frame
97		frame.Set(0, 0, kDefaultPieSize, kDefaultPieSize);
98		frame.OffsetTo(50, 50);
99	}
100
101	fMainWindow = new MainWindow(frame);
102	fMainWindow->Show();
103
104	if (fSavedRefsReceived) {
105		// RefsReceived() was called earlier than ReadyToRun()
106		fMainWindow->PostMessage(fSavedRefsReceived);
107		delete fSavedRefsReceived;
108		fSavedRefsReceived = NULL;
109	}
110}
111
112
113bool
114App::QuitRequested()
115{
116	// Save the settings.
117	BPath path;
118	BFile settingsFile;
119	BMessage settings;
120	if (settings.AddRect("window frame", fMainWindow->Frame()) != B_OK
121		|| find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK
122		|| path.Append("DiskUsage") != B_OK
123		|| settingsFile.SetTo(path.Path(),
124			B_CREATE_FILE | B_WRITE_ONLY | B_ERASE_FILE) != B_OK
125		|| settings.Flatten(&settingsFile) != B_OK) {
126		fprintf(stderr, "Failed to write application settings.\n");
127	}
128
129	return BApplication::QuitRequested();
130}
131