profilesservices/MediaFileList/Inc/mediafiledialog.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:12:30 +0300
branchRCL_3
changeset 23 8bda91a87a00
parent 1 b5888e2aa472
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
* Copyright (c) 2007 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:   Header file of mediafiledialog. UI control of mediafilelist
*
*/




#ifndef MEDIALFILEDIALOG_H
#define MEDIALFILEDIALOG_H


//  INCLUDES
#include "mediafiledialogutils.h"
#include "mediafilepreview.h"
#include "mediafilehandler.h"
#include "mediafiledialogstate.h"
#include "mediafilewaitnote.h"


#include <e32base.h>
#include <aknlists.h>
#include <AknDialog.h>
#include <AknInfoPopupNoteController.h> // CAknInfoPopupNoteController
#include <eikedwin.h>
#include <aknsfld.h>
#include <peninputsrveventhandler.h>
#include <peninputclient.h>


// CONSTANTS

// CLASS DECLARATION
class CMFDialogTest;
class CMFProtectionHandler;
class CAknInputBlock;
class CVideoPreviewDialog;



/**
* CMFListHandlerObserver
* 
* CMFListHandler uses CMFListHandlerObserver to get listbox item texts.
*/
NONSHARABLE_CLASS (CMFListHandlerObserver)
    {
    public:
        virtual TPtrC ConstructListboxItem( TInt aListIndex ) = 0;
        virtual TInt ListboxItemCount() = 0;
    };


/**
* CMFListHandler
* 
* This class is used as listbox model's item array. Listbox uses it to draw 
* list items. CMFListHandler gets list item texts from CMediaFileHandler
* (metadata query result). This way there is no need to copy all list items
* into listbox model.  
*/
NONSHARABLE_CLASS (CMFListHandler) : public MDesCArray
    {
    public:
	    static CMFListHandler* NewL();
	    ~CMFListHandler();
    private:	
	    void ConstructL(void);
        CMFListHandler();

    public:  // from MDesCArray
	    TInt MdcaCount() const;
	    TPtrC16 MdcaPoint(TInt aIndex) const;

    public:
  	    void SetObserver( CMFListHandlerObserver* aObserver );
	    static void Panic( TInt aReason );
	    
    private:
	    CMFListHandlerObserver* iObserver;  // does not own
    };






