diff -r 000000000000 -r ff3acec5bc43 mpxplugins/viewplugins/inc/mpxmetadataeditordialog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpxplugins/viewplugins/inc/mpxmetadataeditordialog.h Thu Dec 17 08:45:05 2009 +0200 @@ -0,0 +1,604 @@ +/* +* 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: Music Player metadata editor dialog implementation +* +*/ + + +#ifndef MPXMETADATAEDITORDIALOG_H +#define MPXMETADATAEDITORDIALOG_H + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include + +// CONSTANTS +const TInt KMPXMetadataTextFieldMaxLen = 255; + +// FORWARD DECLARATIONS +class CAknTitlePane; +class CAknNavigationControlContainer; +class CAknNavigationDecorator; +class CAknQueryValueText; +class CAknQueryValueTextArray; +class MMPXCollectionUtility; +class CMPXCommonUiHelper; +class CMPXMedia; +class MMPXCollectionUiHelper; +class CAknPopupField; +class CIdle; + +// CLASS DECLARATION +/* +* Provides query dialog for changing track's library. +*/ +NONSHARABLE_CLASS( CMPXQueryDialog ) : public CAknQueryDialog + { +public: + /** + * Two-phased constructor. + */ + static CMPXQueryDialog* NewL(); + + /** + * From CAknDialog + * Handle key events. When a key event occurs, + * until one of them returns EKeyWasConsumed to indicate that it processed the key event. + * CONE calls this function for each control on the control stack, + * @param aKeyEvent The key event. + * @param aType The type of the event: EEventKey, EEventKeyUp or EEventKeyDown. + * @return Indicates whether or not the key event was used by this control. + */ + TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType); + }; + +/* +* Provides factory to create concrete document object. +*/ +NONSHARABLE_CLASS( CMPXMetadataEditorDialog ) : public CAknForm, + public MMPXCollectionObserver, + public MMPXCollectionFindObserver, + public MMPXCHelperObserver + { +public: + // File Details headings + enum TMPXSongsFileDetailsHeadings + { + EMPXSongsFileDetailsHeadingFilename = 0, // Start from index 0 + EMPXSongsFileDetailsHeadingFormat, + EMPXSongsFileDetailsHeadingDuration, + EMPXSongsFileDetailsHeadingBitrate, + EMPXSongsFileDetailsHeadingSamplingRate, + EMPXSongsFileDetailsHeadingSize, + EMPXSongsFileDetailsHeadingModified, + EMPXSongsFileDetailsHeadingCopyright, + EMPXSongsFileDetailsHeadingUrl, + EMPXSongsFileDetailsHeadingCount + }; + + enum TMPXPodcastsFileDetailsHeadings + { + EMPXPodcastsFileDetailsHeadingFilename = 0, // Start from index 0 + EMPXPodcastsFileDetailsHeadingFormat, + EMPXPodcastsFileDetailsHeadingDuration, + EMPXPodcastsFileDetailsHeadingBitrate, + EMPXPodcastsFileDetailsHeadingSamplingRate, + EMPXPodcastsFileDetailsHeadingSize, + EMPXPodcastsFileDetailsHeadingLastPlaybackPosition, + EMPXPodcastsFileDetailsHeadingPublished, + EMPXPodcastsFileDetailsHeadingModified, + EMPXPodcastsFileDetailsHeadingCopyright, + EMPXPodcastsFileDetailsHeadingUrl, + EMPXPodcastsFileDetailsHeadingCount + }; + +public: // Constructor and destructor + /** + * Two-phased constructor. + */ + IMPORT_C static CMPXMetadataEditorDialog* NewL(); + + /** + * Destructor. + */ + IMPORT_C virtual ~CMPXMetadataEditorDialog(); + + /** + * Parameter passed in from viewframework + * + * @param aParam Parameter pass in from viewframework. + */ + IMPORT_C void SetParamL( const TDesC* aParam ); + + /** + * From CAknDialog update member variables of CAknExEditorDialog. + * @param aButtonId The ID of the button that was activated. + * @return Should return ETrue if the dialog should exit, + * and EFalse if it should not + */ + TBool OkToExitL(TInt aButtonId); + + /** + * From CAknDialog. + * + * @param aResourceId The resource ID of the dialog to load. + * @return Zero, unless it is a waiting dialog. For a waiting dialog, + * the return value is the ID of the button that closed the + * dialog, or zero if it was the cancel button + * (@c EEikBidCancel). + */ + TInt ExecuteLD( TInt aResourceId ); + + /** + * Display file details popup window + */ + void ViewFileDetailsPopupL(); + +private: // from base class MMPXCollectionObserver + + /** + * Handle collection message. + * + * @param aMessage Collection message + * @param aErr system error code. + */ + void HandleCollectionMessage( + CMPXMessage* aMessage, TInt aError ); + + /** + * Handles the collection entries being opened. Typically called + * when client has Open()'d a folder + * + * @param aEntries collection entries opened + * @param aIndex focused entry + * @param aComplete ETrue no more entries. EFalse more entries + * expected + * @param aError error code + */ + void HandleOpenL( + const CMPXMedia& aEntries, + TInt aIndex, TBool aComplete, TInt aError); + + /** + * Handles the item being opened. Typically called + * when client has Open()'d an item. Client typically responds by + * 'playing' the item via the playlist + * + * @param aPlaylist collection playlist + * @param aError error code + */ + void HandleOpenL( const CMPXCollectionPlaylist& aPlaylist, TInt aError ); + + /** + * Handle media properties + * + * @param aMedia media + * @param aError error code + */ + void HandleCollectionMediaL( + const CMPXMedia& aMedia, + TInt aError); + +private: // Constructor + /** + * Default constructor. + */ + CMPXMetadataEditorDialog(); + + /** + * Second-phase constructor. + */ + void ConstructL(); + +private: // New functions + + /** + * Clean up function for genre related members. + */ + void CleanUpGenreText(); + + /** + * Populates genre popup with genre list for tracks. + */ + void FetchGenreL(); + + /** + * Handle media properties. + * + * @param aMedia media properties + * @param aError error code + */ + void DoHandleMediaL( + const CMPXMedia& aMedia, + TInt aError ); + + /** + * Saves media back to collection engine + * + * @param aMedia media property to save back + */ + void SaveMediaPropertiesL( CMPXMedia* aMedia ); + + /** + * Appends the value to the array, if the vaule has zero length, + * appends "unavailable" + * + * @param aArray array to append to + * @param aValue value to append + */ + void AppendStringToArrayL( CDesCArrayFlat* aArray, const TDesC& aValue ); + + /** + * Sets control text + * + * @param aControlId The ID of the control + * @param aValue value to set + * @param aAlternateValue if aValue is zero length, + * this value will be used instead + * + */ + void SetControlTextL( TInt aControlId, const TDesC& aValue, + const TDesC& aAlternateValue ); + + /** + * Sets control text + * + * @param aControlId The ID of the control + * @param aValue value to set + * @param aMinValue minimum value allowed for this control + * @param aMaxValue maximum value allowed for this control + * + */ + void SetControlNumberL( TInt aControlId, const TDesC& aValue, + TInt aMinValue, TInt aMaxValue ); + + /** + * prompt user for library change + * + * @param aMoveToLibrary enum for library to move to + * @return ETrue if the user confirms the change, EFalse if cancel + */ + TBool PromptForLibraryChangeL( TInt aMoveToLibrary ); + + /** + * Updates media object with current control text, this will also + * update iMedia + * + * @param aControlId the id of the control + * @param aMedia media object to update + * @param aAttribute attribute to save to + * + * @return EFalse if the control being checked has not been changed (equal) + * ETrue if the control being checked has been changed + */ + TBool UpdateMediaObjectWithControlL( + TInt aControlId, CMPXMedia* aMedia, TMPXAttribute aAttribute ); + + static TInt DeferredExitCallback( TAny* aPtr ); + + static TInt DeferredFileDetailsCallback( TAny* aPtr ); + +#ifdef __ENABLE_MSK + /** + * Update softkey. + */ + void UpdateSoftkeyL(); +#endif // __ENABLE_MSK + +private: // Functions from base class + +#ifdef __ENABLE_MSK + /** + * From CAknForm, handles key-events. + * @param aKeyEvent Key event. + * @param aType Type of key event(EEventKey, EEventKeyUp or + * EEventKeyDown). + * @return If key-event is consumed, EKeyWasConsumed. Else + * EKeyWasNotConsumed. + */ + TKeyResponse OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ); +#endif // __ENABLE_MSK + + /** + * From CAknForm + * Save the contents of the form. + */ + TBool SaveFormDataL(); + + /** + * From CAknForm + * Does not save the contents of the form. + */ + void DoNotSaveFormDataL(); + + /** + * Store the old title pane text and set the new one + */ + void SetTitlePaneL(); + + /** + * Restore the old title pane text + */ + void RestoreTitlePaneL(); + + /** + * Store the old title navi label and set the new one + */ + void SetNaviLabelL(); + + /** + * Restore the old navi label text + */ + void RestoreNaviLabelL(); + + /** + * From MEikMenuObserver. + * Dynamically initialises a menu pane. This function can be overridden + * by the derived class for its own purpose. + * @param aResourceId Resource ID identifying the menu pane to initialise. + * @param aMenuPane The in-memory representation of the menu pane. + */ + void DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ); + + /** + * Act on the menu selection if menu is showing + */ + void ProcessCommandL(TInt aCommandId); + + /** + * Populates file details window for songs + * @param aHeadingsArray array of the headers + * @param aDataArray array to populate + */ + void PopulateFileDetailsL( + CDesCArrayFlat* aHeadingsArray, CDesCArrayFlat* aDataArray ); + + /** + * Populates file details window for podcasts + * @param aHeadingsArray array of the headers + * @param aDataArray array to populate + */ + void PopulatePodcastFileDetailsL( + CDesCArrayFlat* aHeadingsArray, CDesCArrayFlat* aDataArray ); + + /** + * Constructs DRM items. + * @param aHeadingsArray array of the headers + * @param aDataArray array to populate + */ + void MakeDrmItemsL( + CDesCArrayFlat* aHeadingsArray, CDesCArrayFlat* aDataArray ); + + /** + * Constructs restricted drm items. E.g. count, interval + * @param aRights Drm right type "Play" + * @param aCurrentIndex current index of the listbox to insert into + * @param aHeadingsArray array of the headers + * @param aDataArray array to populate + */ + void MakeRestrictedDrmItemsL( + HBufC* aRights, TInt& aCurrentIndex, + CDesCArrayFlat* aHeadingsArray, CDesCArrayFlat* aDataArray ); + + /** + * Add parts Of time. + * @param aIntYrs year information + * @param aIntMon month information + * @param aIntDay day information + * @param aIntHrs hour information + * @param aIntMin minute information + * @param aIntSec second information + * @return Buffer where to add the elements + */ + HBufC* AddPartsOfTimeLC( TInt aIntYrs, TInt aIntMon, TInt aIntDay, + TInt aIntHrs, TInt aIntMin, TInt aIntSec ); + + /** + * Add a single element of time to the string array + * @param aNumOfElements Number of elements of the interval + * @param aResourceIdSingle Resource id to be used in case of + * single unit + * @param aResourceIdOneFinal Resource id to be used in case of + * units ending with 1, from 21 + * (requested by Slavic languages) + * @param aResourceIdTwoFour Resource id to be used in case of + * units included from two to four, except + * 12-14 (requested by Slavic languages) + * @param aResourceIdFiveZero Resource id to be used in case of + * units ending from 5 to 9, plus range + * from 11 to 14 (requested by Slavic + * languages) + * @param aStrings DesCArrayFlat where to add the element + */ + + void AddSinglePartOfTimeL( TInt aNumOfElements, + TInt aResourceIdSingle, + TInt aResourceIdOneFinal, + TInt aResourceIdTwoFour, + TInt aResourceIdFiveZero, + CDesCArrayFlat* aStrings ); + + /** + * Split TimeIntervalSeconds into parts Of time. + * @param aIntYrs year information + * @param aIntMon month information + * @param aIntDay day information + * @param aIntHrs hour information + * @param aIntMin minute information + * @param aIntSec second information + * @return void + */ + void SplitTime( const TTimeIntervalSeconds& aInterval, + TInt& aIntYrs, TInt& aIntMon, TInt& aIntDay, + TInt& aIntHrs, TInt& aIntMin, TInt& aIntSec ); + /** + * Add a single element of time to the string array + * @param aNumOfElements Number of elements of the interval + * @param aResourceIdSingle Resource id to be used in case of + * single unit + * @param aResourceIdOneFinal Resource id to be used in case of + * units ending with 1, from 21 + * (requested by Slavic languages) + * @param aResourceIdTwoFour Resource id to be used in case of + * units included from two to four, except + * 12-14 (requested by Slavic languages) + * @param aResourceIdFiveZero Resource id to be used in case of + * units ending from 5 to 9, plus range + * from 11 to 14 (requested by Slavic + * languages) + * @param aStrings Buffer where to add the element + */ + void AddSinglePartOfTimeL( TInt aNumOfElements, + TInt aResourceIdSingle, + TInt aResourceIdOneFinal, + TInt aResourceIdTwoFour, + TInt aResourceIdFiveZero, + HBufC*& aStrings ); + + /** + * Converts between arabic-indic digits and european digits. + * @param aText numbers to be converted. + * @return void + */ + void LanguageSpecificNumberConversion( TDes& aText ) const; + + /** + * Converts the time value to localtime + * @param aTime contains the UTC time to be converted, and the converted value on exit + */ + void ConvertToLocalTimeL(TTime& aTime ); + + /** + * Adds header and value to list. + * @param aHeading Heading + * @param aValue Value + * @param aItemArray Array where value and header are added. + * @return void + */ + void AddItemToListBoxL( const TDesC& aHeading, + const TDesC& aValue, + CDesCArray* aItemArray ); + + /** + * This is used to decide when to save changes. If a leave occurs the + * framework generates a Symbian Leave code. + * @param aControlId. Control id. + */ + void HandleControlStateChangeL( TInt aControlId ); + + /** + * Function from @c CEikDialog and thence from c@ MEikDialogPageObserver. + * Checks if either year or track control id's are empty, and if so set to 0. + */ + void PrepareForFocusTransitionL(); + + /** + * Required for help. + */ + void GetHelpContext( TCoeHelpContext& aContext ) const; + +// from MMPXCollectionFindObserver + + /** + * Handle callback for "find" operation + * @param aEntries, CMPXMedia to be returned + * @param aComplete ETrue no more entries. EFalse more entries + * expected + * @param aError error code + */ + void HandleFindAllL( const CMPXMedia& aResults, + TBool aComplete,TInt aError ); + +// from MMPXCHelperObserver + + /** + * Handle callback for the ui helper + * @param aOperation operation performed + * @param aErr error code + * @param aArgument argument returned + */ + void HandleOperationCompleteL( TCHelperOperation aOperation, + TInt aErr, + void* aArgument ); + +private: // From CEikDialog + /** + * From CEikDialog, PreLayoutDynInitL. + * Initialises the dialog's controls before the dialog is sized + * and layed out. + */ + void PreLayoutDynInitL(); + + /** + * From CEikDialog, PostLayoutDynInitL. + * Initialises the dialog's controls after the dialog has been sized + * but before it has been activated. + */ + void PostLayoutDynInitL(); + +private: + enum TMPXMetadataEditorCurrentMediaLOp + { + EMPXMetadataEditorIdle = 0, + EMPXMetadataEditorGetSongInfo, + EMPXMetadataEditorGetDrmInfo + }; + +private: + CAknTitlePane* iTitlePane; + CAknNavigationControlContainer* iNaviPane; + CAknNavigationDecorator* iNaviDecorator; // Navi decorator + CAknNavigationDecorator* iEmptyNaviDecorator; // Navi decorator + CAknPopupField* iPopup; + CAknQueryValueText* iTextValues; + CAknQueryValueTextArray* iValueTextArray; + CDesCArray* iGenreArr; + CAknQueryValueText* iLibraryTextValues; + CAknQueryValueTextArray* iLibraryValueTextArray; + CDesCArray* iLibraryArr; + + HBufC* iTitlePaneText; + HBufC* iParam; + + MMPXCollectionUiHelper* iCollectionUiHelper; + MMPXCollectionUtility* iCollectionUtility; + CMPXMedia* iMedia; // own + CMPXMedia* iDrmInfo; + CMPXCommonUiHelper* iCommonUiHelper; // own + + TInt iResourceOffset; // must be freed + TInt iDrmResourceOffset; // must be freed + TInt iCurrentLibrary; + TInt iYear; // special handling needed for year + TInt iCurrentMediaLOp; + TInt iIsDrmProtected; + + TBool iUnknownGenre; + TBool iDrmDetails; // Flags if DRMRightsManager.rsc was loaded + TBool iDisablePodcasting; + CIdle* iIdle; + TBool iTryingExit; + }; + +#endif // MPXMETADATAEDITORDIALOG_H + +// End of File