uifw/EikStd/coctlsrc/aknmarkingmode.cpp
branchRCL_3
changeset 56 d48ab3b357f1
child 64 85902f042028
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/aknmarkingmode.cpp	Wed Sep 01 12:16:19 2010 +0100
@@ -0,0 +1,405 @@
+/*
+* 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: Marking mode handler.
+*
+*/
+
+#include <akncollection.h>
+#include <aknitemactionmenu.h>
+#include <eikspane.h>
+#include <aknnavide.h>
+#include <barsread.h>
+#include <AknUtils.h>
+#include <AknTasHook.h>
+
+#include "akntrace.h"
+#include "aknmarkingmode.h"
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::NewL
+// ---------------------------------------------------------------------------
+//
+CAknMarkingMode* CAknMarkingMode::NewL(
+        CAknItemActionMenu& aItemActionMenu,
+        CollectionArray& aArray )
+    {
+    _AKNTRACE_FUNC_ENTER;
+    CAknMarkingMode* self =
+        new ( ELeave ) CAknMarkingMode( aItemActionMenu, aArray );
+    _AKNTRACE_FUNC_EXIT;
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::~CAknMarkingMode
+// ---------------------------------------------------------------------------
+//
+CAknMarkingMode::~CAknMarkingMode()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    AKNTASHOOK_REMOVE();    
+    delete iMarkingDecorator;
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::SetCollectionMultipleMarkingState
+// ---------------------------------------------------------------------------
+//
+void CAknMarkingMode::SetCollectionMultipleMarkingState( TBool aActive )
+    {
+    _AKNTRACE_FUNC_ENTER;
+    for ( TInt i = 0; i < iCollections.Count(); i++ )
+        {
+        MAknCollection* collection( iCollections[i] );
+        // Assume the command applies to first list with multiple selection
+        if ( collection->CollectionState() &
+                MAknCollection::EStateMultipleSelection )
+            {
+            MAknMarkingCollection* markingCollection
+                = MarkingCollection( *collection );
+            if ( markingCollection )
+                {
+                markingCollection->SetMultipleMarkingState( aActive );
+                TRAP_IGNORE( UpdateMarkingModeNaviPaneL( aActive ) );
+                }
+            iItemActionMenu.CollectionChanged( *collection );
+            break;
+            }
+        }
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::TryExitMarkingMode
+// ---------------------------------------------------------------------------
+//
+void CAknMarkingMode::TryExitMarkingMode()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    for ( TInt i = 0; i < iCollections.Count(); i++ )
+        {
+        MAknCollection* collection( iCollections[i] );
+        MAknMarkingCollection* markingCollection
+            = MarkingCollection( *collection );
+        if ( markingCollection && markingCollection->MarkingState(
+                ) & MAknMarkingCollection::EStateMarkingMode )
+            {
+            if ( markingCollection->ExitMarkingMode() )
+                {
+                SetCollectionMultipleMarkingState( EFalse );
+                }
+            }
+        break;
+        }
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::MultipleMarkingActive
+// ---------------------------------------------------------------------------
+//
+TBool CAknMarkingMode::MultipleMarkingActive() const
+    {
+    _AKNTRACE_FUNC_ENTER;
+    TBool markingActive( EFalse );
+    for ( TInt i = 0; i < iCollections.Count(); i++ )
+        {
+        MAknCollection* collection( iCollections[i] );
+        if ( collection->CollectionState() &
+                MAknCollection::EStateCollectionVisible )
+            {
+            MAknMarkingCollection* markingCollection
+                = MarkingCollection( *collection );
+            if ( markingCollection )
+                {
+                markingActive = markingCollection->MarkingState()
+                    & MAknMarkingCollection::EStateMarkingMode;
+                }
+            break;
+            }
+        }
+    _AKNTRACE_FUNC_EXIT;
+    return markingActive;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::MarkedItems
+// ---------------------------------------------------------------------------
+//
+TBool CAknMarkingMode::MarkedItems() const
+    {
+    _AKNTRACE_FUNC_ENTER;
+    TBool markedItems( EFalse );
+    for ( TInt i = 0; i < iCollections.Count(); i++ )
+        {
+        MAknCollection* collection( iCollections[i] );
+        if ( collection->CollectionState() &
+                MAknCollection::EStateCollectionVisible )
+            {
+            MAknMarkingCollection* markingCollection
+                = MarkingCollection( *collection );
+            if ( markingCollection )
+                {
+                TInt markingState = markingCollection->MarkingState();
+                if ( markingState &
+                        MAknMarkingCollection::EStateMarkingMode )
+                    {
+                    markedItems = markingState
+                        & MAknMarkingCollection::EStateMarkedItems;
+                    }
+                }
+            break;
+            }
+        }
+    _AKNTRACE_FUNC_EXIT;
+    return markedItems;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::CollectionEmpty
+// ---------------------------------------------------------------------------
+//
+TBool CAknMarkingMode::CollectionEmpty() const
+    {
+    _AKNTRACE_FUNC_ENTER;
+    TBool empty( EFalse );
+     for ( TInt i = 0; i < iCollections.Count(); i++ )
+         {
+         MAknCollection* collection( iCollections[i] );
+         if ( collection->CollectionState() &
+                 MAknCollection::EStateCollectionVisible )
+             {
+             MAknMarkingCollection* markingCollection
+                 = MarkingCollection( *collection );
+             if ( markingCollection )
+                 {
+                 TInt markingState = markingCollection->MarkingState();
+                 if ( markingState &
+                         MAknMarkingCollection::EStateMarkingMode )
+                     {
+                     empty = markingState
+                         & MAknMarkingCollection::EStateCollectionEmpty;
+                     }
+                 }
+             break;
+             }
+         }
+     _AKNTRACE_FUNC_EXIT;
+    return empty;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::MarkAllL
+// ---------------------------------------------------------------------------
+//
+void CAknMarkingMode::MarkAllL()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    MAknMarkingCollection* collection = ActiveMarkingCollection();
+    
+    if ( collection )
+        {
+        collection->MarkAllL();
+        }
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::UnmarkAll
+// ---------------------------------------------------------------------------
+//
+void CAknMarkingMode::UnmarkAll()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    MAknMarkingCollection* collection = ActiveMarkingCollection();
+    
+    if ( collection )
+        {
+        collection->UnmarkAll();
+        }
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::MarkCurrentItemL
+// ---------------------------------------------------------------------------
+//
+void CAknMarkingMode::MarkCurrentItemL()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    MAknMarkingCollection* collection = ActiveMarkingCollection();
+    
+    // first activate marking mode if needed
+    if ( !collection )
+        {
+        SetCollectionMultipleMarkingState( ETrue );
+        collection = ActiveMarkingCollection();
+        }
+
+    // then mark the current item
+    if ( collection )
+        {
+        collection->MarkCurrentItemL();
+        }
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::CurrentItemMarkable
+// ---------------------------------------------------------------------------
+//
+TBool CAknMarkingMode::CurrentItemMarkable()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    _AKNTRACE_FUNC_EXIT;
+    return MarkingCollection()->CurrentItemMarkable();
+    }
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::CAknMarkingMode
+// ---------------------------------------------------------------------------
+//
+CAknMarkingMode::CAknMarkingMode(
+        CAknItemActionMenu& aItemActionMenu,
+        CollectionArray& aArray )
+    : iCollections( aArray ),
+    iItemActionMenu( aItemActionMenu ),
+    iMarkingDecorator( NULL )
+    {
+    _AKNTRACE_FUNC_ENTER;
+    AKNTASHOOK_ADD( this, "CAknMarkingMode" );
+    _AKNTRACE_FUNC_EXIT;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::MarkingCollection
+// ---------------------------------------------------------------------------
+//
+MAknMarkingCollection* CAknMarkingMode::MarkingCollection(
+        MAknCollection& aCollection )
+    {
+    _AKNTRACE_FUNC_ENTER;
+    TAny* extension( NULL );
+    aCollection.CollectionExtension(
+            MAknMarkingCollection::TYPE, extension, NULL );
+    _AKNTRACE_FUNC_EXIT;
+    return static_cast<MAknMarkingCollection*>( extension );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::MarkingCollection
+// ---------------------------------------------------------------------------
+//
+MAknMarkingCollection* CAknMarkingMode::MarkingCollection()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    for ( TInt i = 0; i < iCollections.Count(); i++ )
+        {
+        MAknCollection* collection( iCollections[i] );    
+        if ( collection->CollectionState() &
+                MAknCollection::EStateCollectionVisible )
+            {
+            _AKNTRACE_FUNC_EXIT;
+            return MarkingCollection( *collection );
+            }
+        }
+    _AKNTRACE_FUNC_EXIT;
+    return NULL;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::ActiveMarkingCollection
+// ---------------------------------------------------------------------------
+//
+MAknMarkingCollection* CAknMarkingMode::ActiveMarkingCollection()
+    {
+    _AKNTRACE_FUNC_ENTER;
+    for ( TInt i = 0; i < iCollections.Count(); i++ )
+        {
+        MAknCollection* collection( iCollections[i] );
+        
+        MAknMarkingCollection* markingCollection = 
+                MarkingCollection( *collection );
+        
+        if ( markingCollection && markingCollection->MarkingState() & 
+                MAknMarkingCollection::EStateMarkingMode )
+            {
+            _AKNTRACE_FUNC_EXIT;
+            return markingCollection;
+            }
+        }
+    _AKNTRACE_FUNC_EXIT;
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CAknMarkingMode::UpdateMarkingModeNaviPaneL
+// ---------------------------------------------------------------------------
+//
+void CAknMarkingMode::UpdateMarkingModeNaviPaneL( TBool aEnable )
+    {
+    _AKNTRACE_FUNC_ENTER;
+    CEikonEnv* eikonEnv = CEikonEnv::Static();
+        
+    if ( eikonEnv && eikonEnv->AppUiFactory() )
+        {
+        CEikStatusPane* statusPane = eikonEnv->AppUiFactory()->StatusPane();
+
+        if ( statusPane )
+            {
+            // get navi pane
+            CAknNavigationControlContainer* naviPane =
+                    (CAknNavigationControlContainer *)statusPane->ControlL(
+                            TUid::Uid(EEikStatusPaneUidNavi));
+            if ( naviPane )
+                {
+                if ( !iMarkingDecorator )
+                    {
+                    TResourceReader reader;
+                    eikonEnv->CreateResourceReaderLC( 
+                            reader, R_MARKING_MODE_NAVI_PANE );
+    
+                    iMarkingDecorator = naviPane->CreateNavigationLabelL( 
+                                reader );
+                    CleanupStack::PopAndDestroy(); // reader
+                    }
+    
+                if ( aEnable ) 
+                    {
+                    naviPane->PushL( *iMarkingDecorator ); 
+                    }
+                else 
+                    {
+                    naviPane->Pop( iMarkingDecorator ); 
+                    }
+                naviPane->DrawDeferred();
+                }
+            }
+        }
+    _AKNTRACE_FUNC_EXIT;
+    }
+
+// End of File