basiclocationinfodisplay/blid/ui/src/CBlidOwnPosLBModel.cpp
branchRCL_3
changeset 18 870918037e16
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/basiclocationinfodisplay/blid/ui/src/CBlidOwnPosLBModel.cpp	Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,420 @@
+/*
+* Copyright (c) 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 OwnPosView's details.
+*
+*/
+
+
+// INCLUDE FILES
+#include <StringLoader.h> 
+#include <AknUtils.h>
+#include <blid.rsg>
+#include <aknlocationed.h>
+
+#include "CBlidOwnPosLBModel.h"
+#include "CBlidBaseContainer.h"
+#include "MBlidLocation.h"
+#include "MBlidSettings.h"
+#include "bliduiconsts.h"
+#include "Blid.hrh"
+#include "Blidutils.h"
+#include "lbscommon.h"
+
+
+//CONSTANTS
+
+// ================= MEMBER FUNCTIONS =======================
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::NewLC
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CBlidOwnPosLBModel* CBlidOwnPosLBModel::NewLC( MBlidLocation* aLocationModel,
+                                               MBlidSettings* aSettings )
+    {
+    CBlidOwnPosLBModel* ptr =
+		new (ELeave) CBlidOwnPosLBModel( aLocationModel, aSettings );
+	CleanupStack::PushL(ptr);
+	ptr->ConstructL();
+	return ptr;
+    }
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::CBlidOwnPosLBModel
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------------------------
+//
+CBlidOwnPosLBModel::CBlidOwnPosLBModel(MBlidLocation* aLocationModel,
+                                       MBlidSettings* aSettings ):
+    iLocationModel( aLocationModel ), iSettingsModel( aSettings )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ----------------------------------------------------------------------------
+//
+void CBlidOwnPosLBModel::ConstructL()
+    {
+    CEikonEnv* env = CEikonEnv::Static();
+    iBuffer = HBufC::NewL( KBlidLBLineMaxLen );
+
+    iLocale = new(ELeave)TLocale();
+
+    /// titles  
+    iBlidLatitude = StringLoader::LoadL( R_BLID_POSITION_LATITUDE, env);
+    iBlidLongitude = StringLoader::LoadL( R_BLID_POSITION_LONGITUDE, env);
+    iBlidAccuracy = StringLoader::LoadL( R_BLID_POSITION_ACCURACY, env);
+    iBlidAltAccuracy = StringLoader::LoadL( R_BLID_POSITION_ALTITUDE_ACCURACY, env);
+    //iBlidSpeed = StringLoader::LoadL( R_BLID_POSITION_SPEED, env);
+    iBlidAltitude = StringLoader::LoadL( R_BLID_POSITION_ALTITUDE, env);
+
+    iAccuraryFormatM = env->AllocReadResourceL( R_BLID_METRIC_METER );
+    iAccuraryFormatFt = env->AllocReadResourceL( R_BLID_IMPERIAL_FOOT);
+    iSpeedFormatKmph = env->AllocReadResourceL( R_BLID_METRIC_SPEED );
+    iSpeedFormatMph = env->AllocReadResourceL( R_BLID_IMPERIAL_SPEED );
+    iAltitudeFormatM = env->AllocReadResourceL( R_BLID_METRIC_METER );
+    iAltitudeFormatFt = env->AllocReadResourceL( R_BLID_IMPERIAL_FOOT );
+    iDataBeingCalculated = StringLoader::LoadL( R_BLID_CALCULATING_LIST, env);
+    iConnectGPS = StringLoader::LoadL( R_BLID_CONNECT_GPS_LIST, env);
+    iNotAvailable = env->AllocReadResourceL( R_BLID_NOT_AVAILABLE );
+    iDataBlank = StringLoader::LoadL( R_BLID_BLANK, env);
+    iWaitingGpsData = StringLoader::LoadL( R_BLID_WAITING_GPS_LIST, env);
+    }
+
+// ---------------------------------------------------------
+// CBlidOwnPosLBModel::~CBlidOwnPosLBModel
+// ---------------------------------------------------------
+//
+CBlidOwnPosLBModel::~CBlidOwnPosLBModel()
+    {
+    delete iLocale;
+
+    delete iBlidLatitude;
+    delete iBlidLongitude;
+    delete iBlidAltitude;
+    delete iBlidAltAccuracy;
+    //delete iBlidSpeed;
+    delete iBlidAccuracy;
+
+    delete iBuffer;
+    
+    delete iAccuraryFormatM;
+    delete iAccuraryFormatFt;
+    delete iSpeedFormatKmph;
+    delete iSpeedFormatMph;
+    delete iAltitudeFormatM;
+    delete iAltitudeFormatFt;
+    delete iDataBeingCalculated;
+    delete iConnectGPS;
+    delete iNotAvailable;
+    delete iDataBlank;
+    delete iWaitingGpsData;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::MdcaCount
+// ----------------------------------------------------------------------------
+//
+TInt CBlidOwnPosLBModel::MdcaCount() const
+    {
+    return 5;
+    }
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::MdcaPoint
+// ----------------------------------------------------------------------------
+//
+TPtrC16 CBlidOwnPosLBModel::MdcaPoint(TInt aIndex) const
+    {
+    TPtr ptr( iBuffer->Des() );
+    ptr.Zero();
+    const TPosition position = iLocationModel->GetCurrentPosition();
+    const TCourse course = iLocationModel->GetCourse();
+     
+    switch ( aIndex )
+        {
+        case ELocLatitudeItemId:
+            {            
+            TBuf<KBlidLBItemMaxLen> latitudeString;
+            LatitudeFormat( latitudeString, position );
+
+            ptr.Append( *iBlidLatitude );
+            ptr.Append( EKeyTab ); 
+            ptr.Append( latitudeString );
+            break;
+            }
+        case ELocLongitudeItemId:
+            {
+            TBuf<KBlidLBItemMaxLen> longitudeString;
+            LongitudeFormat( longitudeString, position );
+
+            ptr.Append( *iBlidLongitude );
+            ptr.Append( EKeyTab );
+            ptr.Append( longitudeString );
+            break;
+            }
+        case ELocAccuracyItemId:
+            {
+            TBuf<KBlidLBItemMaxLen> accuracyString;
+            AccuracyFormat( accuracyString, position );
+
+            ptr.Append( *iBlidAccuracy );
+            ptr.Append( EKeyTab );
+            ptr.Append( accuracyString );
+            break;
+            }
+        case ELocAltAccuracyItemId:
+            {
+            TBuf<KBlidLBItemMaxLen> altAccuracyString;
+            altAccuracyFormat( altAccuracyString );
+                        
+            ptr.Append( *iBlidAltAccuracy );
+            ptr.Append( EKeyTab );
+            ptr.Append( altAccuracyString );
+            break;
+            }
+        case ELocAltitudeItemId:
+            {
+            TBuf<KBlidLBItemMaxLen> altitudeString;
+            AltitudeFormat( altitudeString, position );
+
+            ptr.Append( *iBlidAltitude );
+            ptr.Append( EKeyTab );
+            ptr.Append( altitudeString );
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        } //switch
+
+    AknTextUtils::LanguageSpecificNumberConversion( ptr );
+    return iBuffer->Des();
+    }
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::LatitudeFormat
+// ----------------------------------------------------------------------------
+//
+void CBlidOwnPosLBModel::LatitudeFormat( TDes& aLatitudeString,
+                                         TPosition aPosition ) const
+    {
+    TReal latitude = aPosition.Latitude();
+
+    if(!CBlidBaseContainer::IsGPSAvailable() || 
+       !iLocationModel->IsGPSDataAvailable() )
+        {
+        if(iLocationModel->WaitingGPSData())
+        	{
+        	aLatitudeString = *iWaitingGpsData;
+        	}
+        else
+        	{
+        	aLatitudeString = *iConnectGPS;
+        	}	 	
+	 	}
+	else if ( !Math::IsNaN(latitude) )
+        {    
+        HBufC* formatter = NULL;                     
+        TRAP_IGNORE(formatter = 
+                           CAknLocationEditor::DisplayableLocationL(aPosition,CAknLocationEditor::ELatitudeOnly));
+        if(formatter)  
+            {
+            aLatitudeString.Copy(formatter->Des());             
+            delete formatter;
+            }
+        formatter = NULL;
+        }
+    else
+        {   
+    	aLatitudeString = *iDataBeingCalculated;
+    	}    	
+    }
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::LongitudeFormat
+// ----------------------------------------------------------------------------
+//
+void CBlidOwnPosLBModel::LongitudeFormat( TDes& aLongitudeString,
+                                          TPosition aPosition ) const
+    {
+    TReal longitude = aPosition.Longitude();
+    
+    if(!CBlidBaseContainer::IsGPSAvailable() ||
+       !iLocationModel->IsGPSDataAvailable() )
+        {
+        aLongitudeString = *iDataBlank;
+        }
+    else if ( !Math::IsNaN(longitude) )
+        {  
+        HBufC* formatter = NULL;             
+        TRAP_IGNORE(formatter = 
+                           CAknLocationEditor::DisplayableLocationL(aPosition,CAknLocationEditor::ELongitudeOnly));
+
+        if(formatter)  
+            {
+            aLongitudeString.Copy(formatter->Des());             
+            delete formatter;
+            }                           
+        formatter = NULL;
+        }
+    else
+    	{
+   		aLongitudeString = *iDataBeingCalculated;
+    	}
+    }
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::AccuracyFormat
+// ----------------------------------------------------------------------------
+//
+void CBlidOwnPosLBModel::AccuracyFormat( TDes& aAccuracyString,
+                                         TPosition aPosition ) const
+    {
+    TReal accuracy = aPosition.HorizontalAccuracy();
+    TInt result(0);
+    
+    if(!CBlidBaseContainer::IsGPSAvailable() ||
+       !iLocationModel->IsGPSDataAvailable() )
+        {
+        aAccuracyString = *iDataBlank;
+        }
+    else if ( !Math::IsNaN(accuracy) &&
+         BlidUtils::TRealToTInt( accuracy, result) == KErrNone )
+        {        
+        if ( iSettingsModel->UnitOfMeasurement() == EUnitsMetric )
+            {
+            StringLoader::Format( aAccuracyString, *iAccuraryFormatM,
+                                  0, result );
+            }
+        else
+            {
+            if ( BlidUtils::TRealToTInt((accuracy*KMetreToFoot), 
+                result) != KErrNone )
+                {
+                aAccuracyString = *iDataBlank;
+                } 
+            else
+                {
+                StringLoader::Format( aAccuracyString, *iAccuraryFormatFt, 
+                                  0, result );
+                }
+            }
+        }
+    else
+    	{
+      	aAccuracyString = *iDataBeingCalculated;
+    	}
+    }
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::altAccuracyFormat
+// ----------------------------------------------------------------------------
+//
+void CBlidOwnPosLBModel::altAccuracyFormat( TDes& aAltAccuracyString ) const
+    {
+    const TPosition position = iLocationModel->GetCurrentPosition();    
+    const TReal32 altAccuracy = position.VerticalAccuracy();
+    TInt result(0);
+    TBuf<KBlidLBItemMaxLen> altitudeAccString;    
+    AltitudeFormat(altitudeAccString, iLocationModel->GetCurrentPosition());
+    
+    if(!CBlidBaseContainer::IsGPSAvailable() ||
+       !iLocationModel->IsGPSDataAvailable() ||
+       altitudeAccString == *iDataBlank)
+        {
+        aAltAccuracyString = *iDataBlank;
+        }    
+    else if ( !Math::IsNaN(altAccuracy) &&
+         BlidUtils::TRealToTInt( altAccuracy, result) == KErrNone )
+        {        
+        if ( iSettingsModel->UnitOfMeasurement() == EUnitsMetric )
+            {
+            StringLoader::Format( aAltAccuracyString, *iAccuraryFormatM,
+                                  0, result );
+            }
+        else
+            {
+            if ( BlidUtils::TRealToTInt((altAccuracy*KMetreToFoot), 
+                result) != KErrNone )
+                {
+                aAltAccuracyString = *iDataBlank;
+                } 
+            else
+                {
+                StringLoader::Format( aAltAccuracyString, *iAccuraryFormatFt, 
+                                  0, result );
+                }
+            }
+        }
+    else
+        {
+        aAltAccuracyString = *iDataBeingCalculated;
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CBlidOwnPosLBModel::AltitudeFormat
+// ----------------------------------------------------------------------------
+//
+void CBlidOwnPosLBModel::AltitudeFormat( TDes& aAltitudeString,
+                                         TPosition aPosition ) const
+    {
+    TReal altitude = aPosition.Altitude();
+    TInt result(0);
+    
+    if(!CBlidBaseContainer::IsGPSAvailable() || 
+       !iLocationModel->IsGPSDataAvailable() )
+        {
+        aAltitudeString = *iDataBlank;
+        }    
+    else if ( !Math::IsNaN(altitude) &&
+         BlidUtils::TRealToTInt((altitude - iSettingsModel->AltCalibration()),
+         result) == KErrNone )
+        {
+        if ( iSettingsModel->UnitOfMeasurement() == EUnitsMetric )
+            {
+        
+            StringLoader::Format( aAltitudeString, *iAltitudeFormatM, 
+                                  0, result );
+            }
+        else
+            {
+            TInt imperialAlt(0);
+            if ( BlidUtils::TRealToTInt((result*KMetreToFoot),
+                imperialAlt) != KErrNone )
+                {
+                aAltitudeString = *iDataBlank;
+                }
+            else
+                {
+                StringLoader::Format( aAltitudeString, *iAltitudeFormatFt,
+                                  0, imperialAlt );
+                }
+            }
+        }
+    else
+        {
+        aAltitudeString = *iDataBlank;
+        }
+
+    }
+
+// End of File