menufw/hierarchynavigator/hnmetadatamodel/inc/hnmdmodel.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:18:30 +0300
branchRCL_3
changeset 102 ba63c83f4716
parent 93 b01126ce0bec
permissions -rw-r--r--
Revision: 201039 Kit: 201041

/*
* 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:
*
*/



#ifndef C_HNMDMODEL_H
#define C_HNMDMODEL_H

#include <e32base.h>
#include <xmlengelement.h>
#include <liwgenericparam.h>
#include <eikenv.h>
#include "hnglobals.h"

class CHnMdLocalization;
class CHnSuiteModelContainer;
class CHnFilter;
class THnIdGenerator;
class CHnMdSuite;
class CHnMdModel;
class CHnItemId;
class MHnSuiteObserver;
class CHnXmlModelProvider;
class CHnMdModel;
class MHnMdModelEventObserver;
class CHnSuiteModel;
class CHnRepositoryObserver;
class MHnEditModeInterface;
class CHnBitmapIdCache;

/**
 * Type of the property.
 *
 * @ingroup group_hnmetadatamodel
 */
enum TPropertyType
    {
    EUndefined = 0,
    EGenre,
    EVisualItemCount
    };

/**
 * Mode type.
 *
 * @ingroup group_hnmetadatamodel
 */
enum TMdMode
    {
    EMdModeNormal = 0,
    EMdModeEdit
    };

/**
 * Common pointers.
 *
 * @since S60 5.0
 * @ingroup group_hnmetadatamodel
 */
struct THnMdCommonPointers
    {
    /**
     * Not own - Localization.
     */
    CHnMdLocalization* iLocalization;

    /**
     * Not own - Query generator.
     */
    THnIdGenerator* iIdGenerator;

    /**
     * Not own - Suite model container.
     */
    CHnSuiteModelContainer* iContainer;

    /**
     * Not own - Meta data model.
     */
    CHnMdModel* iModel;

    /**
     * Not own - Xml model provider.
     */
    CHnXmlModelProvider* iXmlModelProvider;

    /**
     * Not own - Cache for bitmap and mask ids.
     */
    CHnBitmapIdCache* iBitmapIdCache;

    /**
     * Not own - Model event observer.
     */
    MHnMdModelEventObserver* iModelEventObserver;

    /**
     * Not own - Edit mode interface.
     */
    MHnEditModeInterface* iEditModeInterface;

    /**
     * Not own - Handler to file server session;
     */
    RFs& iFs;

    /**
     * Gets static pointer from TLS.
     */
    static THnMdCommonPointers* Static() {return (THnMdCommonPointers*)Dll::Tls(); }

    /**
     * Sets pointer to TLS.
     *
     * @param aCmnPtrs Pointer to set
     */
    static void SetStatic( THnMdCommonPointers* aCmnPtrs ) {  Dll::SetTls(aCmnPtrs); }

  private:

    // only model can create it
    friend class CHnMdModel;

    /**
     * Standard C++ consturctor.
     */
    THnMdCommonPointers() : iFs( CEikonEnv::Static()->FsSession() )
        {
        iLocalization = NULL;
        iIdGenerator = NULL;
        iContainer = NULL;
        iModel = NULL;
        iXmlModelProvider = NULL;
        iModelEventObserver = NULL;
        iEditModeInterface = NULL;
        }

    /**
     * Copy constructor declared as private to disallow copying.
     *
     * @param aCmnPtrs Pointer to set.
     */
    THnMdCommonPointers( const THnMdCommonPointers& aCmnPtrs ):iFs( aCmnPtrs.iFs ) { }

    /**
     * Assignment operator
     */
    THnMdCommonPointers& operator=( const THnMdCommonPointers& ){return *this;}
    };

/**
 *  Id generator.
 *
 *  @lib ?library
 *  @since S60 5.0
 *  @ingroup group_hnmetadatamodel
 */
struct THnIdGenerator
    {
    /**
     * Standatrd C++ constructor.
     */
    THnIdGenerator()
        {
        iId = 0;
        }

    /**
     * Gets next id.
     * @return Next id.
     */
    TInt GetNextId()
        {
        return iId++;
        }
    private:

    /**
     * Copy constructor declared as private to disallow copying.
     * @param aGenerator Id generator;
     */
    THnIdGenerator(const THnIdGenerator& aGenerator);

    /**
     * Assignment operator.
     */
    THnIdGenerator& operator=(const THnIdGenerator&);

    /**
     * Id
     */
    TInt iId;
    };

