root/src/apps/screenshot/ScreenshotApp.cpp
/*
 * Copyright 2010 Wim van der Meer <WPJvanderMeer@gmail.com>
 * All rights reserved. Distributed under the terms of the MIT license.
 *
 * Authors:
 *              Wim van der Meer
 */


#include "ScreenshotApp.h"

#include <stdlib.h>

#include <Bitmap.h>
#include <Catalog.h>
#include <Locale.h>
#include <Roster.h>
#include <Screen.h>
#include <WindowPrivate.h>

#include "ScreenshotWindow.h"
#include "SelectAreaView.h"
#include "Utility.h"


ScreenshotApp::ScreenshotApp()
        :
        BApplication("application/x-vnd.haiku-screenshot"),
        fScreenshotWindow(NULL),
        fUtility(new Utility),
        fSilent(false),
        fClipboard(false),
        fLaunchWithAreaSelect(false)
{
}


ScreenshotApp::~ScreenshotApp()
{
        delete fUtility;
}


void
ScreenshotApp::MessageReceived(BMessage* message)
{
        status_t status = B_OK;
        switch (message->what) {
                case SS_UTILITY_DATA:
                {
                        BMessage bitmap;
                        status = message->FindMessage("wholeScreen", &bitmap);
                        if (status != B_OK)
                                break;

                        fUtility->wholeScreen = new BBitmap(&bitmap);

                        status = message->FindMessage("cursorBitmap", &bitmap);
                        if (status != B_OK)
                                break;

                        fUtility->cursorBitmap = new BBitmap(&bitmap);

                        status = message->FindMessage("cursorAreaBitmap", &bitmap);
                        if (status != B_OK)
                                break;

                        fUtility->cursorAreaBitmap = new BBitmap(&bitmap);

                        status = message->FindPoint("cursorPosition",
                                &fUtility->cursorPosition);
                        if (status != B_OK)
                                break;

                        status = message->FindRect("activeWindowFrame",
                                &fUtility->activeWindowFrame);
                        if (status != B_OK)
                                break;

                        status = message->FindRect("tabFrame", &fUtility->tabFrame);
                        if (status != B_OK)
                                break;

                        status = message->FindFloat("borderSize", &fUtility->borderSize);
                        if (status != B_OK)
                                break;

                        status = message->FindBool("selectArea", &fLaunchWithAreaSelect);
                        if (status != B_OK)
                                break;

                        break;
                }

                case SS_SELECT_AREA_FRAME:
                {
                        BRect frame;
                        status_t status = message->FindRect("selectAreaFrame", &frame);
                        if (status != B_OK)
                                break;

                        if (!frame.IsValid() && fLaunchWithAreaSelect)
                                be_app->PostMessage(B_QUIT_REQUESTED);
                        else if (fScreenshotWindow == NULL) {
                                fScreenshotWindow = new ScreenshotWindow(*fUtility, fSilent, fClipboard);
                                fLaunchWithAreaSelect = false;
                        }

                        fScreenshotWindow->SetSelectedArea(frame);
                        break;
                }

                case SS_LAUNCH_AREA_SELECTOR:
                {
                        BWindow* selectAreaWindow = new BWindow(BScreen().Frame(),
                                "Area Window", kWindowScreenWindow,
                                B_ASYNCHRONOUS_CONTROLS|B_NOT_RESIZABLE|B_NOT_CLOSABLE|B_NOT_ZOOMABLE);

                        selectAreaWindow->AddChild(new SelectAreaView(fUtility->wholeScreen));
                        selectAreaWindow->Show();
                        break;
                }

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

        if (status != B_OK)
                be_app->PostMessage(B_QUIT_REQUESTED);
}


void
ScreenshotApp::ArgvReceived(int32 argc, char** argv)
{
        for (int32 i = 0; i < argc; i++) {
                if (strcmp(argv[i], "-s") == 0
                        || strcmp(argv[i], "--silent") == 0)
                        fSilent = true;
                else if (strcmp(argv[i], "-c") == 0
                        || strcmp(argv[i], "--clipboard") == 0)
                        fClipboard = true;
        }
}


void
ScreenshotApp::ReadyToRun()
{
        if (fLaunchWithAreaSelect)
                be_app->PostMessage(new BMessage(SS_LAUNCH_AREA_SELECTOR));
        else
                fScreenshotWindow = new ScreenshotWindow(*fUtility, fSilent, fClipboard);
}


int
main()
{
        ScreenshotApp app;
        return app.Run();
}