diff -r ea65f74e6de4 -r 8e5f6eea9c9f ui/commandhandlers/commoncommandhandlers/src/glxcommandhandleraddtocontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/commandhandlers/commoncommandhandlers/src/glxcommandhandleraddtocontainer.cpp Tue Aug 31 15:14:51 2010 +0300 @@ -0,0 +1,276 @@ +/* +* Copyright (c) 2009 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: +* +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include "glxlocalisationstrings.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "glxcommandhandleraddtocontainerTraces.h" +#endif + + +const TInt KSelectionPopupListHierarchy = 5; + +GlxAlbumSelectionPopup::GlxAlbumSelectionPopup() + : mSelectionModel( 0 ), + mEventLoop( 0 ), + mResult( false ) +{ +} + +GlxAlbumSelectionPopup::~GlxAlbumSelectionPopup() +{ +} + +QModelIndexList GlxAlbumSelectionPopup::GetSelectionList(GlxAlbumModel *model, bool *ok) +{ + HbSelectionDialog *dlg = new HbSelectionDialog; + dlg->setHeadingWidget(new HbLabel(GLX_ALBUM_SELECTION_TITLE)); + dlg->setSelectionMode(HbAbstractItemView::SingleSelection); + dlg->setModel(model); + dlg->setAttribute(Qt::WA_DeleteOnClose); + dlg->clearActions(); + HbAction *action; + action= new HbAction(GLX_BUTTON_NEW); + action->setObjectName( "ch_new_album_button" ); + dlg->addAction(action); + action= new HbAction(GLX_BUTTON_CANCEL); + action->setObjectName( "ch_cancel_album_button" ); + dlg->addAction(action); + dlg->open(this, SLOT(dialogClosed(HbAction*))); + + QEventLoop eventLoop; + mEventLoop = &eventLoop; + + eventLoop.exec( ); + mEventLoop = 0 ; + if ( ok ) { + *ok = mResult ; + } + + QModelIndexList selectedIndexes = dlg->selectedModelIndexes(); + return selectedIndexes; +} + + +void GlxAlbumSelectionPopup::dialogClosed(HbAction *action) +{ + HbSelectionDialog *dlg = (HbSelectionDialog*)(sender()); + + if( action == dlg->actions().at(1) ) { + mResult = false ; + } + else { + mResult = true ; + } + if ( mEventLoop && mEventLoop->isRunning( ) ) { + mEventLoop->exit( 0 ); + } +} + +GlxCommandHandlerAddToContainer::GlxCommandHandlerAddToContainer() : + mNewMediaAdded(false),mAlbumName(QString()) + { + OstTraceFunctionEntry0( GLXCOMMANDHANDLERADDTOCONTAINER_GLXCOMMANDHANDLERADDTOCONTAINER_ENTRY ); + mTargetContainers = NULL; + OstTraceFunctionExit0( GLXCOMMANDHANDLERADDTOCONTAINER_GLXCOMMANDHANDLERADDTOCONTAINER_EXIT ); + } + +GlxCommandHandlerAddToContainer::~GlxCommandHandlerAddToContainer() + { + OstTraceFunctionEntry0( DUP1_GLXCOMMANDHANDLERADDTOCONTAINER_GLXCOMMANDHANDLERADDTOCONTAINER_ENTRY ); + delete mTargetContainers; + OstTraceFunctionExit0( DUP1_GLXCOMMANDHANDLERADDTOCONTAINER_GLXCOMMANDHANDLERADDTOCONTAINER_EXIT ); + } + +CMPXCommand* GlxCommandHandlerAddToContainer::CreateCommandL(TInt aCommandId, + MGlxMediaList& aMediaList, TBool& /*aConsume*/) const + { + OstTraceFunctionEntry0( GLXCOMMANDHANDLERADDTOCONTAINER_CREATECOMMANDL_ENTRY ); + CMPXCommand* command = NULL; + mAlbumName.clear(); + if(aCommandId == EGlxCmdAddToFav) + { + mAlbumName = GLX_ALBUM_FAV; + CMPXCollectionPath* targetCollection = CMPXCollectionPath::NewL(); + CleanupStack::PushL(targetCollection); + // The target collection has to be appeneded with the albums plugin id + targetCollection->AppendL(KGlxCollectionPluginAlbumsImplementationUid); + // The target collection has also to be appeneded with the the relation id. + // appending another level into the albums to get favourites and 1 is the relation id of albums + targetCollection->AppendL( TMPXItemId(KGlxCollectionFavoritesId) ); + targetCollection->Set( 0 ); + + CMPXCollectionPath* sourceItems = aMediaList.PathLC( NGlxListDefs::EPathFocusOrSelection ); + + command = TGlxCommandFactory::AddToContainerCommandLC( + *sourceItems, *targetCollection); + CleanupStack::Pop(command); + + CleanupStack::PopAndDestroy(sourceItems); + CleanupStack::PopAndDestroy(targetCollection); + } + else + { + + CMPXCollectionPath* sourceItems = aMediaList.PathLC( + NGlxListDefs::EPathFocusOrSelection); + bool ok = false; + + //create target medialist + CMPXCollectionPath* path = CMPXCollectionPath::NewL(); + CleanupStack::PushL(path); + path->AppendL(KGlxCollectionPluginAlbumsImplementationUid); + + CMPXFilter* filter = + TGlxFilterFactory::CreateCameraAlbumExclusionFilterL(); + CleanupStack::PushL(filter); + + // Create the media list + MGlxMediaList* targetMediaList = MGlxMediaList::InstanceL(*path, + TGlxHierarchyId(KSelectionPopupListHierarchy), filter); //todo take actual hierarchy + CleanupStack::PopAndDestroy(filter); + CleanupStack::PopAndDestroy(path); + + //create target model + GlxModelParm modelParm(KGlxCollectionPluginAlbumsImplementationUid, + KSelectionPopupListHierarchy, EGlxFilterExcludeCamera); + GlxAlbumModel *albumMediaModel = new GlxAlbumModel(modelParm); + albumMediaModel->setData(QModelIndex(), (int) GlxContextSelectionList, + GlxContextRole); + + GlxAlbumSelectionPopup popupWidget; + QModelIndexList modelList = popupWidget.GetSelectionList(albumMediaModel, &ok); + if(ok && modelList.count() == 0) + { + createNewMedia(); + ok = false; + } + OstTraceExt2( TRACE_NORMAL, GLXCOMMANDHANDLERADDTOCONTAINER_CREATECOMMANDL, "GlxCommandHandlerAddToContainer::CreateCommandL;ok=%d;newMedia=%d", ok, mNewMediaAdded ); + + if (ok || mNewMediaAdded) + { + int count = modelList.count(); + + for (int i = 0; i < count; i++) + { + albumMediaModel->setData(modelList[i], modelList[i].row(), + GlxSelectedIndexRole); + } + + if (!mNewMediaAdded) + { + CMPXCollectionPath* targetContainers = targetMediaList->PathLC( + NGlxListDefs::EPathFocusOrSelection); + CleanupStack::Pop(targetContainers); + delete mTargetContainers; + mTargetContainers = NULL; + mTargetContainers = targetContainers; + + const TGlxMedia& item = targetMediaList->Item(targetMediaList->SelectedItemIndex(0)); + const TDesC& title = item.Title(); + mAlbumName = QString::fromUtf16(title.Ptr(),title.Length()); + } + + command = TGlxCommandFactory::AddToContainerCommandLC(*sourceItems, + *mTargetContainers); + CleanupStack::Pop(command); + mNewMediaAdded = false; + } + else + { + MGlxMediaList::UnmarkAllL(aMediaList); + } + + MGlxMediaList::UnmarkAllL(*targetMediaList); + targetMediaList->Close(); + CleanupStack::PopAndDestroy(sourceItems); + delete albumMediaModel; + } + OstTraceFunctionExit0( GLXCOMMANDHANDLERADDTOCONTAINER_CREATECOMMANDL_EXIT ); + return command; + } + +void GlxCommandHandlerAddToContainer::createNewMedia() const + { + OstTraceFunctionEntry0( GLXCOMMANDHANDLERADDTOCONTAINER_CREATENEWMEDIA_ENTRY ); + GlxCommandHandlerNewMedia* commandHandlerNewMedia = + new GlxCommandHandlerNewMedia(); + TGlxMediaId newMediaId; + QString newTitle; + TInt error = commandHandlerNewMedia->ExecuteLD(newMediaId,newTitle); + + while (error == KErrAlreadyExists) + { + HbMessageBox::warning(GLX_NAME_ALREADY_EXIST); + error = KErrNone; + error = commandHandlerNewMedia->ExecuteLD(newMediaId,newTitle); + } + + if (error == KErrNone) + { + CMPXCollectionPath* path = CMPXCollectionPath::NewL(); + CleanupStack::PushL(path); + path->AppendL(KGlxCollectionPluginAlbumsImplementationUid); + path->AppendL(newMediaId.Value()); + CleanupStack::Pop(path); + delete mTargetContainers; + mTargetContainers = NULL; + mTargetContainers = path; + mAlbumName = newTitle; + mNewMediaAdded = true; + } + OstTraceFunctionExit0( GLXCOMMANDHANDLERADDTOCONTAINER_CREATENEWMEDIA_EXIT ); + } + +QString GlxCommandHandlerAddToContainer::CompletionTextL() const + { + if(!mAlbumName.isNull()){ + return (hbTrId(GLX_IMAGES_ADDED).arg(mAlbumName)); + } + return QString(); + } + +QString GlxCommandHandlerAddToContainer::ProgressTextL() const + { + return GLX_ADDING_IMAGES; + }