menufw/hierarchynavigator/hnmetadatamodel/src/hnmdmenuitem.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 26 Jan 2010 11:48:23 +0200
changeset 4 4d54b72983ae
parent 0 f72a12da539e
permissions -rw-r--r--
Revision: 201001 Kit: 201004

/*
* Copyright (c) 2007-2008 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:  
*
*/


#include "hnmdmenuitem.h"
#include "hnglobals.h"
#include "hnconvutils.h"
#include "hnstringhandler.h"
#include "hnconditioninterface.h"
#include "hnmdeventmappingelement.h"
#include "hnmdevent.h"
#include "hnmenuitemmodel.h"
#include "hnconditionfactory.h"

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
TBool CHnMdMenuItem::IsMenuItemElementName( const TDesC8& aNameToCompare )    
    {
    return !aNameToCompare.Compare( KMenuItemElementName8 )
        || !aNameToCompare.Compare( KMenuItemSpecificElementName8 )
        || !aNameToCompare.Compare( KMenuItemActionElementName8 );
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CHnMdMenuItem::AppendChildItemL( CHnMdMenuItem* aMenuItem )
    {
    iChildren.AppendL( aMenuItem );
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CHnMdMenuItem::EvaluateL( CHnMenuItemModel* aMenuModel,
        const CLiwGenericParamList& aQueriesResultsList, TInt aPos )
    {
    for ( TInt i( 0 ); i < iChildren.Count(); i++ )
      {
      CHnMdMenuItem* mdMenu = iChildren[ i ];
      if ( mdMenu->IsValidL( aQueriesResultsList, aPos ) )
          {
          CHnMenuItemModel* menu = CHnMenuItemModel::NewL( mdMenu->NameL() );
          mdMenu->EvaluateL( menu, aQueriesResultsList, aPos );
          aMenuModel->AppendChildMenuL( menu );
          }
      }
    aMenuModel->SetCommand( iEvent );
    aMenuModel->SetPosition( iPosition );
    aMenuModel->SetMenuItemType( iType );
    }

// ---------------------------------------------------------------------------
// ConstructL takes as an argument an item xml element. It iterates through 
// item elements in order to find menuitems.
// ---------------------------------------------------------------------------
//
void CHnMdMenuItem::CreatePropertiesL( TXmlEngElement aElement,
                                 THnMdCommonPointers* /* aCmnPtrs */ )
    {
    iType = CHnMenuItemModel::EItemApplication;
    if ( !aElement.Name().Compare( KMenuItemSpecificElementName8 ) )
    	{
    	iType = CHnMenuItemModel::EItemSpecific;
    	}
    else if ( !aElement.Name().Compare( KMenuItemActionElementName8 ) )
    	{
    	iType = CHnMenuItemModel::EItemAction;
    	}
    
    // name
    HBufC* name = HnConvUtils::Str8ToStrLC(
            aElement.AttributeValueL( KName8 ) );
    iName.Assign(name);
    CleanupStack::Pop( name );

    // position
    TPtrC8 pos = aElement.AttributeValueL( KPositionAttrName8 );
    TLex8 lexPosition ( pos );
    User::LeaveIfError( lexPosition.Val( iPosition ) );

    // event
    if( aElement.AttributeValueL( KEventAttrName8 ).Length() && 
                                            !aElement.HasChildNodes() )
        { // there might not be the event attribute - submenues
        TPtrC8 event = aElement.AttributeValueL( KEventAttrName8 );
        TLex8 lex( event );
        User::LeaveIfError( lex.Val( iEvent ) );
        }
    
    // condition
    if( aElement.AttributeValueL( KMenuConditionAttrName8 ).Length() )
        {
        iCondition = HnConditionFactory::NewL(  
          aElement.AttributeNodeL( KMenuConditionAttrName8 ) );
        }
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CHnMdMenuItem::CreateChildrenL( TXmlEngElement aElement,
                                        THnMdCommonPointers* aCmnPtrs )
    { 
    RXmlEngNodeList< TXmlEngElement > children;
    CleanupClosePushL( children );
    aElement.GetChildElements( children );
    TInt count = children.Count();

    for ( TInt i = 0; i < count; i++ )
        {
        TXmlEngElement child = children.Next();
        if ( IsMenuItemElementName( child.Name() ) )
            {
            AppendChildItemL( CHnMdMenuItem::NewL( child, aCmnPtrs ) );
            }
        }
    CleanupStack::PopAndDestroy( &children );
    }

// ---------------------------------------------------------------------------
// ConstructL takes as an argument an item xml element. It iterates through 
// item elements in order to find menuitems.
// ---------------------------------------------------------------------------
//
void CHnMdMenuItem::ConstructL( TXmlEngElement aElement,
                                THnMdCommonPointers* aCmnPtrs )
    {
    if ( IsMenuItemElementName( aElement.Name() ) )
        { // this is an ordinary menu item
        CreatePropertiesL( aElement, aCmnPtrs );
        CreateChildrenL( aElement, aCmnPtrs ); // in case there are subitems
        }
    else
        { // this is the root level
        CreateChildrenL( aElement, aCmnPtrs );
        }
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CHnMdMenuItem* CHnMdMenuItem::NewL( TXmlEngElement aElement,
        THnMdCommonPointers* aCmnPtrs )
    {
    CHnMdMenuItem* self = CHnMdMenuItem::NewLC( aElement, aCmnPtrs );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CHnMdMenuItem* CHnMdMenuItem::NewLC( TXmlEngElement aElement, 
        THnMdCommonPointers* aCmnPtrs )
    {
    CHnMdMenuItem* self = new( ELeave ) CHnMdMenuItem;
    CleanupStack::PushL( self );
    self->ConstructL( aElement, aCmnPtrs );
    return self;
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CHnMdMenuItem::CHnMdMenuItem()
    {
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CHnMdMenuItem::~CHnMdMenuItem()
    {
    iName.Close();
    iChildren.ResetAndDestroy();
    iNameValueCache.Close();
    delete iCondition;
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
const TDesC& CHnMdMenuItem::NameL() 
    {
    iNameValueCache.Close();
    HnStringHandler::LocaliseL( iNameValueCache, iName, NULL /*common params*/);
    return iNameValueCache;
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
TBool CHnMdMenuItem::IsValidL( const CLiwGenericParamList& aQueryResults, 
        TInt aPos )    
    {
    TBool ret( EFalse );
    if( !iCondition || iCondition->ResultL( aQueryResults, aPos ) )
        {
        ret = ETrue;
        }
    return ret;
    }