diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/aknhlist/src/aknsinglecolumnstyletreelist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/aknhlist/src/aknsinglecolumnstyletreelist.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,780 @@ +/* +* Copyright (c) 2007-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 CAknSingleColumnStyleTreeList class. +* +*/ + + +#include +#include +#include + +#include // for testability hooks +#include "aknhlistlib.h" +#include "akntree.h" +#include "akntreelistview.h" +#include "akntreelistinternalconstants.h" +#include "aknsinglecolumnstylecoredatarow.h" +#include "aknsinglecolumnstylesimpledatarow.h" +#include "aknsinglecolumnstylesubtitlerow.h" +#include "aknsinglecolumnstyletreelist.h" + + +/** Set of flags that are always set on for hierarchical column list. */ +const TInt KMandatoryListFlags = NULL; + +/** Set of flags that cannot be set for hierarchical column list. */ +const TInt KRestrictedListFlags = NULL; + +/** Set of default flags for hieararchical column list. */ +const TInt KDefaultListFlags = KAknTreeListNoStructureLines; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +EXPORT_C CAknSingleColumnStyleTreeList* CAknSingleColumnStyleTreeList::NewL() + { + CAknSingleColumnStyleTreeList* self + = CAknSingleColumnStyleTreeList::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +EXPORT_C CAknSingleColumnStyleTreeList* CAknSingleColumnStyleTreeList::NewL( + const CCoeControl& aContainer ) + { + CAknSingleColumnStyleTreeList* self + = CAknSingleColumnStyleTreeList::NewLC( aContainer ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +EXPORT_C CAknSingleColumnStyleTreeList* CAknSingleColumnStyleTreeList::NewLC() + { + CAknSingleColumnStyleTreeList* self = + new( ELeave ) CAknSingleColumnStyleTreeList; + CleanupStack::PushL( self ); + self->ConstructL(); + AKNTASHOOK_ADDL( self, "CAknSingleColumnStyleTreeList" ); + return self; + } + + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +EXPORT_C CAknSingleColumnStyleTreeList* CAknSingleColumnStyleTreeList::NewLC( + const CCoeControl& aContainer ) + { + CAknSingleColumnStyleTreeList* self = + new( ELeave ) CAknSingleColumnStyleTreeList; + CleanupStack::PushL( self ); + self->ConstructL( aContainer ); + AKNTASHOOK_ADDL( self, "CAknSingleColumnStyleTreeList" ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CAknSingleColumnStyleTreeList::~CAknSingleColumnStyleTreeList() + { + AKNTASHOOK_REMOVE(); + } + + +// --------------------------------------------------------------------------- +// Creates simple data row instance and adds it to the specified node. +// --------------------------------------------------------------------------- +// +EXPORT_C TAknTreeItemID CAknSingleColumnStyleTreeList::AddSimpleDataRowL( + TAknTreeItemID aParent, const TDesC& aText, TUint32 aFlags, + TBool aDrawNow ) + { + // Get flags relevant to simple data row. + TUint32 flags = NULL; + if ( aFlags & EPersistent ) + { + flags |= CAknTreeLeaf::EPersistent; + } + if ( aFlags & EMarked ) + { + flags |= CAknTreeLeaf::EMarked; + } + if ( aFlags & EMarkingDisabled ) + { + flags |= CAknTreeLeaf::EMarkingDisabled; + } + + CAknSingleColumnStyleSimpleDataRow* row = + CAknSingleColumnStyleSimpleDataRow::NewLC( aText, flags ); + TAknTreeItemID id = Tree().AddItemL( row, aParent, aDrawNow ); + CleanupStack::Pop( row ); + return id; + } + + +// --------------------------------------------------------------------------- +// Creates core data row instance with two text columns and adds it to the +// specified parent node. +// --------------------------------------------------------------------------- +// +EXPORT_C TAknTreeItemID CAknSingleColumnStyleTreeList::AddCoreDataRowL( + TAknTreeItemID aParent, const TDesC& aFirstColumn, + const TDesC& aSecondColumn, TUint32 aFlags, TBool aDrawNow ) + { + // Get flags relevant to core data row. + TUint32 flags = NULL; + if ( aFlags & EPersistent ) + { + flags |= CAknTreeLeaf::EPersistent; + } + if ( aFlags & EMarked ) + { + flags |= CAknTreeLeaf::EMarked; + } + if ( aFlags & EMarkingDisabled ) + { + flags |= CAknTreeLeaf::EMarkingDisabled; + } + if ( aFlags & EEmphasis ) + { + flags |= CAknSingleColumnStyleCoreDataRow::EEmphasis; + } + + CAknSingleColumnStyleCoreDataRow* row = + CAknSingleColumnStyleCoreDataRow::NewLC( aFirstColumn, + aSecondColumn, flags ); + TAknTreeItemID id = Tree().AddItemL( row, aParent, aDrawNow ); + CleanupStack::Pop( row ); + return id; + } + + +// --------------------------------------------------------------------------- +// Creates core data row instance with three text columns and adds it to the +// specified parent node. +// --------------------------------------------------------------------------- +// +EXPORT_C TAknTreeItemID CAknSingleColumnStyleTreeList::AddCoreDataRowL( + TAknTreeItemID aParent, const TDesC& aFirstColumn, + const TDesC& aSecondColumn, const TDesC& aThirdColumn, TUint32 aFlags, + TBool aDrawNow ) + { + // Get flags relevant to core data row. + TUint32 flags = NULL; + if ( aFlags & EPersistent ) + { + flags |= CAknTreeLeaf::EPersistent; + } + if ( aFlags & EMarked ) + { + flags |= CAknTreeLeaf::EMarked; + } + if ( aFlags & EMarkingDisabled ) + { + flags |= CAknTreeLeaf::EMarkingDisabled; + } + if ( aFlags & EEmphasis ) + { + flags |= CAknSingleColumnStyleCoreDataRow::EEmphasis; + } + + CAknSingleColumnStyleCoreDataRow* row = + CAknSingleColumnStyleCoreDataRow::NewLC( aFirstColumn, + aSecondColumn, aThirdColumn, flags ); + TAknTreeItemID id = Tree().AddItemL( row, aParent, aDrawNow ); + CleanupStack::Pop( row ); + return id; + } + + +// --------------------------------------------------------------------------- +// Creates subtitle row instance and adds it to the specified node. +// --------------------------------------------------------------------------- +// +EXPORT_C TAknTreeItemID CAknSingleColumnStyleTreeList::AddSubtitleRowL( + TAknTreeItemID aParent, const TDesC& aText, TUint32 aFlags, + TBool aDrawNow ) + { + // Get flags relevant to subtitle row. + TUint32 flags = NULL; + if ( aFlags & EPersistent ) + { + flags |= CAknTreeNode::EPersistent; + } + if ( aFlags & EMarked ) + { + flags |= CAknTreeNode::EMarked; + } + if ( aFlags & EMarkingDisabled ) + { + flags |= CAknTreeNode::EMarkingDisabled; + } + if ( aFlags & EExpanded ) + { + flags |= CAknTreeNode::EExpanded; + } + if ( aFlags & ENonEmpty ) + { + flags |= CAknTreeNode::ENonEmpty; + } + + CAknSingleColumnStyleSubtitleRow* row = + CAknSingleColumnStyleSubtitleRow::NewLC( aText, flags ); + TAknTreeItemID id = Tree().AddItemL( row, aParent, aDrawNow ); + CleanupStack::Pop( row ); + return id; + } + + +// --------------------------------------------------------------------------- +// Returns the text field of the specified list item. +// --------------------------------------------------------------------------- +// +EXPORT_C const TDesC& CAknSingleColumnStyleTreeList::Text( + TAknTreeItemID aItem ) const + { + return Text( aItem, 0 ); + } + + +// --------------------------------------------------------------------------- +// Returns the specified text column of specified list item. Null descriptor +// is returned if column with non-zero index is requested from simple data +// row or subtitle row. +// --------------------------------------------------------------------------- +// +EXPORT_C const TDesC& CAknSingleColumnStyleTreeList::Text( + TAknTreeItemID aItem, TInt aColumnIndex ) const + { + CAknTreeItem* item = Tree().Item( aItem ); + TInt type = item->Type(); + + if ( type == AknTreeList::KSingleColumnStyleCoreDataRow ) + { + CAknSingleColumnStyleCoreDataRow* coreDataRow = + static_cast( item ); + return coreDataRow->Text( aColumnIndex ); + } + + else if ( type == AknTreeList::KSingleColumnStyleSimpleDataRow && + !aColumnIndex ) + { + CAknSingleColumnStyleSimpleDataRow* simpleDataRow = + static_cast( item ); + return simpleDataRow->Text(); + } + + else if ( type == AknTreeList::KSingleColumnStyleSubtitleRow && + !aColumnIndex ) + { + CAknSingleColumnStyleSubtitleRow* subtitleRow = + static_cast( item ); + return subtitleRow->Text(); + } + + else + { + return KNullDesC; + } + } + + +// --------------------------------------------------------------------------- +// Set text for specified item. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknSingleColumnStyleTreeList::SetTextL( TAknTreeItemID aItem, + const TDesC& aText, TBool aDrawNow ) + { + SetTextL( aItem, aText, 0, aDrawNow ); + } + + +// --------------------------------------------------------------------------- +// Set text for specified column of specified list item. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknSingleColumnStyleTreeList::SetTextL( TAknTreeItemID aItem, + const TDesC& aText, TInt aColumnIndex, TBool aDrawNow ) + { + CAknTreeItem* item = Tree().Item( aItem ); + TInt type = item->Type(); + + if ( type == AknTreeList::KSingleColumnStyleCoreDataRow ) + { + CAknSingleColumnStyleCoreDataRow* coreDataRow = + static_cast( item ); + coreDataRow->SetTextL( aText, aColumnIndex, aDrawNow ); + } + + else if ( type == AknTreeList::KSingleColumnStyleSimpleDataRow ) + { + if ( !aColumnIndex ) + { + CAknSingleColumnStyleSimpleDataRow* simpleDataRow = + static_cast( item ); + simpleDataRow->SetTextL( aText, aDrawNow ); + } + else + { + User::Leave( KErrNotFound ); + } + } + + else if ( type == AknTreeList::KSingleColumnStyleSubtitleRow ) + { + if ( !aColumnIndex ) + { + CAknSingleColumnStyleSubtitleRow* subtitleRow = + static_cast( item ); + subtitleRow->SetTextL( aText, aDrawNow ); + } + else + { + User::Leave( KErrNotFound ); + } + } + + else + { + // Invalid item type. + Panic( EAknHListPanicInvalidItemType ); + } + } + + +// --------------------------------------------------------------------------- +// Checks whether the specified core data row is emphasised. +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CAknSingleColumnStyleTreeList::IsEmphasised( + TAknTreeItemID aItem ) const + { + TBool emphasis = EFalse; + CAknTreeItem* item = Tree().Item( aItem ); + if ( item->Type() == AknTreeList::KSingleColumnStyleCoreDataRow ) + { + CAknSingleColumnStyleCoreDataRow* coreDataRow = + static_cast( item ); + emphasis = coreDataRow->IsEmphasised(); + } + return emphasis; + } + + +// --------------------------------------------------------------------------- +// Set emphasis for core data row. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknSingleColumnStyleTreeList::SetEmphasis( + TAknTreeItemID aItem, TBool aEmphasis, TBool aDrawNow ) + { + CAknTreeItem* item = Tree().Item( aItem ); + if ( item->Type() == AknTreeList::KSingleColumnStyleCoreDataRow ) + { + CAknSingleColumnStyleCoreDataRow* coreDataRow = + static_cast( item ); + coreDataRow->SetEmphasis( aEmphasis, aDrawNow ); + } + else + { + // Invalid item type. Set emphasis supported only for core data rows. + Panic( EAknHListPanicInvalidItemType ); + } + } + + +// --------------------------------------------------------------------------- +// Checks whether the third text column is enabled. +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CAknSingleColumnStyleTreeList::IsThirdColumnEnabled( + TAknTreeItemID aItem ) const + { + TBool thirdColumn = EFalse; + CAknTreeItem* item = Tree().Item( aItem ); + if ( item->Type() == AknTreeList::KSingleColumnStyleCoreDataRow ) + { + CAknSingleColumnStyleCoreDataRow* coreDataRow = + static_cast( item ); + thirdColumn = coreDataRow->IsThirdColumnEnabled(); + } + return thirdColumn; + } + + +// --------------------------------------------------------------------------- +// Enables or disables third text column for specified item. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknSingleColumnStyleTreeList::EnableThirdColumn( + TAknTreeItemID aItem, TBool aEnable, TBool aDrawNow ) + { + CAknTreeItem* item = Tree().Item( aItem ); + if ( item->Type() == AknTreeList::KSingleColumnStyleCoreDataRow ) + { + CAknSingleColumnStyleCoreDataRow* coreDataRow = + static_cast( item ); + coreDataRow->EnableThirdColumn( aEnable, aDrawNow ); + } + else + { + // Invalid item type. + Panic( EAknHListPanicInvalidItemType ); + } + } + + +// --------------------------------------------------------------------------- +// Get icon ID set for specified item. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAknSingleColumnStyleTreeList::Icon( TAknTreeItemID aItem, + TIconType aType ) const + { + CAknTreeItem* item = Tree().Item( aItem ); + if ( item->Type() == AknTreeList::KSingleColumnStyleCoreDataRow ) + { + CAknSingleColumnStyleCoreDataRow::TIconType type; + switch ( aType ) + { + case ELeaf: + type = CAknSingleColumnStyleCoreDataRow::EIcon; + break; + case EHighlightedLeaf: + type = CAknSingleColumnStyleCoreDataRow::EHighlightedIcon; + break; + case EOptionalIcon1: + type = CAknSingleColumnStyleCoreDataRow::EOptIcon1; + break; + case EHighlightedOptionalIcon1: + type = CAknSingleColumnStyleCoreDataRow::EHighlightedOptIcon1; + break; + case EOptionalIcon2: + type = CAknSingleColumnStyleCoreDataRow::EOptIcon2; + break; + case EHighlightedOptionalIcon2: + type = CAknSingleColumnStyleCoreDataRow::EHighlightedOptIcon2; + break; + default: + // Invalid icon type for core data row. + return KErrNotFound; + } + return static_cast( item )-> + Icon( type ); + } + + else if ( item->Type() == AknTreeList::KSingleColumnStyleSimpleDataRow ) + { + CAknSingleColumnStyleSimpleDataRow::TIconType type; + switch ( aType ) + { + case ELeaf: + type = CAknSingleColumnStyleSimpleDataRow::EIcon; + break; + case EHighlightedLeaf: + type = CAknSingleColumnStyleSimpleDataRow::EHighlightedIcon; + break; + case EOptionalIcon1: + type = CAknSingleColumnStyleSimpleDataRow::EOptIcon; + break; + case EHighlightedOptionalIcon1: + type = CAknSingleColumnStyleSimpleDataRow::EHighlightedOptIcon; + break; + default: + // Invalid icon type for simple data row. + return KErrNotFound; + } + return static_cast( item )-> + Icon( type ); + } + + else if ( item->Type() == AknTreeList::KSingleColumnStyleSubtitleRow ) + { + CAknSingleColumnStyleSubtitleRow::TIconType type; + switch ( aType ) + { + case EExpandedNode: + type = CAknSingleColumnStyleSubtitleRow::EExpandedIcon; + break; + case EHighlightedExpandedNode: + type = CAknSingleColumnStyleSubtitleRow::EHighlightedExpandedIcon; + break; + case ECollapsedNode: + type = CAknSingleColumnStyleSubtitleRow::ECollapsedIcon; + break; + case EHighlightedCollapsedNode: + type = CAknSingleColumnStyleSubtitleRow::EHighlightedCollapsedIcon; + break; + case EOptionalIcon1: + type = CAknSingleColumnStyleSubtitleRow::EOptIcon; + break; + case EHighlightedOptionalIcon1: + type = CAknSingleColumnStyleSubtitleRow::EHighlightedOptIcon; + break; + default: + // Invalid icon type for subtitle row. + return KErrNotFound; + } + return static_cast( item )-> + Icon( type ); + } + + else + { + return KErrNotFound; + } + } + + +// --------------------------------------------------------------------------- +// Set icon for specified item. +// --------------------------------------------------------------------------- +// +EXPORT_C void CAknSingleColumnStyleTreeList::SetIcon( + const TAknTreeItemID aItem, const TIconType aType, const TInt aIconId, + const TBool aDrawNow ) + { + CAknTreeItem* item = Tree().Item( aItem ); + if ( item->Type() == AknTreeList::KSingleColumnStyleCoreDataRow ) + { + CAknSingleColumnStyleCoreDataRow::TIconType type + = CAknSingleColumnStyleCoreDataRow::EIcon; + switch ( aType ) + { + case ELeaf: + type = CAknSingleColumnStyleCoreDataRow::EIcon; + break; + case EHighlightedLeaf: + type = CAknSingleColumnStyleCoreDataRow::EHighlightedIcon; + break; + case EOptionalIcon1: + type = CAknSingleColumnStyleCoreDataRow::EOptIcon1; + break; + case EHighlightedOptionalIcon1: + type = CAknSingleColumnStyleCoreDataRow::EHighlightedOptIcon1; + break; + case EOptionalIcon2: + type = CAknSingleColumnStyleCoreDataRow::EOptIcon2; + break; + case EHighlightedOptionalIcon2: + type = CAknSingleColumnStyleCoreDataRow::EHighlightedOptIcon2; + break; + default: + // Invalid icon type for core data row. + Panic( EAknHListPanicInvalidItemType ); + break; + } + static_cast( item )-> + SetIcon( type, aIconId, aDrawNow ); + } + + else if ( item->Type() == AknTreeList::KSingleColumnStyleSimpleDataRow ) + { + CAknSingleColumnStyleSimpleDataRow::TIconType type + = CAknSingleColumnStyleSimpleDataRow::EIcon; + switch ( aType ) + { + case ELeaf: + type = CAknSingleColumnStyleSimpleDataRow::EIcon; + break; + case EHighlightedLeaf: + type = CAknSingleColumnStyleSimpleDataRow::EHighlightedIcon; + break; + case EOptionalIcon1: + type = CAknSingleColumnStyleSimpleDataRow::EOptIcon; + break; + case EHighlightedOptionalIcon1: + type = CAknSingleColumnStyleSimpleDataRow::EHighlightedOptIcon; + break; + default: + // Invalid icon type for simple data row. + Panic( EAknHListPanicInvalidItemType ); + break; + } + static_cast( item )-> + SetIcon( type, aIconId, aDrawNow ); + } + + else if ( item->Type() == AknTreeList::KSingleColumnStyleSubtitleRow ) + { + CAknSingleColumnStyleSubtitleRow::TIconType type + = CAknSingleColumnStyleSubtitleRow::EExpandedIcon; + switch ( aType ) + { + case EExpandedNode: + type = CAknSingleColumnStyleSubtitleRow::EExpandedIcon; + break; + case EHighlightedExpandedNode: + type = CAknSingleColumnStyleSubtitleRow:: + EHighlightedExpandedIcon; + break; + case ECollapsedNode: + type = CAknSingleColumnStyleSubtitleRow::ECollapsedIcon; + break; + case EHighlightedCollapsedNode: + type = CAknSingleColumnStyleSubtitleRow:: + EHighlightedCollapsedIcon; + break; + case EOptionalIcon1: + type = CAknSingleColumnStyleSubtitleRow::EOptIcon; + break; + case EHighlightedOptionalIcon1: + type = CAknSingleColumnStyleSubtitleRow::EHighlightedOptIcon; + break; + default: + // Invalid icon type for subtitle row. + Panic( EAknHListPanicInvalidItemType ); + break; + } + static_cast( item )-> + SetIcon( type, aIconId, aDrawNow ); + } + + else + { + // Invalid item type. + Panic( EAknHListPanicInvalidItemType ); + } + } + + +// --------------------------------------------------------------------------- +// Returns the type of the specified item. +// --------------------------------------------------------------------------- +// +EXPORT_C CAknSingleColumnStyleTreeList::TItemType + CAknSingleColumnStyleTreeList::ItemType( TAknTreeItemID aItem ) const + { + TItemType type = ENone; + if ( aItem != KAknTreeIIDNone ) + { + CAknTreeItem* item = Tree().Item( aItem ); + switch ( item->Type() ) + { + case AknTreeList::KTree: + type = ETreeRoot; + break; + case AknTreeList::KSingleColumnStyleSimpleDataRow: + type = ESimpleDataRow; + break; + case AknTreeList::KSingleColumnStyleCoreDataRow: + type = ECoreDataRow; + break; + case AknTreeList::KSingleColumnStyleSubtitleRow: + type = ESubtitleRow; + break; + default: + break; + } + } + return type; + } + + +// --------------------------------------------------------------------------- +// From class CAknTreeList. +// Sets flags for the list. +// --------------------------------------------------------------------------- +// +void CAknSingleColumnStyleTreeList::SetFlags( TUint32 aFlags ) + { + TUint32 flags = ( aFlags | KMandatoryListFlags ) & ~KRestrictedListFlags; + CAknTreeList::SetFlags( flags ); + } + + +// --------------------------------------------------------------------------- +// From class CAknTreeList. +// Handles resource changes. +// --------------------------------------------------------------------------- +// +void CAknSingleColumnStyleTreeList::HandleResourceChange( TInt aType ) + { + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + UpdateIndention(); + } + CAknTreeList::HandleResourceChange( aType ); + } + + + +// --------------------------------------------------------------------------- +// Default C++ constructor. +// --------------------------------------------------------------------------- +// +CAknSingleColumnStyleTreeList::CAknSingleColumnStyleTreeList() + { + } + + +// --------------------------------------------------------------------------- +// Second phase constructor. +// --------------------------------------------------------------------------- +// +void CAknSingleColumnStyleTreeList::ConstructL() + { + BaseConstructL(); + UpdateIndention(); + + // Set default flags on. + SetFlags( KDefaultListFlags ); + } + +// --------------------------------------------------------------------------- +// Second phase constructor. +// --------------------------------------------------------------------------- +// +void CAknSingleColumnStyleTreeList::ConstructL( const CCoeControl& aContainer ) + { + BaseConstructL( aContainer ); + UpdateIndention(); + + // Sets default flags on. + SetFlags( KDefaultListFlags ); + } + + +// --------------------------------------------------------------------------- +// Updates the width of single indentation step. +// --------------------------------------------------------------------------- +// +void CAknSingleColumnStyleTreeList::UpdateIndention() + { + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( Rect(), + AknLayoutScalable_Avkon::aid_indentation_list_msg().LayoutLine() ); + TInt indentationWidth = layoutRect.Rect().Width(); + View().SetIndentionWidth( indentationWidth ); + }