diff -r 000000000000 -r 99ef825efeca languageinterworkingfw/servicehandler/src/liwmenu.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/languageinterworkingfw/servicehandler/src/liwmenu.cpp Mon Mar 30 12:51:20 2009 +0300 @@ -0,0 +1,276 @@ +/* +* Copyright (c) 2003-2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implements LIW Menu utilities for providers to access consumer menu. +* +*/ + + + + + + +#include +#include +#include +#include "liwmenu.h" +#include "liwcommon.hrh" + +// This is needed for resource reading. +const TInt KCCMask(0x00000fff); + + +EXPORT_C CLiwMenuPane::CLiwMenuPane(CEikMenuPane& aMenuPane, TInt aBaseCmdId) +: iMenuPane(&aMenuPane), iBaseCmdId(aBaseCmdId) + { + iNextCmdId = aBaseCmdId; + } + + +EXPORT_C CLiwMenuPane::~CLiwMenuPane() + { + delete iMenuPane; + + for(TInt i = 0; i < iIdMap.Count(); i++) + { + iIdMap[i].extraText.Close(); + } + + iIdMap.Reset(); + } + + +EXPORT_C void CLiwMenuPane::AddMenuItemL( + TInt aServiceCmd, + CEikMenuPaneItem::SData& aMenuItem, + TInt aIndex) + { + AddMenuItemL(aServiceCmd, aMenuItem, aIndex, KNullDesC()); + } + + +EXPORT_C void CLiwMenuPane::AddMenuItemL( + TInt aServiceCmd, + CEikMenuPaneItem::SData& aMenuItem, + TInt aIndex, + const TDesC& aExtraText) + { + SMenuIdMap map; + + map.dynMenuCmdId = iNextCmdId + iPaneOffset; + map.serviceCmdId = aServiceCmd; + map.origCmdId = aMenuItem.iCommandId; + map.owner = iInitializingOwner; + map.extraText.Assign(aExtraText.AllocL()); + CleanupClosePushL(map.extraText); + + aMenuItem.iCommandId = iNextCmdId + iPaneOffset; + iNextCmdId++; + + iMenuPane->InsertMenuItemL(aMenuItem, aIndex); + User::LeaveIfError(iIdMap.Append( map )); + CleanupStack::Pop(&(map.extraText)); // map.extraText + } + + + +EXPORT_C void CLiwMenuPane::AddMenuItemsL( + TResourceReader& aReader, + TInt aServiceCmd, + TInt aIndex, + TBool /*aAddSeperator*/) + { + CEikMenuPaneItem::SData data; + + TInt index = aIndex; + + TInt count = aReader.ReadInt16(); + for (TInt i = 0; i < count; i++) + { + data.iCommandId = aReader.ReadInt32(); + data.iCascadeId = aReader.ReadInt32(); + data.iFlags = aReader.ReadInt32(); + data.iText.Copy(aReader.ReadTPtrC()); + + // Extra text (additional submenu text) must be handled separately + // because SData doesn't offer space for it. + TPtrC extraText = aReader.ReadTPtrC(); + + aReader.ReadTPtrC(); // Skip bmpfile. + aReader.ReadInt16(); // Skip bmpid. + aReader.ReadInt16(); // Skip bmpmask. + aReader.ReadInt32(); // Skip extension. + + if (data.iCommandId == LIW_SUBMENU_TITLE) + { + AddTitleItemL(data.iText, index); + } + else + { + AddMenuItemL(aServiceCmd, data, index++, extraText); + } + } + } + + + +EXPORT_C void CLiwMenuPane::AddMenuItemsL( + TFileName& aFileName, + TInt aResId, + TInt aServiceCmd, + TInt aIndex, + TBool aAddSeparator) + { + TResourceReader reader; + + RFs fsSession; + User::LeaveIfError( fsSession.Connect() ); + CleanupClosePushL( fsSession ); + + BaflUtils::NearestLanguageFile(fsSession, aFileName); + + RResourceFile rsFile; + rsFile.OpenL( fsSession, aFileName ); + CleanupClosePushL( rsFile ); + + // Read multitapping resource. + HBufC8* rBuffer = rsFile.AllocReadLC(aResId & KCCMask); // Remove offset from id + reader.SetBuffer( rBuffer ); + + AddMenuItemsL(reader, aServiceCmd, aIndex, aAddSeparator); + + CleanupStack::PopAndDestroy(rBuffer); // rBuffer, rsFile, fsSession + CleanupStack::PopAndDestroy(&rsFile); + CleanupStack::PopAndDestroy(&fsSession); + } + + + +EXPORT_C TInt CLiwMenuPane::MenuCmdId(TInt aDynCmdId) const + { + for (TInt i = 0; i < iIdMap.Count(); i++) + { + if (iIdMap[i].dynMenuCmdId == aDynCmdId) + { + return iIdMap[i].origCmdId; + } + } + + return 0; + } + + + +EXPORT_C TInt CLiwMenuPane::DynCmdId(TInt aMenuCmdId) const + { + for (TInt i = 0; i < iIdMap.Count(); i++) + { + if (iIdMap[i].origCmdId == aMenuCmdId) + { + return iIdMap[i].dynMenuCmdId; + } + } + + return 0; + } + + + +EXPORT_C TInt CLiwMenuPane::ServiceCmdId(TInt aDynCmdId) const + { + for (TInt i = 0; i < iIdMap.Count(); i++) + { + if (iIdMap[i].dynMenuCmdId == aDynCmdId) + { + return iIdMap[i].serviceCmdId; + } + } + + return 0; + } + + + +TInt CLiwMenuPane::FindCmdId(TInt aIndex) + { + TInt index; + + for (TInt i = 0; i < iIdMap.Count(); i++) + { + if (iMenuPane->MenuItemExists(iIdMap[i].dynMenuCmdId, index)) + { + if (aIndex == index) + { + return iIdMap[i].dynMenuCmdId; + } + } + } + + return -1; + } + + + +EXPORT_C void CLiwMenuPane::AddTitleItemL(const TDesC& aTitle, TInt aIndex) + { + CEikMenuPaneItem::SData data; + + data.iCommandId = LIW_SUBMENU_TITLE; + data.iCascadeId = 0; + data.iFlags = 0; + data.iText.Copy(aTitle); + + iMenuPane->InsertMenuItemL(data, aIndex); + } + + +TBool CLiwMenuPane::IsCmdInRange(TInt aCmdSpaceSize, TInt aCmd) + { + if ((aCmd >= iPaneOffset + iBaseCmdId) && + (aCmd < iPaneOffset + iBaseCmdId + aCmdSpaceSize)) + { + return ETrue; + } + + return EFalse; + } + + +CLiwServiceIfBase* CLiwMenuPane::CommandOwner(TInt aDynCmd) const + { + for (TInt i = 0; i < iIdMap.Count(); i++) + { + if (iIdMap[i].dynMenuCmdId == aDynCmd) + { + return iIdMap[i].owner; + } + } + + return NULL; + } + + +const TDesC& CLiwMenuPane::ExtraText(TInt aDynMenuCmdId) + { + TInt count = iIdMap.Count(); + for(TInt i = 0; i < count; i++) + { + if(iIdMap[i].dynMenuCmdId == aDynMenuCmdId) + { + return iIdMap[i].extraText; + } + } + return KNullDesC; + } + +// End of file