idlehomescreen/xmluirendering/uiengine/inc/xnuiengineimpl.h
changeset 0 f72a12da539e
child 9 f966699dea19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluirendering/uiengine/inc/xnuiengineimpl.h	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,673 @@
+/*
+* Copyright (c) 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:  Layout calculation and UI rendering mechanism implementations.
+*
+*/
+
+
+#ifndef _CXNUIENGINEIMPL_H
+#define _CXNUIENGINEIMPL_H
+
+// System includes
+
+// User includes
+#include "xnuistatelistener.h"
+#include "xnviewmanager.h"
+#include "xnmenu.h"
+
+// Forward declarations
+class CCoeControl;
+class CXnControlAdapter;
+class CXnNode;
+class CXnPointerArray;
+class CXnODT;
+class CGraphicsDevice;
+class CXnUiEngine;
+class CXnKeyEventDispatcher;
+class CXnEditor;
+class CXnResource;
+class CXnEditMode;
+class CXnHitTest;
+class CXnViewManager;
+class CXnViewData;
+class CXnPluginData;
+
+// Constants
+namespace XnLayoutPhase
+    {
+    const TInt ENone = 0x00;
+    const TInt ELayout = 0x01;
+    const TInt EMeasure = 0x02;
+    }
+
+namespace XnLayoutControl
+    {
+    const TInt ELayoutUI = 0x01;
+    const TInt ERenderUI = 0x02;
+    const TInt ERefreshMenu = 0x04;
+    const TInt EIgnoreState = 0x08;
+    const TInt EViewDirty = 0x10;
+    const TInt EEffectStarted = 0x20;
+    const TInt EFirstPassDraw = 0x40;
+    }
+	
+NONSHARABLE_STRUCT( TXnDirtyRegion )
+    {
+    RRegion         iRegion;      
+    CCoeControl*    iControl; // Not own.
+    
+    ~TXnDirtyRegion()
+        {
+        iRegion.Close();
+        }
+    };
+        
+
+// Class declaration
+
+/**
+ *  Layout calculation and UI rendering mechanism
+ *  implementations.
+ *  
+ *  @ingroup group_xnlayoutengine
+ *  @lib xn3layoutengine.lib
+ *  @since Series 60 3.1
+ */
+NONSHARABLE_CLASS( CXnUiEngineImpl ) : public CBase,     
+    public MXnViewObserver, 
+    public MXnUiResourceChangeObserver,
+    public XnMenuInterface::MXnMenuObserver
+    {
+    
+public:
+    // Constructors and destructor
+
+    /**
+     * Two-phased constructor.
+     * 
+     * @param aUiEngine Ui engine
+     * @param aViewManager View manager
+     */
+    static CXnUiEngineImpl* NewL( CXnUiEngine& aUiEngine,
+        CXnAppUiAdapter& aAdapter );
+
+    /**
+     * 2nd phase constructor 
+     */
+    void ConstructL();
+
+    /**
+     * Destructor.
+     */
+    virtual ~CXnUiEngineImpl();
+
+public:
+    // New functions
+
+    /**
+     * Gets AppUi
+     *
+     * @since S60 5.0     
+     * @return AppUi
+     */    
+    CXnAppUiAdapter& AppUiAdapter() const;
+    
+    /**
+     * Lays out the UI
+     * 
+     * @since Series 60 3.1
+     * @param aNode Starting point of the layout
+     */
+    void LayoutUIL( CXnNode* aNode = NULL );
+
+    /**
+     * Creates UI implementations for the UI, adjusts control coordinates 
+     * according to the layout
+     * 
+     * @since Series 60 3.1
+     * @param aNode Starting point
+     */
+    void RenderUIL( CXnNode* aNode = NULL );
+    
+    /**
+     * Gets the root node of the UI
+     * 
+     * @since Series 60 3.1
+     * @return Root node
+     */
+    CXnNode* RootNode();
+    
+    /**
+     * Gets the ODT
+     * 
+     * @since Series 60 3.1
+     * @return ODT
+     */
+    CXnODT* ODT();
+    
+    /**
+     * Finds a node by id
+     * 
+     * @since Series 60 3.1
+     * @param aNode Node id
+     * @param aNamespace Namespace
+     * @return Node with given id
+     */
+    CXnNode* FindNodeByIdL( const TDesC& aNodeId,
+        const TDesC& aNamespace = KNullDesC );
+    /**
+     * Finds a node by id, b-bit version
+     * 
+     * @since Series 60 3.1
+     * @param aNode Node id
+     * @param aNamespace Namespace
+     * @return Node with given id
+     */
+    CXnNode* FindNodeByIdL( const TDesC8& aNodeId, 
+        const TDesC8& aNamespace = KNullDesC8 );
+    /**
+     * Finds nodes by class
+     * 
+     * @since Series 60 3.1
+     * @param aClassId Class id
+     * @return Nodes with given class id
+     */
+    CXnPointerArray* FindNodeByClassL( const TDesC& aClassId,
+        const TDesC& aNamespace = KNullDesC );
+    
+    /**
+     * Finds nodes by class
+     * 
+     * @since Series 60 3.1
+     * @param aClassId Class id
+     * @return Nodes with given class id
+     */
+    CXnPointerArray* FindNodeByClassL( const TDesC8& aClassId,
+        const TDesC8& aNamespace = KNullDesC8 );
+    
+    /**
+     * Gets resources of the UI
+     * 
+     * @since Series 60 3.1
+     * @return List of resources
+     */
+    CArrayPtrSeg< CXnResource >& Resources();
+    
+    /**
+     * Sets currently focused node
+     * 
+     * @since Series 60 3.1
+     * @param aFocusedNode Currently focused node
+     * @param aSource A source of event that triggered focus change.
+     */
+    void SetFocusedNodeL( CXnNode* aFocusedNode, TInt aSource = 0 );
+    
+    /**
+     * Get currently focused node
+     * 
+     * @since Series 60 3.1
+     * @return Focused node.
+     */
+    CXnNode* FocusedNode();
+
+    /**
+     * Checks if the UI is in Edit mode.
+     * 
+     * @since Series 60 5.0        
+     * @return ETrue if the current mode is edit, otherwise EFalse.
+     */
+    TBool IsEditMode();
+           
+    /**
+     * Get a numeric value of a property in vertical pixels
+     * 
+     * @since Series 60 3.1
+     * @param aValue Property
+     * @param aReferenceValue Value used for percentage calculation
+     * @return Value in vertical pixels
+     */
+    TInt VerticalPixelValueL( CXnProperty* aValue, TInt aReferenceValue );
+    
+    /**
+     * Get a numeric value of a property in horizontal pixels
+     * 
+     * @since Series 60 3.1
+     * @param aValue Property
+     * @param aReferenceValue Value used for percentage calculation
+     * @return Value in horizontal pixels
+     */
+    TInt HorizontalPixelValueL( CXnProperty* aValue, TInt aReferenceValue );
+    
+    /**
+     * Get a numeric value of a property in vertical twips
+     * 
+     * @since Series 60 3.1
+     * @param aValue Property
+     * @param aReferenceValue Value used for percentage calculation
+     * @return Value in vertical twips
+     */
+    TInt VerticalTwipValueL( CXnProperty* aValue, TInt aReferenceValue );
+    
+    /**
+     * Get a numeric value of a property in horizontal twips
+     * 
+     * @since Series 60 3.1
+     * @param aValue Property
+     * @param aReferenceValue Value used for percentage calculation
+     * @return Value in horizontal pixels
+     */
+    TInt HorizontalTwipValueL( CXnProperty* aValue, TInt aReferenceValue );
+
+    /**
+     * Refresh current menu
+     *
+     * @since Series 60 3.1
+     */
+    void RefreshMenuL();
+
+    /**
+     * Returns view manager
+     *
+     * @since S60 5.0
+     * @return view manager
+     */
+    CXnViewManager* ViewManager();
+
+    /**
+     * Returns the active view
+     
+     * @since Series 60 3.1
+     * @return Active view node
+     */
+    CXnNode* ActiveView();
+
+    /**
+     * Add a dirty node. LayoutUiL and RenderUiL will only perform operations
+     * on the set of dirty nodes.
+     *
+     * @since Series 60 3.1
+     * @param aNode Dirty node.
+     * @param aLayoutPhaseHint, a hint where to start next layout phase
+     */
+    void AddDirtyNodeL( CXnNode* aNode, TInt aLevel );
+
+    /**
+     * Get the size of the current screen device
+     *
+     * @since Series 60 3.1
+     * @return Size of the current screen device
+     */
+    TSize ScreenDeviceSize() const;
+
+    /**
+     * Checks whether the dialog is displaying.
+     *
+     * @since Series 60 3.1
+     * @return ETrue if dialog is displaying.
+     */
+    TBool IsDialogDisplaying();
+
+    /**
+     * Handles a change to the control's resources of type aType
+     *
+     * @since Series 60 3.1
+     * @param aType Changed resource type
+     */
+    void HandleResourceChangeL( TInt aType );
+
+    /**
+     * Checks whether the menu is displaying.
+     * 
+     * @since Series 60 3.1
+     * @return ETrue if menu is displaying.
+     */
+    TBool IsMenuDisplaying();
+
+    /**
+     * Returns menubar node
+     * 
+     * @since Series 60 3.2
+     * @return Menubar node
+     */
+    CXnNode* MenuBarNode() const;
+
+    /**
+     * Returns stylus popup node
+     * 
+     * @since S60 60 5.0
+     * @return stylus popup node
+     */    
+    CXnNode* StylusPopupNode() const;
+    
+    /**
+     * Set node as passive, and add it to the passive focused node array.
+     * 
+     * @since Series 60 3.2
+     * @param aNode Node to use.
+     */
+    void AddPassiveFocusedNodeL( CXnNode* aNode );
+
+    /**
+     * Unset the passive focus from the node, and remove it from the passive 
+     * focused node array.
+     * 
+     * @since Series 60 3.2
+     * @param aNode Node to use.
+     */
+    void RemovePassiveFocusedNodeL( CXnNode* aNode );
+
+    /**
+     * Clear the passive focused node array, and unset the passive focus 
+     * states.
+     * 
+     * @since Series 60 3.2
+     */
+    void ClearPassiveFocusedNodesL();
+
+    /**
+     * Sets node's dropped state
+     * 
+     * @since Series 60 3.2
+     * @param aNode Node
+     * @param aDropped Dropped
+     */
+    void SetNodeDroppedL( CXnNode& aNode, TInt aDropped ) const;
+
+    /**
+     * Checks if node is adaptive, but doesn't have any content
+     * 
+     * @since Series 60 3.2
+     * @param aNode node
+     * @param aAvailableSize size to be checked
+     */
+    void CheckAdaptiveContentL( CXnNode& aNode, TSize aAvailableSize ) const;
+
+    /**
+     * Adds a node which can be focused
+     * 
+     * @since Series 60 3.2
+     * @param aNode Node
+     */
+    void AddFocusCandidateL( CXnNode* aNode );
+
+    /**
+     * Sets client rect
+     * 
+     * @since Series 60 3.2
+     * @param aRect area to be set
+     * @param aDrawNow Call rendering routines if ETrue
+     */
+    void SetClientRectL( TRect aRect, TBool aDrawNow = ETrue );
+    
+    /**
+     * Fetch editor to operate on AI3 widgets.
+     * 
+     * @since Series 60 5.0
+     * @return Pointer to Editor
+     */
+    CXnEditor* Editor() const;
+    
+    /**
+     * Gets client rect
+     * 
+     * @since Series 60 3.2
+     * @return client rect
+     */
+    TRect ClientRect() const;
+
+    /**
+     * Gets pointer to edit mode storage.
+     * 
+     * @since Series 60 5.0
+     * @return edit mode storage
+     */
+    CXnEditMode* EditMode();
+
+    /**
+     * Get current view plugins nodes.
+     * 
+     * @since Series 60 5.0
+     * @return Pointer to plugin node array
+     */
+    RPointerArray< CXnNode >* Plugins();
+
+    /**
+     * Gets hit test
+     * 
+     * @since S60 5.1         
+     * @return the hittest
+     */
+    CXnHitTest& HitTest() const;
+
+    /**
+     * Positions stylus popup according given position
+     * 
+     * @since S60 5.1         
+     * @param aNode stylus popup node
+     * @param aReference a reference node where popup should fit
+     * @param aPosition stylus popup position to set. 
+     */
+    void PositionStylusPopupL( CXnNode& aNode, CXnNode& aReference,
+        const TPoint& aPosition );
+
+    /**
+     * Gets theme resource file
+     * 
+     * @since S60 5.1         
+     * @param aPath path from which file is found
+     * @param aFile file to which resource is set
+     * @return errorcode
+     */
+    TInt GetThemeResource( const TDesC& aPath, RFile& aFile );
+
+    /**
+     * Analyse added widget
+     * 
+     * @since S60 5.1
+     * @param aNode Widget to be analyzed
+     * @return ETrue if fits, EFalse otherwise
+     */
+    TBool AnalyseAddedWidgetL( CXnNode& aNode );
+        
+    /**
+     * Disables layoyt and redraw, places cleanup item to cleanup stack
+     * for enabling layot and redraw
+     * 
+     * @since Series 60 5.0     
+     */                        
+    void DisableRenderUiLC();
+    
+    /**
+     * Set event dispatcher
+     * 
+     * @since Series 60 5.0
+     * @param aDispather Event dispatcher     
+     */                    
+    void SetEventDispatcher( CXnKeyEventDispatcher* aDispatcher );
+    
+private:
+    
+    IMPORT_C static void EnableRenderUi( TAny* aAny );
+        
+private:
+    // constructors
+
+    /**
+     * C++ default constructor.
+     */
+    CXnUiEngineImpl( CXnUiEngine& aUiEngine, CXnAppUiAdapter& aAdapter );
+
+private:
+    // new functions
+    
+    /**
+     * Prepares to the layout algorithm run
+     * 
+     * @since Series 60 3.2
+     */
+    void PrepareRunLayoutL();
+
+    /**
+     * Runs the layout algorithm        
+     * 
+     * @since Series 60 3.2
+     */
+    TInt RunLayoutL( CXnNode* aNode );
+
+    /**
+     * Checks if layout is currently disabled
+     * 
+     * @since Series 60 3.2
+     */
+    TBool IsLayoutDisabled();
+
+    void AddToRedrawListL( CXnNode* aNode, TRect aRect =
+        TRect::EUninitialized );
+
+    void AddToDirtyListL( CXnNode* aNode );
+
+    /**
+     * Finds a node where to start layout
+     *
+     * @since Series 60 5.0
+     */
+    CXnNode* StartLayoutFromL();
+
+    void ForceRenderUIL( TBool aLayoutOnly = EFalse );
+
+    CCoeControl* WindowOwningControl( CXnNode& aNode );
+    
+    TXnDirtyRegion* FindDirtyRegionL( CXnNode& aNode );
+
+    void AddRedrawRectL( TRect aRect, CXnNode& aNode );
+
+    void ReportScreenDeviceChangeL();
+	
+private:
+    //Derived functions
+    
+    /** 
+     * from MXnViewObserver 
+     */
+    void NotifyViewActivatedL( const CXnViewData& aViewData );
+
+    /** 
+     * from MXnViewObserver
+     */
+    void NotifyViewDeactivatedL( const CXnViewData& /*aViewData*/ );
+
+    /**
+     * from MXnViewObserver 
+     */
+    void NotifyConfigureWidgetL( const CHsContentInfo& /*aContentInfo*/,
+        CXnPluginData& /*aPluginData*/ );
+    
+    /** 
+     * from MXnViewObserver 
+     */
+    void NotifyWidgetAdditionL( const CXnPluginData& aPluginData );
+
+    /** 
+     * from MXnViewObserver
+     */
+   void NotifyWidgetRemovalL( const CXnPluginData& /*aPluginData*/ );
+
+   /** 
+    * from MXnViewObserver 
+    */
+   void NotifyViewAdditionL( const CXnPluginData& /*aPluginData*/ ){};
+
+   /** 
+    * from MXnViewObserver
+    */
+  void NotifyViewRemovalL( const CXnPluginData& /*aPluginData*/ ){};
+
+private:
+    // from MXnMenuObserver
+
+    TBool DynInitMenuItemL( CXnNodeAppIf& aMenuItem, CXnNodeAppIf* aPlugin = NULL );
+
+private:
+    // from MXnPropertyChangeObserver
+
+    /**
+     * Property changed
+     * 
+     * @since S60 5.1         
+     * @param aKey key value
+     * @param aValue property value         
+     */
+    void PropertyChangedL( const TUint32 aKey, const TInt aValue );
+
+private:
+    // from MXnUiResourceChangeObserver
+    
+    /**
+     * @see MXnUiResourceChangeObserver
+     */
+    void NotifyStatusPaneSizeChanged();
+
+    /**
+     * @see MXnUiResourceChangeObserver
+     */
+    void NotifyResourceChanged( TInt aType );
+    
+private:
+    // Data               
+    
+    /** Current screen device, Owned */
+    CGraphicsDevice* iCurrentGraphicsDevice;
+    /** UI engine - received from constructor's input parameters, Not owned */
+    CXnUiEngine* iUiEngine;
+    /** AppUi, Not owned */
+    CXnAppUiAdapter& iAppUiAdapter;    
+    /** Not owned. View manager */
+    CXnViewManager& iViewManager;
+    /** Key event dispatcher, Not owned */
+    CXnKeyEventDispatcher* iKeyEventDispatcher;
+    /** ControlAdapters, not owned */
+    const RPointerArray< CXnControlAdapter >* iControlAdapterList;
+    /** Region pending redraw */
+    RPointerArray<TXnDirtyRegion> iRedrawRegions;
+    /** List of currently dirty nodes */
+    RPointerArray< CXnNode > iDirtyList;
+    /** Array of nodes which can be focused */
+    RPointerArray< CXnNode > iFocusCandidateList;
+    /** current view */
+    CXnNode* iCurrentView;
+    /** current view control adapter, not owned */
+    CXnControlAdapter* iCurrentViewControlAdapter;
+    /** Controls layouting */
+    TInt iLayoutControl;
+    /** Layout algo phase */
+    TInt iLayoutPhase;
+    /** Unit in pixels (width). */
+    TReal iHorizontalUnitInPixels;
+    /** Unit in pixels (height). */
+    TReal iVerticalUnitInPixels;
+    /** Cached menu node	*/	
+    CXnNode* iMenuNode;
+    /** Cached styluspopup node */
+    CXnNode* iStylusPopupNode;
+    /** Drawing area */
+    TRect iClientRect;
+    /** Owned. Edit mode storage; */
+    CXnEditMode* iEditMode;
+    /** Owned. hittest */
+    CXnHitTest* iHitTest;
+    /** Disable count */
+    TInt iDisableCount;   
+    };
+
+#endif      // _CXNUIENGINEIMPL_H