imstutils/imconversationview/imcvuiapp/inc/cimcvapprichtextcontainer.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:33:36 +0100
branchRCL_3
changeset 29 9a48e301e94b
parent 0 5e5d6b214f4f
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007-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:  richtext container
*  Description : Handles statuspane, context pane, navi pane
*
*/


#ifndef _CIMCVAPPRICHTEXTCONTAINER_H
#define _CIMCVAPPRICHTEXTCONTAINER_H

//  INCLUDES
#include "mimcvenginemessagecontainer.h"
#include "mimcvapplayoutchangeobserver.h"
#include "mimcvappresourcechangeobserver.h"
#include <gulicon.h>
#include <e32base.h>
#include <e32std.h>
#include <frmtlay.h> // TCursorSelection


// FORWARD DECLARATIONS
class CIMCVAppMessageWrapper;
class CParaFormatLayer;
class CCharFormatLayer;
class CRichText;
class MLayDoc;
class MIMCVAppTextView;
class CIMCVAppMessageExtensionsHandler;
class MIMCVAppUi;
class MIMCVAppResourceChangeObserver;
// CLASS DECLARATION

/**
*  Rich text container
*  @since Series 60 5.0
*/
class CIMCVAppRichTextContainer : public CBase, 
                             public MIMCVEngineMessageContainer,
                             public MIMCVAppLayoutChangeObserver,
                             public MIMCVAppResourceChangeObserver
    {
    public:  // enumerations
        enum THighlightMovement
            {
            ENext = 0,
            EPrevious
            };
            
    	static CGulIcon*& iTempIcon;


	private:    // enums
    
        enum THighlightState
            {
            ENoHighlight = 0,
            EItemSelected,
            EMessageTop,
            EMessageBottom
            };
    public:  // Constructors and destructor

        /**
         * Two-phased constructor.
         * @param aTextView Viewer of the text
         * @param aExtensionsHandler Message extensions handler
         * @param aMessageUtils Message utils
         * @param aScrollOver Should we scroll over the top and bottom,
         *                    i.e. disabling highlight when pressing up at top.
		 * @param aPrimaryKey primary key of the object - used for storage and searching
         */
        static CIMCVAppRichTextContainer* NewL(MIMCVAppUi* aAppUi,
                MIMCVAppTextView* aTextView, 
                CIMCVAppMessageExtensionsHandler* aExtensionsHandler,
                CGulIcon* aFromMe,
                CGulIcon* aToMe,
                MGraphicsDeviceMap* aMap,                              
                const TDesC& aPrimaryKey,
                TInt aServiceId,
                TBool aScrollOver /*= ETrue*/
                                );

        /**
         * Destructor.
         */
        virtual ~CIMCVAppRichTextContainer();

	 public: // From MIMCVAppResourceChangeObserver
    
        /**
         * Reload all icons on resource change
         */
        void ResourceChangedL();
    public: // New functions
    
           
        /**
         * @return Buffer containing the currently selected text
         * (or empty buffer if nothing selected)
         */
        HBufC* SelectedItemL();
        
        /**
         * @return Type of selected item
         */
        TInt SelectedItemType();

        /**
         * @return Text layout interface for displaying the text
         */
        MLayDoc* TextLayout();

        /**
         * Moves current highlight selection
         * @return KErrNotFound If there are no items to highlight. 
         *         KErrNone otherwise.
         */
        TInt MoveHighlightL( THighlightMovement aDirection );
        
        /**
         * Set all highlighting off
         */
        void DisableHighlightL();
        
              
        /**
         * @return ETrue if some item is highlighted
         */
        TBool Highlighted();
        
        /**
         * Highlights whole message or item at given position.
         * @param aPos Highlights the message or item which has 
         *             the craracter at aPos
         * @return KErrNone           - if highlighted a new item
         *         KErrAlreadyExists  - if item is already highlighted
         *         KErrNotFound       - if can't find message or item at aPos
         */
        TInt HighlightItemAtPosL( TInt aPos );
        
        
        /**
         * @returns the total messages in the view
         */
    	TInt GetMessageCount();
    	
        /**
         * Sets item highlight on or off
         * @param aItemHighlight ETrue if the items inside messages 
         *        should be highlighted
         */
        void SetItemHighlight( TBool aItemHighlight );       

    public: // From MIMCVAppLayoutChangeObserver
    
        /**
         * From MIMCVAppLayoutChangeObserver
         */
        void LayoutChangedL( TInt aType );
        
    public:
         /**
         * Returns the Primary key of the object
         */
        const TDesC& GetPrimaryKey();
    
	/**
	* Updates the color of messages according to current skin.
	* Only the theme colored part of messages are updated.
	* This method should be called when the skin is changed.
	* @return None
	*/
	void UpdateSkinnedTextColourL();
      
    protected:  // Functions from MIMCVEngineMessageContainer

        /**
         * Add new message to container
         * @param aMessage Message
         */
        void AddMessageL( MIMCVEngineMessage& aMessage );
                

        /**
         * @see MIMCVEngineMessageContainer
         */
        void InsertMessageL( MIMCVEngineMessage& aMessage );
        
    protected: // New functions
    
        /**
         * Updates all wrappers after (and including) aFirstIndex
         * Adds aChange to wrapper positions (in rich text)
         * @param aFirstIndex Index of first modified wrapper
         * @param aChange Removed or added number of characters in rich
         *                text before wrapper at aFirstIndex
         */
        void UpdateWrappers( TInt aFirstIndex, TInt aChange );
    
        /**
         * @return Union of two selections
         * @param aSel1, cursor selection position1
         * @param aSel2, cursor selection position2
         */
        TCursorSelection Union( const TCursorSelection& aSel1, 
        	const TCursorSelection& aSel2 );
        
        /**
         * @return Currently highlighted selection, or last 
         *         message if highlighting is disabled
         */
        TCursorSelection CurrentSelection() const;
        
        /**
         * Sets the background color of selected text
         * @param aSel, cursor selection position
         * @param aColor, color to use
         */
        void TextBackColorL( const TCursorSelection& aSel, const TRgb& aColor );
        
        /**
         * Sets the color of selected text
         * @param aSel, cursor selection position
         * @param aColor, color to use
         */
        void TextColorL( const TCursorSelection& aSel, const TRgb& aColor );
        
        /**
         * Sets the background color of selected paragraph
         * @param aSel, cursor selection position
         * @param aColor, color to use
         */
        void BackColorL( const TCursorSelection& aSel, const TRgb& aColor );
        
        /**
         * Format the highlight item
         * @param aSel, cursor selection position
         */
        void HighLightItemL( const TCursorSelection& aSel );
        
        /**
         * Sets the selection bold
         * @param aSel, cursor selection position
         */
        void BoldL( const TCursorSelection& aSel );
        
        /**
         * Parses text for highlight items (phone numbers, urls) and places
         * the positions to messagewrapper.
         * @param aText Text to be parsed
         * @param aStartPos Start position of aText in rich text
         * @param aRelativePos Relative position of aText inside one message
         * @param aMessageWrapper Message wrapper where positions are stored
         */
        void ParseTextL( const TDesC& aText, TInt aStartPos, TInt aRelativePos, 
        	CIMCVAppMessageWrapper& aMessageWrapper );
    
        /**
         * Add nickname of a message to rich text
         * @param aMessageWrapper Message wrapper
         * @return Selection for nickname (for coloring)
         */
        TCursorSelection AddNickL( CIMCVAppMessageWrapper& aMessageWrapper );

        /**
         * Add timestamp of a message to rich text
         * @param aMessageWrapper Message wrapper
         * @return Selection of timestamp
         */
        TCursorSelection AddTimeStampL( CIMCVAppMessageWrapper& aMessageWrapper );
        
        /**
         * Add content of a message to rich text
         * @param aMsgStart Start position of this message in rich text
         * @param aMessageWrapper Message wrapper
         */
        void AddContentL( TInt aMsgStart, CIMCVAppMessageWrapper& aMessageWrapper );
        
        

        
        /**
        * Helper method to determine which part of the message really is
        * colored by the active skin.
        * @param aMessageWrapper  Message to inspect
        * @param aUseDefaultColors Variation for default colours
        * @param aCustomDefinedColor Has user customized the message colour
        * @return Selection of the text which follows the skin color
        */
        TCursorSelection SkinColoredSelection(
                              CIMCVAppMessageWrapper& aMessageWrapper,
                              TBool aUseDefaultColors, 
                              TBool aCustomDefinedColor );
        
        /**
         * Helper method for replacing all paragraph delimiters
         * inside message content with line breaks, needed for
         * keeping text alignment consistent inside one message.
         * Used in AddContentL.
         * @since S60 v5.0
         * @param aSource Source descriptor.
         * @param aTarget Target descriptor. Caller is responsible
         *                to provide a large enough descriptor,
         *                aTarget size must not be less than
         *                size of aSource.
         */
        void ReplaceParaDelimsWithLineBreaks(
                const TPtrC& aSource,
                TPtr& aTarget ) const;
        
        /**
         * Helper method to update selection inside rich text.
         * This will remove the highlight from previously selected item
         * and add highlight to newly selected item.
         * @since S60 v5.0
         */
        void UpdateSelectionL();

        /**
         * Insert nickname of a message to rich text start.
         * @param aMessageWrapper Message wrapper.
         * @return Selection for nickname.
         */
        TCursorSelection InsertNickL( CIMCVAppMessageWrapper& aMessageWrapper );

        /**
         * Insert timestamp of a message to rich text.
         * @param aMessageWrapper Message wrapper.
         * @return Selection of timestamp.
         */
        TCursorSelection InsertTimeStampL( CIMCVAppMessageWrapper& aMessageWrapper );
        
        /**
         * Insert content of a message to rich text.
         * @param aMessageWrapper Message wrapper.
         * @return Length of content added.
         */
        TInt InsertContentL( CIMCVAppMessageWrapper& aMessageWrapper );
        
    public:
	        /**
         * Initializes the object with its cintainer's object
         * @param aTextView - container object
         */
        void Initialize( MIMCVAppUi* aAppUi,
                MIMCVAppTextView* aTextView, 
                CIMCVAppMessageExtensionsHandler* aExtensionsHandler,
                CGulIcon* aFromMe,
                CGulIcon* aToMe,
                MGraphicsDeviceMap* aMap,                              
                TBool aScrollOver /*= ETrue*/);
        
        TInt ServiceId() const;
        
        
    private:

        /**
         * constructor.
         * @param aTextView Viewer of the text
         * @param aExtensionsHandler Message extensions handler
         * @param aMessageUtils Message utils
         * @param aScrollOver Should we scroll over the top and bottom,
         *                    i.e. disabling highlight when pressing up at top.
         */
        CIMCVAppRichTextContainer( MIMCVAppUi* aAppUi,
                MIMCVAppTextView* aTextView, 
                CIMCVAppMessageExtensionsHandler* aExtensionsHandler,
                CGulIcon* aFromMe,
                CGulIcon* aToMe,
                MGraphicsDeviceMap* aMap,
                TInt aServiceId,
                TBool aScrollOver /*= ETrue*/ );

        /**
         * By default Symbian 2nd phase constructor is private.
		 * @ params aPrimaryKey - primary key of the object
         */
        void ConstructL(const TDesC& aPrimaryKey);

		CGulIcon* LoadDefaultBitmapL( TInt aBitmapId, TInt aMaskId, 
                                const TDesC& aFullPath, TBool aOverrideBrand = EFalse) ;

    private:    // Data
    
    	MIMCVAppUi* iAppUi;  
        // doesn't own, interface to text viewer
        MIMCVAppTextView* iTextView;
        
          // item highlight
        TBool iItemHighlight;
        	// current highlight state
		THighlightState iHighlightState;
			// message extensions handler
		CIMCVAppMessageExtensionsHandler* iExtensionsHandler;
	
		// Should we scroll over the top and bottom,
        // i.e. disabling highlight when pressing up at top.
        TBool iScrollOver;
      
        // Owns. Paragraph formatter
        CParaFormatLayer* iParaFormatLayer;

        // Owns. Character formatter
        CCharFormatLayer* iCharFormatLayer;

        // Owns. rich text document
        CRichText* iRichText;

        // Owns. message wrappers
        RPointerArray<CIMCVAppMessageWrapper> iMessages;
        
        // selected message
		TInt iSelected;
		
		// selected item in message
		TInt iSelectedItem;
		// previous selection
		TCursorSelection iPrevious;
		
	  // should whole message be colored
        TBool iColorWholeMessage;
        // alternative colors
        TBool iOwnMsgColorInUse;
        TRgb iOwnMsgColor;
        TBool iMsgColorInUse;
        TRgb iMsgColor;
        
        // Show timestamp setting value
        TBool iShowTimeStamps;
        
       
        // doesn't own
        const CFont* iPrimaryFont;
        const CFont* iSecondaryFont;
        
                // "From me" icon. Not owned.
        // Pointer to a pointer because this can change
        CGulIcon* iFromMe;
        
        // "To me" icon. Not owned.
        // Pointer to a pointer because this can change
        CGulIcon* iToMe;
        
        		
	    // interface to graphics device for converting pixels to twips
        MGraphicsDeviceMap* iMap;
        
		//Owns Primary key - Used while storing the object
        HBufC* iPrimaryKey;
        
        // service Id
        TInt iServiceId;
        
    };

#endif      // _CIMCVAPPRICHTEXTCONTAINER_H

// End of File