diff -r 000000000000 -r f72a12da539e menufw/menufwui/mmextensions/mmfolderuiextension/src/mmmovetofoldercommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menufw/menufwui/mmextensions/mmfolderuiextension/src/mmmovetofoldercommand.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,637 @@ +/* +* 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 +