/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/

#include <hbdataform.h>
#include <hbdataformmodelitem.h>
#include <hbdataformmodel.h>
#include <hbdataformviewitem.h>
#include <hbaction.h>
#include <hbmenu.h>
#include <hbtoolbar.h>
#include <hbabstractviewitem.h>
#include <hbaction.h>


#include "settingsview.h"
#include "enginewrapper.h"
#include "sgengine.h"
#include "hbslider.h"
#include "notifications.h"



// ---------------------------------------------------------------------------

SettingsView::SettingsView(HbView &mainView, HbMainWindow &mainWindow, EngineWrapper &engineWrapper): 
    mEngineWrapper(engineWrapper), 
    mMainWindow(mainWindow), 
    mMainView(mainView)
{
    // Set title and add this view to main window
    setTitle("Settings");
    
    HbAction *actionSaveSettings = menu()->addAction(QString("Save & close"));
    HbAction *actionCancel = menu()->addAction("Cancel & close");
    
    toolBar()->addAction(actionSaveSettings);
    toolBar()->addAction(actionCancel);
  
    
    //create setting form
    mSettingForm = new HbDataForm();
    
    //create a model class
    mModel = new HbDataFormModel(this);
    
    // DataFormItem for mode selection
    mModeItem = mModel->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Capture mode"), 0);
    mModeItem->setContentWidgetData(QString("items"), CAPTUREMODES);
    
    // Create setting model
     createSingleCaptureComponents(mModel, 0);
     createSequentialCaptureComponents(mModel, 0);
     createVideoCaptureComponents(mModel, 0);
 
    // Set created model model to form
    mSettingForm->setModel(mModel);
    setWidget(mSettingForm);//takes ownership
    
    loadSettings();
    
    // Connect signals from item modifications and close with this form's slots
    connect(actionSaveSettings, SIGNAL(triggered()), this, SLOT(saveAndClose()));
    connect(actionCancel, SIGNAL(triggered()), this, SLOT(close()));
	
	HbAction *mDefaultNavigationAction = new HbAction(Hb::QuitNaviAction, this);
	connect(mDefaultNavigationAction,SIGNAL(triggered()), this, SLOT(saveAndClose()));
	setNavigationAction(mDefaultNavigationAction);
	


}


// ---------------------------------------------------------------------------

SettingsView::~SettingsView()
{

}

// ---------------------------------------------------------------------------

void SettingsView::loadSettings()
{

    // get settings from engine;
    mSettings = mEngineWrapper.getGrabSettings();
    
    //Capture mode
    mModeItem->setContentWidgetData("selected", mSettings.mCaptureMode);
    
    // Still image 
    mImageHotKeyItem->setContentWidgetData("selected", mSettings.mSingleCaptureHotkey);
    mImageFormatItem->setContentWidgetData("selected", mSettings.mSingleCaptureImageFormat);
    mImageMemoryInUseItem->setContentWidgetData("selected", mSettings.mSingleCaptureMemoryInUseMultiDrive);
    mImageFileNameItem->setContentWidgetData("text", mSettings.mSingleCaptureFileName);
       
    // Seguantial image components
    mSequantialHotKeyItem->setContentWidgetData("selected", mSettings.mSequantialCaptureHotkey);
    mSequantialFormatItem->setContentWidgetData("selected", mSettings.mSequantialCaptureImageFormat);
    mSequantialDelayItem->setContentWidgetData("text", mSettings.mSequantialCaptureDelay);
    mSequantialMemoryInUseItem->setContentWidgetData("selected", mSettings.mSequantialCaptureMemoryInUseMultiDrive);
    mSequantialFileNameItem->setContentWidgetData("text", mSettings.mSequantialCaptureFileName);
    
    // Video capture components
    mVideoHotKeyItem->setContentWidgetData("selected", mSettings.mVideoCaptureHotkey);
    mVideoFormatItem->setContentWidgetData("selected", mSettings.mVideoCaptureVideoFormat);
    mVideoMemoryInUseItem->setContentWidgetData("selected", mSettings.mVideoCaptureMemoryInUseMultiDrive);
    mVideoFileNameItem->setContentWidgetData("text", mSettings.mVideoCaptureFileName);
    
	
}

// ---------------------------------------------------------------------------

void SettingsView::createSingleCaptureComponents(HbDataFormModel *model, HbDataFormModelItem *parent)
{
    
    // Create Group for single image components
    mGroupImageCapture = model->appendDataFormGroup(QString("Single image settings"), parent);

    // DataFormItem for hotkey selection
    mImageHotKeyItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Capture hotkey"), mGroupImageCapture);
    mImageHotKeyItem->setContentWidgetData(QString("items"), KEYS);

    // DataFormItem for image format selection
    mImageFormatItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Image format"), mGroupImageCapture);
    mImageFormatItem->setContentWidgetData(QString("items"), IMAGEFORMATS);
    
    // DataFormItem for memory in use selection
    mImageMemoryInUseItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Memory in use"), mGroupImageCapture);
    mImageMemoryInUseItem->setContentWidgetData(QString("items"), MEMORYMODES);
    
    // DataFormItem for file name
    mImageFileNameItem = model->appendDataFormItem(
            HbDataFormModelItem::TextItem, QString("File name"), mGroupImageCapture);
    mImageFileNameItem->setContentWidgetData(QString("text"), QString("Shot"));
    
}

