/*
* Copyright (c) 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:  tabbed view control implementation class with doublestyle listbox 
*
*/

#ifndef     __CVIMPSTUIDOUBLELISTBOXTABVIEWCONTROL_H
#define     __CVIMPSTUIDOUBLELISTBOXTABVIEWCONTROL_H

#include "mvimpstuitabbedviewcontrol.h"
#include "mvimpstprocessArrayobserver.h"
#include "cvimpstuidoublestylelistbox.h"

class CVIMPSTUiDoubleStyleListBox;

// CLASS DECLARATION
/**
 * Tabbed view control. Shows list of contacts.
 *  @lib vimpstui.lib
 *  @since S60 v5.0 
 */
class CVIMPSTUiDoubleListBoxTabViewControl :public CCoeControl,
								            public MVIMPSTProcessArrayObserver,
								            public MEikListBoxObserver,
        									public MCoeControlObserver,
        									public MVIMPSTUiTabbedViewControl
    {
    public: // Constructor and destructor
        /**
         * Creates a new CImContactsTabbedViewControl.
         *
         * @param aTabbedView reference to view.
         * @param aKeyEventHandler Key event handler to be used
         * @param aCommandHandler reference to commandhandler
         * @param aServiceId Id of the service
         * @param aBrandHandler reference to brandhandler
         * @param aEngine reference to engine
         */
        static CVIMPSTUiDoubleListBoxTabViewControl* NewL( CVIMPSTUiTabbedView& aTabbedView, MPbk2KeyEventHandler* aKeyEventHandler, 
        										MVIMPSTCmdHandler& aCommandHandler,
        										TUint32 aServiceId,
        										CVIMPSTUiBrandData& aBrandHandler,
        										MVIMPSTEngine& aEngine,
        										CEikButtonGroupContainer* aCba);
        
        /**
         * Creates a new CImContactsTabbedViewControl and leaves it to
         * cleanup stack.
         * @see NewL
         *
         * @param aTabbedView reference to view.
         * @param aKeyEventHandler Key event handler to be used
         * @param aCommandHandler reference to commandhandler
         * @param aServiceId Id of the service
         * @param aBrandHandler reference to brandhandler
         * @param aEngine reference to engine
         */
        static CVIMPSTUiDoubleListBoxTabViewControl* NewLC( CVIMPSTUiTabbedView& aTabbedView,MPbk2KeyEventHandler* aKeyEventHandler,
        											MVIMPSTCmdHandler& aCommandHandler,
        											TUint32 aServiceId,
        											CVIMPSTUiBrandData& aBrandHandler,
        											MVIMPSTEngine& aEngine,
        											CEikButtonGroupContainer* aCba);
        
        /**
         * Destructor.
         */
        ~CVIMPSTUiDoubleListBoxTabViewControl();
    
    public : // from MIMArrayProcessObserver
        /**
         * @see MIMArrayProcessObserver.
         */
        void HandleAdditionL(TVIMPSTEnums::TItem type, TInt aIndex);
        
       	 /**
          * @see MIMArrayProcessObserver.
          */
     	void HandleDeletionL(TVIMPSTEnums::TItem type, TInt aIndex);
     	/**
     	 * @see MIMArrayProcessObserver.
     	 */
     	void  HandleAvatarChangeL( const TDesC& aUserId );

    public://from MEikListBoxObserver
    
		/**
         * From MEikListBoxObserver, Handles event's generated by listbox
		 * @see MEikListBoxObserver
         */
		void HandleListBoxEventL( CEikListBox* aListBox,
			TListBoxEvent aEventType );
    
    public: //from MCoeControlObserver
    	/**
	     * Handles events from findpane and forwards them to listbox filter.
	     * @see MCoeControlObserver
	     */
	    void HandleControlEventL( CCoeControl* aControl,TCoeEvent aEventType );
	    
    
        /**
         * Get access to listbox model's filter
         * @return model's filter
         */                     
        CAknListBoxFilterItems* ListFilter();
        
     
    public: // New functions
        
        /**
         * Returns the currently focused item's index.
         * @return TInt, current item index.
         */
        TInt CurrentItemIndex() const;
        
        /**
         * Sets the currently focused item's index.
         *
         * @param aIndex new currently focused index
         */
        void SetCurrentItemIndex( TInt aIndex );
        
		/**
         * Sets the currently focused item's index and updates the control
         * on the display.
         *
         * @param aIndex new currently focused index
         */
        void SetCurrentItemIndexAndDraw( TInt aIndex );
        
        /**
         * Handles item addition for this control.
         */
        void HandleItemAdditionL();
        
        /**
         * Handles item removal for this control.
         */
        void HandleItemRemovalL();

        /**
         * Sets list box empty text.
         *
         * @param aResourceId resource id of a empty text
         */
        void SetListEmptyTextL( TInt aResourceId );
        
        /**
         * send the message using selected item
         * this will launch the conversation view if im is enabled.
         */
        void SendMessageL();
        
        /**
         * Updates view after edit.
         * @param aIndex is the index of item that has changed.
         * @param aType is list item type. 
         */
        void UpdateViewL( TInt aIndex, TVIMPSTEnums::TItem aType);
        
        
     	/**
     	 * @see MVIMPSTUiTabbedViewControl.
     	 */
		void HandleAvatarRefreshL( const TDesC& aUserId,TBool aBlock);

		

        /**
	     * LoadsBitmap array.
	     */	
        void LoadBitmapsL();
        
     
        
        /**
         * Gets the owned listbox control
         *
         * @return the owned list box
         */
        CVIMPSTUiDoubleStyleListBox& ListBox() const;
        
        /**
        * Activates find-pane
		*/
		void ActivateFindPaneL();

        /**
        * De-activates find-pane
		*/
		void DeactivateFindPaneL();
		
	   /**
		*Handle the avatar deletion in UI
		*/
		void SetFocussedId(const TDesC& aContact)  ;

		/**
		* the avatar deletion in UI
		*/
		TPtrC GetFocussedId() ;
		
    private: // From CCoeControl, standard control functionality
        
        /**
         * @see CCoeControl
         */
        TKeyResponse OfferKeyEventL
            ( const TKeyEvent& aKeyEvent, TEventCode aType );
        
        /**
         * @see CCoeControl
         */
        void SizeChanged();
        
        /**
         * @see CCoeControl
         */
        TInt CountComponentControls() const;
        
        /**
         * @see CCoeControl
         */
        CCoeControl* ComponentControl( TInt aIndex ) const;
        
        /**
         * @see CCoeControl
         */
        void FocusChanged( TDrawNow aDrawNow );
           

    private: // Implementation
        /**
         * Standard C++ constructor
         *
         * @param aTabbedView reference to view.
         * @param aKeyEventHandler Key event handler to be used
         * @param aCommandHandler reference to commandhandler
         * @param aServiceId Id of the service
         * @param aBrandHandler reference to brandhandler
         * @param aEngine reference to engine
         */    
        CVIMPSTUiDoubleListBoxTabViewControl(   CVIMPSTUiTabbedView& aTabbedView,MPbk2KeyEventHandler* aKeyEventHandler,
                    							MVIMPSTCmdHandler& aCommandHandler,
                    							TUint32 aServiceId,
                    							CVIMPSTUiBrandData& aBrandHandler,
                    							MVIMPSTEngine& aEngine,
                    							CEikButtonGroupContainer* aCba);
        
        /**
         * Performs the 2nd phase of construction.
         * 
         */        
        void ConstructL();
		
		/**
         * Layouts current components according to AVKON LAF
		 */
		void SetLayout();
		
		/**
		 *  NOTE : PASSING NULL DESCRIPTOR IS NOT ALLOWED  
		 *  NO CHECK FOR THE NULL DESCPRIPTOR
		 * 
		 *  Utility function to create Icons from
		 *  image data using Image processor
		 * 
		 * @param aAvatarContent : avatar content 
		 * 
		 * @return  CGulIcon icon created , returns NULL in case of errors
		 */
		CGulIcon*  AvatarToIconL( const TDesC8& aAvatarContent );
		
		
		void SetFocusAndMakeItemVisible();
		
    public:
        
        /**
        * Sets the iClrFindPaneFlag
        */
        void SetClrFindPaneFlag(TBool aFlag);
        
        /**
        * Checks if the last contact is focused and Sets the iLastItemFlag
        */            
        void CheckAndSetLastItemFlag(); 
     
        /**
         * returns the CCoeControl* pointer
         */
        CCoeControl* CoeControl();
        
        /**
         * Sets the lock status of softkeys
         * @param aLock new status of lock (ETrue: locked, EFalse: Unlocked)
         */                     
        void SetCbaLockL( TBool aLock );

        /**
         * Updates Softkeys according to current focus
         * @param aUseDefaultCba Flag to force the default sofkeys for view.
         * Default value is false.
         */                     
        void UpdateCbaL( TBool aUseDefaultCba = EFalse );

		
    private: // Data
    
    	// not owned
    	 CVIMPSTUiTabbedView& iTabbedView;
    	 
    	// Not owned: key event handler
    	MPbk2KeyEventHandler* iKeyEventHandler;
    	
    	//Holds the Ref to CMd Handler - Doesnt Own
    	MVIMPSTCmdHandler& iCommandHandler;
    	
    	//Doesnt Own
        MVIMPSTProcessArray& iArrayProcess;         
         
        //Service Id 
		TUint32 iServiceId ;
		
		//doesnt own - Brand Handler
		CVIMPSTUiBrandData& iBrandHandler;
		
		//doesnt own - Engine Handler
		MVIMPSTEngine& iEngine;
		   	
        // Owns. Listbox to view friends-list data
        CVIMPSTUiDoubleStyleListBox* iListBox;
         
        // Owns. Search field.
		CAknSearchField* iFindbox;
		
		// is find pane visible.
        TBool iFindPaneIsVisible;
        
        //current state
        TBool iCurrentState;
        
          // Owns: Flag to check whether the last contact was selected
        TBool iLastItemFlag;
   
        CFbsBitmap* iBitmap;  
       
        TInt iAvatarError;
        
        // CBA. not owned
        CEikButtonGroupContainer* iCba;     

        // Lock status foc softkeys
        TBool iCbaLock;
        
        // Storage for previous focus
        TVIMPSTEnums::TItem iLastFocusedItemType;
        
        //flag to check to clear find pane
        TBool iClrFindPaneFlag;
		
		//indicate command to be executed on enter key Event.
		TInt iCurrentCmdToExe;
        

    };

#endif // __CVIMPSTUIDOUBLELISTBOXTABVIEWCONTROL_H

// End of file
