meetingrequest/mrgui/mrfieldbuildercommon/inc/cesmrrichtextviewer.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:39:21 +0200
changeset 0 8466d47a6819
child 12 4ce476e64c59
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2003-2009 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 : CEikRichTextEditor based Rich Text viewer
*  Version     : %version: tr1sido#4.1.4 %
*
*/

#ifndef CESMRRICHTEXTVIEWER_H
#define CESMRRICHTEXTVIEWER_H

#include <eikrted.h>
#include <cntitem.h>
#include <eikcmobs.h>
#include <aknlongtapdetector.h>

#include "resmrstatic.h"

class CESMRRichTextLink;
class CESMRLayoutManager;
class MESMRFieldEventQueue;

// SCROLLING_MOD: List observer forward declaraion
class MESMRListObserver;

/*
 * Pure virtual link selection observer.
 */
class MESMRRichTextObserver
    {
public:
    /*
     * CESMRichTextViewer calls this function with selected link before
     * showing Contact Action Menu. If observer handles link selection it
     * should return ETrue, in which case CESMRRichTextViewer won't handle
     * it.
     */
    virtual TBool
            HandleRichTextLinkSelection(const CESMRRichTextLink* aLink ) = 0;
    };

/*
 * CEikRichTextEditor based Rich Text viewer.
 */
NONSHARABLE_CLASS( CESMRRichTextViewer ) : public CEikRichTextEditor,
                                           public MEikCommandObserver, 
                                           public MAknLongTapDetectorCallBack
    {
public:
    /*
     * Two-phase constructor.
     * @param aParent if aParent is NULL, 
     * 				  CEikRichTextEditor is constucted as 
     * 				  window owning control.
     * @return Created object
     */
    IMPORT_C static CESMRRichTextViewer* NewL(
            const CCoeControl* aParent = NULL);

    /*
     * Destructor.
     */
    IMPORT_C ~CESMRRichTextViewer( );

    // From CCoeControl
    IMPORT_C void PositionChanged( );
    IMPORT_C void FocusChanged( TDrawNow aDrawNow );
    IMPORT_C TKeyResponse OfferKeyEventL(
    		const TKeyEvent &aKeyEvent, 
    		TEventCode aType );

    IMPORT_C void SetMargins( TInt sMargin );

    IMPORT_C void SetFontL( 
    		const CFont* aFont, 
    		CESMRLayoutManager* aLayout = NULL );

    /*
     * Sets CEikRichTextEditor's text and searches text for emails,
     * phone numbers and urls if aSearchLinks is set to ETrue.
     *
     * @param aText text to be set for CEikRichTextEditor
     * @param aSearchLinks search emails, phone numbers and urls
     */
    IMPORT_C void SetTextL(const TDesC* aText, TBool aSearchLinks = EFalse );

    /*
     * Sets observer for link selections.
     * @param aLinkObserver pointer to observer object
     */
    IMPORT_C void SetLinkObserver(MESMRRichTextObserver* aLinkObserver);

    /*
     * Adds link to text.
     * @param aLink link to be added
     */
    IMPORT_C void AddLinkL(CESMRRichTextLink* aLink );
    
    /**
     * Inserts link to text.
     * @param aLink link to be added
     * @param aPosition position where link is added
     */
    IMPORT_C void InsertLinkL( CESMRRichTextLink* aLink, TInt aPosition );

    /*
     * Returns selected link, or NULL if none selected.
     */
    IMPORT_C const CESMRRichTextLink* GetSelectedLink( ) const;

    /*
     * Returns text for selected link from underlying CEikRichTextViewer.
     *
     * @param aLink link
     */
    IMPORT_C HBufC* GetLinkTextL( const CESMRRichTextLink& aLink ) const;

    /*
     * Returns pointer to new CContactItem constructed from aLink.
     * Function uses CESMRRichTextLink::Value to create contact
     * with CESMRRichTextLink::Type information.
     *
     * @param aLink link
     */
    IMPORT_C CContactItem* CreateContactItemL( const CESMRRichTextLink& aLink );

 
    /*
    * Method for cesmrviewerdescriptionfield to set the list observer
    *
    * @param aObserver observer that should be notified
    */
    IMPORT_C void SetListObserver( MESMRListObserver* aObserver );
    
    /**
     * Returns height of one row.
     *
     * @return row's height
     */
    IMPORT_C TInt RowHeight();
    /**
     * Returns text line count.
     *
     * @return line count
     */
    IMPORT_C TInt LineCount();
    /**
     * Returns line number of currenly 
     * focused row starting from one.
     * 
     * @return row's height
     */
    IMPORT_C TInt CurrentLineNumber();

    /**
     * Enables and disables action menu
     * @param aStatus Enables or disables action menu
     */
    IMPORT_C void SetActionMenuStatus( TBool aStatus );

    /**
     * Copies currently selected richtext link associated with 
     * action menu to the clipboard
     */
    IMPORT_C void CopyCurrentLinkToClipBoardL() const;

    /**
     * Copies currently link value to clipboard 
     * action menu to the clipboard
     */
    IMPORT_C void CopyCurrentLinkValueToClipBoardL() const;

    /**
     * convenience method to reset TLS static contactactionmenuhandler 
     * for classes that only have access to richtextviewer. 
     * Needed for richtextviewer fields when they lose focus.
     */
    IMPORT_C void ResetActionMenuL() const;

    /**
     * Sets event queue for field. Observer can be used
     * for triggering commands and notifying events.
     * @param aEventObserver the event observer
     */
    IMPORT_C void SetEventQueue( MESMRFieldEventQueue* aEventQueue );

    /**
     * Selects current link.
     * @return ETrue if link selected
     */
    IMPORT_C TBool LinkSelectedL();
    
protected: // From MEikCommandObserver
    
    /**
     * Process commands from contact menu handler.
     * Forwards commands to event observer. 
     */
    void ProcessCommandL( TInt aCommandId );

protected: // From MAknLongTapDetectorCallBack
    virtual void HandleLongTapEventL( const TPoint& aPenEventLocation, 
                                      const TPoint& aPenEventScreenLocation );
    
protected: // From CEikEdwin
    /**
     * Sets the control as ready to be drawn.
     */
    void ActivateL();

protected: // From CCoeControl
    virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent);
    
