diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/inc/AknPhedView.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/inc/AknPhedView.h Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,334 @@ +/* +* Copyright (c) 2002-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: +* +*/ + +#ifndef AKNPHEDVIEW_H +#define AKNPHEDVIEW_H + +// INCLUDE FILES + +#include "AknPhedModel.h" +#include +#include +#include "AknUtils.h" + +// FORWARD DECLARATIONS + +class CAknPhoneNumberEditor; +class MAknsSkinInstance; +class MAknsControlContext; + +// +// TAknPhedViewLine +// +// Encapsulates the concept of a display line which exists as one of a set of lines. +// Handles text, cursor and truncation positioning and drawing. +// Note: position indexing is from RHS, since this class shows right justified text. +// +class TAknPhedViewLine + { + public: + TAknPhedViewLine(); + + // structural manipulation + inline void SetModel( CAknPhedModel* aData ); + inline void SetLeftLine( TAknPhedViewLine* iLeft ); + inline void SetRightLine( TAknPhedViewLine* iRight ); + void SetFormat( const CFont* aFont, const TRect& aRect, TInt aBaseline ); + + // Line limits manipulation + inline TInt LeftPos() const; + inline TInt RightPos() const; + inline TBool LineContains( TInt aPos ) const; + inline TInt LineWidth() const; + void SetLeftPos( TInt aPos ); + void SetRightPos( TInt aPos ); + + // Event handlers + TBool HandleTextChange( TInt aStart, TInt aEnd ); + TBool HandleCursorChange( TInt aCursor ); + void HandleSelectionChange( TInt aLeft, TInt aRight ); + + // Utility functions + inline TBool InRange( TInt aPos, TInt aLeft, TInt aRight ) const; + TInt CountChars( const TDesC& aDes, TBool aStartTruncated, + TBool aAllowEndTruncation, TInt aCharsToEnd ) const; + + // Truncation functions + void SetTruncation( const TDesC& aTruncation ); + inline TInt TruncationWidth() const; + inline TBool IsTruncated() const; + inline TBool IsTruncatedLeft() const; + inline TBool IsTruncatedRight() const; + + // Selection functions + TBool HasSelection() const; + TInt SelectionStart() const; + TInt SelectionEnd() const; + + // Position translation functions + TInt CursorPosToXPos( TInt aCursorPos ) const; + TInt XPosToCursorPos( TInt aXPos ) const; + + // Positioning functions + inline TInt Baseline() const; + TPoint CursorPosition() const; + + // Text access functions + TPtrC Text() const; + TPtrC ReverseText() const; + TPtrC MaxText() const; + TPtrC MaxReverseText() const; + + // Drawing + inline void SetRedrawRequired(); + inline TBool IsRedrawRequired() const; + void Draw( CWindowGc& aGc, MAknsSkinInstance* aSkin, + MAknsControlContext* aContext, const CCoeControl* aControl ) const; + void DrawText( CGraphicsContext& aGc, const TDesC& aText, TInt aBaseline, + TRect& aRect ) const; + + TRect Rect() const; + + private: + // + // Measuring and drawing routines capable of implementing character translation. + //(for ArabicIndic number support) + // + + /** + * This routine is used to Draw text with settings-dependent numerals. + * It is used as a replacement for CGraphicsContext::DrawText( const TDesC& aText, + * TInt aBaseline, TRect& aRect, CGraphicsContext:TAlign aAlignment); + * except that numeric digits will be replaced with the correct digits according + * to device settings. + * + * The buffer passed to this routine must be <= length than the buffers + * present in CAknPhedModel. + */ + void DrawTextWithTranslation( CGraphicsContext& aGc, const TDesC& aText, + TInt aBaseline, TRect& aRect ) const; + + /** + * This routine is used to count the numbers of unicode characters that fit in the given width + * It is used as a replacement for CFont::TextCount( const TDesC& aText, TInt aWidth ); + * except that numeric digits will be replaced before measurement with + * the correct digits according to device settings. + * + * The buffer passed to this routine must be <= length than the + * buffers present in CAknPhedModel. + */ + TInt TextCountWithTranslation( const TDesC& aText, TInt aWidth ) const; + + /** + * This routine is used to measure the width of the text when rendered. + * It is used as a replacement for CFont::TextWidthInPixels( const TDesC& aText ); + * except that numeric digits will be replaced before measurement with + * the correct digits according to device settings. + * + * The buffer passed to this routine must be <= length than the buffers + * present in CAknPhedModel. + */ + TInt TextWidthInPixelsWithTranslation( const TDesC& aText ) const; + + void DrawHighlightText( CGraphicsContext& aGc, TBool aUseSkin ) const; + TPtr TranslatedText( const TDesC& aText ) const; + + private: + // None of these pointer data members own the objects pointed to. + CAknPhedModel* iModel; + TAknPhedDataMirror iMirror; + const CFont* iFont; + TRect iRect; + TInt iBaseline; + TPtrC iTruncation; + TInt iTruncationWidth; + + TAknPhedViewLine* iLeftLine; + TAknPhedViewLine* iRightLine; + + TInt iCursor; + TInt iLeftPos; + TInt iRightPos; + + mutable TBool iRedraw; + + private: // for testing + friend class CTestPhedView; + }; + +typedef CArrayFixFlat CAknPhedViewLineArray; + + + + // + // CAknPhedView + // + // Encapsulates the logical and positional relationships between display lines. + // Handles "vertical" operations and logic. + // Note: position indexing is from bottom-RHS, since this class + // shows bottom-right justified text. + // +NONSHARABLE_CLASS( CAknPhedView ) : public CBase, public MPhedDataObserver + { +public: + enum + { + KNoPos = -1 + }; + +public: + CAknPhedView( CAknPhedModel* aModel ); + ~CAknPhedView(); + void ConstructL( TInt aMaxLines, const TDesC& aTruncation ); + void SetWindows( RWindowGroup* aWg, RWindowBase* aWindow ); + void SetChangeReceiver( CAknPhoneNumberEditor* aChangeReceiver ); + + // Format manipulation functions + TBool IsTruncated() const; + void SetFormat( TInt aLines, const CFont* aFont, const TRect& aRect, + TInt aBottomBaselineOffset, TInt aBaselineSeparation ); + TRect Rect() const; + + // Drawing and cursor graphics + void EnableCursor(); + void DisableCursor(); + void Draw( CWindowGc& aGc, TBool aRedrawAll, const CCoeControl* aControl ) const; + + // vertical navigation functions + TBool CursorUp( TInt aTargetCursorPos ); + TBool CursorDown( TInt aTargetCursorPos ); + TBool SelectUp( TInt aTargetCursorPos ); + TBool SelectDown( TInt aTargetCursorPos ); + TPoint CursorPosition() const; + TInt CursorLine() const; + inline const CAknPhedViewLineArray* LineArray(); + + /** + * Calculate cursor position by pointer position. + * + * @param aPt, the pointer position. + * @return cursor position for CAknPhedModel. + */ + TInt GetCursorPosByPoint( const TPoint& aPt ); + +private: + // Event handling and reformatting + void HandlePhedDataEvent( const TAknPhedDataEvent& aEvent, + CAknPhedModel* aPhedData ); + void FullFormat(); + void TextChangeFormat( TInt aStart, TInt aEnd ); + void CursorChangeFormat( TInt aCursor ); + void SelectionChangeFormat( TInt aLeft, TInt aRight ); + void SetLeftPos( TInt aPos ); + + // cursor positioning and drawing + void MoveCursorToLine( TInt aLineNo, TInt aTargetCursorPos ); + void UpdateCursor(); + void SetCursorFormat( const CFont* aFont ); + + // Setting up the logical relationship between lines + void SetConnectingLines( TAknPhedViewLine& aLine, TInt aLineNum ); + +private: + // owned pointer member + CAknPhedViewLineArray* iLines; + HBufC* iTruncation; + + // non-owned pointer members + CAknPhedModel* iModel; + TAknPhedDataMirror iMirror; + + TInt iNumLines; + TInt iCursorLine; + const CFont* iFont; + TRect iRect; + + TTextCursor iCursor; + TBool iCursorEnabled; + RWindowGroup* iWg; + RWindowBase* iWindow; + + CAknPhoneNumberEditor* iChangeReceiver; + +private: // for testing + friend class CTestPhedView; + }; + + +inline void TAknPhedViewLine::SetModel( CAknPhedModel* aModel ) + { iModel = aModel; iMirror.SetPhedModel( iModel ); } + +inline void TAknPhedViewLine::SetLeftLine( TAknPhedViewLine* iLeft ) + { iLeftLine = iLeft; } + +inline void TAknPhedViewLine::SetRightLine( TAknPhedViewLine* iRight ) + { iRightLine = iRight; } + +inline TInt TAknPhedViewLine::LeftPos() const + { return iLeftPos; } + +inline TInt TAknPhedViewLine::RightPos() const + { return iRightPos; } + +inline TBool TAknPhedViewLine::LineContains( TInt aPos ) const + { return InRange(aPos, iLeftPos, iRightPos); } + +inline TBool TAknPhedViewLine::InRange( TInt aPos, TInt aLeft, TInt aRight ) const + { return aLeft >= aPos && aPos >= aRight; } + +inline TInt TAknPhedViewLine::TruncationWidth() const + { return iTruncationWidth; } + +inline TBool TAknPhedViewLine::IsTruncated() const + { return IsTruncatedLeft() || IsTruncatedRight(); } + +inline TBool TAknPhedViewLine::IsTruncatedLeft() const + { return !iLeftLine && iLeftPos < iModel->Length(); } + +inline TBool TAknPhedViewLine::IsTruncatedRight() const + { return !iRightLine && iRightPos > 0; } + +inline TInt TAknPhedViewLine::LineWidth() const + { return iLeftPos - iRightPos; } + +inline void TAknPhedViewLine::SetRedrawRequired() + { iRedraw = ETrue; } + +inline TBool TAknPhedViewLine::IsRedrawRequired() const + { return iRedraw; } + +inline TInt TAknPhedViewLine::Baseline() const + { return iBaseline; } + +inline TPtrC TAknPhedViewLine::MaxText() const + { return iModel->Text(iMirror.Mirror(iLeftPos), iModel->Length() - 1); } + +inline TPtrC TAknPhedViewLine::MaxReverseText() const + { return iModel->ReverseText(iRightPos, iModel->Length() - 1); } + +inline TPtrC TAknPhedViewLine::Text() const + { return MaxText().Left(LineWidth()); } + +inline TPtrC TAknPhedViewLine::ReverseText() const + { return MaxReverseText().Left(LineWidth()); } + +inline const CAknPhedViewLineArray* CAknPhedView::LineArray() + { + return iLines; + } + +#endif