--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/taskswitcher/taskswitcherui/taskswitcherapp/src/tsfastswapgrid.cpp Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,917 @@
+/*
+* Copyright (c) 2009 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: Taskswitcher Fast Swap area UI
+ *
+*/
+
+
+#include <avkon.mbg>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <AknsFrameBackgroundControlContext.h>
+#include <touchfeedback.h>
+
+#include "tsfastswapgrid.h"
+#include "tsapplogging.h"
+
+ /* ================================================================================
+ * CTsFastSwapGrid
+ * ================================================================================
+ */
+
+const TInt KCloseIconRedrawTime = 300000; // 0.3 second
+
+const TInt KStrokeThickness = 1;
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::CTsFastSwapGrid
+// -----------------------------------------------------------------------------
+//
+CTsFastSwapGrid::CTsFastSwapGrid()
+: CAknGrid(),
+ iCloseIconHitIdx( KErrNotFound ),
+ iBehaviour( ETouchOnly ),
+ iHighlightVisible( EFalse ),
+ iAknEventHandlingEnabled(ETrue)
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::~CTsFastSwapGrid
+// -----------------------------------------------------------------------------
+//
+CTsFastSwapGrid::~CTsFastSwapGrid()
+ {
+ iCloseItems.Close();
+ delete iCloseIconRedrawTimer;
+ }
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::ConstructL( const CCoeControl* aParent )
+ {
+ TSLOG_CONTEXT( CTsFastSwapGrid::ConstructL, TSLOG_LOCAL );
+ TSLOG_IN();
+
+ iParent = aParent;
+ CAknGrid::ConstructL( aParent, EAknListBoxSelectionGrid );
+ SetPrimaryScrollingType(CAknGridView::EScrollFollowsItemsAndLoops);
+ SetSecondaryScrollingType(CAknGridView::EScrollFollowsItemsAndLoops);
+ iCloseIconRedrawTimer = new (ELeave) CTsFastSwapTimer( *this );
+ iCloseIconRedrawTimer->ConstructL();
+
+ TSLOG_OUT();
+ }
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::HandlePointerEventL
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::HandlePointerEventL( const TPointerEvent &aPointerEvent )
+ {
+ TSLOG_CONTEXT( CTsFastSwapGrid::HandlePointerEventL, TSLOG_LOCAL );
+ TSLOG_IN();
+
+ TBool eventHandled( EFalse );
+ if ( aPointerEvent.iType == TPointerEvent::EButton1Up ||
+ aPointerEvent.iType == TPointerEvent::EButton1Down )
+ {
+ // Check if close icon has been hit
+ // Find hit item
+ TInt hitItem( KErrNotFound );
+ for ( TInt i = 0; i < Model()->NumberOfItems(); i++ )
+ {
+ if ( GridView()->XYPosToItemIndex( aPointerEvent.iParentPosition, i ) )
+ {
+ hitItem = i;
+ break;
+ }
+ }
+ if ( hitItem != KErrNotFound && CanCloseItem( hitItem ) )
+ {
+ // Item found, check if close icon has been hit
+ TPoint itemPos = GridView()->ItemPos( hitItem );
+ TSize itemSize = GridView()->ItemSize( hitItem );
+ TRect itemRect( itemPos, itemSize );
+ CTsGridItemDrawer* itemDrawer =
+ static_cast<CTsGridItemDrawer*>( ItemDrawer() );
+ TRect closeIconRect = itemDrawer->GetCloseButtonRect( itemRect );
+ if ( closeIconRect.Contains( aPointerEvent.iParentPosition ) )
+ {
+ // Close icon hit
+ TInt hitDataIdx(hitItem);
+ if ( AknLayoutUtils::LayoutMirrored() )
+ {
+ // Calculate logical item index
+ hitDataIdx = Model()->ItemTextArray()->MdcaCount() - 1 - hitItem;
+ }
+ iCloseIconHitIdx = hitDataIdx;
+ eventHandled = ETrue;
+
+ if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+ {
+ // Update current item and redraw grid
+ SetCurrentItemIndex( hitItem );
+ DrawNow();
+
+ iCloseIconRedrawTimer->Cancel();
+ iCloseIconRedrawTimer->After(KCloseIconRedrawTime);
+ }
+ else
+ {
+ // Pointer up
+ if ( iFastSwapGridObserver )
+ {
+ MTouchFeedback* feedback = MTouchFeedback::Instance();
+ feedback->InstantFeedback(this,
+ ETouchFeedbackBasicButton,
+ ETouchFeedbackVibra,
+ aPointerEvent);
+ }
+ if ( GridBehaviour() == EHybrid )
+ {
+ ShowHighlight();
+ }
+ else
+ {
+ Redraw();
+ }
+ iFastSwapGridObserver->HandleCloseEventL( hitDataIdx );
+ ResetCloseHit();
+ }
+ }
+ }
+ }
+
+ if ( !eventHandled )
+ {
+ CTsGridItemDrawer* itemDrawer =
+ static_cast<CTsGridItemDrawer*>( ItemDrawer() );
+ if( aPointerEvent.iType == TPointerEvent::EButton1Down )
+ {
+ itemDrawer->SetRedrawBackground( ETrue );
+ }
+ else if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+ {
+ itemDrawer->SetRedrawBackground( EFalse );
+ }
+ if ( iAknEventHandlingEnabled )
+ {
+ CAknGrid::HandlePointerEventL( aPointerEvent );
+ }
+ Redraw();
+ }
+
+ TSLOG_OUT();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::HandleDeviceStateChanged
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::HandleDeviceStateChanged( TChangeType aChangeType )
+ {
+ TSLOG_CONTEXT( CTsFastSwapGrid::HandleDeviceStateChanged, TSLOG_LOCAL );
+ TSLOG_IN();
+
+ if ( aChangeType == ESkin )
+ {
+ LoadCloseIconAndStrokeParams();
+ }
+
+ TSLOG_OUT();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::HandleResourceChange
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::HandleResourceChange( TInt aType )
+ {
+ TSLOG_CONTEXT( CTsFastSwapGrid::HandleResourceChange, TSLOG_LOCAL );
+ TSLOG_IN();
+
+ if ( aType != KEikDynamicLayoutVariantSwitch &&
+ Model()->ItemTextArray()->MdcaCount() )
+ {
+ CAknGrid::HandleResourceChange( aType );
+ }
+
+ TSLOG_OUT();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::SizeChanged
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::SizeChanged()
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::Draw
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::Draw( const TRect& aRect ) const
+ {
+ CAknGrid::Draw(aRect);
+ if ( !Model()->ItemTextArray()->MdcaCount() )
+ {
+ GridView()->DrawEmptyList();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::SetFastSwapGridObserver
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::SetFastSwapGridObserver( MTsFastSwapGridObserver* aObserver )
+ {
+ iFastSwapGridObserver = aObserver;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::CreateItemDrawerL
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::CreateItemDrawerL()
+ {
+ TSLOG_CONTEXT( CTsFastSwapGrid::CreateItemDrawerL, TSLOG_LOCAL );
+ TSLOG_IN();
+
+ CFormattedCellGridData* data = CFormattedCellGridData::NewL();
+ CleanupStack::PushL( data );
+ CTsGridItemDrawer* itemDrawer =
+ new ( ELeave ) CTsGridItemDrawer( this, data );
+ iItemDrawer = itemDrawer;
+ CleanupStack::Pop( data );
+
+ TSLOG_OUT();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::UpdateItemDrawerLayoutDataL
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::UpdateItemDrawerLayoutDataL()
+ {
+ CTsGridItemDrawer* itemDrawer =
+ static_cast<CTsGridItemDrawer*>( ItemDrawer() );
+
+ TPixelsAndRotation screenSize;
+ iEikonEnv->ScreenDevice()->GetDefaultScreenSizeAndRotation(screenSize);
+ TRect availableRect = TRect( TPoint(0,0), screenSize.iPixelSize );
+ itemDrawer->SetScreenRect(availableRect);
+
+ TAknLayoutRect fastSwapAreaPane;
+ TInt variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+ fastSwapAreaPane.LayoutRect( availableRect,
+ AknLayoutScalable_Apps::tport_appsw_pane( variety ) );
+ const TInt leftOffset = iParent->Rect().iTl.iX;
+ const TInt rightOffset = availableRect.Width() - iParent->Rect().iBr.iX;
+ SetVisibleViewRect(fastSwapAreaPane.Rect());
+ itemDrawer->SetEdgeOffset( leftOffset, rightOffset );
+
+ LoadCloseIconAndStrokeParams();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::EnableAknEventHandling
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::EnableAknEventHandling( TBool aEnable )
+ {
+ iAknEventHandlingEnabled = aEnable;
+ }
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::TimerCompletedL
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::TimerCompletedL( CTsFastSwapTimer* aSource )
+ {
+ if ( aSource == iCloseIconRedrawTimer )
+ {
+ ResetCloseHit();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::SetCloseItemsL
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::SetCloseItemsL( RArray<TInt>& aItemIndex )
+ {
+ iCloseItems.Close();
+ for ( TInt i = 0; i < aItemIndex.Count(); i++ )
+ {
+ iCloseItems.AppendL( aItemIndex[i] );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::CanCloseItem
+// -----------------------------------------------------------------------------
+//
+TBool CTsFastSwapGrid::CanCloseItem( TInt aItemIndex )
+ {
+ return iCloseItems.Find(aItemIndex) != KErrNotFound;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::ItemCloseHit
+// -----------------------------------------------------------------------------
+//
+TBool CTsFastSwapGrid::IsItemCloseHit( TInt aItemIndex )
+ {
+ return iCloseIconHitIdx == aItemIndex;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::ResetCloseHit
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::ResetCloseHit()
+ {
+ iCloseIconHitIdx = KErrNotFound;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::SetStrokeColor
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::SetStrokeColors( TRgb aColor,
+ TRgb aHighlightedColor )
+ {
+ static_cast<CTsGridItemDrawer*>(iItemDrawer)->SetStrokeColors(aColor, aHighlightedColor);
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::SetStrokeItemsL
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::SetStrokeItemsL( RArray<TInt>& aItemIndex )
+ {
+ static_cast<CTsGridItemDrawer*>(iItemDrawer)->SetStrokeItemsL(aItemIndex);
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::SetBehaviour
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::SetGridBehaviour( TFastSwapGridBehaviour aBehaviour )
+ {
+ iBehaviour = aBehaviour;
+ switch ( iBehaviour )
+ {
+ case ETouchOnly:
+ {
+ HideHighlight();
+ }
+ break;
+ default:
+ {
+ ShowHighlight();
+ }
+ break;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::GridBehaviour
+// -----------------------------------------------------------------------------
+//
+CTsFastSwapGrid::TFastSwapGridBehaviour CTsFastSwapGrid::GridBehaviour()
+ {
+ return iBehaviour;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::ShowHighlight
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::ShowHighlight()
+ {
+ if ( !iHighlightVisible )
+ {
+ // Draw highlight
+ iHighlightVisible = ETrue;
+ Redraw();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::HideHighlight
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::HideHighlight()
+ {
+ if ( iHighlightVisible )
+ {
+ iHighlightVisible = EFalse;
+ Redraw();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::IsHighlightVisible
+// -----------------------------------------------------------------------------
+//
+TBool CTsFastSwapGrid::IsHighlightVisible()
+ {
+ return iHighlightVisible;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::SetVisibleViewRect
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::SetVisibleViewRect( const TRect aRect )
+ {
+ iVisibleViewRect = aRect;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::VisibleViewRect
+// -----------------------------------------------------------------------------
+//
+TRect CTsFastSwapGrid::VisibleViewRect()
+ {
+ TRect retVal;
+ TRect emptyRect = TRect( 0, 0, 0, 0 );
+ if ( iVisibleViewRect == emptyRect )
+ {
+ retVal = Rect();
+ }
+ else
+ {
+ retVal = iVisibleViewRect;
+ }
+ return retVal;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::LoadCloseIconAndStrokeParams
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::LoadCloseIconAndStrokeParams()
+ {
+ // Load and set close icon
+ CFbsBitmap* icon = NULL;
+ CFbsBitmap* iconMask = NULL;
+ CFbsBitmap* iconPressed = NULL;
+ CFbsBitmap* iconPressedMask = NULL;
+
+ TRAP_IGNORE(AknsUtils::CreateIconL( AknsUtils::SkinInstance(),
+ KAknsIIDQgnIndiTsButtonClose,
+ icon,
+ iconMask,
+ KAvkonBitmapFile,
+ EMbmAvkonQgn_indi_button_preview_close,
+ EMbmAvkonQgn_indi_button_preview_close_mask
+ ));
+
+ TRAP_IGNORE(AknsUtils::CreateIconL( AknsUtils::SkinInstance(),
+ KAknsIIDQgnIndiTsButtonClosePressed,
+ iconPressed,
+ iconPressedMask,
+ KAvkonBitmapFile,
+ EMbmAvkonQgn_indi_button_preview_close,
+ EMbmAvkonQgn_indi_button_preview_close_mask
+ ));
+
+ TAknLayoutRect gridAppPane;
+ TAknLayoutRect gridItem;
+ TAknLayoutRect gridImage;
+ TAknLayoutRect gridCloseButton;
+ TAknLayoutRect gridCloseIcon;
+ TInt variety = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0;
+ TRect source = iParent ? iParent->Rect() : Rect();
+ gridAppPane.LayoutRect( source,
+ AknLayoutScalable_Apps::tport_appsw_pane( variety ) );
+ gridItem.LayoutRect( gridAppPane.Rect(),
+ AknLayoutScalable_Apps::cell_tport_appsw_pane( variety, 0, 0 ) );
+ gridImage.LayoutRect( gridItem.Rect(),
+ AknLayoutScalable_Apps::cell_tport_appsw_pane_g1( variety ) );
+ gridCloseButton.LayoutRect( gridItem.Rect(),
+ AknLayoutScalable_Apps::bg_button_pane_cp16( variety, 0, 0 ));
+ gridCloseIcon.LayoutRect( gridItem.Rect(),
+ AknLayoutScalable_Apps::cell_tport_appsw_pane_g3( variety, 0, 0 ));
+
+ // Set icon size
+ AknIconUtils::SetSize( icon, gridCloseIcon.Rect().Size(), EAspectRatioPreserved );
+ AknIconUtils::SetSize( iconPressed, gridCloseIcon.Rect().Size(), EAspectRatioPreserved );
+ CTsGridItemDrawer* itemDrawer =
+ static_cast<CTsGridItemDrawer*>(iItemDrawer);
+
+ // Setup close parameters
+ itemDrawer->SetCloseIcon( icon, iconMask, iconPressed, iconPressedMask );
+ TRect relGridCloseButton = TRect( TPoint( gridCloseButton.Rect().iTl.iX - gridItem.Rect().iTl.iX,
+ gridCloseButton.Rect().iTl.iY - gridItem.Rect().iTl.iY),
+ gridCloseButton.Rect().Size() );
+ TRect relGridCloseIconRect = TRect( TPoint( gridCloseIcon.Rect().iTl.iX - gridItem.Rect().iTl.iX,
+ gridCloseIcon.Rect().iTl.iY - gridItem.Rect().iTl.iY),
+ gridCloseIcon.Rect().Size() );
+ itemDrawer->SetCloseIconRect( relGridCloseButton, relGridCloseIconRect );
+
+ // Setup stroke parameters
+ TPoint strokeOffset;
+ strokeOffset.iX = gridImage.Rect().iTl.iX - gridItem.Rect().iTl.iX - KStrokeThickness;
+ strokeOffset.iY = gridImage.Rect().iTl.iY - gridItem.Rect().iTl.iY - KStrokeThickness;
+ TSize strokeSize = gridImage.Rect().Size();
+ strokeSize.iHeight += KStrokeThickness * 2;
+ strokeSize.iWidth += KStrokeThickness * 2;
+ itemDrawer->SetStrokeOffset( strokeOffset, strokeSize );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsFastSwapGrid::Redraw
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapGrid::Redraw()
+ {
+ DrawDeferred();
+ CCoeControl* ctrlToRedraw = Parent();
+ if ( ctrlToRedraw )
+ {
+ ctrlToRedraw->DrawDeferred();
+ ctrlToRedraw = ctrlToRedraw->Parent();
+ if ( ctrlToRedraw )
+ {
+ ctrlToRedraw->DrawNow();
+ }
+ }
+ }
+
+
+
+
+/* ================================================================================
+ * CTsGridItemDrawer
+ * ================================================================================
+ */
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::CTsGridItemDrawer
+// -----------------------------------------------------------------------------
+//
+CTsGridItemDrawer::CTsGridItemDrawer(
+ CTsFastSwapGrid* aGrid,
+ CFormattedCellListBoxData* aData )
+: CFormattedCellListBoxItemDrawer( aGrid->Model(),
+ NULL,
+ aData ),
+ iGrid( aGrid ),
+ iStrokeColor( KRgbBlack ),
+ iHighlightStrokeColor( KRgbBlack )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::~CTsGridItemDrawer
+// -----------------------------------------------------------------------------
+//
+CTsGridItemDrawer::~CTsGridItemDrawer()
+ {
+ delete iCloseIcon;
+ delete iCloseIconMask;
+ delete iCloseIconPressed;
+ delete iCloseIconPressedMask;
+ iStrokeItems.Close();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::SetCloseIcon
+// -----------------------------------------------------------------------------
+//
+void CTsGridItemDrawer::SetCloseIcon( CFbsBitmap* aBmp, CFbsBitmap* aBmpMask,
+ CFbsBitmap* aBmpPressed, CFbsBitmap* aBmpPressedMask )
+ {
+ delete iCloseIcon;
+ iCloseIcon = aBmp;
+ delete iCloseIconMask;
+ iCloseIconMask = aBmpMask;
+ delete iCloseIconPressed;
+ iCloseIconPressed = aBmpPressed;
+ delete iCloseIconPressedMask;
+ iCloseIconPressedMask = aBmpPressedMask;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::SetCloseIconRect
+// -----------------------------------------------------------------------------
+//
+void CTsGridItemDrawer::SetCloseIconRect( const TRect& aButtonRect, const TRect& aIconRect )
+ {
+ iCloseButtonRect = aButtonRect;
+ iCloseIconRect = aIconRect;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::GetCloseButtonRect
+// -----------------------------------------------------------------------------
+//
+TRect CTsGridItemDrawer::GetCloseButtonRect( const TRect& aItemRect ) const
+ {
+ TRect retVal;
+ retVal = TRect( TPoint(aItemRect.iTl.iX + iCloseButtonRect.iTl.iX,
+ aItemRect.iTl.iY + iCloseButtonRect.iTl.iY),
+ iCloseButtonRect.Size() );
+ return retVal;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::SetEdgeOffset
+// -----------------------------------------------------------------------------
+//
+void CTsGridItemDrawer::SetEdgeOffset( TInt aLeftOffset, TInt aRightOffset )
+ {
+ iLeftOffset = aLeftOffset;
+ iRightOffset = aRightOffset;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::SetRedrawBackground
+// -----------------------------------------------------------------------------
+//
+void CTsGridItemDrawer::SetRedrawBackground( TBool aEnable )
+ {
+ iRedrawBackground = aEnable;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::SetStrokeColor
+// -----------------------------------------------------------------------------
+//
+void CTsGridItemDrawer::SetStrokeColors( TRgb aColor,
+ TRgb aHighlightedColor )
+ {
+ iStrokeColor = aColor;
+ iHighlightStrokeColor = aHighlightedColor;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::SetStrokeItemsL
+// -----------------------------------------------------------------------------
+//
+void CTsGridItemDrawer::SetStrokeItemsL( RArray<TInt>& aItemIndex )
+ {
+ iStrokeItems.Close();
+ for ( TInt i = 0; i < aItemIndex.Count(); i++ )
+ {
+ iStrokeItems.AppendL( aItemIndex[i] );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::SetStrokeOffset
+// -----------------------------------------------------------------------------
+//
+void CTsGridItemDrawer::SetStrokeOffset( TPoint aStrokeOffset, TSize aStrokeSize )
+ {
+ iStrokeRect = TRect( aStrokeOffset, aStrokeSize );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::SetScreenRect
+// -----------------------------------------------------------------------------
+//
+void CTsGridItemDrawer::SetScreenRect( TRect aRect )
+ {
+ iScreenRect = aRect;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::DrawActualItem
+// -----------------------------------------------------------------------------
+//
+ void CTsGridItemDrawer::DrawActualItem( TInt aItemIndex, const TRect& aActualItemRect,
+ TBool aItemIsCurrent, TBool aViewIsEmphasized,
+ TBool aViewIsDimmed, TBool aItemIsSelected ) const
+ {
+ if (IsItemRectVisible(aActualItemRect))
+ {
+ // Calculate offset of the visible rectangle
+ TRect drawRect = aActualItemRect;
+ if ( drawRect.iTl.iX < iLeftOffset )
+ {
+ drawRect.iTl.iX = iLeftOffset;
+ }
+ if ( iScreenRect.Width() - drawRect.iBr.iX < iRightOffset )
+ {
+ drawRect.iBr.iX = iScreenRect.Width() - iRightOffset;
+ }
+ iGc->SetClippingRect(drawRect);
+
+ // Check for item highlight
+ TBool itemIsCurrent = !iGrid->IsHighlightVisible() ? EFalse : aItemIsCurrent;
+
+ // Draw background if necessary
+ if ( iRedrawBackground )
+ {
+ CCoeControl* targetCtrlCtx = iGrid->Parent();
+ if(targetCtrlCtx)
+ {
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ MAknsControlContext* cc = AknsDrawUtils::ControlContext( targetCtrlCtx );
+ AknsDrawUtils::Background( skin,
+ cc,
+ targetCtrlCtx,
+ *iGc,
+ drawRect );
+ }
+ }
+
+ // Draw item
+ CFormattedCellListBoxItemDrawer::DrawActualItem(aItemIndex, aActualItemRect,
+ itemIsCurrent, aViewIsEmphasized, aViewIsDimmed, aItemIsSelected );
+
+ // Draw stroke
+ if ( iStrokeItems.Find( aItemIndex ) != KErrNotFound )
+ {
+ TRect strokeRect = iStrokeRect;
+ strokeRect.Move( aActualItemRect.iTl );
+ if ( itemIsCurrent )
+ {
+ iGc->SetPenColor( iHighlightStrokeColor );
+ }
+ else
+ {
+ iGc->SetPenColor( iStrokeColor );
+ }
+ // Thumbnail stroke
+ iGc->DrawRect( strokeRect );
+ }
+
+ // Draw close button
+ if ( iGrid->CanCloseItem( aItemIndex ) && iCloseIcon && iCloseIconPressed )
+ {
+ TRect closeIconRect = GetCloseButtonRect( aActualItemRect );
+ // Draw frame
+ TRect outerRect = closeIconRect;
+ TRect innerRect = CalculateInnerButtonRect( outerRect );
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ if ( iGrid->IsItemCloseHit( aItemIndex ) )
+ {
+ TRect sourceRect( TPoint(0,0), iCloseIconPressed->SizeInPixels() );
+ iGc->DrawBitmapMasked( innerRect,
+ iCloseIconPressed,
+ sourceRect,
+ iCloseIconPressedMask,
+ ETrue );
+ }
+ else
+ {
+ TRect sourceRect( TPoint(0,0), iCloseIcon->SizeInPixels() );
+ iGc->DrawBitmapMasked( innerRect,
+ iCloseIcon,
+ sourceRect,
+ iCloseIconMask,
+ ETrue );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::DrawActualItem
+// -----------------------------------------------------------------------------
+//
+TBool CTsGridItemDrawer::IsItemRectVisible( const TRect& aItemRect ) const
+ {
+ TBool retVal( EFalse );
+ TRect viewRect = iGrid->VisibleViewRect();
+ if ( viewRect.Intersects( aItemRect ) )
+ {
+ retVal = ETrue;
+ }
+ return retVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::IsRectContained
+// -----------------------------------------------------------------------------
+//
+TBool CTsGridItemDrawer::IsRectContained(
+ const TRect& aRectContained, const TRect& aRectContainig) const
+ {
+ TBool retVal(EFalse);
+ TRect intersectionRect(aRectContainig);
+ intersectionRect.Intersection( aRectContained );
+ if( intersectionRect == aRectContained)
+ {
+ retVal = ETrue;
+ }
+ return retVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CTsGridItemDrawer::CalculateInnerButtonRect
+// -----------------------------------------------------------------------------
+//
+TRect CTsGridItemDrawer::CalculateInnerButtonRect( const TRect& aOuterRect ) const
+ {
+ TRect retVal(aOuterRect);
+ retVal.iTl.iX += iCloseIconRect.iTl.iX - iCloseButtonRect.iTl.iX;
+ retVal.iTl.iY += iCloseIconRect.iTl.iY - iCloseButtonRect.iTl.iY;
+ retVal.iBr.iX -= iCloseButtonRect.iBr.iX - iCloseIconRect.iBr.iX;
+ retVal.iBr.iY -= iCloseButtonRect.iBr.iY - iCloseIconRect.iBr.iY;
+ return retVal;
+ }
+
+
+
+ /* ================================================================================
+ * CTsGridHighlightTimer
+ * ================================================================================
+ */
+
+// -----------------------------------------------------------------------------
+// CTsGridHighlightTimer::CTsGridHighlightTimer
+// -----------------------------------------------------------------------------
+//
+CTsFastSwapTimer::CTsFastSwapTimer( MTsFastSwapTimerObserver& aObserver )
+: CTimer( EPriorityStandard ),
+ iObserver( &aObserver )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridHighlightTimer::CTsGridHighlightTimer
+// -----------------------------------------------------------------------------
+//
+CTsFastSwapTimer::~CTsFastSwapTimer()
+ {
+ Cancel();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridHighlightTimer::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapTimer::ConstructL()
+ {
+ CTimer::ConstructL();
+ CActiveScheduler::Add( this );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CTsGridHighlightTimer::CTsGridHighlightTimer
+// -----------------------------------------------------------------------------
+//
+void CTsFastSwapTimer::RunL()
+ {
+ iObserver->TimerCompletedL(this);
+ }
+
+ // End of file