/**
* CMediaFileDialog
*
* CMediaFileDialog provides UI for selecting/previewing media files.
*/
NONSHARABLE_CLASS (CMediaFileDialog) :  public CAknDialog, 
                                        public MEikListBoxObserver,
                                        public MCoeForegroundObserver,
                                        public CMFListHandlerObserver,
                                        public MMediaFileHandlerObserver,
                                        public MMFActiveCallerObserver,
                                        public MPreviewHandlerObserver,
                                        public MMediaFileWaitNoteObserver,
                                        public MAdaptiveSearchTextObserver,  // not used
                                        public MPenUiActivationHandler

    {
    
#ifdef _DEBUG     
    friend class CMFDialogTest;
#endif    
    
    enum TListOperationType
        {
        EAttrSelect,
        EAttrOpen,
        EAttrClicked,
        EAttrDoubleClicked
        };

    enum TDelayedOperationType
        {
        EAttrPreview,
        EAttrSearch,
        EAttrChangeCba
        };


    public:// Constructors and destructor

        /**
        * Two-phased constructor.
        */
		static CMediaFileDialog* NewL();
        
        /**
        * Destructor.
        */
        virtual ~CMediaFileDialog();
    
    private:

        /**
        * C++ default constructor.
        */
        CMediaFileDialog();
	
        /**
        * By default Symbian OS constructor is private.
        */
        void ConstructL();

	public:
		TBool ShowDialogL( TDes* aFileName, TInt* aNullItem,
		                   TInt* aInfo, TDes* aDesInfo );
		
		void SetAttrL( TInt aAttr, TInt aValue );
		void SetAttrL( TInt aAttr, const TDesC& aValue );
		void SetAttrL( TInt aAttr, TAny* aValue );
        void SetNullItemL( const TDesC& aText, const TDesC& aMediaFile,
	                       TInt aMediaFileType, TInt aIconId );
		
	private:
        /**
        * From MEikListBoxObserver, called by framework.
        * @param aListBox.
        * @param aEventType.
		* @return None
        */
		void HandleListBoxEventL( CEikListBox* aListBox, TListBoxEvent aEventType );

        /**
        * From the base class.
		* Called by framework before the dialog is shown.
        * @param None
		* @return None
        */
        void PreLayoutDynInitL();

        /**
        * From the base class.
		* Called by framework before exiting the dialog.
        * @param aButtonId Button id.
		* @return ETrue to exit\ EFalse to not to exit.
        */
        TBool OkToExitL( TInt aButtonId );

        /**
        * From the base class.
		* Called by framework for key event handling.
        * @param aKeyEvent.
		* @param aType.
		* @return Return code.
        */
		TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType );

        /**
        * From the base class.
		* Called by framework when dialog is activated.
        * @param None.
		* @return None.
        */
		void ActivateL();

		/**
        * From the base class.
		* Called by framework before menu is shown.
        * @param aResourceId Menu resource id.
		* @param aMenuPane Pointer to the menu.
        * @return None.
        */
		void DynInitMenuPaneL( TInt aResourceID, CEikMenuPane* aMenuPane );

		/**
		* From the base class.
		* Handles menu events.
		* @param  aCommandId Command id.
		* @return None.
		*/
		void ProcessCommandL( TInt aCommandId );
		
		/**
		* From base class.
		* Called when UI layout changes. 
		* @param aType.
    	* @return None.
		*/
        void HandleResourceChange( TInt aType );
        
        /** SetSizeAndPosition
        * From CAknDialog.
        * Sets dialog's size to whole main pane.
        * @param aSize ignored
        */
        void SetSizeAndPosition( const TSize &aSize );
        
        SEikControlInfo CreateCustomControlL( TInt aControlType );
        
        virtual CCoeControl* ComponentControl( TInt aIndex ) const;
        virtual TInt CountComponentControls() const;
        

    private:
		TBool DoHandleOKL( TInt aAttr );
		TBool HandleOKL( TInt aAttr );
		TBool DoHandleBackL();
		TBool HandleBackL();
        void SearchL();
        void DoSearchL();
        static TInt StartRomScaning( TAny* aInstance );
        void StartRomScan();

    private:
        void ResetDialogL( TInt aError);
		void QueryL( TInt aFolderId, TBool aDatabaseChanged = EFalse );
		void GetSelectedItemFileName( TInt aListboxIndex, TDes& aFileName );
		TInt CurrentItemListIndex();
		void SetIconsL();
		CAknSearchField* FindBox() const;
		void ResetFindBoxL();
		void FindBoxCursorMoveL( TInt aType );
		void ShowContextMenuL( TInt aResource );
		void PreviewL( TInt aMediaType );
		void PreviewVideoL( const TDesC& aFileName );
		void PreviewNullItemL( TInt aFolderId );
		void StartPreviewWithDelay();
		void CancelPreview();
		void StartSearchWithDelay();
		TBool IsVideoFile( TInt aCurrentIndex );
		TBool IsValidVideoFileL( TInt aCurrentIndex, TInt aIntention );
		TInt MediaTypeIcon( TInt aListboxIndex );
		TInt StorageTypeIcon( TInt aListboxIndex );
		void GetListItemText( TInt aListboxIndex, TDes& aText );
		
    private:
		void CheckListboxIndex();
		void HandleMediaFileChanged();
		
    private:
		void UpdateListBoxL( TBool aRestFindBox = ETrue );
		void DoUpdateListBoxL( TBool aRestFindBox );
		void UpdateCbaL( TInt aAttr );
    	TInt MapAttribute( TInt aFolderId );
		
		void ShowErrorNoteL( TInt aError );
    	void ShowPreviewErrorNoteL( TInt aError, TInt aMediaType );
		void DeleteMenuItem( CEikMenuPane* aMenuPane, TInt aCommandId );
		CGulIcon* IconL(TAknsItemID aId, const TDesC& aFileName, TInt aFileIndex,
			TInt aFileMaskIndex);
		CGulIcon* IconL(TAknsItemID aId, const TDesC& aFileName, TInt aFileIndex,
			TInt aFileMaskIndex, TAknsQsnIconColorsIndex colorIndex);
		static TInt CloseDialog( TAny *aObj );
		void CloseDialogWithDelayL();
		
    private:
        void ShowWaitNoteL( TBool aDatabaseChanged );
		void ShowPopupNoteL( const TDesC& aText );
		void ShowDetailsPopupL();
		void GetPopupText( CMediaFileData* aData, TDes& aText );
		TBool MatchFound( const TDesC& aAttribute, const TDesC& aText );
		
        /**
        * Filters the invalid files from media file handler.
        * @return None.
        */
		void FilterInvalidFiles();

    private:
		static void Panic( TInt aReason );

    private:  // from CMFListHandlerObserver
        TPtrC ConstructListboxItem( TInt aListboxIndex );
        TInt ListboxItemCount();
        
    private:   // from MPreviewHandlerObserver
        void HandlePreviewEventL( TInt aEvent, TInt aError );

    private:   // from MMediaFileHandlerObserver
        void HandleMFEventL( TInt aEvent, TInt aError );
        
    private:   // from MMFActiveCallerObserver
        void HandleActiveCallL( TInt aCallId );
        
    private:  //from MCoeControlObserver
        void HandleControlEventL( CCoeControl* aControl, TCoeEvent aEventType );
        
    private:  // from MCoeForegroundObserver
        void HandleGainingForeground();
        void HandleLosingForeground();
        
    private:  // from MAdaptiveSearchTextObserver
        void AdaptiveSearchTextChanged( CAknSearchField* aSearchField );
        
    private:  // from MPenUiActivationHandler
        void OnPeninputUiDeactivated();
        void OnPeninputUiActivated();
        
    private:  // MMediaFileWaitNoteObserver
        void HandleWaitNoteL( TInt aButtonId );
    
