diff -r 000000000000 -r 8466d47a6819 emailuis/uicomponents/src/fstreevisualizerbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/uicomponents/src/fstreevisualizerbase.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,5277 @@ +/* + * 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 : Freestyle tree list visualizer implementation + * + * + */ + +//////SYSTEM INCLUDES +#include "emailtrace.h" +#include +// removed __FS_ALFRED_SUPPORT flag +//#include +// removed __FS_ALFRED_SUPPORT flag +#include +#include // R_AVKON_EMPTY_POPUP_LIST_TEXT +#include + +//////TOOLKIT INCLUDES +// SF +#include +#include +#include +#include +#include +#include +//layouts +#include +#include +#include +//brushes +#include +#include +#include +#include +#include +#include +#include +//metrics +#include +#include +//visuals +#include +#include +// + + +//////PROJECT INCLUDES +#include "fstreevisualizerbase.h" +#include "fstreeplainrootvisualizer.h" +#include "fstree.h" +#include "fstreeiterator.h" +#include "fsgenericpanic.h" +#include "fsfadeeffect.h" +#include "fstreeplainonelineitemdata.h" +#include "fsslideeffect.h" +#include "fstreeplainonelineitemvisualizer.h" +#include "fstreelist.h" +#include "fstreevisualizerobserver.h" +#include "fscenrepkeys.h" +#include "fswatermark.h" +#include "fslayoutmanager.h" +#include "fsseparatordata.h" +////alf specific +#include "fsalfscrollbarlayout.h" +#include "fsalftextstylemanager.h" +#include "fsinteractioninterval.h" + +#include + +//CONSTANTS +const TInt KDefaultShadowWidth = 4; +const TInt KFSListDefaultSelectorBorderWidth = 0; +const TInt KZero = 0; +_LIT8( KPropertyItemId, "PropItemID" ); + +// check from aknphysicsconstants.h +const TInt KFlickMaxDuration( 500000 ); + +// ======== LOCAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Deletes and sets pointer to NULL. +// --------------------------------------------------------------------------- +template void SafeDelete(T*& aPtr) + { + delete aPtr; + aPtr = NULL; + } + +// ======== MEMBER FUNCTIONS ======== + +// TWorld::TItem + +// --------------------------------------------------------------------------- +// TWorld::TItem::TItem +// --------------------------------------------------------------------------- +TWorld::TItem::TItem(const TFsTreeItemId aId, const TRect& aRect) : + iId(aId) + { + SetRect(aRect); + } + +// --------------------------------------------------------------------------- +// TWorld::TItem::Rect +// --------------------------------------------------------------------------- +TRect TWorld::TItem::Rect() const + { + return TRect(TPoint(0, iY), TPoint(0, iY + iHeight)); + } + +// --------------------------------------------------------------------------- +// TWorld::TItem::SetRect +// --------------------------------------------------------------------------- +void TWorld::TItem::SetRect(const TRect& aRect) + { + iY = aRect.iTl.iY; + iHeight = aRect.Height(); + } + +// --------------------------------------------------------------------------- +// TWorld::TItem::Move +// --------------------------------------------------------------------------- +void TWorld::TItem::Move(TInt aDy) + { + iY += aDy; + } + +// --------------------------------------------------------------------------- +// TWorld::TItem::Top +// --------------------------------------------------------------------------- +TInt TWorld::TItem::Top() const + { + return iY; + } + +// --------------------------------------------------------------------------- +// TWorld::TItem::TopLeft +// --------------------------------------------------------------------------- +TPoint TWorld::TItem::TopLeft() const + { + return TPoint(0, iY); + } + +// --------------------------------------------------------------------------- +// TWorld::TItem::Height +// --------------------------------------------------------------------------- +TInt TWorld::TItem::Height() const + { + return iHeight; + } + +// --------------------------------------------------------------------------- +// TWorld::TItem::Bottom +// --------------------------------------------------------------------------- +TInt TWorld::TItem::Bottom() const + { + return iY + iHeight; + } + +// --------------------------------------------------------------------------- +// TWorld::TItem::Bottom +// --------------------------------------------------------------------------- +TPoint TWorld::TItem::BottomRight() const + { + return TPoint(0, iY + iHeight); + } + +// TWorld + +// --------------------------------------------------------------------------- +// TWorld::TWorld +// --------------------------------------------------------------------------- +TWorld::TWorld() : + iBatchUpdateOngoing(EFalse) + { + } + +// --------------------------------------------------------------------------- +// TWorld::~TWorld +// --------------------------------------------------------------------------- +TWorld::~TWorld() + { + iItems.Reset(); + iObservers.Reset(); + } + +// --------------------------------------------------------------------------- +// TWorld::AddObserverL +// --------------------------------------------------------------------------- +void TWorld::AddObserverL(MObserver& aObserver) + { + iObservers.AppendL(&aObserver); + } + +// --------------------------------------------------------------------------- +// TWorld::RemoveObserver +// --------------------------------------------------------------------------- +void TWorld::RemoveObserver(MObserver& aObserver) + { + const TInt index(iObservers.Find(&aObserver)); + if (index != KErrNotFound) + { + iObservers.Remove(index); + } + } + +// --------------------------------------------------------------------------- +// TWorld::AppendL +// --------------------------------------------------------------------------- +void TWorld::AppendL(const TFsTreeItemId aId, const TSize& aSize) + { + const TInt count(iItems.Count()); + TPoint tl; + if (count > 0) + { + tl.iY = iItems[count - 1].Bottom(); + } + const TRect modifiedRect(TRect(tl, aSize)); + iItems.AppendL(TItem(aId, modifiedRect)); + iHeight += aSize.iHeight; + UpdatedL(); + } + +// --------------------------------------------------------------------------- +// TWorld::InsertL +// --------------------------------------------------------------------------- +void TWorld::InsertL(const TFsTreeItemId aId, const TSize& aSize, + const TInt aSlot) + { + if (aSlot >= iItems.Count()) + { + AppendL(aId, aSize); + } + else + { + const TPoint topLeft(iItems[aSlot].TopLeft()); + iItems.InsertL(TItem(aId, TRect(topLeft, aSize)), aSlot); + MoveBy(aSlot + 1, aSize.iHeight); + iHeight += aSize.iHeight; + UpdatedL(); + } + } + +// --------------------------------------------------------------------------- +// TWorld::RemoveL +// --------------------------------------------------------------------------- +void TWorld::RemoveL(const TFsTreeItemId aId) + { + for (TInt i = iItems.Count() - 1; i >= 0; i--) + { + const TFsTreeItemId itemId(iItems[i].iId); + if (itemId == aId) + { + const TItem item(iItems[i]); + iItems.Remove(i); + const TInt delta(-item.Height()); + MoveBy(i, delta); + iHeight += delta; + UpdatedL(); + break; + } + } + } + +// --------------------------------------------------------------------------- +// TWorld::RemoveAllL +// --------------------------------------------------------------------------- +void TWorld::RemoveAllL() + { + iHeight = 0; + iItems.Reset(); + UpdatedL(); + } + +// --------------------------------------------------------------------------- +// TWorld::Height +// --------------------------------------------------------------------------- +TInt TWorld::Height() const + { + return iHeight; + } + +// --------------------------------------------------------------------------- +// TWorld::ItemCount +// --------------------------------------------------------------------------- +TInt TWorld::ItemCount() const + { + return iItems.Count(); + } + +// --------------------------------------------------------------------------- +// TWorld::Item +// --------------------------------------------------------------------------- +TFsTreeItemId TWorld::Item(TInt aIndex) const + { + return iItems[aIndex].iId; + } + +// --------------------------------------------------------------------------- +// TWorld::IndexOfItem +// --------------------------------------------------------------------------- +TInt TWorld::IndexOfItem(TFsTreeItemId aItem) const + { + for (TInt i = 0; i < iItems.Count(); i++) + { + if (iItems[i].iId == aItem) + { + return i; + } + } + return KErrNotFound; + } + +// --------------------------------------------------------------------------- +// TWorld::MoveBy +// --------------------------------------------------------------------------- +void TWorld::MoveBy(const TInt aSlot, const TInt aDelta) + { + const TInt count(iItems.Count()); + for (TInt i = aSlot; i < count; i++) + { + iItems[i].Move(aDelta); + } + } + +// --------------------------------------------------------------------------- +// TWorld::UpdatedL +// --------------------------------------------------------------------------- +void TWorld::UpdatedL() + { + if (!iBatchUpdateOngoing) + { + for (TInt i = iObservers.Count() - 1; i >= 0; i--) + { + iObservers[i]->WorldUpdatedL(*this); + } + } + } + +// --------------------------------------------------------------------------- +// TWorld::GetItemsL +// Uses binary search. +// --------------------------------------------------------------------------- +void TWorld::GetItemsL(RArray& aItems, TInt aY, TInt aHeight, + TInt& aOffset) + { + // First find first visible item using binary search algorithm + aItems.Reset(); + TInt i(0); + aOffset = 0; + if (aY > Height()) + { + aHeight = -1; + } + else if (aY > 0) + { + TInt top(0); + TInt bottom(iItems.Count() - 1); + while (top <= bottom) + { + TInt middle(top + (bottom - top) / 2); + TInt topCoord(iItems[middle].Top()); + TInt bottomCoord(iItems[middle].Bottom()); + if (aY < topCoord) + { + if (bottom == middle) + { + bottom--; + } + else + { + bottom = middle; + } + } + else if (aY > bottomCoord) + { + if (top == middle) + { + top++; + } + else + { + top = middle; + } + } + else + { + aOffset = aY - topCoord; + aHeight += aOffset; + i = middle; + break; + } + } + } + else + { + aOffset = aY; + aHeight += aY; + } + + // If item was found, collect enough items to fill the view + while (aHeight >= 0 && i < iItems.Count()) + { + aItems.AppendL(iItems[i].iId); + aHeight -= iItems[i++].Height(); + } + } + +// --------------------------------------------------------------------------- +// TWorld::BeginUpdate +// --------------------------------------------------------------------------- +void TWorld::BeginUpdate() + { + iBatchUpdateOngoing = ETrue; + } + +// --------------------------------------------------------------------------- +// TWorld::EndUpdateL +// --------------------------------------------------------------------------- +void TWorld::EndUpdateL() + { + if (iBatchUpdateOngoing) + { + iBatchUpdateOngoing = EFalse; + UpdatedL(); + } + } + +// --------------------------------------------------------------------------- +// TWorld::IsUpdating +// --------------------------------------------------------------------------- +TBool TWorld::IsUpdating() const + { + return iBatchUpdateOngoing; + } + +// --------------------------------------------------------------------------- +// TWorld::Recalculate +// --------------------------------------------------------------------------- +void TWorld::Recalculate(const CFsTree& aTree) + { + TPoint tl; + iHeight = 0; + for (TInt i = 0; i < iItems.Count(); i++) + { + TItem& item(iItems[i]); + MFsTreeItemVisualizer* visualizer(aTree.ItemVisualizer(item.iId)); + TSize size(visualizer->Size()); + item.SetRect(TRect(tl, size)); + tl.iY += size.iHeight; + iHeight += size.iHeight; + } + } + +// --------------------------------------------------------------------------- +// TWorld::GetItemRect +// --------------------------------------------------------------------------- +TInt TWorld::GetItemRect(const TFsTreeItemId aItemId, TRect& aRect) const + { + TInt result(KErrNotFound); + for (TInt i = iItems.Count() - 1; i >= 0; i--) + { + if (iItems[i].iId == aItemId) + { + result = i; + aRect = iItems[i].Rect(); + break; + } + } + return result; + } + +// --------------------------------------------------------------------------- +// TWorld::GetItemRectByIndex +// --------------------------------------------------------------------------- +TInt TWorld::GetItemRectByIndex(const TInt aIndex, TRect& aRect) const + { + TInt result(KErrNotFound); + if (aIndex < iItems.Count() && aIndex >= 0) + { + aRect = iItems[aIndex].Rect(); + result = KErrNone; + } + return result; + } + +// --------------------------------------------------------------------------- +// TWorld::CheckIntegrity +// --------------------------------------------------------------------------- +TBool TWorld::CheckIntegrity() const + { + TBool result(ETrue); + if (iItems.Count() > 1) + { + TRect prev(iItems[0].Rect()); + for (TInt i = 1; i < iItems.Count() - 1; i++) + { + const TRect& curr(iItems[i].Rect()); + if (prev.Intersects(curr)) + { + result = EFalse; + break; + } + prev.iBr.iY += curr.Height(); + } + } + return result; + } + +// TViewPort + +// --------------------------------------------------------------------------- +// TViewPort::TViewPort +// --------------------------------------------------------------------------- +TViewPort::TViewPort(MObserver& aObserver, TWorld& aWorld) : + iObserver(aObserver), iWorld(aWorld) + { + } + +// --------------------------------------------------------------------------- +// TViewPort::SetPositionL +// --------------------------------------------------------------------------- +void TViewPort::SetPositionL(const TPoint& aPosition, TBool aInformUpdate) + { + iPosition = aPosition; + // Do validation! + if (aInformUpdate) + { + UpdatedL(); + } + } + +// --------------------------------------------------------------------------- +// TViewPort::SetCenterPositionL +// --------------------------------------------------------------------------- +void TViewPort::SetCenterPositionL(const TPoint& aPosition, + TBool aInformUpdate) + { + iPosition = TPoint(aPosition.iX - iSize.iWidth / 2, aPosition.iY + - iSize.iHeight / 2); + // Do validation! + if (aInformUpdate) + { + UpdatedL(); + } + } + +// --------------------------------------------------------------------------- +// TViewPort::Position +// --------------------------------------------------------------------------- +const TPoint& TViewPort::Position() const + { + return iPosition; + } + +// --------------------------------------------------------------------------- +// TViewPort::CenterPosition +// --------------------------------------------------------------------------- +TPoint TViewPort::CenterPosition() const + { + TPoint result(iPosition.iX + iSize.iWidth / 2, iPosition.iY + + iSize.iHeight / 2); + return result; + } + +// --------------------------------------------------------------------------- +// TViewPort::SetSizeL +// --------------------------------------------------------------------------- +void TViewPort::SetSizeL(const TSize& aSize) + { + iSize = aSize; + // Do validation! + if (!iWorld.IsUpdating()) + { + UpdatedL(); + } + } + +// --------------------------------------------------------------------------- +// TViewPort::Size +// --------------------------------------------------------------------------- +const TSize& TViewPort::Size() const + { + return iSize; + } + +// --------------------------------------------------------------------------- +// TViewPort::GetVisibleItemsL +// --------------------------------------------------------------------------- +void TViewPort::GetVisibleItemsL(RArray& aItemsToBeRemoved, + RArray& aItemsToBeAdded, TInt& aOffset, + TBool& aFullUpdate) + { + RArray tempItems; + CleanupClosePushL(tempItems); + iWorld.GetItemsL(tempItems, iPosition.iY, iSize.iHeight, aOffset); + iCache.UpdateL(tempItems, aItemsToBeRemoved, aItemsToBeAdded, aFullUpdate); + CleanupStack::PopAndDestroy(); // tempItems + } + +// --------------------------------------------------------------------------- +// TViewPort::IsScrollBarNeeded +// --------------------------------------------------------------------------- +TBool TViewPort::IsScrollBarNeeded() const + { + return iWorld.Height() > iSize.iHeight; + } + +// --------------------------------------------------------------------------- +// TViewPort::UpdatedL +// --------------------------------------------------------------------------- +void TViewPort::UpdatedL() + { + iObserver.ViewPortUpdatedL(*this); + } + +// --------------------------------------------------------------------------- +// TViewPort::WorldUpdatedL +// --------------------------------------------------------------------------- +void TViewPort::WorldUpdatedL(const TWorld& aWorld) + { + // recreate viewable set if needed + if (iPosition.iY > aWorld.Height() || (iPosition.iY + iSize.iHeight + > aWorld.Height() && iSize.iHeight <= aWorld.Height())) + { + iPosition.iY = Max(0, aWorld.Height() - iSize.iHeight); + } + else if (iSize.iHeight > aWorld.Height() && iPosition.iY > 0) + { + iPosition.iY = 0; + } + iObserver.ViewPortUpdatedL(*this); + } + +// --------------------------------------------------------------------------- +// TViewPort::ScrollToItemL +// --------------------------------------------------------------------------- +void TViewPort::ScrollToItemL(const TFsTreeItemId aItemId, + TBool aInformUpdate) + { + TRect itemRect; + if (iWorld.GetItemRect(aItemId, itemRect) != KErrNotFound) + { + SetPositionL(itemRect.iTl, aInformUpdate); + } + } + +// --------------------------------------------------------------------------- +// TViewPort::CenterToItemL +// --------------------------------------------------------------------------- +void TViewPort::CenterToItemL(const TFsTreeItemId aItemId, + TBool aInformUpdate) + { + TRect itemRect; + if (iWorld.GetItemRect(aItemId, itemRect) != KErrNotFound) + { + TInt top(itemRect.iTl.iY); + top -= (iSize.iHeight - itemRect.Height()) / 2; + LimitTop(top); + SetPositionL(TPoint(iPosition.iX, top), aInformUpdate); + } + } + +// --------------------------------------------------------------------------- +// TViewPort::ItemToPositionL +// Tries to scroll view so that given item is in given position aPosition. +// --------------------------------------------------------------------------- +void TViewPort::ItemToPositionL(const TFsTreeItemId aItemId, + const TPoint& aPosition, const TBool aInformUpdate, + const TPositionHint aHint) + { + TRect itemRect; + if (iWorld.GetItemRect(aItemId, itemRect) != KErrNotFound) + { + TInt top(itemRect.iTl.iY); + top -= aPosition.iY; + LimitTop(top); + if (aHint == EPositionAfterExpand) + { + const TInt error( iWorld.GetItemRectByIndex( + iWorld.IndexOfItem(aItemId) + 1, itemRect) ); + if (!error) + { + if (itemRect.iBr.iY - top > iSize.iHeight) + { + top += itemRect.iBr.iY - top - iSize.iHeight; + LimitTop(top); + } + } + } + SetPositionL(TPoint(iPosition.iX, top), aInformUpdate); + } + } + +// --------------------------------------------------------------------------- +// TViewPort::ScrollItemToViewL +// Scrolls item to view. Item is set as top most item, if it is above the current +// display area or bottom most item if it is below the current display area. +// --------------------------------------------------------------------------- +void TViewPort::ScrollItemToViewL(const TFsTreeItemId aItemId, + TBool aInformUpdate) + { + TRect itemRect; + if (iWorld.GetItemRect(aItemId, itemRect) != KErrNotFound) + { + if (itemRect.iTl.iY < iPosition.iY) + { + SetPositionL(itemRect.iTl, aInformUpdate); + } + if (itemRect.iBr.iY > iPosition.iY + iSize.iHeight) + { + SetPositionL( + TPoint(iPosition.iX, itemRect.iBr.iY - iSize.iHeight), + aInformUpdate); + } + } + } + +// --------------------------------------------------------------------------- +// TViewPort::MakeViewFullyOccupiedL +// --------------------------------------------------------------------------- +void TViewPort::MakeViewFullyOccupiedL(TBool aInformUpdate) + { + TInt top(iPosition.iY); + LimitTop(top); + SetPositionL(TPoint(iPosition.iX, top), aInformUpdate); + } + +// --------------------------------------------------------------------------- +// TViewPort::TopItem +// --------------------------------------------------------------------------- +TFsTreeItemId TViewPort::TopItem() const + { + return iCache.TopItem(); + } + +// --------------------------------------------------------------------------- +// TViewPort::ClearCache +// --------------------------------------------------------------------------- +void TViewPort::ClearCache() + { + iCache.Clear(); + } + +// --------------------------------------------------------------------------- +// TViewPort::ItemRect +// --------------------------------------------------------------------------- +TRect TViewPort::ItemRect(const TFsTreeItemId aItemId) const + { + TRect itemRect; + if (!iCache.IsClear() && iCache.ContainsItem(aItemId)) + { + if (iWorld.GetItemRect(aItemId, itemRect) != KErrNotFound) + { + itemRect.Move(0, -iPosition.iY); + } + } + return itemRect; + } + +// --------------------------------------------------------------------------- +// TViewPort::ItemFullyVisible +// --------------------------------------------------------------------------- +TBool TViewPort::ItemFullyVisible(const TFsTreeItemId aItemId) const + { + TBool result(EFalse); + if (!iCache.IsClear() && iCache.ContainsItem(aItemId)) + { + TRect itemRect; + if (iWorld.GetItemRect(aItemId, itemRect) != KErrNotFound) + { + if (itemRect.Height()) + { + const TRect viewRect(iPosition, iSize); + result = viewRect.Contains(itemRect.iTl) + && viewRect.Contains(itemRect.iBr); + } + } + } + return result; + } + +// --------------------------------------------------------------------------- +// TViewPort::ItemRect +// --------------------------------------------------------------------------- +void TViewPort::LimitTop(TInt& aTop) const + { + aTop = Min(iWorld.Height() - iSize.iHeight, aTop); + aTop = Max(0, aTop); + } + +// --------------------------------------------------------------------------- +// TViewPort::TCache::TCache +// --------------------------------------------------------------------------- +TViewPort::TCache::TCache() : + iClear(ETrue) + { + } + +// --------------------------------------------------------------------------- +// TViewPort::TCache::~TCache +// --------------------------------------------------------------------------- +TViewPort::TCache::~TCache() + { + iCachedItems.Reset(); + } + +// --------------------------------------------------------------------------- +// TViewPort::TCache::Clear +// --------------------------------------------------------------------------- +void TViewPort::TCache::Clear() + { + iClear = ETrue; + iCachedItems.Reset(); + } + +// --------------------------------------------------------------------------- +// TViewPort::TCache::IsClear +// --------------------------------------------------------------------------- +TBool TViewPort::TCache::IsClear() const + { + return iClear; + } + +// --------------------------------------------------------------------------- +// TViewPort::TCache::ContainsItem +// --------------------------------------------------------------------------- +TBool TViewPort::TCache::ContainsItem(const TFsTreeItemId aItemId) const + { + return iCachedItems.Find(aItemId) != KErrNotFound; + } + +// --------------------------------------------------------------------------- +// TViewPort::TCache::UpdateL +// --------------------------------------------------------------------------- +void TViewPort::TCache::UpdateL(const RArray& aItems, RArray< + TFsTreeItemId>& aItemsToBeRemoved, + RArray& aItemsToBeAdded, TBool& aFullUpdate) + { + aFullUpdate = iClear; + if (!iClear) + { + // find items in cache, missing in new set => items to be removed + aItemsToBeRemoved.Reset(); + for (TInt i = 0; i < iCachedItems.Count(); i++) + { + if (aItems.Find(iCachedItems[i]) == KErrNotFound) + { + aItemsToBeRemoved.AppendL(iCachedItems[i]); + } + } + + // find items in new set, missing in cache => items to be added + aItemsToBeAdded.Reset(); + for (TInt i = 0; i < aItems.Count(); i++) + { + if (iCachedItems.Find(aItems[i]) == KErrNotFound) + { + aItemsToBeAdded.AppendL(aItems[i]); + } + else + { + aItemsToBeAdded.AppendL(KFsTreeNoneID); + } + } + } + else + { + // find items in new set, missing in cache => items to be added + aItemsToBeAdded.Reset(); + for (TInt i = 0; i < aItems.Count(); i++) + { + aItemsToBeAdded.AppendL(aItems[i]); + } + } + // finally update cache + iCachedItems.Reset(); + for (TInt i = 0; i < aItems.Count(); i++) + { + iCachedItems.AppendL(aItems[i]); + } + iClear = EFalse; + } + +// --------------------------------------------------------------------------- +// TViewPort::TCache::TopItem +// --------------------------------------------------------------------------- +TFsTreeItemId TViewPort::TCache::TopItem() const + { + if (iClear || !iCachedItems.Count()) + { + return KFsTreeNoneID; + } + return iCachedItems[0]; + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +EXPORT_C CFsTreeVisualizerBase* CFsTreeVisualizerBase::NewL( + CAlfControl* aOwnerControl, CAlfLayout& aParent, + const TBool aDirectTouchMode) + { + FUNC_LOG; + CFsTreeVisualizerBase* self = new (ELeave) CFsTreeVisualizerBase( + aOwnerControl, aParent, aDirectTouchMode); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// C++ destructor. +// --------------------------------------------------------------------------- +// +CFsTreeVisualizerBase::~CFsTreeVisualizerBase() + { + FUNC_LOG; + delete iDragHandler; + delete iPhysics; + if (iOwnerControl) + { + iOwnerControl->Env().RemoveActionObserver(this); + } + delete iBorderBrush; + iVisibleItems.Close(); + iVisibleItemsBackground.Close(); + iCustomPageUpKeys.Close(); + iCustomPageDownKeys.Close(); + delete iFadeEffect; + delete iSlideEffect; + delete iWatermark; + delete iTextStyleManager; + delete iIntx; + // Change scrollbar to avkon (to support skinning & touch) + delete iScrollBar; + // + } + +// --------------------------------------------------------------------------- +//Sets data model for the visualizer. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetTreeData(CFsTree& aTreeData) + { + FUNC_LOG; + iTreeData = &aTreeData; + } + +// --------------------------------------------------------------------------- +// Adds custom key which triggers page-up event. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::AddCustomPageUpKey(TInt aKeyCode) + { + FUNC_LOG; + iCustomPageUpKeys.InsertInOrder(aKeyCode); + } + +// --------------------------------------------------------------------------- +// Removes given key code from custom page-up event key codes. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::RemoveCustomPageUpKey(TInt aKeyCode) + { + FUNC_LOG; + TBool keyRemoved = EFalse; + + TInt index = iCustomPageUpKeys.FindInOrder(aKeyCode); + if (index != KErrNotFound) + { + iCustomPageUpKeys.Remove(index); + keyRemoved = ETrue; + } + + return keyRemoved; + } + +// --------------------------------------------------------------------------- +// Checks whether given key is a custom key for page-up event. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsCustomPageUpKey(TInt aKeyCode) + { + FUNC_LOG; + TBool keyExists = EFalse; + TInt index = iCustomPageUpKeys.FindInOrder(aKeyCode); + if (index != KErrNotFound) + { + keyExists = ETrue; + } + return keyExists; + } + +// --------------------------------------------------------------------------- +// Adds custom key which triggers page-down event. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::AddCustomPageDownKey(TInt aKeyCode) + { + FUNC_LOG; + iCustomPageDownKeys.InsertInOrder(aKeyCode); + } + +// --------------------------------------------------------------------------- +// Removes given key code from custom page-down event key codes. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::RemoveCustomPageDownKey(TInt aKeyCode) + { + FUNC_LOG; + TBool keyRemoved = EFalse; + + TInt index = iCustomPageDownKeys.FindInOrder(aKeyCode); + if (index != KErrNotFound) + { + iCustomPageDownKeys.Remove(index); + keyRemoved = ETrue; + } + + return keyRemoved; + } + +// --------------------------------------------------------------------------- +// Checks whether given key is a custom key for page-down event. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsCustomPageDownKey(TInt aKeyCode) + { + FUNC_LOG; + TBool keyExists = EFalse; + TInt index = iCustomPageDownKeys.FindInOrder(aKeyCode); + if (index != KErrNotFound) + { + keyExists = ETrue; + } + return keyExists; + } + +// --------------------------------------------------------------------------- +// Sets icon for a mark sign. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetMarkIcon(CAlfTexture& aMarkIcon) + { + FUNC_LOG; + iMarkIcon = &aMarkIcon; + } + +// --------------------------------------------------------------------------- +// Returns icon used to mark items. +// --------------------------------------------------------------------------- +// +CAlfTexture* CFsTreeVisualizerBase::MarkIcon() + { + FUNC_LOG; + return iMarkIcon; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsMarked(const TFsTreeItemId aItemId) const + { + FUNC_LOG; + MFsTreeItemVisualizer* vis = NULL; + vis = iTreeData->ItemVisualizer(aItemId); + return vis->IsMarked(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::MarkItemL(const TFsTreeItemId aItemId, + TBool aMarked) + { + FUNC_LOG; + MFsTreeItemVisualizer* vis = NULL; + vis = iTreeData->ItemVisualizer(aItemId); + vis->SetMarked(aMarked); + if (iVisibleItems.Find(aItemId) != KErrNotFound) + { + MFsTreeItemData* data = NULL; + data = &(iTreeData->ItemData(aItemId)); + + vis->UpdateL(*data, IsItemFocused(aItemId) && IsFocusShown(), + iTreeData->Level(aItemId), iMarkIcon, iMenuIcon); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::GetMarkedItemsL(RFsTreeItemIdList& aMarkedItems) const + { + FUNC_LOG; + TFsTreeIterator treeIter = iTreeData->Iterator(KFsTreeRootID, + KFsTreeRootID); + TFsTreeItemId itemId; + MFsTreeItemVisualizer* vis = NULL; + while (treeIter.HasNext()) + { + itemId = treeIter.Next(); + vis = iTreeData->ItemVisualizer(itemId); + if (vis->IsMarked()) + { + aMarkedItems.AppendL(itemId); + } + } + } + +// --------------------------------------------------------------------------- +// Function marks/unmarks all items in the list. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::MarkAllItemsL(TBool aMarkAll) + { + FUNC_LOG; + TFsTreeIterator treeIter = iTreeData->Iterator(KFsTreeRootID, + KFsTreeRootID); + TFsTreeItemId itemId; + MFsTreeItemVisualizer* vis = NULL; + while (treeIter.HasNext()) + { + itemId = treeIter.Next(); + vis = iTreeData->ItemVisualizer(itemId); + vis->SetMarked(aMarkAll); + } + RefreshListViewL(); + } + +// --------------------------------------------------------------------------- +// Sets item indentation per hierarchy level. +// --------------------------------------------------------------------------- +void CFsTreeVisualizerBase::SetIndentationL(TInt aIndentation) + { + FUNC_LOG; + iLevelIndentation = aIndentation; + + MFsTreeItemVisualizer* vis = NULL; + TFsTreeItemId itemId = KFsTreeNoneID; + //loop through the list and set items to always-extended state. + TFsTreeIterator iter = iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID); + while (iter.HasNext()) + { + itemId = iter.Next(); + //get item's visualizer + vis = iTreeData->ItemVisualizer(itemId); + //set indentation in pixels + vis->SetIndentation(iLevelIndentation); + } + + //refresh the list view + RefreshListViewL(); + } + +// --------------------------------------------------------------------------- +// Returns indentation per hierarchy level in pixels. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::Indentation() const + { + FUNC_LOG; + return iLevelIndentation; + } + +// --------------------------------------------------------------------------- +// Sets icon for a menu sign. +// --------------------------------------------------------------------------- +void CFsTreeVisualizerBase::SetMenuIcon(CAlfTexture& aMenuIcon) + { + FUNC_LOG; + iMenuIcon = &aMenuIcon; + } + +// --------------------------------------------------------------------------- +// Returns menu icon. +// --------------------------------------------------------------------------- +CAlfTexture* CFsTreeVisualizerBase::MenuIcon() const + { + FUNC_LOG; + return iMenuIcon; + } + +// --------------------------------------------------------------------------- +// Used internally by the list. To make the list focused/not focused use +// CFsTreeList::SetFocusedL() instead. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetFocusedL(const TBool aFocused) + { + FUNC_LOG; + if (iDragHandler && !aFocused) + { + iDragHandler->Reset(); + } + if (iFlags.IsSet(EListFocused) != aFocused) + { + iFlags.Assign(EListFocused, aFocused); + if (iTreeData->Count()) + { + if (iFlags.IsSet(EListFocused)) + { + //list will receive focus + if (iFocusedItem == KFsTreeNoneID) + { + TFsTreeIterator treeIter = iTreeData->Iterator( + KFsTreeRootID, KFsTreeRootID, + KFsTreeIteratorSkipCollapsedFlag + | KFsTreeIteratorSkipHiddenFlag); + + TFsTreeItemId id(KFsTreeNoneID); + MFsTreeItemVisualizer* visualizer(NULL); + id = treeIter.First(); + visualizer = iTreeData->ItemVisualizer(id); + if (visualizer) + { + if (visualizer->IsFocusable()) + { + iFocusedItem = id; + } + } + } + // a workaround to make SetFocusedItemL work with timeout + SetFocusedItemL(iFocusedItem); + MakeSelectorVisibleL(ETrue); + } + else + { + if (iFocusedItem != KFsTreeNoneID) + { + //list will loose focus + MFsTreeItemVisualizer* visualizer = + iTreeData->ItemVisualizer(iFocusedItem); + if (visualizer) + { + TInt index(iListLayout->FindVisual( + &visualizer->Layout())); + if (index != KErrNotFound) + { + MFsTreeItemData* data = &iTreeData->ItemData( + iFocusedItem); + MakeSelectorVisibleL(EFalse); + visualizer->UpdateL(*data, EFalse, + iTreeData->Level(iFocusedItem), + iMarkIcon, iMenuIcon, iCurrentScrollSpeed); + } + } + } + } + iListLayout->UpdateChildrenLayout(); + } + } + } + +// --------------------------------------------------------------------------- +// The function sets some properties of the selector like bitmap, type +// of movement. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetSelectorPropertiesL(CAlfTexture* aTexture, + TFsSelectorMovement aMovementType, TInt aLeftBorderWidth, + TInt aRightBorderWidth, TInt aTopBorderHeight, + TInt aBottomBorderHeight) + { + FUNC_LOG; + iSelectorTexture = aTexture; + iSelectorBrush = NULL; + iSelectorMovementType = aMovementType; + iSelectorOpacity = 1.0; + + iLeftSelectorBorderWidth = aLeftBorderWidth; + iRightSelectorBorderWidth = aRightBorderWidth; + iTopSelectorBorderHeight = aTopBorderHeight; + iBottomSelectorBorderHeight = aBottomBorderHeight; + + DestroySelectorVisualL(); + MakeSelectorVisibleL(ETrue); + } + +// --------------------------------------------------------------------------- +// The function sets some properties of the selector. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetSelectorPropertiesL(CAlfBrush* aSelectorBrush, + TReal32 aOpacity, TFsSelectorMovement aMovementType) + { + FUNC_LOG; + iSelectorTexture = NULL; + iSelectorBrush = aSelectorBrush; + iSelectorMovementType = aMovementType; + //check value, selector cannot be fully transparent ( <= 0.0 ) + if (aOpacity <= 0.0 || aOpacity > 1.0) + { + iSelectorOpacity = 1.0; + } + else + { + iSelectorOpacity = aOpacity; + } + + iLeftSelectorBorderWidth = 0; + iRightSelectorBorderWidth = 0; + iTopSelectorBorderHeight = 0; + iBottomSelectorBorderHeight = 0; + + DestroySelectorVisualL(); + MakeSelectorVisibleL(ETrue); + } + +// --------------------------------------------------------------------------- +// The function returnes selector's properties. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::GetSelectorProperties(CAlfTexture*& aTexture, + TFsSelectorMovement& aMovementType, TInt& aLeftBorderWidth, + TInt& aRightBorderWidth, TInt& aTopBorderHeight, + TInt& aBottomBorderHeight) + { + FUNC_LOG; + aTexture = iSelectorTexture; + aMovementType = iSelectorMovementType; + + aLeftBorderWidth = iLeftSelectorBorderWidth; + aRightBorderWidth = iRightSelectorBorderWidth; + aTopBorderHeight = iTopSelectorBorderHeight; + aBottomBorderHeight = iBottomSelectorBorderHeight; + } + +// --------------------------------------------------------------------------- +// The function sets a text for empty list's view. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetEmptyListTextL(const TDesC& aText) + { + FUNC_LOG; + if (iRootData) + { + iRootData->SetDataL(aText); + } + } + +// --------------------------------------------------------------------------- +// The function returns a text for empty list's view. +// --------------------------------------------------------------------------- +// +TDesC& CFsTreeVisualizerBase::GetEmptyListText() const + { + FUNC_LOG; + return iRootData->Data(); + } + +// --------------------------------------------------------------------------- +// Handles key event forwarded by the controller. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::HandleKeyEventL(const TAlfEvent& aEvent) + { + //ignore KeyUp events + TBool eventHandled = aEvent.Code() == EEventKeyUp; + + if (iTreeData->Count() && (!eventHandled)) + { + TInt nowOffset = iListLayout->ScrollOffset().iY.ValueNow(); + TInt targetOffset = iListLayout->ScrollOffset().iY.Target(); + + if (!(iFlags.IsSet(EIsPageUpDownActive) + && (nowOffset != targetOffset))) + { + iFlags.Clear(EIsPageUpDownActive); + + switch (aEvent.KeyEvent().iScanCode) + { + case EStdKeyUpArrow: + { + if (iFocusedItem != KFsTreeNoneID) + { + SetCurrentScrollSpeed(aEvent.KeyEvent().iRepeats); + MoveSelectionL(EFsTreeVisualizerMoveLineUp); + //iCurrentScrollSpeed = iScrollSpeed; + } + eventHandled = ETrue; + break; + } + case EStdKeyDownArrow: + { + if (iFocusedItem != KFsTreeNoneID) + { + SetCurrentScrollSpeed(aEvent.KeyEvent().iRepeats); + MoveSelectionL(EFsTreeVisualizerMoveLineDown); + //iCurrentScrollSpeed = iScrollSpeed; + } + eventHandled = ETrue; + break; + } + case EStdKeyLeftArrow: + { + if (iVisualizerObserver) + { + // Touch + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeKeyLeftArrow, + iFocusedItem); + // + } + eventHandled = ETrue; + break; + } + case EStdKeyRightArrow: + { + if (iVisualizerObserver) + { + // + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeKeyRightArrow, + iFocusedItem); + // + } + eventHandled = ETrue; + break; + } + case EStdKeyDevice3: + { + if (iTreeData->IsNode(iFocusedItem)) + { + if (iTreeData->NodeVisualizer(iFocusedItem)->IsExpanded()) + { + CollapseNodeL(iFocusedItem); + } + else + { + ExpandNodeL(iFocusedItem); + } + } + else + { + if (iVisualizerObserver) + { + if (iTreeData->ItemVisualizer(iFocusedItem)->Menu()) + { + // Touch + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeItemWithMenuSelected, + iFocusedItem); + } + else + { + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeItemSelected, + iFocusedItem); + // + } + } + } + eventHandled = ETrue; + break; + } + default: + { + // the visualizer ignores all other events + break; + } + } + //page up/down + if (!eventHandled) + { + if (IsCustomPageUpKey(aEvent.KeyEvent().iScanCode)) + { + SetCurrentScrollSpeed(aEvent.KeyEvent().iRepeats); + MoveSelectionL(EFsTreeVisualizerMovePageUp); + iFlags.Set(EIsPageUpDownActive); + eventHandled = ETrue; + //iCurrentScrollSpeed = iScrollSpeed; + } + else if (IsCustomPageDownKey(aEvent.KeyEvent().iScanCode)) + { + SetCurrentScrollSpeed(aEvent.KeyEvent().iRepeats); + MoveSelectionL(EFsTreeVisualizerMovePageDown); + iFlags.Set(EIsPageUpDownActive); + eventHandled = ETrue; + //iCurrentScrollSpeed = iScrollSpeed; + } + } + } + else + { + eventHandled = EFalse; + } + } + else + { + eventHandled = EFalse; + } + + return eventHandled; + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::SetFlipState +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetFlipState( TBool aOpen ) + { + iFlipOpen = aOpen; + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::SetFocusVisibility +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetFocusVisibility( TBool aShow ) + { + if( iFocusVisible != aShow ) + { + iFocusVisible = aShow; + TRAP_IGNORE( + MakeSelectorVisibleL(aShow); + UpdateItemL(iFocusedItem); ); + } + } + +// "Base class modifications for using touch" + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::HandlePointerEventL +// +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::HandlePointerEventL(const TAlfEvent& aEvent) + { + TBool eventHandled(EFalse); + if (iDragHandler && iOwnerControl->ControlGroup()->AcceptInput()) + { + TPointerEvent::TType type = aEvent.PointerEvent().iType; + const TInt id(EventItemId(aEvent)); + INFO_1("visual: $%x", aEvent.Visual()); + if (KErrNotFound != id || type == TPointerEvent::EDrag || + type == TPointerEvent::EButtonRepeat || + type == TPointerEvent::EButton1Up) + { + switch (type) + { + case TPointerEvent::EButton1Down: + { + eventHandled = ETrue; + iTouchPressed = ETrue; + const TPoint& pos(aEvent.PointerEvent().iParentPosition); + INFO_2("EButton1Down (%d, %d)", pos.iX, pos.iY); + if (!iFlags.IsSet(EPhysicsOn)) + { + iPhysics->StopPhysics(); + iPhysics->ResetFriction(); + UpdatePhysicsL(); + } + iDragHandler->PointerDown(aEvent.PointerEvent(), id); + break; + } + case TPointerEvent::EButton1Up: + { + const TPoint& pos(aEvent.PointerEvent().iParentPosition); + if( iTouchPressed ) + { + eventHandled = ETrue; + iTouchPressed = EFalse; + UpdateItemL( iFocusedItem ); + if( !IsFocusShown() ) + { + MakeSelectorVisibleL( EFalse ); + } + INFO_2( "EButton1Up (%d, %d)", pos.iX, pos.iY ); + if( !iDragHandler->IsFlicking() ) + { + iPhysics->StopPhysics(); + } + iDragHandler->PointerUp( aEvent.PointerEvent(), id ); + } + break; + } + case TPointerEvent::EDrag: + { + eventHandled = ETrue; + const TPoint& pos(aEvent.PointerEvent().iPosition); + INFO_2("EDrag (%d, %d)", pos.iX, pos.iY); + if (iDragHandler->IsFlicking() + || iDragHandler->DragDelta(aEvent.PointerEvent()) + >= iPhysics->DragThreshold()) + { + iDragHandler->PointerDrag(aEvent.PointerEvent(), id); + iDragHandler->EnableFlicking(); + } + break; + } + + case TPointerEvent::EButtonRepeat: + { + eventHandled = ETrue; + const TPoint& pos(aEvent.PointerEvent().iParentPosition); + INFO_2("EButtonRepeat (%d, %d)", pos.iX, pos.iY); + iDragHandler->PointerRepeat(aEvent.PointerEvent()); + break; + } + + default: + { + //Unknown event, ignore. + break; + } + } + } + } + return eventHandled; + } +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::EventItemId +// --------------------------------------------------------------------------- +// +TFsTreeItemId CFsTreeVisualizerBase::EventItemId(const TAlfEvent& aEvent) const + { + FUNC_LOG; + if (aEvent.Type() == TPointerEvent::EDrag) + { + return VisualItemId(FindVisualUnderDrag( + aEvent.PointerEvent().iPosition)); + } + else + { + return VisualItemId(aEvent.Visual()); + } + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::FindVisualUnderDrag +// --------------------------------------------------------------------------- +// +const CAlfVisual* CFsTreeVisualizerBase::FindVisualUnderDrag( + const TPoint& aPosition) const + { + FUNC_LOG; + for (TInt i = 0; i < iListLayout->Count(); i++) + { + const TRect displayRect(iListLayout->Visual(i).DisplayRectTarget()); + if (displayRect.Contains(aPosition)) + { + return &iListLayout->Visual(i); + } + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::VisualItemId +// --------------------------------------------------------------------------- +// +TFsTreeItemId CFsTreeVisualizerBase::VisualItemId(const CAlfVisual* aVisual) const + { + FUNC_LOG; + TInt itemId(KErrNotFound); + if (aVisual) + { + aVisual->PropertyFindInteger(KPropertyItemId(), &itemId); + } + return itemId; + } + +// --------------------------------------------------------------------------- +// Sets the specified item as focused. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetFocusedItemL(const TFsTreeItemId aItemId, + TBool /*aCheckFocus*/) + { + FUNC_LOG; + MFsTreeItemVisualizer* visualizer = NULL; + if (aItemId != iFocusedItem) + { + visualizer = iTreeData->ItemVisualizer(iFocusedItem); + if (visualizer) + { + visualizer->UpdateL(iTreeData->ItemData(iFocusedItem), EFalse, + iTreeData->Level(iFocusedItem), iMarkIcon, iMenuIcon, 0); + } + iFocusedItem = aItemId; + } + visualizer = iTreeData->ItemVisualizer(iFocusedItem); + if (visualizer) + { + TBool focused = IsFocusShown(); + visualizer->UpdateL(iTreeData->ItemData(iFocusedItem), focused, + iTreeData->Level(iFocusedItem), iMarkIcon, iMenuIcon, 0); + } + if (iFocusedItem != KFsTreeNoneID) + { + UpdateSelectorVisualL(); + if (!iViewPort.ItemFullyVisible(iFocusedItem)) + { + iViewPort.ScrollItemToViewL(iFocusedItem); + } + } + } + +// --------------------------------------------------------------------------- +// Checks if the specified item is focused. +// --------------------------------------------------------------------------- +// +TFsTreeItemId CFsTreeVisualizerBase::FocusedItem() const + { + FUNC_LOG; + return iFocusedItem; + } + +// --------------------------------------------------------------------------- +// Checks if the specified item is focused. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsFocused(const TFsTreeItemId aItemId) const + { + FUNC_LOG; + return iFocusedItem == aItemId ? ETrue : EFalse; + } + +// --------------------------------------------------------------------------- +// Sets an item as first visible one in the list. +// --------------------------------------------------------------------------- +// +// +void CFsTreeVisualizerBase::SetFirstVisibleItemL(const TFsTreeItemId /*aItemId*/) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// Get an id of the first visible item. +// --------------------------------------------------------------------------- +// +TFsTreeItemId CFsTreeVisualizerBase::FirstVisibleItem() + { + FUNC_LOG; + TFsTreeItemId retId = KFsTreeNoneID; + if (iVisibleItems.Count()) + { + // + // TRAP_IGNORE( ClearVisibleItemsListL(EFalse) ); + // + retId = iVisibleItems[0]; + } + else + { + retId = KFsTreeNoneID; + } + return retId; + } + +// --------------------------------------------------------------------------- +// Gets a pointer to the root's item data object. +// --------------------------------------------------------------------------- +// +MFsTreeItemData* CFsTreeVisualizerBase::RootItemData() + { + FUNC_LOG; + return iRootData; + } + +// --------------------------------------------------------------------------- +// Gets a pointer to the root's item visualizer object. +// --------------------------------------------------------------------------- +// +MFsTreeNodeVisualizer* CFsTreeVisualizerBase::RootNodeVisualizer() + { + FUNC_LOG; + return iRootVisualizer; + } + +// --------------------------------------------------------------------------- +// Displays the list. +// --------------------------------------------------------------------------- +// +// +void CFsTreeVisualizerBase::ShowListL(const TBool aFadeIn, + const TBool aSlideIn) + { + FUNC_LOG; + UpdateViewPortL(); + if (iTreeData->Count() == 0) + { + iRootVisualizer->ShowL(*iRootLayout); + iRootVisualizer->UpdateL(*iRootData, EFalse, 0, iMarkIcon, iMenuIcon); + } + else + { + TBool showFocus = IsFocusShown(); + for (TUint i = 0; i < iVisibleItems.Count(); ++i) + { + TFsTreeItemId itemId(iVisibleItems[i]); + MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer( + itemId); + + TBool itemFocused( EFalse ); + if( showFocus ) + { + itemFocused = IsItemFocused(itemId); + } + visualizer->UpdateL(iTreeData->ItemData(itemId), itemFocused, + iTreeData->Level(itemId), iMarkIcon, iMenuIcon, + 0); + } + } + + TInt fadeInTime(KZero), slideInTime(KZero); + CFsSlideEffect::TSlideEffectDirection slideInDir( + CFsSlideEffect::ESlideNone); + + iVisualizationState = EFsTreeVisible; + + if (aFadeIn) + { + fadeInTime = iFadeInEffectTime; + if (aSlideIn) + { + iVisualizationState = EFsTreeFadingInSlidingIn; + } + else + { + iVisualizationState = EFsTreeFadingIn; + } + } + else + { + fadeInTime = KZero; + } + + if (aSlideIn) + { + slideInTime = iSlideInDuration; + switch (iSlideInDirection) + { + case MFsTreeVisualizer::ESlideFromTop: + { + slideInDir = CFsSlideEffect::ESlideFromTop; + break; + } + case MFsTreeVisualizer::ESlideFromBottom: + { + slideInDir = CFsSlideEffect::ESlideFromBottom; + break; + } + case MFsTreeVisualizer::ESlideFromLeft: + { + slideInDir = CFsSlideEffect::ESlideFromLeft; + break; + } + case MFsTreeVisualizer::ESlideFromRight: + { + slideInDir = CFsSlideEffect::ESlideFromRight; + break; + } + case MFsTreeVisualizer::ESlideNone: + default: + { + slideInDir = CFsSlideEffect::ESlideNone; + break; + } + } + iVisualizationState = EFsTreeFadingInSlidingIn; + } + else + { + slideInTime = KZero; + slideInDir = CFsSlideEffect::ESlideNone; + } + + iFadeEffect->SetTime(fadeInTime); + iSlideEffect->SetTime(slideInTime); + + iFadeEffect->FadeIn(); + iSlideEffect->SlideIn(slideInDir); + + UpdateScrollBarL(); + } +// + +// --------------------------------------------------------------------------- +// The function assures that the list view is correct. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ValidateListLayoutL(TInt /*aTime*/) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// Hides the list. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::HideList(const TBool aFadeOut, + const TBool aSlideOut) + { + FUNC_LOG; + iScrollBar->MakeVisible(EFalse); + if (iDragHandler) + { + iDragHandler->Reset(); + } + + if (aFadeOut) + { + iFadeEffect->SetTime(iFadeOutEffectTime); + iVisualizationState = EFsTreeFadingOut; + iFadeEffect->FadeOut(); + } + + if (aSlideOut) + { + iSlideEffect->SetTime(iSlideOutDuration); + if (iVisualizationState == EFsTreeFadingOut) + { + iVisualizationState = EFsTreeFadingOutSlidingOut; + } + else + { + iVisualizationState = EFsTreeSlidingOut; + } + switch (iSlideOutDirection) + { + case MFsTreeVisualizer::ESlideFromTop: + { + iSlideEffect->SlideOut(CFsSlideEffect::ESlideFromTop); + break; + } + case MFsTreeVisualizer::ESlideFromBottom: + { + iSlideEffect->SlideOut(CFsSlideEffect::ESlideFromBottom); + break; + } + case MFsTreeVisualizer::ESlideFromLeft: + { + iSlideEffect->SlideOut(CFsSlideEffect::ESlideFromLeft); + break; + } + case MFsTreeVisualizer::ESlideFromRight: + { + iSlideEffect->SlideOut(CFsSlideEffect::ESlideFromRight); + break; + } + case MFsTreeVisualizer::ESlideNone: + default: + { + iSlideEffect->SlideOut(CFsSlideEffect::ESlideNone); + break; + } + } + } + + if (!aFadeOut && !aSlideOut) + { + iVisualizationState = EFsTreeFadingOut; + iFadeEffect->SetTime(KZero); + iFadeEffect->FadeOut(); + } + } + +// --------------------------------------------------------------------------- +// The function sets duration of the slide-in effect. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetSlideInDuration(TInt aTimeMiliseconds) + { + FUNC_LOG; + iSlideInDuration = aTimeMiliseconds; + if (iSlideInDuration < KZero) + { + iSlideInDuration = KZero; + } + } + +// --------------------------------------------------------------------------- +// The function returns slide in effect's duration. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::SlideInDuration() const + { + FUNC_LOG; + return iSlideInDuration; + } + +// --------------------------------------------------------------------------- +// The function sets direction of the slide in effect. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetSlideInDirection(TFsSlideEffect aDirection) + { + FUNC_LOG; + iSlideInDirection = aDirection; + } + +// --------------------------------------------------------------------------- +// The function returns direction of the slide in effect. +// --------------------------------------------------------------------------- +// +MFsTreeVisualizer::TFsSlideEffect CFsTreeVisualizerBase::SlideInDirection() const + { + FUNC_LOG; + return iSlideInDirection; + } + +// --------------------------------------------------------------------------- +// The function sets duration of the slide-out effect. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetSlideOutDuration(TInt aTimeMiliseconds) + { + FUNC_LOG; + iSlideOutDuration = aTimeMiliseconds; + if (iSlideOutDuration < 0) + { + iSlideOutDuration = 0; + } + } + +// --------------------------------------------------------------------------- +// The function returns slide out effect's duration. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::SlideOutDuration() const + { + FUNC_LOG; + return iSlideOutDuration; + } + +// --------------------------------------------------------------------------- +// The function sets direction of the slide out effect. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetSlideOutDirection(TFsSlideEffect aDirection) + { + FUNC_LOG; + iSlideOutDirection = aDirection; + } + +// --------------------------------------------------------------------------- +// The function returns direction of the slide out effect. +// --------------------------------------------------------------------------- +// +MFsTreeVisualizer::TFsSlideEffect CFsTreeVisualizerBase::SlideOutDirection() const + { + return iSlideOutDirection; + } + +// --------------------------------------------------------------------------- +// Returns information about looping type of the list. +// --------------------------------------------------------------------------- +// +TFsTreeListLoopingType CFsTreeVisualizerBase::LoopingType() const + { + FUNC_LOG; + return iLooping; + } + +// --------------------------------------------------------------------------- +// Sets type of list's looping. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetLoopingType( + const TFsTreeListLoopingType aLoopingType) + { + FUNC_LOG; + iLooping = aLoopingType; + } + +// --------------------------------------------------------------------------- +// Sets item expansion delay. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetItemExpansionDelay(const TInt aDelay) + { + FUNC_LOG; + iScrollSpeed = aDelay; + if (iScrollSpeed < 0) + { + iScrollSpeed = 0; + } + + iCurrentScrollSpeed = iScrollSpeed; + iScrollAccelerationRate = 0.5; + } + +// --------------------------------------------------------------------------- +// Sets an item separator color. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetItemSeparatorColor(const TRgb& aColor) + { + FUNC_LOG; + static_cast (iBorderBrush)->SetColor(aColor); + } + +// --------------------------------------------------------------------------- +// Sets an item separator size. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetItemSeparatorSize(const TSize aSize) + { + FUNC_LOG; + static_cast (iBorderBrush)->SetThickness( + TAlfTimedPoint(aSize.iWidth, aSize.iHeight)); + } + +// --------------------------------------------------------------------------- +// Sets an item separator size. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetItemSeparatorSize( + const TAlfTimedPoint& aThickness) + { + FUNC_LOG; + static_cast (iBorderBrush)->SetThickness(aThickness); + } + +// --------------------------------------------------------------------------- +// The functions sets fade-in's effect duration. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetFadeInEffectTime(TInt aFadeTime) + { + FUNC_LOG; + if (aFadeTime < 0) + { + iFadeInEffectTime = 0; + } + else + { + iFadeInEffectTime = aFadeTime; + } + } + +// --------------------------------------------------------------------------- +// The functions returns fade-in's effect duration. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::FadeInEffectTime() + { + FUNC_LOG; + return iFadeInEffectTime; + } + +// --------------------------------------------------------------------------- +// The functions sets fade-out's effect duration. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetFadeOutEffectTime(TInt aFadeTime) + { + FUNC_LOG; + if (aFadeTime < 0) + { + iFadeOutEffectTime = 0; + } + else + { + iFadeOutEffectTime = aFadeTime; + } + } + +// --------------------------------------------------------------------------- +// The functions returns fade-out's effect duration. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::FadeOutEffectTime() + { + FUNC_LOG; + return iFadeOutEffectTime; + } + +// --------------------------------------------------------------------------- +// Function sets the time of list scroll per item and the scroll +// acceleration rate. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetScrollTime(TInt aScrollTime, + TReal aScrollAcceleration) + { + FUNC_LOG; + iScrollSpeed = aScrollTime; + if (iScrollSpeed < 0) + { + iScrollSpeed = 0; + } + + iCurrentScrollSpeed = iScrollSpeed; + iScrollAccelerationRate = aScrollAcceleration; + if (iScrollAccelerationRate < 0.0) + { + iScrollAccelerationRate = 0.0; + } + else if (iScrollAccelerationRate > 1.0) + { + iScrollAccelerationRate = 1.0; + } + } + +// --------------------------------------------------------------------------- +// Gets the item expansion delay. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::ItemExpansionDelay() const + { + FUNC_LOG; + return iScrollSpeed; + } + +// --------------------------------------------------------------------------- +// Function gets the values of scroll speed and its acceleration rate. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::GetScrollTime(TInt& aScrollTime, + TReal& aScrollAcceleration) + { + FUNC_LOG; + aScrollTime = iScrollSpeed; + aScrollAcceleration = iScrollAccelerationRate; + } + +// --------------------------------------------------------------------------- +// Expand the node. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ExpandNodeL(const TFsTreeItemId aNodeId) + { + FUNC_LOG; + MFsTreeNodeVisualizer* nodeVisualizer = + iTreeData->NodeVisualizer(aNodeId); + TRect rc; + TUint index = iWorld.GetItemRect(aNodeId, rc); + if (!nodeVisualizer->IsExpanded()) + { + nodeVisualizer->SetExpanded(ETrue, &iTreeData->ItemData(aNodeId)); + + TFsTreeIterator treeIter = iTreeData->Iterator(aNodeId, aNodeId, + KFsTreeIteratorSkipHiddenFlag); + if (treeIter.HasNext()) + { + TPoint position; + if (iFocusedItem != KFsTreeNoneID) + { + position = iViewPort.ItemRect(iFocusedItem).iTl; + } + iWorld.BeginUpdate(); + TFsTreeItemId itemId; + TSize size; + do + { + itemId = treeIter.Next(); + ++index; + MFsTreeItemVisualizer* itemviz = + iTreeData->ItemVisualizer(itemId); + ApplyListSpecificValuesToItem(itemviz); + size = itemviz->Size(); + iWorld.InsertL(itemId, size, index); + } while (treeIter.HasNext()); + if (iFocusedItem != KFsTreeNoneID) + { + iViewPort.ItemToPositionL(iFocusedItem, position, EFalse, + TViewPort::EPositionAfterExpand); + } + iWorld.EndUpdateL(); + + if ( iVisualizerObserver ) + { + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeListItemExpanded, + aNodeId ); + } + } + } + } + +// --------------------------------------------------------------------------- +// Collapse the node. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CollapseNodeL(const TFsTreeItemId aNodeId) + { + FUNC_LOG; + MFsTreeNodeVisualizer* nodeVisualizer = + iTreeData->NodeVisualizer(aNodeId); + if (nodeVisualizer->IsExpanded()) + { + TFsTreeIterator treeIter = iTreeData->Iterator(aNodeId, aNodeId, + KFsTreeIteratorSkipHiddenFlag); + nodeVisualizer->SetExpanded(EFalse, &iTreeData->ItemData(aNodeId)); + if (treeIter.HasNext()) + { + iWorld.BeginUpdate(); + TFsTreeItemId itemId; + TSize size; + do + { + itemId = treeIter.Next(); + if (itemId != KFsTreeNoneID) + { + iWorld.RemoveL(itemId); + } + } while (treeIter.HasNext()); + iWorld.EndUpdateL(); + + if ( iVisualizerObserver ) + { + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeListItemCollapsed, + aNodeId ); + } + } + } + } + +// --------------------------------------------------------------------------- +// Expand all nodes in the tree. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ExpandAllL() + { + FUNC_LOG; + iWorld.BeginUpdate(); + TPoint position; + if (iFocusedItem != KFsTreeNoneID) + { + position = iViewPort.ItemRect(iFocusedItem).iTl; + } + iWorld.RemoveAllL(); + TFsTreeIterator treeIter = iTreeData->Iterator(KFsTreeRootID, + KFsTreeRootID); + TFsTreeItemId itemId = KFsTreeNoneID; + TSize size; + while (treeIter.HasNext()) + { + itemId = treeIter.Next(); + if (itemId != KFsTreeNoneID) + { + if (iTreeData->IsNode(itemId)) + { + MFsTreeNodeVisualizer* nodeviz = iTreeData->NodeVisualizer( + itemId); + nodeviz->SetExpanded(ETrue, &iTreeData->ItemData(itemId)); + size = nodeviz->Size(); + } + else + { + MFsTreeItemVisualizer* itemviz = iTreeData->ItemVisualizer( + itemId); + size = itemviz->Size(); + } + iWorld.AppendL(itemId, size); + } + } + if (iFocusedItem != KFsTreeNoneID) + { + iViewPort.ItemToPositionL(iFocusedItem, position, EFalse, + TViewPort::EPositionAfterExpand); + } + iWorld.EndUpdateL(); + // + if ( iVisualizerObserver ) + { + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeListExpandedAll ); + } + // + } + +// --------------------------------------------------------------------------- +// Collapse all nodes in the tree. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CollapseAllL() + { + FUNC_LOG; + iWorld.BeginUpdate(); + TPoint position; + if (iFocusedItem != KFsTreeNoneID) + { + position = iViewPort.ItemRect(iFocusedItem).iTl; + } + iWorld.RemoveAllL(); + if (iTreeData->Count() > 0) + { + TUint childcount = iTreeData->CountChildren(KFsTreeRootID); + for (TUint i = 0; i < childcount; ++i) + { + TFsTreeItemId itemId = iTreeData->Child(KFsTreeRootID, i); + TSize itemSize; + if (iTreeData->IsNode(itemId)) + { + MFsTreeNodeVisualizer* nodeVis(iTreeData->NodeVisualizer( + itemId)); + nodeVis->SetExpanded(EFalse, &iTreeData->ItemData(itemId)); + itemSize = nodeVis->Size(); + } + else + { + itemSize = iTreeData->ItemVisualizer(itemId)->Size(); + } + iWorld.AppendL(itemId, itemSize); + } + } + if (iFocusedItem != KFsTreeNoneID) + { + iViewPort.ItemToPositionL(iFocusedItem, position, EFalse); + } + iWorld.EndUpdateL(); + // + if ( iVisualizerObserver ) + { + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeListCollapsedAll ); + } + // + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::AllNodesCollapsed() const + { + FUNC_LOG; + TFsTreeIterator treeIter = iTreeData->Iterator(KFsTreeRootID, + KFsTreeRootID, KFsTreeIteratorSkipCollapsedFlag + | KFsTreeIteratorSkipHiddenFlag); + TFsTreeItemId itemId = KFsTreeNoneID; + while (treeIter.HasNext()) + { + itemId = treeIter.Next(); + if (!iTreeData->IsNode(itemId)) + { + return EFalse; + } + } + return ETrue; + } + +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::AllNodesExpanded() const + { + FUNC_LOG; + return iWorld.ItemCount() == iTreeData->Count(); + } + +// --------------------------------------------------------------------------- +// Update visual of the item given by id. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UpdateItemL(const TFsTreeItemId aItemId) + { + FUNC_LOG; + TInt i = iVisibleItems.Find(aItemId); + if (i != KErrNotFound) + { + MFsTreeItemVisualizer* vis = iTreeData->ItemVisualizer(aItemId); + if (vis) + { + vis->UpdateL(iTreeData->ItemData(aItemId), + IsItemFocused(aItemId) && IsFocusShown(), + iTreeData->Level(aItemId), + iMarkIcon, iMenuIcon, 0); + } + } + } + +// --------------------------------------------------------------------------- +// The functions sets wether all item in the list should be always in +// extended state or in normal state. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetItemsAlwaysExtendedL(TBool aAlwaysExtended) + { + FUNC_LOG; + iFlags.Assign(EItemsAlwaysExtended, aAlwaysExtended); + TFsTreeIterator treeIter( + iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID)); + while (treeIter.HasNext()) + { + TFsTreeItemId itemId(treeIter.Next()); + if (itemId != KFsTreeNoneID && !iTreeData->IsNode(itemId)) + { + MFsTreeItemVisualizer* itemviz(iTreeData->ItemVisualizer(itemId)); + ApplyListSpecificValuesToItem(itemviz); + } + } + iWorld.BeginUpdate(); + iWorld.RemoveAllL(); + treeIter = iTreeData->Iterator(KFsTreeRootID, KFsTreeRootID, + KFsTreeIteratorSkipCollapsedFlag); + while (treeIter.HasNext()) + { + TFsTreeItemId itemId(treeIter.Next()); + if (itemId != KFsTreeNoneID) + { + MFsTreeItemVisualizer* itemviz(iTreeData->ItemVisualizer(itemId)); + iWorld.AppendL(itemId, itemviz->Size()); + } + } + iViewPort.SetPositionL(TPoint(), EFalse); + iViewPort.ClearCache(); + iWorld.EndUpdateL(); + } + +// --------------------------------------------------------------------------- +// The function returns if items are always in extended state or in normal. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsItemsAlwaysExtended() + { + FUNC_LOG; + return iFlags.IsSet(EItemsAlwaysExtended); + } + +// --------------------------------------------------------------------------- +// Set the background texture, clears the background color. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::SetBackgroundTextureL(CAlfTexture& /*aBgTexture*/) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// Sets the background color, clears the background texture. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::SetBackgroundColorL(TRgb aColor) + { + FUNC_LOG; + if (iWatermarkLayout && iWatermarkLayout->Brushes()) + { + TInt count = iWatermarkLayout->Brushes()->Count(); + if (count > 0) + {//there is only background brush attached to this layout + iWatermarkLayout->Brushes()->Remove(KZero); + iWatermarkLayout->Brushes()->Reset(); + iWatermarkLayout->SetFlag(EAlfVisualChanged); + } + } + + CAlfGradientBrush* backgroundBrush = CAlfGradientBrush::NewL( + iOwnerControl->Env()); + backgroundBrush->SetLayer(EAlfBrushLayerBackground); + backgroundBrush->SetColor(aColor); + + iWatermarkLayout->Brushes()->AppendL(backgroundBrush, EAlfHasOwnership); + } + +// --------------------------------------------------------------------------- +// Sets a given brush as a list background. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::SetBackgroundBrushL(CAlfBrush* aBrush) + { + FUNC_LOG; + + if (iWatermarkLayout && iWatermarkLayout->Brushes()) + { + TInt count = iWatermarkLayout->Brushes()->Count(); + if (count > 0) + {//there is only background brush attached to this layout + iWatermarkLayout->Brushes()->Remove(KZero); + iWatermarkLayout->Brushes()->Reset(); + iWatermarkLayout->SetFlag(EAlfVisualChanged); + } + } + + aBrush->SetLayer(EAlfBrushLayerBackground); + iWatermarkLayout->Brushes()->AppendL(aBrush, EAlfHasOwnership); + } + +// --------------------------------------------------------------------------- +// The function clears list's background. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::ClearBackground() + { + FUNC_LOG; + if (iWatermarkLayout && iWatermarkLayout->Brushes()) + { + TInt count = iWatermarkLayout->Brushes()->Count(); + if (count > 0) + {//there is only background brush attached to this layout + iWatermarkLayout->Brushes()->Remove(KZero); + iWatermarkLayout->Brushes()->Reset(); + iWatermarkLayout->SetFlag(EAlfVisualChanged); + } + } + } + +// --------------------------------------------------------------------------- +// Sets watermark position. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::SetWatermarkPos(const TPoint& aPosition) + { + FUNC_LOG; + if (iWatermark) + { + TAlfTimedPoint position; + position.SetTarget(TAlfRealPoint(aPosition)); + iWatermark->SetPos(position); + } + } + +// --------------------------------------------------------------------------- +// Sets watermark's size. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::SetWatermarkSize(const TSize& aSize) + { + FUNC_LOG; + if (iWatermark) + { + TAlfTimedPoint size; + size.SetTarget(TAlfRealPoint(aSize.AsPoint())); + iWatermark->SetSize(size); + } + } + +// --------------------------------------------------------------------------- +// Sets watermark opacity. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::SetWatermarkOpacity(const float aOpacity) + { + FUNC_LOG; + if (iWatermark) + { + TAlfTimedValue opacity; + opacity.SetTarget(aOpacity, 0); + iWatermark->SetOpacity(opacity); + } + } + +// --------------------------------------------------------------------------- +// Sets watermark texture. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::SetWatermarkL(CAlfTexture* aTexture) + { + FUNC_LOG; + if (aTexture) + { + if (!iWatermark) + { + iWatermark + = CFsWatermark::NewL(*iOwnerControl, *iWatermarkLayout); + } + // + iWatermark->SetWatermarkTextureL(*aTexture); + // + } + else + { + delete iWatermark; + iWatermark = NULL; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::TreeEventL( + const TFsTreeEvent aEvent, + const MFsTreeObserver::TFsTreeEventParams& aParams) + { + FUNC_LOG; + switch (aEvent) + { + case EFsTreeItemAdded: + case EFsTreeNodeAdded: + { + MFsTreeItemVisualizer* itemVisualizer(iTreeData->ItemVisualizer( + aParams.iItemId)); + const TBool isHidden(itemVisualizer->IsHidden()); + if (!isHidden) + { + if (!iListLayout->Count()) + { + // Hide empty list marker + iRootVisualizer->Hide(); + iComponentLayout->UpdateChildrenLayout(); + iListLayout->UpdateChildrenLayout(); + } + if (aParams.iTargetNodeId != KFsTreeRootID) + { + MFsTreeNodeVisualizer* nodeVisualizer = + iTreeData->NodeVisualizer(aParams.iTargetNodeId); + if (nodeVisualizer->IsExpanded()) + { + // look for parent's index + TInt indexAdd = 0; + while (iWorld.Item(indexAdd) != aParams.iTargetNodeId) + { + indexAdd++; + } + + // look for how many children parent already has in + // the tree model + TInt childCount( 0 ); + if ( aParams.iIndex >= 0 ) + { + childCount = aParams.iIndex; + } + else + { + // -1 is for excluding the item that is now being + // inserted to visualiser + // (it has already been inserted to the tree model) + childCount = iTreeData->CountChildrenRecursively( + aParams.iTargetNodeId ) - 1; + } + + InsertItemL( aParams.iItemId, indexAdd + 1 + childCount ); + } + } + else if (iWorld.ItemCount() > 0) + { + if (aParams.iIndex >= 0) + { + TInt indexAdd = 0; + TInt nodeCount = 0; + while (indexAdd < iWorld.ItemCount() - 1 && nodeCount + != aParams.iIndex) + { + indexAdd++; + if (iTreeData->Parent(iWorld.Item(indexAdd)) + == KFsTreeRootID) + { + nodeCount++; + } + } + InsertItemL(aParams.iItemId, indexAdd); + } + else + { + InsertItemL(aParams.iItemId, KErrNotFound); + } + } + else + { + InsertItemL(aParams.iItemId, aParams.iIndex); + } + } + } + break; + case EFsTreeItemRemoved: + case EFsTreeNodeRemoved: + { + RemoveItemL(aParams.iItemId); + } + break; + case EFsTreeRemovedAll: + { + iRootVisualizer->ShowL(*iRootLayout); + iRootVisualizer->UpdateL(*iRootData, EFalse, 0, iMarkIcon, + iMenuIcon); + //iListLayout->RemoveAndDestroyAllD(); + iWorld.RemoveAllL(); + iFocusedItem = KFsTreeNoneID; + } + break; + case EFsTreeItemVisualizerChanged: + //the selector visual will be destroyed only when changing visualizer + if (aParams.iItemId == iFocusedItem) + { + iSelectorVisual = NULL; + } + case EFsTreeItemDataChanged: + { + const TFsTreeItemId itemId(aParams.iItemId); + MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer( + itemId); + if (visualizer) + { + visualizer->UpdateL(iTreeData->ItemData(itemId), + IsItemFocused(itemId), iTreeData->Level(itemId), + iMarkIcon, iMenuIcon, 0); + } + } + break; + + default: + break; + } + } + +// --------------------------------------------------------------------------- +// The function implements tree observer's reaction to removing a list item +// from the model. If the item was visible then it's removed from the visible +// area. If the focused item was removed then the focus is moved to the next +// item in the tree hierarchy (if the next item is not present, then the focus +// is moved to the previous one). +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::RemoveItemL(TFsTreeItemId aItemId) + { + FUNC_LOG; + TInt removedindex = iWorld.IndexOfItem(aItemId); + iWorld.RemoveL(aItemId); + if (iFocusedItem == aItemId) + { + if (iWorld.ItemCount() > removedindex) + { + SetFocusedItemL(iWorld.Item(removedindex), EFalse); + } + else if (iWorld.ItemCount() > 0) + { + SetFocusedItemL(iWorld.Item(removedindex - 1), EFalse); + } + else + { + iFocusedItem = KFsTreeNoneID; + } + } + } + +// --------------------------------------------------------------------------- +// The function checks whether the focused item is not outside the visible +// area and if needed scrolls the list so that selected item is fully visible. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::MakeFocusedItemFullyVisible() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::RefreshListViewL() + { + FUNC_LOG; + if (iTreeData->Count() == 0) + { + iRootVisualizer->ShowL(*iRootLayout); + iRootVisualizer->UpdateL(*iRootData, EFalse, 0, iMarkIcon, iMenuIcon); + } + else + { + } + } + +// --------------------------------------------------------------------------- +// Hides item. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::HideItemL(const TFsTreeItemId /*aItemId*/) + + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// Unhides item. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UnhideItemL(const TFsTreeItemId /*aItemId*/) + { + FUNC_LOG; + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetPadding(const TAlfBoxMetric& aPadding) + { + FUNC_LOG; + + iWatermarkLayout->SetPadding(aPadding); + + } + +// --------------------------------------------------------------------------- +// List pane's padding taken from Layout Manager or switched off. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::EnableListPanePadding(TBool aEnable) + { + FUNC_LOG; + if (aEnable) + { + TRect listPane; + CFsLayoutManager::LayoutMetricsRect(TRect( + iComponentLayout->Size().Target().AsSize()), + CFsLayoutManager::EFsLmMainSpFsListPane, listPane); + + if (CFsLayoutManager::IsMirrored()) + { + iListLayout->SetPadding(TPoint( + iComponentLayout->Size().Target().AsSize().iWidth + - listPane.iBr.iX, 0)); + iListItemBackgroundLayout->SetPadding(TPoint( + iComponentLayout->Size().Target().AsSize().iWidth + - listPane.iBr.iX, 0)); + } + else + { + TInt xPadd; + xPadd = listPane.iTl.iX; + iListLayout->SetPadding(TPoint(xPadd, 0)); + iListItemBackgroundLayout->SetPadding(TPoint(xPadd, 0)); + } + } + else + { + //no padding + TInt padd(0); + iListLayout->SetPadding(TPoint(padd, padd)); + iListItemBackgroundLayout->SetPadding(TPoint(padd, padd)); + } + } + +// --------------------------------------------------------------------------- +// Sets the type of text marquee. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetTextMarqueeType( + const TFsTextMarqueeType aMarqueeType) + { + FUNC_LOG; + iMarqueeType = aMarqueeType; + } + +// --------------------------------------------------------------------------- +// Gets the type of text marquee. +// --------------------------------------------------------------------------- +// +TFsTextMarqueeType CFsTreeVisualizerBase::TextMarqueeType() const + { + FUNC_LOG; + return iMarqueeType; + } + +// --------------------------------------------------------------------------- +// Sets the speed of marquee. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetTextMarqueeSpeed(const TInt aPixelsPerSec) + { + FUNC_LOG; + iMarqueeSpeed = aPixelsPerSec; + } + +// --------------------------------------------------------------------------- +// Gets the speed of marquee. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::TextMarqueeSpeed() const + { + FUNC_LOG; + return iMarqueeSpeed; + } + +// --------------------------------------------------------------------------- +// Sets delay for text marquee start. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetTextMarqueeStartDelay(const TInt aStartDelay) + { + FUNC_LOG; + iMarqueStartDelay = aStartDelay; + } + +// --------------------------------------------------------------------------- +// Gets delay for text marquee. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::TextMarqueeStartDelay() const + { + FUNC_LOG; + return iMarqueStartDelay; + } + +// --------------------------------------------------------------------------- +// Sets a delay for each cycle start. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetTextMarqueeCycleStartDelay( + const TInt aCycleStartDelay) + { + FUNC_LOG; + iMarqueCycleStartDelay = aCycleStartDelay; + } + +// --------------------------------------------------------------------------- +// Returns a delay for each cycle start. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::TextMarqueeCycleStartDelay() const + { + FUNC_LOG; + return iMarqueCycleStartDelay; + } + +// --------------------------------------------------------------------------- +// Sets number of marquee cycles. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetTextMarqueeRepetitions( + const TInt aMarqueeRepetitions) + { + FUNC_LOG; + iMarqueeRepetitions = aMarqueeRepetitions; + } + +// --------------------------------------------------------------------------- +// Gets number of marquee cycles. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::TextMarqueeRepetitions() const + { + FUNC_LOG; + return iMarqueeRepetitions; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::GetItemDisplayRectTarget( + const TFsTreeItemId aItemId, TAlfRealRect& aRect) + { + FUNC_LOG; + TInt retVal(KErrNotFound); + MFsTreeItemVisualizer* itemVis(NULL); + CAlfLayout* lay(NULL); + + aRect.iTl = TAlfRealPoint(0.0, 0.0); + aRect.iBr = TAlfRealPoint(0.0, 0.0); + + retVal = iVisibleItems.Find(aItemId); + if (retVal != KErrNotFound) + {//item visible + itemVis = iTreeData->ItemVisualizer(aItemId); + if (itemVis) + { + lay = &itemVis->Layout(); + if (lay) + { + aRect = lay->DisplayRectTarget(); + retVal = KErrNone; + } + else + { + retVal = KErrNotFound; + } + } + else + { + retVal = KErrNotFound; + } + } + else + { + retVal = KErrNotFound; + } + + return retVal; + } + +// --------------------------------------------------------------------------- +// Internall to TreeList. Do not use directly. +// Used to block update during addition of many items/nodes. Currently only +// scrollbar is blocked from beign updated.Gets number of marquee cycles. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetAutoRefreshAtInsert(TBool aAllowRefresh) + { + FUNC_LOG; + if (!aAllowRefresh && iFlags.IsSet(EAutoRefresh)) + { + iWorld.BeginUpdate(); + } + else if (aAllowRefresh && !iFlags.IsSet(EAutoRefresh)) + { + TInt error( KErrNone ); + TRAP( error, iWorld.EndUpdateL() ); + ERROR_1( error, "iWorld.EndUpdateL failed with error: %d", error ); + } + iFlags.Assign(EAutoRefresh, aAllowRefresh); + } + +// --------------------------------------------------------------------------- +// Internall to TreeList. Do not use directly. +// Used to block update during addition of many items/nodes. Currently only +// scrollbar is blocked from beign updated.Gets number of marquee cycles. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsAutoRefreshAtInsert() + { + FUNC_LOG; + return iFlags.IsSet(EAutoRefresh); + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::SetDirectTouchMode +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetDirectTouchMode(const TBool aDirectTouchMode) + { + FUNC_LOG; + iFlags.Assign(EDirectTouchMode, aDirectTouchMode); + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::SetExpandCollapseAllOnLongTap +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetExpandCollapseAllOnLongTap( TBool aExpandCollapse ) + { + FUNC_LOG; + iFlags.Assign( EExpandCollapseOnLongTap, aExpandCollapse ); + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::IsExpandCollapseAllOnLongTap +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsExpandCollapseAllOnLongTap() + { + FUNC_LOG; + return iFlags.IsSet( EExpandCollapseOnLongTap ); + } + +// --------------------------------------------------------------------------- +// From MFsFadeEffectObserver +// Function which will receive notifications about fade effect state changes. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::FadeEffectEvent( + MFsFadeEffectObserver::TFadeEffectState aState) + { + FUNC_LOG; + switch (aState) + { + case MFsFadeEffectObserver::EFadeInFinished: + { + if (iVisualizationState == EFsTreeFadingInSlidingIn) + {//slide in effect still on + iVisualizationState = EFsTreeSlidingIn; + } + else if (iVisualizationState == EFsTreeFadingIn) + { + iVisualizationState = EFsTreeVisible; + UpdateScrollBar(); + } + break; + } + case MFsFadeEffectObserver::EFadeOutFinished: + { + if (iVisualizationState == EFsTreeFadingOutSlidingOut) + {//slide out effect still on + iVisualizationState = EFsTreeSlidingOut; + } + else if (iVisualizationState == EFsTreeFadingOut) + { + iScrollBar->MakeVisible(EFalse); + iVisualizationState = EFsTreeHidden; + } + break; + } + default: + { + break; + } + } + + if (iVisualizationState == EFsTreeVisible && iVisualizerObserver) + { + // Touch + TRAP_IGNORE(iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeListVisualizerShown, + KFsTreeNoneID )); + // + } + + if (iVisualizationState == EFsTreeHidden && iVisualizerObserver) + { + // Touch + TRAP_IGNORE(iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeListVisualizerHidden, + KFsTreeNoneID )); + // + } + } + +// --------------------------------------------------------------------------- +// From MFsSlideEffectObserver +// Function which will receive notifications about slide effect state changes. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SlideEffectEvent( + MFsSlideEffectObserver::TSlideEffectState aState) + { + FUNC_LOG; + switch (aState) + { + case MFsSlideEffectObserver::ESlideInFinished: + { + if (iVisualizationState == EFsTreeFadingInSlidingIn) + {//fade in effect still on + iVisualizationState = EFsTreeFadingIn; + } + else if (iVisualizationState == EFsTreeSlidingIn) + { + iVisualizationState = EFsTreeVisible; + UpdateScrollBar(); + } + break; + } + case MFsSlideEffectObserver::ESlideOutFinished: + { + if (iVisualizationState == EFsTreeFadingOutSlidingOut) + {//fade out effect still on + iVisualizationState = EFsTreeFadingOut; + } + else if (iVisualizationState == EFsTreeSlidingOut) + { + iScrollBar->MakeVisible(EFalse); + iVisualizationState = EFsTreeHidden; + } + break; + } + default: + { + break; + } + } + + if (iVisualizationState == EFsTreeVisible && iVisualizerObserver) + { + // Touch + TRAP_IGNORE(iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeListVisualizerShown, + KFsTreeNoneID )); + + } + + if (iVisualizationState == EFsTreeHidden && iVisualizerObserver) + { + TRAP_IGNORE(iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeListVisualizerHidden, + KFsTreeNoneID )); + // + } + } + +// --------------------------------------------------------------------------- +// From MAlfActionObserver +// Called by the server when an action command is executed. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::HandleActionL( + const TAlfActionCommand& aActionCommand) + { + // Change scrollbar to avkon (to support skinning & touch) + if (KAknsMessageSkinChange == aActionCommand.Id()) + {//layoout has changed + // HideList(EFalse, EFalse); + // ShowListL(ETrue, EFalse); + iScrollBar->HandleResourceChange(KAknsMessageSkinChange); + } + // + } + +// --------------------------------------------------------------------------- +// Hides visible list items. Clears the visible items table. +// --------------------------------------------------------------------------- +// +// +void CFsTreeVisualizerBase::ClearVisibleItemsListL(TBool /*aRemoveAll*/, + TBool /*aScrollList*/) +// + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// Applies focus brush to the selected item. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ChangeFocusL(const TFsTreeItemId /*aPrevious*/) + { + FUNC_LOG; + + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::AdjustVisibleItemsL +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::AdjustVisibleItemsL() + { + FUNC_LOG; + + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::InsertItemL +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::InsertItemL(TFsTreeItemId aItemId, + const TInt aSlot) + { + MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer(aItemId); + ApplyListSpecificValuesToItem(visualizer); + //TUint32 oldflags = visualizer->Flags(); + //visualizer->SetFlags(oldflags | KFsTreeListItemManagedLayout); + const TSize size(visualizer->Size()); + //visualizer->SetFlags(oldflags); + if (aSlot != KErrNotFound) + { + iWorld.InsertL(aItemId, size, aSlot); + } + else + { + iWorld.AppendL(aItemId, size); + } + } + +// --------------------------------------------------------------------------- +// Move selection in the list. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::MoveSelectionL( + const TFsTreeVisualizerMove aMoveType) + { + FUNC_LOG; + TInt focusedIndex = iWorld.IndexOfItem(iFocusedItem); + switch (aMoveType) + { + case EFsTreeVisualizerMoveLineUp: + { + while (focusedIndex > 0) + { + focusedIndex -= 1; + if (iTreeData->ItemData(iWorld.Item(focusedIndex)).Type() + != KFsSeparatorDataType) + { + SetFocusedItemL(iWorld.Item(focusedIndex)); + break; + } + } + break; + } + case EFsTreeVisualizerMoveLineDown: + { + while (focusedIndex < iWorld.ItemCount() - 1) + { + focusedIndex += 1; + if (iTreeData->ItemData(iWorld.Item(focusedIndex)).Type() + != KFsSeparatorDataType) + { + SetFocusedItemL(iWorld.Item(focusedIndex)); + break; + } + } + break; + } + case EFsTreeVisualizerMovePageUp: + { + focusedIndex -= iVisibleItems.Count() - 2; + while (focusedIndex > 0) + { + if (iTreeData->ItemData(iWorld.Item(focusedIndex)).Type() + != KFsSeparatorDataType) + { + break; + } + else + { + focusedIndex--; + } + } + if (focusedIndex < 0) + { + focusedIndex = 0; + } + if (iWorld.ItemCount() > 0) + { + SetFocusedItemL(iWorld.Item(focusedIndex)); + } + break; + } + case EFsTreeVisualizerMovePageDown: + { + focusedIndex += iVisibleItems.Count() - 2; + while (focusedIndex < iWorld.ItemCount() - 1) + { + if (iTreeData->ItemData(iWorld.Item(focusedIndex)).Type() + != KFsSeparatorDataType) + { + break; + } + else + { + focusedIndex++; + } + } + if (focusedIndex > iWorld.ItemCount() - 1) + { + focusedIndex = iWorld.ItemCount() - 1; + } + if (iWorld.ItemCount() > 0) + { + SetFocusedItemL(iWorld.Item(focusedIndex)); + } + break; + } + } + iViewPort.ScrollItemToViewL(iFocusedItem, ETrue); + } + +// --------------------------------------------------------------------------- +// Moves selection in the list by one item upwards. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::MoveSelectionByLineUpL(const TBool /*aChangeFocus*/) + { + FUNC_LOG; + return 0; + } + +// --------------------------------------------------------------------------- +// Moves selection in the list by one item downwards. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::MoveSelectionByLineDownL(const TBool /*aChangeFocus*/) + { + FUNC_LOG; + return 0; + } + +// --------------------------------------------------------------------------- +// Scrolling +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::Scroll(const TFsTreeItemId aPrevious, + TBool aAlignTop) + { + FUNC_LOG; + TInt currScrollOffset = iListLayout->ScrollOffset().iY.Target(); + TInt listItemsHeight = 0; + TInt visibleHeight = iComponentLayout->Size().iY.Target(); + TInt scrollOffset = 0; + + listItemsHeight = VisibleItemsHeight(aPrevious); + + if (aAlignTop) + { + scrollOffset = 0; + } + else + { + if (listItemsHeight > visibleHeight) + { + scrollOffset = listItemsHeight - visibleHeight; + } + else + { + scrollOffset = currScrollOffset; + } + } + + ScrollListLayouts(scrollOffset, iCurrentScrollSpeed); + } + +// --------------------------------------------------------------------------- +// Counts height items from iVisibleItems array which will +// be drawn on the screen +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::VisibleItemsHeight(const TFsTreeItemId aPrevious) + { + FUNC_LOG; + TInt listItemsHeight = 0; + MFsTreeItemVisualizer* vis = 0; + TFsTreeItemId itemId; + TInt itemCount = iVisibleItems.Count(); + + for (TInt index = 0; index < itemCount; ++index) + { + itemId = iVisibleItems[index]; + vis = iTreeData->ItemVisualizer(itemId); + + if (itemId == iFocusedItem) + { + if (vis->IsExtendable()) + { + listItemsHeight += vis->ExtendedSize().iHeight; + } + else + { + listItemsHeight += vis->Size().iHeight; + } + } + else if (itemId == aPrevious && iFocusedItem != aPrevious) + { + listItemsHeight += vis->Size().iHeight; + } + else if (vis->IsExtended() && vis->IsExtendable()) + { + listItemsHeight += vis->ExtendedSize().iHeight; + } + else + { + listItemsHeight += vis->Size().iHeight; + } + } + + return listItemsHeight; + } + +// --------------------------------------------------------------------------- +// Check if item is in expanded node +// --------------------------------------------------------------------------- +TBool CFsTreeVisualizerBase::IsInExpanded(TFsTreeItemId aItemId) + { + FUNC_LOG; + TBool result(ETrue); + TFsTreeItemId parentId = iTreeData->Parent(aItemId); + while (parentId != KFsTreeRootID && parentId != KFsTreeNoneID) + { + if (iTreeData->IsNode(parentId)) + { + if (iTreeData->NodeVisualizer(parentId)->IsExpanded()) + { + result = ETrue; + parentId = iTreeData->Parent(parentId); + } + else + { + result = EFalse; + break; + } + } + else + { + parentId = iTreeData->Parent(parentId); + } + } + + return result; + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::UpdateViewPortL +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UpdateViewPortL() + { + FUNC_LOG; + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); + TRect listRect(iRootLayout->DisplayRectTarget()); + listRect.Move(mainPaneRect.iTl); + TRect listPane; + CFsLayoutManager::LayoutMetricsRect(listRect, + CFsLayoutManager::EFsLmMainSpFsListPane, listPane); + iWorld.BeginUpdate(); + TBool keepFocusedItemInView(EFalse); + if (iFocusedItem != KFsTreeNoneID) + { + keepFocusedItemInView = iViewPort.ItemRect(iFocusedItem).Height() > 0; + } + iViewPort.SetSizeL(listPane.Size()); + iWorld.Recalculate(*iTreeData); + if (keepFocusedItemInView) + { + iViewPort.ScrollItemToViewL(iFocusedItem, EFalse); + } + else + { + iViewPort.MakeViewFullyOccupiedL(); + } + iViewPort.ClearCache(); + iWorld.EndUpdateL(); + } + +// --------------------------------------------------------------------------- +// Updates scrollbar, only if update is needed. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UpdateScrollBarIfNeededL() + { + FUNC_LOG; + if (iScrollBar->ThumbPosition() != iViewPort.Position().iY) + { + iScrollbarModel.SetFocusPosition(iViewPort.Position().iY); + iScrollBar->SetModelL(&iScrollbarModel); + } + } + +// --------------------------------------------------------------------------- +// Updates scrollbar. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UpdateScrollBarL(const TInt /*aTimeout*/) + { + FUNC_LOG; + + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect); + TRect listRect(iRootLayout->DisplayRectTarget()); + listRect.Move(mainPaneRect.iTl); + TRect scrollPane, listPane; + CFsLayoutManager::LayoutMetricsRect(listRect, + CFsLayoutManager::EFsLmSpFsScrollPane, scrollPane); + CFsLayoutManager::LayoutMetricsRect(listRect, + CFsLayoutManager::EFsLmMainSpFsListPane, listPane); + + const TInt pageSize(iViewPort.Size().iHeight); + iScrollbarModel.SetScrollSpan(Max(iWorld.Height(), pageSize)); + iScrollbarModel.SetWindowSize(pageSize); + iScrollbarModel.SetFocusPosition(iViewPort.Position().iY); + iScrollBar->SetModelL(&iScrollbarModel); + + RArray columns; + CleanupClosePushL(columns); + TBool updateLayouts(EFalse); + if (iViewPort.IsScrollBarNeeded() && iVisualizationState + == EFsTreeVisible) + { + iScrollBar->SetRect(scrollPane); + columns.AppendL(listPane.Width()); + columns.AppendL(scrollPane.Width()); + iComponentLayout->SetColumnsL(columns); + iScrollBar->MakeVisible(ETrue); + updateLayouts = ETrue; + } + else if (!iViewPort.IsScrollBarNeeded()) + { + columns.AppendL(listPane.Width()); + iComponentLayout->SetColumnsL(columns); + iScrollBar->MakeVisible(EFalse); + updateLayouts = ETrue; + } + CleanupStack::PopAndDestroy(); // columns.Close() + if (updateLayouts) + { + iComponentLayout->UpdateChildrenLayout(); + + for (TUint i = 0; i < iVisibleItems.Count(); ++i) + { + TFsTreeItemId itemId(iVisibleItems[i]); + MFsTreeItemVisualizer* viz = iTreeData->ItemVisualizer(itemId); + viz->UpdateL(iTreeData->ItemData(itemId), + IsItemFocused(itemId) && IsFocusShown(), + iTreeData->Level(itemId), iMarkIcon, iMenuIcon, 0, EFalse); + } + UpdateSelectorVisualL(); + } + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::UpdateScrollBar(const TInt aTimeout) + { + FUNC_LOG; + TRAPD( error, UpdateScrollBarL( aTimeout ) ); + return error; + } + +// --------------------------------------------------------------------------- +// Old API to be removed. Turns on or off vertical scrollbar. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetVScrollBarL(TBool /*aSetOn*/) + { + FUNC_LOG; + UpdateScrollBarL(iCurrentScrollSpeed); + } + +// --------------------------------------------------------------------------- +// Turns on or off vertical scrollbar. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetScrollBarVisibilityL( + const TFsScrollbarVisibility aVisibility) + { + iScrollbarVisibility = aVisibility; + UpdateScrollBarL(iCurrentScrollSpeed); + } + +// --------------------------------------------------------------------------- +// Gets scrollbar visibility. +// --------------------------------------------------------------------------- +// +TFsScrollbarVisibility CFsTreeVisualizerBase::ScrollbarVisibility() const + { + FUNC_LOG; + return iScrollbarVisibility; + } + +// --------------------------------------------------------------------------- +// Sets border status +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetBorderL(const TBool aVisible, + CAlfTexture* aBorderTexture) + { + FUNC_LOG; + if (!aBorderTexture) + { + FsGenericPanic(EFsListPanicBorderNotSet); + } + + if (aVisible) + { + CAlfImageBrush* border = CAlfImageBrush::NewL(iOwnerControl->Env(), + TAlfImage(*aBorderTexture)); + border->SetLayer(EAlfBrushLayerBackground); + + border->SetBorders(-8, -8, -8, -8); + // + // layout values needed here (not: only used from FS action menu) + // + iBorderLayout->SetPadding(TPoint(5, 5)); + + if (iBorderLayout->Brushes()->Count() > 0) + { + iBorderLayout->Brushes()->Remove(0); + iBorderLayout->Brushes()->Reset(); + } + + iBorderLayout->Brushes()->AppendL(border, EAlfHasOwnership); + } + else + { + if (iBorderLayout->Brushes()->Count() > 0) + { + iBorderLayout->Brushes()->Remove(0); + iBorderLayout->Brushes()->Reset(); + iBorderLayout->SetPadding(0); + } + } + + iBorderLayout->SetFlag(EAlfVisualChanged); + iBorderLayout->UpdateChildrenLayout(); + RefreshListViewL(); + } + +// --------------------------------------------------------------------------- +// Sets shadow status +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetShadowL(const TBool aVisible) + { + FUNC_LOG; + if (aVisible) + { + //remove shadow if it's already set + if (iShadowLayout && iShadowLayout->Brushes()) + { + TInt count = iShadowLayout->Brushes()->Count(); + if (count > 0) + {//there is only a shadow brush attached to this layout + iShadowLayout->Brushes()->Remove(KZero); + iShadowLayout->Brushes()->Reset(); + iShadowLayout->SetFlag(EAlfVisualChanged); + } + } + //attach shadow brush to layout + CAlfShadowBorderBrush* shadow = CAlfShadowBorderBrush::NewLC( + iOwnerControl->Env(), KDefaultShadowWidth); + shadow->SetOpacity(.25f); + + //set paddind to root layout so the shadow can be visible + TAlfBoxMetric m; + m.iBottom.iMagnitude = KDefaultShadowWidth; + m.iLeft.iMagnitude = KZero; + m.iRight.iMagnitude = KDefaultShadowWidth; + m.iTop.iMagnitude = KZero; + iRootLayout->SetPadding(m); + + iShadowLayout->EnableBrushesL(ETrue); + iShadowLayout->Brushes()->AppendL(shadow, EAlfHasOwnership); + CleanupStack::Pop(shadow); + + iShadowLayout->SetFlag(EAlfVisualChanged); + iRootLayout->UpdateChildrenLayout(KZero); + } + else + { + //remove shadow if it's already set + if (iShadowLayout && iShadowLayout->Brushes()) + { + TInt count = iShadowLayout->Brushes()->Count(); + if (count > 0) + {//there is only a shadow brush attached to this layout + iShadowLayout->Brushes()->Remove(KZero); + iShadowLayout->Brushes()->Reset(); + iShadowLayout->SetFlag(EAlfVisualChanged); + + //remove paddind from root layout + TAlfBoxMetric m; + m.iBottom.iMagnitude = KZero; + m.iLeft.iMagnitude = KZero; + m.iRight.iMagnitude = KZero; + m.iTop.iMagnitude = KZero; + iRootLayout->SetPadding(m); + iRootLayout->UpdateChildrenLayout(KZero); + } + } + } + } + +// --------------------------------------------------------------------------- +// Sets visualizer observer +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetVisualizerObserver( + MFsTreeVisualizerObserver* aObserver) + { + FUNC_LOG; + iVisualizerObserver = aObserver; + } + +// --------------------------------------------------------------------------- +// Returns parent layout. +// --------------------------------------------------------------------------- +// +CAlfLayout& CFsTreeVisualizerBase::ParentLayout() const + { + FUNC_LOG; + return iParentLayout; + } + +// --------------------------------------------------------------------------- +// Function shows selector or hides it. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFsTreeVisualizerBase::MakeSelectorVisibleL(TBool aVisible) + { + MakeSelectorVisibleL( aVisible, 0 ); + } + +// --------------------------------------------------------------------------- +// Function shows selector or hides it. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::MakeSelectorVisibleL(TBool aVisible, TInt aDelay) + { + FUNC_LOG; + TAlfTimedValue opacity; + + if (aVisible) + { + if (!iSelectorVisual) + { + CreateSelectorVisualL(); + } + + TBool isFocused = IsItemFocused(iFocusedItem); + + if (iSelectorVisual) + { + if (isFocused && IsFocusShown()) + { + if( aDelay ) + opacity.SetTarget(iSelectorOpacity, aDelay); + else + opacity.SetValueNow(iSelectorOpacity); + } + else + { + if( aDelay ) + opacity.SetTarget(0.0, aDelay); + else + opacity.SetValueNow(0.0); + } + + iSelectorVisual->SetOpacity(opacity); + } + UpdateSelectorVisualL(); + } + else + { + if (iSelectorVisual) + { + opacity.SetValueNow(0); + iSelectorVisual->SetOpacity(opacity); + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UpdateSelectorVisualL(TInt /*aTime*/) + { + FUNC_LOG; + if (iSelectorVisual) + { + if (iFocusedItem == KFsTreeNoneID || !iFlags.IsSet(EListFocused) || !IsFocusShown()) + { + TAlfTimedValue opacity; + opacity.SetValueNow(0.0f); + iSelectorVisual->SetOpacity(opacity); + } + else + { + //check if item is visible + MFsTreeItemVisualizer* vis(NULL); + + iListLayout->SetFlag(EAlfVisualFlagFreezeLayout); + iListItemBackgroundLayout->SetFlag(EAlfVisualFlagFreezeLayout); + + TRect itemRect(iViewPort.ItemRect(iFocusedItem)); + if (itemRect.Height()) + { + TSize currSize; + currSize.iWidth = iListLayout->Size().iX.Target() - 2 + * iListLayout->PaddingInPixels().iTl.iX; + currSize.iHeight = itemRect.Height(); + iSelectorVisual->SetSize(currSize, 0); + TAlfRealPoint pNow; + pNow.iY = itemRect.iTl.iY; + pNow.iX = iListLayout->PaddingInPixels().iTl.iX; + iSelectorVisual->SetPos(pNow, 0); + + TAlfTimedValue opacity(iSelectorOpacity, 0); + iSelectorVisual->SetOpacity(opacity); + if (iMarqueeType != EFsTextMarqueeNone) + { + vis = iTreeData->ItemVisualizer(iFocusedItem); + vis->MarqueeL(iMarqueeType, iMarqueeSpeed, + iMarqueStartDelay, iMarqueCycleStartDelay, + iMarqueeRepetitions); + } + } + else + { + TAlfTimedValue opacity; + opacity.SetValueNow(0.0f); + iSelectorVisual->SetOpacity(opacity); + } + + iListLayout->ClearFlag(EAlfVisualFlagFreezeLayout); + iListItemBackgroundLayout->ClearFlag(EAlfVisualFlagFreezeLayout); + } + } + else if (iFocusedItem != KFsTreeNoneID && iFlags.IsSet(EListFocused)) + { + MakeSelectorVisibleL(ETrue); + } + } + +// --------------------------------------------------------------------------- +// The function deletes selector visual. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::DestroySelectorVisualL() + { + FUNC_LOG; + + if (iSelectorVisual && iSelectorLayout) + { + iSelectorLayout->Remove(iSelectorVisual); + //destroy + iSelectorVisual->RemoveAndDestroyAllD(); + iSelectorVisual = NULL; + } + } + +// --------------------------------------------------------------------------- +// The function creates selector visual. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CreateSelectorVisualL() + { + FUNC_LOG; + TAlfTimedValue opacity; + + if (!iSelectorVisual) + { + if (iFocusedItem != KFsTreeNoneID) + { + MFsTreeItemVisualizer* vis = + iTreeData->ItemVisualizer( iFocusedItem ); + MFsTreeItemData* data = &iTreeData->ItemData( iFocusedItem ); + + iListLayout->SetFlag( EAlfVisualFlagFreezeLayout ); + iListItemBackgroundLayout->SetFlag( EAlfVisualFlagFreezeLayout ); + + iSelectorVisual = CAlfImageVisual::AddNewL(*iOwnerControl, iSelectorLayout); + opacity.SetValueNow(0.0f); + iSelectorVisual->SetOpacity(opacity); + iSelectorVisual->SetScaleMode( CAlfImageVisual::EScaleFit); + iSelectorVisual->EnableBrushesL(); + + // Set the selector visual size and pos. + iSelectorVisual->SetFlags(EAlfVisualFlagManualLayout | + EAlfVisualFlagIgnorePointer); + + TRect itemRect(iViewPort.ItemRect(iFocusedItem)); + itemRect.SetWidth(iListLayout->Size().iX.Target() - 2 * iListLayout->PaddingInPixels().iTl.iX); + if ( itemRect.Height() ) + { + iSelectorVisual->SetPos(itemRect.iTl); + iSelectorVisual->SetSize(itemRect.Size()); + } + + //create a selector from skin or from a supplied bitmap + if ( iSelectorTexture ) + { + CAlfImageBrush* brush = CAlfImageBrush::NewLC( + iOwnerControl->Env(),TAlfImage(*iSelectorTexture)); + + brush->SetBorders(iLeftSelectorBorderWidth, + iRightSelectorBorderWidth, + iTopSelectorBorderHeight, + iBottomSelectorBorderHeight); + + iSelectorVisual->Brushes()->AppendL(brush, EAlfHasOwnership); + CleanupStack::Pop(brush); + } + else if ( iSelectorBrush ) + { + //append brush supplied by the user to the selector visual + iSelectorVisual->Brushes()->AppendL( + iSelectorBrush, EAlfDoesNotHaveOwnership); + + if ( iSelectorOpacity <= 0.0 || iSelectorOpacity > 1.0 ) + { + iSelectorOpacity = 1.0; + } + + opacity.SetValueNow(iSelectorOpacity); + iSelectorVisual->SetOpacity(opacity); + } + else //no bitmap/brush given - create selector from skin + { + // apply a image brush to the visual + CAlfFrameBrush* brush = CAlfFrameBrush::NewLC(iOwnerControl->Env(), + KAknsIIDQsnFrList); + + iSelectorVisual->Brushes()->AppendL(brush, EAlfHasOwnership); + CleanupStack::Pop(brush); + + CAlfBrush& skinbrush( iSelectorVisual->Brushes()->At( + iSelectorVisual->Brushes()->Count() - 1 ) ); + CAlfFrameBrush* + selectorBrush( static_cast( &skinbrush ) ); + + const TRect outerRect( itemRect.Size() ); //outer rect has the size of item + TRect innerRect( outerRect ); + + innerRect.Shrink( 5, 5 ); + if ( outerRect.Width() > 0 && outerRect.Height() > 0 && + innerRect.Width() > 0 && innerRect.Height() > 0 ) + { + // aInnerRect, const TRect& aOuterRect + selectorBrush->SetFrameRectsL( innerRect, outerRect ); + } + } + + iListLayout->ClearFlag( EAlfVisualFlagFreezeLayout ); + iListItemBackgroundLayout->ClearFlag( EAlfVisualFlagFreezeLayout ); + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UpdateListItemSizes() + { + FUNC_LOG; + TInt focused = iVisibleItems.Find(iFocusedItem); + if (focused == KErrNotFound) + { + return; + } + TInt count = iVisibleItemsBackground.Count(); + for (TInt i = 0; i < count; ++i) + { + if (i == focused) + {//focused item already updated + continue; + } + else + { + UpdateListItemSize(i); + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UpdateListItemSize(TInt aIndex) + { + FUNC_LOG; + TSize size; + TReal32 diff(0); + TReal32 speed(0); + TAlfTimedPoint sizeTarg; + TAlfTimedPoint sizeNow; + CAlfDeckLayout* lay; + + lay = iVisibleItemsBackground[aIndex]; + + sizeNow.iY.SetTarget(lay->Size().iY.ValueNow(), 0); + sizeNow.iX.SetTarget(lay->Size().iX.ValueNow(), 0); + sizeTarg.iY.SetTarget(lay->Size().iY.Target(), 0); + sizeTarg.iX.SetTarget(lay->Size().iX.Target(), 0); + + if (sizeNow.iY.Target() != sizeTarg.iY.Target()) + { + diff = sizeNow.iY.Target() - sizeTarg.iY.Target(); + if (diff < 0) + { + diff *= -1; + } + + if (iCurrentScrollSpeed != 0) + { + speed = diff / iCurrentScrollSpeed * 1000; + } + + TAlfTimedPoint p; + p.iY.SetTargetWithSpeed(sizeTarg.iY.Target(), speed); + p.iX.SetTarget(sizeTarg.iX.Target(), 0); + p.SetStyle(EAlfTimedValueStyleLinear); + + lay->SetSize(p); + iListLayout->Visual(aIndex).SetSize(p); + + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ScrollListLayoutsL(TInt aScrollOffset, TInt /*aScrollTime*/) + { + FUNC_LOG; + TPoint position(iViewPort.Position()); + if (position.iY != aScrollOffset) + { + position.iY = aScrollOffset; + iViewPort.SetPositionL(position); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::ScrollListLayouts(TInt aScrollOffset, + TInt aScrollTime) + { + TRAPD( error, ScrollListLayoutsL(aScrollOffset, aScrollTime) ); + return error; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TFsTreeItemId CFsTreeVisualizerBase::NextFocusableItem( + const TFsTreeItemId aItemId) + { + FUNC_LOG; + TFsTreeItemId treeItem = KFsTreeNoneID; + TFsTreeItemId foundItem = KFsTreeNoneID; + + TFsTreeIterator treeIter = iTreeData->Iterator(KFsTreeRootID, aItemId, + KFsTreeIteratorSkipCollapsedFlag | KFsTreeIteratorSkipHiddenFlag); + + while (treeIter.HasNext()) + { + treeItem = treeIter.Next(); + if (iTreeData->ItemVisualizer(treeItem)->IsFocusable()) + { + foundItem = treeItem; + break; + } + } + + return foundItem; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TFsTreeItemId CFsTreeVisualizerBase::PrevFocusableItem( + const TFsTreeItemId aItemId) + { + FUNC_LOG; + TFsTreeItemId treeItem = KFsTreeNoneID; + TFsTreeItemId foundItem = KFsTreeNoneID; + + TFsTreeIterator treeIter = iTreeData->Iterator(KFsTreeRootID, aItemId, + KFsTreeIteratorSkipCollapsedFlag | KFsTreeIteratorSkipHiddenFlag); + + while (treeIter.HasPrevious()) + { + treeItem = treeIter.Previous(); + if (iTreeData->ItemVisualizer(treeItem)->IsFocusable()) + { + foundItem = treeItem; + break; + } + } + + return foundItem; + } + +// --------------------------------------------------------------------------- +// Function sets current scroll speed based on the up/down key repeats. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetCurrentScrollSpeed(TInt aKeyRepeats) + { + FUNC_LOG; + TInt time(0); + if (iScrollSpeed > 0) + { + time = iIntx->Interval(iScrollSpeed); + if (time != iScrollSpeed) + { + iCurrentScrollSpeed = time; + if (aKeyRepeats > 0) + { + iCurrentScrollSpeed = iCurrentScrollSpeed * (1 - aKeyRepeats + * iScrollAccelerationRate); + if (iCurrentScrollSpeed < 0) + { + iCurrentScrollSpeed = 1; + } + } + } + else + { + iCurrentScrollSpeed = iScrollSpeed; + } + + if (iCurrentScrollSpeed < iScrollSpeed) + { + iCurrentScrollSpeed = KZero; + } + // TInt part(0); + // part = iScrollSpeed * 0.9; + + // if ( iCurrentScrollSpeed <= part ) + // { + // iCurrentScrollSpeed = 0; + // } + // if (iCurrentScrollSpeed < 200) + // { + // iCurrentScrollSpeed = 200; + // } + } + } + +// --------------------------------------------------------------------------- +// Gets default settings from Central Repository. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ReadDefaultValuesFromCenRep() + { + FUNC_LOG; + CRepository *crep(NULL); + TRAP_IGNORE( crep = CRepository::NewL( KCRUidFSGenericUI ) ); + + //scroll time + if (!crep || crep->Get(KFSGenericUIDefScrollSpeed, iScrollSpeed) + != KErrNone) + { + iScrollSpeed = KFsListDefaultScrollSpeed; + } + if (iScrollSpeed < 0) + { + iScrollSpeed = 0; + } + + //duration of the fade-in effect + if (!crep || crep->Get(KFSGenericUIFadeIn, iFadeInEffectTime) != KErrNone) + { + iFadeInEffectTime = KFsListDefaultFadeInTime; + } + if (iFadeInEffectTime < 0) + { + iFadeInEffectTime = 0; + } + + //duration of the fade-out effect + if (!crep || crep->Get(KFSGenericUIFadeOut, iFadeOutEffectTime) + != KErrNone) + { + iFadeOutEffectTime = KFsListDefaultFadeOutTime; + } + if (iFadeOutEffectTime < 0) + { + iFadeOutEffectTime = 0; + } + + //duration of the slide-in effect + if (!crep || crep->Get(KFSGenericUISlideInTime, iSlideInDuration) + != KErrNone) + { + iSlideInDuration = KFsListDefaultSlideInTime; + } + if (iSlideInDuration < 0) + { + iSlideInDuration = KFsListDefaultSlideInTime; + } + + //duration of the slide-out effect + if (!crep || crep->Get(KFSGenericUISlideOutTime, iSlideOutDuration) + != KErrNone) + { + iSlideOutDuration = KFsListDefaultSlideOutTime; + } + if (iSlideOutDuration < 0) + { + iSlideOutDuration = 0; + } + + //direction of the slide-in effect + TInt slideInDir; + if (!crep || crep->Get(KFSGenericUISlideInDir, slideInDir) != KErrNone) + { + slideInDir = KFsListDefaultSlideInDir; + } + if (slideInDir < 0 || slideInDir > 4) + { + slideInDir = 0; + } + iSlideInDirection + = static_cast (slideInDir); + + //direction of the slide-out effect + TInt slideOutDir; + if (!crep || crep->Get(KFSGenericUISlideOutDir, slideOutDir) != KErrNone) + { + slideOutDir = KFsListDefaultSlideOutDir; + } + if (slideOutDir < 0 || slideOutDir > 4) + { + slideOutDir = 0; + } + iSlideOutDirection = + static_cast(slideOutDir); + + //item expansion time + if ( !crep || crep->Get( KFSGenericUIListExpTimeOut, iCurrentScrollSpeed ) != + KErrNone ) + { + iCurrentScrollSpeed = KFsListDefaultListExpTimeOut; + } + if (iCurrentScrollSpeed < 1) + { + iCurrentScrollSpeed = 1; + } + + //list looping type + TInt listLooping; + if ( !crep || crep->Get( KFSGenericUIListLooping, listLooping) != + KErrNone ) + { + listLooping = KFsListDefaultListLooping; + } + if (listLooping < 0 || listLooping > 2) + { + listLooping = 0; + } + iLooping = static_cast (listLooping); + + delete crep; + } + +// --------------------------------------------------------------------------- +// Sets values to an item which are default for the whole list (e.g. if +// items are always extended. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ApplyListSpecificValuesToItem( + MFsTreeItemVisualizer *aItemVis) + { + FUNC_LOG; + //list can have all items in extended or in a normal state + aItemVis->SetAlwaysExtended(IsItemsAlwaysExtended()); + + //global indentation in pixels for a list component + aItemVis->SetIndentation(iLevelIndentation); + + //global indentation in pixels for a list component + aItemVis->SetTextStyleManager(*iTextStyleManager); + } + +// --------------------------------------------------------------------------- +// The function calculates tree height up to the specified item. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::CalculateTreeHeightUpToItem( + const TFsTreeItemId aItemId, TInt& aHeight) const + { + FUNC_LOG; + TFsTreeItemId tmpItem(KFsTreeNoneID); + TFsTreeItemId itemToFind(KFsTreeNoneID); + itemToFind = aItemId; + TInt retVal(KErrNone); + //validate given item id + if (!iTreeData->Contains(itemToFind)) + { + retVal = KErrNotFound; + } + if (retVal == KErrNone) + { + //create an iterator + TFsTreeIterator iter = iTreeData->Iterator(KFsTreeRootID, + KFsTreeRootID, KFsTreeIteratorSkipCollapsedFlag + | KFsTreeIteratorSkipHiddenFlag); + + TBool notFound(ETrue); + TInt height(0); + MFsTreeItemVisualizer* vis = NULL; + + //iterate up to the given item id and calculate the tree height + while (notFound && iter.HasNext()) + { + tmpItem = iter.Next(); + if (tmpItem == itemToFind) + { + notFound = EFalse; + continue; + } + else + {//add item's height + vis = iTreeData->ItemVisualizer(tmpItem); + if (vis->IsExtendable() && vis->IsExtended()) + { + height += vis->ExtendedSize().iHeight; + } + else + { + height += vis->Size().iHeight; + } + } + } + + if (notFound) + { + retVal = KErrNotFound; + } + else + { + retVal = KErrNone; + aHeight = height; + } + } + return retVal; + } + +// --------------------------------------------------------------------------- +// Update list's visual content by appending items into empty gap in list. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::FillGapWithItemsL(const TInt /*aHeight*/) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// The function checks if the given item id matches the focused one. +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsItemFocused(TFsTreeItemId aItemId) const + { + FUNC_LOG; + TBool isFocused(EFalse); + + if (iFocusedItem != KFsTreeNoneID) + { + if (iFlags.IsSet(EListFocused) && (aItemId == iFocusedItem)) + { + isFocused = ETrue; + } + } + return isFocused; + } + +// "Base class modifications for using touch" + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CFsTreeVisualizerBase::CFsTreeVisualizerBase( CAlfControl* aOwnerControl, + CAlfLayout& aParent, const TBool aDirectTouchMode ) + : iVisualizationState(EFsTreeHidden), + iOwnerControl ( aOwnerControl ), + iParentLayout ( aParent ), + iTreeData ( NULL ), + iFocusedItem ( KFsTreeNoneID ), + iListLayout ( NULL ), + iLooping ( EFsTreeListLoopingDisabled ), + iSelectorTexture(NULL), + iSelectorBrush(NULL), + iSelectorOpacity(1.0), + iLeftSelectorBorderWidth(KFSListDefaultSelectorBorderWidth), + iRightSelectorBorderWidth(KFSListDefaultSelectorBorderWidth), + iTopSelectorBorderHeight(KFSListDefaultSelectorBorderWidth), + iBottomSelectorBorderHeight(KFSListDefaultSelectorBorderWidth), + iSelectorMovementType(EFsSelectorMoveImmediately), + iMarqueeSpeed(30), + iScrollSpeed( 0 ), + iCurrentScrollSpeed(0), + iScrollAccelerationRate(0.4), + iFadeInEffectTime(0), + iFadeOutEffectTime(0), + iWatermark(NULL), + iLevelIndentation ( KFsDefaultIndentation ), + iSlideInDuration ( 0 ), + iSlideInDirection ( ESlideFromTop ), + iSlideOutDuration ( 0 ), + iSlideOutDirection ( ESlideFromTop ), + iScrollOffset(0), + iMarqueeType(EFsTextMarqueeForth), + iMarqueStartDelay( 1000 ), //one sec of delay + iMarqueCycleStartDelay ( 500 ), //half a sec cycle delay + iMarqueeRepetitions (-1), //infinite loop + iViewPort( *this, iWorld ) + { + FUNC_LOG; + iFlags.Set(EAutoRefresh); + iFlags.Assign(EDirectTouchMode, aDirectTouchMode); + iFlags.Set( EExpandCollapseOnLongTap ); + } +// + +// --------------------------------------------------------------------------- +// Second phase constructor. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ConstructL() + { + FUNC_LOG; + ReadDefaultValuesFromCenRep(); + + if (CAknPhysics::FeatureEnabled()) + { + iPhysics = CAknPhysics::NewL(*this, NULL ); + iDragHandler = CDragHandler::NewL(*this, + iPhysics->HighlightTimeout(), iFlags); + } + + iRootData = CFsTreePlainOneLineItemData::NewL(); + HBufC* empty = StringLoader::LoadL(R_AVKON_EMPTY_POPUP_LIST_TEXT); + CleanupStack::PushL(empty); + iRootData->SetDataL(*empty); + CleanupStack::PopAndDestroy(empty); + + iParentLayout.UpdateChildrenLayout(); + + iRootVisualizer = CFsTreePlainRootVisualizer::NewL(*iOwnerControl); + + iRootLayout = CAlfDeckLayout::AddNewL(*iOwnerControl, &iParentLayout); + iRootLayout->EnableBrushesL(); + iRootLayout->SetClipping(ETrue); + iRootLayout->UpdateChildrenLayout(); + + iTextStyleManager = CFsAlfTextStyleManager::NewL( + iRootLayout->Env().TextStyleManager()); + + iRootVisualizer->SetTextStyleManager(*iTextStyleManager); + + iShadowLayout = CAlfDeckLayout::AddNewL(*iOwnerControl, iRootLayout); + iShadowLayout->EnableBrushesL(); + iShadowLayout->UpdateChildrenLayout(); + + iBorderLayout = CAlfDeckLayout::AddNewL(*iOwnerControl, iShadowLayout); + iBorderLayout->EnableBrushesL(); + iBorderLayout->UpdateChildrenLayout(); + + iWatermarkLayout = CAlfDeckLayout::AddNewL(*iOwnerControl, iBorderLayout); + iWatermarkLayout->EnableBrushesL(); + iWatermarkLayout->UpdateChildrenLayout(); + + iComponentLayout = CAlfGridLayout::AddNewL(*iOwnerControl, 1, 1, + iWatermarkLayout); + iComponentLayout->SetClipping(ETrue); + iComponentLayout->EnableBrushesL(); + iComponentLayout->UpdateChildrenLayout(); + + iListDeck = CAlfDeckLayout::AddNewL(*iOwnerControl, iComponentLayout); + + iListItemBackgroundLayout = CAlfFlowLayout::AddNewL(*iOwnerControl, + iListDeck); + iListItemBackgroundLayout->SetFlowDirection(CAlfFlowLayout::EFlowVertical); + iListItemBackgroundLayout->SetClipping(ETrue); + iListItemBackgroundLayout->EnableScrollingL(ETrue); + TAlfTimedPoint tpListScrollOffset; + tpListScrollOffset.SetStyle(EAlfTimedValueStyleLinear); + iListItemBackgroundLayout->SetScrollOffset(tpListScrollOffset); + + iSelectorLayout = CAlfDeckLayout::AddNewL(*iOwnerControl, iListDeck); + iSelectorLayout->SetClipping(ETrue); + + iListLayout = CAlfFlowLayout::AddNewL(*iOwnerControl, iListDeck); + iListLayout->SetFlowDirection(CAlfFlowLayout::EFlowVertical); + + iListLayout->EnableBrushesL(); + iListLayout->EnableScrollingL(ETrue); + iListLayout->SetScrollOffset(tpListScrollOffset); + + //list pane's padding taken from layout manager + EnableListPanePadding(ETrue); + + iListLayout->UpdateChildrenLayout(); + iListItemBackgroundLayout->UpdateChildrenLayout(); + + iBorderBrush = CAlfBorderBrush::NewL(iOwnerControl->Env(), 0, 1, 0, 0); + static_cast (iBorderBrush)->SetColor(KRgbGray); + static_cast (iBorderBrush)->SetThickness( + TAlfTimedPoint(0.0f, 0.5f)); + iBorderBrush->SetLayer(EAlfBrushLayerForeground); + + iScrollbarVisibility = EFsScrollbarShowAlways; + + iScrollBar = new (ELeave) CAknDoubleSpanScrollBar(0); + iScrollBar->ConstructL(ETrue, this, 0, CEikScrollBar::EVertical, 1000); + + iScrollbarModel.SetScrollSpan(iComponentLayout->Size().Target().iY); + iScrollbarModel.SetFocusPosition(iViewPort.Position().iY); + iScrollbarModel.SetWindowSize(iListLayout->Size().iY.Target()); + + iScrollBar->MakeVisible(EFalse); + iScrollBar->SetModelL(&iScrollbarModel); + + iDummyScrollbar = CAlfImageVisual::AddNewL(*iOwnerControl); + iComponentLayout->Append(iDummyScrollbar); + + // + + iFadeEffect = CFsFadeEffect::NewL(iOwnerControl, this, iRootLayout, 0); + iSlideEffect = CFsSlideEffect::NewL(iOwnerControl, this, iRootLayout, 0); + + iFadeInEffectTime = KFsListDefaultFadeInTime; + iFadeOutEffectTime = KFsListDefaultFadeOutTime; + + iIntx = new (ELeave) CFsInteractionInterval; + + iOwnerControl->Env().AddActionObserverL(this); + + iWorld.AddObserverL(iViewPort); + iWorld.AddObserverL(*this); + UpdateViewPortL(); + } + +// Change scrollbar to avkon (to support skinning & touch) +// --------------------------------------------------------------------------- +// Handle scrollbar events +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::HandleScrollEventL(CEikScrollBar* aScrollBar, + TEikScrollEvent aEventType) + { + FUNC_LOG; + + if (iPhysics) + { + iPhysics->StopPhysics(); + } + + if (aScrollBar == iScrollBar) + { + + switch (aEventType) + { + case EEikScrollHome: + //Jump to beginning + break; + case EEikScrollEnd: + //Jump to end + break; + default: + TPoint position(iViewPort.Position()); + position.iY = aScrollBar->ThumbPosition(); + iViewPort.SetPositionL(position); + break; + } + } + } + +// --------------------------------------------------------------------------- +// Handle visibility change +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::NotifyControlVisibilityChange(TBool aIsVisible) + { + FUNC_LOG; + + if (aIsVisible && iVisualizationState == EFsTreeVisible) + { + UpdateScrollBar(); + } + else + { + iScrollBar->MakeVisible(EFalse); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::DisableKineticScrolling( TBool aDisable ) + { + FUNC_LOG; + iKineticScrollingDisabled = aDisable; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsKineticScrollingDisabled() const + { + FUNC_LOG; + return iKineticScrollingDisabled; + } + +// --------------------------------------------------------------------------- +// World updated +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::WorldUpdatedL(const TWorld& /*aWorld*/) + { + FUNC_LOG; + if (iFlags.IsSet(EPhysicsOn)) + { + iFlags.Set(EUpdatePhysicsAfterSimulationFinished); + } + else + { + UpdatePhysicsL(); + } + UpdateScrollBarL(); + } + +// --------------------------------------------------------------------------- +// ViewPort updated +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ViewPortUpdatedL(TViewPort& aViewPort) + { + FUNC_LOG; + RArray visibleItems; + RArray removableItems; + TInt scrollOffset; + TBool fullUpdate; + CleanupClosePushL(visibleItems); + CleanupClosePushL(removableItems); + aViewPort.GetVisibleItemsL(removableItems, visibleItems, scrollOffset, + fullUpdate); + TAlfRefreshMode rm(EAlfRefreshModeAutomatic); + rm = CAlfStatic::Env().RefreshMode(); + CAlfStatic::Env().SetRefreshMode(EAlfRefreshModeManual); + iListLayout->SetFlag(EAlfVisualFlagFreezeLayout); + // clear list + TInt removed(0); + if (fullUpdate) + { + removed += iListLayout->Count(); + for (TInt i = removed - 1; i >= 0; i--) + { + iTreeData->ItemVisualizer(VisualItemId(&iListLayout->Visual(i)))->Hide(); + } + iVisibleItems.Reset(); + } + else + { + for (TInt i = 0; i < removableItems.Count(); i++) + { + CAlfVisual* visual( + &iTreeData->ItemVisualizer(removableItems[i])->Layout()); + if (iListLayout->FindVisual(visual) != KErrNotFound) + { + removed++; + } + iTreeData->ItemVisualizer(removableItems[i])->Hide(); + iVisibleItems.Remove(iVisibleItems.Find(removableItems[i])); + } + } + + // update items to list + TInt added(0); + for (TInt i = 0; i < visibleItems.Count(); i++) + { + const TFsTreeItemId itemId(visibleItems[i]); + if (itemId != KFsTreeNoneID) + { + MFsTreeItemVisualizer* visualizer = iTreeData->ItemVisualizer( + itemId); + visualizer->ShowL(*iListLayout); + TSize size(visualizer->Size()); + TInt listInnerWidth(iListLayout->Size().IntTarget().iX); + TAlfTimedPoint tpItemSize(listInnerWidth, size.iHeight); + tpItemSize.SetTarget(TAlfRealPoint(listInnerWidth, size.iHeight), + 0); + CAlfLayout& visualizerLayout(visualizer->Layout()); + visualizerLayout.SetSize(tpItemSize); + visualizerLayout.PropertySetIntegerL(KPropertyItemId(), itemId); + visualizer->UpdateL(iTreeData->ItemData(itemId), + IsItemFocused(itemId) && IsFocusShown(), + iTreeData->Level(itemId), iMarkIcon, iMenuIcon, + 0); + visualizerLayout.Brushes()->AppendL(iBorderBrush, + EAlfDoesNotHaveOwnership); + CAlfBrush* bgBrush(NULL); + if (visualizer->GetBackgroundBrush(bgBrush)) + { + bgBrush->SetLayer(EAlfBrushLayerBackground); + visualizerLayout.Brushes()->AppendL(bgBrush, + EAlfDoesNotHaveOwnership); + } + const TInt orderPosition( + i < iListLayout->Count() ? i : iListLayout->Count() - 1); + iListLayout->Reorder(visualizerLayout, orderPosition); + iVisibleItems.AppendL(itemId); + added++; + } + } + + INFO_2("totalItems: %d, visibleItems: %d", iWorld.ItemCount(), visibleItems.Count()); + CleanupStack::PopAndDestroy(2); // visibleItems.Close(), removableItems.Close() + // scroll list layout by offset + TAlfTimedPoint alfOffset; + alfOffset.iY.SetTarget(scrollOffset, 0); + iListLayout->SetScrollOffset(alfOffset); + iListLayout->ClearFlag(EAlfVisualFlagFreezeLayout); + iListLayout->UpdateChildrenLayout(); + UpdateSelectorVisualL(); + UpdateScrollBarIfNeededL(); + CAlfStatic::Env().RefreshCallBack(&CAlfStatic::Env()); + CAlfStatic::Env().SetRefreshMode(rm); + } + +// --------------------------------------------------------------------------- +// Set panning position +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetPanningPosition(const TPoint& aDelta) + { + FUNC_LOG; + iPhysics->RegisterPanningPosition(aDelta); + } + +// --------------------------------------------------------------------------- +// Starts flicking. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::StartPhysics(TPoint& aDrag, + const TTime& aStartTime) + { + FUNC_LOG; + TTime startTime( aStartTime ); + TTime now; + now.HomeTime(); + TInt moveTime( now.MicroSecondsFrom( aStartTime ).Int64() ); + if (moveTime > KFlickMaxDuration) + { + startTime = now - TTimeIntervalMicroSeconds( KFlickMaxDuration - 1 ); + aDrag.iY = aDrag.iY * KFlickMaxDuration / moveTime; + } + iPhysics->StartPhysics(aDrag, startTime); + iFlags.Set(EPhysicsOn); + } + +// --------------------------------------------------------------------------- +// Update physics +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::UpdatePhysicsL() + { + FUNC_LOG; + if (iPhysics) + { + SafeDelete(iPhysics); + iPhysics = CAknPhysics::NewL(*this, NULL ); + const TSize viewSize(iViewPort.Size()); + const TSize worldSize(viewSize.iWidth, Max(iWorld.Height(), + viewSize.iHeight)); + iPhysics->InitPhysicsL(worldSize, viewSize, EFalse); + } + } + +// --------------------------------------------------------------------------- +// Physic updated view position +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::ViewPositionChanged(const TPoint& aNewPosition, + TBool /*aDrawNow*/, TUint /*aFlags*/) + { + FUNC_LOG; + TInt error(KErrNone); + TRAP( error, iViewPort.SetCenterPositionL(aNewPosition) ); + ERROR_1( error, "iViewPort.SetCenterPositionL failed with error: %d", error ); + } + +// --------------------------------------------------------------------------- +// Physic emulation has finished +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::PhysicEmulationEnded() + { + FUNC_LOG; + iFlags.Clear(EPhysicsOn); + if (iFlags.IsSet(EUpdatePhysicsAfterSimulationFinished)) + { + iFlags.Clear(EUpdatePhysicsAfterSimulationFinished); + TRAP_IGNORE( UpdatePhysicsL() ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TPoint CFsTreeVisualizerBase::ViewPosition() const + { + FUNC_LOG; + return iViewPort.CenterPosition(); + } + +// --------------------------------------------------------------------------- +// Wrapper for SetFocusedItemAndSendEventL to trap the error and return it +// instead of leaving. +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::SetFocusedItemAndSendEvent( + const TFsTreeItemId aItemId, TPointerEventType aEventType ) + { + FUNC_LOG; + TRAPD(error, SetFocusedItemAndSendEventL( aItemId, aEventType ) ); + return error; + } + +// --------------------------------------------------------------------------- +// Sets the specified item as focused and sends event about touch focusing if +// the same item is already focused, action event will be sent instead. +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::SetFocusedItemAndSendEventL( + const TFsTreeItemId aItemId, TPointerEventType aEventType ) + { + FUNC_LOG; + + // Handles all other than pointer up events. + // Focus is drawn when: + // - new item is selected (FocusedItem() != aItemId) + // - pointer is pressed down and focus is not visible by default + // (aEventType == EPointerDown ) && IsFocusShown()) + if( ( aEventType < EPointerUp ) && + ( !iFlags.IsSet( EListFocused ) || FocusedItem() != aItemId || + ( ( aEventType == EPointerDown ) && IsFocusShown() ) ) ) + { + SetFocusedItemL( aItemId ); + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeItemTouchFocused, + FocusedItem() ); + + // If DirectTouchMode (actions happens in pointer down events) + if( iFlags.IsSet( EDirectTouchMode ) && aEventType == EPointerDown ) + { + iTouchPressed = EFalse; + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeItemTouchAction, + aItemId ); + } + } + else if( aEventType == ELongTap ) + { + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeItemTouchLongTap, + aItemId ); + } + else if( aEventType == EPointerUp ) + { + iVisualizerObserver->TreeVisualizerEventL( + MFsTreeVisualizerObserver::EFsTreeItemTouchAction, aItemId ); + } + } + +// CFsTreeVisualizerBase::CDragHandler + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CFsTreeVisualizerBase::CDragHandler* CFsTreeVisualizerBase::CDragHandler::NewL( + CFsTreeVisualizerBase& aTree, const TInt aHighlightTimeout, + const TBitFlagsT& aFlags) + { + FUNC_LOG; + CDragHandler* self = new (ELeave) CDragHandler(aTree, aHighlightTimeout, + aFlags); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CFsTreeVisualizerBase::CDragHandler::~CDragHandler() + { + FUNC_LOG; + delete iHighlightTimer; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CDragHandler::Reset() + { + FUNC_LOG; + iFlags.ClearAll(); + iHighlightTimer->Cancel(); + iItemId = KFsTreeNoneID; + iDragDirection = EDraggingNone; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CFsTreeVisualizerBase::CDragHandler::TDragDirection + CFsTreeVisualizerBase::CDragHandler::DragDirection( + const TPoint& aCurrent, const TPoint aPrevious ) const + { + FUNC_LOG; + if (aCurrent.iY > aPrevious.iY) + { + return EDraggingDown; + } + else if (aCurrent.iY < aPrevious.iY) + { + return EDraggingUp; + } + else + { + return iDragDirection; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CDragHandler::PointerDown( + const TPointerEvent& aEvent, const TFsTreeItemId aItemId) + { + FUNC_LOG; + Reset(); + iItemId = aItemId; + iPosition = aEvent.iParentPosition; + iLastPointerPosition = aEvent.iParentPosition; + iStartTime.HomeTime(); + iFlags.Set( EPointerDownReceived ); + + iTree.SetFocusedItemAndSendEvent( iItemId, EPointerDown ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CDragHandler::PointerRepeat( + const TPointerEvent& /*aEvent*/ ) + { + if( iItemId != KFsTreeNoneID && !IsFlicking() ) + { + iFlags.Set( EWasRepeat ); + iTree.SetFocusedItemAndSendEvent( iItemId, ELongTap ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CDragHandler::PointerUp( + const TPointerEvent& aEvent, const TFsTreeItemId aItemId ) + { + FUNC_LOG; + // If kinetic scrolling is disabled + if( iTree.IsKineticScrollingDisabled() ) + { + if( ( aItemId != KFsTreeNoneID ) && + ( iTree.FocusedItem() == aItemId ) ) + { + iTree.SetFocusedItemAndSendEvent( iItemId, EPointerUp ); + } + } + else if ( IsFlicking() ) + { + TPoint drag(iPosition - aEvent.iParentPosition); + iTree.StartPhysics( drag, iStartTime ); + } + else if( !iFlags.IsSet( EWasRepeat ) && iItemId != KFsTreeNoneID ) + { + iTree.SetFocusedItemAndSendEvent( iItemId, EPointerUp ); + } + iLastPointerPosition = iPosition = TPoint(); + iFlags.Clear( EPointerDownReceived ); + iDragDirection = EDraggingNone; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::CDragHandler::DragDelta( + const TPointerEvent& aEvent) const + { + FUNC_LOG; + return Abs(iPosition.iY - aEvent.iPosition.iY); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TPoint CFsTreeVisualizerBase::CDragHandler::PointerDrag( + const TPointerEvent& aEvent, const TFsTreeItemId /*aItemId*/) + { + FUNC_LOG; + // If kinetic scrolling is disabled + if( iTree.IsKineticScrollingDisabled() ) + { + iLastPointerPosition = iPosition; + return aEvent.iPosition; + } + + if (!iFlags.IsSet(EPointerDownReceived)) + { + iLastPointerPosition = iPosition = aEvent.iPosition; + iFlags.Set(EPointerDownReceived); + } + else + { + iHighlightTimer->Cancel(); + if (!iTreeVisualizerFlags.IsSet(EPhysicsOn)) + { + iTree.SetPanningPosition(TPoint(0, iLastPointerPosition.iY + - aEvent.iPosition.iY)); + } + TDragDirection dragDirection(DragDirection(aEvent.iPosition, iLastPointerPosition)); + const TBool dragDirectionChanged( + (dragDirection == EDraggingUp && iDragDirection == EDraggingDown ) || + (dragDirection == EDraggingDown && iDragDirection == EDraggingUp ) ); + if (dragDirectionChanged) + { + iPosition = aEvent.iPosition; + iStartTime.HomeTime(); + } + iDragDirection = dragDirection; + iLastPointerPosition = aEvent.iPosition; + } + return iPosition - aEvent.iPosition; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CDragHandler::EnableFlicking() + { + FUNC_LOG; + iFlags.Set(EFlicking); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::CDragHandler::IsFlicking() const + { + FUNC_LOG; + return iFlags.IsSet(EFlicking); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CFsTreeVisualizerBase::CDragHandler::CDragHandler( + CFsTreeVisualizerBase& aTree, const TInt aHighlightTimeout, + const TBitFlagsT& aFlags) : + iTree(aTree), iHighlightTimeout(aHighlightTimeout * 1000), + iTreeVisualizerFlags(aFlags) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFsTreeVisualizerBase::CDragHandler::ConstructL() + { + FUNC_LOG; + iHighlightTimer = CPeriodic::NewL(CActive::EPriorityStandard); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CFsTreeVisualizerBase::CDragHandler::HighlightTimerCallback( TAny* aPtr ) + { + FUNC_LOG; + CDragHandler* self = reinterpret_cast( aPtr ); + self->iHighlightTimer->Cancel(); + return self->iTree.SetFocusedItemAndSendEvent( self->iItemId, ELongTap ); + } + +// --------------------------------------------------------------------------- +// CFsTreeVisualizerBase::IsFocusShown +// --------------------------------------------------------------------------- +// +TBool CFsTreeVisualizerBase::IsFocusShown() + { + if( iTouchPressed || iFocusVisible ) + { + return ETrue; + } + return EFalse; + } + + +//