--- 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 <AknIconArray.h>
#include <avkon.mbg>
#include <gulicon.h>
+#include <aknmarkingmodeobserver.h>
#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<CAknAppUi*>(
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
{