testexecfw/useremul/src/SettingsDialog.cpp
author Johnson Ma <johnson.ma@nokia.com>
Thu, 13 May 2010 17:42:48 +0800
changeset 3 a5f55a5789f3
parent 0 3e07fef1e154
permissions -rw-r--r--
Defect Fix: TeamTrack DEF145107

/*------------------------------------------------------------------
 -
 * Software Name : UserEmulator
 * Version       : v4.2.1309
 * 
 * Copyright (c) 2009 France Telecom. All rights reserved.
 * This software is distributed under the License 
 * "Eclipse Public License - v 1.0" the text of which is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * France Telecom 
 *
 * Contributors:
 *------------------------------------------------------------------
 -
 * File Name: SettingsDialog.cpp
 * 
 * Created: 13/08/2009
 * Author(s): Marcell Kiss, Reshma Sandeep Das
 *   
 * Description:
 * This class is used for handling settings dialog
 *------------------------------------------------------------------
 -
 *
 */

//System Includes
#include <stringloader.h> 
#include <eikfrlbd.h>
#include <aknquerydialog.h>
#include <bautils.h>    // BaflUtils
#include <aknnotewrappers.h>

//User Includes
#include <UserEmulator_0x2001C3AF.rsg>
#include "SettingsDialog.h"
#include "Settings.h"
#include "UserEmulator.hrh"
#include "UserEmulatorAppUi.h"

//Constants
_LIT(KAPPIDSTATUS,"App ID is empty");
_LIT(KINVALIDDRIVEEXT,"Invalid Drive/Path/Extension..Changing to default path");

// -----------------------------------------------------------------------------
// CSettingsDialog::CSettingsDialog
// Constructor 
// -----------------------------------------------------------------------------
//
CSettingsDialog::CSettingsDialog(CSettings& aSettings) : iSettings(aSettings)
{
	iPrevLogPath.Copy(iSettings.iLogPath);
}

