--- /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