landmarks/locationlandmarks/searchclientlib/src/EPos_PosLmDisplayDataHandler.cpp
changeset 0 667063e416a2
child 16 6fcbaa43369c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/searchclientlib/src/EPos_PosLmDisplayDataHandler.cpp	Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,324 @@
+/*
+* Copyright (c) 2002-2005 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: Provides static exported functions for modifying a display data
+*
+*
+*/
+
+
+#include    <EPos_LandmarksErrors.h>
+#include    <EPos_CPosLmDisplayData.h>
+#include    <EPos_CPosLmDisplayItem.h>
+#include    "EPos_PosLmDisplayDataHandler.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmDisplayDataHandler::InsertItemL(
+    CPosLmDisplayData& aDisplayData,
+    CPosLmDisplayItem* aDisplayItem )
+    {
+    RPointerArray<CPosLmDisplayItem>& displayItems = aDisplayData.DisplayItems();
+    InsertItemL( aDisplayData, aDisplayItem, aDisplayData.Count() ); // append to the end
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmDisplayDataHandler::InsertItemInOrderL(
+    CPosLmDisplayData& aDisplayData,
+    CPosLmDisplayItem* aDisplayItem,
+    TPosLmSortPref aSortPref)
+    {
+    __ASSERT_DEBUG(
+        aDisplayItem->DisplayItemType() == CPosLmDisplayItem::ELandmarkItem,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    __ASSERT_DEBUG(
+        aSortPref.LandmarkAttributeToSortBy() == CPosLandmark::ELandmarkName,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    if (aSortPref.SortOrder() == TPosLmSortPref::EAscending)
+        {
+        TLinearOrder<CPosLmDisplayItem>
+            order(PosLmDisplayDataHandler::CompareLandmarkNameAsc);
+        InsertItemInOrderL(aDisplayData, aDisplayItem, order);
+        }
+    else
+        {
+        TLinearOrder<CPosLmDisplayItem>
+            order(PosLmDisplayDataHandler::CompareLandmarkNameDesc);
+        InsertItemInOrderL(aDisplayData, aDisplayItem, order);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmDisplayDataHandler::InsertItemInOrderL(
+    CPosLmDisplayData& aDisplayData,
+    CPosLmDisplayItem* aDisplayItem,
+    CPosLmCategoryManager::TCategorySortPref aSortPref)
+    {
+    __ASSERT_DEBUG(
+        aDisplayItem->DisplayItemType() == CPosLmDisplayItem::ECategoryItem,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    if (aSortPref == CPosLmCategoryManager::ECategorySortOrderNone)
+        {
+        InsertItemL(aDisplayData, aDisplayItem);
+        }
+    else if (aSortPref ==
+        CPosLmCategoryManager::ECategorySortOrderNameAscending)
+        {
+        TLinearOrder<CPosLmDisplayItem>
+            order(PosLmDisplayDataHandler::CompareCategoryNameAsc);
+        InsertItemInOrderL(aDisplayData, aDisplayItem, order);
+        }
+    else
+        {
+        TLinearOrder<CPosLmDisplayItem>
+            order(PosLmDisplayDataHandler::CompareCategoryNameDesc);
+        InsertItemInOrderL(aDisplayData, aDisplayItem, order);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmDisplayDataHandler::InsertInDistanceOrderL(
+    CPosLmDisplayData& aDisplayData,
+    CPosLmDisplayItem* aDisplayItem)
+    {
+    __ASSERT_DEBUG(
+        aDisplayItem->DisplayItemType() == CPosLmDisplayItem::ELandmarkItem,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    TLinearOrder<CPosLmDisplayItem>
+        order(PosLmDisplayDataHandler::CompareLandmarkDistance);
+    InsertItemInOrderL(aDisplayData, aDisplayItem, order);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPosLmDisplayItem* PosLmDisplayDataHandler::RemoveItem(
+    CPosLmDisplayData& /*aDisplayData*/,
+    TInt /*aItemIndex*/)
+    {
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPosLmDisplayItem* PosLmDisplayDataHandler::CopyItemLC(
+    CPosLmDisplayData& aDisplayData,
+    TInt aItemIndex)
+    {
+    RPointerArray<CPosLmDisplayItem>& displayItems =
+        aDisplayData.DisplayItems();
+
+    __ASSERT_DEBUG(aItemIndex >= 0 && aItemIndex < displayItems.Count(),
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    CPosLmDisplayItem* displayItem = displayItems[aItemIndex];
+    TUint dbIndex = displayItem->DatabaseIndex();
+
+    CPosLmDisplayItem* copyItem;
+    if (displayItem->DisplayItemType() == CPosLmDisplayItem::ELandmarkItem)
+        {
+        CPosLandmark* lm = CPosLandmark::NewLC(displayItem->Landmark());
+        copyItem = CPosLmDisplayItem::NewL(lm, dbIndex);
+        CleanupStack::Pop(lm);
+
+        TReal32 distance;
+        if (displayItem->GetDistance(distance) == KErrNone)
+            {
+            copyItem->SetDistance(distance);
+            }
+        }
+    else
+        {
+        CPosLandmarkCategory* category =
+            CPosLandmarkCategory::NewLC(displayItem->Category());
+        copyItem = CPosLmDisplayItem::NewL(category, dbIndex);
+        CleanupStack::Pop(category);
+        }
+
+    CleanupStack::PushL(copyItem);
+    return copyItem;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt PosLmDisplayDataHandler::CompareLandmarkNameAsc(
+    const CPosLmDisplayItem& aFirst,
+    const CPosLmDisplayItem& aSecond)
+    {
+    TPtrC firstLandmarkName;
+    TPtrC secondLandmarkName;
+
+    TInt status = aFirst.Landmark().GetLandmarkName(firstLandmarkName);
+    __ASSERT_DEBUG(status == KErrNone,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    status = aSecond.Landmark().GetLandmarkName(secondLandmarkName);
+    __ASSERT_DEBUG(status == KErrNone,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    return firstLandmarkName.CompareC(secondLandmarkName);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt PosLmDisplayDataHandler::CompareLandmarkNameDesc(
+    const CPosLmDisplayItem& aFirst,
+    const CPosLmDisplayItem& aSecond)
+    {
+    // Switch sign for ascending comparison.
+    return -1 * CompareLandmarkNameAsc(aFirst, aSecond);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt PosLmDisplayDataHandler::CompareLandmarkDistance(
+    const CPosLmDisplayItem& aFirst,
+    const CPosLmDisplayItem& aSecond)
+    {
+    TReal32 firstDistance;
+    TReal32 secondDistance;
+
+    TInt status = aFirst.GetDistance(firstDistance);
+    __ASSERT_DEBUG(status == KErrNone,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    status = aSecond.GetDistance(secondDistance);
+    __ASSERT_DEBUG(status == KErrNone,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    if (firstDistance < secondDistance)
+        {
+        return -1;
+        }
+    else if (firstDistance > secondDistance)
+        {
+        return 1;
+        }
+    else
+        {
+        return 0;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt PosLmDisplayDataHandler::CompareCategoryNameAsc(
+    const CPosLmDisplayItem& aFirst,
+    const CPosLmDisplayItem& aSecond)
+    {
+    TPtrC firstCategoryName;
+    TPtrC secondCategoryName;
+
+    TInt status = aFirst.Category().GetCategoryName(firstCategoryName);
+    __ASSERT_DEBUG(status == KErrNone,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    status = aSecond.Category().GetCategoryName(secondCategoryName);
+    __ASSERT_DEBUG(status == KErrNone,
+        Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
+
+    return firstCategoryName.CompareC(secondCategoryName);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt PosLmDisplayDataHandler::CompareCategoryNameDesc(
+    const CPosLmDisplayItem& aFirst,
+    const CPosLmDisplayItem& aSecond)
+    {
+    // Switch sign for ascending comparison.
+    return -1 * CompareCategoryNameAsc(aFirst, aSecond);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt PosLmDisplayDataHandler::FindItemIndex(
+    CPosLmDisplayData& aDisplayData,
+    CPosLmDisplayItem* aDisplayItem)
+    {
+    return aDisplayData.DisplayItems().Find(aDisplayItem);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void PosLmDisplayDataHandler::InsertItemL(
+    CPosLmDisplayData& aDisplayData,
+    CPosLmDisplayItem* aDisplayItem,
+    TUint aIndex )
+    {
+    RPointerArray<CPosLmDisplayItem>& displayItems =
+        aDisplayData.DisplayItems();
+    RPointerArray<CPosLmDisplayItem>& newDisplayItems =
+        aDisplayData.NewDisplayItems();
+
+    if ( aIndex > displayItems.Count() )
+        aIndex = displayItems.Count();
+    
+    displayItems.InsertL( aDisplayItem, aIndex );
+
+    if ( aIndex > newDisplayItems.Count() )
+        aIndex = newDisplayItems.Count();
+
+    TInt appendStatus = newDisplayItems.Insert( aDisplayItem, aIndex );
+    if ( appendStatus != KErrNone )
+        {
+        displayItems.Remove( aIndex );
+        User::Leave( appendStatus );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void PosLmDisplayDataHandler::InsertItemInOrderL(
+    CPosLmDisplayData& aDisplayData,
+    CPosLmDisplayItem* aDisplayItem,
+    TLinearOrder<CPosLmDisplayItem>& aOrder)
+    {
+    RPointerArray<CPosLmDisplayItem>& displayItems =
+        aDisplayData.DisplayItems();
+    RPointerArray<CPosLmDisplayItem>& newDisplayItems =
+        aDisplayData.NewDisplayItems();
+
+    displayItems.InsertInOrderAllowRepeatsL(aDisplayItem, aOrder);
+
+    TInt appendStatus =
+        newDisplayItems.InsertInOrderAllowRepeats(aDisplayItem, aOrder);
+    if (appendStatus != KErrNone)
+        {
+        displayItems.Remove(displayItems.Find(aDisplayItem));
+        User::Leave(appendStatus);
+        }
+    }
+