mpviewplugins/mpcollectionviewplugin/src/mpcollectionpopuphandler.cpp
changeset 37 eb79a7c355bf
parent 35 fdb31ab341af
child 43 0f32e550d9d8
--- a/mpviewplugins/mpcollectionviewplugin/src/mpcollectionpopuphandler.cpp	Fri May 28 19:46:01 2010 -0500
+++ b/mpviewplugins/mpcollectionviewplugin/src/mpcollectionpopuphandler.cpp	Fri Jun 11 19:36:32 2010 -0500
@@ -19,6 +19,7 @@
 #include <hbaction.h>
 #include <hbmenu.h>
 #include <hbmessagebox.h>
+#include <hbprogressdialog.h>
 #include <hbselectiondialog.h>
 #include <hbinputdialog.h>
 #include <hblabel.h>
@@ -30,11 +31,109 @@
 #include "mpmpxcollectiondata.h"
 #include "mpcollectiondatamodel.h"
 #include "mpcollectiontbonelistdatamodel.h"
-#include "mpmpxcollectionviewdefs.h"
 #include "mpcollectionpopuphandler.h"
 #include "mptrace.h"
 
 const int KNullIndex = -1;
+const int KSongsToDisplayProgressDlg = 100;
+
+// Popups launched by this class
+const QString KContextMenu = QString( "ContextMenu" );
+const QString KProgressDialog = QString( "ProgressDialog" );
+const QString KAddToPlaylistSelectionDialog = QString( "AddToPlaylistSelectionDialog" );
+const QString KInputTextDialog = QString( "InputTextDialog" );
+const QString KGetModelIndexesListDialog = QString( "GetModelIndexesListDialog" );
+const QString KArrangeSongsDialog = QString( "ArrangeSongsDialog" );
+const QString KRequestDeleteMessageBox = QString( "RequestDeleteMessageBox" );
+
+// Popups Actions
+const QString KOk = QString( "Ok" );
+const QString KCancel = QString( "Cancel" );
+const QString KNew = QString( "New" );
+const QString KOpen = QString( "Open" );
+const QString KAdd = QString( "Add" );
+const QString KDelete = QString( "Delete" );
+const QString KRenamePlayList = QString( "RenamePlayList" );
+
+
+//------------------------------------------------------------------
+//    MpPopupHandlerPermanentData
+//------------------------------------------------------------------
+
+/*!
+    \class MpPopupHandlerPermanentData. This class is used by MpCollectionPopupHandler to
+    store permanent data needed during asynchronous popups operation.
+
+*/
+
+class MpPopupHandlerPermanentData : public QObject
+{
+    public:
+        MpPopupHandlerPermanentData( QObject *parent=0 );
+        virtual ~MpPopupHandlerPermanentData();
+        void clear();
+    public:
+        MpMpxCollectionData         *mIsolatedCollectionData;        // Not own
+        QAbstractItemModel          *mAbstractItemModel;             // Own
+        QList<int>                  mSelectedItems;
+        QString                     mOriginalName;
+        int                         mContextMenuIndex;
+};
+
+/*!
+ Constructs the popup handler permanent data.
+ */
+MpPopupHandlerPermanentData::MpPopupHandlerPermanentData( QObject *parent )
+    : QObject( parent ),
+      mIsolatedCollectionData( 0 ),
+      mAbstractItemModel( 0 ),
+      mContextMenuIndex( KNullIndex )
+{
+      TX_ENTRY
+      mSelectedItems.clear();
+      mOriginalName.clear();
+      TX_EXIT
+}
+
+/*!
+ Destructs the popup handler permanent data.
+ */
+MpPopupHandlerPermanentData::~MpPopupHandlerPermanentData()
+{
+    TX_ENTRY
+    clear();
+    TX_EXIT
+}
+
+/*!
+ \internal
+  Clears all permanent data. 
+ */
+void MpPopupHandlerPermanentData::clear()
+{
+    TX_ENTRY
+    mSelectedItems.clear();
+    mOriginalName.clear();
+    mContextMenuIndex = KNullIndex;
+    if ( mIsolatedCollectionData ) {
+        MpEngineFactory::sharedEngine()->releaseIsolatedCollection();
+        mIsolatedCollectionData = 0;
+    }
+    if ( mAbstractItemModel ) {
+        delete mAbstractItemModel;
+        mAbstractItemModel = 0;
+    }
+    //clearing any child Objects.
+    foreach (QObject* child, children()) {
+        child->deleteLater();
+    }
+    TX_EXIT
+}
+
+
+//------------------------------------------------------------------
+//    MpCollectionPopupHandler
+//------------------------------------------------------------------
 
 /*!
     \class MpCollectionPopupHandler
@@ -52,7 +151,8 @@
       mView( parent ),
       mOutstandingPopup( 0 ),
       mMpEngine( 0 ),
-      mPermanentData( 0 )
+      mPermanentData( 0 ),
+      mExternalEventsConnected( false )
 {
     TX_ENTRY
     mMpEngine = MpEngineFactory::sharedEngine();
@@ -76,77 +176,76 @@
 void MpCollectionPopupHandler::openDefaultViewContextMenu( int index, const QPointF &coords )
 {
     TX_ENTRY
-    HbMenu *contextMenu = 0;
-    HbAction *action;
-    bool usbBlocked = mMpEngine->verifyUsbBlocking();
+
+    if ( mView->isActivated() ) {
+
+        HbMenu *contextMenu = 0;
+        HbAction *action;
+        bool usbBlocked = mMpEngine->verifyUsbBlocking();
 
-    switch ( mMpEngine->collectionData()->context() ) {
-        case ECollectionContextAllSongs:
-        case ECollectionContextArtistAllSongs:
-        case ECollectionContextArtistAlbumsTBone:
-        case ECollectionContextAlbumsTBone:
-            contextMenu = new HbMenu();
-            action = contextMenu->addAction( hbTrId( "txt_common_menu_play_music" ) );
-            action->setObjectName( "open" );
-            action = contextMenu->addAction( hbTrId( "txt_mus_menu_add_to_playlist" ) );
-            action->setObjectName( "add" );
-            action->setEnabled( !usbBlocked );
-            action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) );
-            action->setObjectName( "delete" );
-            action->setEnabled( !usbBlocked );
-            break;
-        case ECollectionContextAlbums:
-        case ECollectionContextArtists:
-        case ECollectionContextArtistAlbums:
-            contextMenu = new HbMenu();
-            action = contextMenu->addAction( hbTrId( "txt_common_menu_open" ) );
-            action->setObjectName( "open" );
-            action = contextMenu->addAction( hbTrId( "txt_mus_menu_add_to_playlist" ) );
-            action->setObjectName( "add" );
-            action->setEnabled( !usbBlocked );
-            action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) );
-            action->setObjectName( "delete" );
-            action->setEnabled( !usbBlocked );
-            break;
-        case ECollectionContextPlaylists:
-            if ( !mMpEngine->collectionData()->isAutoPlaylist( index ) ) {
+        switch ( mMpEngine->collectionData()->context() ) {
+            case ECollectionContextAllSongs:
+            case ECollectionContextArtistAllSongs:
+            case ECollectionContextArtistAlbumsTBone:
+            case ECollectionContextAlbumsTBone:
+                contextMenu = new HbMenu();
+                action = contextMenu->addAction( hbTrId( "txt_common_menu_play_music" ) );
+                action->setObjectName( KOpen );
+                action = contextMenu->addAction( hbTrId( "txt_mus_menu_add_to_playlist" ) );
+                action->setObjectName( KAdd );
+                action->setEnabled( !usbBlocked );
+                action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) );
+                action->setObjectName( KDelete );
+                action->setEnabled( !usbBlocked );
+                break;
+            case ECollectionContextAlbums:
+            case ECollectionContextArtists:
+            case ECollectionContextArtistAlbums:
                 contextMenu = new HbMenu();
                 action = contextMenu->addAction( hbTrId( "txt_common_menu_open" ) );
-                action->setObjectName( "open" );
+                action->setObjectName( KOpen );
+                action = contextMenu->addAction( hbTrId( "txt_mus_menu_add_to_playlist" ) );
+                action->setObjectName( KAdd );
+                action->setEnabled( !usbBlocked );
                 action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) );
-                action->setObjectName("delete");
-                action->setEnabled( !usbBlocked );
-                action = contextMenu->addAction( hbTrId( "txt_common_menu_rename_item" ) );
-                action->setObjectName( "rename playlist" );
+                action->setObjectName( KDelete );
                 action->setEnabled( !usbBlocked );
-            }
-            break;
-        case ECollectionContextPlaylistSongs:
-            if ( !mMpEngine->collectionData()->isAutoPlaylist() ) {
-                contextMenu = new HbMenu();
-                action = contextMenu->addAction( hbTrId( "txt_common_menu_play_music" ) );
-                action->setObjectName( "open" );
-                action = contextMenu->addAction( hbTrId( "txt_common_menu_remove" ) );
-                action->setObjectName( "delete" );
-                action->setEnabled( !usbBlocked );
-            }
-            break;
-        default:
-            break;
-    }
+                break;
+            case ECollectionContextPlaylists:
+                if ( !mMpEngine->collectionData()->isAutoPlaylist( index ) ) {
+                    contextMenu = new HbMenu();
+                    action = contextMenu->addAction( hbTrId( "txt_common_menu_open" ) );
+                    action->setObjectName( KOpen );
+                    action = contextMenu->addAction( hbTrId( "txt_common_menu_delete" ) );
+                    action->setObjectName(KDelete);
+                    action->setEnabled( !usbBlocked );
+                    action = contextMenu->addAction( hbTrId( "txt_common_menu_rename_item" ) );
+                    action->setObjectName( KRenamePlayList );
+                    action->setEnabled( !usbBlocked );
+                }
+                break;
+            case ECollectionContextPlaylistSongs:
+                if ( !mMpEngine->collectionData()->isAutoPlaylist() ) {
+                    contextMenu = new HbMenu();
+                    action = contextMenu->addAction( hbTrId( "txt_common_menu_play_music" ) );
+                    action->setObjectName( KOpen );
+                    action = contextMenu->addAction( hbTrId( "txt_common_menu_remove" ) );
+                    action->setObjectName( KDelete );
+                    action->setEnabled( !usbBlocked );
+                }
+                break;
+            default:
+                break;
+        }
 
-    if ( contextMenu ) {
-        if ( mView->isActivated() ) {
+        if ( contextMenu ) {
             mPermanentData->mContextMenuIndex = index;
             contextMenu->setPreferredPos( coords );
+            contextMenu->setObjectName( KContextMenu );
             contextMenu->setAttribute( Qt::WA_DeleteOnClose );
             setOutstandingPopup( contextMenu );
             contextMenu->open( this, SLOT( defaultContextMenuOptionSelected( HbAction* ) ) );
         }
-        else {
-            delete contextMenu;
-            contextMenu = 0;
-        }
     }
 
     TX_EXIT
@@ -159,34 +258,32 @@
 {
     TX_ENTRY_ARGS( "index=" << index );
 
-    HbAction *action;
-    HbMenu *contextMenu = 0;
+    if ( mView->isActivated() ) {
+
+        HbAction *action;
+        HbMenu *contextMenu = 0;
 
-    switch ( mMpEngine->collectionData()->context() ) {
-        case ECollectionContextAllSongs:
-        case ECollectionContextArtistAlbumsTBone:
-        case ECollectionContextArtistAllSongs:
-        case ECollectionContextAlbumsTBone:
-        case ECollectionContextPlaylistSongs:
-            contextMenu = new HbMenu();
-            action = contextMenu->addAction( hbTrId("txt_common_menu_play_music") );
-            action->setEnabled( !mMpEngine->verifyUsbBlocking() );
-            break;
-        default:
-            break;
-    }
+        switch ( mMpEngine->collectionData()->context() ) {
+            case ECollectionContextAllSongs:
+            case ECollectionContextArtistAlbumsTBone:
+            case ECollectionContextArtistAllSongs:
+            case ECollectionContextAlbumsTBone:
+            case ECollectionContextPlaylistSongs:
+                contextMenu = new HbMenu();
+                action = contextMenu->addAction( hbTrId("txt_common_menu_play_music") );
+                action->setEnabled( !mMpEngine->verifyUsbBlocking() );
+                break;
+            default:
+                break;
+        }
 
-    if ( contextMenu ) {
-        if ( mView->isActivated() ) {
+        if ( contextMenu ) {
             mPermanentData->mContextMenuIndex = index;
             contextMenu->setPreferredPos( coords );
             contextMenu->setAttribute( Qt::WA_DeleteOnClose );
+            contextMenu->setObjectName( KContextMenu );
             setOutstandingPopup( contextMenu );
-            contextMenu->open( this, SLOT( fetcherContextMenuOptionSelected( HbAction* ) ) );        
-        }
-        else {
-            delete contextMenu;
-            contextMenu = 0;
+            contextMenu->open( this, SLOT( fetcherContextMenuOptionSelected( HbAction* ) ) );
         }
     }
 
@@ -236,7 +333,7 @@
     TX_ENTRY
     MpCollectionTBoneListDataModel *model;
     model = new MpCollectionTBoneListDataModel( mMpEngine->collectionData() );
-	//this item will be deleted when clearing permanent data.
+    //this item will be deleted when clearing permanent data.
     model->setParent(mPermanentData);
     model->refreshModel();
     getModelIndexes( hbTrId( "txt_mus_title_select_songs" ), model,
@@ -303,33 +400,31 @@
 /*!
  Closes any active popup
  */
