mpxplugins/viewplugins/views/collectionview/src/mpxcollectionviewcontainer.cpp
changeset 0 ff3acec5bc43
child 21 a1247965635c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxplugins/viewplugins/views/collectionview/src/mpxcollectionviewcontainer.cpp	Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,524 @@
+/*
+* Copyright (c) 2006 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:  Implementation of Collection view container
+*
+*/
+
+
+// INCLUDE FILES
+#include <hlplch.h>
+#include <aknappui.h>
+#include <akncontext.h>
+#include <AknsUtils.h>  // AknsUtils
+#include <AknUtils.h>
+#include <data_caging_path_literals.hrh>
+#include <eikspane.h>
+#include <eiktxlbx.h>
+#include <mpxcollectionview.mbg>
+#include <mpxplaybackframeworkdefs.h>
+#include <mpxmediageneraldefs.h>
+#include <mpxmedia.h>
+#include <mpxconstants.h>
+#include <mpxlog.h>
+#include <eikon.hrh>
+#include <mpxuser.h>
+
+#include "mpxcollectionview.hrh"
+#include "mpxcollectionviewlistboxarray.h"
+#include "mpxcollectionview.hlp.hrh"
+#include "mpxcollectionviewcontainer.h"
+
+// CONSTANTS
+_LIT( KMPXCollectionViewIconFile, "mpxcollectionview.mbm" );
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMPXCollectionViewContainer* CMPXCollectionViewContainer::NewL(
+    MEikCommandObserver* aView,
+    MEikListBoxObserver* aObserver,
+    TBool aIsEmbedded)
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::NewL" );
+    CMPXCollectionViewContainer* self =
+        new ( ELeave ) CMPXCollectionViewContainer(aView, aObserver, aIsEmbedded);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// C++ constructor can NOT contain any code that might leave.
+// ---------------------------------------------------------------------------
+//
+CMPXCollectionViewContainer::CMPXCollectionViewContainer(
+    MEikCommandObserver* aView,
+    MEikListBoxObserver* aObserver,
+    TBool aIsEmbedded) 
+    : iView( aView )
+    , iListBoxObserver( aObserver )
+    , iReady( EFalse )
+    , iIsEmbedded(aIsEmbedded)    
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMPXCollectionViewContainer::~CMPXCollectionViewContainer()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::~CMPXCollectionViewContainer" );
+    delete iCommonContainer;
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::ConstructL()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::ConstructL" );
+    iCommonContainer = CMPXCommonContainerFactory::NewL();
+    iCommonContainer->SetViewContainer( this );
+    iCommonContainer->SetCommandObserver( iView );
+    iCommonContainer->SetListBoxObserver( iListBoxObserver );
+    iCommonContainer->ConstructContainerL( MMPXCommonContainer::EMPXCommonContainerMusic );
+    iLbxArray = static_cast<CMPXCollectionViewListBoxArray*>(
+        CreateListBoxArrayL() );
+    iCommonContainer->SetListBoxArrayL( iLbxArray );
+    iCommonContainer->HandleListBoxArrayEventL(
+        MMPXCommonListBoxArrayObserver::EMPXCommonListBoxArrayEventIconArrayChange );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets playback status
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::SetPlaybackStatusByIdL(
+    TMPXItemId aId, TMPXPlaybackState aStatus, TInt aIndex)
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::SetPlaybackStatusByIdL" );
+    if ( iLbxArray && iCommonContainer )
+        {
+        TInt index( iLbxArray->SetPlaybackStatusByIdL( aId, aStatus, aIndex ) );
+        if ( index != KErrNotFound )
+            {
+            // Update the previous item as not playing anymore
+            iCommonContainer->DrawLbxItem( index );
+            }
+        index = iLbxArray->GetPlaybackIndex();
+        if ( index != KErrNotFound )
+            {
+            // Update new item as playing
+            iCommonContainer->DrawLbxItem( index );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Get playback index
+// ---------------------------------------------------------------------------
+//
+TInt CMPXCollectionViewContainer::PlaybackIndex()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::PlaybackIndex" );
+    return ( iLbxArray ? iLbxArray->GetPlaybackIndex() : KErrNotFound );
+    }
+
+// ---------------------------------------------------------------------------
+// Activate reorder mode
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::ActivateReorderMode( TBool aEnable )
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::ActivateReorderMode" );
+    if ( iLbxArray )
+        {
+        iReorder = aEnable;
+        iLbxArray->ActivateReorderMode( iReorder );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Set reorder mode
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::SetReorderGrabbedMode(
+    TBool aEnable, TInt aIndex )
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::SetReorderGrabbedMode" );
+    if ( iLbxArray )
+        {
+        iLbxArray->SetReorderGrabbedMode( aEnable, aIndex );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Determines if it's currently in reorder mode
+// ---------------------------------------------------------------------------
+//
+TBool CMPXCollectionViewContainer::IsInReorderMode()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::IsInReorderMode" );
+    return iReorder;
+    }
+
+// ---------------------------------------------------------------------------
+// Move current reorder index
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::MoveReorderIndex( TInt aDirection )
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::MoveReorderIndex" );
+    if ( iLbxArray )
+        {
+        iLbxArray->MoveReorderIndex( aDirection );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// set current reorder index
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::SetReorderIndex( TInt aIndex )
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::SetReorderIndex" );
+    if ( iLbxArray )
+        {
+        iLbxArray->SetReorderIndex( aIndex );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Confirm reorder
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::ConfirmReorderL()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::ConfirmReorderL" );
+    if ( iLbxArray )
+        {
+        iLbxArray->ConfirmReorderL();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Cancel reorder
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::CancelReorder()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::CancelReorder" );
+    TInt originalIndex( GetOriginalIndex() );
+    if ( iLbxArray )
+        {
+        iLbxArray->CancelReorder();
+        }
+    iCommonContainer->SetLbxCurrentItemIndexAndDraw( originalIndex );
+    }
+
+// ---------------------------------------------------------------------------
+// Gets original index of currently selected item
+// ---------------------------------------------------------------------------
+//
+TInt CMPXCollectionViewContainer::GetOriginalIndex()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::GetOriginalIndex" );
+    TInt index( KErrNotFound );
+    if ( iLbxArray )
+        {
+        index = iLbxArray->GetOriginalIndex();
+        }
+    return index;
+    }
+
+// -----------------------------------------------------------------------------
+// Update Titlepane icon to reorder image
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::UpdateReorderTitleIconL()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::UpdateReorderTitleIconL" );
+    // For status changes
+    CEikStatusPane* sp = iAvkonAppUi->StatusPane();
+    TParse parse;
+    parse.Set( KMPXCollectionViewIconFile, &KDC_APP_RESOURCE_DIR, NULL );
+    TFileName iconFile( parse.FullName() );
+    User::LeaveIfError( MPXUser::CompleteWithDllPath( iconFile ) );
+
+    MAknsSkinInstance* skin( AknsUtils::SkinInstance() );
+
+    CFbsBitmap* bitmap( NULL );
+    CFbsBitmap* mask( NULL );
+
+    AknsUtils::CreateIconLC(
+        skin,
+        KAknsIIDNone,
+        bitmap,
+        mask,
+        iconFile,
+        EMbmMpxcollectionviewQgn_graf_mup_ctx_reordersong,
+        EMbmMpxcollectionviewQgn_graf_mup_ctx_reordersong_mask );
+
+    CEikImage* newIcon = new ( ELeave ) CEikImage();
+    CleanupStack::PushL( newIcon );
+    newIcon->SetPicture( bitmap, mask );
+    newIcon->SetPictureOwnedExternally( EFalse );
+    iContextPane = static_cast<CAknContextPane*>
+        ( sp->ControlL( TUid::Uid( EEikStatusPaneUidContext ) ) );
+    iOrigIcon = iContextPane->SwapPicture( newIcon );
+    CleanupStack::Pop( 3 ); // bitmap, mask, newIcon
+    }
+
+// -----------------------------------------------------------------------------
+// Update Titlepane icon to use original image
+// -----------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::RestoreOriginalTitleIconL()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::RestoreOriginalTitleIconL" );
+    if ( iOrigIcon )
+        {
+        CEikImage* newIcon = iContextPane->SwapPicture( iOrigIcon );
+        delete newIcon;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Creates listbox array
+// -----------------------------------------------------------------------------
+//
+CMPXCommonListBoxArrayBase* CMPXCollectionViewContainer::CreateListBoxArrayL()
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::CreateListBoxArrayL" );
+    CMPXCollectionViewListBoxArray* array = CMPXCollectionViewListBoxArray::NewL();
+    array->ConstructListBoxArrayL();
+    array->SetObserver( this );
+    return array;
+    }
+
+// -----------------------------------------------------------------------------
+// Returns common container
+// -----------------------------------------------------------------------------
+//
+MMPXCommonContainer* CMPXCollectionViewContainer::Common()
+    {
+    ASSERT( iCommonContainer );
+    return iCommonContainer;
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXViewContainer
+// Handles key events.
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CMPXCollectionViewContainer::HandleKeyEventL(
+    const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    ASSERT( iCommonContainer );
+    MPX_DEBUG4( "CMPXCollectionViewContainer::HandleKeyEventL(iCode=%d, iScanCode=%d, aType=%d)",
+        aKeyEvent.iCode, aKeyEvent.iScanCode, aType );
+
+    if ( aKeyEvent.iCode == EKeyUpArrow ||
+        aKeyEvent.iCode == EKeyPrevious )
+        {
+        iView->ProcessCommandL( EMPXCmdUpArrow );
+        }
+    else if ( aKeyEvent.iCode == EKeyDownArrow ||
+            aKeyEvent.iCode == EKeyNext )
+        {
+        iView->ProcessCommandL( EMPXCmdDownArrow );
+        }
+    TKeyResponse response = EKeyWasNotConsumed;
+
+    if( iReady )
+        {
+        const CMPXMedia& containerMedia(
+            iCommonContainer->ListBoxArray()->ContainerMedia() );
+        TMPXGeneralType containerType(
+            containerMedia.ValueTObjectL<TMPXGeneralType>(
+                KMPXMediaGeneralType ) );
+        TMPXGeneralCategory containerCategory(
+            containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+                KMPXMediaGeneralCategory ) );
+
+        // Hashkey mark/unmark works in all song's view and other tracks view,
+        // not on other category views
+        if( containerCategory == EMPXSong ||
+            (( containerCategory == EMPXPlaylist ||
+            containerCategory == EMPXAlbum  ||
+            containerCategory == EMPXGenre ||
+            containerCategory == EMPXComposer ) &&
+            containerType == EMPXItem ) ||
+            aKeyEvent.iScanCode != EStdKeyHash )
+            {
+            response = iCommonContainer->HandleKeyEventL( aKeyEvent, aType );
+            }
+        }
+    else
+        {
+        response = iCommonContainer->HandleKeyEventL( aKeyEvent, aType );
+        MPX_DEBUG2( "CMPXCollectionViewContainer::OfferKeyEventL commoncontainer offerkey res = %d", response);
+        }
+
+    if ( aKeyEvent.iCode == EKeyUpArrow ||
+        aKeyEvent.iCode == EKeyPrevious )
+        {
+        iView->ProcessCommandL( EMPXCmdUpArrowAfterListboxHandled );
+        }
+    else if ( aKeyEvent.iCode == EKeyDownArrow ||
+            aKeyEvent.iCode == EKeyNext )
+        {
+        iView->ProcessCommandL( EMPXCmdDownArrowAfterListboxHandled );
+        }
+    return response;
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXViewContainer
+// Handle the retrieval of the view container's help context.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::HandleHelpContext(
+    TCoeHelpContext& aContext ) const
+    {
+    ASSERT( iCommonContainer );
+    MPX_FUNC( "CMPXCollectionViewContainer::HandleHelpContext" );
+    aContext.iMajor = KAppUidMusicPlayerX;
+
+    const CMPXMedia& containerMedia(
+        iCommonContainer->ListBoxArray()->ContainerMedia() );
+    TMPXGeneralType containerType(
+        containerMedia.ValueTObjectL<TMPXGeneralType>(
+            KMPXMediaGeneralType ) );
+    TMPXGeneralCategory containerCategory(
+        containerMedia.ValueTObjectL<TMPXGeneralCategory>(
+            KMPXMediaGeneralCategory ) );
+    MPX_DEBUG3( "CMPXCollectionViewContainer::HandleHelpContext containertype = %d, containercategory = %d", containerType, containerCategory );
+
+    switch ( containerCategory )
+        {
+        case EMPXCollection:
+            {
+            // music menu view
+            aContext.iContext = KMusHlpLibMainView;
+            break;
+            }
+        case EMPXPlaylist:
+            {
+            if (iIsEmbedded)
+                {
+                aContext.iContext = KMusHlpEmbeddedPlaylistTracksView;
+                }
+            else
+                {            	
+                if ( containerType == EMPXGroup )
+                    {
+                    // playlist view
+                    aContext.iContext = KMusHlpPlaylistView;
+                    }
+                else if ( containerType == EMPXItem )
+                    {
+                    // playlist tracks view
+                    aContext.iContext = KMusHlpPlaylistTracksView;
+                    }
+                else
+                    {
+                    // default to music main view help context
+                    aContext.iContext = KMusHlpLibMainView;
+                    }
+                }
+            break;
+            }
+        case EMPXAlbum:
+        case EMPXGenre:
+        case EMPXComposer:
+            {
+            if ( containerType == EMPXGroup )
+                {
+                // album, genre, composer view
+                aContext.iContext = KMusHlpCategoryView;
+                }
+            else if ( containerType == EMPXItem )
+                {
+                // album, genre, composer tracks view
+                aContext.iContext = KMusHlpTracksView;
+                }
+            else
+                {
+                // default to music main view help context
+                aContext.iContext = KMusHlpLibMainView;
+                }
+            break;
+            }
+        case EMPXArtist:
+            {
+            // artist view
+            // artist/album view
+            aContext.iContext = KMusHlpCategoryView;
+            break;
+            }
+        case EMPXSong:
+            {
+            // all songs view
+            aContext.iContext = KMusHlpTracksView;
+            break;
+            }
+        default:
+            {
+            // default to music main view help context
+            aContext.iContext = KMusHlpLibMainView;
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXViewContainer
+// Returns the indicators for the specified item within the view container
+// ---------------------------------------------------------------------------
+//
+RArray<TInt> CMPXCollectionViewContainer::IndicatorsL( TInt aIndex )
+    {
+    return iLbxArray->IndicatorIconIndicesL( aIndex );
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXCommonListBoxArrayObserver
+// Handle listbox array events.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::HandleListBoxArrayEventL(
+    TMPXCommonListBoxArrayEvents aEvent )
+    {
+    MPX_FUNC( "CMPXCollectionViewContainer::HandleListBoxArrayEventL" );
+    ASSERT( iCommonContainer );
+    iCommonContainer->HandleListBoxArrayEventL( aEvent );
+    }
+
+// ---------------------------------------------------------------------------
+// Content is ready.
+// ---------------------------------------------------------------------------
+//
+void CMPXCollectionViewContainer::ContentIsReady( TBool aReady )
+    {
+    iReady = aReady;
+    }
+
+//  End of File