root/src/apps/diskusage/App.cpp
/*
 * Copyright (c) 2008 Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
 * Distributed under the terms of the MIT/X11 license.
 *
 * Copyright (c) 1999 Mike Steed. You are free to use and distribute this
 * software as long as it is accompanied by it's documentation and this
 * copyright notice. The software comes with no warranty, etc.
 */


#include "App.h"

#include <stdio.h>

#include <Entry.h>
#include <File.h>
#include <FindDirectory.h>
#include <Node.h>
#include <Path.h>

#include "DiskUsage.h"
#include "MainWindow.h"


App::App()
        :
        BApplication(kAppSignature),
        fMainWindow(NULL),
        fSavedRefsReceived(NULL)
{
}


App::~App()
{
        delete fSavedRefsReceived;
}


void
App::ArgvReceived(int32 argc, char** argv)
{
        BMessage refsReceived(B_REFS_RECEIVED);
        for (int32 i = 1; i < argc; i++) {
                BEntry entry(argv[i], true);
                entry_ref ref;
                if (entry.GetRef(&ref) == B_OK)
                        refsReceived.AddRef("refs", &ref);
        }
        if (refsReceived.HasRef("refs"))
                PostMessage(&refsReceived);
}


void
App::RefsReceived(BMessage* message)
{
        if (!message->HasRef("refs") && message->HasRef("dir_ref")) {
                entry_ref dirRef;
                if (message->FindRef("dir_ref", &dirRef) == B_OK)
                        message->AddRef("refs", &dirRef);
        }

        if (fMainWindow == NULL) {
                // ReadyToRun() has not been called yet, this happens when someone
                // launches us with a B_REFS_RECEIVED message.
                delete fSavedRefsReceived;
                fSavedRefsReceived = new BMessage(*message);
        } else
                fMainWindow->PostMessage(message);
}


void
App::ReadyToRun()
{
        BRect frame;

        BPath path;
        BFile settingsFile;
        BMessage settings;
        if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK
                || path.Append("DiskUsage") != B_OK
                || settingsFile.SetTo(path.Path(), B_READ_ONLY) != B_OK
                || settings.Unflatten(&settingsFile) != B_OK
                || settings.FindRect("window frame", &frame) != B_OK) {
                // use default window frame
                frame.Set(0, 0, kDefaultPieSize, kDefaultPieSize);
                frame.OffsetTo(50, 50);
        }

        fMainWindow = new MainWindow(frame);
        fMainWindow->MoveOnScreen();
        fMainWindow->Show();

        if (fSavedRefsReceived) {
                // RefsReceived() was called earlier than ReadyToRun()
                fMainWindow->PostMessage(fSavedRefsReceived);
                delete fSavedRefsReceived;
                fSavedRefsReceived = NULL;
        }
}


bool
App::QuitRequested()
{
        // Save the settings.
        BPath path;
        BFile settingsFile;
        BMessage settings;
        if (settings.AddRect("window frame", fMainWindow->Frame()) != B_OK
                || find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK
                || path.Append("DiskUsage") != B_OK
                || settingsFile.SetTo(path.Path(),
                        B_CREATE_FILE | B_WRITE_ONLY | B_ERASE_FILE) != B_OK
                || settings.Flatten(&settingsFile) != B_OK) {
                fprintf(stderr, "Failed to write application settings.\n");
        }

        return BApplication::QuitRequested();
}