williamr@4: /* williamr@4: * Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@4: * All rights reserved. williamr@4: * This component and the accompanying materials are made available williamr@4: * under the terms of "Eclipse Public License v1.0" williamr@4: * which accompanies this distribution, and is available williamr@4: * at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@4: * williamr@4: * Initial Contributors: williamr@4: * Nokia Corporation - initial contribution. williamr@4: * williamr@4: * Contributors: williamr@4: * williamr@4: * Description: williamr@4: * williamr@4: */ williamr@4: williamr@4: williamr@4: #if !defined(__EIKDPAGE_H__) williamr@4: #define __EIKDPAGE_H__ williamr@4: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: williamr@4: // williamr@4: // Forward declarations. williamr@4: // williamr@4: williamr@4: class CEikCapCArray; williamr@4: class CEikCaptionedControl; williamr@4: class CEikDialogPageContainer; williamr@4: class CEikEdwin; williamr@4: class CEikLabel; williamr@4: class MEikDialogPageObserver; williamr@4: struct SEikControlInfo; williamr@4: class CAknLayoutData; williamr@4: class CDialogPageExtension; williamr@4: williamr@4: class CEikFormAnim; williamr@4: class MEikFormAnimObserver; williamr@4: class CAknPaneScroll; williamr@4: class CAknFormPhysics; williamr@4: williamr@4: /** williamr@4: * The CEikDialogPage class implements a scrollable dialog page control. williamr@4: * williamr@4: * @internal williamr@4: * @since ER5U williamr@4: */ williamr@4: NONSHARABLE_CLASS(CEikDialogPage) : williamr@4: public CAknControl, williamr@4: public MCoeControlObserver, williamr@4: public MEikScrollBarObserver, williamr@4: public MEikEdwinSizeObserver, williamr@4: public MAknPopupFieldObserver, williamr@4: public MEikEdwinObserver williamr@4: { williamr@4: public: williamr@4: enum TFocusNavigationMode williamr@4: { williamr@4: ECyclic, williamr@4: ENonCyclic williamr@4: }; williamr@4: enum TAScrollBarBreadthAllocationMode williamr@4: { williamr@4: ENone =0x0000, williamr@4: EScrollBarBreadthPreAllocated =0x1000 williamr@4: }; williamr@4: /** williamr@4: * Enumeration to express what layout is currently being used. Note that the use of williamr@4: * bitmaps on the left is controlled by D williamr@4: * williamr@4: */ williamr@4: enum TFormLayoutSelection williamr@4: { williamr@4: ESingle, williamr@4: EDouble williamr@4: }; williamr@4: williamr@4: /** williamr@4: * Used with iFormFlags to indicate where optimisations may or may not occur. williamr@4: * Uses bits above 0x100 as those below are used as static form flags for configuration by resource file. williamr@4: */ williamr@4: enum TDynamicFormFlags williamr@4: { williamr@4: EFormResizeOptimisationFlag = 0x100 , williamr@4: EFormForceEdwinResizeFlag = 0x200 williamr@4: } ; williamr@4: williamr@4: public: williamr@4: ~CEikDialogPage(); williamr@4: static CEikDialogPage* NewL(TInt aId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,const CEikDialogPageContainer& aParent,MEikDialogPageObserver* aPageObserver); williamr@4: static CEikDialogPage* NewLC(TInt aId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,const CEikDialogPageContainer& aParent,MEikDialogPageObserver* aPageObserver); williamr@4: static CEikDialogPage* NewL(TInt aId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,const CEikDialogPageContainer& aParent,MEikDialogPageObserver* aPageObserver,TResourceReader& aReader); williamr@4: static CEikDialogPage* NewLC(TInt aId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,const CEikDialogPageContainer& aParent,MEikDialogPageObserver* aPageObserver,TResourceReader& aReader); williamr@4: void SetDataPosition( TInt aTopY, TInt aBottomY, TBool aForceResize ); williamr@4: TSize PreferredSize() const; williamr@4: void SetActiveL(); williamr@4: void SetActiveAndFocusL(); williamr@4: void SetInactiveL(); williamr@4: TInt PageId() const; williamr@4: TInt LineId(const CCoeControl& aControl) const; williamr@4: TBool SetInitialFocus(); williamr@4: CCoeControl* CreateLineByTypeL(const TDesC& aCaption,TInt aLineId,TInt aControlType,TAny* aReturnValue); williamr@4: CCoeControl* Control(TInt aLineId) const; williamr@4: CCoeControl* ControlOrNull(TInt aLineId) const; williamr@4: TInt ControlHeight(TInt aLineIndex) const; williamr@4: CEikCaptionedControl* Line(TInt aLineId) const; williamr@4: CEikCaptionedControl* LineOrNull(TInt aLineId) const; williamr@4: CEikCaptionedControl* CurrentLine() const; williamr@4: void SetDensePacking(TBool aDensePacking); williamr@4: void InsertLineL(TInt aPosition,TInt aResourceId); williamr@4: void DeleteLine(TInt aLineId,TBool aRedrawNow); williamr@4: void AdjustAllIds(TInt aControlIdDelta); williamr@4: TInt FocusLineL(TInt aLineId); williamr@4: TInt FocusedLineId() const; williamr@4: void GetAutoValues(); williamr@4: TKeyResponse OfferUpDownKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType,TFocusNavigationMode aFocusNavigationMode); williamr@4: TBool OwnsLine(TInt aLineId) const; williamr@4: void ResetLineMinimumSizes(); williamr@4: TInt FindLineIndex(const CCoeControl* aControl) const; williamr@4: TBool RotateFocusByL(TInt aDelta); williamr@4: TKeyResponse OfferHotKeysKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType); williamr@4: TBool TakesEnterKey(); williamr@4: TInt LineIndex(TInt aLineId); williamr@4: void ReportPageChangedL(); williamr@4: TInt GetFormFlags() const; williamr@4: void SetFormFlag( TInt16 aFlag, TBool aEnable ) ; // used with TDynamicFormFlags williamr@4: void ConstructFormFromResourceL( TResourceReader& aReader ) ; williamr@4: void SetEditableL( TBool aEditable, TBool aActivePage ) ; williamr@4: TBool IsEditable() const; williamr@4: TBool IsForm() const; williamr@4: williamr@4: void SetDoubleQuery(TBool aIsDoubleQuery); williamr@4: williamr@4: CEikFormAnim* AcquireAnim( TBool aAcquire, MEikFormAnimObserver* aObserver ) const; williamr@4: williamr@4: public: williamr@4: void UpdateScrollBarL(); williamr@4: TBool LineHandlerCalled() const; williamr@4: williamr@4: public: // from CCoeControl williamr@4: TSize MinimumSize(); williamr@4: virtual void GetColorUseListL(CArrayFix& aColorUseList) const; williamr@4: virtual void HandleResourceChange(TInt aType); williamr@4: virtual void PrepareForFocusLossL(); williamr@4: virtual void SetDimmed(TBool aDimmed); williamr@4: virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType); williamr@4: public: // from MCoeControlObserver williamr@4: virtual void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType); williamr@4: public: // from MEikEdwinSizeObserver williamr@4: virtual TBool HandleEdwinSizeEventL(CEikEdwin* aEdwin, TEdwinSizeEvent aEventType, TSize aDesirableEdwinSize); williamr@4: public: // from MEikEdwinObserver williamr@4: virtual void HandleEdwinEventL(CEikEdwin* aEdwin,TEdwinEvent aEventType); williamr@4: williamr@4: public: // from MAknPopupFieldObserver williamr@4: virtual void HandlePopupFieldEventL(CAknPopupField* aPopupField, TAknPopupFieldEvent aEventType, TInt aHint); williamr@4: public: williamr@4: void SetPageContainer(const CEikDialogPageContainer* aPageContainer); williamr@4: const CEikDialogPageContainer* PageContainer() const; williamr@4: protected: // from CCoeControl williamr@4: void WriteInternalStateL(RWriteStream& aWriteStream) const; williamr@4: void SizeChanged(); williamr@4: TInt CountComponentControls() const; williamr@4: CCoeControl* ComponentControl(TInt aIndex) const; williamr@4: void FocusChanged(TDrawNow aDrawNow); williamr@4: void Draw(const TRect& aRect) const; williamr@4: public: williamr@4: // added to allow Form format to be set by API williamr@4: IMPORT_C void SetFormLayout(TFormLayoutSelection aLayout); williamr@4: IMPORT_C TFormLayoutSelection FormLayout() const; williamr@4: public: williamr@4: public: williamr@4: TBool IsAtOrOffTopOfPage(const CCoeControl* aControl) const; williamr@4: TBool IsAtOrOffBottomOfPage(const CCoeControl* aControl) const ; williamr@4: public: williamr@4: TBool VisibleSizeOnPage(TInt& aHeightOfControlVisibleOnPage, const CCoeControl* aControl) const; williamr@4: williamr@4: /** williamr@4: * Scrolls cached drawing commands by @c aDelta pixels in y direction. williamr@4: * williamr@4: * @param aDelta A y-asix base on the sliding control's coordinate. williamr@4: * @param aDebugMsg Not used. williamr@4: * @param aDrawNow Whether or not the view should be drawn. williamr@4: */ williamr@4: void ScrollCacheByPixels( TInt aDelta, williamr@4: const TDesC& aDebugMsg, williamr@4: TBool aDrawNow = ETrue ); williamr@4: williamr@4: /** williamr@4: * Updates line's cached drawing commands. williamr@4: */ williamr@4: void UpdateLineInCache( CEikCaptionedControl* aLine ); williamr@4: williamr@4: /** williamr@4: * Physics simulation ended. williamr@4: */ williamr@4: void Synchronize(); williamr@4: williamr@4: /** williamr@4: * Can be used to query whether highlight graphics should be drawn. williamr@4: * williamr@4: * @since S60 5.2 williamr@4: * williamr@4: * @return ETrue if highlight should be drawn. williamr@4: */ williamr@4: TBool HighlightVisible() const; williamr@4: williamr@4: protected: // from MEikScrollBarObserver williamr@4: virtual void HandleScrollEventL(CEikScrollBar* aScrollBar,TEikScrollEvent aEventType); williamr@4: williamr@4: private: // new functions williamr@4: void AfterAddingNewLinesL(TInt aNewLineAdded); williamr@4: williamr@4: CEikDialogPage(TInt aId,RWindow& aViewWin,CEikScrollBarFrame& aSBFrame,MEikDialogPageObserver* aPageObserver); williamr@4: void ConstructL(); williamr@4: void ConstructFromResourceL(TResourceReader& aReader, TBool aFormControl = EFalse ); williamr@4: void ConstructByTypeL(TInt aControlType,CEikCaptionedControl* aLine,CCoeControl* aContainer); williamr@4: void ShowFocus(TBool aFocus, TBool aRedraw=ETrue); williamr@4: SEikControlInfo CreateCustomControlL(TInt aControlType); williamr@4: void ChangeFocusTo(TInt aLineIndex); williamr@4: void PrepareForFocusTransitionL(); williamr@4: void ChangeFocusToAndExposeL(TInt aLine,TBool aShowWholeControl=EFalse); williamr@4: TInt TopFocusableLine() const; williamr@4: TInt BottomFocusableLine() const; williamr@4: TBool LineIsFocusable(TInt aLine) const; williamr@4: TBool ResizeEdwinToFitTextL(CEikEdwin* aEdwin, TDrawNow aDrawNow, TSize aDesirableEdwinSize); williamr@4: TInt YPosToLine2(TInt aYPos) const; williamr@4: TInt LineToYPos(TInt& aLine) const; williamr@4: void ExposeLine(TInt aLine, TBool aForceResize, TBool aShowWholeLine = EFalse ); williamr@4: void PassOnEventL(CCoeControl* aControl,MCoeControlObserver::TCoeEvent aEvent); williamr@4: CEikCaptionedControl* ConstructLineL(TInt aResourceId); williamr@4: CEikCaptionedControl* ConstructLineL(TResourceReader& aReader); williamr@4: TKeyResponse HandleCyclicFocusNavigationKeyL(const TKeyEvent& aKeyEvent); williamr@4: TKeyResponse HandleNonCyclicFocusNavigationKeyL(const TKeyEvent& aKeyEvent); williamr@4: void MakeEdwinScrollbarsVisibleL(TBool aVisible); williamr@4: void LineChangedL(TInt aControlId); williamr@4: void UpdateScrollBarThumb(); williamr@4: void ReconsiderPageSize(); williamr@4: void PrepareToDrawVerticalLine() const; williamr@4: williamr@4: /** williamr@4: * Specialized pointer event handling for forms. williamr@4: */ williamr@4: void HandleFormPointerEventL( const TPointerEvent& aPointerEvent ); williamr@4: williamr@4: /** williamr@4: * Updates physics data. williamr@4: */ williamr@4: void UpdatePhysics(); williamr@4: williamr@4: /** williamr@4: * Callback for highlight timer. williamr@4: */ williamr@4: static TInt HighlightTimerCallBack( TAny* aPtr ); williamr@4: williamr@4: /** williamr@4: * Handles highlight timer's expiration. williamr@4: */ williamr@4: void HandleHighlightTimer(); williamr@4: williamr@4: /** williamr@4: * Performs forced redraw of aControl and its component controls. williamr@4: */ williamr@4: void DrawControl( CCoeControl* aControl ) const; williamr@4: williamr@4: /** williamr@4: * Record all lines drawing commands to the cache. Existing cache is purged. williamr@4: */ williamr@4: void RecordLinesL(); williamr@4: williamr@4: /** williamr@4: * Records one line's drawing commands to the cache replacing existing commands for that line. williamr@4: */ williamr@4: void RecordLineL( TInt aLine ); williamr@4: williamr@4: /** williamr@4: * Scrolls all lines by aPixels in y direction. williamr@4: */ williamr@4: void ScrollByPixels( TInt aDelta ); williamr@4: williamr@4: /** williamr@4: * Removes pressed down highlight. williamr@4: */ williamr@4: void RemovePressedDownHighlight(); williamr@4: williamr@4: /** williamr@4: * Sets highlight's visibility. williamr@4: * williamr@4: * @since S60 5.2 williamr@4: * williamr@4: * @param aVisible ETrue to set highlight visible. williamr@4: */ williamr@4: void HighlightVisible( TBool aVisible ); williamr@4: williamr@4: enum TScrollDirection williamr@4: { williamr@4: ESingleLineScrollUp , williamr@4: ESingleLineScrollDown williamr@4: } ; williamr@4: void RegisterComponentL(TInt aControlType, CCoeControl* aControl, CEikCaptionedControl* aLine); williamr@4: static void CommonConstructCodeBetweenNewL(CEikDialogPage& aDialogPage, const CEikDialogPageContainer& aParent); williamr@4: williamr@4: public: williamr@4: TBool AnythingToDisplay() const; williamr@4: void DrawVerticalLine() const; williamr@4: CEikCaptionedControl* LineOnPageOrNull(TInt aLine) const; williamr@4: TSize RealDataSize() const; williamr@4: TInt NumberOfLines() const; williamr@4: CEikCaptionedControl* LineByIndex(TInt aIndex) const; williamr@4: williamr@4: private: williamr@4: CEikCapCArray* iLines; williamr@4: MEikDialogPageObserver* iPageObserver; williamr@4: TInt iPageId; williamr@4: TInt iCurrentLine; williamr@4: TInt16 iFormFlags ; williamr@4: TBool iIsEditable; williamr@4: TBool iFormControl ; williamr@4: TInt iLastExposedLine; williamr@4: TInt iLastExposedLineViewWinYPosition; williamr@4: const CEikDialogPageContainer* iPageContainer; williamr@4: TFormLayoutSelection iFormLayout; williamr@4: CAknPaneScroll *iScroll; williamr@4: public: williamr@4: mutable CEikEdwin* iIgnoreFurtherEdwinResizeEvents; williamr@4: private: williamr@4: CDialogPageExtension* iExtension; williamr@4: void DrawEmptyListL( CWindowGc& aGc ); williamr@4: CAknFormPhysics* iPhysics; williamr@4: williamr@4: /** williamr@4: * Stores highlight's visibility. williamr@4: */ williamr@4: TBool iHighlightVisible; williamr@4: williamr@4: public: williamr@4: /** williamr@4: * HandlePointerEventL williamr@4: * Function notifys the pages observer that the page has been tapped. (stylus down&up) williamr@4: * @param aPointerEvent the pointer event. williamr@4: */ williamr@4: virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent); williamr@4: williamr@4: void SetScbState(TBool aExternal); williamr@4: TBool ScbState() const; williamr@4: williamr@4: private: williamr@4: /** williamr@4: * From CAknControl williamr@4: */ williamr@4: IMPORT_C void* ExtensionInterface( TUid aInterface ); williamr@4: }; williamr@4: williamr@4: williamr@4: /** williamr@4: * The CEikDialogPageContainer class contains one or more dialog pages and provides an interface to the active williamr@4: * page. williamr@4: * williamr@4: * @internal williamr@4: * @since ER5U williamr@4: */ williamr@4: NONSHARABLE_CLASS(CEikDialogPageContainer) : public CAknControl, public MCoeControlContext, public MCoeControlHitTest williamr@4: { williamr@4: public: williamr@4: ~CEikDialogPageContainer(); williamr@4: static CEikDialogPageContainer* NewL(const CCoeControl& aParent,MEikDialogPageObserver* aPageObserver); williamr@4: static CEikDialogPageContainer* NewLC(const CCoeControl& aParent,MEikDialogPageObserver* aPageObserver); williamr@4: TSize PreferredSize(const TSize& aMaxSize) const; williamr@4: void SetActivePageByIdL(TInt aPageId); williamr@4: void SetActivePageByIndexL(TInt aPageIndex); williamr@4: TInt ActivateFirstPageL(); williamr@4: void AddPageL(TInt aPageId); williamr@4: void AddPageL(TInt aPageId,TResourceReader& aReader); williamr@4: TBool SetInitialFocus(); williamr@4: CEikCaptionedControl* Line(TInt aLineId) const; williamr@4: CEikCaptionedControl* LineOrNull(TInt aLineId) const; williamr@4: CEikCaptionedControl* CurrentLine() const; williamr@4: void SetPageDensePacked(TInt aPageId,TBool aDensePacked); williamr@4: void SetAllPagesDensePacked(TBool aDensePacked); williamr@4: void SetPageDimmed(TInt aPageId,TBool aDimmed,TDrawNow aDrawNow); williamr@4: TBool IsActivePageDimmed() const; williamr@4: TInt LineId(const CCoeControl& aControl) const; williamr@4: void InsertLineL(TInt aPosition,TInt aPageId,TInt aResourceId); williamr@4: void DeleteLine(TInt aLineId, TBool aRedrawNow); williamr@4: void AdjustAllIds(TInt aPageId,TInt aControlIdDelta); williamr@4: CCoeControl* CreateLineByTypeL(const TDesC& aCaption,TInt aLineId,TInt aControlType,TAny* aReturnValue); williamr@4: CCoeControl* CreateLineByTypeL(const TDesC& aCaption,TInt aPageId,TInt aLineId,TInt aControlType,TAny* aReturnValue); williamr@4: TInt FocusLineL(TInt aLineId); williamr@4: TInt FocusedLineId() const; williamr@4: void GetAutoValues(); williamr@4: TKeyResponse OfferUpDownKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType,CEikDialogPage::TFocusNavigationMode aFocusNavigationMode); williamr@4: TInt ActivePageId() const; williamr@4: TInt ActivePageIndex() const; williamr@4: void ResetLineMinimumSizes(); williamr@4: TInt FindLineIndex(const CCoeControl& aControl) const; williamr@4: TBool RotateFocusByL(TInt aDelta); williamr@4: TInt NumPages() const; williamr@4: TKeyResponse OfferHotKeysKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType); williamr@4: TBool TakesEnterKey(); williamr@4: TInt FindPageIndexForLineId(TInt aLineId); williamr@4: CEikDialogPage* Page( TInt aPageID ) ; williamr@4: void SetEditableL( TBool aEditable ) ; williamr@4: williamr@4: CEikFormAnim* AcquireAnim( TBool aAcquire, MEikFormAnimObserver* aObserver ) const; williamr@4: williamr@4: public: // from CCoeControl williamr@4: virtual void Draw(const TRect& aRect) const; williamr@4: virtual TSize MinimumSize(); williamr@4: virtual void PrepareForFocusLossL(); williamr@4: virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType); williamr@4: virtual void HandleResourceChange(TInt aType); williamr@4: public: // from MCoeControlContext williamr@4: virtual void PrepareContext(CWindowGc& aGc) const; williamr@4: public: williamr@4: TBool HitRegionContains( const TPoint& aPoint, const CCoeControl& aControl ) const; williamr@4: public: williamr@4: void SetPageFormSized(); williamr@4: protected: // from CCoeControl williamr@4: virtual void SizeChanged(); williamr@4: virtual TInt CountComponentControls() const; williamr@4: virtual CCoeControl* ComponentControl(TInt aIndex) const; williamr@4: virtual void ActivateL(); williamr@4: virtual void FocusChanged(TDrawNow aDrawNow); williamr@4: virtual void WriteInternalStateL(RWriteStream& aWriteStream) const; williamr@4: public: williamr@4: void SetPageSelector(const CEikDialogPageSelector* aPageSelector); williamr@4: const CEikDialogPageSelector* PageSelector() const; williamr@4: private: williamr@4: CEikDialogPageContainer(MEikDialogPageObserver* aPageObserver); williamr@4: void ConstructL(const CCoeControl& aParent); williamr@4: void ConstructFromResourceL(TResourceReader& aReader,const CCoeControl& aParent); williamr@4: void CommonConstructL(const CCoeControl& aParent); williamr@4: void CreatePageArrayL(); williamr@4: TInt PageIndex(TInt aPageId) const; williamr@4: TInt PageId(TInt aIndex) const; williamr@4: TInt PageIdFromLineId(TInt aLineId) const; williamr@4: public: williamr@4: void CreateScrollBarL(const CCoeControl& aParent); williamr@4: CEikScrollBarFrame* ScrollBar() const; williamr@4: williamr@4: private: williamr@4: CEikScrollBarFrame* iSBFrame; williamr@4: CArrayPtr* iPageArray; williamr@4: MEikDialogPageObserver* iPageObserver; williamr@4: TInt iActivePage; williamr@4: const CEikDialogPageSelector* iPageSelector; williamr@4: TBool iForm; williamr@4: TBool iIsEditable; williamr@4: williamr@4: /** williamr@4: * A singleton animation object for interfacing AknsEffectAnimation. All williamr@4: * captioned controls (in all dialog pages) share the same animation. williamr@4: * Only animation creation and memory management is vested here. Actual williamr@4: * animation usage is implemented in CaptionedControl. williamr@4: */ williamr@4: CEikFormAnim* iAnimation; williamr@4: }; williamr@4: williamr@4: #endif