
// INCLUDE FILES
#include "elog.h"
#include <eikappui.h>
#include <e32frodo.rsg>
#include "e32frodo.hrh"
#include "SettingDialogs.h"

#ifdef __SERIES60__


// ================= MEMBER FUNCTIONS =========================================


CFrodoSettingListView::CFrodoSettingListView(C64* aC64)
	:iC64(aC64)
    {
	}


void CFrodoSettingListView::CreateL()
    {

	// Update state from prefs
	Prefs* prefs = &iC64->ThePrefs;
	iAudioVolume = (prefs->iVolume-3)/9; // 12--93 ==> 1--10
	if (iAudioVolume > 10)
		iAudioVolume = 10;
	if (iAudioVolume < 1)
		iAudioVolume = 1;
	iJoy1State = prefs->Joystick1On;
	iJoy2State = prefs->Joystick2On;
	if (prefs->SIDType == SIDTYPE_DIGITAL)
		iAudioState = ETrue;
	else
		iAudioState = EFalse;

    CEikonEnv* env = CEikonEnv::Static();
	//SetMopParent(env->EikAppUi());
	ConstructFromResourceL(R_SETTINGS_LISTBOX);
	env->EikAppUi()->AddToStackL( this );
	MakeVisible(ETrue);
	SetRect(env->EikAppUi()->ClientRect());
	ActivateL();
	DrawNow();
	//IndicateTitlePaneTextL(iCurrentOutlineId);
	}


CFrodoSettingListView::~CFrodoSettingListView()
    {
    CEikonEnv* env = CEikonEnv::Static();
	env->EikAppUi()->RemoveFromStack( this ); // Not called if leave occurs before!
	}


CAknSettingItem* CFrodoSettingListView::CreateSettingItemL( TInt aIdentifier )
    {
    CAknSettingItem* settingItem = NULL;

    switch (aIdentifier)
    {
    case ESettingsListVolumeOnOffId:
        settingItem = new (ELeave) 
            CAknBinaryPopupSettingItem(aIdentifier, iAudioState );
        break;

    case ESettingsListVolumeSliderId:
        settingItem = new (ELeave) 
            CAknVolumeSettingItem(aIdentifier, iAudioVolume );
        break;

    case ESettingsListJoy1OnOff:
        settingItem = new (ELeave) 
            CAknBinaryPopupSettingItem(aIdentifier, iJoy1State );
        break;

    case ESettingsListJoy2OnOff:
        settingItem = new (ELeave) 
            CAknBinaryPopupSettingItem(aIdentifier, iJoy2State );
        break;

    default:
        break;
        }
    return settingItem;
    }


// ----------------------------------------------------------------------------
// TKeyResponse CFrodoSettingListView::OfferKeyEventL( const TKeyEvent&,
//  TEventCode )
// Handles the key events.
// ----------------------------------------------------------------------------
//
TKeyResponse CFrodoSettingListView::OfferKeyEventL(
    const TKeyEvent& aKeyEvent,
    TEventCode aType )
    {
    //if ( aType != EEventKey ) // Is not key event?
    //    {
    //    return EKeyWasNotConsumed;
    //    }

	TInt index = ListBox()->CurrentItemIndex();
	index = SettingItemArray()->ItemIndexFromVisibleIndex(index);
	CAknSettingItem* item = (*SettingItemArray())[index];

	if (item->Identifier()==ESettingsListVolumeSliderId)
		{
		switch ( aKeyEvent.iCode ) // The code of key event is...
			{
			case EKeyDevice3: // fire button
			case EKeyEnter:
			case EKeySpace: // Space key.
			case EKeyRightArrow:
				if(++iAudioVolume > 10)
					{
					iAudioVolume = 10;
					if (aKeyEvent.iCode == EKeyEnter)
						iAudioVolume = 1;
					}
				//item->Load();
				LoadSettingsL();
				DrawNow();
				break;
			case EKeyLeftArrow:
				if(--iAudioVolume < 1)
					iAudioVolume = 1;
				LoadSettingsL();
				DrawNow();
				break;
			default:
				CAknSettingItemList::OfferKeyEventL(aKeyEvent, aType);
				break;
			}
		}

	else if (item->Identifier()==ESettingsListVolumeOnOffId
		     || item->Identifier()==ESettingsListJoy1OnOff
		     || item->Identifier()==ESettingsListJoy2OnOff)
		{
		CAknBinaryPopupSettingItem* binaryItem = STATIC_CAST(CAknBinaryPopupSettingItem*, item);
		switch ( aKeyEvent.iCode ) // The code of key event is...
			{
			case EKeyDevice3: // fire button
			case EKeyEnter:
			case EKeySpace: // Space key.
				binaryItem->EditItemL(EFalse);			
				item->StoreL();
				//StoreSettingsL();
				DrawNow();
				break;
			default:
				CAknSettingItemList::OfferKeyEventL(aKeyEvent, aType);
				break;
			}
		}


    return EKeyWasConsumed;
    }

// ----------------------------------------------------------------------------
// CFrodoSettingListView::SizeChanged
// Size changed handler
// ----------------------------------------------------------------------------
//
void CFrodoSettingListView::SizeChanged()
    {
    if (ListBox()) 
        {
        ListBox()->SetRect(Rect());
        }
    }


void CFrodoSettingListView::UpdatePrefs()
	{
	Prefs* newPrefs = new (ELeave) Prefs();
	*newPrefs = iC64->ThePrefs;

	newPrefs->iVolume = (iAudioVolume) * 9 + 3; // // 1--10 ==> 12--93
	newPrefs->Joystick1On = iJoy1State;
	newPrefs->Joystick2On = iJoy2State;
	if (iAudioState)
		newPrefs->SIDType = SIDTYPE_DIGITAL;
	else
		newPrefs->SIDType = SIDTYPE_NONE;

	// Update preferences
	iC64->NewPrefs(newPrefs);
	iC64->ThePrefs = *newPrefs;
	delete(newPrefs);

	ELOG3(_L8("CFrodoSettingListView::UpdatePrefs: vol=%d, audio=%d\n"), iAudioVolume, iAudioState);
	ELOG3(_L8("CFrodoSettingListView::UpdatePrefs: joy1=%d, joy2=%d\n"), iJoy1State, iJoy2State);
	ELOG3(_L8("CFrodoSettingListView::UpdatePrefs: vol=%d, audio=%d\n"), iC64->ThePrefs.iVolume, iC64->ThePrefs.SIDType);
	ELOG3(_L8("CFrodoSettingListView::UpdatePrefs: joy1=%d, joy2=%d\n"), iC64->ThePrefs.Joystick1On, iC64->ThePrefs.Joystick2On);
	}

#endif // __SERIES60_


// End of File

