diff -r 3d340a0166ff -r 941195f2d488 uifw/AvKon/aknhlist/src/akntreelistview.cpp --- a/uifw/AvKon/aknhlist/src/akntreelistview.cpp Tue May 11 16:27:42 2010 +0300 +++ b/uifw/AvKon/aknhlist/src/akntreelistview.cpp Tue May 25 12:58:19 2010 +0300 @@ -29,6 +29,7 @@ #include #include #include +#include #include "akntreelistview.h" #include "akntree.h" #include "akntreelist.h" @@ -52,8 +53,8 @@ // Number of additional items to draw const TInt KAdditionalItems = 2; -// Space for check box in marking mode -const TInt KCheckBoxOffset = 30; +// Number of icons in marking mode icon array +const TInt KMarkingModeIconArraySize = 2; // Tree list view flag definitions. enum TAknTreeListViewFlags @@ -73,7 +74,11 @@ EFlagSaveFocusAfterSorting, EFlagSingleClickEnabled, EFlagHighlightEnabled, // Is highlight drawing enabled - EFlagIgnoreButtonUpEvent // Up event ignored (when styluspopup menu open) + EFlagIsPressedDownState, + EFlagIsDragged, + EFlagScrollPhysicsTop, // Physics view adjusted according to top item + EFlagMirroredLayoutInUse, // Mirrored layout in use + EFlagMarkingMode // Marking mode activated }; @@ -482,7 +487,7 @@ // void CAknTreeListView::SelectItem( CAknTreeItem* aSelectedItem ) { - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { if ( aSelectedItem->IsMarkable() ) { @@ -518,7 +523,14 @@ // void CAknTreeListView::SetPressedDownState( const TBool& aPressedDown ) { - iIsPressedDownState = aPressedDown; + if ( aPressedDown ) + { + iFlags.Set( EFlagIsPressedDownState ); + } + else + { + iFlags.Clear( EFlagIsPressedDownState ); + } } @@ -833,7 +845,14 @@ case KEikDynamicLayoutVariantSwitch: { - iMirroredLayoutInUse = AknLayoutUtils::LayoutMirrored(); + if ( AknLayoutUtils::LayoutMirrored() ) + { + iFlags.Set( EFlagMirroredLayoutInUse ); + } + else + { + iFlags.Clear( EFlagMirroredLayoutInUse ); + } CAknTreeItem* focusedItem( FocusedItem() ); if ( focusedItem ) @@ -852,8 +871,11 @@ { index = iItems.Count() - 1; } - - SetFocusedItem( focusedItem, index, ETrue ); + + if( HighlightEnabled() ) + { + SetFocusedItem( focusedItem, index, ETrue ); + } } else { @@ -891,7 +913,9 @@ case KAknMessageFocusLost: { - if ( HighlightEnabled() ) + if ( SingleClickEnabled() && HighlightEnabled() && + ( iOldWinPos == KErrNotFound || + iOldWinPos == DrawableWindow()->OrdinalPosition() ) ) { EnableHighlight( EFalse ); // Redraw item @@ -918,12 +942,6 @@ // void CAknTreeListView::HandlePointerEventL( const TPointerEvent& aPointerEvent ) { - if ( iFlags.IsSet( EFlagIgnoreButtonUpEvent ) - && aPointerEvent.iType == TPointerEvent::EButton1Up ) - { - return; - } - if ( GrabbingComponent() ) { iPhysicsHandler->ResetEventBlockingStatus(); @@ -932,7 +950,6 @@ { if( aPointerEvent.iType == TPointerEvent::EButton1Down ) { - iFlags.Clear( EFlagIgnoreButtonUpEvent ); iPreviouslyFocusedItem = FocusedItem(); } @@ -980,7 +997,7 @@ } TInt thumbPosition = aScrollBar->ThumbPosition(); - if ( iMirroredLayoutInUse && + if ( iFlags.IsSet( EFlagMirroredLayoutInUse ) && aScrollBar != iScrollbarFrame->VerticalScrollBar() ) { const TEikScrollBarModel* model = aScrollBar->Model(); @@ -1269,13 +1286,13 @@ iStylusDownItemIndex( -1 ), iAnimationIID( KAknsIIDQsnAnimList ), iIndentionWidth( -1 ), - iPhysicsHandler( NULL ), - iScrollPhysicsTop( ETrue ) + iPhysicsHandler( NULL ) #ifdef RD_UI_TRANSITION_EFFECTS_LIST ,iGc(NULL) #endif //RD_UI_TRANSITION_EFFECTS_LIST ,iItemActionMenu( NULL ), - iLongTapDetector( NULL ) + iLongTapDetector( NULL ), + iOldWinPos( KErrNotFound ) { if ( static_cast( iCoeEnv->AppUi() )->IsSingleClickCompatible() ) @@ -1285,6 +1302,7 @@ iFlags.Set( EFlagStructureLines ); iFlags.Set( EFlagIndention ); + iFlags.Set( EFlagScrollPhysicsTop ); } @@ -1322,8 +1340,8 @@ &iItems ); } - iIsPressedDownState = EFalse; - iIsDragged = EFalse; + iFlags.Clear( EFlagIsPressedDownState ); + iFlags.Clear( EFlagIsDragged ); iItemActionMenu = CAknItemActionMenu::RegisterCollectionL( *this, this ); if ( iItemActionMenu ) @@ -1339,8 +1357,14 @@ { EnableHighlight( ETrue ); } - - iMirroredLayoutInUse = AknLayoutUtils::LayoutMirrored(); + if ( AknLayoutUtils::LayoutMirrored() ) + { + iFlags.Set( EFlagMirroredLayoutInUse ); + } + else + { + iFlags.Clear( EFlagMirroredLayoutInUse ); + } LoadMarkingIconsL(); } @@ -1673,7 +1697,7 @@ CAknTreeItem* item = FocusedItem(); if ( item ) { - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { if ( item->IsMarkable() ) { @@ -1694,7 +1718,7 @@ // void CAknTreeListView::HandleRightArrowKeyEvent() { - if ( iMirroredLayoutInUse ) + if ( iFlags.IsSet( EFlagMirroredLayoutInUse ) ) { AscendFocus(); } @@ -1711,7 +1735,7 @@ // void CAknTreeListView::HandleLeftArrowKeyEvent() { - if ( iMirroredLayoutInUse ) + if ( iFlags.IsSet( EFlagMirroredLayoutInUse ) ) { DescendFocus(); } @@ -2025,10 +2049,12 @@ iterator.SetCurrent( first ); iterator.Previous(); } - - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) + { - itemRect.iBr.iX -= KCheckBoxOffset; + itemRect.iBr.iX -= + AknLayoutScalable_Avkon::list_double_graphic_pane_t1( + 0 ).LayoutLine().il; } // Update items and their rectangles. @@ -2090,9 +2116,10 @@ iScrollbarFrame->DrawBackground( EFalse, EFalse ); } + iPhysicsHandler->UpdateScrollIndex( + iFlags.IsSet( EFlagScrollPhysicsTop ) ); + iFlags.Set( EFlagScrollPhysicsTop ); - iPhysicsHandler->UpdateScrollIndex( iScrollPhysicsTop ); - iScrollPhysicsTop = ETrue; // Get values for horizontal scrollbar. TInt hThumbPos = iViewLevel; @@ -2108,8 +2135,8 @@ hThumbSpan = a/b; hScrollSpan = Max( hThumbPos + hThumbSpan, c/b ); } - - if ( iMirroredLayoutInUse ) + if ( iFlags.IsSet( EFlagMirroredLayoutInUse ) ) + { hThumbPos = hScrollSpan - ( hThumbPos + hThumbSpan ); } @@ -2817,6 +2844,9 @@ CWindowGc& gc = SystemGc(); #endif + TInt checkBoxOffset = + AknLayoutScalable_Avkon::list_double_graphic_pane_t1( + 0 ).LayoutLine().il; #ifdef RD_UI_TRANSITION_EFFECTS_LIST MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( &gc ); if ( !empty && transApi ) @@ -2867,28 +2897,22 @@ textColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 ); - - if ( iMarkingMode && iMarkingIconArray && iMarkingIconArray->Count()== 2 ) + if ( iFlags.IsSet( EFlagMarkingMode ) + && iMarkingIconArray + && iMarkingIconArray->Count() == KMarkingModeIconArraySize ) + { // Set sizes for marking icon bitmaps TRect drawRect; - if ( iItems.Count() > 0 ) - { - drawRect = iItems[0].Rect(); - drawRect.iBr.iX += KCheckBoxOffset; - } + drawRect = iItems[0].Rect(); // Rect for the marking icon TRect iconRect = RectFromLayout( drawRect, AknLayoutScalable_Avkon::list_single_graphic_pane_g1( 0 ) ); - iconRect.Move( 0, -offset ); - - gc.SetPenColor( textColor ); - gc.SetPenStyle( CGraphicsContext::ESolidPen ); for ( TInt ii = 0; ii < iMarkingIconArray->Count(); ++ii ) { - CGulIcon* icon = (*iMarkingIconArray)[ii]; + CGulIcon* icon = ( *iMarkingIconArray )[ii]; CFbsBitmap* bitmap = icon->Bitmap(); if ( bitmap ) @@ -2910,9 +2934,9 @@ { TRect drawRect( iItems[ii].Rect() ); - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { - drawRect.iBr.iX += KCheckBoxOffset; + drawRect.iBr.iX += checkBoxOffset; } if ( iItems[ii].Item() ) @@ -2958,14 +2982,17 @@ } #endif - if ( iMarkingMode && iMarkingIconArray && iMarkingIconArray->Count()== 2 ) + if ( iFlags.IsSet( EFlagMarkingMode ) && iMarkingIconArray + && iMarkingIconArray->Count() == + KMarkingModeIconArraySize ) { // Rect for the marking icon TRect iconRect = RectFromLayout( drawRect, AknLayoutScalable_Avkon::list_single_graphic_pane_g1( 0 ) ); iconRect.Move( 0, -offset ); - CGulIcon* icon = (*iMarkingIconArray)[1]; // unchecked + // unchecked icon + CGulIcon* icon = ( *iMarkingIconArray )[1]; TBool marked = ( iItems[ii].Item()->IsMarked() ); if ( marked ) @@ -2989,10 +3016,10 @@ AknListUtils::DrawSeparator( gc, offsetRect, textColor, skin ); } - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { - gc.SetOrigin( TPoint( KCheckBoxOffset, 0 ) ); - drawRect.iBr.iX -= KCheckBoxOffset; + gc.SetOrigin( TPoint( checkBoxOffset, 0 ) ); + drawRect.iBr.iX -= checkBoxOffset; } TBool focused = ( FocusedItem() && @@ -3014,7 +3041,8 @@ tfxHighlightRect.Move( 0, -offset ); #endif //RD_UI_TRANSITION_EFFECTS_LIST - if ( iIsPressedDownState || !DrawAnimation( gc, highlightRect ) ) + if ( iFlags.IsSet( EFlagIsPressedDownState ) + || !DrawAnimation( gc, highlightRect ) ) { #ifdef RD_UI_TRANSITION_EFFECTS_LIST if ( transApi ) @@ -3025,8 +3053,9 @@ transApi->StartDrawing( MAknListBoxTfxInternal::EListHighlight ); } #endif //RD_UI_TRANSITION_EFFECTS_LIST - - DrawHighlight( gc, highlightRect, iIsPressedDownState ); + DrawHighlight( gc, highlightRect, + iFlags.IsSet( EFlagIsPressedDownState ) ); + #ifdef RD_UI_TRANSITION_EFFECTS_LIST if ( transApi ) @@ -3057,7 +3086,7 @@ } #endif //RD_UI_TRANSITION_EFFECTS_LIST - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { TBool marked = iItems[ii].Item()->IsMarked(); if ( marked ) @@ -3089,7 +3118,7 @@ } #endif //RD_UI_TRANSITION_EFFECTS_LIST - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { gc.SetOrigin( TPoint( 0, 0 ) ); } @@ -3183,7 +3212,7 @@ item = iterator.Previous(); } } - iScrollPhysicsTop = EFalse; + iFlags.Clear( EFlagScrollPhysicsTop ); } } @@ -3268,7 +3297,12 @@ { state |= MAknCollection::EStateMultipleSelection; } - + TBool markedItems( EFalse ); + TRAP_IGNORE( markedItems = HasMarkedItemsL() ); + if ( markedItems ) + { + state |= MAknCollection::EStateMarkedItems; + } return state; } @@ -3278,7 +3312,7 @@ // void CAknTreeListView::ItemActionMenuClosed() { - iFlags.Clear( EFlagIgnoreButtonUpEvent ); + iOldWinPos = KErrNotFound; EnableHighlight( EFalse ); DrawDeferred(); } @@ -3305,7 +3339,7 @@ // void CAknTreeListView::SetMultipleMarkingState( TBool aActive ) { - if ( iMarkingMode != aActive ) + if ( iFlags.IsSet( EFlagMarkingMode ) != aActive ) { if ( !aActive ) { @@ -3318,7 +3352,19 @@ } EnableMarking( aActive ); - iMarkingMode = aActive; + if ( aActive ) + { + iFlags.Set( EFlagMarkingMode ); + } + else + { + iFlags.Clear( EFlagMarkingMode ); + } + if ( aActive ) + { + // Expand all items when entering marking mode + iTree.Expand(); + } LayoutView(); DrawDeferred(); @@ -3338,7 +3384,7 @@ { TUint state( 0 ); - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { state |= MAknMarkingCollection::EStateMarkingMode; @@ -3363,7 +3409,8 @@ // void CAknTreeListView::MarkCurrentItemL() { - if ( iMarkingMode && FocusedItem() && FocusedItem()->IsMarkable() ) + if ( iFlags.IsSet( EFlagMarkingMode ) && FocusedItem() && + FocusedItem()->IsMarkable() ) { MarkItem( FocusedItem(), ETrue, ETrue ); } @@ -3376,7 +3423,7 @@ // void CAknTreeListView::MarkAllL() { - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { TAknTreeIterator iterator = iTree.Iterator(); CAknTreeItem* item = NULL; @@ -3400,7 +3447,7 @@ // void CAknTreeListView::UnmarkAll() { - if ( iMarkingMode ) + if ( iFlags.IsSet( EFlagMarkingMode ) ) { TAknTreeIterator iterator = iTree.Iterator(); CAknTreeItem* item = NULL; @@ -3463,8 +3510,9 @@ const TPoint& /*aPenEventLocation*/, const TPoint& aPenEventScreenLocation) { - iFlags.Set( EFlagIgnoreButtonUpEvent ); iItemActionMenu->ShowMenuL( aPenEventScreenLocation, 0 ); + iOldWinPos = DrawableWindow()->OrdinalPosition(); + IgnoreEventsUntilNextPointerUp(); } // --------------------------------------------------------------------------- @@ -3505,11 +3553,7 @@ iList.GetMarkedItemsL( selection ); TInt count( selection.Count() ); CleanupStack::PopAndDestroy( &selection ); - if ( count > 0 ) - { - return ETrue; - } - return EFalse; + return ( count > 0 ); } @@ -3586,7 +3630,8 @@ { if ( !iMarkingIconArray ) { - iMarkingIconArray = new ( ELeave ) CAknIconArray( 2 ); + iMarkingIconArray = new ( ELeave ) + CAknIconArray( KMarkingModeIconArraySize ); } else {