-void MpCollectionPopupHandler::cancelOngoingPopup()
+void MpCollectionPopupHandler::cancelOngoingPopup( bool onlyContextMenu )
 {
-    TX_ENTRY    
+    TX_ENTRY
     if ( mOutstandingPopup ) {
-         mOutstandingPopup->close();
-         
-         //Delete/Clear permanent data until current popup gets deleted
-         mPermanentData->setParent( mOutstandingPopup );
-         //Generate new permanent data for future popups
-         mPermanentData = new MpPopupHandlerPermanentData( this );
+        if ( onlyContextMenu ) {
+            if ( mOutstandingPopup->objectName() == KContextMenu ) {
+                mOutstandingPopup->close();
+                mPermanentData->clear();
+            }
+        }
+        else {
+            mOutstandingPopup->close();
+            //Delete/Clear permanent data until current popup gets deleted
+            mPermanentData->setParent( mOutstandingPopup );
+            //Generate new permanent data for future popups
+            mPermanentData = new MpPopupHandlerPermanentData( this );
+        }
     }
     else {
         mPermanentData->clear();
     }
-
     TX_EXIT
 }
 
 /*!
- TODO: Workaround for HbListView multiple events: longPress and activated. Remove once HbListView get fixed (wk16)
- */
-bool MpCollectionPopupHandler::showingPopup()
-{
-    return mOutstandingPopup;
-}
-
-/*!
  Slot to be called when an option has been selected from default context menu.
  */
 void MpCollectionPopupHandler::defaultContextMenuOptionSelected( HbAction *selectedAction )
