cbs/cbsui/UiInc/CCbsUiTopicListView.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 0 ff3b6d0fd310
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002 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: 
*  This is the application main view. Shows all the topics which
*  has been received and their status: subscribed, hotmarked, new messages
*
*
*/


#ifndef __CCBSTOPICLISTVIEW_H
#define __CCBSTOPICLISTVIEW_H

// INCLUDES
#include <aknview.h>
#include <CbsCommon.h>
#include "MCbsUiTopicMonitorObserver.h"
#include "CbsUiDebug.h"
	
// CONSTANTS  
const TInt KNumberOfStandardTopics = 17;

 
// FORWARD DECLARATIONS

class CSelectionList;
class CListBoxNumbers;
class CCbsUiTopicListViewContainer;
class MCbs;
class CAknNavigationDecorator;
class CAknNavigationControlContainer;

// CLASS DECLARATION

/**
* This is the application main view. Shows all the topics which
* has been received and their status: subscribed, hotmarked, new messages
*  
*/
class CCbsUiTopicListView : public CAknView, 
                            public MCbsUiTopicMonitorObserver
    {
    private: // Data declaration

        enum TTopicListViewFocusState
            {
            ESetFocusToCurrentHandle,
            ESetFocusToFirstItem,
            ESetFocusToNewestItem,
            ENoFocusUpdate 
            };

    public: // Constructors and destructor

        /**
        * Creates an instance of the class.
        *
        * @param aServer It is the server.
        * @return It returns a pointer to the created class.
        */
        static CCbsUiTopicListView* NewL( MCbs& aServer );
        
        /**
        * Destructor.
        */
        virtual ~CCbsUiTopicListView();
        
    public: // New functions

        /**
        * Calls the server to add or change a topic. Which is called
        * depends on the type of the dialog.
        *
        * @param aType is it a edit or add query. True is add query
        * @param aNumber topic number to add or change
        * @param aName topic name to add or change
        * @return error code if something goes wrong
        */
        TInt EditTopic( 
            TBool aType, 
            TCbsTopicNumber aNumber, 
            const TCbsTopicName aName );

        /** 
        * Adds a topic with specified number and name.
        *
        * @param  aNumber It is the number of the topic.
        * @param  aName It is the name of the topic.
        * @return a error code if the addition fails
        */
        TInt AddTopic( 
            const TCbsTopicNumber& aNumber, 
            const TCbsTopicName& aName );       

        /**
        * Marks topic which is focused. This should be called only when 
        * the Options menu is created and when the Ok (selection) key
        * has been pressed. Focus behaviour is based on this.
        */
        void MarkCurrentHandle();
        
    public: // From MCbsUiTopicMonitorObserver

        /**
        * Topic list or topic messages are changed.
        *
        * @param aEvent reason for event
        * @param aTopicNumber Topic number, which caused the event
        */
        void TopicListChangedL(
            TCbsTopicListEvent aEvent, TCbsTopicNumber aTopicNumber );
     
    public: // from CAknView
        
        /**
        * Returns the identifier of the view.
        *
        * @return It returns the identifier.
        */
        TUid Id() const;        
    
        /**
        * Handles the options menu commands.
        *
        * @param aCommand command to be executed
        */
        void HandleCommandL( TInt aCommand );

    public: // New function
        /**
        * Handle changes in container when rect changes.
        */
        void HandleRectChangeInContainer();

    private: // from CAknView
        
        /**
        * Activates the view.
        *
        * @param aPrevViewId
        * @param aCustomMessageId
        */
        void DoActivateL(
            const TVwsViewId& aPrevViewId, 
            TUid aCustomMessageId, 
            const TDesC8& aCustomMessage );
        
        /**
        * Deactivates the view.
        */
        void DoDeactivate();     

        /**
        * Checks new topic count, if it has been changed after
        * application switch.
        */
        void ViewActivatedL(
            const TVwsViewId& aPrevViewId,
            TUid aCustomMessageId,const 
            TDesC8& aCustomMessage );

        void ViewDeactivated();
      
    private: // MEikMenuObserver 

        /**
        * Sets the menu items according to the state of the topic, which
        * is focused on. Used when options menu is opened. Marks also 
        * a current topic handle.
        *
        * @param aResourceId resource id of the menu
        * @param aMenuPane used to modify menu dynamically
        */
        void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane );         

    private: // New functions

        /**
        * Sets current topic number according to aTopicNumber.
        *
        * @param aTopicNumber contains current topic number.
        */
        void SetCurrentTopicNumber( const TDesC8& aTopicNumber );

        /**
        * Sets current topic number according to aTopicNumber.
        *
        * @param aTopicNumber new current topic number.
        */
        void SetCurrentTopicNumber( const TCbsTopicNumber aTopicNumber );

        /**
        * Updates the topics information.
        */
        void ReloadTopicsL();

        /**
        * Prepares container for reloading.
        */
        void PrepareReloading();

        /**
        * Reloads topics from the server.
        */
        void ReloadL();

        /**
        * Ends reloading.
        */
        void EndReloadingL();

        /**
        * Sets focus after reload. Should be called after ReloadTopicsL().
        *
        * @param aFocusState focus is set according to this
        */
        void SetFocusAfterReload( TTopicListViewFocusState aFocusState );

        /**
        * Sets focus to aIndex.
        *
        * @param aIndex new focused index
        */
        void SetFocusToTopic( TInt aIndex );

        /**
        * Updates the focus according to Selection Service after deletion.
        *
        * @param aDeletedTopic Calculates the new focus according to deleted
        *                      topic.
        */
        void UpdateCurrentTopicAfterDeletion( TCbsTopicNumber aDeletedTopic );
        
        /**
        * Returns the total amount of topics.
        *
        * @return It is the amount of topics.
        */
        TInt TotalTopics() const;                      
       
        /**
        * Requests the view to move to the previous topic.
        */
        void MoveToPreviousTopic();
   
        /**
        * Writes a CBS to title pane.
        */
        void UpdateTitlePaneL() const;

        /**
        * Writes to navi pane a right message:
        * No new messages
        * One new message
        * %N new messages
        */
        void UpdateNaviPaneL();

        /**
        * Gets resouce id for text to be displayed.
        *
        * @param aUnreadMessages Number of unread messages.
        * @return resource id for text
        */ 
        TInt GetInfoResourceId( TInt aUnreadMessages ) const;

        /**
        * Creates a new decorated label to navi pane.
        *
        * @param aResourceId text resource id.
        * @param aUnreadMessages number of unread messages
        */
        void CreateNewLabelL( TInt aResourceId, TInt aUnreadMessages );

        /**
        * Launches an edit or add topic query dialog.
        *
        * @param aType          type of the query. 
        *                       ETrue is add and EFalse is edit query.
        * @param aTopicName     name of the topic
        * @param aTopicNumber   number of the topic
        */
        void ShowTopicQueryL( 
            TBool aType, 
            TDes& aTopicName, 
            TDes& aTopicNumber );

        /**
        * Launchs the edit topic query with the right parameters.
        */
        void ShowEditTopicQueryL();

        /**
        * Checks if there has come new topics while this function was
        * last called. Shows a note how many new topics has been added,
        * since last been in TopicListView.
        */
        void CheckNewTopicCountL();

        /**
        * Returns the new topics count from server.
        * 
        * @return new topic count
        */
        TInt GetNewTopicsCount();

        /**
        * Changes the topic name and number to the specified.
        *
        * @param  aHandle It is the handle to the topic.
        * @param  aNumber It is the new number of the topic.
        * @param  aName It is the name of the topic.
        * @return error code in case fail
        */
        TInt UpdateTopic( 
            const TCbsTopicNumber& aOldNumber,
            const TCbsTopicNumber& aNumber,
            const TCbsTopicName& aName );

        /**
        * Finds topic index by topic number.
        *
        * @param aIndex it will contain the topic index
        * @param aTopicNumber topic number
        * @return KErrNone if no errors
        */
        TInt FindTopicIndexByNumber( 
            TInt& aIndex, 
            const TCbsTopicNumber& aTopicNumber );

        /**
        * Activates the topic view.
        */
        void ActivateTopicViewL() const;

        /**
        * Activates settings view.
        */
        void ActivateSettingsViewL() const;

        /**
        * Activates a add from index dialog.
        */
        void ActivateAddFromIndexViewL();

        /**
        * Activates an idle object to show an information note. 
        * Used in call back function.
        *
        * @param aNewTopics count of new topics
        * @return always KErrNone
        */
        static TInt ActivateBackgroundNoteL( TAny* aNewTopics );
        
    private:
        
        /**
        * It is type for topic handles array.
        */
        typedef CArrayFixFlat< TCbsTopicNumber > TCbsUiTopicNumberList;
        
        /**
        * Constructor.
        * 
        * @param aServer connection to the server
        */
        CCbsUiTopicListView(MCbs& aServer);
        
        /**
        * Finalizes the construction.
        *
        * Note that it is assumed that the server exists for the life 
        * time of the class.
        */
        void ConstructL();
     
    private: // Data        

        // It is the control for the view.
        CCbsUiTopicListViewContainer* iContainer;
        
        // It is the label in status pane.
        CAknNavigationDecorator* iDecoratedLabel;        
   
        // Pointer to server session. Owned by UiApp
        MCbs& iServer;        
       
        // It is the array that contains the topic numbers.
        TCbsUiTopicNumberList* iTopicNumberList;
       
        // Handle that is focused.        
        TCbsTopicNumber iCurrentTopicNumber;

        // For updating information about messages to navi pane.
        CAknNavigationControlContainer* iNaviPane;

        // iFocusState is set in HandleCommandL and focus is set in 
        // TopicListChangedL.
        TTopicListViewFocusState iFocusState;

        // To see wheather it is needed to update navi pane.
        // if ETrue: navi pane is not updated
        TBool iAddFromIndexDialogIsActive;

        // for showing background note
        CIdle* iBackgroundNote;

        // Count of new topics.
        TInt iNewTopicsCount;


    };
    
    
#endif // __CCBSTOPICLISTVIEW_H
    
    
// End of File