fmradio/fmradio/src/fmradiochannellistcontainer.cpp
changeset 0 f3d95d9c00ab
child 3 42dc287846be
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fmradio/fmradio/src/fmradiochannellistcontainer.cpp	Tue Feb 02 00:17:10 2010 +0200
@@ -0,0 +1,973 @@
+/*
+* Copyright (c) 2005 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:  Implementation of the class CFMRadioChannelListContainer
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32math.h>
+#include <AknsSkinInstance.h>
+#include <AknsUtils.h>
+#include <AknsDrawUtils.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <gulutil.h> 
+#include <w32std.h>
+#include <fmradio.rsg>
+#if defined __SERIES60_HELP || defined FF_S60_HELPS_IN_USE
+#include "radio.hlp.hrh"
+#endif
+#include <StringLoader.h>
+#include <eiklabel.h>
+#include <AknIconArray.h>
+#include <gulicon.h>
+#include <fmradiouids.h>
+
+#include "fmradioappui.h"
+#include "fmradiochannellistcontainer.h"
+#include "fmradiochannellistview.h"
+
+// CONSTANTS
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// ----------------------------------------------------------------------------
+// CFMRadioChannelListContainer::CFMRadioChannelListContainer
+// Default constructor
+// ----------------------------------------------------------------------------
+//
+CFMRadioChannelListContainer::CFMRadioChannelListContainer( 
+	CRadioEngine& aRadioEngine,
+	MChannelListHandler& aObserver ) :
+	iRadioEngine( aRadioEngine ),
+	iObserver( aObserver )
+	
+	{	
+	}
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::NewL
+// Two-phase constructor of CFMRadioChannelListContainer
+// ---------------------------------------------------------
+//
+CFMRadioChannelListContainer* CFMRadioChannelListContainer::NewL( const TRect& aRect, 
+		CRadioEngine& aRadioEngine, MChannelListHandler& aObserver  )
+    {
+    CFMRadioChannelListContainer* self = new (ELeave) CFMRadioChannelListContainer( aRadioEngine,
+    		aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+//
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::ConstructL
+// EPOC two phased constructor
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::ConstructL( const TRect& aRect )
+    {
+    CreateWindowL();
+    CAknIconArray* radioTypeIcons = NULL;
+
+    radioTypeIcons = new( ELeave ) CAknIconArray( 2 );
+    CleanupStack::PushL( radioTypeIcons );
+
+    radioTypeIcons->AppendFromResourceL( R_FMRADIO_CHANNEL_LIST_ICON_ARRAY );
+
+    // Instantiate a listbox for the channel list
+    iChannelList = new ( ELeave ) CAknDoubleNumberStyleListBox();
+    iControls.Append( iChannelList );
+    iChannelList->SetContainerWindowL( *this );
+    iChannelList->SetListBoxObserver( this );
+    iChannelList->ConstructL( this, CEikListBox::ELoopScrolling | EAknListBoxSelectionList ); // Looped list
+    iChannelList->SetRect( aRect ); // Set boundaries for listbox
+    // Create scrollbars
+    iChannelList->CreateScrollBarFrameL( ETrue );
+    iChannelList->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+    HBufC* emptyString = NULL;
+    emptyString = StringLoader::LoadLC( R_QTN_FMRADIO_LIST_NO_STATIONS, iEikonEnv );
+    
+    iChannelList->View()->SetListEmptyTextL( *emptyString );
+    CleanupStack::PopAndDestroy( emptyString );    
+
+    // The following line really takes the ownership -- must be the last item 
+    // there, as if leaves and the object is in cleanupstack, problems arise. 
+    // (Cleanup stack corruption!)  
+    //  Set the icon array for this list. List takes ownership of the array. 
+    iChannelList->ItemDrawer()->FormattedCellData()->SetIconArrayL( radioTypeIcons );
+    CleanupStack::Pop( radioTypeIcons );
+    
+    // Array for channels
+    iChannelItemArray = new( ELeave ) CDesCArrayFlat( KMaxNumberOfChannelListItems );
+    InitializeChannelListL();
+    SetRect( aRect );             // Set its rectangle
+
+    CFMRadioAppUi* appUi = static_cast<CFMRadioAppUi*>( iCoeEnv->AppUi() );
+    iChannelView = static_cast<CFMRadioChannelListView*> ( appUi->View( KFMRadioChannelListViewId ) );
+    
+    ActivateL();
+    }
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::~CFMRadioChannelListContainer
+// Class destructor
+// ----------------------------------------------------
+//
+CFMRadioChannelListContainer::~CFMRadioChannelListContainer()
+    {
+    iControls.ResetAndDestroy();
+    delete iChannelItemArray;
+    }
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::InitializeChannelListL
+// Create the channel list (initially all spots are set as empty)
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::InitializeChannelListL()
+	{
+    TBuf<KLengthOfChannelItemString> textChannelItem;
+    textChannelItem.SetLength( 0 );
+
+    // Pass the array to the listbox model and set the ownership type
+    iChannelList->Model()->SetItemTextArray( (MDesCArray*)iChannelItemArray );
+    iChannelList->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+    iChannelList->HandleItemAdditionL();
+	DrawDeferred();
+	}
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::UpdateChannelListContentL
+// Update the content of the channel at aIndex with the
+// values specified
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::UpdateChannelListContentL( TInt aIndex, const TDesC& aChannelName, TInt aChannelFrequency )
+	{
+    TBuf<KLengthOfChannelItemString> textChannelItem;
+    TBuf<KLengthOfChIndexStringChList> textChIndex;
+    TBuf<KLengthOfChannelItemIconIndexString> textChIconIndex;
+
+    textChIndex.Format( KChIndexFormatChList, aIndex+1 ); // One over index
+ 
+    textChIconIndex.Format( KChIconIndexFormatChList, KNowPlayingIconIndexChList );
+
+	//Update to display Devnagari numbers for Text Index.
+   	AknTextUtils::LanguageSpecificNumberConversion( textChIndex );
+   	//
+    textChannelItem.Append( textChIndex );
+    textChannelItem.Append( KColumnListSeparator );
+    textChannelItem.Append( aChannelName );
+    textChannelItem.Append( KColumnListSeparator );
+    
+    if ( aChannelFrequency )
+		{
+		TReal frequency = static_cast<TReal>( aChannelFrequency / static_cast<TReal>( KHzConversionFactor ));
+		// Gets locale decimal separator automatically
+		TRealFormat format(KFrequencyMaxLength, iRadioEngine.DecimalCount() );
+		TBuf<30> frequencyString;
+		frequencyString.Num( frequency, format );
+
+		HBufC* stringHolder = StringLoader::LoadLC( R_QTN_FMRADIO_DOUBLE2_FREQ, frequencyString, iEikonEnv );
+		//Update for display of Hindi Devnagari Numbers
+		TPtr textItem2 = stringHolder->Des();
+   		AknTextUtils::LanguageSpecificNumberConversion(textItem2);
+		textChannelItem.Append( textItem2 );
+		CleanupStack::PopAndDestroy( stringHolder );
+		}
+        
+    // Set 'Now Playing' icon to the channel item
+    textChannelItem.Append( KColumnListSeparator );
+        		 
+    if ( iRadioEngine.GetPresetIndex() == aIndex )
+	    {	    
+        textChannelItem.Append( textChIconIndex );
+	    }
+    
+    if( iChannelItemArray->Count() > 0 )
+    	{
+	    iChannelItemArray->Delete( aIndex );
+	    iChannelList->HandleItemRemovalL();
+	    iChannelItemArray->InsertL( aIndex, textChannelItem );
+	    //iChannelItemArray->AppendL(  textChannelItem );
+	    
+	    iChannelList->HandleItemAdditionL(); // Update list
+	    iChannelList->UpdateScrollBarsL();
+		iChannelList->DrawDeferred();
+    	}
+	}
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::RemoveChannelL
+// Removes channel from container list
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::RemoveChannelL( TInt aIndex )
+	{
+	if ( iChannelItemArray->Count() > 0 )
+		{
+		TInt presetIndex = iRadioEngine.GetPresetIndex();
+		
+		iChannelItemArray->Delete( aIndex );
+		iChannelList->HandleItemRemovalL();
+		iChannelList->UpdateScrollBarsL();
+		iChannelList->DrawDeferred();
+							
+		if ( iChannelItemArray->Count() > 0 )
+			{
+			ReIndexAllL();
+			
+			if ( presetIndex > aIndex )			    
+			    {
+			    // update engine settings also
+			    iRadioEngine.SetCurrentPresetIndex( presetIndex - 1 );
+                UpdateItemIconL( presetIndex - 1, KNowPlayingIconIndexChList );
+                }
+			else if ( presetIndex == aIndex  )
+                {
+                iRadioEngine.TunePresetL( 0 );	
+                UpdateItemIconL( 0, KNowPlayingIconIndexChList );
+                }
+			else
+			    {
+			    // NOP
+			    }               
+            iChannelList->SetCurrentItemIndex( 0 );
+			}
+		else
+		    {
+		    // The last item was deleted, tune to current frequency, out of preset mode
+		    iRadioEngine.Tune( iRadioEngine.GetTunedFrequency(), CRadioEngine::ERadioTunerMode );
+		    }
+		}
+	}
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::AddChannel
+// Adds channels to container list
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::AddChannelL( 
+			const TDesC& aChannelName, TInt aChannelFrequency, TBool aNowPlaying  )
+	{
+	TBuf<KLengthOfChannelItemString> textChannelItem;
+	TBuf<KLengthOfChIndexStringChList> textChIndex;
+	TBuf<KLengthOfChannelItemIconIndexString> textChIconIndex;
+	
+	textChIndex.Format( KChIndexFormatChList, iChannelItemArray->Count()+1 ); // One over index
+ 
+   	if ( !AknLayoutUtils::PenEnabled() )
+		{
+    	textChIconIndex.Format( KChIconIndexFormatChList, KNowPlayingIconIndexChList ) ;
+		}    
+	
+	//Update to display Devnagari numbers for Text Index.
+	AknTextUtils::LanguageSpecificNumberConversion(textChIndex);
+	//
+	textChannelItem.Append( textChIndex );
+	textChannelItem.Append( KColumnListSeparator );
+	
+    TReal frequency = static_cast<TReal>( aChannelFrequency / static_cast<TReal>( KHzConversionFactor ));
+    // Gets locale decimal separator automatically
+    TRealFormat format(KFrequencyMaxLength, iRadioEngine.DecimalCount() );
+    TBuf<30> frequencyString;
+    frequencyString.Num(frequency,format);	
+	
+	TBool channelHasName = EFalse;
+	TInt resId = 0;
+	// if name exists, place it on the first line
+	if ( aChannelName.Length() > 0 )
+	    {
+	    textChannelItem.Append( aChannelName );
+	    textChannelItem.Append( KColumnListSeparator );
+	    channelHasName = ETrue;
+	    resId = R_QTN_FMRADIO_DOUBLE2_FREQ;
+	    }
+	else // frequency goes to first line
+	    {
+	    resId = R_QTN_FMRADIO_DOUBLE1_FREQ;
+	    }
+
+	HBufC* stringHolder = StringLoader::LoadLC( resId, frequencyString, iEikonEnv );    
+    //Update for display of Hindi Devnagari Numbers
+    TPtr textItem2 = stringHolder->Des();
+    AknTextUtils::LanguageSpecificNumberConversion(textItem2);
+    textChannelItem.Append( textItem2 );
+    CleanupStack::PopAndDestroy( stringHolder );
+        
+    if ( !channelHasName )
+        {
+        // add placeholder for second line
+        textChannelItem.Append( KColumnListSeparator ); 
+        }
+        
+	// Set 'Now Playing' icon to the channel item
+    textChannelItem.Append( KColumnListSeparator );
+	    		 
+	if( !AknLayoutUtils::PenEnabled() && aNowPlaying )
+	    {	    
+		textChannelItem.Append( textChIconIndex );	
+	    }
+	
+	iChannelItemArray->AppendL(  textChannelItem );
+	
+	iChannelList->HandleItemAdditionL(); // Update list
+	iChannelList->UpdateScrollBarsL();
+	iChannelList->DrawDeferred();
+	
+	}
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::UpdateItemIconL
+// Adds icon to a list item
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::UpdateItemIconL( TInt aIndex, TInt aIconIndex )
+    {
+    HideIconsL();
+
+    if ( aIndex >= 0 && aIndex < iChannelItemArray->Count() ) 
+        {
+        TBuf<KLengthOfChannelItemIconIndexString> textChIconIndex;
+        textChIconIndex.Format( KChIconIndexFormatChList, aIconIndex );
+        HBufC* channelItem = HBufC::NewLC( KLengthOfChannelItemString );
+        channelItem->Des().Copy( iChannelItemArray->MdcaPoint( aIndex ) );
+        TPtr ptr( channelItem->Des() );
+        ptr.Append( textChIconIndex ); // Add icon index
+        
+        iChannelItemArray->Delete( aIndex );
+        iChannelList->HandleItemRemovalL();
+        iChannelItemArray->InsertL( aIndex, *channelItem );
+        CleanupStack::PopAndDestroy( channelItem );
+        iChannelList->HandleItemAdditionL(); // Update list
+        iChannelList->UpdateScrollBarsL();
+        }
+    // use draw now so that view is up to date during fast channel switching
+    iChannelList->DrawNow();
+    }
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::HideIconsL
+// hide all icons from the list
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::HideIconsL()
+    {
+    for ( TInt index = 0 ; index < iChannelItemArray->Count(); index++ ) 
+        {
+        HBufC* channelItem = HBufC::NewLC( KLengthOfChannelItemString );
+        channelItem->Des().Copy( iChannelItemArray->MdcaPoint( index ) );
+        TPtr ptr( channelItem->Des() );	
+        
+        TBuf<KLengthOfChannelItemIconIndexString> textChIconIndex;
+        TPtrC iconIndexPtr( textChIconIndex );
+        TInt err = TextUtils::ColumnText( iconIndexPtr, 3, &ptr );
+        
+        if ( iconIndexPtr.Length() > 0 )
+            {
+            ptr.Delete( ptr.Length() - iconIndexPtr.Length(), iconIndexPtr.Length() ); // Remove icon index		
+            iChannelItemArray->Delete( index );
+            iChannelList->HandleItemRemovalL();
+            iChannelItemArray->InsertL( index, *channelItem );
+            iChannelList->HandleItemAdditionL(); // Update list
+            iChannelList->UpdateScrollBarsL();
+            }
+        CleanupStack::PopAndDestroy( channelItem );
+        }
+    }
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::SetFaded
+// Fades the entire window and controls in the window owned
+// by this container control.
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::SetFaded( TBool aFaded )
+	{
+    iFadeStatus = aFaded;
+    Window().SetFaded( aFaded, RWindowTreeNode::EFadeIncludeChildren );
+	}
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::UpdateLastListenedChannel
+// Updates channel index - the highlighted channel in the list.
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::UpdateLastListenedChannel( TInt aIndex )
+	{
+    iLastChIndex = aIndex;
+	iChannelList->SetCurrentItemIndex( iLastChIndex );
+	iChannelList->ScrollToMakeItemVisible( iLastChIndex );
+	iChannelList->DrawDeferred();
+	}
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::CurrentlySelectedChannel
+// Returns the index of the selected channel item from the
+// channel list.
+// ----------------------------------------------------
+//
+TInt CFMRadioChannelListContainer::CurrentlySelectedChannel() const
+	{
+    return iChannelList->CurrentItemIndex(); // Index of selected channel
+	}
+
+// ----------------------------------------------------
+// CFMRadioChannelListContainer::HandleListBoxEventL
+// For handling listbox-, in this case, channel list events.
+// The event equals to selecting a channel item from the list.
+// ----------------------------------------------------
+//
+void CFMRadioChannelListContainer::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+                                                      TListBoxEvent aEventType )
+    {
+    // Check the event generated by keypress and report the event,
+    // Also check for Pen Enabled touch screen event
+
+    switch ( aEventType )
+        {
+        case EEventEnterKeyPressed:
+            {
+            ReportEventL( MCoeControlObserver::EEventStateChanged );
+            break;
+            }
+        case EEventItemSingleClicked:
+            {
+            if ( iMoveAction )
+                {
+                TouchMoveEventL( CurrentlySelectedChannel() ); 
+                }
+            else
+                {
+                ReportEventL( MCoeControlObserver::EEventStateChanged );
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CFMRadioChannelListContainer::HandleResourceChange
+// -----------------------------------------------------------------------------
+//
+void CFMRadioChannelListContainer::HandleResourceChange(TInt aType)
+    {
+    CCoeControl::HandleResourceChange(aType);
+	if ( aType ==  KEikDynamicLayoutVariantSwitch  )
+		{
+		SizeChanged();
+		}
+    }
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::SizeChanged
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::SizeChanged()
+    {
+    // The channel list fills the whole view
+    iChannelList->SetRect( Rect() );
+    }
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::CountComponentControls
+// Return the number of controls in the window owned by this container
+// ---------------------------------------------------------
+//
+TInt CFMRadioChannelListContainer::CountComponentControls() const
+    {
+    return iControls.Count();
+    }
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::ComponentControl
+// Return the control corresponding to the specified index
+// ---------------------------------------------------------
+//
+CCoeControl* CFMRadioChannelListContainer::ComponentControl( TInt aIndex ) const
+    {
+    return STATIC_CAST( CCoeControl *,iControls[aIndex] );
+    }
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::OfferKeyEventL
+// Allow the channel list to process key events
+// ---------------------------------------------------------
+//
+TKeyResponse CFMRadioChannelListContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+														   TEventCode aType )
+	{
+	TKeyResponse response = EKeyWasNotConsumed;
+
+    switch ( aKeyEvent.iCode )
+		{
+        case EKeyLeftArrow:
+        case EKeyRightArrow:
+        	{
+            return EKeyWasNotConsumed;
+        	}
+        case EKeyUpArrow:
+        	if ( iMoveAction )	
+        		{
+        		MoveUpL();
+	            }
+        	else
+        		{
+        		response = iChannelList->OfferKeyEventL(aKeyEvent, aType);
+	            if (response == EKeyWasConsumed)
+	                {
+	                ReportEventL( MCoeControlObserver::EEventRequestFocus );
+	                }
+        		}
+        	return response;
+        case EKeyDownArrow:
+        	if ( iMoveAction )	
+        		{
+        		MoveDownL();
+	            }
+        	else
+        		{
+        		response = iChannelList->OfferKeyEventL(aKeyEvent, aType);
+	            if (response == EKeyWasConsumed)
+	                {
+	                ReportEventL( MCoeControlObserver::EEventRequestFocus );
+	                }
+        		}
+            return response;
+        default:
+			switch ( aKeyEvent.iScanCode ) //we need to use the scan code, because we need to process the event wrt the keyUp and keyDown action
+				{
+                case EKeyboardKey1: // Timed key
+                case EKeyboardKey2: // Normal keys
+                case EKeyboardKey3:
+                case EKeyboardKey4:
+                case EKeyboardKey5:
+                case EKeyboardKey6:
+                case EKeyboardKey7:
+                case EKeyboardKey8:
+                case EKeyboardKey9:
+                case EKeyboardKey0:
+					return EKeyWasNotConsumed;
+				default:
+					break;
+				}
+            break;
+		}
+    return iChannelList->OfferKeyEventL(aKeyEvent, aType);
+	}
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::Draw
+// Redraw the window owned by this container
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::Draw( const TRect& aRect ) const
+    {
+    CWindowGc& gc = SystemGc();
+    gc.SetPenStyle( CGraphicsContext::ENullPen );
+    gc.SetBrushColor( KRgbGray );
+    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+    gc.DrawRect( aRect );
+
+    // Fade if needed
+    Window().SetFaded( iFadeStatus, RWindowTreeNode::EFadeIncludeChildren );
+    }
+
+// ---------------------------------------------------------------------------
+// CFMRadioChannelListContainer::GetHelpContext
+// Gets Help
+//
+// ---------------------------------------------------------------------------
+//
+void CFMRadioChannelListContainer::GetHelpContext(TCoeHelpContext& aContext) const
+    {
+#if defined __SERIES60_HELP || defined FF_S60_HELPS_IN_USE
+    aContext.iMajor = TUid::Uid( KUidFMRadioApplication );
+    aContext.iContext = KFMRADIO_HLP_LIST;
+#endif
+    }
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::FocusChanged(TDrawNow aDrawNow)
+//
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::FocusChanged(TDrawNow aDrawNow)
+    {
+    CCoeControl::FocusChanged(aDrawNow);
+    if ( iChannelList )
+        {
+        iChannelList->SetFocus(IsFocused(), aDrawNow);
+        }
+    }
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::HandlePointerEventL
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    // don't handle any pointer events if view is faded
+    if ( !iFadeStatus )
+        {
+        CCoeControl::HandlePointerEventL( aPointerEvent );
+        }
+    }
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::ActivateMove
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::ActivateMoveL()
+    {
+    
+    iMoveAction = ETrue;
+    iMoveIndex = iChannelList->CurrentItemIndex();
+    iTouchMoveIndex = iMoveIndex;
+    UpdateItemIconL( iMoveIndex, KMoveIconIndexChList );
+	}
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::TouchMoveEventL
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::TouchMoveEventL( TInt aIndex )
+	{
+	HBufC* channelItem = HBufC::NewLC( KLengthOfChannelItemString );
+	channelItem->Des().Copy( iChannelItemArray->MdcaPoint( iTouchMoveIndex ) );
+	TPtr ptr( channelItem->Des() );	
+	
+	TBuf<KLengthOfChannelItemIconIndexString> textChIconIndex;
+	
+	TPtrC iconIndexPtr( textChIconIndex );
+	
+  	TInt err = TextUtils::ColumnText( iconIndexPtr, 3, &ptr );
+	
+	iChannelItemArray->Delete( iTouchMoveIndex );
+    iChannelList->HandleItemRemovalL();    
+    
+    iChannelItemArray->InsertL( aIndex, *channelItem );
+    iChannelList->HandleItemAdditionL(); 
+    iChannelList->UpdateScrollBarsL();
+    iChannelList->SetCurrentItemIndex( aIndex ); 
+	iChannelList->DrawDeferred();
+	
+	iTouchMoveIndex = aIndex;
+	
+	CleanupStack::PopAndDestroy( channelItem );
+	
+    ReIndexAllL();
+    UpdateItemIconL( aIndex, KMoveIconIndexChList );
+    iChannelView->MoveActionDoneL();
+	}
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::MoveDownL
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::MoveDownL()
+	{		
+	TInt index = iChannelList->CurrentItemIndex();
+	TInt originalindex = index;
+	
+	HBufC* channelItem = HBufC::NewLC( KLengthOfChannelItemString );
+	channelItem->Des().Copy( iChannelItemArray->MdcaPoint( index ) );
+	TPtr ptr( channelItem->Des() );
+	
+	iChannelItemArray->Delete( index );
+    iChannelList->HandleItemRemovalL();
+    
+    if ( index < iChannelItemArray->Count() )
+    	{
+    	index = index+1;
+    	   	
+    	TBuf<KLengthOfChIndexStringChList> channelindex;
+    		    
+	    TPtrC indexPtr( channelindex );
+	    
+	  	TInt errori = TextUtils::ColumnText( indexPtr, 0, &ptr );
+	  	
+	  	ptr.Delete( 0, indexPtr.Length() );
+	  		  	
+	  	channelindex.Format( KChIndexFormatChList, index+1 );
+	
+	   	AknTextUtils::LanguageSpecificNumberConversion( channelindex );
+	   	
+	   	ptr.Insert( 0, channelindex ); 
+	   	
+	    iChannelItemArray->InsertL( index, *channelItem );
+	    iChannelList->HandleItemAdditionL(); // Update list
+	    iChannelList->UpdateScrollBarsL();
+	    iChannelList->SetCurrentItemIndex( index );
+		iChannelList->DrawDeferred();
+		
+		HBufC* origchannelItem = HBufC::NewLC( KLengthOfChannelItemString );
+		origchannelItem->Des().Copy( iChannelItemArray->MdcaPoint( originalindex ) );
+		TPtr origptr( origchannelItem->Des() );	
+		
+		iChannelItemArray->Delete( originalindex );
+		iChannelList->HandleItemRemovalL();
+		TBuf<KLengthOfChIndexStringChList> origchannelindex;
+		    
+		TPtrC origindexPtr( origchannelindex );
+		    
+		TextUtils::ColumnText( origindexPtr, 0, &origptr );	
+		origptr.Delete( 0, origindexPtr.Length() );
+		  		  	
+		origchannelindex.Format( KChIndexFormatChList, originalindex+1 );
+		
+		AknTextUtils::LanguageSpecificNumberConversion( origchannelindex );
+		origptr.Insert( 0, origchannelindex ); 
+		iChannelItemArray->InsertL( originalindex, *origchannelItem );
+		iChannelList->HandleItemAdditionL();
+		iChannelList->UpdateScrollBarsL();
+		iChannelList->DrawDeferred();
+		
+		CleanupStack::PopAndDestroy( origchannelItem );
+    	}
+    else
+    	{
+    	index = 0;
+    	iChannelItemArray->InsertL( index, *channelItem );
+	    iChannelList->HandleItemAdditionL(); // Update list
+	    iChannelList->UpdateScrollBarsL();
+	    iChannelList->SetCurrentItemIndex( index );
+		iChannelList->DrawDeferred();
+		
+        ReIndexAllL();
+        }
+    
+    iChannelList->ScrollToMakeItemVisible( index );
+    
+	CleanupStack::PopAndDestroy( channelItem );
+
+	}
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::MoveUpL
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::MoveUpL()
+	{
+	TInt index = iChannelList->CurrentItemIndex();
+	TInt originalindex = index;
+	
+	HBufC* channelItem = HBufC::NewLC( KLengthOfChannelItemString );
+	channelItem->Des().Copy( iChannelItemArray->MdcaPoint( index ) );
+	TPtr ptr( channelItem->Des() );	
+	
+	iChannelItemArray->Delete( index );
+    iChannelList->HandleItemRemovalL();
+    
+    if ( 0 == index )
+    	{
+    	index = iChannelItemArray->Count();
+    	
+    	TBuf<KLengthOfChIndexStringChList> channelindex;
+    	    
+	    TPtrC indexPtr( channelindex );
+	    
+	    iChannelItemArray->InsertL( index, *channelItem );
+	    iChannelList->HandleItemAdditionL();
+	    iChannelList->UpdateScrollBarsL();
+
+	    iChannelList->SetCurrentItemIndex( index );
+	    
+	    iChannelList->DrawItem( index ); 
+	    
+        ReIndexAllL();
+    	}
+    else
+    	{
+    	index = index-1; 
+    
+	    TBuf<KLengthOfChIndexStringChList> channelindex;
+	    
+	    TPtrC indexPtr( channelindex );
+	    
+	  	TInt errori = TextUtils::ColumnText( indexPtr, 0, &ptr );
+	  	
+	  	ptr.Delete( 0, indexPtr.Length() );
+	  		  	
+	  	channelindex.Format( KChIndexFormatChList, index+1 );
+	
+	   	AknTextUtils::LanguageSpecificNumberConversion( channelindex );
+	   	ptr.Insert( 0, channelindex ); // Remove icon index
+	
+		iChannelItemArray->InsertL( index, *channelItem );
+	    iChannelList->SetCurrentItemIndex( index );
+	    iChannelList->HandleItemAdditionL();
+	    iChannelList->UpdateScrollBarsL();
+	    iChannelList->DrawItem( index ); 
+		
+		HBufC* origchannelItem = HBufC::NewLC( KLengthOfChannelItemString );
+		origchannelItem->Des().Copy( iChannelItemArray->MdcaPoint( originalindex ) );
+		TPtr origptr( origchannelItem->Des() );	
+		
+		iChannelItemArray->Delete( originalindex );
+	    iChannelList->HandleItemRemovalL();
+	    TBuf<KLengthOfChIndexStringChList> origchannelindex;
+	        
+	    TPtrC origindexPtr( origchannelindex );
+	        
+		TextUtils::ColumnText( origindexPtr, 0, &origptr );	
+		
+		origptr.Delete( 0, origindexPtr.Length() );
+		  		  	
+		origchannelindex.Format( KChIndexFormatChList, originalindex+1 );
+		
+		AknTextUtils::LanguageSpecificNumberConversion( origchannelindex );
+		origptr.Insert( 0, origchannelindex ); 
+		
+		iChannelItemArray->InsertL( originalindex, *origchannelItem );
+		iChannelList->HandleItemAdditionL();
+		iChannelList->DrawDeferred();
+
+		iChannelList->UpdateScrollBarsL();
+		
+		CleanupStack::PopAndDestroy( origchannelItem );
+    	 }
+    
+    iChannelList->ScrollToMakeItemVisible( index );
+    		
+	CleanupStack::PopAndDestroy( channelItem );
+	}
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::ReIndexAllL
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::ReIndexAllL()
+	{
+	HBufC* channelItem = HBufC::NewLC( KLengthOfChannelItemString );
+			
+	for ( TInt index = 0; index < iChannelItemArray->Count(); index++ )
+		{
+		channelItem->Des().Copy( iChannelItemArray->MdcaPoint( index ) );
+		TPtr ptr( channelItem->Des() );	
+		
+		iChannelItemArray->Delete( index );
+	    iChannelList->HandleItemRemovalL();
+	    
+	    TBuf<KLengthOfChIndexStringChList> channelindex;
+	    
+	    TPtrC indexPtr( channelindex );
+	    
+	  	TInt errori = TextUtils::ColumnText( indexPtr, 0, &ptr );
+	  	
+	  	ptr.Delete( 0, indexPtr.Length() );
+	  		  	
+	  	channelindex.Format( KChIndexFormatChList, index+1 );
+
+	   	AknTextUtils::LanguageSpecificNumberConversion( channelindex );
+	   	
+	   	ptr.Insert( 0, channelindex ); // Remove icon index
+			    
+	    iChannelItemArray->InsertL( index, *channelItem );
+	    
+        iChannelList->HandleItemAdditionL();
+        iChannelList->DrawDeferred();
+        iChannelList->UpdateScrollBarsL();
+		}
+		
+	CleanupStack::PopAndDestroy( channelItem );
+	}
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::HandleDropL
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::HandleDropL()
+    {
+    iMoveAction = EFalse;
+    
+    if ( iMoveIndex != iChannelList->CurrentItemIndex() )
+        {
+        iObserver.UpdateChannelsL( EMoveChannels, 
+                iMoveIndex, 
+                iChannelList->CurrentItemIndex() );
+        }
+    HideIconsL();
+    iChannelList->DrawDeferred();
+    }
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::MoveDoneL
+// ---------------------------------------------------------
+//
+void CFMRadioChannelListContainer::MoveDoneL()
+	{
+	if ( iMoveAction )
+		{
+		iMoveAction = EFalse;
+		}
+	
+    iObserver.UpdateChannelsL( EStoreAllToRepository, 0, 0 );
+	}
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::MoveCanceledL
+// ---------------------------------------------------------
+//
+TBool CFMRadioChannelListContainer::MoveCanceledL()
+	{
+	TBool wasmove = EFalse;
+	
+	if ( iMoveAction )
+		{
+		iMoveAction = EFalse;
+		
+		TInt index = iChannelList->CurrentItemIndex();
+		
+		HBufC* channelItem = HBufC::NewLC( KLengthOfChannelItemString );
+		channelItem->Des().Copy( iChannelItemArray->MdcaPoint( index ) );
+		TPtr ptr( channelItem->Des() );	
+		
+		TBuf<KLengthOfChannelItemIconIndexString> textChIconIndex;
+		TPtrC iconIndexPtr( textChIconIndex );
+	  	TInt err = TextUtils::ColumnText( iconIndexPtr, 3, &ptr );
+		iChannelItemArray->Delete( index );
+	    iChannelList->HandleItemRemovalL();
+	    
+	    iChannelItemArray->InsertL( iMoveIndex, *channelItem );
+	    iChannelList->HandleItemAdditionL();
+	    iChannelList->SetCurrentItemIndex( iMoveIndex );	    
+        CleanupStack::PopAndDestroy( channelItem );
+        
+        iChannelList->ScrollToMakeItemVisible( index );
+        HideIconsL();
+        iChannelList->UpdateScrollBarsL();
+        iChannelList->DrawDeferred();
+        wasmove = ETrue;
+		}
+	
+	return wasmove;
+	}
+
+// ---------------------------------------------------------
+// CFMRadioChannelListContainer::MoveAction()
+// ---------------------------------------------------------
+//
+TBool CFMRadioChannelListContainer::MoveAction()
+	{
+	return iMoveAction;
+	
+	}
+
+// End of File