root/src/apps/text_search/GrepApp.cpp
/*
 * Copyright (c) 1998-2007 Matthijs Hollemans
 * All rights reserved. Distributed under the terms of the MIT License.
 */

#include "GrepApp.h"

#include <stdio.h>

#include <Entry.h>

#include "GlobalDefs.h"
#include "GrepWindow.h"
#include "Model.h"


GrepApp::GrepApp()
        : BApplication(APP_SIGNATURE),
          fGotArgvOnStartup(false),
          fGotRefsOnStartup(false),
          fQuitter(NULL)
{
}


GrepApp::~GrepApp()
{
        delete fQuitter;
}


void
GrepApp::ArgvReceived(int32 argc, char** argv)
{
        fGotArgvOnStartup = true;

        BMessage message(B_REFS_RECEIVED);
        int32 refCount = 0;

        for (int32 i = 1; i < argc; i++) {
                BEntry entry(argv[i]);
                entry_ref ref;
                entry.GetRef(&ref);

                if (entry.Exists()) {
                        message.AddRef("refs", &ref);
                        refCount += 1;
                } else
                        printf("%s: File not found: %s\n", argv[0], argv[i]);
        }

        if (refCount > 0)
                RefsReceived(&message);
}


void
GrepApp::RefsReceived(BMessage* message)
{
        if (IsLaunching())
                fGotRefsOnStartup = true;

        new GrepWindow(message);
}


void
GrepApp::ReadyToRun()
{
        if (!fGotArgvOnStartup && !fGotRefsOnStartup)
                _NewUnfocusedGrepWindow();

        // TODO: stippi: I don't understand what this is supposed to do:
        if (fGotArgvOnStartup && !fGotRefsOnStartup)
                PostMessage(B_QUIT_REQUESTED);
}


void
GrepApp::MessageReceived(BMessage* message)
{
        switch (message->what) {
                case B_SILENT_RELAUNCH:
                        _NewUnfocusedGrepWindow();
                        break;

                case MSG_TRY_QUIT:
                        _TryQuit();
                        break;

                default:
                        BApplication::MessageReceived(message);
                        break;
        }
}


void
GrepApp::_TryQuit()
{
        if (CountWindows() == 0)
                PostMessage(B_QUIT_REQUESTED);

        if (CountWindows() == 1 && fQuitter == NULL) {
                fQuitter = new BMessageRunner(be_app_messenger,
                        new BMessage(MSG_TRY_QUIT), 200000, -1);
        }
}


void
GrepApp::_NewUnfocusedGrepWindow()
{
        BMessage emptyMessage;
        new GrepWindow(&emptyMessage);
}