// -----------------------------------------------------------------------------
// CSettingsDialog::PostLayoutDynInitL
// Initializes the dialog's controls after the dialog has been sized but before 
// it has been activated 
// -----------------------------------------------------------------------------
//
void CSettingsDialog::PostLayoutDynInitL()
{
    TRect mainPaneRect;
	AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect);
	iSettingsList->SetRect(mainPaneRect);
}
// -----------------------------------------------------------------------------
// CSettingsDialog::~CSettingsDialog
// Destructor 
// -----------------------------------------------------------------------------
//
CSettingsDialog::~CSettingsDialog()
{
	delete iSettingsList; 
	iSettingsList=NULL;
}
// -----------------------------------------------------------------------------
// CSettingsDialog::PreLayoutDynInitL
// Initializes the dialog's controls before the dialog is sized and layed out.
// -----------------------------------------------------------------------------
//
void CSettingsDialog::PreLayoutDynInitL()
{
	iSettingsList = new (ELeave) CAknSettingItemList;
	iSettingsList->SetMopParent(this);
	iSettingsList->ConstructFromResourceL(R_SETTING_ITEM_LIST);
	
	TBool isNumberedStyle = iSettingsList->IsNumberedStyle();
	CArrayPtr<CGulIcon>* icons = iSettingsList->ListBox()->ItemDrawer()->FormattedCellData()->IconArray();
				
	TInt id = 0;
	HBufC* label;
	
	//Scripts Settings Path 
	CAknSettingItem* settingItem = new (ELeave) CAknTextSettingItem(id++, iSettings.iScriptsPath);
	CleanupStack::PushL(settingItem);
	label = StringLoader::LoadLC(R_SETTING_PATH_SELECTOR);
	settingItem->SetEmptyItemTextL(KEmptyItemText);
	settingItem->ConstructL(isNumberedStyle, 0, *label, icons, R_TEXT_SETTING_PAGE, -1, 0, R_NAME_EDWIN);
	iSettingsList->SettingItemArray()->AppendL(settingItem);
	CleanupStack::PopAndDestroy(label);
	CleanupStack::Pop(settingItem);
	
	//Log Status (ON/OFF)
	CAknSettingItem* logStatusItem = new(ELeave) CAknBinaryPopupSettingItem(id++, iSettings.iLogStatus);
	CleanupStack::PushL(logStatusItem);
	label = StringLoader::LoadLC(R_SETTING_LOG_STATUS);
	logStatusItem->ConstructL(isNumberedStyle, 0, *label, icons, R_BINARY_SETTING_PAGE, -1, 0, R_BINARY_TEXTS);
	iSettingsList->SettingItemArray()->AppendL(logStatusItem);
	CleanupStack::PopAndDestroy(label);
	CleanupStack::Pop(logStatusItem);
		
	//Log Settings Path 
	CAknSettingItem* logSettingItem = new (ELeave) CAknTextSettingItem(id++, iSettings.iLogPath);
	CleanupStack::PushL(logSettingItem);
	label = StringLoader::LoadLC(R_SETTING_LOG_SELECTOR);
	logSettingItem->SetEmptyItemTextL(KEmptyItemText);
	logSettingItem->ConstructL(isNumberedStyle, 0, *label, icons, R_TEXT_SETTING_PAGE, -1, 0, R_NAME_EDWIN);
	iSettingsList->SettingItemArray()->AppendL(logSettingItem);
	CleanupStack::PopAndDestroy(label);
	CleanupStack::Pop(logSettingItem);
	
	//Random test app Status (ON/OFF)
	CAknSettingItem* RandomTestAppItem = new(ELeave) CAknBinaryPopupSettingItem(id++, iSettings.iRandomTestAppIdStatus);
	CleanupStack::PushL(RandomTestAppItem);
	label = StringLoader::LoadLC(R_SETTING_RANDOMTEST_STATUS);
	RandomTestAppItem->ConstructL(isNumberedStyle, 0, *label, icons, R_BINARY_SETTING_PAGE, -1, 0, R_BINARY_TEXTS);
	iSettingsList->SettingItemArray()->AppendL(RandomTestAppItem);
	CleanupStack::PopAndDestroy(label);
	CleanupStack::Pop(RandomTestAppItem);
	
    //Random test app Id
	CAknSettingItem* itemAppID = new (ELeave) CAknTextSettingItem(id++, iSettings.iRandomTestAppID );
    CleanupStack::PushL(itemAppID);
    label = StringLoader::LoadLC(R_SETTING_RANDOMTEST);
    itemAppID->SetEmptyItemTextL(KEMPTYTEXT);
    itemAppID->ConstructL(isNumberedStyle, 0, *label, icons, R_APPID_SETTING_PAGE, -1, 0, R_NAME_EDWIN);
    iSettingsList->SettingItemArray()->AppendL(itemAppID);
    CleanupStack::PopAndDestroy(label);
    CleanupStack::Pop(itemAppID);
	
	iSettingsList->HandleChangeInItemArrayOrVisibilityL();		
}
// -----------------------------------------------------------------------------
// CSettingsDialog::OkToExitL
// -----------------------------------------------------------------------------
//
TBool CSettingsDialog::OkToExitL(TInt aButtonId)
{
    switch (aButtonId)
    {
        case EAknSoftkeySelect:   
    	TInt index = iSettingsList->ListBox()->CurrentItemIndex();
    	CAknSettingItem *item = (*iSettingsList->SettingItemArray())[index];
    	
     	iSettingsList->EditItemL(index, EFalse);
    	iSettingsList->StoreSettingsL();
		switch (item->Identifier())
		{
			case 0:
			{
				TBool lengthOk = ETrue;
				if(iSettings.iScriptsPath.Length()>KBuffer256)
					lengthOk = EFalse;
				//check file extension
				TInt result = CheckFileName(iSettings.iScriptsPath);
									
				//check drive
				TInt err = iSettings.CheckDrive(iSettings.iScriptsPath);
								
				if(iSettings.iScriptsPath.Right(1).Compare(KBsh)!=0)
					iSettings.iScriptsPath.Append(KBsh);
				
				TBool res = iSettings.CheckPathL(iSettings.iScriptsPath);
				
				if(err != KErrNone || result == -1  || !res || !lengthOk)
				{
					//invalid drive Error note
					CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
					errorNote->ExecuteLD(KINVALIDDRIVEEXT);
					iSettings.iScriptsPath = KDefaultPath;
					iSettings.StoreL();
				}
				else
				{ 
					static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->ShowScriptsL();
					static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->RefreshFileNotification();
					iSettings.StoreL();
					return EFalse;
				}
			}
			break;
			case 1:
			case 3:
			case 5:
			case 6:
				iSettings.StoreL();
			return EFalse;
			
			case 4:	
				if(iSettings.iRandomTestAppIdStatus && iSettings.iRandomTestAppID.Length()<1)
				{
					CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
					errorNote->ExecuteLD(KAPPIDSTATUS);
					iSettings.StoreL();
					return CAknDialog::OkToExitL(aButtonId);
				}
				else
				{
					iSettings.StoreL();
					return EFalse;
				}
				break;
			case 2:
			{
				//Check whether log file exits or not
				TBool lengthOk = ETrue;
				if(iSettings.iLogPath.Length()>256)
					lengthOk = EFalse;
				TInt pos = iSettings.iLogPath.Find(KDOT);
				if(pos == KErrNotFound)
				{
					iSettings.iLogPath.Append(KCSVEXT);
				}
				//check file extension
				TInt result = CheckFileName(iSettings.iLogPath);
												
				//check drive
				TInt err = iSettings.CheckDrive(iSettings.iLogPath);
											
				TBool res = iSettings.CheckPathL(iSettings.iLogPath);
							
				if(err != KErrNone || result == -1  || !res || !lengthOk)
				{
					//invalid drive Error note
					CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
					errorNote->ExecuteLD(KINVALIDDRIVEEXT);
					iSettings.iLogPath = KDefaultLogPath;
					iSettings.StoreL();
				}
				else
				{
					if(iSettings.iLogPath.Compare(iPrevLogPath)!=0)
					{
						iPrevLogPath.Copy(iSettings.iLogPath);
						static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->Logger().CloseFileHandles();
					}
					static_cast<CUserEmulatorAppUi*>(iCoeEnv->AppUi())->SetSystemInfoFlag(ETrue);
					iSettings.StoreL();
					return EFalse;
				}
			}
			break;        		
		}   			
		return CAknDialog::OkToExitL(aButtonId);
    }
    return ETrue;
}

