/*
* Copyright (c) 2006 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:  MPX common container definition.
*
*/



#ifndef MMPXCOMMONCONTAINER_H
#define MMPXCOMMONCONTAINER_H


// INCLUDES
#include <coecntrl.h>
#include "mpxcommonlistboxarrayobserver.h"
#include "mpxcommonlistboxarraybase.h"
#include "mpxviewcontainer.h"

// FORWARD DECLARATIONS
class CEikMenuPane;
class MEikCommandObserver;
class MEikListBoxObserver;
class MMPXCommonListBoxArrayObserver;

// CLASS DECLARATION

/**
 *  Abstract class for common container.
 *  The view class should implement the following virtual function
 *  from MEikCommandObserver
 *
 *  virtual void ProcessCommandL(TInt aCommandId);
 *
 *  common container uses this to pass commands back to the view class
 *  the commands supported are defined in mpxcommoncontainer.hrh
 *
 *  view container class owns this class to access List box commands, receive
 *  CoeControl events and GetHelpContext(). The view container class should
 *  implement the following virtual functions from MViewContainer
 *
 *  virtual void HandleKeyEvent();
 *  virtual void HandleHelpContent();
 *
 *  common container uses this to pass CoeControl events back to the view
 *  container class.
 *
 *  view class should handle the following commands in ProcessCommandL
 *  from MEikCommandObserver:
 *
 *  EMPXCmdCommonDelete  // delete key pressed
 *  EMPXCmdCommonResourceChange  // resource change
 *
 *  @lib mpxcommoncontainer.lib
 *  @since S60 v3.1
 */