#ifdef _DEBUG
    private: // test code
        CMFDialogTest* iTest;
#endif
   
    private:
		// listbox
		CAknSingleGraphicStyleListBox* iListBox;

		// for title and icon handling
		CStatusPaneHandler* iStatusPaneHandler;

		// long buffer for string handling
		TBuf<KBufSize256> iBuf;
		
		// long buffer for string handling
		TBuf<KBufSize256> iPopupText;
		
		// long buffers for listbox items
		TBuf<KBufSize128> iListboxItemText1;
		TBuf<KBufSize256> iListboxItemText2;
		
		// text from search field
		TBuf<KBufSize128> iSearchText;
	
		// long buffers for icon file names
		TFileName iIconFileName;
		
		// list box model item array
		CMFListHandler* iMFListHandler;
		
		// dialog state
		CMediaFileDialogState* iState;
		
		// metadata engine wrapper
		CMediaFileHandler* iMediaFileHandler;
		
		// search box
		CAknSearchField* iFindCtrl;
		
		// for generating active object calls
		CMFActiveCaller* iCaller;
		CMFActiveCaller* iSearchCaller;
		
		// for previewing video files
		CMFVideoPreviewHandler* iVideoPreviewHandler;
		
		// for previewing audio files
		CMFAudioPreviewHandler* iAudioPreviewHandler;
        
		// popup note
        CAknInfoPopupNoteController* iPopupNote;

		// cancel note in case database query takes more than 2 seconds
		CMediaFileWaitNote* iWaitNote;
	
		// needed for finding out whether search field is in pen input mode
		RPeninputServer iPeninputServer;
		
		// for file protection information (drm etc)
		CMFProtectionHandler* iProtectionHandler;
		
		// for closing dialog
		CIdle* iIdle;
		
		TBool ifilevalid;
        // is dialog in foreground (visible)
        TBool iForeGround;
        
        // dll resource file id
        TInt iResourceFileId;
        
        // is metadata databse open
        TBool iDatabaseOpen;
        
        // is pen input active
        TBool iPeninputActive;

        // dialog attribute values
        HBufC* iNullItemFileNameOne;
        HBufC* iNullItemFileNameTwo;
        TInt iNullItemFileTypeOne;
        TInt iNullItemFileTypeTwo;
        TBuf<KBufSize128> iDialogTitle;
        
        CAknInputBlock* iInputBlock;
		
		// dialog output parameters
		
		// selected media file
	    TDes* iFileName;
	    // selected null item
	    TInt*iNullItem;
	    // extra parameter for later use
	    TInt* iInfo;
	    // extra parameter for later use
	    TDes* iDesInfo;
	    //is double clicked the item of the listbox
	    TBool iIsDoubleClicked;
	    TBool iFileisvalid;
	    // Video preview dialogue, model dialog
	    CVideoPreviewDialog* iVideoPreviewDlg;
    };



/**
* CFindControl
*
* Search field functionality (CFindControl) is copied from
* AknSelectionLis (s60/mw/classicui/uifw/AvKon/src/AknSelectionList.cpp).
* Example code can also be found in 
* s60/app/imppapplications/wvuing/wvuiave/AppSrc/CCAContactSelectionDialog.cpp
*/
NONSHARABLE_CLASS (CFindControl) : public CCoeControl 
    {
public:
    CAknSearchField *iFind;
    ~CFindControl() { delete iFind; }
    void Draw(const TRect &) const
        {
        // this removes flicker from CEikDialog's Draw().
        }
    void SizeChanged()
        {
        TRect mainPane;
        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPane );
        
        TAknLayoutRect listRect;
    
        listRect.LayoutRect( mainPane, AknLayout::list_gen_pane(0) );

        TRect r( listRect.Rect() );
        iPosition = TPoint( r.iTl );
        iSize.SetSize( r.Width(), r.Height() );
        }

    TSize MinimumSize()
        {
        if ( iFind )
            {
            if ( iFind->Size() != TSize( 0, 0 ) )
                {
                return iFind->Size();
                }
            }
            
        return iSize;
        }
    };




#endif      // MEDIALFILEDIALOG_H
            
// End of File