/*
* Copyright (c) 2002-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: BIO control for Ringing Tones.
*
*/
#ifndef CRINGINGTONEBIOCONTROL_H
#define CRINGINGTONEBIOCONTROL_H
// INCLUDES
#include <msgbiocontrol.h> // for CMsgBioControl
#include <MMsgBioControlExtension.h> // MMsgBioControlExtension;
#include <msgasynccontrolobserver.h> // observer interface for CMsgAudioControl
#include <eikcmobs.h> // MEikCommandObserver
// FORWARD DECLARATIONS
class CEikButtonGroupContainer;
class CEikRichTextEditor;
class CMsgAudioControl;
// CLASS DECLARATION
/**
* Bio control for Ringing Tones.
*/
class CRingingToneBioControl :
public CMsgBioControl,
public MEikCommandObserver,
public MMsgAsyncControlObserver
{
public: // Constructor and destructor
/**
* Two-phased constructor
* @param aObserver Reference to the Bio control observer.
* @param aSession Reference to Message Server session.
* @param aId Id of the message.
* @param aEditorOrViewerMode Flags the new Bio control as editor or
* viewer.
* @param aFile filehandle.
* @return The newly created object.
*/
IMPORT_C static CMsgBioControl* NewL(
MMsgBioControlObserver& aObserver,
CMsvSession* aSession,
TMsvId aId,
TMsgBioMode aEditorOrViewerMode,
const RFile* aFile);
/**
* Destructor.
*/
~CRingingToneBioControl();
public: // Functions from MEikCommandObserver
/**
* From MEikCommandObserver
* Handle prosess command.
* @param aCommandId command id.
*/
void ProcessCommandL( TInt aCommandId );
public: // Functions from MMsgBioControl
/**
* From MMsgBioControl Calculates and sets size for a Bio control
* according to aSize.
* The height of the Bio control may be less or more than requested by
* aSize, but the width must be exactly the same. If width of the Bio
* control is not the same as given by aSize, the width must be reset
* back to requested one.
* @param aSize Size A reference to the suggested size and new size..
*/
void SetAndGetSizeL( TSize& aSize );
/**
* From MMsgBioControl This is called by the container to allow the Bio
* control to add a menu item.
* @param aMenuPane Reference to the application's menu.
*/
void SetMenuCommandSetL( CEikMenuPane& aMenuPane );
/**
* From MMsgBioControl Returns a rectangle slice of the bio controls
* viewing area. It is used by the CMsgEditorView class for scrolling
* the screen.
* @return TRect to show viewing area
*/
TRect CurrentLineRect() const;
/**
* From MMsgBioControl Returns true if Focus change is possible.
* @param aDirection The direction to be checked.
* @return ETrue if it is possible and vice versa
*/
TBool IsFocusChangePossible( TMsgFocusDirection aDirection ) const;
/**
* From MMsgBioControl The container application obtains a header text
* from the bio control.
* @return The header text.
*/
HBufC* HeaderTextL() const;
/**
* From MMsgBioControl The command handler.
* The Bio Control should only handle its own commands that it has set
* using the function SetMenuCommandSetL().
* @param aCommand ID of command to be handled.
* @return If the command is handled, it returns ETrue, and vice versa
*/
TBool HandleBioCommandL(TInt aCommand);
/**
* The application can get the option menu recommendations using this
* function. The function comes from MMsgBioControl. This is the
* default implementation which returns the flags
* KMsgBioCallBackToSender and KMsgBioCreateContactCard. Bio Controls
* should override this if it is not ok.
* @return The option menu permission flags. If the flag is off it
* means that the option menu command is not recommended with this
* Bio Control.
*/
TUint32 OptionMenuPermissionsL() const;
/**
* Get the virtual height of the control's content.
* @return virtual height in pixels.
*/
TInt VirtualHeight();
/**
* Get the position of invisible cursor.
* @return cursor position in pixels.
*/
TInt VirtualVisibleTop();
public: // Functions from CCoeControl
/**
* A CCoeControl virtual for handling key events.
* @param aKeyEvent The key event.
* @param aType TEventCode
* @return EKeyWasConsumed or EKeyWasNotConsumed
*/
TKeyResponse OfferKeyEventL(
const TKeyEvent& aKeyEvent,
TEventCode aType );
/**
* Returns a bio control's a context sensitive help.
* @param aHelpContext Help context.
*/
void GetHelpContext(TCoeHelpContext& aHelpContext) const;
public: //from MMsgAsyncControlObserver
void MsgAsyncControlStateChanged( CMsgBaseControl& aControl,
TMsgAsyncControlState aNewState,
TMsgAsyncControlState aOldState );
void MsgAsyncControlResourceChanged( CMsgBaseControl& aControl,
TInt aType );
protected: // Functions from CCoeControl
/**
* From CCoeControl Handles a change to the control's resources
* of type aType which are shared across the environment,
* e.g. color scheme change, or in this case, skin change.
* @param aType Event type
*/
void HandleResourceChange( TInt aType );
/**
* From CCoeControl Gives the number of sub controls.
* @return Count of controls be included in this component
*/
TInt CountComponentControls() const;
/**
* From CCoeControl Returns a pointer to a certain sub control.
* @param aIndex Index for control
* @return Pointer to component in question.
*/
CCoeControl* ComponentControl( TInt aIndex ) const;
/**
* From CCoeControl This is called by the CONE framework, and gives
* this control a chance to manage the layout of its sub controls.
*/
void SizeChanged();
/**
* From CCoeControl This is called when focus is lost or gained, and
* is used for setting the focus of the list box.
* @param aDrawNow
*/
void FocusChanged( TDrawNow aDrawNow );
/**
* From CCoeControl Sets the container window for this control. The
* container control uses this function to set the same window for
* this control.
* @param aContainer container
*/
void SetContainerWindowL( const CCoeControl& aContainer );
/**
* Used to draw Ringing tone icon
*/
void Draw(const TRect& aRect) const;
void HandlePointerEventL(const TPointerEvent& aPointerEvent);
private: // Constructors
/**
* The constructor.
* @param aObserver MMsgBioControlObserver
* @param aSession CMsvSession, the Message Server session.
* @param aId Id of the message in Message Server.
* @param aEditorOrViewerMode Flags the control as being either editor
* or viewer.
* @param aFile file handle
*/
CRingingToneBioControl(
MMsgBioControlObserver& aObserver,
CMsvSession* aSession,
TMsvId aId,
TMsgBioMode aEditorOrViewerMode,
const RFile* aFile);
/**
* By default Symbian OS constructor is private.
*/
void ConstructL();
private: //New functions
/**
* Loads a ringing tone.
*/
void OpenFileL();
/**
* Plays ringin tone. Because support for playing OTA files are not
* supported in WINS, command plays nothing
*/
void PlaybackL();
/**
* Stops playing ringin tone.
*/
void StopPlayback();
/**
* Creates richeditor for ringing tone title.
*/
void CreateRichEditorL();
/**
* add song title as a item to aItemArray
* @param aItemArray Array for listbox
*/
void AddSongTitleToArrayL(CDesCArray& aItemArray) const;
/**
* Seek if string contains back slash
* @param aTitle Descriptor where to find back slash
* @return ETrue if back slash was found, else EFalse
*/
TBool IsBackSlash(TDes& aTitle);
/**
* Seek if string consists solely single dot or double dot
* @param aTitle Descriptor where to find dots
* @return ETrue if only dots are found, else EFalse
*/
TBool IsOnlyDots(TDes& aTitle);
/**
* Finds out if file already exists
* @param aTitle Filename without path or file extent
* @return ETrue if file already exists, else EFalse
*/
TBool ExistsL(TDes& aTitle);
/**
* Finds out is the filename valid for saving
* @param aTitle Filename without path or file extent
* @param aNotes Flag to indicate if the notes are shown
* @return ETrue if file name is valid, else EFalse
*/
TBool IsValidL(TDes& aTitle, TBool aNotes);
/**
*
* @param aTitle Filename without path or file extent
* @return EFalse if user pressed cancel, else ETrue
*/
TBool AskNameL(TDes& aTitle);
/**
*
* @param aTitle Filename without path or file extent
* @return EFalse if user pressed cancel, else ETrue
*/
TBool AskAndValidNameL(TDes& aTitle);
/**
* Add ringing tone to the file system
*/
TBool SaveToneL(TDes& aTitle);
/**
* Called when user like to add Tone to composer.
*/
void TrySaveToneL();
/**
* Creates target path for saving tone to filesystem
* @param aName File name to be added in path
* @return Target path
*/
HBufC* CreatePathForSavingLC(const TDesC& aName);
/**
* User interactivity, ask if liked to rename saveable tone,
* then ask the new name for tone.
* @return true if the new name is available, otherwise false.
*/
TBool RenameQueryL(TDes& aTitle);
/**
* Set Default name with increments to the iSaveTitle
*/
void SetDefaultNameL(TDes& aName);
/**
* Help function to handle name query
* @param aName ringing tone name
* @return ETrue if it is OK, else EFalse
*/
TBool NameQueryL(TDes& aName);
/**
* Rip title form ringing tone format by using composer engine
*/
void TakeTitleL();
/**
* Increments numbers after file name, e.g.Ringing Tone1->Ringing Tone2
* @param aFileName ringing tone name
*/
void IncrementFileNameL(TDes& aFileName);
/**
* Find out the target path
* @return target path
*/
HBufC* TargetPathLC();
/**
* Checks is the ringing tone message in valid format. Leaves with *** if not.
*/
void CheckMsgValidityL();
/**
* Loads ringing tone icon bitmap and mask, and fills transparent area with white color and
* saves the new bitmap to temp folder.
*/
void FillBitmapMaskL();
/**
* Correts CEikRichTextEditor's Font and set the alignment to centered.
*/
void CorrectFormatToRichEditorL();
/**
* An information note is popped.
* @param aStringResource The string resource id.
*/
void InformationNoteL(TInt aStringResource);
/**
* Gets profile settings from shared data.
*/
void GetAndSetRingingToneVolumeL();
private: // Hidden away
/**
* C++ default constructor, hidden away from outsiders.
*/
CRingingToneBioControl();
/**
* Copy-constructor is prohibited.
*/
CRingingToneBioControl(const CRingingToneBioControl& aSource);
/**
* Assignment operator is prohibited.
*/
const CRingingToneBioControl& operator=(
const CRingingToneBioControl& aSource );
private: // data
///Ringing tone name
HBufC* iToneTitle;
/// control for showing Ringing tone name
CEikRichTextEditor* iRichEditor;
/*
* Audio player
* Owned
*/
CMsgAudioControl *iAudioControl;
//audio control states
TMsgAsyncControlState iPlayerState;
//Object to handle softkeys in playtime
CEikButtonGroupContainer *iStopCba;
};
#endif //CRINGINGTONEBIOCONTROL_H
// End of File