class MMPXCommonContainer
    {
public:

    enum TMPXCommonContainerCollectionType
        {
        EMPXCommonContainerMusic,
        EMPXCommonContainerPodcast
        };

    /**
     * Destructor.
     */
    virtual ~MMPXCommonContainer() {};

    /**
     * Return Coe Control
     *
     * @since 3.2
     */
    virtual CCoeControl* CoeControl() = 0;

    /**
     * Set View Container
     *
     * @since 3.2
     */
    virtual void SetViewContainer( MMPXViewContainer* aViewContainer ) = 0;

    /**
     * Set command observer for container
     *
     * @since 3.2
     */
    virtual void SetCommandObserver(
        MEikCommandObserver* aCommandObserver ) = 0;

    /**
     * Set list box observer for container
     *
     * @since 3.2
     */
    virtual void SetListBoxObserver( MEikListBoxObserver* aObserver ) = 0;

    /**
     * Set layout for all elements and set sizes for icons.
     *
     * @since 3.1
     */
    virtual void UpdateLayout() = 0;

    /**
     * Returns list box array, ownership not transfered
     *
     * @since 3.1
     * @return A pointer to the list box array
     */
    virtual CMPXCommonListBoxArrayBase* ListBoxArray() const = 0;

    /**
     * Sets list box array, ownership not transfered
     *
     * @since 3.1
     * @param A pointer to the list box array
     */
    virtual void SetListBoxArrayL(
        CMPXCommonListBoxArrayBase* aListBoxArray) = 0;

    /**
     * Return number of listbox items shown in the current listbox.
     *
     * @since 3.1
     * @return The number of items shown in the list box
     */
    virtual TInt CurrentListItemCount() const = 0;

    /**
     * Return total number of listbox items in the listbox.
     *
     * @since 3.1
     * @return Total items in the list box
     */
    virtual TInt TotalListItemCount() const = 0;

    /**
     * Gets top listbox item index (relative to the original listbox).
     * @return Top listbox item index
     *
     * @since 3.1
     */
    virtual TInt TopLbxItemIndex() const = 0;

    /**
     * Gets bottom listbox item index (relative to the original listbox).
     * @return Bottom listbox item index
     *
     * @since 3.1
     */
    virtual TInt BottomLbxItemIndex() const = 0;

    /**
     * Gets current listbox item index (relative to the original listbox).
     * @return Current listbox item index
     *
     * @since 3.1
     */
    virtual TInt CurrentLbxItemIndex() const = 0;

    /**
     * Get current selected listbox items indices (relative to the original
     * listbox). Ownership not transferred.
     *
     * @since 3.1
     * @return Current listbox item indices
     */
    virtual const CArrayFix<TInt>* CurrentSelectionIndicesL() const = 0;

    /**
     * Sewt current selected listbox items indices
     *
     * @since 3.1
     * @param aIndices Array of selection indices, ownership not transfered
     */
    virtual void SetCurrentSelectionIndicesL( CArrayFix<TInt>* aIndices ) const = 0;

    /**
     * Set top listbox item index.
     *
     * @since 3.1
     * @param aIndex Actual listbox index.
     */
    virtual void SetLbxTopItemIndex( TInt aIndex ) = 0;

    /**
     * Set current listbox item index.
     *
     * @since 3.1
     * @param aIndex Actual listbox index.
     */
    virtual void SetLbxCurrentItemIndex( TInt aIndex ) = 0;

    /**
     * Set current listbox item index and highlight it.
     *
     * @since 3.1
     * @param aIndex Actual listbox index.
     */
    virtual void SetLbxCurrentItemIndexAndDraw( TInt aIndex ) = 0;

    /**
     * Clear listbox selection.
     *
     * @since 3.1
     */
    virtual void ClearLbxSelection() = 0;

    /**
     * Sets list box backround text. This text is visible if the list box
     * has no items.
     *
     * @param aText The text for the empty list box background.
     * @since 3.2
     */
    virtual void SetLbxEmptyTextL( const TDesC& aText ) = 0;

    /**
     * Draws list box item index
     *
     * @since 3.2
     */
    virtual void DrawLbxItem( TInt aIndex ) = 0;

    /**
     * Set Find box's focus.
     *
     * @since 3.1
     * @param aFocus ETrue if set focus on FindBox. Otherwise, EFalse.
     */
    virtual void SetFindBoxFocus( TBool aFocus ) = 0;

    /**
     * Handle listbox item addition.
     *
     * @since 3.1
     */
    virtual void HandleLbxItemAdditionL() = 0;

    /**
     * Handle listbox item addition, preserving the current display index.
     *
     * @since 3.1
     */
    virtual void HandleLbxItemAdditionPreserveIndexL() = 0;

    /**
     * Handle listbox item removal.
     *
     * @since 3.1
     */
    virtual void HandleLbxItemRemovalL() = 0;

    /**
     * Show/hide find box
     *
     * @since 3.1
     * @param aIsVisible ETrue to set findbox visible. Otherwise, EFalse
     */
    virtual void SetFindBoxVisibilityL( TBool aIsVisible ) = 0;

    /**
     * Determine find box visibility
     *
     * @since 3.1
     * @return ETrue if find box is currently visible, EFalse otherwise
     */
    virtual TBool FindBoxVisibility() = 0;

    /**
     * Restore the PopupCBA of find box
     */
    virtual void RestoreFindBoxPopupCBA() = 0;

    /**
     * Calculate the top index of the visible items
     *
     * @since 3.1
     * @param aBottomIndex the bottom index of the visible items
     * @return top index
     */
    virtual TInt CalculateTopIndex( TInt aBottomIndex ) = 0;

    /**
     * Creates the container
     *
     * @since 3.1
     * @param aCollectionType collection type
     */
    virtual void ConstructContainerL( TMPXCommonContainerCollectionType aCollectionType ) = 0;

    /**
     * Enable/disable find box
     *
     * @since 3.1
     * @aEnable ETrue to enable find box, EFalse to disable
     */
    virtual void EnableFindBox( TBool aEnable ) = 0;

    /**
     * Enable/disable marking
     *
     * @since 3.1
     * @aEnable ETrue to enable marking, EFalse to disable
     */
    virtual void EnableMarking( TBool aEnable ) = 0;

    /**
     * Custom handling of commands for markable lists.
     */
    virtual void HandleMarkableListProcessCommandL( TInt aCommand ) = 0;

    /**
     * Custom handling of menu pane for markable lists
     */
    virtual void HandleMarkableListDynInitMenuPane(
        TInt aResourceId,
        CEikMenuPane* aMenuPane ) = 0;


    /**
     * Handle listbox array events
     *
     *  @param aEvent list box event
     */
    virtual void HandleListBoxArrayEventL(
        MMPXCommonListBoxArrayObserver::TMPXCommonListBoxArrayEvents aEvent ) = 0;

    /**
     * Handles key events.
     *
     * @param aKeyEvent The key event.
     * @param aType The type of key event.
     */
    virtual TKeyResponse HandleKeyEventL(
        const TKeyEvent& aKeyEvent,
        TEventCode aType ) = 0;

    /**
     * Activate the container
     */
    virtual void ActivateContainerL() = 0;
    };

/**
 *  Factory class to create the common container
 *
 *  @lib mpxcommoncontainer.lib
 *  @since S60 v3.2
 */
class CMPXCommonContainerFactory : CBase
    {
public:
    /**
    * Factory function to create the common container
    */
    IMPORT_C static MMPXCommonContainer* NewL();
    };

#endif  // MMPXCOMMONCONTAINER_H

// End of File
