diff -r 5f0182e07bfb -r 5456b4e8b3a8 menufw/menufwui/mmwidgets/src/mmgridview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menufw/menufwui/mmwidgets/src/mmgridview.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,325 @@ +/* +* Copyright (c) 2007 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: +* +*/ + + +#include + +#include "mmgridview.h" +#include "mmgrid.h" +#include "mmlistboxitemdrawer.h" +#ifdef RD_UI_TRANSITION_EFFECTS_LIST +#include +#include +#endif + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMmGridView::CMmGridView() : + iLastCurMove( ECursorFirstItem ), iOldIndex( KErrNotFound ) + { + // No implementation required + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMmGridView::~CMmGridView() + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMmGridView* CMmGridView::NewLC() + { + CMmGridView* self = new (ELeave)CMmGridView(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMmGridView* CMmGridView::NewL() + { + CMmGridView* self = CMmGridView::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmGridView::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TPoint CMmGridView::ItemPos( TInt aItemIndex ) const + { + if ( aItemIndex < 0 ) + { + // let avkon handle the insane cases + return CAknGridView::ItemPos( aItemIndex ); + } + + if ( AknLayoutUtils::LayoutMirrored() ) + { + const TInt colNum = NumberOfColsInView(); + TInt itemCol = aItemIndex % colNum; + TInt mirroredItemCol = colNum - itemCol - 1; + aItemIndex = aItemIndex - itemCol + mirroredItemCol; + } + + // return CAknGridView::ItemPos( aItemIndex ); + return CorrectItemPos( aItemIndex ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TPoint CMmGridView::CorrectItemPos( TInt aItemIndex ) const + { + // it the assertion below fails, review this implementation to make sure that + // primary vertical case is handled correctly + ASSERT( !IsPrimaryVertical() ); + + ASSERT( aItemIndex >= 0 ); + const TInt colNum = NumberOfColsInView(); + TInt itemRow = aItemIndex / colNum; + TInt itemCol = aItemIndex % colNum; + + TInt topItemRow = TopItemIndex() / colNum; +// __ASSERT_DEBUG( TopItemIndex() % colNum == 0, User::Invariant() ); + + // it is safe to assume that size between items is (0, 0) because we + // explicitly set such value in CMmGrid::DoSetupLayoutL + const TSize sizeBetweenItems( 0, 0 ); + + TPoint itemPos( + iViewRect.iTl.iX + itemCol * + ( ColumnWidth() + sizeBetweenItems.iWidth ), + iViewRect.iTl.iY + (itemRow - topItemRow) * + ( iItemHeight + sizeBetweenItems.iHeight ) + iVerticalOffset ); + + return itemPos; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMmGridView::XYPosToItemIndex( TPoint aPosition, TInt& aItemIndex ) const + { + if ( AknLayoutUtils::LayoutMirrored() ) + { + aPosition.iX = iViewRect.Width() - ( aPosition.iX - iViewRect.iTl.iX ); + } + return CAknGridView::XYPosToItemIndex( aPosition, aItemIndex ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CWindowGc* CMmGridView::Gc() + { + return iGc; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmGridView::MoveCursorL( TCursorMovement aCursorMovement, + TSelectionMode aSelectionMode ) + { +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + iLastCurMove = aCursorMovement; + iOldIndex = iCurrentItemIndex; +#endif // RD_UI_TRANSITION_EFFECTS_LIST + + CAknGridView::MoveCursorL( aCursorMovement, aSelectionMode ); + +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + iLastCurMove = ECursorFirstItem; + iOldIndex = KErrNotFound; +#endif // RD_UI_TRANSITION_EFFECTS_LIST + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmGridView::UpdateSelectionL( TSelectionMode aSelectionMode ) + { +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + if ( AknLayoutUtils::LayoutMirrored() ) + { + MAknListBoxTfxInternal* api = CAknListLoader::TfxApiInternal( Gc() ); + TInt row( 0 ); + TInt col( 0 ); + TInt newRow( 0 ); + TInt newCol( 0 ); + LogicalPosFromListBoxIndex( iOldIndex, row, col ); + LogicalPosFromListBoxIndex( iCurrentItemIndex, newRow, newCol ); + if ( api ) + { + if ( iLastCurMove == CAknGridView::ECursorNextColumn ) + { + if ( newCol < col || newRow != row ) + api->SetMoveType( MAknListBoxTfxInternal::EListNoMovement ); + } + else if ( iLastCurMove == CAknGridView::ECursorPreviousColumn ) + { + if ( newCol > col || newRow != row ) + api->SetMoveType( MAknListBoxTfxInternal::EListNoMovement ); + } + } + } +#endif // RD_UI_TRANSITION_EFFECTS_LIST + + CAknGridView::UpdateSelectionL( aSelectionMode ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmGridView::Draw(const TRect* aClipRect) const + { + const_cast( this )->UpdateItemHeightAndWidth(); + DoDraw( aClipRect ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmGridView::DoDraw(const TRect* aClipRect) const + { + CMmListBoxItemDrawer* itemDrawer = static_cast< CMmListBoxItemDrawer*> ( ItemDrawer() ); + TBool drawingInitiated(EFalse); + if ( CAknEnv::Static()->TransparencyEnabled() && + iWin && iWin->GetDrawRect() == TRect::EUninitialized ) + { + TRect a; + if (!aClipRect || *aClipRect == TRect(0,0,0,0) ) + { + a = ViewRect(); + aClipRect = &a; + } + + drawingInitiated=ETrue; + iWin->Invalidate( *aClipRect ); + iWin->BeginRedraw( *aClipRect ); + } + + if ( !itemDrawer->IsEditMode() ) + { + itemDrawer->DrawBackground(ViewRect()); + itemDrawer->SetRedrawItemBackground( EFalse ); + CAknGridView::Draw( aClipRect ); + itemDrawer->SetRedrawItemBackground( ETrue ); + } + else + { + CAknGridView::Draw( aClipRect ); + } + + if ( aClipRect ) + { + TRect rect(*aClipRect); + TInt lastItemInView = (iModel->NumberOfItems() <= BottomItemIndex() ) + ? iModel->NumberOfItems()-1 : BottomItemIndex(); + rect.iTl.iY = ItemPos( lastItemInView ).iY + ItemSize( lastItemInView ).iHeight; +// iGc->SetClippingRect( rect ); +// removed to prevent non-redraw drawing. Was present to prevent out of view drawing when effects are on. +// could be removed because effects were disabled at some point in edit mode to enhance performance. + itemDrawer->DrawFloatingItems( rect ); +// iGc->CancelClippingRect(); + } + +// if (aClipRect) +// { +// const_cast< CMmGridView* >(this)->Gc()->DrawRect(*aClipRect); +// } + + if ( CAknEnv::Static()->TransparencyEnabled() && + iWin && drawingInitiated ) + { + drawingInitiated = EFalse; + iWin->EndRedraw( ); + } + + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CMmGridView::VerticalItemOffset() const + { + return iVerticalOffset; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmGridView::SetItemHeight(TInt aItemHeight) + { + // we need to update the iItemHeight member in grid also (there are two different item height value holders - in grid and here in grid view) + CMmListBoxItemDrawer* itemDrawer = + STATIC_CAST( CMmListBoxItemDrawer*, ItemDrawer() ); + static_cast(itemDrawer->Widget())->SetItemHeight( aItemHeight ); + + CAknGridView::SetItemHeight(aItemHeight); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMmGridView::UpdateItemHeightAndWidth() + { + if ( iModel && iModel->NumberOfItems() ) + { + CMmListBoxItemDrawer* itemDrawer = + STATIC_CAST( CMmListBoxItemDrawer*, ItemDrawer() ); + TSize size = itemDrawer->GetItemSize( 0, EFalse ); + if ( itemDrawer->ItemCellSize() != size ) + { + const_cast( this )->SetItemHeight( size.iHeight ); + const_cast( this )->SetColumnWidth( size.iWidth ); + } + } + } + +//End of file