diff -r 000000000000 -r 2f259fa3e83a classicui_pub/status_pane_api/inc/eikspmod.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/classicui_pub/status_pane_api/inc/eikspmod.h Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,730 @@ +/* +* Copyright (c) 1997-1999 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: +* +*/ + + +#if !defined(__EIKSPMOD_H__) +#define __EIKSPMOD_H__ + +#if !defined(__E32BASE_H__) +#include +#endif + +#if !defined(__EIKON_HRH__) +#include +#endif + +#if !defined(__EIKSRVC_H__) +#include +#endif + + +class TResourceReader; +class CEikStatusPaneLayoutTree; +class CEikonEnv; +class CAknSgcClient; +class CEikStatusPaneLayout; +namespace AknLayout { class CInstance; } +namespace AknLayoutScalable_Avkon { class CInstance; } + +// Extra bit flags not defined in hrh file. +const TInt KEikStatusPaneDirectionBit = 0x04; +const TInt KEikStatusPaneHiddenBit = 0x08; +const TInt KEikStatusPaneInitInitializedBit = 0x80000000; + + +typedef TUid TPaneId; + +/** +* +* This class stores the details about status pane sub pane +* ownership and initial contents. +* +*/ +class TEikStatusPaneInit + { +public: + /** + * Default constructor. + */ + TEikStatusPaneInit(); + + /** + * Copy constructor. + */ + TEikStatusPaneInit(const TEikStatusPaneInit& aCopy); + + /** + * Operator overload. + */ + TEikStatusPaneInit& operator=(const TEikStatusPaneInit& aCopy); + + /** + * Gets pane id. + * @return id of the pane. + */ + inline TPaneId Id() const; + + /** + * Loads deafault values of the pane from given resource. + * Resource reader should point to an entry from the arrays of + * SPANE_PANE structures found in the STATUS_PANE_SYSTEM_MODEL + * and STATUS_PANE_APP_MODEL resource structures. + * + * @param @aResource Resource reader. + */ + void LoadDefaults(TResourceReader& aResource); + + /** + * Gets flag that indicates if the sub pane is owned by the + * application or not. + * @return ETrue if pane is application owned, otherwise EFalse. + */ + inline TBool AppOwned() const; + + /** + * Returns control type id of the pane. + * @return Id of the control inside the pane. + */ + inline TInt ControlTypeId() const; + + /** + * Returns resource id of the control in the pane. + * @return Control resource id. + */ + inline TInt ControlResourceId() const; + + /** + * Sets hidden flag. + */ + inline void SetHidden(); + + /** + * Clears hidden flag. + */ + inline void ClearHidden(); + + /** + * Gets hidden flag. + * @return ETrue if the pane is hidden. + */ + inline TBool IsHidden() const; + +private: + /** + * Gets initialized flag. + * @return ETrue if the pane is initialized. + */ + inline TBool Initialized(); + + /** + * Sets initialized flag. + */ + inline void SetInitialized(); + +private: + TPaneId iId; + TInt iControlId; + TInt iControlResource; + TInt iFlags; + }; + + +/** +* +* This class stores array of TEikStatusPaneInit instances. +* +*/ +NONSHARABLE_CLASS(CEikStatusPaneSetInit) : public CArrayFixFlat + { +public: + + /** + * Two phase constructor. + */ + static CEikStatusPaneSetInit* NewL(); + + /** + * Destructor. + */ + ~CEikStatusPaneSetInit(); + + /** + * Loads deafault values of the panes from given resource. + * Values are read from SPANE_PANE structure found in the + * STATUS_PANE_SYSTEM_MODEL and STATUS_PANE_APP_MODEL resource + * structures + * @param @aResource Resource reader. + */ + void LoadDefaultsL(TResourceReader& aResource); + + /** + * Finds the pane init with a given id. If a pane init + * is not found, method leaves with code KErrNotFound. + * @return The pane init instance with given id. + */ + TEikStatusPaneInit& FindL(const TPaneId& aPaneId); + +private: + + /** + * Private constructor. + */ + CEikStatusPaneSetInit(); + }; + + +/** +* +* This abstract class is used for checking pane layout validity. +* +*/ +class MEikStatusPaneLayoutTreeVisitor + { +public: + /** + * Virtual function of which implementation should be provided + * by the classes that implement the layout check visitor design + * pattern. + * @param aNode A layout node to be visited. + */ + virtual void VisitL(CEikStatusPaneLayoutTree* aNode) = 0; + }; + + + +/** +* +* This class calculates and stores the screen area available +* for each layout tree. +* +*/ +NONSHARABLE_CLASS(CEikStatusPaneLayoutTree) : public CBase + { +public: + enum TDirection + { + /** Horizontal direction */ + EHorizontal, + /** Vertical direction */ + EVertical + }; + +public: + /** + * Destructor. + */ + ~CEikStatusPaneLayoutTree(); + + /** + * Two phase constructor. + * @param aLayout Layout data + * @param aResource Resource of layout tree. + * @param aDefaultDirection Default direction of the layout tree. + */ + static CEikStatusPaneLayoutTree* NewL(CEikStatusPaneLayout* aLayout, TResourceReader& aResource, TDirection aDefaultDirection = EHorizontal); + + /** + * Finds the layout tree with a given pane id. + * @param aPaneId A id of the pane. + * @return If layout tree was found, a pointer to layout tree + * with given id. Otherwise NULL is returned. + */ + CEikStatusPaneLayoutTree* Find(const TPaneId& aPaneId); + + /** + * Calls given visitor objects VisitL, method. Additionally + * calls AcceptL -method of each sub pane layouts inside this layout tree. + * @param aVisitor A visitor object to be visited. + */ + void AcceptL(MEikStatusPaneLayoutTreeVisitor* aVisitor); + + /** + * Gets pane id. + * @return id of the pane. + */ + inline TPaneId Id() const; + + /** + * Gets rectagle of the layout tree. + * @return Rectangle of the layout tree. + */ + inline TRect Rect() const; + + /** + * This method maps given layout resource id and subpane UID to correct + * layout lines in the AknLayout system. + * + * @since 2.8 + * @param aLayoutResourceId Id of a statuspane layout. + * @param aPaneId Uid of a statuspane subpane. + * @return A rectangle which specifies the given subpane size + * and position in the given layout. + * + */ + TRect AknLayoutRect(TInt aLayoutResourceId, TPaneId aPaneId); + +private: + + /** + * Private constructor. + * @param aLayout Layout data + * @param aDefaultDirection Default direction of the layout tree. + */ + CEikStatusPaneLayoutTree(CEikStatusPaneLayout* aLayout, TDirection aDefaultDirection); + + /** + * Private 2nd phase constructor. + * @param aResource Resource of layout tree. + */ + void ConstructL(TResourceReader& aResource); + + /** + * Sets rectagle of the layout tree. + * @param aRect Rectangle of the layout tree. + */ + void SetRect(const TRect& aRect); + + /** + * Gets direction of the layout tree. + * @return Direction of the layout tree. + */ + inline TDirection Direction(); + + /** + * Sets direction of the layout tree. + * @param aDirection Direction of the layout tree. + */ + void SetDirection(TDirection aDirection); + + /** + * Gets size of the layout tree. + * @return size of the layout tree. + */ + inline TInt Size(); + + /** + * Gets stretchable flag of the layout tree. + * @return Stretchable flag of the layout tree. + */ + inline TBool Stretchable(); + + /** + * Sets stretchable flag of the layout tree. + * @param Stretchable flag of the layout tree. + */ + void SetStretchable(TBool aStretchable); + + /** + * Sets the layout of the sub panes inside layout tree according to + * layout tree attributes read from the resource structures. + */ + void Layout(); + + /** + * This methods purpose is eqvivalent of the Layout() method, but the difference + * is that this method uses AknLayout system instead of the statuspane + * resource definitions for determining the positions and sizes of the subpanes. + * + * If AknLayoutUsed flag has not been set then this method defaults to the behaviour + * of the Layout() -method. + * + * @since 2.8 + * @param aLayoutResourceId Id of the statuspane layout which is to be laid out. + * + */ + void Layout(TInt aLayoutResourceId); + + /** + * This method sets flag which tells wheter AknLayout system is + * used or not for layout. + * + * @since 2.8 + * @param aAknLayoutUsed ETrue if AknLayout is to be used. EFalse otherwise. + * + */ + void SetAknLayoutUsed(TBool aAknLayoutUsed); + + /** + * This method gets flag which tells wheter AknLayout system is + * used or not for layout. + * + * @since 2.8 + * @return ETrue if AknLayout is to be used. EFalse otherwise. + * + */ + TBool AknLayoutUsed(); + +private: + TPaneId iId; + TInt iFlags; + TRect iRect; + TInt iSize; + + typedef CArrayPtrFlat CSubPaneArray; + CSubPaneArray* iSubPanes; + + CEikStatusPaneLayout* iLayout; + +private: + friend class CEikStatusPaneLayout; + }; + + +/** +* +* This class calculates and stores the screen area available +* for each sub pane layout. +* +*/ +NONSHARABLE_CLASS(CEikStatusPaneLayout) : public CBase + { +public: + /** + * Two phase constructor. + * @param aResource Resource of sub pane layout. + * @param aScreenRect Screen rectangle. + */ + static CEikStatusPaneLayout* NewL(TResourceReader& aResource, const TRect& aScreenRect); + + /** + * Two phase constructor. + * @param aResource Resource of sub pane layout. + * @param aScreenRect Screen rectangle. + * @param aLayoutId Id of the status pane layout. + */ + static CEikStatusPaneLayout* NewL(TResourceReader& aResource, const TRect& aScreenRect, TInt aLayoutId); + + /** + * Destructor + */ + ~CEikStatusPaneLayout(); + + /** + * Finds the pane init with a given id. If a pane init + * is not found NULL pointer is returned. + * @return The layout tree instance with given id. + */ + inline CEikStatusPaneLayoutTree* Find(const TPaneId& aPaneId) const; + + /** + * Calls given visitor objects VisitL, method. + * @param aVisitor A visitor object to be visited. + */ + inline void AcceptL(MEikStatusPaneLayoutTreeVisitor* aVisitor); + + /** + * Gets rectagle of the sub pane layout. + * @return Rectangle of the sub pane layout. + */ + inline TRect Rect() const; + + /** + * Re-reads layout data from AknLayout system. The data may have to be refreshed when e.g. + * screen resolution, orientation or language variant layout is changed on the fly. + * + * @since 2.8 + * @param aLayoutResourceId Id of the statuspane layout which data is to be refreshed. + * + */ + void AknLayoutRefresh(TInt aLayoutResourceId); + + /** + * This method tells if this layout is using AknLayout system for placing and sizing + * the statuspane subpanes. + * + * @since 2.8 + * @return ETrue if this layout has been initailized to use AknLayout. EFalse if the default + * statuspane layout system is in use. + * + */ + TBool AknLayoutUsed(); + + /** + * This method maps given layout resource id and subpane UID to correct + * layout lines in the AknLayout system. + * + * @since 3.1 + * @param aLayoutResourceId Id of a statuspane layout. + * @param aPaneId Uid of a statuspane subpane. + * @return A rectangle which specifies the given subpane size + * and position in the given layout. + * + */ + TRect AknLayoutRect(TInt aLayoutResourceId, TPaneId aPaneId); + +private: + + /** + * Constructor. + */ + CEikStatusPaneLayout(); + + /** + * 2nd phase constructor. + */ + void ConstructL(TResourceReader& aResource, const TRect& aScreenRect, TInt aLayoutId); + +private: + CEikStatusPaneLayoutTree* iRoot; + +private: + + /** + * Updates layout data. + * @param aLayoutResId Status pane layout resource id. + */ + void UpdateLayoutData(TInt aLayoutResId); + +private: // layout data for all nodes in CEikStatusPaneLayoutTree + friend class CEikStatusPaneLayoutTree; + const AknLayout::CInstance& iAknLayout; + const AknLayoutScalable_Avkon::CInstance& iAknLayoutScalable_Avkon; + TRect iScreenRect; + TRect iMainPaneRect; + TRect iUsualStatusPaneRect; + TRect iApplicationWindowRect; + TRect iStaconLayout1Rect; + TRect iStaconLayout2Rect; + TRect iSmallStatusPaneRect; + }; + + +/** +* +* Base class for status pane model. +* +*/ +class CEikStatusPaneModelBase : public CBase + { +public: + + /** + * Destructor. + */ + IMPORT_C ~CEikStatusPaneModelBase(); + + /** + * Gets the pane inits of the status pane. + * @return Pane inits. + */ + inline CEikStatusPaneSetInit* PaneInits() const; + + /** + * Sets the status pane layout + * @param aLayoutResId Resource id of the status pane layout. + * @param aChangeStatusPaneNow A flag to indicate immediate status pane layout change. + */ + IMPORT_C virtual void SetLayoutL(TInt aLayoutResId, TBool aChangeStatusPaneNow = ETrue); + + /** + * Gets the current layout. + * @return The current layout. + */ + inline CEikStatusPaneLayout* CurrentLayout() const; + + /** + * Gets the current layout resource id. + * @return The current layout resource id. + */ + IMPORT_C TInt CurrentLayoutResId() const; + + /** + * Re-reads layout data for all existing layouts from AknLayout system. The data + * may have to be refreshed when e.g. screen resolution, orientation or language + * variant layout is changed on the fly. + * + * @since 2.8 + * + */ + void AknLayoutRefresh(); + + /** + * This method tells if given layout is using AknLayout system for placing and sizing + * the statuspane subpanes. + * + * @since 2.8 + * @param aLayoutId Layout which layout type is wanted to be known. + * @return ETrue if given layout has been initailized to use AknLayout. EFalse if the default + * statuspane layout system is in use. + * + */ + TBool AknLayoutUsed(TInt aLayoutId); + +protected: + + /** + * Internal class to CEikStatusPaneModel, + * which ties layout resource IDs to layout structures. + */ + NONSHARABLE_CLASS(CIdLayoutPair) : public CBase + { + public: + /** + * Constructor. + * @param aResId Resource id + * @param aLayout Sub pane layout + */ + CIdLayoutPair(TInt aResId, CEikStatusPaneLayout* aLayout); + /** + * Destructor. + */ + ~CIdLayoutPair(); + public: + TInt iResId; + CEikStatusPaneLayout* iLayout; + }; + typedef CArrayPtrFlat CLayoutIdSet; + typedef CArrayFixFlat CIdSet; + +protected: + + /** + * Constructor. + * @param aEikEnv An environment for creating controls. + */ + IMPORT_C CEikStatusPaneModelBase(CEikonEnv& aEikEnv); + + /** + * Base constructor for 2nd phase construction. + * @param aCoreResId Status pane core resource id. + */ + IMPORT_C void BaseConstructL(TInt aCoreResId); + + /** + * Loads given layout from resource. + * @param aLayoutResId Layout resource id. + */ + IMPORT_C CEikStatusPaneLayout* LoadLayoutL(TInt aLayoutResId); + + /** + * Returns set of legal layout ids. + * @return Set of allowed status pane layout ids. + */ + inline CIdSet* LegalIds() const; + + /** + * Checks if given layout id is allowed. + * @param aLayoutResId Layout id to be checked. + * @return ETrue if given layout id is allowed. + */ + TBool IsLegalId(TInt aLayoutResId) const; + +private: + /** + * Gets given layout. + * @param aLayoutResId Layout resource id. + */ + CEikStatusPaneLayout* Layout(TInt aLayoutResId); + + /** + * Checks given layout. + * @param aLayout Layout to be checked. + */ + void CheckLayoutL(CEikStatusPaneLayout* aLayout); + +private: + IMPORT_C virtual void Reserved_1(); + +private: + NONSHARABLE_CLASS(TLayoutChecker) : public MEikStatusPaneLayoutTreeVisitor + { + public: + TLayoutChecker(CEikStatusPaneSetInit* aPanes); + void VisitL(CEikStatusPaneLayoutTree* aNode); + private: + CEikStatusPaneSetInit* iPanes; + }; + +protected: + CLayoutIdSet* iLayouts; + TInt iCurrentResId; + CEikonEnv& iEikEnv; + +private: + CEikStatusPaneSetInit* iPanes; + CEikStatusPaneLayout* iCurrentLayout; + CIdSet* iLegalIds; + }; + + +/** +* +* Status pane model for application status pane. +* +*/ +NONSHARABLE_CLASS(CEikAppStatusPaneModel) : public CEikStatusPaneModelBase + { +public: + /** + * Two phase constructor. + * + * @param aEikEnv An environment for creating controls. + * @param aCoreResId Status pane core resource id + * @param aAppResId Application status pane resource id + * @param aChangeStatusPaneNow A flag to indicate immediate status pane layout change. + * @return Constructed instance. + */ + static CEikAppStatusPaneModel* NewL(CEikonEnv& aEikEnv, /*REikSrvSession,*/ TInt aCoreResId, TInt aAppResId = EEikStatusPaneUseDefaults, TBool aChangeStatusPaneNow = ETrue); + + /** + * Destructor. + */ + ~CEikAppStatusPaneModel(); + + /** + * Takes current layout into use. + */ + void ApplyCurrentLayoutL(); + +public: + /** + * from CEikStatusPaneModelBase + */ + void SetLayoutL(TInt aLayoutResId, TBool aChangeStatusPaneNow = ETrue); +public: + /** + * from CEikStatusPaneModelBase + */ + void SetLayoutL(TInt aLayoutResId, TBool aChangeStatusPaneNow, TBool aNotfiyServerSide); + +private: + CEikAppStatusPaneModel(CEikonEnv& aEikEnv); + void ConstructL(TInt aCoreResId, TInt aAppResId, TBool aChangeStatusPaneNow = ETrue); + }; + + +inline TPaneId TEikStatusPaneInit::Id() const { return iId; } +inline TBool TEikStatusPaneInit::AppOwned() const { return iFlags & EEikStatusPaneAppOwned; } +inline TInt TEikStatusPaneInit::ControlTypeId() const { return iControlId; } +inline TInt TEikStatusPaneInit::ControlResourceId() const { return iControlResource; } +inline void TEikStatusPaneInit::SetHidden() {iFlags|=KEikStatusPaneHiddenBit;} +inline void TEikStatusPaneInit::ClearHidden() {iFlags&=~KEikStatusPaneHiddenBit;} +inline TBool TEikStatusPaneInit::IsHidden() const {return iFlags&KEikStatusPaneHiddenBit;} + +inline CEikStatusPaneLayoutTree* CEikStatusPaneLayout::Find(const TPaneId& aPaneId) const { return iRoot->Find(aPaneId); } +inline void CEikStatusPaneLayout::AcceptL(MEikStatusPaneLayoutTreeVisitor* aVisitor) { iRoot->AcceptL(aVisitor); } +inline TRect CEikStatusPaneLayout::Rect() const { return iRoot->Rect(); } + +inline TPaneId CEikStatusPaneLayoutTree::Id() const { return iId; } +inline TRect CEikStatusPaneLayoutTree::Rect() const { return iRect; } + + +inline CEikStatusPaneSetInit* CEikStatusPaneModelBase::PaneInits() const { return iPanes; } +inline CEikStatusPaneLayout* CEikStatusPaneModelBase::CurrentLayout() const { return iCurrentLayout; } +inline CEikStatusPaneModelBase::CIdSet* CEikStatusPaneModelBase::LegalIds() const { return iLegalIds; } + +#endif