// ---------------------------------------------------------------------------

void SettingsView::createSequentialCaptureComponents(HbDataFormModel *model, HbDataFormModelItem *parent)
{
    
    
    // Create Group for sequential image components
    mGroupSeguantialCapture = model->appendDataFormGroup(QString("Sequential image settings"), parent);
    
    // DataFormItem for hotkey selection
    mSequantialHotKeyItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Capture hotkey"), mGroupSeguantialCapture);
    mSequantialHotKeyItem->setContentWidgetData(QString("items"), KEYS);
    
    // DataFormItem for image format selection
    mSequantialFormatItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Image format"), mGroupSeguantialCapture);
    mSequantialFormatItem->setContentWidgetData(QString("items"), IMAGEFORMATS);
    
    // DataFormItem for delay between images selection
    mSequantialDelayItem = model->appendDataFormItem(
            HbDataFormModelItem::TextItem, QString("Delay between two images(ms)"), mGroupSeguantialCapture);
    mSequantialDelayItem->setContentWidgetData(QString("text"), QString("Shot"));
    
    // DataFormItem for memory selection
    mSequantialMemoryInUseItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Memory in use"), mGroupSeguantialCapture);
    mSequantialMemoryInUseItem->setContentWidgetData(QString("items"), MEMORYMODES);
    
    // DataFormItem for file name
    mSequantialFileNameItem = model->appendDataFormItem(
            HbDataFormModelItem::TextItem, QString("File name"), mGroupSeguantialCapture);
    mSequantialFileNameItem->setContentWidgetData(QString("text"), QString("Shot"));
    
}

// ---------------------------------------------------------------------------

void SettingsView::createVideoCaptureComponents(HbDataFormModel *model, HbDataFormModelItem *parent)
{

    // Create Group for video capturing components
    mGroupVideoCapture = model->appendDataFormGroup(QString("Video settings"), parent);
    
    // DataFormItem for hotkey selection
    mVideoHotKeyItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Start/Stop hotkey"), mGroupVideoCapture);
    mVideoHotKeyItem->setContentWidgetData(QString("items"), KEYS);
    
    // DataFormItem for video format selection
    mVideoFormatItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Video format"), mGroupVideoCapture);
    mVideoFormatItem->setContentWidgetData(QString("items"), VIDEOFORMATS);
    
    // DataFormItem for memory selection
    mVideoMemoryInUseItem = model->appendDataFormItem(
            HbDataFormModelItem::RadioButtonListItem, QString("Memory in use"), mGroupVideoCapture);
    mVideoMemoryInUseItem->setContentWidgetData(QString("items"), MEMORYMODES);
    
    // DataFormItem for file name
    mVideoFileNameItem = model->appendDataFormItem(
            HbDataFormModelItem::TextItem, QString("File name"), mGroupVideoCapture);
    mVideoFileNameItem->setContentWidgetData(QString("text"), QString("Video"));
    
}

// ---------------------------------------------------------------------------

void SettingsView::saveAndClose()
{

    readFormItems();
    if (!mEngineWrapper.saveSettings(mSettings)) {
        Notifications::error("Unable to save settings");
    }    
    
    mEngineWrapper.EnableRcpOfFoc(EFalse);
    mMainWindow.setCurrentView(&mMainView);
	
}

// ---------------------------------------------------------------------------

void SettingsView::readFormItems()
{
    
    //TODO this does not work correctly with WK38 ( Text box items )

    mSettings.mCaptureMode = mModeItem->contentWidgetData("selected").toInt();

    mSettings.mSingleCaptureImageFormat = mImageFormatItem->contentWidgetData("selected").toInt();
    mSettings.mSingleCaptureHotkey = mImageHotKeyItem->contentWidgetData("selected").toInt();
    mSettings.mSingleCaptureMemoryInUseMultiDrive = mImageMemoryInUseItem->contentWidgetData("selected").toInt(); 
    mSettings.mSingleCaptureFileName = mImageFileNameItem->contentWidgetData("text").toString();
    
    mSettings.mSequantialCaptureImageFormat = mSequantialFormatItem->contentWidgetData("selected").toInt();
    mSettings.mSequantialCaptureHotkey = mSequantialHotKeyItem ->contentWidgetData("selected").toInt();
    mSettings.mSequantialCaptureMemoryInUseMultiDrive = mSequantialMemoryInUseItem ->contentWidgetData("selected").toInt();
    mSettings.mSequantialCaptureFileName = mSequantialFileNameItem->contentWidgetData("text").toString();
    mSettings.mSequantialCaptureDelay = mSequantialDelayItem->contentWidgetData("text").toInt();
    

    mSettings.mVideoCaptureVideoFormat = mVideoFormatItem->contentWidgetData("selected").toInt();
    mSettings.mVideoCaptureHotkey = mVideoHotKeyItem ->contentWidgetData("selected").toInt();
    mSettings.mVideoCaptureMemoryInUseMultiDrive = mVideoMemoryInUseItem ->contentWidgetData("selected").toInt();
    mSettings.mVideoCaptureFileName = mVideoFileNameItem ->contentWidgetData("text").toString();
	
   
}

// ---------------------------------------------------------------------------

void SettingsView::close()
{
    mEngineWrapper.EnableRcpOfFoc(EFalse);
    mMainWindow.setCurrentView(&mMainView);
}