private:
    /*
     * Private constuctor.
     */
    CESMRRichTextViewer( );

    /*
     * Two-phase constructor.
     * @param aParent if aParent is NULL, CEikRichTextEditor 
     * 				  is constucted as window owning control.
     */
    void ConstructL(const CCoeControl* aParent );

    /*
     * CCoeControl::Draw is overridden.
     */
    void Draw( const TRect& aRect ) const;

    /*
     * Draws right-click icon.
     * @param aLink link to which draw icon
     */
    void DrawRightClickIconL(const CESMRRichTextLink& aLink) const;

    /*
     * Highlights link in CEikRichTextEditor.
     *
     * @param aLink link to be highlighted
     */
    void HighlightLink(const CESMRRichTextLink& aLink );

    /*
     * Private internal function which searches for emails,
     * phone numbers and urls from given text using CFindItemEngine.
     *
     * @param aText text which is shown in CEikRichTextEditor
     */
    void SearchLinksL(const TDesC& aText );

    void ScrollViewL( 
    		TInt aNumberOfRows, 
    		TCursorPosition::TMovementType aDirection);
    TInt FindTextLinkBetweenNextScrollArea(
    		TInt aStartRow,                  
    		TInt aEndRow,                               
    		TCursorPosition::TMovementType aDirection);

    TBool SetHighLightToNextLinkL( TCursorPosition::TMovementType aDirection,
                                   TInt aStartRow,
                                   TInt aEndRow);
    TInt ValidLinkForFocusing(	TInt aIndex,
                                TCursorPosition::TMovementType aDirection,
                                TInt aStartRow,
                                TInt aEndRow);

    void SetFontColorL( TBool aFocused = EFalse );

    void SetValueL( const CESMRRichTextLink& aLink );

private: // Data
	/// Own:
    TInt iCurrentLinkIndex;
    /// Own:
    RPointerArray<CESMRRichTextLink> iLinkList;
    /// Ref:
    MESMRRichTextObserver* iLinkObserver;
    /// Own:
    RESMRStatic iESMRStatic;
    /// Own:
    CFbsBitmap* iActionMenuIcon;
    /// Own:
    CFbsBitmap* iActionMenuIconMask;
    /// Ref:
    MESMRListObserver* iObserver;
    /// Own:
    TInt iNumberOfLines;
    /// Own:
    TInt iApproximatelyRowHeight;
    /// Ref: pointer to font
    const CFont* iFont;
    /// Ref: Pointer to layout manager
    CESMRLayoutManager* iLayout;
    /// Ref: Contact Menu handler
    CESMRContactMenuHandler* iCntMenuHdlr;
    /// Ref: Pointer to event queue
    MESMRFieldEventQueue* iEventQueue;
    /// Own: Flag for action menu status
    TBool iActionMenuStatus;
    /// Own:
    TCharFormat iFormat;
    /// Own:
    TCharFormatMask iFormatMask;
    // Own:    
    CAknLongTapDetector* iLongTapDetector;
    // Indicates is action menu opened
    TBool iActionMenuOpen;
    };

#endif /*CESMRRICHTEXTVIEWER_H*/