--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/EikStd/coctlsrc/aknitemactionmenu.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,454 @@
+/*
+* 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: Item action menu.
+*
+*/
+
+#include <aknappui.h>
+#include <akncollection.h>
+#include <aknitemactionmenu.h>
+#include <aknlistquerydialog.h>
+#include <aknstyluspopupmenu.h>
+#include <AknTasHook.h>
+#include <avkon.rsg>
+#include <eikmenub.h>
+#include <eikpanic.h>
+
+#include "akncollectionobserver.h"
+#include "aknitemactionmenudata.h"
+#include "aknitemactionmenuregister.h"
+
+/**
+ * Index for invalid list index.
+ */
+const TInt KInvalidListIndex( -1 );
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::NewL
+// ---------------------------------------------------------------------------
+//
+CAknItemActionMenu* CAknItemActionMenu::NewL(
+ MAknCollection& aCollection )
+ {
+ CAknItemActionMenu* self = CAknItemActionMenu::NewLC( aCollection );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::NewLC
+// ---------------------------------------------------------------------------
+//
+CAknItemActionMenu* CAknItemActionMenu::NewLC( MAknCollection& aCollection )
+ {
+ CAknItemActionMenu* self = new ( ELeave ) CAknItemActionMenu();
+ CleanupStack::PushL( self );
+ self->ConstructL( aCollection );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::~CAknItemActionMenu
+// ---------------------------------------------------------------------------
+//
+CAknItemActionMenu::~CAknItemActionMenu()
+ {
+ AKNTASHOOK_REMOVE();
+ delete iPopupMenu;
+ delete iMenuPane;
+ delete iMenuData;
+ iStates.Close();
+ iObservers.Close();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::RegisterCollectionL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknItemActionMenu* CAknItemActionMenu::RegisterCollectionL(
+ MAknCollection& aCollection )
+ {
+ return AknItemActionMenuRegister::RegisterCollectionL( aCollection );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::RemoveCollection
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknItemActionMenu::RemoveCollection(
+ MAknCollection& aCollection )
+ {
+ for ( TInt i = 0; i < iStates.Count(); i++ )
+ {
+ MAknCollection* state( iStates[ i ] );
+ if ( state == &aCollection )
+ {
+ iStates.Remove( i );
+ break;
+ }
+ }
+ UnregisterMenu();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::InitMenuL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CAknItemActionMenu::InitMenuL()
+ {
+ iMenuData->Reset();
+ if ( !iMenuBar )
+ {
+ AknItemActionMenuRegister::RegisterItemActionMenuL( *this );
+ }
+ if ( iMenuBar )
+ {
+ if ( iMenuPane )
+ {
+ delete iMenuPane;
+ iMenuPane = NULL;
+ }
+ iMenuPane = iMenuBar->PopulateItemActionMenuL( *this );
+ }
+ else
+ {
+ return EFalse;
+ }
+
+ return iMenuData->Count();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::ShowMenuL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknItemActionMenu::ShowMenuL(
+ const TPoint& aPosition,
+ TUint /*aFlags*/ )
+ {
+ if ( iMenuData->Count() )
+ {
+ if ( !iPopupMenu )
+ {
+ iPopupMenu = CAknStylusPopUpMenu::NewL( this, TPoint() );
+ }
+ iPopupMenu->Clear();
+ iMenuData->AddMenuItemsToStylusPopupMenuL( iPopupMenu );
+ iPopupMenu->SetPosition(
+ aPosition,
+ CAknStylusPopUpMenu::EPositionTypeRightBottom );
+ iPopupMenu->ShowMenu();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::CollectionChanged
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknItemActionMenu::CollectionChanged(
+ MAknCollection& aCollection )
+ {
+ if ( iObservers.Count() && iStates.Find( &aCollection ) != KErrNotFound )
+ {
+ TBool collectionVisible( aCollection.CollectionState()
+ & MAknCollection::EStateCollectionVisible );
+ NotifyChangeToActiveObserver( collectionVisible );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::AddCollectionStateL
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::AddCollectionStateL(
+ MAknCollection& aCollection )
+ {
+ if ( iStates.Find( &aCollection ) == KErrNotFound )
+ {
+ iStates.InsertL( &aCollection, 0 );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::SetMenuBar
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::SetMenuBar(
+ MEikMenuObserver* aMenuObserver,
+ CEikMenuBar* aMenuBar )
+ {
+ iMenuBarObserver = aMenuObserver;
+ iMenuBar = aMenuBar;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::CollectionHighlightVisible
+// ---------------------------------------------------------------------------
+//
+TBool CAknItemActionMenu::CollectionHighlightVisible() const
+ {
+ TBool highlightVisible( ETrue );
+ for ( TInt i = 0; i < iStates.Count(); i++ )
+ {
+ MAknCollection* state( iStates[ i ] );
+ if ( state->CollectionState() &
+ MAknCollection::EStateCollectionVisible )
+ {
+ highlightVisible = state->CollectionState()
+ & MAknCollection::EStateHighlightVisible;
+ break;
+ }
+ }
+ return highlightVisible;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::CollectionSoftkeyVisible
+// ---------------------------------------------------------------------------
+//
+TBool CAknItemActionMenu::CollectionSoftkeyVisible(
+ TBool aVisibleCollection ) const
+ {
+ TBool softkeyVisible( ETrue );
+ for ( TInt i = 0; i < iStates.Count(); i++ )
+ {
+ TInt state( iStates[ i ]->CollectionState() );
+ if ( !aVisibleCollection
+ || state & MAknCollection::EStateCollectionVisible )
+ {
+ if ( state & MAknCollection::EStateMultipleSelection
+ || state & MAknCollection::EStateViewOnly )
+ {
+ softkeyVisible = ETrue;
+ }
+ else
+ {
+ softkeyVisible =
+ state & MAknCollection::EStateHighlightVisible;
+ }
+ break;
+ }
+ }
+ return softkeyVisible;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::MenuData
+// ---------------------------------------------------------------------------
+//
+CAknItemActionMenuData& CAknItemActionMenu::MenuData()
+ {
+ return *iMenuData;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::RegisterCollectionObserverL
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::RegisterCollectionObserverL(
+ MAknCollectionObserver& aObserver )
+ {
+ if ( iObservers.Find( &aObserver ) == KErrNotFound )
+ {
+ iObservers.InsertL( &aObserver, 0 );
+ aObserver.SetItemActionMenu( this );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::RemoveCollectionObserver
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::RemoveCollectionObserver(
+ MAknCollectionObserver& aObserver )
+ {
+ TInt index( iObservers.Find( &aObserver ) );
+ if ( index != KErrNotFound )
+ {
+ iObservers.Remove( index );
+ UnregisterMenu();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::CollectionCount
+// ---------------------------------------------------------------------------
+//
+TInt CAknItemActionMenu::CollectionCount() const
+ {
+ return iStates.Count();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::CAknItemActionMenu
+// ---------------------------------------------------------------------------
+//
+CAknItemActionMenu::CAknItemActionMenu()
+ : iPopupMenu( NULL ),
+ iMenuBarObserver( NULL ),
+ iMenuBar( NULL ),
+ iMenuPane( NULL ),
+ iMenuData( NULL )
+ {
+ AKNTASHOOK_ADD( this, "CAknItemActionMenu" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::ConstructL( MAknCollection& aCollection )
+ {
+ AddCollectionStateL( aCollection );
+ iMenuData = CAknItemActionMenuData::NewL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::LaunchSubMenuQueryL
+// ---------------------------------------------------------------------------
+//
+TInt CAknItemActionMenu::LaunchSubMenuQueryL( const TDesC& aHeading )
+ {
+ TInt selectedIndex( KInvalidListIndex );
+ if ( iMenuData->Count() )
+ {
+ CAknListQueryDialog* queryDialog
+ = new ( ELeave ) CAknListQueryDialog( &selectedIndex );
+ queryDialog->PrepareLC( R_AVKON_ITEM_ACTION_SUB_MENU_QUERY );
+ MDesCArray* itemArray = iMenuData->MenuItemsForQueryDialogL();
+ queryDialog->SetItemTextArray( itemArray );
+ queryDialog->SetOwnershipType( ELbmOwnsItemArray );
+ if ( aHeading != KNullDesC && queryDialog->QueryHeading() )
+ {
+ queryDialog->QueryHeading()->SetTextL( aHeading );
+ }
+ queryDialog->RunLD();
+ }
+ return ++selectedIndex;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::NotifyChangeToActiveObserver
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::NotifyChangeToActiveObserver(
+ TBool aCollectionVisible )
+ {
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ MAknCollectionObserver* observer( iObservers[ i ] );
+ if ( observer->Active() )
+ {
+ observer->CollectionChanged( aCollectionVisible );
+ break;
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::SetEmphasis
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::SetEmphasis(
+ CCoeControl* /*aMenuControl*/,
+ TBool /*aEmphasis*/ )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::ProcessCommandL
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::ProcessCommandL( TInt aCommandId )
+ {
+ MAknCollection* informState ( NULL );
+ // Store collection state before sending the command
+ for ( TInt i = 0; i < iStates.Count(); i++ )
+ {
+ MAknCollection* state( iStates[ i ] );
+ if ( state->CollectionState()
+ & MAknCollection::EStateCollectionVisible )
+ {
+ informState = state;
+ break;
+ }
+ }
+
+ if ( aCommandId > 0 )
+ {
+ TInt cascadeId( iMenuData->MenuItemCascadeId( aCommandId ) );
+ if ( cascadeId && iMenuPane )
+ {
+ TMenuItemTextBuf text = iMenuData->MenuItemText( aCommandId );
+ iMenuData->Reset();
+ iMenuPane->AddCascadeMenuItemsToActionMenuL(
+ cascadeId, EFalse, *iMenuData );
+ aCommandId = LaunchSubMenuQueryL( text );
+ }
+
+ if ( aCommandId > 0 && iMenuBarObserver )
+ {
+ iProcessingCommand = ETrue;
+ iMenuBarObserver->ProcessCommandL(
+ iMenuData->MenuItemCommandId( aCommandId ) );
+ iProcessingCommand = EFalse;
+ }
+ }
+ // Inform collection that submenu was closed
+ if ( iStates.Find( informState ) != KErrNotFound )
+ {
+ informState->ItemActionMenuClosed();
+ }
+ UnregisterMenu();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknItemActionMenu::UnregisterMenu
+// ---------------------------------------------------------------------------
+//
+void CAknItemActionMenu::UnregisterMenu()
+ {
+ if ( !iProcessingCommand && !iStates.Count() && !iObservers.Count() )
+ {
+ delete iPopupMenu;
+ iPopupMenu = NULL;
+ delete iMenuPane;
+ iMenuPane = NULL;
+ AknItemActionMenuRegister::UnregisterItemActionMenu( *this );
+ }
+ }
+
+// End of File