uifw/AvKon/inc/AknPhedView.h
changeset 0 2f259fa3e83a
--- /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 <gdi.h>
+#include <w32std.h>
+#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<TAknPhedViewLine> 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