S60 3rd Edition SDK for Symbian OS
Example Applications Guide

LandmarksInfoModel.cpp

00001 /*
00002 * ==============================================================================
00003 *  Name        : LandmarksInfoModel.cpp
00004 *  Part of     : Landmark Reference Application
00005 *  Interface   : -
00006 *  Description : Implements the CLandmarksInfoModel class
00007 *  Version     : 1.0
00008 *
00009 *  Copyright (c) 2004-2006 Nokia Corporation.
00010 *  This material, including documentation and any related 
00011 *  computer programs, is protected by copyright controlled by 
00012 *  Nokia Corporation.
00013 * ==============================================================================
00014 */
00015 
00016 // INCLUDE FILES
00017 #include <eikenv.h>
00018 #include <gulicon.h>
00019 #include <AknsUtils.h>
00020 #include <AknsItemID.h>
00021 
00022 #include <LbsPosition.h>
00023 #include <EPos_CPosLandmark.h>
00024 #include <EPos_CPosLandmarkCategory.h>
00025 
00026 #include <LmRefApp.rsg>
00027 #include "LmRefApp.hrh"
00028 #include "LandmarksInfoModel.h"
00029 #include "LandmarksUtils.h"
00030 #include "LandmarksCommonData.h"
00031 #include "LandmarksApplicationEngine.h"
00032 
00033 const TInt KFieldCaptions[] = 
00034     {
00035     0,                                  // this slot is not used
00036     R_LMREFAPP_LMNAME_LABEL_SHORT,      // ELandmarkNameField
00037     R_LMREFAPP_DESCRIPTION_LABEL_SHORT, // ELandmarkDescField
00038     R_LMREFAPP_CATEGORY_LABEL_SHORT,    // ELandmarkCategoryField    
00039     R_LMREFAPP_LAT_LABEL_SHORT,         // ELandmarkLatitudeField
00040     R_LMREFAPP_LON_LABEL_SHORT,         // ELandmarkLongitudeField
00041     R_LMREFAPP_ALT_LABEL_SHORT,         // ELandmarkAltitudeField
00042     R_LMREFAPP_HOR_ACC_LABEL_SHORT,     // ELandmarkHorAccField
00043     R_LMREFAPP_VER_ACC_LABEL_SHORT,     // ELandmarkVerAccField
00044     R_LMREFAPP_RADIUS_LABEL_SHORT,      // ELandmarkRadiusField
00045     R_LMREFAPP_STREET_LABEL_SHORT,      // ELandmarkStreetField
00046     R_LMREFAPP_POSTAL_LABEL_SHORT,      // ELandmarkPostalField
00047     R_LMREFAPP_CITY_LABEL_SHORT,        // ELandmarkCityField
00048     R_LMREFAPP_COUNTRY_LABEL_SHORT,     // ELandmarkCountryField
00049     };
00050 
00051 // ============================ MEMBER FUNCTIONS ===============================
00052 
00053 // -----------------------------------------------------------------------------
00054 // CLandmarksInfoModel::CLandmarksInfoModel
00055 // C++ constructor can NOT contain any code, that
00056 // might leave.
00057 // -----------------------------------------------------------------------------
00058 //
00059 CLandmarksInfoModel::CLandmarksInfoModel(
00060     CLandmarksApplicationEngine& aEngine)
00061     : iEngine(aEngine)
00062         {
00063     // Configure real format
00064     const TChar KDecimalChar = '.';
00065     iRealFormat.iPlaces = KNrOfDecimals;
00066     iRealFormat.iPoint = KDecimalChar;
00067     iRealFormat.iTriLen = 0;
00068     iRealFormat.iWidth = KPosLmMaxTextFieldLength;
00069     iRealFormat.iType = KRealFormatFixed;
00070         }
00071 
00072 // Destructor
00073 CLandmarksInfoModel::~CLandmarksInfoModel()
00074         {
00075         }
00076 
00077 // -----------------------------------------------------------------------------
00078 // CLandmarksInfoModel::GetLandmarkInfoL
00079 // 
00080 // (other items were commented in a header).
00081 // -----------------------------------------------------------------------------
00082 //
00083 CDesCArray* CLandmarksInfoModel::GetLandmarkInfoL(
00084     CPosLandmark& aLandmark,
00085     RArray<TInt>& aFieldIds)
00086     {
00087     TPtrC fieldValue;
00088     aFieldIds.Reset();
00089 
00090     const TInt KInfoArrayGranularity = 16;
00091     CDesCArray* infoArray = new (ELeave) CDesCArrayFlat(KInfoArrayGranularity);
00092 
00093     // Format landmark name
00094     fieldValue.Set(KNullDesC);
00095     aLandmark.GetLandmarkName(fieldValue);
00096 
00097     AddTextFieldL(ELandmarkNameField, fieldValue, *infoArray, aFieldIds);
00098 
00099     // Format description
00100     fieldValue.Set(KNullDesC);
00101     aLandmark.GetLandmarkDescription(fieldValue);
00102 
00103     AddTextFieldL(ELandmarkDescField, fieldValue, *infoArray, aFieldIds);
00104 
00105     // Format categories
00106     AddCategoryFieldsL(aLandmark, *infoArray, aFieldIds);
00107 
00108     // Format location fields
00109     TLocality location;
00110     aLandmark.GetPosition(location);
00111     AddLocationFieldsL(location, *infoArray, aFieldIds);
00112 
00113     // Format coverage Radius
00114     TReal32 coverageRadius;
00115     TBuf<KPosLmMaxTextFieldLength> radiusBuf;
00116     TInt res = aLandmark.GetCoverageRadius(coverageRadius);
00117     if (res != KErrNotFound)
00118         {
00119         radiusBuf.AppendNum(coverageRadius, iRealFormat);
00120         }
00121 
00122     AddTextFieldL(ELandmarkRadiusField, radiusBuf, *infoArray, aFieldIds);
00123 
00124     // Format street;
00125     fieldValue.Set(KNullDesC);
00126     aLandmark.GetPositionField(EPositionFieldStreet, fieldValue);
00127 
00128     AddTextFieldL(ELandmarkStreetField, fieldValue, *infoArray, aFieldIds);
00129 
00130     // Format postalCode;
00131     fieldValue.Set(KNullDesC);
00132     aLandmark.GetPositionField(EPositionFieldPostalCode, fieldValue);
00133 
00134     AddTextFieldL(ELandmarkPostalField, fieldValue, *infoArray, aFieldIds);
00135 
00136     // Format city;
00137     fieldValue.Set(KNullDesC);
00138     aLandmark.GetPositionField(EPositionFieldCity, fieldValue);
00139 
00140     AddTextFieldL(ELandmarkCityField, fieldValue, *infoArray, aFieldIds);
00141 
00142     // Format country
00143     fieldValue.Set(KNullDesC);
00144     aLandmark.GetPositionField(EPositionFieldCountry, fieldValue);
00145 
00146     AddTextFieldL(ELandmarkCountryField, fieldValue, *infoArray, aFieldIds);
00147     
00148     return infoArray;
00149     }
00150 
00151 // -----------------------------------------------------------------------------
00152 // CLandmarksInfoModel::AddTextFieldL
00153 // 
00154 // (other items were commented in a header).
00155 // -----------------------------------------------------------------------------
00156 //
00157 void CLandmarksInfoModel::AddTextFieldL(
00158     TInt aFieldId, 
00159     TDesC& aText, 
00160     CDesCArray& aArray,
00161     RArray<TInt>& aFieldIds)
00162     {
00163     if (aText.Length())
00164         {
00165         HBufC* caption = CCoeEnv::Static()->
00166             AllocReadResourceAsDes16LC(KFieldCaptions[aFieldId]);
00167 
00168         const TInt KNumTabsAndOther = 10;        
00169         HBufC* item = HBufC::NewLC(
00170             caption->Length() + aText.Length() + KNumTabsAndOther); 
00171             
00172         _LIT(KItemFormat, "%S\t%S\t\t");
00173         item->Des().Format(KItemFormat, caption, &aText); 
00174         
00175         // append new item to the list
00176         aFieldIds.AppendL(aFieldId);
00177         aArray.AppendL(*item); 
00178         CleanupStack::PopAndDestroy(2, caption);
00179         }
00180     }
00181 
00182 // -----------------------------------------------------------------------------
00183 // CLandmarksInfoModel::AddLocationFieldsL
00184 // 
00185 // (other items were commented in a header).
00186 // -----------------------------------------------------------------------------
00187 //
00188 void CLandmarksInfoModel::AddLocationFieldsL(
00189     TLocality& aLocation,
00190     CDesCArray& aArray,
00191     RArray<TInt>& aFieldIds)
00192     {
00193     TBuf<KPosLmMaxTextFieldLength> fieldValue;
00194 
00195     // Format latitude in deg min sec format
00196     LandmarksUtils::LatLongFloatToDegMinSecDesL(aLocation.Latitude(), fieldValue);
00197     AddTextFieldL(ELandmarkLatitudeField, fieldValue, aArray, aFieldIds);
00198     fieldValue.Zero();
00199 
00200     // Format longitude in deg min sec format
00201     LandmarksUtils::LatLongFloatToDegMinSecDesL(aLocation.Longitude(), fieldValue);
00202     AddTextFieldL(ELandmarkLongitudeField, fieldValue, aArray, aFieldIds);
00203     fieldValue.Zero();
00204 
00205     // Format altitude
00206     LandmarksUtils::FloatToDesL(aLocation.Altitude(), fieldValue, iRealFormat);
00207     AddTextFieldL(ELandmarkAltitudeField, fieldValue, aArray, aFieldIds);
00208 
00209     // Format horizontal accuracy
00210     LandmarksUtils::FloatToDesL(aLocation.HorizontalAccuracy(), fieldValue, iRealFormat);
00211     AddTextFieldL(ELandmarkHorAccField, fieldValue, aArray, aFieldIds);
00212 
00213     // Format vertical accuracy
00214     LandmarksUtils::FloatToDesL(aLocation.VerticalAccuracy(), fieldValue, iRealFormat);
00215     AddTextFieldL(ELandmarkVerAccField, fieldValue, aArray, aFieldIds);
00216     }
00217 
00218 // -----------------------------------------------------------------------------
00219 // CLandmarksInfoModel::AddCategoryFieldsL
00220 // 
00221 // (other items were commented in a header).
00222 // -----------------------------------------------------------------------------
00223 //
00224 void CLandmarksInfoModel::AddCategoryFieldsL(
00225     CPosLandmark& aLandmark,
00226     CDesCArray& aArray,
00227     RArray<TInt>& aFieldIds)
00228     {
00229     RArray< TPosLmItemId > categories;
00230     CleanupClosePushL(categories);
00231     aLandmark.GetCategoriesL(categories);
00232     TInt nrOfCategories = categories.Count();
00233     
00234     for (TInt i = 0; i < nrOfCategories; i++)
00235         {
00236         TPtrC categoryName;
00237         CPosLandmarkCategory* category = iEngine.CategoryLC(categories[i]);
00238         category->GetCategoryName(categoryName);
00239 
00240         AddTextFieldL(ELandmarkCategoryField, categoryName, aArray, aFieldIds);
00241 
00242         CleanupStack::PopAndDestroy(category);
00243         }
00244 
00245     CleanupStack::PopAndDestroy(&categories);
00246     }
00247 
00248 
00249 // End of File
00250 

© Nokia 2006

Back to top