/*
* Copyright (c) 2005-2007 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:  MAiContentObserver implementation for XML UI controller
*
*/


#ifndef C_CONTENTRENDERER_H
#define C_CONTENTRENDERER_H

#include <e32base.h>
#include <e32hashtab.h>
#include "xnnewsticker.h"
#include "xnproperty.h"
#include "aicontentobserver.h"

class TXnUiEngineAppIf;
class CXnNodeAppIf;
class CGulIcon;
class MAiFwEventHandler;
struct TAiPublisherInfo;

namespace AiUtility
    {
    class CContentPriorityMap;
    }

namespace AiXmlUiController
    {
    class CActiveTransactionStack;
    class CTransactionFactoryImpl;
    class MTransactionElement;
    class MTransaction;
    class CAppUi;
    class CXmlNodeIdGenerator;
    class CNewstickerCallbackHandler;
    class CCssPropertyMap;
    class CPolicyEvaluator;
    class TAiPolicyElement;
    }


namespace AiXmlUiController
{

/**
*  @ingroup group_xmluicontroller
* 
*  CContentRenderer renders the content of the content publisher plug-ins
*
*  @lib AiXmlUiMain
*/
class CContentRenderer : public CBase,
                         public MAiContentObserver,
                         public XnNewstickerInterface::MXnNewstickerCallbackInterface
    {
public:  // Constructors and destructor
    
    static CContentRenderer* NewL( CAppUi& aAppUi );
    
    virtual ~CContentRenderer();

    /**
     * Sets event handler.
     * 
     * @param aFwEventHandler the event handler to use.
     */
    void SetEventHandler( MAiFwEventHandler& aFwEventHandler );

    /**
     * Resets content renderer for new theme.
     */
    void Reset();

    /**
     * Cleans all content items published by aPlugin.
     */
    void CleanPluginFromUi( MAiPropertyExtension& aPlugin );

// Functions from MAiContentObserver

    TInt StartTransaction( TInt aTxId );

    TInt Commit( TInt aTxId );

    TInt CancelTransaction( TInt aTxId );

    TBool CanPublish( MAiPropertyExtension& aPlugin,
                      TInt aContent,
                      TInt aIndex );

    TInt Publish( MAiPropertyExtension& aPlugin,
                  TInt aContent,
                  TInt aResource,
                  TInt aIndex );

    TInt Publish( MAiPropertyExtension& aPlugin,
                  TInt aContent,
                  const TDesC16& aText,
                  TInt aIndex );

    TInt Publish( MAiPropertyExtension& aPlugin,
                  TInt aContent,
                  const TDesC8& aBuf,
                  TInt aIndex );

    TInt Publish( MAiPropertyExtension& aPlugin,
                  TInt aContent,
                  RFile& aFile,
                  TInt aIndex );

    TInt Clean( MAiPropertyExtension& aPlugin, TInt aContent, TInt aIndex );

    TAny* Extension( TUid aUid );
    
    TBool RequiresSubscription( const TAiPublisherInfo& aPublisherInfo ) const;
    
    TInt SetProperty(MAiPropertyExtension& aPlugin,
            const TDesC8& aElementId,
            const TDesC8& aPropertyName,
            const TDesC8& aPropertyValue );
       
    TInt SetProperty(MAiPropertyExtension& aPlugin,
            const TDesC8& aElementId,
            const TDesC8& aPropertyName,
            const TDesC8& aPropertyValue,  
            MAiContentObserver::TValueType aValueType);  
    
    CXnDomPropertyValue::TPrimitiveValueType 
        DomPropertyValueType(MAiContentObserver::TValueType aValueType);

private:

    CContentRenderer( CAppUi& aAppUi );
    
    void ConstructL();
    
    void DoStartTransactionL( TInt aTxId );

    TInt CanPublishL( MAiPropertyExtension& aPlugin,
                      TInt aContent,
                      TInt aIndex );

    TInt DoPublishL( MAiPropertyExtension& aPlugin,
                     TInt aContent,
                     TInt aResource,
                     TInt aIndex);
    
    TInt DoPublishL( MAiPropertyExtension& aPlugin,
                     TInt aContent,
                     const TDesC16& aText,
                     TInt aIndex );
    
    TInt DoPublishL( MAiPropertyExtension& aPlugin,
                     TInt aContent,
                     const TDesC8& aBuf,
                     TInt aIndex );
    
    TInt DoPublishL( MAiPropertyExtension& aPlugin,
                     TInt aContent,
                     RFile& aFile,
                     TInt aIndex );
    
    TInt DoCleanL( MAiPropertyExtension& aPlugin,
                   TInt aContent,
                   TInt aIndex );
    
    void SetImmediateMode( TBool aImmediateMode );
    
    TBool IsImmediateMode() const;
    
    void ProcessTransactionElementL( MTransactionElement* aElement );

    CXnNodeAppIf* FindNodeByClassL( const TDesC& aCid,
                                    TInt aIndex,
                                    const TDesC8& aNs );

    CXnNodeAppIf* FindNodeByIdL( const TDesC& aCid, const TDesC& aNs = KNullDesC );

    CXnNodeAppIf* FindNodeByIdL( const TDesC8& aCid, const TDesC8& aNs = KNullDesC8 );
    
    TInt PublishIconL( MAiPropertyExtension& aPlugin,
                       const TDesC& aCid,
                       CGulIcon* aIcon,
                       TInt aIndex,
                       CXnNodeAppIf* aResource = NULL );
                       
    TInt PublishDataL( MAiPropertyExtension& aPlugin,
                       const TDesC& aCid,
                       const TDesC8& aData,
                       const TDesC8& aContentType,
                       TInt aIndex,
                       CXnNodeAppIf* aResource = NULL );
    
    TBool AllowPublishByPriority( CXnNodeAppIf& aUiElement,
                                  TInt aNewPriority ) const;
    
    void StartContentRefresh();
    
    TInt RefreshContentL( HBufC* aUiElementId,
                          TInt aOldPriority );
    
    static TInt RefreshContentCallback( TAny* aContentRenderer );
    
    void SendRefreshContentEventL();
    
    TBool IsParentNewsticker( CXnNodeAppIf& aTarget );
    
    void RegisterNewstickerCallbackInterfaceL( CXnNodeAppIf& aTarget );
    
    TInt SetPropertyL(MAiPropertyExtension& aPlugin,
               const TDesC8& aElementId,
               const TDesC8& aPropertyName,
               const TDesC8& aPropertyValue,  
               MAiContentObserver::TValueType aValueType);

// From XnNewstickerInterface::MXnNewstickerCallbackInterface    

    void TitleScrolled(TInt aTitleIndex);
    
    void TitleToScroll(TInt aTitleIndex);
    
    void CleanPluginFromUiL( MAiPropertyExtension& aPlugin );
    
    void ProcessContentChangesL( MTransaction& aTr );
    void ProcessContentChangeL( TAiPolicyElement& aElement );     

private:    // Data
    
    /**
     * Transaction stack. Own.
     */
    CActiveTransactionStack* iStack;
    
    /**
     * Factory for transacations. Own.
     */
    CTransactionFactoryImpl* iFactory;
    
    /**
     * Immediate mode flag. Own.
     */
    TBool iImmediateMode;
    
    /**
     * App UI
     */
    CAppUi& iAppUi;
    
    /**
     * Node lookup id generator. Own.
     */
    CXmlNodeIdGenerator* iNodeIdGenerator;
    
    /**
     * Content priority map. Own.
     */
    AiUtility::CContentPriorityMap* iContentPriorityMap;
    
    /**
     * Map of refreshable ui elements.
     */
    RPtrHashMap< TDesC, TInt > iRefreshableUiElements;
    
    /**
     * Timer for asynchronous content refreshing
     */
    CPeriodic* iTimer;
    
    /**
     * Fw event handler needed for content refresh event notifications.
     * Not own.
     */
    MAiFwEventHandler* iFwEventHandler;
    
    /**
     * Newsticker callback handler
     */
    CNewstickerCallbackHandler* iCallbackHandler;
    
    /**
     * Pointer descriptor to newsticker plugin name
     */
    TPtrC iNTPublisher;
    
    /**
     * Newsticker element property class.
     */
    HBufC* iNTClass;
    
    /**
     * CSS property map. Own
     */
    CCssPropertyMap* iPropertyMap;
    
    /**
     * Publishing policy evaluator. Own.
     */
    CPolicyEvaluator* iPolicyEvaluator;
    
    };

} // namespace AiXmlUiController

#endif      // C_CONTENTRENDERER_H  
           
//  End of File
