diff -r 6205fd287e8a -r 1abc632eb502 menufw/menufwui/mmextensions/mmfolderuiextension/src/mmmovetofoldercommand.cpp --- a/menufw/menufwui/mmextensions/mmfolderuiextension/src/mmmovetofoldercommand.cpp Thu Mar 18 14:45:17 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,637 +0,0 @@ -/* -* Copyright (c) 2007-2008 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: Add folder command - * -*/ - - -#include - -#include "mmmovetofoldercommand.h" -#include "hnglobals.h" -#include "menudebug.h" -#include "hnconvutils.h" -#include "hnliwutils.h" -#include "hnutils.h" - -#include "hnmdbasekey.h" -#include "hnmdkeyfactory.h" -#include "menudebug.h" -#include "mmactionrequest.h" -#include "hnservicehandler.h" -#include "mmpluginsharedresources.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -_LIT( KFolderClosed, "0\t" ); -_LIT( KFolderOpened, "1\t" ); -const TInt KSoftkeyBack( 0 ); - -// ============================ MEMBER FUNCTIONS ============================= - -// --------------------------------------------------------------------------- -// Symbian factory function. -// --------------------------------------------------------------------------- -// -CMmMoveToFolderCommand* CMmMoveToFolderCommand::NewL() - { - CMmMoveToFolderCommand* self = new( ELeave ) CMmMoveToFolderCommand(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - - -// --------------------------------------------------------------------------- -// Symbian second phase constructor. -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::ConstructL() - { - BaseConstructL(); - iLockDialog = EFalse; - iFlagLeave = EFalse; - } - -// --------------------------------------------------------------------------- -// Destructor. -// --------------------------------------------------------------------------- -// -CMmMoveToFolderCommand::~CMmMoveToFolderCommand() - { - iItemName.Close(); - iFolderName.Close(); - iWidgetType.Close(); - iOpenedHierarchy.ResetAndDestroy(); - iOpenedHierarchy.Close(); - delete iServiceHandler; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -CMmMoveToFolderCommand::CMmMoveToFolderCommand() - { - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TInt CMmMoveToFolderCommand::HandleNotifyL( - TInt /*aCmdId*/, - TInt aEventId, - CLiwGenericParamList& /*aEventParamList*/, - const CLiwGenericParamList& /*aInParamList*/ ) - { - if (aEventId != KLiwEventCanceled) - { - NotificationMovingCompleteL(); - iItemName.Close(); - iFolderName.Close(); - } - return KErrNone; - } - - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::ExecuteActionL( - CLiwGenericParamList* aEventParamList ) - { - - // - // Prepare move to folder operation - MMPERF(("CMmMoveToFolderCommand::ExecuteActionL - START")); - iItemId = GetIntL( *aEventParamList, KIdAttrName8 ); - iParentId = GetIntL( *aEventParamList, KFolderAttrName8 ); - TPtrC widget = GetStringL( *aEventParamList, KWidgetAttrName8 ); - TPtrC currentTempName = GetStringL( *aEventParamList, KName8 ); - - iItemName.Close(); - iItemName.CreateL( currentTempName ); - - iWidgetType.Close(); - iWidgetType.CreateL( widget ); - - CMmFolder* rootFolder = CMmFolder::NewL(); - CleanupStack::PushL( rootFolder ); - - rootFolder->SetNameL( iSharedResources->GetRootFolder()); - rootFolder->SetId( KRootId ); - iOpenedHierarchy.AppendL( rootFolder ); - CleanupStack::Pop( rootFolder ); - iLockDialog = EFalse; - - // Excute move to folder operation - TInt err( KErrNone ); - - // Get folder list form MCS - GetFolderListL( CurrentFolder()->Id() ); - - RPointerArray< CMmFolder > folders; - CleanupResetAndDestroyPushL( folders ); - - // Get folders from GetList output - GetFoldersL(folders); - - // if foler already exists, reopen options menu - do - { - TRAP( err, ExecuteMoveToFolderL()); - } - while ( err == KErrAlreadyExists && folders.Count() > 0 ); - - // if any different leave was trapped, pass it on - if ( err != KErrNone ) - { - User::Leave( err ); - } - - CleanupStack::PopAndDestroy( &folders ); - //MMPERF(("CFolderUiExtPlugin::AddFolderCommandL - END")); - } - - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -CMmFolder* CMmMoveToFolderCommand::CurrentFolder() - { - ASSERT( iOpenedHierarchy.Count() > 0 ); - return iOpenedHierarchy[ iOpenedHierarchy.Count() - 1 ]; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::MoveToFolderL( TInt aId, TInt aFolderId, - TInt aBeforeItemId ) - { - if( aFolderId != iParentId ) - { - CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL( - KInData8, KKeyTypeMap, KDefaultParentId8 ); - CleanupStack::PushL( inDataKey ); - CHnMdBaseKey* listIds = HnMdKeyFactory::CreateL( - KIdsList, KKeyTypeList, KNullDesC8 ); - - HBufC8* id = HnConvUtils::NumToStr8LC( aId ); - AddSubKeyL( listIds, KIdParam, KKeyTypeBoolean, *id ); - CleanupStack::PopAndDestroy(); - - inDataKey->AddSubKeyL( listIds ); - HBufC8* folderId = HnConvUtils::NumToStr8LC( aFolderId ); - AddSubKeyL( inDataKey, KFolderId8, KKeyTypeBoolean, *folderId ); - CleanupStack::PopAndDestroy( folderId ); - - if( aBeforeItemId != KErrNotFound ) - { - HBufC8* itemId = HnConvUtils::NumToStr8LC( aBeforeItemId ); - AddSubKeyL( inDataKey, KBeforeItemId8, KKeyTypeBoolean, *itemId ); - CleanupStack::PopAndDestroy( itemId ); - } - MCSQueryExecutionL( KCmdOrganize8, inDataKey, NULL, this ); - iOpenedHierarchy.ResetAndDestroy(); - - CleanupStack::PopAndDestroy( inDataKey ); - CLiwGenericParamList* list = CLiwGenericParamList::NewLC(); - TLiwGenericParam command( KHnRequest, TLiwVariant( KDisableActionsForItem ) ); - TLiwGenericParam itemCustomId( - KItemCustomId8, TLiwVariant( static_cast( aId ) ) ); - list->AppendL( itemCustomId ); - list->AppendL( command ); - iActionRequest->HandleRequestL( *list ); - CleanupStack::PopAndDestroy( list ); - } - else - { - NotificationItemAlreadyStoredL(); - if( iOpenedHierarchy.Count() > 0 && !iLockDialog ) - { - if( CurrentFolder()->Id() == iParentId && iParentId != KRootId ) - { - StepBackInHierarchy(); - } - else if ( iParentId == KRootId ) - { - User::Leave( KErrAlreadyExists ); - } - } - } - } - - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::SelectFolderL( - const RPointerArray< CMmFolder >& aFolderContent ) - { - CDesCArrayFlat* folders = - new( ELeave )CDesCArrayFlat( aFolderContent.Count() + 1 ); - CleanupStack::PushL( folders ); - RBuf currentFolder; - CleanupClosePushL( currentFolder ); - currentFolder.CreateL( - KFolderOpened().Length() + CurrentFolder()->Name().Length() ); - currentFolder.Append( KFolderOpened ); - currentFolder.Append( CurrentFolder()->Name() ); - folders->AppendL( currentFolder ); - - for( int i( 0 ); iName().Length() ); - name.Append( KFolderClosed ); - name.Append( folder->Name() ); - folders->AppendL( name ); - CleanupStack::PopAndDestroy( &name ); - } - - TInt selected( SelectFolderFromListL( - folders, CurrentFolder()->Id() == KRootId ) ); - - switch( selected ) - { - case EAknSoftkeyBack: - { - if( iOpenedHierarchy.Count() > 1 && !iLockDialog ) - { - StepBackInHierarchy(); - break; - } - } - case EAknSoftkeyExit: - { - iItemName.Close(); - iFolderName.Close(); - iOpenedHierarchy.ResetAndDestroy(); - break; - } - default: - { - if( selected > 0 ) - { - CMmFolder* folder = CMmFolder::NewL(); - CleanupStack::PushL( folder ); - folder->SetNameL( aFolderContent[ selected - 1 ]->Name() ); - folder->SetId( aFolderContent[ selected - 1 ]->Id() ); - iOpenedHierarchy.AppendL( folder ); - CleanupStack::Pop( folder ); - } - else - { - iFolderName.Close(); - iFolderName.CreateL( CurrentFolder()->Name() ); - MoveToFolderL( iItemId, CurrentFolder()->Id() ); - } - break; - } - } - - CleanupStack::PopAndDestroy( ¤tFolder ); - CleanupStack::PopAndDestroy( folders ); - } - - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TInt CMmMoveToFolderCommand::SelectFolderFromListL( - CDesCArrayFlat* aItems, TBool aIsRoot ) - { - TInt selected( KErrNotFound ); - - CAknListQueryDialog* dialog = - new ( ELeave ) CAknListQueryDialog( &selected ); - if( aIsRoot ) - { - dialog->PrepareLC( R_MENU_EDIT_MOVE_TO_FOLDER_SELECT_CANCEL_QUERY ); - } - else - { - dialog->PrepareLC( R_MENU_EDIT_MOVE_TO_FOLDER_SELECT_BACK_QUERY ); - } - dialog->SetItemTextArray( aItems ); - dialog->SetOwnershipType( ELbmDoesNotOwnItemArray ); - CArrayPtr* icons = GetFolderIconsL(); - dialog->SetIconArrayL( icons ); - dialog->ListBox()->SetCurrentItemIndexAndDraw( 0 ); - - if( !iLockDialog ) - { - SetDialogL( dialog ); - TInt softkey ( KErrNotFound ); - softkey = dialog->RunLD(); - SetDialogL( NULL ); - - if( softkey == KSoftkeyBack ) - { - selected = EAknSoftkeyBack; - } - else if( selected < 0 || - ( softkey != EAknSoftkeyOk && softkey != EAknSoftkeySelect ) ) - { - selected = EAknSoftkeyExit; - } - } - else - { - CleanupStack::PopAndDestroy( dialog ); - selected = EAknSoftkeyExit; - } - - return selected; - } - - -// --------------------------------------------------------------------------- -// Action resolving function. -// --------------------------------------------------------------------------- -// -CArrayPtr* CMmMoveToFolderCommand::GetFolderIconsL() - { - CArrayPtr* icons = new( ELeave )CAknIconArray( 10 ); - CleanupStack::PushL( icons ); - CFbsBitmap* folderClosed = NULL; - CFbsBitmap* folderClosedMask = NULL; - - AknIconUtils::CreateIconL( folderClosed, folderClosedMask, - AknIconUtils::AvkonIconFileName(), - EMbmAvkonQgn_prop_folder_small, - EMbmAvkonQgn_prop_folder_small_mask ); - CleanupStack::PushL( folderClosed ); - CleanupStack::PushL( folderClosedMask ); - icons->AppendL( CGulIcon::NewL( folderClosed, folderClosedMask ) ); - CleanupStack::Pop( 2 ); - - CFbsBitmap* folderOpened = NULL; - CFbsBitmap* folderOpenedMask = NULL; - AknIconUtils::CreateIconL( folderOpened, folderOpenedMask, - AknIconUtils::AvkonIconFileName(), - EMbmAvkonQgn_prop_folder_current, - EMbmAvkonQgn_prop_folder_current_mask ); - CleanupStack::PushL( folderOpened ); - CleanupStack::PushL( folderOpenedMask ); - icons->AppendL( CGulIcon::NewL( folderOpened, folderOpenedMask ) ); - CleanupStack::Pop( 3 ); - return icons; - } - - -// --------------------------------------------------------------------------- -// Action resolving function. -// --------------------------------------------------------------------------- -// -HBufC* CMmMoveToFolderCommand::GetFromResourceLC( TInt aIdentifier ) - { - HBufC* string = StringLoader::LoadLC( aIdentifier ); - return string; - } - - -// --------------------------------------------------------------------------- -// Action resolving function. -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::NotificationMovingCompleteL() - { - CDesCArrayFlat* items = new(ELeave) CDesCArrayFlat( 1 ); - CleanupStack::PushL( items ); - items->AppendL( iItemName ); - items->AppendL( iFolderName ); - - HBufC* msg = StringLoader::LoadLC( R_APPS_NOTE_MOVE_TO_FOLDER, *items ); - CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog( - CAknNoteDialog::EConfirmationTone, - CAknNoteDialog::ELongTimeout ); - dialog->SetTextL( msg->Des() ); - dialog->ExecuteDlgLD( R_MENU_EDIT_MOVING_COMPLETE_NOTIFICATION ); - - CleanupStack::PopAndDestroy( msg ); - CleanupStack::PopAndDestroy( items ); - } - - -// --------------------------------------------------------------------------- -// Action resolving function. -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::NotificationItemAlreadyStoredL() - { - HBufC* message = StringLoader::LoadLC( R_APPS_NOTE_ITEM_ALREADY_STORED ); - CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog( - CAknNoteDialog::EConfirmationTone, - CAknNoteDialog::ELongTimeout ); - dialog->SetTextL( message->Des() ); - dialog->ExecuteDlgLD( R_MENU_EDIT_MOVING_ABORT_NOTIFICATION ); - - CleanupStack::PopAndDestroy( message ); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::StepBackInHierarchy() - { - // Remove last folder from iOpenedHierarchy - CMmFolder* folder = CurrentFolder(); - iOpenedHierarchy.Remove( iOpenedHierarchy.Count() - 1 ); - delete folder; - } - - - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::ExecuteMoveToFolderL() - { - while (iOpenedHierarchy.Count() > 0) - { - // Get folder list form MCS - GetFolderListL( CurrentFolder()->Id() ); - - RPointerArray< CMmFolder > folders; - CleanupResetAndDestroyPushL( folders ); - - // Get folders from GetList output - GetFoldersL(folders); - - // Perform further folder selection or move operation - if( folders.Count() > 0 ) - { - SelectFolderL( folders ); - } - else - { - iFolderName.Close(); - iFolderName.CreateL( CurrentFolder()->Name() ); - MoveToFolderL( iItemId, CurrentFolder()->Id() ); - } - CleanupStack::PopAndDestroy( &folders ); - } - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CMmMoveToFolderCommand::GetFoldersL(RPointerArray& aFolderArray) - { - TInt pos( 0 ); - TInt count = iGetListOutParam->FindFirst( - pos, KReturnValue8() )->Value().AsList()->Count(); - TLiwVariant var; var.PushL(); - - // Get propper widget names depending from view type - // and append to aFolderArray - for( TInt i = 0; i < count; i++ ) - { - HnLiwUtils::GetVariantL( *iGetListOutParam, KIdPath8, i, var ); - TInt32 id; - var.Get( id ); - - if (id != iItemId) - { - CMmFolder* folder = CMmFolder::NewL(); - CleanupStack::PushL( folder ); - - folder->SetId( id ); - - TPtrC title; - if( !iWidgetType.Compare( KWidgetTypeList ) ) - { - HnLiwUtils::GetVariantL( - *iGetListOutParam, KLongNamePath8, i, var ); - } - else if( !iWidgetType.Compare( KWidgetTypeGrid ) ) - { - HnLiwUtils::GetVariantL( - *iGetListOutParam, KShortNamePath8, i, var ); - } - else - { - HnLiwUtils::GetVariantL( - *iGetListOutParam, KAppGroupNamePath8, i, var ); - } - var.Get( title ); - folder->SetNameL( title ); - aFolderArray.AppendL( folder ); - - CleanupStack::Pop( folder ); - } - } - CleanupStack::PopAndDestroy(&var); - } - -// --------------------------------------------------------------------------- -// Symbian factory function. -// --------------------------------------------------------------------------- -// -CMmFolder* CMmFolder::NewL() - { - CMmFolder* self = new( ELeave ) CMmFolder(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- -// Symbian second phase constructor. -// --------------------------------------------------------------------------- -// -void CMmFolder::ConstructL() - { - } - -// --------------------------------------------------------------------------- -// Destructor. -// --------------------------------------------------------------------------- -// -CMmFolder::~CMmFolder() - { - iName.Close(); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -CMmFolder::CMmFolder() - { - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CMmFolder::SetNameL( const TDesC& aName ) - { - iName.Close(); - iName.CreateL( aName ); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -const TDesC& CMmFolder::Name() const - { - return iName; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CMmFolder::SetId( TInt aId ) - { - iId = aId; - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TInt CMmFolder::Id() - { - return iId; - } - -// end of file -