/*
* Copyright (c) 2006 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: Location Triggering Management Plugin view
*
*/
// System Include
#include <barsread.h> // For TResourceReader
#include <bautils.h>
#include <StringLoader.h>
#include <aknViewAppUi.h>
#include <lbtmgmtpluginview.rsg>
#include <avkon.rsg>
#include <aknnotewrappers.h> // Error Notes
#include <textresolver.h> // Text Resolver
#include <hlplch.h> // Help
#include <featmgr.h> // FeatureManager
// User Include
#include "locsettingsui.h"
#include "locsettingsuiobserver.h"
#include "lbtmgmtplugin.hrh"
#include "lbtmgmtpluginview.h"
#include "lbtmgmtplugincontainer.h"
#include "lbtmgmtpluginengine.h"
// ========================= MEMBER FUNCTIONS ================================
// ---------------------------------------------------------------------------
// CLbtMgmtPluginView::CLbtMgmtPluginView
// Overloaded Constructor
//
// ---------------------------------------------------------------------------
//
CLbtMgmtPluginView::CLbtMgmtPluginView(
MLocSettingsUiObserver& aSettingsObsrv )
:iSettingsObserver( aSettingsObsrv ),
iResourceLoader( *CCoeEnv::Static() )
{
}
// ---------------------------------------------------------------------------
// CLbtMgmtPluginView::~CLbtMgmtPluginView
// Destructor
//
// ---------------------------------------------------------------------------
//
CLbtMgmtPluginView::~CLbtMgmtPluginView()
{
// Close the resource loader
iResourceLoader.Close();
}
// ---------------------------------------------------------------------------
// CLbtMgmtPluginView* CLbtMgmtPluginView::NewL
// Creates new Location Trigger Management view.
//
// @param aSettingsObsrv Pointer to the Command Handler
// @return CLbtMgmtPluginView* Reference to the application view
// ---------------------------------------------------------------------------
//
CLbtMgmtPluginView* CLbtMgmtPluginView::NewL(
MLocSettingsUiObserver& aSettingsObsrv )
{
CLbtMgmtPluginView* self =
CLbtMgmtPluginView::NewLC( aSettingsObsrv );
CleanupStack::Pop( self );
return self;
}
// ---------------------------------------------------------------------------
// CLbtMgmtPluginView* CLbtMgmtPluginView::NewLC
// Creates new Location Trigger Management view.
//
// @param aSettingsObsrv Pointer to the Command Handler
// @return CLbtMgmtPluginView* Reference to the application view
// ---------------------------------------------------------------------------
//
CLbtMgmtPluginView* CLbtMgmtPluginView::NewLC(
MLocSettingsUiObserver& aSettingsObsrv )
{
CLbtMgmtPluginView* self =
new(ELeave) CLbtMgmtPluginView( aSettingsObsrv );
CleanupStack::PushL( self );
self->ConstructL();
return self;
}
// ---------------------------------------------------------------------------
// void CLbtMgmtPluginView::ConstructL
// Second Phase Constructor
//
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::ConstructL()
{
// Open the Resource File
OpenLocalizedResourceFileL( KLbtMgmtViewResFileName, iResourceLoader );
// Call AknView's BaseConstrutL
BaseConstructL( R_LBTMGMTPLUGIN_VIEW );
}
// ---------------------------------------------------------------------------
// void CLbtMgmtPluginView::CloseSettings
// Close the Location Triggering Management Settings
//
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::CloseSettings()
{
// Stop displaying the menu bar, if its currently being displayed
StopDisplayingMenuBar();
// Close all the active dialogs
if( iEngine )
iEngine->Close();
}
// ---------------------------------------------------------------------------
// void CLbtMgmtPluginView::DoActivateL
//
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::DoActivateL( const TVwsViewId& /* PrevViewId*/,
TUid /* aCustomMessageId*/,
const TDesC8& /* aCustomMessage */)
{
// Destroy the existing container if it exists
if( iContainer )
{
AppUi()->RemoveFromViewStack( *this, iContainer );
delete iContainer;
iContainer=NULL;
}
// Create the Location Triggering engine instance
iEngine = CLbtMgmtPluginEngine::NewL( *this );
// Create new Container
iContainer = CLbtMgmtPluginContainer::NewL(ClientRect(), *iEngine, *this,
this);
iContainer->SetMopParent(this);
AppUi()->AddToViewStackL(*this, iContainer);
MenuBar()->SetContextMenuTitleResourceId(R_LBTMGMTPLUGIN_CONTEXTMENUBAR);
SetCba(R_LBTMGMTPLUGIN_CBA_CHANGE);
}
// ---------------------------------------------------------------------------
// void CLocationSystemUiView::DoDeactivate
//
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::DoDeactivate()
{
// Destroy Container
AppUi()->RemoveFromViewStack( *this, iContainer );
delete iContainer;
iContainer = NULL;
// Delete the engine
delete iEngine;
iEngine = NULL;
}
// ---------------------------------------------------------------------------
// TUid CLbtMgmtPluginView::Id
// Returns the View Id. Should be chosen to reflect the Implementation UID
// of the Plugin
//
// @return TUid The View Id
// ---------------------------------------------------------------------------
//
TUid CLbtMgmtPluginView::Id() const
{
return TUid::Uid( KLbtMgmtPluginUID3 );
}
// ---------------------------------------------------------------------------
// void CLbtMgmtPluginView::HandleCommandL
//
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::HandleCommandL(TInt aCommand)
{
switch( aCommand )
{
case ELbtMgmtShowCSMenu:
if (CLbtMgmtPluginEngine::EActiveTriggers
== iContainer->GetFocussedItem())
{
iContainer->ShowContextMenuL();
}
break;
case ELbtMgmtChange:
case ELbtMgmtMSKChange:
{
SettingsChangeL(aCommand);
break;
}
case ELbtMgmtMSKInfo:
break;
case ELbtMgmtInfo:
{
iEngine->ShowInfoDialogL();
break;
}
case ELbtMgmtClearAll:
{
iEngine->ClearAllTriggersL();
iContainer->Update();
HandleCmdL(EListBoxItemFocused);
break;
}
case EAknCmdHelp:
{
HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(),
AppUi()->AppHelpContextL());
break;
}
// Handle any plug-in specific internal commands here
case EAknSoftkeyBack:
{
// The UI is intended to be closed. Pass the event
// to the observer
iSettingsObserver.SettingClosed( KErrNone );
break;
}
default:
{
// Un-handled commands are to be passed to the
// App UI
AppUi()->HandleCommandL(aCommand);
break;
}
}
}
// -----------------------------------------------------------------------------
// CLbtMgmtPluginView::SetCba
// -----------------------------------------------------------------------------
//
void CLbtMgmtPluginView::SetCba( TInt aResourceId )
{
if( Cba() )
{
TRAP_IGNORE(Cba()->SetCommandSetL(aResourceId));
}
Cba()->DrawDeferred();
}
// ---------------------------------------------------------------------------
// void CLbtMgmtPluginView::HandleCommandL
// Inherited from MLbtMgmtPluginCmdHdlr
// Handles Selection events from the container
//
// @param aCommand Command ID
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::HandleCmdL( TLbtMgmtPluginCmd aCommand )
{
switch( aCommand )
{
// Handle any plug-in specific internal commands here
case EListBoxItemSelected:
{
// Handle List Box Selected Event
TRAPD( error, SettingsChangeL( ELbtMgmtMSKChange ));
if( error )
{
// Show Error Note
CTextResolver* iTextResolver = CTextResolver::NewLC(*iCoeEnv);
TPtrC buffer = iTextResolver->ResolveErrorString( error );
CAknErrorNote* errorNote = new ( ELeave )CAknErrorNote( ETrue );
TRAP_IGNORE( errorNote->ExecuteLD( buffer ));
CleanupStack::PopAndDestroy( iTextResolver );
}
break;
}
case EListBoxItemFocused:
{
if( CLbtMgmtPluginEngine::EActiveTriggers == iContainer->GetFocussedItem() )
{
if( iEngine->ActiveTriggers() )
SetCba( R_LBTMGMTPLUGIN_CBA_INFO );
else
SetCba( R_LBTMGMTPLUGIN_CBA_NOACTIVETRIGGERS );
}
else
SetCba( R_LBTMGMTPLUGIN_CBA_CHANGE );
break;
}
case EScreenSizeChanged:
{
if( iContainer )
{
iContainer->SetRect( ClientRect());
}
break;
}
default:
{
break;
}
}
}
// ---------------------------------------------------------------------------
// Inherited from MLbtMgmtEngObserver
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::HandleSettingsChangeEventL()
{
// Observer callback notifies that one/more of the settings values have
// changed. Hence, need to refresh the container to show the latest
// values
if( iContainer )
{
iContainer->DrawDeferred();
}
// Handle any changes to the MSK configuration.
HandleCmdL( EListBoxItemFocused );
}
// -----------------------------------------------------------------------------
// CLbtMgmtPluginView::HandleHelpFeature
// -----------------------------------------------------------------------------
//
void CLbtMgmtPluginView::HandleHelpFeature( CEikMenuPane& aMenuPane ) const
{
if ( FeatureManager::FeatureSupported( KFeatureIdHelp ))
{
aMenuPane.SetItemDimmed( EAknCmdHelp, EFalse );
}
else
{
aMenuPane.SetItemDimmed( EAknCmdHelp, ETrue );
}
}
// ---------------------------------------------------------------------------
// Handle Settings Change Event
//
// @param aCmd Settings change command
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::SettingsChangeL( TInt aCmd )
{
if( !iContainer )
{
// No container available. Nothing to do in this case. Hence, returning
return;
}
CLbtMgmtPluginEngine::TSettingsList currentElement;
currentElement = static_cast<CLbtMgmtPluginEngine::TSettingsList>
( iContainer->GetFocussedItem() );
// Switch based on the currently focussed element
switch( currentElement )
{
case CLbtMgmtPluginEngine::ETriggeringStatus:
{
// Different handling needed for Touch handling and Item selection
// using the OK key.
// Incase the User has selected the item using the OK key then
// normal handling required
// Incase the User has selected the item using touch selection
// then the Trigger Status needs to be toggled
if( ELbtMgmtChange == aCmd )
{
iEngine->ChangeTiggerStatusL();
}
else
{
iEngine->ToggleTiggerStatusL();
}
iContainer->Update();
break;
}
case CLbtMgmtPluginEngine::EActiveTriggers:
{
// If condition is added for any pointer event from container
break;
}
default:
{
// Element not found
User::Leave( KErrNotFound );
}
}
}
// ---------------------------------------------------------------------------
// void CLbtMgmtPluginView::OpenLocalizedResourceFileL
// Opens the nearest localized resourcefile using aResourceLoader.
// aResourceLoader should be opened only once before closing it.
// Otherwise it will raise a panic. Therefore it is better to have
// multiple resource loaders.
//
// @param aResourceFileName Drive and name of resource file in format
// <path>:<rsc_file_name>
// @param aResourceLoader Resource loader for the resource. The loader
// must not be opened allready or it will raise
// a panic. It is caller's responsibility to
// close the resource loader after using the
// resource.
// ---------------------------------------------------------------------------
//
void CLbtMgmtPluginView::OpenLocalizedResourceFileL(
const TDesC& aResourceFileName,
RConeResourceLoader& aResourceLoader )
{
RFs fsSession;
User::LeaveIfError( fsSession.Connect());
TFileName* tmpName = new(ELeave) TFileName;
CleanupStack::PushL( tmpName );
// Append the Resource Files Directory
tmpName->Append( KDC_RESOURCE_FILES_DIR );
// Append the Ressource File Name
tmpName->Append( aResourceFileName );
// Obtain the drive where the DLL is installed
TFileName* dllDrive = new (ELeave) TFileName;
CleanupStack::PushL( dllDrive );
Dll::FileName( *dllDrive );
// Obtain the Complete path for the Resource File
TParse parse;
User::LeaveIfError( parse.Set( *dllDrive, NULL, NULL ) );
User::LeaveIfError( parse.Set( parse.Drive(), tmpName, NULL ) );
TFileName* fileName = new(ELeave) TFileName;
CleanupStack::PushL( fileName );
fileName->Append( parse.FullName() );
// Get language of resource file
BaflUtils::NearestLanguageFile( fsSession, *fileName );
// Open resource file
aResourceLoader.OpenL( *fileName );
// Pop all the fields
CleanupStack::PopAndDestroy( fileName );
CleanupStack::PopAndDestroy( dllDrive );
CleanupStack::PopAndDestroy( tmpName );
//If leave occurs before this, close is called automatically when the thread exits.
fsSession.Close();
}
// ---------------------------------------------------------------------------
// CLbtMgmtPluginView :: GetLbtMgmtPluginEngine
//
//
// ---------------------------------------------------------------------------
//
CLbtMgmtPluginEngine* CLbtMgmtPluginView::GetLbtMgmtPluginEngine()
{
return iEngine;
}