diff -r b01126ce0bec -r ba63c83f4716 idlehomescreen/examples/carouselwidgetexample/renderer/src/carouselwidget.cpp --- a/idlehomescreen/examples/carouselwidgetexample/renderer/src/carouselwidget.cpp Wed Sep 15 12:00:00 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,443 +0,0 @@ -/* - * Copyright (c) 2010 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: Carousel widget for Symbian Homescreen - * - */ - -#include -#include -#include -#include -#include -#include -#include "carouselwidget.h" - -const TSize KIconSize(70,70); -const TInt KItemPadding( 6 ); - -_LIT( KLaunchByIndex, "LaunchByIndex("); - -template< class PtrT > inline PtrT* UnpackPtr( - const TDesC8& aBuf ) - { - TAny* result( NULL ); - - if ( aBuf.Size() == sizeof( TAny* ) ) - { - // Effectively writes aBuf contents to result - TPckg< TAny* >( result ).Copy( aBuf ); - } - - return static_cast< PtrT* >( result ); - } -// ============================ MEMBER FUNCTIONS =============================== -CCarouselItem::CCarouselItem( CFbsBitmap* aBitmap, CFbsBitmap* aMask) - :iBitmap( aBitmap ), iMask( aMask ) - { - } - -CCarouselItem::~CCarouselItem() - { - delete iBitmap; - delete iMask; - delete iText; - } - -void CCarouselItem::SetTextL( const TDesC& aText ) - { - delete iText; - iText = NULL; - iText = aText.AllocL(); - } - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// Symbian static 1st phase constructor -// ----------------------------------------------------------------------------- -// -CCarouselWidget* CCarouselWidget::NewL() - { - CCarouselWidget* self = new( ELeave ) CCarouselWidget(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// ----------------------------------------------------------------------------- -// C++ destructor -// ----------------------------------------------------------------------------- -// -CCarouselWidget::~CCarouselWidget() - { - delete iPhysics; - iStripeItems.ResetAndDestroy(); - //delete iCover; - } - -// ----------------------------------------------------------------------------- -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::ConstructL() - { - - } - -// ----------------------------------------------------------------------------- -// Handles key events. -// ----------------------------------------------------------------------------- -// -TKeyResponse CCarouselWidget::OfferKeyEventL( const TKeyEvent& /*aKeyEvent*/, - TEventCode /*aType*/ ) - { - return EKeyWasConsumed; - } - -// ----------------------------------------------------------------------------- -// Set window for this control -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::SetContainerWindowL( const CCoeControl &aContainer ) - { - CCoeControl::SetContainerWindowL( aContainer ); - } - -// ----------------------------------------------------------------------------- -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::HandlePointerEventL( const TPointerEvent& aPointerEvent ) - { - if( !iPhysics ) - { - return; - } - TPoint stylusPos( aPointerEvent.iPosition ); - switch( aPointerEvent.iType ) - { - case TPointerEvent::EButton1Down: - { - iPhysics->StopPhysics(); - iPhysics->ResetFriction(); - iStartPosition = stylusPos; - iStartTime.HomeTime(); - iStylusPosition = stylusPos; - iDrawHighlight = ETrue; - } - break; - - case TPointerEvent::EButton1Up: - { - iDrawHighlight = EFalse; - TInt distance = iStartPosition.iX - stylusPos.iX; - if( Abs(distance) <= iPhysics->DragThreshold() ) - { - LaunchItemL( stylusPos ); - } - else - { - TPoint drag( distance, 0 ); - iPhysics->StartPhysics( drag, iStartTime ); - } } - break; - case TPointerEvent::EDrag: - case TPointerEvent::EMove: - { - TPoint dragTh( iStartPosition - stylusPos ); - if( Abs(dragTh.iX) > iPhysics->DragThreshold() || - Abs(dragTh.iY) > iPhysics->DragThreshold()) - { - iDrawHighlight = EFalse; - } - TInt deltaX( iStylusPosition.iX - stylusPos.iX ); - iStylusPosition = stylusPos; - TPoint deltaPoint( deltaX, 0 ); - iPhysics->RegisterPanningPosition( deltaPoint ); - } - break; - default: - break; - } - - CCoeControl::HandlePointerEventL( aPointerEvent ); - } - -// ----------------------------------------------------------------------------- -// Returns the number of component controls -// ----------------------------------------------------------------------------- -// -TInt CCarouselWidget::CountComponentControls() const - { - return 0; - } - -// ----------------------------------------------------------------------------- -// Returns the specified control -// ----------------------------------------------------------------------------- -// -CCoeControl* CCarouselWidget::ComponentControl( TInt /*aIndex*/ ) const - { - return NULL; - } - -// ----------------------------------------------------------------------------- -// Skin change notification. -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::SkinChanged() - { - } - -// ----------------------------------------------------------------------------- -// CCarouselWidget::EnterPowerSaveModeL -// -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::EnterPowerSaveModeL() - { - } - -// ----------------------------------------------------------------------------- -// CCarouselWidget::ExitPowerSaveModeL -// -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::ExitPowerSaveModeL() - { - } - -// ----------------------------------------------------------------------------- -// Called if focus changes -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::FocusChanged( TDrawNow /*aDrawNow*/ ) - { - } - -// ----------------------------------------------------------------------------- -// Called if position or size changes -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::SizeChanged() - { - iViewPort = Rect(); - TRAP_IGNORE( InitPhysicEngineL() ); - DrawNow(); - } - -// ----------------------------------------------------------------------------- -// Sets the external event handler interface. -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::SetEventHandler( MXnExtEventHandler* aEventHandler ) - { - iEventHandler = aEventHandler; - } - -// ----------------------------------------------------------------------------- -// Data stream from the publisher -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::SetDataL( const TDesC8& aData, const TDesC& aType, TInt aIndex ) - { - /// Unpack the data stream, works because publisher is in same process. - CGulIcon* icon( UnpackPtr( aData ) ); - CleanupStack::PushL( icon ); - AknIconUtils::SetSize( icon->Bitmap(), KIconSize); - - CCarouselItem* item = new ( ELeave ) CCarouselItem(/* *iEditor,*/ icon->Bitmap(), icon->Mask() ); - CleanupStack::PopAndDestroy( icon ); - - if( aType == _L("Appstripe/widget")) - { - if( iStripeItems.Count() <= aIndex ) - { - iStripeItems.AppendL( item ); - InitPhysicEngineL(); - } - else - { - CCarouselItem* citem = iStripeItems[ aIndex ]; - delete citem; - iStripeItems.Remove( aIndex ); - iStripeItems.Insert( item, aIndex ); - } - DrawNow(); - } - } - -// ----------------------------------------------------------------------------- -// Draws the carousel component -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::Draw( const TRect& /*aRect*/ ) const - { - CWindowGc& gc( SystemGc() ); - gc.SetClippingRect( iViewPort ); - TRect bitmapRect( TPoint(0,0), KIconSize ); - TPoint point( iViewPort.iTl ); - point.iX -= iViewPosition.iX; - - TInt count = iStripeItems.Count(); - for( TInt i = 0; i < count; i++ ) - { - CFbsBitmap* bitmap = iStripeItems[i]->iBitmap; - CFbsBitmap* mask = iStripeItems[i]->iMask; - - TRect drawRect( point, KIconSize ); - if( iDrawHighlight && drawRect.Contains( iStylusPosition )) - { - TRect innerRect( drawRect ); - innerRect.Shrink( 5, 5 ); - - MAknsSkinInstance* skin( AknsUtils::SkinInstance() ); - AknsDrawUtils::DrawFrame( skin, gc, drawRect, innerRect, - KAknsIIDQsnFrHomePressed, KAknsIIDDefault ); - } - if( iViewPort.Contains( drawRect.iBr )|| - iViewPort.Contains( drawRect.iTl )) - { - gc.BitBltMasked( point, bitmap, bitmapRect, mask, EFalse); - } - point.iX += KIconSize.iWidth + KItemPadding; - } - } - -// --------------------------------------------------------------------------- -// ViewPositionChanged -// --------------------------------------------------------------------------- -// -void CCarouselWidget::ViewPositionChanged( - const TPoint& aNewPosition, TBool aDrawNow, TUint /*aFlags*/ ) - { - iCurrentPosition = aNewPosition; - iViewPosition.iX = aNewPosition.iX - iViewPort.Width()/2; - if( aDrawNow ) - { - DrawNow( iViewPort ); - } - } - -// --------------------------------------------------------------------------- -// PhysicEmulationEnded -// --------------------------------------------------------------------------- -// -void CCarouselWidget::PhysicEmulationEnded() - { - } - -// --------------------------------------------------------------------------- -// ViewPosition -// --------------------------------------------------------------------------- -// -TPoint CCarouselWidget::ViewPosition() const - { - return iCurrentPosition; - } - -// --------------------------------------------------------------------------- -// InitPhysicEngineL -// --------------------------------------------------------------------------- -// -void CCarouselWidget::InitPhysicEngineL() - { - // Init physic engine - if ( !iPhysics && CAknPhysics::FeatureEnabled() ) - { - iPhysics = CAknPhysics::NewL( *this, this ); - } - if( !iPhysics ) - { - return; - } - TSize viewPortSize = iViewPort.Size(); - TInt totalWidth( iStripeItems.Count() * (KIconSize.iWidth + KItemPadding )); - TSize totalSize( totalWidth, viewPortSize.iHeight ); - iPhysics->InitPhysicsL( totalSize, viewPortSize, ETrue ); - iCurrentPosition = TPoint( viewPortSize.iWidth / 2, viewPortSize.iHeight / 2 ); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -TInt CCarouselWidget::ItemIndex( TPoint& aPoint ) - { - TPoint itemStartPoint( iViewPort.iTl ); - itemStartPoint.iX -= iViewPosition.iX; - - TRect dropRect( itemStartPoint, KIconSize ); - dropRect.Resize( KItemPadding, 0 ); - TInt index( 0 ); - do - { - if( dropRect.Contains( aPoint )) - { - return index; - } - dropRect.Move( KIconSize.iWidth+KItemPadding, 0); - index++; - } - while( index < iStripeItems.Count() ); - return KErrNotFound; - } - -// ----------------------------------------------------------------------------- -// Launches the item, which is in aPosition -// ----------------------------------------------------------------------------- -// -void CCarouselWidget::LaunchItemL( TPoint& aPosition ) - { - TInt index = ItemIndex( aPosition ); - // carousel plugin expects indexes to start from 1 - index++; - TInt len( KLaunchByIndex().Length()+3 ); - TBuf<17> event; - event.Append( KLaunchByIndex ); - event.AppendNum( index ); - event.Append( _L(")")); - iEventHandler->HandleEventL( event, _L8("Appstripe")); - } - -// ----------------------------------------------------------------------------- -// C++ default constructor -// ----------------------------------------------------------------------------- -// -CCarouselWidget::CCarouselWidget() - { - } - -// ============================ PUBLIC FUNCTIONS =============================== -const TImplementationProxy KImplementationTable[] = - { -#ifdef __EABI__ - IMPLEMENTATION_PROXY_ENTRY( 0xEabba433, CCarouselWidget::NewL ) -#else - { { 0xEabba433 }, CCarouselWidget::NewL } -#endif - }; - -// ----------------------------------------------------------------------------- -// Returns the list of implementations provided by the plugin -// ----------------------------------------------------------------------------- -// -EXPORT_C const TImplementationProxy* ImplementationGroupProxy( - TInt& aTableCount ) - { - aTableCount = sizeof( KImplementationTable ) / sizeof( TImplementationProxy ); - return KImplementationTable; - } -