/**
 * Model event observer.
 *
 * @since S60 5.0
 * @ingroup group_hnmetadatamodel
 */
class MHnMdModelEventObserver
    {
    public:

     /**
     * Handles modlde event.
     *
     * @since S60 5.0
     * @param aEventName Event name.
     * @param aParams Parameters.
     */
     virtual TInt HandleModelEventL( const TDesC& aEventName,
             CLiwGenericParamList& aParams ) = 0;
    };

/**
 * Meta data model
 *
 * This is the main class of the Meta Data Model component.
 *
 * This class is the entry point for building the meta data model
 * and for evaluation.
 *
 * @since S60 5.0
 * @ingroup group_hnmetadatamodel
 */
NONSHARABLE_CLASS( CHnMdModel ) : public CBase
    {
public:
    enum TForegroundGainTriggeringEvent
        {
        EWhenAnySuiteIsEvaluated,
        EWhenCurrentTopSuiteIsEvaluated,
        ENever
        };
public:

    /**
     * Two-phase constructor.
     *
     * @since S60 5.0
     * @param aModelObserver Model observer.
     * @param aSuiteModelContainer Suite model container.
     * @return Fully constructed object.
     */
    IMPORT_C static CHnMdModel* NewL( MHnMdModelEventObserver* aModelObserver,
            CHnSuiteModelContainer * aSuiteModelContainer );

    /**
     * Two-phase constructor.
     *
     * @since S60 5.0
     * @param aModelObserver Model observer.
     * @param aSuiteModelContainer Suite model container.
     * @return Fully constructed object.
     */
    IMPORT_C static CHnMdModel* NewLC( MHnMdModelEventObserver* aModelObserver,
            CHnSuiteModelContainer * aSuiteModelContainer );

    /**
     * Standard C++ virtual destructor.
     *
     * @since S60 5.0
     */
    virtual ~CHnMdModel();

    /**
     * Evaluates the model. Takes filter as a parameter.
     *
     * @since S60 5.0
     * @param aFilter Filter.
     */
    IMPORT_C void EvaluateL( CHnFilter& aFilter );

    /**
     * Manages evaluation lock.
     *
     * @param aLock Locks evaluation if set to ETrue.
     * @param aEvaluate Runs evaluation if aEvaluate == ETrue.
     */
    IMPORT_C void SetEvaluationLockL( TBool aLock, TBool aEvaluate = ETrue );

    /**
     * Evaluates the model.
     *
     * @since S60 5.0
     */
    IMPORT_C void EvaluateL();

    /**
     * Switches between edit mode and normal mode
     *
     * @since S60 5.0
     * @param aMode Suite model container.
     */
    IMPORT_C void SetModeL( TMdMode aMode );


    /**
     * Gets suite's meta data model.
     *
     * @since S60 5.0
     * @return Suite meta data model.
     */
    IMPORT_C CHnMdSuite* GetLastSuite();

    /**
     * Gets suite's meta data model.
     *
     * @since S60 5.0
     * @param aPosition Position of the suite in the stack.
     * @return Suite meta data model.
     */
    CHnMdSuite* GetSuite( TInt aPosition );

    /**
     * Gets suite's parameters..
     *
     * @since S60 5.0
     * @param aPosition Position of the suite in the stack,
     *        from which gets parameters.
     * @return Suite meta data model.
     */
    IMPORT_C CLiwGenericParamList& GetSuiteParameters( TInt aPosition );


    /**
     * Handles back event.
     *
     * @since S60 v3.2
     * @param aMulContainer Suite model container.
     * @param aGenre Name of the suite.
     * @param aIterations Number of iterations.
     * @return Error code.
     */
    IMPORT_C TInt HandleBackEventL( CHnSuiteModelContainer* aMulContainer,
            const TDesC& aGenre, TInt aIterations = KModelCountForRoot );

    /**
     * Handles sis installation event.
     *
     * @since S60 v3.2
     * @param aMulContainer Suite model container.
     */
    IMPORT_C void HandleSisInstallationEventL(
            CHnSuiteModelContainer* aMulContainer );

    /**
     * Loads a suite from xml data.
     *
     * @since S60 v5.0
     * @param aGenre Name of the suite.
     * @param aSuiteParams Suite parameters.
     * @return Error code.
     */
    IMPORT_C TInt LoadSuiteL( const TDesC& aGenre, CLiwGenericParamList* aSuiteParams = NULL );

    /**
     * Check if suite model exists.
     *
     * @since S60 5.0
     * @param aSuiteModel Suite model name.
     * @return ETrue if suite model exists, otherwise EFalse.
     */
    IMPORT_C TBool SuiteModelExistsL( const TDesC8& aSuiteModel );

    /**
     * Gets suite's meta data model.
     *
     * @since S60 5.0
     * @param aUri Current ui.
     * @return Suite meta data model.
     */
    IMPORT_C void GetCurrentUriL( TDes& aUri );

    /**
     * Deletes last loaded suite model from data model.
     *
     * @since S60 5.0
     */
    IMPORT_C void DeleteLastSuite();

    /**
     * Informs metadatamodel to ignore evaluations or
     * to performing evaluations, according to the
     * given parameter.
     *
     * @since S60 5.0
     * @param aIgnore Metadatamodel ignores evaluations when set to ETrue.
     */
    IMPORT_C void IgnoreEvaluations( TBool aIgnore );

    /**
     * Request that menu goes to foreground when evaluation completes.
     *
     * Default behavior is not to go to foreground when evaluation
     * completes. A change of this behavior requested with this method is
     * only effective until the menu is sent to foreground (once). Then the
     * default behavior is assumed again.
     * Subsequent calls override previous changes.
     *
     * @since S60 5.0
     * @param aWhen Determines when the foreground should be gained.
     *              Possible values are defined in the
     *              TForegroundGainTriggeringEvent enum. The value ENever
     *              simply means not to bring menu to foreground.
     */
    IMPORT_C void QueueForeground( TForegroundGainTriggeringEvent aWhen );

    /**
     * Is there a queue for foreground gain.
     *
     * @since S60 5.0
     * @return should foreground be gained after evaluation.
     */
    IMPORT_C TBool IsForegroundQueued() const;

    /**
     * Notifies this metadata model that suite evaluation has completed.
     *
     * @param aJustEvaluatedSuite pointer to the suite whose evaluation
     *                            has completed
     */
    void SuiteModelReadyToShowL( CHnSuiteModel* aJustEvaluatedSuite );

    /**
     * Counts number of loaded suites.
     *
     * @since S60 5.0
     * @return Number of loaded suites
     */
    TInt LoadedSuitesCount();

    /**
     * Evaluates the suite model on top of the stack.
     *
     * @since S60 5.0
     */
    void EvaluateTopSuiteL();

private:

    /**
     * Standard C++ constructor.
     *
     * @since S60 5.0
     */
    CHnMdModel( );

    /**
     * Standard symbian 2nd pahse constructor.
     *
     * @since S60 5.0
     * @param aModelObserver Model observer.
     * @param aSuiteModelContainer Model container.
     */
    void ConstructL( MHnMdModelEventObserver* aModelObserver,
            CHnSuiteModelContainer * aSuiteModelContainer );

private: // data

    /**
     * Id generator.
     */
    THnIdGenerator iIdGenerator;

    /**
     * Own - Localization.
     */
    CHnMdLocalization* iLocalization;

    /**
     * Own - Xml model provider.
     */
    CHnXmlModelProvider* iXmlModelProvider;

    /**
     * Own - bitmap and mask ids cache.
     */
    CHnBitmapIdCache* iBitmapIdCache;

    /**
     * Not Own - Event observer.
     */
    MHnMdModelEventObserver* iModelEventObserver;

    /**
     * Stores pointers to common objects in the system
     * This object is shared throut the whole system.
     */
    THnMdCommonPointers iCmnPtrs;

    /**
     * Stores information about mode.
     */
    TMdMode iMode;

    /**
     * Loaded Suites stack.
     * Object and content owned.
     */
    RPointerArray<CHnMdSuite> iLoadedSuites;

    /**
     * Repository widget type observer.
     */
    CHnRepositoryObserver* iRepositoryWidgetTypeObserver;

    /**
     * Repository folder change observer.
     */
    CHnRepositoryObserver* iRepositoryShowFolderObserver;

    /**
     * When set, forces metadatamodel to skip evaluations.
     */
    TBool iIgnoreEvaluations;

    /**
     * Queues foreground gain action.
     */
    TBool iForegroundQueued;

    /**
     * Not own - pointer to the suite model that must be evaluated
     * before matrix menu can be brought to foreground.
     *
     * When NULL, then any suite evaluation brings menu to foreground.
     * It is only meaningful when iForegroundQueued is ETrue.
     */
    CHnSuiteModel* iForegroundTriggeringSuite;

    };

#endif // C_HNMDMODEL_H