landmarks/locationlandmarks/searchclientlib/src/EPos_PosLmDisplayDataHandler.cpp
changeset 0 667063e416a2
child 16 6fcbaa43369c
equal deleted inserted replaced
-1:000000000000 0:667063e416a2
       
     1 /*
       
     2 * Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: Provides static exported functions for modifying a display data
       
    15 *
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 #include    <EPos_LandmarksErrors.h>
       
    21 #include    <EPos_CPosLmDisplayData.h>
       
    22 #include    <EPos_CPosLmDisplayItem.h>
       
    23 #include    "EPos_PosLmDisplayDataHandler.h"
       
    24 
       
    25 // ================= MEMBER FUNCTIONS =======================
       
    26 
       
    27 // -----------------------------------------------------------------------------
       
    28 // -----------------------------------------------------------------------------
       
    29 //
       
    30 EXPORT_C void PosLmDisplayDataHandler::InsertItemL(
       
    31     CPosLmDisplayData& aDisplayData,
       
    32     CPosLmDisplayItem* aDisplayItem )
       
    33     {
       
    34     RPointerArray<CPosLmDisplayItem>& displayItems = aDisplayData.DisplayItems();
       
    35     InsertItemL( aDisplayData, aDisplayItem, aDisplayData.Count() ); // append to the end
       
    36     }
       
    37 
       
    38 // -----------------------------------------------------------------------------
       
    39 // -----------------------------------------------------------------------------
       
    40 //
       
    41 EXPORT_C void PosLmDisplayDataHandler::InsertItemInOrderL(
       
    42     CPosLmDisplayData& aDisplayData,
       
    43     CPosLmDisplayItem* aDisplayItem,
       
    44     TPosLmSortPref aSortPref)
       
    45     {
       
    46     __ASSERT_DEBUG(
       
    47         aDisplayItem->DisplayItemType() == CPosLmDisplayItem::ELandmarkItem,
       
    48         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
    49 
       
    50     __ASSERT_DEBUG(
       
    51         aSortPref.LandmarkAttributeToSortBy() == CPosLandmark::ELandmarkName,
       
    52         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
    53 
       
    54     if (aSortPref.SortOrder() == TPosLmSortPref::EAscending)
       
    55         {
       
    56         TLinearOrder<CPosLmDisplayItem>
       
    57             order(PosLmDisplayDataHandler::CompareLandmarkNameAsc);
       
    58         InsertItemInOrderL(aDisplayData, aDisplayItem, order);
       
    59         }
       
    60     else
       
    61         {
       
    62         TLinearOrder<CPosLmDisplayItem>
       
    63             order(PosLmDisplayDataHandler::CompareLandmarkNameDesc);
       
    64         InsertItemInOrderL(aDisplayData, aDisplayItem, order);
       
    65         }
       
    66     }
       
    67 
       
    68 // -----------------------------------------------------------------------------
       
    69 // -----------------------------------------------------------------------------
       
    70 //
       
    71 EXPORT_C void PosLmDisplayDataHandler::InsertItemInOrderL(
       
    72     CPosLmDisplayData& aDisplayData,
       
    73     CPosLmDisplayItem* aDisplayItem,
       
    74     CPosLmCategoryManager::TCategorySortPref aSortPref)
       
    75     {
       
    76     __ASSERT_DEBUG(
       
    77         aDisplayItem->DisplayItemType() == CPosLmDisplayItem::ECategoryItem,
       
    78         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
    79 
       
    80     if (aSortPref == CPosLmCategoryManager::ECategorySortOrderNone)
       
    81         {
       
    82         InsertItemL(aDisplayData, aDisplayItem);
       
    83         }
       
    84     else if (aSortPref ==
       
    85         CPosLmCategoryManager::ECategorySortOrderNameAscending)
       
    86         {
       
    87         TLinearOrder<CPosLmDisplayItem>
       
    88             order(PosLmDisplayDataHandler::CompareCategoryNameAsc);
       
    89         InsertItemInOrderL(aDisplayData, aDisplayItem, order);
       
    90         }
       
    91     else
       
    92         {
       
    93         TLinearOrder<CPosLmDisplayItem>
       
    94             order(PosLmDisplayDataHandler::CompareCategoryNameDesc);
       
    95         InsertItemInOrderL(aDisplayData, aDisplayItem, order);
       
    96         }
       
    97     }
       
    98 
       
    99 // -----------------------------------------------------------------------------
       
   100 // -----------------------------------------------------------------------------
       
   101 //
       
   102 EXPORT_C void PosLmDisplayDataHandler::InsertInDistanceOrderL(
       
   103     CPosLmDisplayData& aDisplayData,
       
   104     CPosLmDisplayItem* aDisplayItem)
       
   105     {
       
   106     __ASSERT_DEBUG(
       
   107         aDisplayItem->DisplayItemType() == CPosLmDisplayItem::ELandmarkItem,
       
   108         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
   109 
       
   110     TLinearOrder<CPosLmDisplayItem>
       
   111         order(PosLmDisplayDataHandler::CompareLandmarkDistance);
       
   112     InsertItemInOrderL(aDisplayData, aDisplayItem, order);
       
   113     }
       
   114 
       
   115 // -----------------------------------------------------------------------------
       
   116 // -----------------------------------------------------------------------------
       
   117 //
       
   118 EXPORT_C CPosLmDisplayItem* PosLmDisplayDataHandler::RemoveItem(
       
   119     CPosLmDisplayData& /*aDisplayData*/,
       
   120     TInt /*aItemIndex*/)
       
   121     {
       
   122     return NULL;
       
   123     }
       
   124 
       
   125 // -----------------------------------------------------------------------------
       
   126 // -----------------------------------------------------------------------------
       
   127 //
       
   128 EXPORT_C CPosLmDisplayItem* PosLmDisplayDataHandler::CopyItemLC(
       
   129     CPosLmDisplayData& aDisplayData,
       
   130     TInt aItemIndex)
       
   131     {
       
   132     RPointerArray<CPosLmDisplayItem>& displayItems =
       
   133         aDisplayData.DisplayItems();
       
   134 
       
   135     __ASSERT_DEBUG(aItemIndex >= 0 && aItemIndex < displayItems.Count(),
       
   136         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
   137 
       
   138     CPosLmDisplayItem* displayItem = displayItems[aItemIndex];
       
   139     TUint dbIndex = displayItem->DatabaseIndex();
       
   140 
       
   141     CPosLmDisplayItem* copyItem;
       
   142     if (displayItem->DisplayItemType() == CPosLmDisplayItem::ELandmarkItem)
       
   143         {
       
   144         CPosLandmark* lm = CPosLandmark::NewLC(displayItem->Landmark());
       
   145         copyItem = CPosLmDisplayItem::NewL(lm, dbIndex);
       
   146         CleanupStack::Pop(lm);
       
   147 
       
   148         TReal32 distance;
       
   149         if (displayItem->GetDistance(distance) == KErrNone)
       
   150             {
       
   151             copyItem->SetDistance(distance);
       
   152             }
       
   153         }
       
   154     else
       
   155         {
       
   156         CPosLandmarkCategory* category =
       
   157             CPosLandmarkCategory::NewLC(displayItem->Category());
       
   158         copyItem = CPosLmDisplayItem::NewL(category, dbIndex);
       
   159         CleanupStack::Pop(category);
       
   160         }
       
   161 
       
   162     CleanupStack::PushL(copyItem);
       
   163     return copyItem;
       
   164     }
       
   165 
       
   166 // -----------------------------------------------------------------------------
       
   167 // -----------------------------------------------------------------------------
       
   168 //
       
   169 TInt PosLmDisplayDataHandler::CompareLandmarkNameAsc(
       
   170     const CPosLmDisplayItem& aFirst,
       
   171     const CPosLmDisplayItem& aSecond)
       
   172     {
       
   173     TPtrC firstLandmarkName;
       
   174     TPtrC secondLandmarkName;
       
   175 
       
   176     TInt status = aFirst.Landmark().GetLandmarkName(firstLandmarkName);
       
   177     __ASSERT_DEBUG(status == KErrNone,
       
   178         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
   179 
       
   180     status = aSecond.Landmark().GetLandmarkName(secondLandmarkName);
       
   181     __ASSERT_DEBUG(status == KErrNone,
       
   182         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
   183 
       
   184     return firstLandmarkName.CompareC(secondLandmarkName);
       
   185     }
       
   186 
       
   187 // -----------------------------------------------------------------------------
       
   188 // -----------------------------------------------------------------------------
       
   189 //
       
   190 TInt PosLmDisplayDataHandler::CompareLandmarkNameDesc(
       
   191     const CPosLmDisplayItem& aFirst,
       
   192     const CPosLmDisplayItem& aSecond)
       
   193     {
       
   194     // Switch sign for ascending comparison.
       
   195     return -1 * CompareLandmarkNameAsc(aFirst, aSecond);
       
   196     }
       
   197 
       
   198 // -----------------------------------------------------------------------------
       
   199 // -----------------------------------------------------------------------------
       
   200 //
       
   201 TInt PosLmDisplayDataHandler::CompareLandmarkDistance(
       
   202     const CPosLmDisplayItem& aFirst,
       
   203     const CPosLmDisplayItem& aSecond)
       
   204     {
       
   205     TReal32 firstDistance;
       
   206     TReal32 secondDistance;
       
   207 
       
   208     TInt status = aFirst.GetDistance(firstDistance);
       
   209     __ASSERT_DEBUG(status == KErrNone,
       
   210         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
   211 
       
   212     status = aSecond.GetDistance(secondDistance);
       
   213     __ASSERT_DEBUG(status == KErrNone,
       
   214         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
   215 
       
   216     if (firstDistance < secondDistance)
       
   217         {
       
   218         return -1;
       
   219         }
       
   220     else if (firstDistance > secondDistance)
       
   221         {
       
   222         return 1;
       
   223         }
       
   224     else
       
   225         {
       
   226         return 0;
       
   227         }
       
   228     }
       
   229 
       
   230 // -----------------------------------------------------------------------------
       
   231 // -----------------------------------------------------------------------------
       
   232 //
       
   233 TInt PosLmDisplayDataHandler::CompareCategoryNameAsc(
       
   234     const CPosLmDisplayItem& aFirst,
       
   235     const CPosLmDisplayItem& aSecond)
       
   236     {
       
   237     TPtrC firstCategoryName;
       
   238     TPtrC secondCategoryName;
       
   239 
       
   240     TInt status = aFirst.Category().GetCategoryName(firstCategoryName);
       
   241     __ASSERT_DEBUG(status == KErrNone,
       
   242         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
   243 
       
   244     status = aSecond.Category().GetCategoryName(secondCategoryName);
       
   245     __ASSERT_DEBUG(status == KErrNone,
       
   246         Panic(KPosLandmarksClientPanic, EPosLmInvalidArgument));
       
   247 
       
   248     return firstCategoryName.CompareC(secondCategoryName);
       
   249     }
       
   250 
       
   251 // -----------------------------------------------------------------------------
       
   252 // -----------------------------------------------------------------------------
       
   253 //
       
   254 TInt PosLmDisplayDataHandler::CompareCategoryNameDesc(
       
   255     const CPosLmDisplayItem& aFirst,
       
   256     const CPosLmDisplayItem& aSecond)
       
   257     {
       
   258     // Switch sign for ascending comparison.
       
   259     return -1 * CompareCategoryNameAsc(aFirst, aSecond);
       
   260     }
       
   261 
       
   262 // -----------------------------------------------------------------------------
       
   263 // -----------------------------------------------------------------------------
       
   264 //
       
   265 EXPORT_C TInt PosLmDisplayDataHandler::FindItemIndex(
       
   266     CPosLmDisplayData& aDisplayData,
       
   267     CPosLmDisplayItem* aDisplayItem)
       
   268     {
       
   269     return aDisplayData.DisplayItems().Find(aDisplayItem);
       
   270     }
       
   271 
       
   272 // -----------------------------------------------------------------------------
       
   273 // -----------------------------------------------------------------------------
       
   274 //
       
   275 EXPORT_C void PosLmDisplayDataHandler::InsertItemL(
       
   276     CPosLmDisplayData& aDisplayData,
       
   277     CPosLmDisplayItem* aDisplayItem,
       
   278     TUint aIndex )
       
   279     {
       
   280     RPointerArray<CPosLmDisplayItem>& displayItems =
       
   281         aDisplayData.DisplayItems();
       
   282     RPointerArray<CPosLmDisplayItem>& newDisplayItems =
       
   283         aDisplayData.NewDisplayItems();
       
   284 
       
   285     if ( aIndex > displayItems.Count() )
       
   286         aIndex = displayItems.Count();
       
   287     
       
   288     displayItems.InsertL( aDisplayItem, aIndex );
       
   289 
       
   290     if ( aIndex > newDisplayItems.Count() )
       
   291         aIndex = newDisplayItems.Count();
       
   292 
       
   293     TInt appendStatus = newDisplayItems.Insert( aDisplayItem, aIndex );
       
   294     if ( appendStatus != KErrNone )
       
   295         {
       
   296         displayItems.Remove( aIndex );
       
   297         User::Leave( appendStatus );
       
   298         }
       
   299     }
       
   300 
       
   301 // -----------------------------------------------------------------------------
       
   302 // -----------------------------------------------------------------------------
       
   303 //
       
   304 void PosLmDisplayDataHandler::InsertItemInOrderL(
       
   305     CPosLmDisplayData& aDisplayData,
       
   306     CPosLmDisplayItem* aDisplayItem,
       
   307     TLinearOrder<CPosLmDisplayItem>& aOrder)
       
   308     {
       
   309     RPointerArray<CPosLmDisplayItem>& displayItems =
       
   310         aDisplayData.DisplayItems();
       
   311     RPointerArray<CPosLmDisplayItem>& newDisplayItems =
       
   312         aDisplayData.NewDisplayItems();
       
   313 
       
   314     displayItems.InsertInOrderAllowRepeatsL(aDisplayItem, aOrder);
       
   315 
       
   316     TInt appendStatus =
       
   317         newDisplayItems.InsertInOrderAllowRepeats(aDisplayItem, aOrder);
       
   318     if (appendStatus != KErrNone)
       
   319         {
       
   320         displayItems.Remove(displayItems.Find(aDisplayItem));
       
   321         User::Leave(appendStatus);
       
   322         }
       
   323     }
       
   324