williamr@2: /* williamr@2: * Copyright (c) 2002-2008 Nokia Corporation and/or its subsidiary(-ies). williamr@2: * All rights reserved. williamr@2: * This component and the accompanying materials are made available williamr@4: * under the terms of "Eclipse Public License v1.0" williamr@2: * which accompanies this distribution, and is available williamr@4: * at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: * williamr@2: * Initial Contributors: williamr@2: * Nokia Corporation - initial contribution. williamr@2: * williamr@2: * Contributors: williamr@2: * williamr@2: * Description: Decorator class for navigation pane controls. williamr@2: * The class, for example, decorates navigation pane controls williamr@2: * with navi arrows. williamr@2: * williamr@2: */ williamr@2: williamr@2: williamr@2: #ifndef C_AKNNAVIDE_H williamr@2: #define C_AKNNAVIDE_H williamr@2: williamr@4: #include williamr@2: #include williamr@2: #include williamr@2: williamr@4: #include williamr@2: #include williamr@2: williamr@2: class CEikScrollButton; williamr@2: class CAknTabGroup; williamr@2: class MAknNaviDecoratorObserver; williamr@2: class CAknNavigationDecoratorExtension; williamr@2: williamr@2: /** williamr@2: * Decorator class for navigation pane controls. williamr@2: * The class, for example, decorates navigation pane controls with navi arrows. williamr@2: */ williamr@2: class CAknNavigationDecorator : public CAknControl, williamr@2: public MCoeControlObserver, williamr@2: public MAknNavigationDecoratorInterface williamr@2: { williamr@2: williamr@2: friend class CAknNavigationControlContainer; williamr@2: williamr@2: public: williamr@2: williamr@2: /** williamr@2: * Defines scroll buttons. williamr@2: */ williamr@2: enum TScrollButton williamr@2: { williamr@2: /** Scroll left. */ williamr@2: ELeftButton = 0x0001, williamr@2: williamr@2: /** Scroll right. */ williamr@2: ERightButton = 0x0002 williamr@2: }; williamr@2: williamr@2: /** williamr@2: * Defines type of the decorated control. williamr@2: */ williamr@2: enum TControlType williamr@2: { williamr@2: /** Type not specified. */ williamr@2: ENotSpecified, williamr@2: williamr@2: /** Tab group. */ williamr@2: ETabGroup, williamr@2: williamr@2: /** Label. */ williamr@2: ENaviLabel, williamr@2: williamr@2: /** Image. */ williamr@2: ENaviImage, williamr@2: williamr@2: /** Text. */ williamr@2: EHintText, williamr@2: williamr@2: /** Indicator. */ williamr@2: EEditorIndicator, williamr@2: williamr@2: /** Volume. */ williamr@2: ENaviVolume williamr@2: }; williamr@2: williamr@2: public: williamr@2: williamr@2: /** williamr@2: * Creates a new navigation decorator. The object takes ownership of the williamr@2: * decorated object at the beginning of the method before any leaving williamr@2: * functions. williamr@2: * williamr@2: * @param aNavigationControlContainer Container control. williamr@2: * @param aDecoratedControl Control to be decorated. williamr@2: * @param aType = @c ENotSpecified Control type. williamr@2: * @return Navigation Decorator object that williamr@2: * contains decorated object. williamr@2: */ williamr@2: IMPORT_C static CAknNavigationDecorator* NewL( williamr@2: CAknNavigationControlContainer* aNavigationControlContainer, williamr@2: CCoeControl* aDecoratedControl, williamr@2: TControlType aType = ENotSpecified); williamr@2: williamr@2: /** williamr@2: * Destructor. williamr@2: */ williamr@2: IMPORT_C ~CAknNavigationDecorator(); williamr@2: williamr@2: /** williamr@2: * Returns the control inside a navigation decorator object. Ownership of williamr@2: * the control is not changed. williamr@2: * williamr@2: * @return Control that is decorated with the decorator. williamr@2: */ williamr@2: IMPORT_C CCoeControl* DecoratedControl(); williamr@2: williamr@2: /** williamr@2: * Shows or hides the navigation arrows at the both ends of the navigation williamr@2: * pane when current object is shown. williamr@2: * williamr@2: * @param aVisible Boolean value if navigation arrows are shown with the williamr@2: * decorated control. Visible if @c ETrue. williamr@2: */ williamr@2: IMPORT_C void MakeScrollButtonVisible(TBool aVisible); williamr@2: williamr@2: /** williamr@2: * Gets the State of the visibility of navigation arrows. williamr@2: * williamr@2: * @return @c ETrue if visible. williamr@2: */ williamr@2: IMPORT_C TBool ScrollButtonVisible() const; williamr@2: williamr@2: /** williamr@2: * Sets the navigation arrow dimmed (and highlighted). Arrows have to be williamr@2: * visible so that the dimmed arrow is shown on the screen. williamr@2: * williamr@2: * @param aButton Navigation arrow to be set (@c ELeftButton or williamr@2: * @c ERightButton). williamr@2: * @param aDimmed @c ETrue is the button is dimmed, @c EFalse if the button williamr@2: * is set highlighted. williamr@2: */ williamr@2: IMPORT_C void SetScrollButtonDimmed(TScrollButton aButton, TBool aDimmed); williamr@2: williamr@2: /** williamr@2: * Is button dimmed or highlighted. williamr@2: * williamr@2: * @param aButton Navigation arrow. williamr@2: * @return @c ETrue If the navigation arrow is dimmed, @c EFalse if williamr@2: * it is highlighted. williamr@2: */ williamr@2: IMPORT_C TBool IsScrollButtonDimmed(TScrollButton aButton) const; williamr@2: williamr@2: /** williamr@2: * Sets the type of the decorated control. williamr@2: * williamr@2: * @param aType Type of the control. williamr@2: */ williamr@2: IMPORT_C void SetControlType(TControlType aType); williamr@2: williamr@2: /** williamr@2: * Returns the type of the decorated control. williamr@2: * williamr@2: * @return Control type. williamr@2: */ williamr@2: IMPORT_C TControlType ControlType() const; williamr@2: williamr@2: /** williamr@2: * Sets observer for navigation decorator events in the decorated control. williamr@2: * williamr@2: * @param aObserver Pointer to observer. williamr@2: */ williamr@2: IMPORT_C virtual void SetNaviDecoratorObserver( williamr@2: MAknNaviDecoratorObserver* aObserver); williamr@2: williamr@2: /** williamr@2: * Sets the pointer to the default navigation pane control. williamr@2: * williamr@2: * @param aContainer Pointer to default control in navigation pane. williamr@2: */ williamr@2: void SetNaviStack(CAknNavigationControlContainer* aContainer); williamr@2: williamr@2: /** williamr@2: * From @c CCoeControl. williamr@2: * williamr@2: * Handle pointer events. williamr@2: * williamr@2: * @param aPointerEvent Pointer event to be handled. williamr@2: */ williamr@2: IMPORT_C void HandlePointerEventL(const TPointerEvent& aPointerEvent); williamr@2: williamr@2: /** williamr@2: * Defines the navigation control layout style. williamr@2: */ williamr@2: enum TAknNaviControlLayoutStyle williamr@2: { williamr@2: /** Normal layout style. */ williamr@2: ENaviControlLayoutNormal = 0x1, williamr@2: williamr@2: /** Narrow layout style. */ williamr@2: ENaviControlLayoutNarrow = 0x2, williamr@2: williamr@2: /** williamr@2: * Wide layout style, can be used only in portrait mode, in williamr@2: * usual status pane layout (@c R_AVKON_STATUS_PANE_LAYOUT_USUAL_EXT). williamr@2: * williamr@2: * Tabs are not currently supported in wide layout style. williamr@2: */ williamr@2: ENaviControlLayoutWide = 0x4 williamr@2: }; williamr@2: williamr@2: /** williamr@2: * Defines the navigation control layout mode. williamr@2: */ williamr@2: enum TAknNaviControlLayoutMode williamr@2: { williamr@2: /** williamr@2: * This is the default layout mode. It lets UI framework to decide the williamr@2: * proper layout style which is applied to decorated controls in all williamr@2: * situations. williamr@2: */ williamr@2: ENaviControlLayoutModeAutomatic = 0x400, williamr@2: williamr@2: /** williamr@2: * @c ENaviControlLayoutModeForced layout mode can be used to lock williamr@2: * the layout style to the current style. williamr@2: */ williamr@2: ENaviControlLayoutModeForced = 0x800 williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Sets the layout style for this objects decorated control. The layout williamr@2: * style can be normal or narrow style. williamr@2: * williamr@2: * The style is really applied if the decorated control supports it or if williamr@2: * the layout mode has been set to forced mode williamr@2: * (@c ENaviControlLayoutModeForced). Additionally narrow mode may not be williamr@2: * supported at all in some statuspane configurations (even if forced). williamr@2: * williamr@2: * Whether decorated control supports or does not support given style at the williamr@2: * currently active statuspane layout can be queried using williamr@2: * @c NaviControlLayoutStyleSupported() method. williamr@2: * williamr@2: * @since S60 3.0 williamr@2: * @param aStyle Can be normal (@c ENaviControlLayoutNormal), williamr@2: * narrow (@c ENaviControlLayoutNarrow) or williamr@2: * wide (@c ENaviControlLayoutWide). williamr@2: * williamr@2: */ williamr@2: IMPORT_C void SetNaviControlLayoutStyle(TAknNaviControlLayoutStyle aStyle); williamr@2: williamr@2: /** williamr@2: * Gets the current layout style of this objects decorated control williamr@2: * (@c ENaviControlLayoutNormalm @c ENaviControlLayoutNarrow or williamr@2: * @c ENaviControlLayoutWide). williamr@2: * williamr@2: * @since S60 3.0 williamr@2: * @return Current layout style of the navicontrol williamr@2: */ williamr@2: IMPORT_C TAknNaviControlLayoutStyle NaviControlLayoutStyle(); williamr@2: williamr@2: /** williamr@2: * Tells if decorated control supports given layout style at the current williamr@2: * statuspane layout. For @c ENotSpecified type of controls this always williamr@2: * returns @c EFalse (just for safety) because their implementation is williamr@2: * not known. williamr@2: * williamr@2: * @since S60 3.0 williamr@2: * @param aStyle The layout style. williamr@2: * @return @c ETrue if the control supports given layout style williamr@2: * otherwise returns @c EFalse. williamr@2: */ williamr@2: IMPORT_C TBool NaviControlLayoutStyleSupported(TAknNaviControlLayoutStyle williamr@2: aStyle); williamr@2: williamr@2: /** williamr@2: * Sets the layout mode @c ENaviControlLayoutModeAutomatic or williamr@2: * @c ENaviControlLayoutModeForced. See @c TAknNaviControlLayoutMode williamr@2: * for more information. williamr@2: * williamr@2: * @since S60 3.0 williamr@2: * @param aMode New layout mode. williamr@2: * williamr@2: */ williamr@2: IMPORT_C void SetNaviControlLayoutMode(TAknNaviControlLayoutMode aMode); williamr@2: williamr@2: /** williamr@2: * Gets the current layout mode of decorated control. Can be williamr@2: * @c ENaviControlLayoutModeAutomatic (default) or williamr@2: * @c ENaviControlLayoutModeForced (usually set by the application). williamr@2: * williamr@2: * @since S60 3.0 williamr@2: * @return Decorated control's current layout williamr@2: * mode. williamr@2: * williamr@2: */ williamr@2: IMPORT_C TAknNaviControlLayoutMode NaviControlLayoutMode(); williamr@2: williamr@2: williamr@2: protected: // from CCoeControl williamr@2: williamr@2: /** williamr@2: * From @c CCoeControl. williamr@2: * williamr@2: * Handles the size change events. williamr@2: */ williamr@2: IMPORT_C virtual void SizeChanged(); williamr@2: williamr@2: /** williamr@2: * From @c CCoeControl. williamr@2: * williamr@2: * Returns the number of controls inside the context pane control. williamr@2: * williamr@2: * @return Number of controls. williamr@2: */ williamr@2: IMPORT_C virtual TInt CountComponentControls() const; williamr@2: williamr@2: /** williamr@2: * From @c CCoeControl. williamr@2: * williamr@2: * Returns a control determined by control id. williamr@2: * williamr@2: * @param aIndex Index of a control to be returned. williamr@2: * @return Pointer to the control. williamr@2: */ williamr@2: IMPORT_C virtual CCoeControl* ComponentControl(TInt aIndex) const; williamr@2: williamr@2: public: // from CCoeControl williamr@2: /** williamr@2: * Handles a change to the control's resources of type aType williamr@2: * which are shared across the environment, e.g. color scheme change. williamr@2: * @param aType Event type. williamr@2: */ williamr@2: IMPORT_C virtual void HandleResourceChange(TInt aType); williamr@2: williamr@2: protected: // from MCoeControlObserver williamr@2: williamr@2: /** williamr@2: * From @c MCoeControlObserver. williamr@2: * williamr@2: * Handles an event from an observed control. williamr@2: * williamr@2: * @param aControl Control that caused the event. williamr@2: * @param aEventType Type of the event. williamr@2: */ williamr@2: IMPORT_C void HandleControlEventL(CCoeControl* aControl, williamr@2: TCoeEvent aEventType); williamr@2: williamr@2: private: williamr@2: williamr@2: /** williamr@2: * From CAknControl williamr@2: */ williamr@2: IMPORT_C void* ExtensionInterface( TUid aInterface ); williamr@2: williamr@2: private: williamr@2: williamr@2: /** williamr@2: * Private constructor. williamr@2: */ williamr@2: IMPORT_C void ConstructL(); williamr@2: williamr@2: private: williamr@2: williamr@2: /** williamr@2: * From CAknControl williamr@2: */ williamr@2: IMPORT_C virtual void Draw(const TRect& aRect) const; williamr@2: williamr@2: /** williamr@2: * Gets parent rect of this control. Used for layout calculation purposes. williamr@2: */ williamr@2: TRect ParentRect(); williamr@2: williamr@2: public: williamr@2: williamr@2: /** williamr@2: * Gets the default rectangle of the given control type. williamr@2: * williamr@2: * @param aControlType The control type from which default rectangle is williamr@2: * asked. williamr@2: * @param aArrowsUsed Whether or not the navigation arrows are used williamr@2: * for the control. This is only used for the williamr@2: * tab group control. If arrows are not used with williamr@2: * tab group, then the whole navi pane area williamr@2: * is provided to the tab group control. williamr@2: * williamr@2: * @return Rectangle which tells the default area for given williamr@2: * controltype. Coordinates are relative to navi pane. williamr@2: */ williamr@2: static TRect DecoratedControlRect( TInt aControlType, williamr@2: TBool aArrowsUsed = ETrue ); williamr@2: williamr@2: /** williamr@2: * Gets the default rectangle of the navigation pane's default control. williamr@2: * williamr@2: * @param aControlType Not used. williamr@2: * @return Rectangle of the navigation pane's default control. williamr@2: */ williamr@2: static TRect DecoratedControlNarrowRect( TInt aControlType ); williamr@2: williamr@2: private: williamr@2: williamr@2: /** williamr@2: * Gets the default rect of default controltype relative to navipane in williamr@2: * normal layoutstyle (@c ENaviControlLayoutNormal) williamr@2: * williamr@2: * @return Rectangle which is tells the default area for a navi control. williamr@2: * Coordinates are relative to navipane. williamr@2: * williamr@2: */ williamr@2: static TRect DecoratedDefaultControlRect(); williamr@2: williamr@2: public: williamr@2: williamr@2: /** williamr@2: * Gets the default rect of tab group control type relative to navipane in williamr@2: * normal (@c ENaviControlLayoutNormal) or wide (@c ENaviControlLayoutWide) williamr@2: * layout style. williamr@2: * williamr@2: * @param aTopAdjacent @c ETrue to return a rectangle adjacent to the williamr@2: * top of navi pane, @c EFalse for a rectangle williamr@2: * adjacent to the bottom of navi pane. williamr@2: * @param aArrowsUsed Whether or not the navigation arrows are used williamr@2: * for the tab group. If arrows are not used, then williamr@2: * the whole navi pane area is provided to the tab williamr@2: * group control. williamr@2: * williamr@2: * @return Rectangle which tells the default area for a tab group. williamr@2: */ williamr@2: static TRect DecoratedTabControlRect( TBool aTopAdjacent, williamr@2: TBool aArrowsUsed ); williamr@2: williamr@2: private: williamr@2: williamr@2: /** williamr@2: * Gets the default rect of volume controltype relative to navipane in williamr@2: * normal layoutstyle (@c ENaviControlLayoutNormal) williamr@2: * williamr@2: * @return Rectangle which is tells the default area for a volume control. williamr@2: * Coordinates are relative to navipane. williamr@2: * williamr@2: */ williamr@2: static TRect DecoratedVolumeControlRect(); williamr@2: williamr@2: /** williamr@2: * This method handles sizechanges in normal layout style. williamr@2: */ williamr@2: void SizeChangedInNormalLayout(); williamr@2: williamr@2: /** williamr@2: * This method handles sizechanges in narrow layout style. williamr@2: */ williamr@2: void SizeChangedInNarrowLayout(); williamr@2: williamr@2: /** williamr@2: * This method handles sizechanges in wide layout style. williamr@2: */ williamr@2: void SizeChangedInWideLayout(); williamr@2: williamr@2: /** williamr@2: * This method initializes timer that is used for times layout style williamr@2: * changes. williamr@2: */ williamr@2: void InitLayoutStyleTimer(); williamr@2: williamr@2: /** williamr@2: * This method cancels timer that is used for times layout style changes. williamr@2: */ williamr@2: void CancelLayoutStyleTimer(); williamr@2: williamr@2: /** williamr@2: * This method is executed when timer that is used for times layout style williamr@2: * changes expires. williamr@2: */ williamr@2: static TInt LayoutStyleEvent(TAny * aPtr); williamr@2: williamr@2: /** williamr@2: * This method is executed when timer that is used for times layout style williamr@2: * changes expires. williamr@2: */ williamr@2: void DoLayoutStyleEvent(); williamr@2: williamr@2: void StartTimerL(); williamr@2: williamr@2: void SmallDirectionIndicationL(); williamr@2: williamr@2: static TInt IndicationDrawCallbackL( TAny* aThis ); williamr@2: williamr@2: /** williamr@2: * This method cancels the timer that is used in the small direction williamr@2: * indication animation. williamr@2: */ williamr@2: void CancelTimer(); williamr@2: williamr@2: /** williamr@2: * Gets the rectangle for a navigation arrow. williamr@2: * williamr@2: * @param aScrollButton @c ELeftButton to return the rectangle williamr@2: * of the left navi arrow, williamr@2: * @c ERightButton for right navi arrow. williamr@2: * williamr@2: * @param aNarrowLayout @c ETrue to get a navi arrow rectangle williamr@2: * for a narrow decorator layout, williamr@2: * @c EFalse otherwise. williamr@2: * williamr@2: * @param aNaviRect Navi pane rectangle to be used as parent, williamr@2: * the returned rectangle is relative to this. williamr@2: * If not defined, then relative to the williamr@2: * default navi pane area. williamr@2: * williamr@2: * @return Navigation arrow rectangle. williamr@2: * Coordinates are relative to navipane. williamr@2: * williamr@2: */ williamr@2: static TRect NaviArrowRect( TScrollButton aScrollButton, williamr@2: TBool aNarrowLayout = EFalse, williamr@2: TRect aNaviRect = TRect( 0,0,0,0 ) ); williamr@2: williamr@2: protected: williamr@2: williamr@2: /** williamr@2: * Decorated control. williamr@2: * Own. williamr@2: */ williamr@2: CCoeControl* iDecoratedControl; williamr@2: williamr@2: /** williamr@2: * Navigation pane default control. williamr@2: */ williamr@2: CAknNavigationControlContainer* iContainer; williamr@2: williamr@2: /** williamr@2: * Observer for handling decorator events. williamr@2: */ williamr@2: MAknNaviDecoratorObserver* iNaviDecoratorObserver; williamr@2: williamr@2: private: williamr@2: TBool iNaviArrowsVisible; williamr@2: TBool iNaviArrowLeftDimmed; williamr@2: TBool iNaviArrowRightDimmed; williamr@2: TControlType iControlType; williamr@2: TPoint iArrowLeftPos; williamr@2: TSize iArrowLeftSize; williamr@2: TPoint iArrowRightPos; williamr@2: TSize iArrowRightSize; williamr@2: williamr@2: TInt iLayoutFlags; williamr@2: CPeriodic* iLayoutStyleTimer; williamr@2: williamr@2: CAknNavigationDecoratorExtension* iExtension; williamr@2: williamr@2: TInt iSpare; williamr@2: }; williamr@2: williamr@2: #endif // C_AKNNAVIDE_H