ui/commandhandlers/commoncommandhandlers/src/glxcommandhandleraddtocontainer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Mar 2010 09:28:59 +0200
changeset 23 74c9f037fd5d
child 24 99ad1390cd33
permissions -rw-r--r--
Revision: 201007 Kit: 201011

/*
* 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 <mpxcollectionpath.h>
#include <mglxmedialist.h>
#include <glxcommandfactory.h>
#include <glxcommandhandleraddtocontainer.h>
#include <glxcommandhandlernewmedia.h>

#include <QStringListModel>
#include <hblabel.h>
#include <hbaction.h>

#include <glxalbummodel.h>
#include <glxcollectionpluginalbums.hrh>
#include <glxmodelparm.h>
#include <QDebug>
#include <glxfilterfactory.h>


#include <hblistwidget.h>
#include <hbview.h>
#include <hbpushbutton.h>
#include <QGraphicsGridLayout>
#include <hbdialog.h>

TInt GlxCommandHandlerAddToContainer::iSelectionCount = 0;

const TInt KSelectionPopupListHierarchy = 5;

GlxQueryContentWidget::GlxQueryContentWidget(QGraphicsItem* parent):QGraphicsWidget(parent),
						mButton(0), mListView(0), mGrid(0)
{
    mGrid = new QGraphicsGridLayout;
    mGrid->setContentsMargins(0,0,0,0);
    
    mButton = new HbPushButton("New Item");      
    mListView = new HbListView(this);
    mListView->setSelectionMode(HbAbstractItemView::MultiSelection);
    mListView->setMinimumSize(QSize(360, 180));
    mListView->setMaximumSize(QSize(360, 180));

    mGrid->addItem(mButton, 0,0);
    mGrid->addItem(mListView, 1,0);
    setLayout(mGrid); //ownership transfered
    
    setPreferredWidth(360);
}

GlxQueryContentWidget::~GlxQueryContentWidget()
{
    qDebug("GlxQueryContentWidget::~GlxQueryContentWidget() ");
    delete mListView;
    delete mButton;
    qDebug("GlxQueryContentWidget::~GlxQueryContentWidget() exit");
}

GlxCommandHandlerAddToContainer::GlxCommandHandlerAddToContainer():mNewMediaAdded(false)
{
    mTargetContainers = NULL;
    qDebug("GlxCommandHandlerAddToContainer::GlxCommandHandlerAddToContainer() ");
}

GlxCommandHandlerAddToContainer::~GlxCommandHandlerAddToContainer()
{
    delete mTargetContainers;
    qDebug("GlxCommandHandlerAddToContainer::~GlxCommandHandlerAddToContainer() ");
}

CMPXCommand* GlxCommandHandlerAddToContainer::CreateCommandL(TInt aCommandId, MGlxMediaList& aMediaList, TBool& aConsume) const 
{
    qDebug("GlxCommandHandlerAddToContainer::CreateCommandL");
    iSelectionCount = 0;

    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 );
    
    //QModelIndexList selectedModelIndexes;
    QModelIndexList modelList = GetSelectionList(albumMediaModel,&ok);
    
    CMPXCommand* command = NULL;
    qDebug("GlxCommandHandlerAddToContainer::CreateCommandL OK %d new media added %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;
        }
        
        command = TGlxCommandFactory::AddToContainerCommandLC(*sourceItems, *mTargetContainers);
        CleanupStack::Pop(command); 
        mNewMediaAdded = false;
    }

    MGlxMediaList::UnmarkAllL(*targetMediaList);
    targetMediaList->Close();
    CleanupStack::PopAndDestroy(sourceItems);
    delete albumMediaModel;
    return command;
}

QModelIndexList GlxCommandHandlerAddToContainer::GetSelectionList(GlxAlbumModel *model,bool *ok) const
{
    // Create a popup
    HbDialog popup;

    // Set dismiss policy that determines what tap events will cause the popup
    // to be dismissed
    popup.setDismissPolicy(HbDialog::NoDismiss);

    // Set timeout to zero to wait user to either click Ok or Cancel
    popup.setTimeout(HbDialog::NoTimeout);
    popup.setHeadingWidget(new HbLabel("Selection List"));

    GlxQueryContentWidget* view = new GlxQueryContentWidget();
    view->mListView->setModel(model);
    
    qDebug("GlxCommandHandlerAddToContainer::GetSelectionList model setting done row count %d",model->rowCount() );
    connect(view->mButton, SIGNAL(released ()), &popup, SLOT(close()));
    connect(view->mButton, SIGNAL(released ()), this, SLOT(createNewMedia()));

    HbAction *primary = new HbAction("OK"); 
    popup.setPrimaryAction(primary);

    HbAction *secondary = new HbAction("Cancel"); 
    popup.setSecondaryAction(secondary);
    
    popup.setContentWidget(view); //ownership transfer
    qDebug("GlxCommandHandlerAddToContainer::GetSelectionList after popup.setContentWidget ");
    view->mListView->show();
    QModelIndexList selectedIndexes;
    
    do {
        HbAction* action = popup.exec();
        if(action == popup.primaryAction()){
            *ok = true;
        }
        else {
            *ok = false;
        }
        
        qDebug("GlxCommandHandlerAddToContainer::GetSelectionList after exec user action %d ", *ok);
    
        if( *ok ) {
            GlxQueryContentWidget* cWidget = qobject_cast<GlxQueryContentWidget*>(popup.contentWidget());
            QItemSelectionModel* selModel = cWidget->mListView->selectionModel();
            qDebug("GlxCommandHandlerAddToContainer::GetSelectionList selection model %d", selModel);
            selectedIndexes = selModel->selectedIndexes();
        }
    }  while ( *ok && selectedIndexes.count() == 0); //continue until user select one album list or new item

    delete primary;
    delete secondary;
    qDebug("GlxCommandHandlerAddToContainer::GetSelectionList exit ");  
    
    return selectedIndexes;
}

void GlxCommandHandlerAddToContainer::createNewMedia()
{
    qDebug("GlxCommandHandlerAddToContainer::createNewMedia ");
    GlxCommandHandlerNewMedia* commandHandlerNewMedia = new GlxCommandHandlerNewMedia();
    TGlxMediaId newMediaId;
    TInt error  = commandHandlerNewMedia->ExecuteLD(newMediaId);
    
    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;
        mNewMediaAdded = true;
    }
}