diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/aknhlist/src/akntreelistviewitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/aknhlist/src/akntreelistviewitem.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,318 @@ +/* +* Copyright (c) 2006-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: Implementation for TAknTreeListViewItem class. +* +*/ + + +#include +#include +#include +#include +#include + +#include "akntreelistview.h" +#include "akntreelistviewitem.h" +#include "akntree.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Default C++ constructor. +// --------------------------------------------------------------------------- +// +TAknTreeListViewItem::TAknTreeListViewItem() + : iItem( NULL ), + iRect(), + iLineSegmentRect() + { + } + + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +TAknTreeListViewItem::TAknTreeListViewItem( CAknTreeItem* aItem, + const TRect& aRect ) + : iItem( aItem ), + iRect( aRect ), + iLineSegmentRect() + { + // Call this to calculate also the line segment rectangle. + SetRect( aRect ); + } + + +// --------------------------------------------------------------------------- +// Copy constructor. +// --------------------------------------------------------------------------- +// +TAknTreeListViewItem::TAknTreeListViewItem( const TAknTreeListViewItem& aItem ) + : iItem( aItem.iItem ), + iRect( aItem.iRect ), + iLineSegmentRect( aItem.iLineSegmentRect ) + { + } + + +// --------------------------------------------------------------------------- +// Returns the tree item contained in view item. +// --------------------------------------------------------------------------- +// +CAknTreeItem* TAknTreeListViewItem::Item() const + { + return iItem; + } + + +// --------------------------------------------------------------------------- +// Sets the tree item the view item is representing. +// --------------------------------------------------------------------------- +// +void TAknTreeListViewItem::SetItem( CAknTreeItem* aItem ) + { + iItem = aItem; + } + + +// --------------------------------------------------------------------------- +// Returns the view item rectangle. +// --------------------------------------------------------------------------- +// +TRect TAknTreeListViewItem::Rect() const + { + return iRect; + } + + +// --------------------------------------------------------------------------- +// Sets the view item rectangle. +// --------------------------------------------------------------------------- +// +void TAknTreeListViewItem::SetRect( const TRect& aRect ) + { + iRect = aRect; + + // Get rectangle for structure lines. + TInt lineVariety = 0; // Type. + iLineSegmentRect = CAknTreeListView::RectFromLayout( aRect, + AknLayoutScalable_Avkon::list_single_graphic_hl_pane_g1( lineVariety ) ); + } + + +// --------------------------------------------------------------------------- +// Returns the rectangle reserved for the tree item. +// --------------------------------------------------------------------------- +// +TRect TAknTreeListViewItem::ItemRect( TInt aViewLevel, TBool aIndention, + TInt aIndentionWidth ) const + { + __ASSERT_DEBUG( aViewLevel >= NULL, User::Invariant() ); + + TRect itemRect; + if ( iItem ) + { + TInt itemLevel = aIndention ? iItem->Level() : 1; + TInt indentLevel = ( itemLevel - 1 ) - aViewLevel; + TInt indentWidth = ( aIndentionWidth < 0 ) ? + LineSegmentWidth() : aIndentionWidth; + TInt indent = indentLevel * indentWidth; + + itemRect = TRect( TPoint( iRect.iTl.iX + indent, iRect.iTl.iY ), + TSize( Max( iRect.Width() - indent, iItem->MinimumSize().iWidth ), + iRect.Height() ) ); + + if ( AknLayoutUtils::LayoutMirrored() ) + { + itemRect.Move( ( iRect.iBr.iX - itemRect.iBr.iX ) - indent, 0 ); + } + } + return itemRect; + } + + +// --------------------------------------------------------------------------- +// Returns the rectangle reserved for the tree item highlight. +// --------------------------------------------------------------------------- +// +TRect TAknTreeListViewItem::HighlightRect( TInt aViewLevel, + TBool aIndention, TInt aIndentionWidth ) const + { + TRect highlightRect; + if ( iItem ) + { + TRect itemRect( ItemRect( aViewLevel, aIndention, aIndentionWidth ) ); + + TInt variety = 0; + highlightRect = CAknTreeListView::RectFromLayout( itemRect, + AknLayoutScalable_Avkon::list_highlight_pane_cp34( variety ) ); + } + return highlightRect; + } + + +// --------------------------------------------------------------------------- +// Returns the rectangle for tree structure line segment at given index. +// --------------------------------------------------------------------------- +// +TRect TAknTreeListViewItem::LineSegmentRect( TUint aIndex ) const + { + TRect rect = iLineSegmentRect; + if ( AknLayoutUtils::LayoutMirrored() ) + { + rect.Move( -iLineSegmentRect.Width() * aIndex, 0 ); + } + else + { + rect.Move( iLineSegmentRect.Width() * aIndex, 0 ); + } + return rect; + } + + +// --------------------------------------------------------------------------- +// Returns the width of one tree structure line segment. +// --------------------------------------------------------------------------- +// +TInt TAknTreeListViewItem::LineSegmentWidth() const + { + return iLineSegmentRect.Width(); + } + + +// --------------------------------------------------------------------------- +// Draws the tree structure lines for one list row, highlight, and item. +// --------------------------------------------------------------------------- +// +void TAknTreeListViewItem::Draw( CWindowGc& aGc, CAknTree& aTree, + const TRect& aRect, TBool aFocused, TInt aViewLevel, + TBool aStructureLines, TBool aIndention, TInt aIndentionWidth ) const + { + if ( iItem ) + { + const TRect itemRect = + ItemRect( aViewLevel, aIndention, aIndentionWidth ); + + // Draw the tree structure lines for the item. + TInt itemLevel = aIndention ? iItem->Level() : 1; + TInt indentLevel = ( itemLevel - 1 ) - aViewLevel; + if ( aStructureLines && indentLevel > 0 ) + { + const CAknTreeNode* parent = iItem->Parent(); + + TRect segmentRect = LineSegmentRect( --indentLevel ); + + if ( parent->Index( iItem ) == parent->ChildCount() - 1 ) + { + DrawLineSegment( aGc, aTree, segmentRect, ELineEnd ); + } + else + { + DrawLineSegment( aGc, aTree, segmentRect, ELineBranch ); + } + + while ( indentLevel > 0 ) + { + segmentRect = LineSegmentRect( --indentLevel ); + if ( parent->Parent()->Index( parent ) < + parent->Parent()->ChildCount() - 1 ) + { + DrawLineSegment( aGc, aTree, segmentRect, ELineStraight ); + } + parent = parent->Parent(); + } + } + + TRect intersection = aRect; + intersection.Intersection( itemRect ); + + TRect newRect( itemRect ); + newRect.iBr.iY -= iView->Offset(); + newRect.iTl.iY -= iView->Offset(); + + iItem->Draw( aGc, newRect, intersection, aFocused ); + } + } + + +// --------------------------------------------------------------------------- +// Mediates pointer events to the contained tree item. +// --------------------------------------------------------------------------- +// +void TAknTreeListViewItem::HandlePointerEventL( + const TPointerEvent& aPointerEvent, TInt aViewLevel, TBool aIndention, + TInt aIndentionWidth ) + { + if ( iItem ) + { + TRect itemRect = ItemRect( aViewLevel, aIndention, aIndentionWidth ); + if ( itemRect.Contains( aPointerEvent.iPosition ) ) + { + iItem->HandlePointerEventL( aPointerEvent, itemRect ); + } + } + } + + +// --------------------------------------------------------------------------- +// Draws one segment of tree structure lines. +// --------------------------------------------------------------------------- +// +void TAknTreeListViewItem::DrawLineSegment( CWindowGc& aGc, CAknTree& aTree, + const TRect& aSegmentRect, TLineSegmentType aType ) const + { + TRect newRect( aSegmentRect ); + newRect.iBr.iY -= iView->Offset(); + newRect.iTl.iY -= iView->Offset(); + + switch( aType ) + { + case ELineStraight: + { + aTree.DrawIcon( CAknTree::ELineStraightIndication, + newRect.Size(), aGc, + newRect.iTl, newRect.Size() ); + break; + } + case ELineEnd: + { + aTree.DrawIcon( CAknTree::ELineEndIndication, + newRect.Size(), aGc, + newRect.iTl, newRect.Size() ); + break; + } + case ELineBranch: + { + aTree.DrawIcon( CAknTree::ELineBranchIndication, + newRect.Size(), aGc, + newRect.iTl, newRect.Size() ); + break; + } + default: + break; + } + } + + +// --------------------------------------------------------------------------- +// Sets view +// --------------------------------------------------------------------------- +// +void TAknTreeListViewItem::SetView( CAknTreeListView* aView ) + { + iView = aView; + } +