root/src/add-ons/translators/psd/ConfigView.cpp
/*
 * Copyright 2013, Gerasim Troeglazov, 3dEyes@gmail.com. All rights reserved.
 * Distributed under the terms of the MIT License.
 */

#include "ConfigView.h"

#include <Catalog.h>
#include <LayoutBuilder.h>
#include <MenuItem.h>
#include <PopUpMenu.h>
#include <StringView.h>

#include <stdio.h>

#include "PSDLoader.h"
#include "PSDTranslator.h"

#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "PSDConfig"


ConfigView::ConfigView(TranslatorSettings *settings)
        : BGroupView(B_TRANSLATE("PSDTranslator Settings"), B_VERTICAL, 0)
{
        fSettings = settings;

        BPopUpMenu* compressionPopupMenu = new BPopUpMenu("popup_compression");

        uint32 currentCompression =
                fSettings->SetGetInt32(PSD_SETTING_COMPRESSION);

        _AddItemToMenu(compressionPopupMenu, B_TRANSLATE("Uncompressed"),
                MSG_COMPRESSION_CHANGED, PSD_COMPRESSED_RAW, currentCompression);
        _AddItemToMenu(compressionPopupMenu, B_TRANSLATE("RLE"),
                MSG_COMPRESSION_CHANGED, PSD_COMPRESSED_RLE, currentCompression);

        fCompressionField = new BMenuField("compression",
                B_TRANSLATE("Compression: "), compressionPopupMenu);
        fCompressionField->SetAlignment(B_ALIGN_RIGHT);

        BPopUpMenu* versionPopupMenu = new BPopUpMenu("popup_version");

        uint32 currentVersion =
                fSettings->SetGetInt32(PSD_SETTING_VERSION);

        _AddItemToMenu(versionPopupMenu,
                B_TRANSLATE("Photoshop Document (PSD file)"), MSG_VERSION_CHANGED,
                PSD_FILE, currentVersion);
        _AddItemToMenu(versionPopupMenu,
                B_TRANSLATE("Photoshop Big Document (PSB file)"), MSG_VERSION_CHANGED,
                PSB_FILE, currentVersion);

        fVersionField = new BMenuField("version",
                B_TRANSLATE("Format: "), versionPopupMenu);
        fVersionField->SetAlignment(B_ALIGN_RIGHT);

        BStringView *titleView = new BStringView("title",
                B_TRANSLATE("Photoshop image translator"));
        titleView->SetFont(be_bold_font);

        char version[256];
        sprintf(version, B_TRANSLATE("Version %d.%d.%d, %s"),
                int(B_TRANSLATION_MAJOR_VERSION(PSD_TRANSLATOR_VERSION)),
                int(B_TRANSLATION_MINOR_VERSION(PSD_TRANSLATOR_VERSION)),
                int(B_TRANSLATION_REVISION_VERSION(PSD_TRANSLATOR_VERSION)),
                __DATE__);

        BStringView *versionView = new BStringView("version", version);
        BStringView *copyrightView = new BStringView("copyright",
                B_UTF8_COPYRIGHT "2005-2013 Haiku Inc.");
        BStringView *copyright2View = new BStringView("my_copyright",
                B_UTF8_COPYRIGHT "2012-2013 Gerasim Troeglazov <3dEyes@gmail.com>");

        BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
                .SetInsets(B_USE_DEFAULT_SPACING)
                .Add(titleView)
                .Add(versionView)
                .Add(copyrightView)
                .AddGlue()
                .AddGrid(10.0f, 5.0f)
                        .Add(fVersionField->CreateLabelLayoutItem(), 0, 0)
                        .AddGroup(B_HORIZONTAL, 0.0f, 1, 0)
                                .Add(fVersionField->CreateMenuBarLayoutItem(), 0.0f)
                                .AddGlue()
                                .End()
                        .Add(fCompressionField->CreateLabelLayoutItem(), 0, 1)
                        .AddGroup(B_HORIZONTAL, 0.0f, 1, 1)
                                .Add(fCompressionField->CreateMenuBarLayoutItem(), 0.0f)
                                .AddGlue()
                                .End()
                .End()
                .AddGlue()
                .Add(copyright2View);
}


ConfigView::~ConfigView()
{
        fSettings->Release();
}


void
ConfigView::AllAttached()
{
        fCompressionField->Menu()->SetTargetForItems(this);
        fVersionField->Menu()->SetTargetForItems(this);
}


void
ConfigView::MessageReceived(BMessage* message)
{
        switch (message->what) {
                case MSG_COMPRESSION_CHANGED: {
                        int32 value;
                        if (message->FindInt32("value", &value) >= B_OK) {
                                fSettings->SetGetInt32(PSD_SETTING_COMPRESSION, &value);
                                fSettings->SaveSettings();
                        }
                        break;
                }
                case MSG_VERSION_CHANGED: {
                        int32 value;
                        if (message->FindInt32("value", &value) >= B_OK) {
                                fSettings->SetGetInt32(PSD_SETTING_VERSION, &value);
                                fSettings->SaveSettings();
                        }
                        break;
                }
                default:
                        BView::MessageReceived(message);
        }
}


void
ConfigView::_AddItemToMenu(BMenu* menu, const char* label,
        uint32 mess, uint32 value, uint32 current_value)
{
        BMessage* message = new BMessage(mess);
        message->AddInt32("value", value);
        BMenuItem* item = new BMenuItem(label, message);
        item->SetMarked(value == current_value);
        menu->AddItem(item);
}