@@ -339,16 +434,16 @@
         QString objectName = selectedAction->objectName();
         QList<int> selection;
         selection.append( mPermanentData->mContextMenuIndex );
-        if ( objectName == "open" ) {
+        if ( objectName == KOpen ) {
             mView->openItem( mPermanentData->mContextMenuIndex );
         }
-        if ( objectName == "add" ) {
+        if ( objectName == KAdd ) {
             launchAddToPlaylistDialog( selection );
         }
-        else if ( objectName == "delete" ) {
+        else if ( objectName == KDelete ) {
             requestDelete( selection );
         }
-        else if ( objectName == "rename playlist" ) {
+        else if ( objectName == KRenamePlayList ) {
             QString currentName;
             currentName = mMpEngine->collectionData()->itemData( 
                     mPermanentData->mContextMenuIndex, MpMpxCollectionData::Title );
@@ -383,7 +478,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "new" ) {
+        if ( objectName == KNew ) {
             QStringList playlists;
             mMpEngine->findPlaylists( playlists );
             queryNewPlaylistName( playlists, SLOT( handleAddToPlaylistGetTextFinished( HbAction* ) ) );
@@ -413,7 +508,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             QString newPlaylistName = dialog->value().toString();
             if ( newPlaylistName.length() ) {
                 //Create new playlist with given name
@@ -456,7 +551,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             QString newPlaylistName = dialog->value().toString();
             if ( newPlaylistName.length() ) {
                 if ( newPlaylistName != mPermanentData->mOriginalName ) {
@@ -490,7 +585,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             QString newPlaylistName = dialog->value().toString();
             if ( newPlaylistName.length() ) {
                 if ( newPlaylistName != mPermanentData->mOriginalName ) {
@@ -523,7 +618,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             QModelIndexList selectedModelIndexes;
             selectedModelIndexes = dialog->selectedModelIndexes();
             if ( selectedModelIndexes.count() ) {
@@ -556,7 +651,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             QModelIndexList selectedModelIndexes;
             selectedModelIndexes = dialog->selectedModelIndexes();
             if ( selectedModelIndexes.count() ) {
@@ -586,7 +681,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             QModelIndexList selectedModelIndexes;
             selectedModelIndexes = dialog->selectedModelIndexes();
             if ( selectedModelIndexes.count() ) {
@@ -621,7 +716,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             QString newPlaylistName = dialog->value().toString();
             if ( newPlaylistName.length() ) {
                 //Store the new playlist name and query for the items to be added
@@ -656,7 +751,7 @@
 
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             QList<int> selection;
             QModelIndexList selectedModelIndexes;
             selectedModelIndexes = dialog->selectedModelIndexes();
@@ -706,7 +801,7 @@
     
     if ( selectedAction ) {
         QString objectName = selectedAction->objectName();
-        if ( objectName == "ok" ) {
+        if ( objectName == KOk ) {
             mMpEngine->deleteSongs( mPermanentData->mSelectedItems );
         }
         selectedAction->setEnabled( false );
@@ -718,6 +813,59 @@
 }
 
 /*!
+ Slot called upon notification from MpEngine indicating start of
+ deleting process.
+ */
+void MpCollectionPopupHandler::handleDeleteStarted( TCollectionContext context, int count )
+{
+    TX_ENTRY
+    if ( context == ECollectionContextPlaylistSongs ) {
+        if (count >= KSongsToDisplayProgressDlg) {  //show progress dialog if removing more than 100 songs
+            launchProgressDialog( "txt_mus_info_removing_songs" );
+        }
+    }
+    else if (context != ECollectionContextPlaylists ) {  //no progress dialog for delete playlist
+        launchProgressDialog( "txt_mus_info_deleting" );
+    }
+    TX_EXIT
+}
+
+/*!
+ Slot called upon notification from MpEngine indicating 'count' songs are going to be added.
+ */
+void MpCollectionPopupHandler::handleAddingSongs( int count )
+{
+    TX_ENTRY
+    if ( count >= KSongsToDisplayProgressDlg )
+    {
+        HbProgressDialog *addSongsWaitNote = new HbProgressDialog( HbProgressDialog::WaitDialog );
+        connect( addSongsWaitNote, SIGNAL( cancelled() ), mMpEngine, SLOT( cancelCollectionRequest() ) );
+        addSongsWaitNote->setModal( true );
+        addSongsWaitNote->setText( hbTrId( "txt_mus_info_adding_songs" ) );
+        addSongsWaitNote->setObjectName( KProgressDialog );
+        addSongsWaitNote->setAttribute( Qt::WA_DeleteOnClose );
+        setOutstandingPopup( addSongsWaitNote );
+        addSongsWaitNote->show();
+    }
+    TX_EXIT
+}
+
+/*!
+ Slot called upon notification from MpEngine indicating end of
+ deleting or adding process.
+ */
+void MpCollectionPopupHandler::handleOperationEnded( bool success )
+{
+    TX_ENTRY
+    Q_UNUSED( success );
+    if ( mOutstandingPopup && ( mOutstandingPopup->objectName() == KProgressDialog ) ) {
+        HbProgressDialog *dialog = qobject_cast<HbProgressDialog *>( mOutstandingPopup );
+        dialog->cancel();
+    }
+    TX_EXIT
+}
+
+/*!
  Slot to be called when a popup is getting closed. Usefull when a dialog is closed before it finishes
  (dialog not closed by a direct user action).
  */
@@ -768,11 +916,7 @@
 void MpCollectionPopupHandler::launchAddToPlaylistDialog( QList<int> &selection )
 {
     TX_ENTRY
-    if (!mView->isActivated()) {
-        mPermanentData->clear();
-        return;
-    }
- 
+
     QStringList playlists;
     mPermanentData->mSelectedItems = selection;
     mMpEngine->findPlaylists( playlists );
@@ -785,11 +929,12 @@
         dialog->setHeadingWidget(new HbLabel( hbTrId( "txt_mus_title_select_playlist" ) ) );
         dialog->clearActions();
         action = new HbAction( hbTrId( "txt_mus_button_new" ) );
-        action->setObjectName( "new" );
+        action->setObjectName( KNew );
         dialog->addAction( action );
         action = new HbAction( hbTrId( "txt_common_button_cancel" ) );
-        action->setObjectName( "cancel" );
+        action->setObjectName( KCancel );
         dialog->addAction( action );
+        dialog->setObjectName( KAddToPlaylistSelectionDialog );
         dialog->setAttribute( Qt::WA_DeleteOnClose );
         setOutstandingPopup( dialog );
         dialog->open( this, SLOT( handleAddToPlaylistDialogFinished( HbAction* ) ) );
@@ -831,11 +976,6 @@
                                         const char *handler )
 {
     TX_ENTRY
-    if ( !mView->isActivated() ) {
-        mPermanentData->clear();
-        return;
-    }
-
     HbAction *action;
     HbInputDialog *dialog = new HbInputDialog();
     dialog->setPromptText( label );
@@ -843,11 +983,12 @@
     dialog->setValue( text );
     dialog->clearActions();
     action = new HbAction( hbTrId( "txt_common_button_ok" ) );
-    action->setObjectName( "ok" );
+    action->setObjectName( KOk );
     dialog->addAction( action );
     action = new HbAction( hbTrId( "txt_common_button_cancel" ) );
-    action->setObjectName( "cancel" );
+    action->setObjectName( KCancel );
     dialog->addAction( action );
+    dialog->setObjectName( KInputTextDialog );
     dialog->setAttribute( Qt::WA_DeleteOnClose );
     setOutstandingPopup( dialog );
     dialog->open( this, handler );
@@ -866,10 +1007,7 @@
 {   
     TX_ENTRY
 
-    if ( !mView->isActivated() ) {
-        mPermanentData->clear();
-        return;
-    }
+    connectExternalEvents();
 
     HbAction *action;
     HbSelectionDialog *dialog = new HbSelectionDialog();
@@ -878,11 +1016,12 @@
     dialog->setModel( model );
     dialog->clearActions();
     action = new HbAction( hbTrId( "txt_common_button_ok" ) );
-    action->setObjectName( "ok" );
+    action->setObjectName( KOk );
     dialog->addAction( action );
     action = new HbAction( hbTrId( "txt_common_button_cancel" ) );
-    action->setObjectName( "cancel" );
+    action->setObjectName( KCancel );
     dialog->addAction( action );
+    dialog->setObjectName( KGetModelIndexesListDialog );
     dialog->setAttribute( Qt::WA_DeleteOnClose );
     setOutstandingPopup( dialog );
     dialog->open( this, handler );
@@ -898,10 +1037,6 @@
 {   
     TX_ENTRY
 
-    if ( !mView->isActivated() ) {
-        return;
-    }
-
     HbListView *listView = new HbListView();
     listView->setItemRecycling( true );
     listView->setScrollingStyle( HbListView::PanOrFlick );
@@ -931,6 +1066,7 @@
     HbAction *action;
     action = new HbAction( hbTrId( "txt_common_button_ok" ) );
     dialog->addAction( action );
+    dialog->setObjectName( KArrangeSongsDialog );
     dialog->setAttribute( Qt::WA_DeleteOnClose );
     setOutstandingPopup(dialog);
     dialog->open( this, SLOT( handleArrangeSongs( HbAction* ) ) );
@@ -949,6 +1085,7 @@
     QString message;
     mPermanentData->mSelectedItems = selection;
     bool needsConfirmation = true;
+    connectExternalEvents();
 
     switch ( mMpEngine->collectionData()->context() ) {
         case ECollectionContextAllSongs:
@@ -982,11 +1119,6 @@
     }
 
     if ( needsConfirmation ) {
-        if ( !mView->isActivated() ) {
-            mPermanentData->clear();
-            return;
-        }
-
         HbAction *action;
         HbMessageBox *dialog = new HbMessageBox( HbMessageBox::MessageTypeQuestion );
 
@@ -994,11 +1126,12 @@
         dialog->setTimeout( HbPopup::NoTimeout );
         dialog->clearActions();
         action = new HbAction( hbTrId( "txt_common_button_yes" ) );
-        action->setObjectName( "ok" );
+        action->setObjectName( KOk );
         dialog->addAction( action );
         action = new HbAction( hbTrId( "txt_common_button_no" ) );
-        action->setObjectName( "cancel" );
+        action->setObjectName( KCancel );
         dialog->addAction( action );
+        dialog->setObjectName( KRequestDeleteMessageBox );
         dialog->setAttribute( Qt::WA_DeleteOnClose );
         setOutstandingPopup( dialog );
         dialog->open( this, SLOT( handleRequestDelete( HbAction* ) ) );
@@ -1007,56 +1140,37 @@
     TX_EXIT
 }
 
-
-//------------------------------------------------------------------
-//    MpPopupHandlerPermanentData
-//------------------------------------------------------------------
 /*!
- Constructs the popup handler permanent data.
+ \internal
+ Launches a waiting progress note.
+ \a content String id to display in the dialog.
  */
-MpCollectionPopupHandler::MpPopupHandlerPermanentData::MpPopupHandlerPermanentData( QObject *parent )
-    : QObject( parent ),
-      mIsolatedCollectionData( 0 ),
-      mAbstractItemModel( 0 ),
-      mContextMenuIndex( KNullIndex )
+void MpCollectionPopupHandler::launchProgressDialog( const char *id )
 {
-      TX_ENTRY
-      mSelectedItems.clear();
-      mOriginalName.clear();
-      TX_EXIT
-}
-
-/*!
- Destructs the popup handler permanent data.
- */
-MpCollectionPopupHandler::MpPopupHandlerPermanentData::~MpPopupHandlerPermanentData()
-{
-    TX_ENTRY
-    clear();
-    TX_EXIT
+    HbProgressDialog *deleteProgressNote = new HbProgressDialog( HbProgressDialog::WaitDialog );
+    connect( deleteProgressNote, SIGNAL( cancelled() ), mMpEngine, SLOT( cancelCollectionRequest() ) );
+    deleteProgressNote->setModal( true );
+    deleteProgressNote->setDismissPolicy( HbPopup::NoDismiss );
+    deleteProgressNote->setText( hbTrId( id ) );
+    deleteProgressNote->setObjectName( KProgressDialog );
+    deleteProgressNote->setAttribute( Qt::WA_DeleteOnClose );
+    setOutstandingPopup( deleteProgressNote );
+    deleteProgressNote->show();
 }
 
 /*!
  \internal
-  Clears all permanent data. 
- */
-void MpCollectionPopupHandler::MpPopupHandlerPermanentData::clear()
+ Connects MpEngine signals on demand in order to save time at start up.
+  */
+void MpCollectionPopupHandler::connectExternalEvents()
 {
-    TX_ENTRY
-    mSelectedItems.clear();
-    mOriginalName.clear();
-    mContextMenuIndex = KNullIndex;
-    if ( mIsolatedCollectionData ) {
-        MpEngineFactory::sharedEngine()->releaseIsolatedCollection();
-        mIsolatedCollectionData = 0;
+    if ( !mExternalEventsConnected ) {
+        connect( mMpEngine, SIGNAL( deleteStarted( TCollectionContext, int ) ),
+                this, SLOT( handleDeleteStarted( TCollectionContext, int ) ) );
+        connect( mMpEngine, SIGNAL( songsDeleted( bool ) ), this, SLOT( handleOperationEnded( bool ) ) );
+        connect( mMpEngine, SIGNAL( aboutToAddSongs( int ) ), this, SLOT( handleAddingSongs( int ) ) );
+        connect( mMpEngine, SIGNAL( playlistSaved( bool ) ), this, SLOT( handleOperationEnded( bool ) ) );
+        mExternalEventsConnected = true;
     }
-    if ( mAbstractItemModel ) {
-        delete mAbstractItemModel;
-        mAbstractItemModel = 0;
-    }
-    //clearing any child Objects.
-    foreach (QObject* child, children()) {
-        child->deleteLater();
-    }
-    TX_EXIT
 }
+