diff -r cad71a31b7fc -r e36f3802f733 voiceui/vcommand/src/vcgenericview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/voiceui/vcommand/src/vcgenericview.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,587 @@ +/* +* 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: Generic view class for vcommand app +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include "vcappui.h" +#include "vcgenericview.h" +#include "vcfolderview.h" +#include "vcgenericcontainer.h" +#include "vcommandconstants.h" +#include "vcommand.hrh" +#include "vcommandconstants.h" +#include "vcplaybackdialog.h" +#include "voiceuibldvariant.hrh" + +#include +#include + +#include +#include +#include +#include + +#include "rubydebug.h" + + +// ================= MEMBER FUNCTIONS ======================= + + +// ---------------------------------------------------------------------------- +// CVCGenericView::CVCGenericView +// C++ constructor +// ---------------------------------------------------------------------------- +// +CVCGenericView::CVCGenericView( CVCModel& aModel ): + iModel( aModel ) + { + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::ConstructL +// Two-phased constructor +// ---------------------------------------------------------------------------- +// +void CVCGenericView::ConstructL( TInt aResourceId ) + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::ConstructL" ); + + BaseConstructL( aResourceId ); + SetFolderTitleL( KNullDesC() ); + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::~CVCGenericView +// Destructor +// ---------------------------------------------------------------------------- +// +CVCGenericView::~CVCGenericView() + { + delete iFolderName; + + if( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + delete iContainer; + iContainer = NULL; + } + } + +// ---------------------------------------------------------------------------- +// TUid CVCGenericView::Id +// ---------------------------------------------------------------------------- +// +TUid CVCGenericView::Id() const + { + return KUidVCMainView; + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::HandleCommandL +// ---------------------------------------------------------------------------- +// +void CVCGenericView::HandleCommandL( TInt aCommand ) + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::HandleCommandL" ); + + // We will only handle one event at a time + if( !iContainer->IsHandlingKeyPressInProgress() ) + { + iContainer->SetHandlingKeyPressInProgress( ETrue ); + DoHandleCommandL( aCommand ); + iContainer->SetHandlingKeyPressInProgress( EFalse ); + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::DoHandleCommandL +// ---------------------------------------------------------------------------- +// +// Defines basic operations for listbox items. Those operations are: opening a folder, +// editing an item, playing an item and launching help. More sophisticated features +// can be defined in inherited classes. +// +void CVCGenericView::DoHandleCommandL( TInt aCommand ) + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::DoHandleCommandL" ); + + switch ( aCommand ) + { + case EAknSoftkeySelect: // Middle softkey + { + TInt current( iContainer->CurrentSelection() ); + + // Msk can be pressed before the listbox is populated in which case + // we ignore the key press + if( current != KErrNotFound ) + { + if( iContainer->IsItemFolderL( current ) ) + { + DoHandleCommandL( EVCCmdOpen ); + } + else + { + DoHandleCommandL( EVCCmdEdit ); + } + } + + break; + } + + case EAknSoftkeyExit: // exit the application + { + static_cast( iEikonEnv->AppUi() )->ExitProgram(); + break; + } + + case EAknSoftkeyBack: // back to main view from folder + { +#ifdef __VCOMMAND_CONTROL_PANEL + if( Id() == KUidVCMainView ) + { + static_cast( iEikonEnv->AppUi() )->ExitProgram(); + break; + } + else // Id() == KUidVCFolderView + { + AppUi()->ActivateLocalViewL( KUidVCMainView ); + break; + } +#else + AppUi()->ActivateLocalViewL( KUidVCMainView ); + break; +#endif + } + + case EVCCmdOpen: // open folder + { + TInt current = iContainer->CurrentSelection(); + static_cast + ( AppUi()->View( KUidVCFolderView ) ) + ->SetFolderTitleL( iContainer->GetFolderTitle( current ) ); + // Store the focused folder. Used when returning from folder view. + iFocusedIndex = current; + AppUi()->ActivateLocalViewL( KUidVCFolderView ); + + break; + } + + case EVCCmdEdit: // edit voice command extra text + { + TRAPD(err, iContainer->ShowEditTextL() ); + if ( err == KErrNoMemory || err == KErrDiskFull ) User::Leave(err); + break; + } + + case EVCCmdPlayback: // playback voice command + { + TRAP_IGNORE( PlaybackVoiceCommandL() ); + break; + } + + case EVCCmdDelete: // delete a voice command + { + TRAP_IGNORE( iContainer->DeleteVCommandL() ); + break; + } + + case EVCCmdSettings: // modify settings + { + iFocusedIndex = iContainer->CurrentSelection(); + AppUi()->ActivateLocalViewL( KUidVCSettingsView ); + break; + } + + case EVCCmdStartVui: // start in tutorial mode + { + TRAP_IGNORE( LaunchDemoVoiceUiL() ); + break; + } + + case EAknCmdHelp: // launch help dialog + { + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), + AppUi()->AppHelpContextL() ); + break; + } + + case EVCCmdRemove: // item can not be removed + { + CannotDeleteNoteL(); + break; + } + + case EVCCmdIgnore: + { + break; // do nothing + } + + default: + { + AppUi()->HandleCommandL( aCommand ); + break; + } + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::LaunchDemoVoiceUiL +// ---------------------------------------------------------------------------- +// +void CVCGenericView::LaunchDemoVoiceUiL() const + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::LaunchDemoVoiceUiL" ); + + CRepository* client = CRepository::NewLC( KCRUidVCommandSettings ); + User::LeaveIfError( client->Set( KVuiDemoMode, ETrue ) ); + CleanupStack::PopAndDestroy( client ); + + TApaTaskList apaTaskList( CCoeEnv::Static()->WsSession() ); + TApaTask apaTask = apaTaskList.FindApp( KVoiceUiUid ); + + if ( apaTask.Exists() ) + { + apaTask.BringToForeground(); + } + else + { + RApaLsSession apaLsSession; + User::LeaveIfError( apaLsSession.Connect() ); + + TApaAppInfo appInfo; + User::LeaveIfError( apaLsSession.GetAppInfo( appInfo, KVoiceUiUid ) ); + + TFileName appName = appInfo.iFullName; + CApaCommandLine* apaCommandLine = CApaCommandLine::NewLC(); + + apaCommandLine->SetExecutableNameL( appName ); + apaCommandLine->SetCommandL( EApaCommandRunWithoutViews ); + User::LeaveIfError ( apaLsSession.StartApp( *apaCommandLine ) ); + CleanupStack::PopAndDestroy( apaCommandLine ); + + apaLsSession.Close(); + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::CheckMiddleSoftkeyLabelL +// ---------------------------------------------------------------------------- +// +void CVCGenericView::SetMiddleSoftkeyLabelL( TInt aIndex ) const + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::SetMiddleSoftkeyLabelL" ); + + RemoveCommandFromMSK(); + + if( iModel.Count() == 0 ) + { + DoSetMiddleSoftKeyLabelL( R_TEXT_SOFTKEY_EMPTY, EVCCmdIgnore ); + } + else if( iContainer->IsItemFolderL( aIndex ) ) + { + DoSetMiddleSoftKeyLabelL( R_QTN_VC_OPEN, EVCCmdOpen ); + } + else + { + DoSetMiddleSoftKeyLabelL( R_QTN_VC_EDIT, EVCCmdEdit ); + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::SetMiddleSoftKeyLabelL +// ---------------------------------------------------------------------------- +// +void CVCGenericView::DoSetMiddleSoftKeyLabelL( const TInt aResourceId, + const TInt aCommandId ) const + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::DoSetMiddleSoftKeyLabelL" ); + + CEikButtonGroupContainer* cbaGroup = Cba(); + if ( cbaGroup ) + { + HBufC* mskText = StringLoader::LoadLC( aResourceId ); + TPtr mskPtr = mskText->Des(); + cbaGroup->AddCommandToStackL( KVcMskControlID, aCommandId, mskPtr ); + CleanupStack::PopAndDestroy( mskText ); + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::RemoveCommandFromMSK +// ---------------------------------------------------------------------------- +// +void CVCGenericView::RemoveCommandFromMSK() const + { + if ( Cba() ) + { + Cba()->RemoveCommandFromStack( KVcMskControlID, EVCCmdOpen ); + Cba()->RemoveCommandFromStack( KVcMskControlID, EVCCmdEdit ); + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::HandleClientRectChange +// ---------------------------------------------------------------------------- +// +void CVCGenericView::HandleClientRectChange() + { + if ( iContainer ) + { + iContainer->SetRect( ClientRect() ); + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::DoActivateL +// ---------------------------------------------------------------------------- +// +void CVCGenericView::DoActivateL( const TVwsViewId& aPrevViewId, + TUid, const TDesC8& ) + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::DoActivateL" ); + + if( !iContainer ) + { + iContainer = new ( ELeave ) CVCGenericContainer( MenuBar(), iModel, *this ); + iContainer->SetMopParent( this ); + iContainer->ConstructL( ClientRect() ); + AppUi()->AddToStackL( *this, iContainer ); + + iContainer->ActivateL(); + } + + // Returning from folder or settings view + if( aPrevViewId.iViewUid.iUid == KUidVCFolderView.iUid || + aPrevViewId.iViewUid.iUid == KUidVCSettingsView.iUid ) + { + // Set the focus on the folder that was opened previously + iContainer->SetCurrentSelection( iFocusedIndex ); + } + + // Set msk label + SetMiddleSoftkeyLabelL( iContainer->CurrentSelection() ); + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::DoDeactivate +// ---------------------------------------------------------------------------- +// +void CVCGenericView::DoDeactivate() + { + if( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + delete iContainer; + iContainer = NULL; + } + } + + +// ---------------------------------------------------------------------------- +// CVCGenericView::DynInitMenuPaneL +// ---------------------------------------------------------------------------- +void CVCGenericView::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::DynInitMenuPaneL" ); + + if( aMenuPane ) + { + // Check which menu item we are handling + if( aResourceId == R_VCOMMAND_MENU ) + { + // if help is not enabled, do not show "help" + if( !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue ); + } + + TInt listBoxIndex( iContainer->CurrentSelection() ); + + if( listBoxIndex >= 0 ) + { + TBool isFolder = iContainer->IsItemFolderL( listBoxIndex ); + + if( isFolder ) // Folder is highlighted. + { + aMenuPane->SetItemDimmed( EVCCmdPlayback, ETrue ); + aMenuPane->SetItemDimmed( EVCCmdEdit, ETrue ); + aMenuPane->SetItemDimmed( EVCCmdDelete, ETrue ); + } + else // Folder is not highlighted. + { + aMenuPane->SetItemDimmed( EVCCmdOpen, ETrue ); + + // Show delete item only if the command is user edited + TDesC* secondRow = iContainer->GetSecondRowNameLC( + iContainer->CurrentSelection() ); + if( secondRow->Length() == 0 ) + { + aMenuPane->SetItemDimmed( EVCCmdDelete, ETrue ); + } + CleanupStack::PopAndDestroy( secondRow ); + } + } + else // No items in listbox + { + aMenuPane->SetItemDimmed( EVCCmdPlayback, ETrue ); + aMenuPane->SetItemDimmed( EVCCmdEdit, ETrue ); + aMenuPane->SetItemDimmed( EVCCmdDelete, ETrue ); + aMenuPane->SetItemDimmed( EVCCmdOpen, ETrue ); + } + } + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::PlaybackVoiceCommandL +// ---------------------------------------------------------------------------- +// +void CVCGenericView::PlaybackVoiceCommandL() + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::PlaybackVoiceCommandL" ); + + CVCAppUi* appUi = static_cast ( iEikonEnv->AppUi() ); + + TInt state = appUi->CheckCallStateL(); + TBool videoCallState = appUi->IsVideoCallL(); + + if( ( state == EPSCTsyCallStateNone || state == EPSCTsyCallStateUninitialized || + state == EPSCTsyCallStateHold || state == KErrNotFound ) && !videoCallState ) + { + TInt listboxIndex = iContainer->CurrentSelection(); + TDesC* listboxItem = iContainer->GetFirstRowNameLC( listboxIndex ); + + const CVCommandUiEntry& vcommand = iModel.GetVCommandL( *listboxItem ); + CleanupStack::PopAndDestroy( listboxItem ); + + CVCPlaybackDialog* dlg = new (ELeave) CVCPlaybackDialog( + iModel.Service(), vcommand ); + dlg->PrepareLC( R_PLAYBACK_VOICE_COMMAND_DIALOG ); + dlg->RunLD(); + dlg = NULL; + } + else + { + // Display call in progress note + appUi->CallInProgressNoteL(); + } + } + +// ---------------------------------------------------------------------------- +// CVCGenericView::CannotDeleteNoteL +// ---------------------------------------------------------------------------- +// +void CVCGenericView::CannotDeleteNoteL() + { + RUBY_DEBUG_BLOCKL( "CVCGenericView::CannotDeleteNoteL" ); + + TDesC* name; + name = iContainer + ->GetSecondRowNameLC( iContainer->CurrentSelection() ); + + if( name->Length() == 0 ) + { + CleanupStack::PopAndDestroy( name ); + name = iContainer + ->GetFirstRowNameLC( iContainer->CurrentSelection() ); + } + + HBufC* stringholder = StringLoader::LoadL( R_QTN_VC_INFO_CANNOT_DEL, + *name, iEikonEnv ); + CleanupStack::PopAndDestroy( name ); + CleanupStack::PushL( stringholder ); + + CAknNoteWrapper* note = new ( ELeave ) CAknNoteWrapper(); + note->ExecuteLD( R_CANNOT_DELETE_NOTE, *stringholder ); + CleanupStack::PopAndDestroy( stringholder ); + } + +// ----------------------------------------------------------------------------- +// CVCGenericView::HandleSizeChange +// Handle screen size change. +// ----------------------------------------------------------------------------- +// +void CVCGenericView::HandleSizeChange() + { + if (iContainer) + { + TRect genericPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, genericPaneRect ); + iContainer->SetRect( genericPaneRect ); + } + } + +// ----------------------------------------------------------------------------- +// CVCGenericView::FolderTitle +// Returns the title of the view's active folder. +// ----------------------------------------------------------------------------- +// +const TDesC& CVCGenericView::FolderTitle() const + { + return *iFolderName; + } + +// ----------------------------------------------------------------------------- +// CVCGenericView::SetFolderTitleL +// ----------------------------------------------------------------------------- +// +void CVCGenericView::SetFolderTitleL( const TDesC& aNewName ) + { + delete iFolderName; + iFolderName = NULL; + iFolderName = aNewName.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CVCGenericView::RefreshViewL +// ----------------------------------------------------------------------------- +// +void CVCGenericView::RefreshViewL() + { + // This is the focused view + if( iContainer ) + { + CVCommandUiEntryArray* oldCommands = iModel.VCommandArrayL(); + CleanupStack::PushL( oldCommands ); + + // Update model + iModel.LoadVCommandsL(); + + CVCommandUiEntryArray* newCommands = iModel.VCommandArrayL(); + CleanupStack::PushL( newCommands ); + + iContainer->RefreshListboxL( *oldCommands, *newCommands ); + + CleanupStack::PopAndDestroy( newCommands ); + CleanupStack::PopAndDestroy( oldCommands ); + } + } + +// End of File