// -----------------------------------------------------------------------------
// CSettingsDialog::CheckFileName
// Function to validate file names
// -----------------------------------------------------------------------------
//
TInt CSettingsDialog::CheckFileName(const TDesC& aFilePath)
{
	TInt len = aFilePath.Length();
	TInt pos = aFilePath.Locate('.');
	if(pos!=KErrNotFound && (len-pos)>0)
		{
		TPtrC fileExt = aFilePath.Right(len - pos);
		if(fileExt.Compare(KCSVEXT) == 0 || fileExt.Compare(KXMLEXT)==0 )
			return 0;
		else
			return -1;
		}
	else
		return 0;
}
// -----------------------------------------------------------------------------
// CSettingsDialog::OfferKeyEventL
// -----------------------------------------------------------------------------
//
TKeyResponse CSettingsDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
{
	return iSettingsList->OfferKeyEventL(aKeyEvent,aType);
}
// -----------------------------------------------------------------------------
// CSettingsDialog::CountComponentControls
// -----------------------------------------------------------------------------
//
TInt CSettingsDialog::CountComponentControls() const
{
	return CAknDialog::CountComponentControls() + 1;
}
// -----------------------------------------------------------------------------
// CSettingsDialog::ComponentControl
// -----------------------------------------------------------------------------
//
CCoeControl* CSettingsDialog::ComponentControl(TInt aIndex) const
{
    if (!aIndex--)
    		return iSettingsList;
    	return CAknDialog::ComponentControl(aIndex);
}