--- a/mapnavproviderrefapp/src/mnrpmapmodel.cpp Thu Aug 19 09:48:36 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1251 +0,0 @@
-/*
-* Copyright (c) 2006-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: CMnrpMapModel class implementation
-*
-*/
-
-
-
-#include <coemain.h>
-#include <barsread.h>
-#include <bautils.h>
-
-#include <aknlists.h>
-#include <AknIconUtils.h>
-#include <AknWaitDialog.h>
-
-#include <fbs.h>
-#include <imageconversion.h>
-#include <icl/imagedata.h>
-
-#include <lbs.h>
-#include <lbsposition.h>
-#include <lbspositioninfo.h>
-
-#include <EPos_CPosLandmark.h>
-#include <EPos_CPosLandmarkDatabase.h>
-#include <EPos_CPosLandmarkCategory.h>
-#include <EPos_CPosLmCategoryManager.h>
-
-#include "debug.h"
-#include "mnrpengine.h"
-#include "mnrputils.h"
-#include "mnrpappserver.h"
-
-#include "mnrpmapviewservice.h"
-#ifdef RD_MAPNAV_BITMAP_ACCESS
-#include "mnrpmapimageservice.h"
-#endif
-#include "mnrpmapmodel.h"
-
-const TInt KUpdateInterval = 1 * 1000 * 1000; // 1 sec
-const TInt KUpdateTimeout = 10 * 1000 * 1000; // 10 sec
-
-const TInt KMaxX = 180;
-const TInt KMinX = -180;
-const TInt KMapWidth = KMaxX - KMinX;
-
-const TInt KMaxY = 90;
-const TInt KMinY = -90;
-const TInt KMapHeight = KMaxY - KMinY;
-
-const TReal KDegree = 1.0;
-const TReal KMinute = KDegree / 60.0;
-const TReal KSecond = KMinute / 60.0;
-const TReal KMilliSecond = KSecond / 1000.0;
-
-const TReal KMaxCell = 60 * KDegree;
-const TReal KMinScale = 10 * KMilliSecond; // 0.01 second / 1 px
-
-const TInt KBigCellsInView = 2;
-
-const TInt KCellDividers[] = { 6, 2, 5 };
-const TInt KNumCellDividers = 3;
-
-const TReal KDefaultRadius = 1; // 1 degree
-const TReal KRadiusBorderFactor = 1.1; // 110%
-
-const TReal KEarthEquator = 40075000;
-//const TReal KEarthRadius = 6371010;
-
-const TInt KLmTextOffset = 3;
-const TInt KLmTextShadowOffset = 1;
-
-const TInt KGridPenSize( 1 );
-
-// ============================ LOCAL FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-TPoint AbsoluteToImage( TRealPoint aAbsolute, TReal aImageToAbsoluteScale )
- {
- TInt s = ( KMapWidth / 2 + aAbsolute.iX ) / aImageToAbsoluteScale;
- TInt t = ( KMapHeight / 2 - aAbsolute.iY ) / aImageToAbsoluteScale;
-
- return TPoint( s , t );
- }
-
-// ============================ MEMBER CLASSES' FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// TRealPoint implementation
-// -----------------------------------------------------------------------------
-//
-
-TRealPoint::TRealPoint()
- {
- TRealX nan;
- nan.SetNaN();
-
- iX = nan;
- iY = nan;
- }
-
-TRealPoint::TRealPoint( TReal aX, TReal aY )
- : iX( aX ), iY( aY )
- {
- }
-
-TRealPoint::TRealPoint( TCoordinate aCoordinate )
- : iX( aCoordinate.Longitude() ), iY( aCoordinate.Latitude() )
- {
- }
-
-TCoordinate TRealPoint::Coordinate()
- {
- return TCoordinate( iY, iX );
- }
-
-TRealPoint TRealPoint::operator+(
- const TRealPoint& aRight )
- {
- return TRealPoint( this->iX + aRight.iX, this->iY + aRight.iY );
- }
-
-TRealPoint TRealPoint::operator-(
- const TRealPoint& aRight )
- {
- return TRealPoint( this->iX - aRight.iX, this->iY - aRight.iY );
- }
-
-TRealPoint TRealPoint::operator*( const TReal& aRight )
- {
- return TRealPoint( this->iX * aRight, this->iY * aRight );
- }
-
-TRealPoint TRealPoint::operator/( const TReal& aRight )
- {
- return TRealPoint( this->iX / aRight, this->iY / aRight );
- }
-
-void TRealPoint::Set( TReal aX, TReal aY )
- {
- iX = aX;
- iY = aY;
- }
-
-TBool TRealPoint::IsValid()
- {
- return ( !Math::IsNaN( iX ) && !Math::IsNaN( iY ) );
- }
-
-// -----------------------------------------------------------------------------
-// CDrawItem implementation
-// -----------------------------------------------------------------------------
-//
-CMnrpMapModel::CDrawItem* CMnrpMapModel::CDrawItem::NewLC(
- const CPosLandmark& aLm )
- {
- CDrawItem* self = new (ELeave) CDrawItem;
- CleanupStack::PushL( self );
-
- TPtrC name;
- aLm.GetLandmarkName( name );
- self->iText = MnrpUtils::PrintableStringLC( name );
- CleanupStack::Pop( self->iText );
-
- TLocality loc;
- if ( KErrNone == aLm.GetPosition( loc ) )
- {
- self->SetAbsolutePosition( loc );
- }
-
- TPtrC iconFile;
- TInt iconIndex, maskIndex;
- if ( KErrNone == aLm.GetIcon( iconFile, iconIndex, maskIndex ) )
- {
- AknIconUtils::CreateIconL( self->iBitmap, self->iMask, iconFile, iconIndex, maskIndex );
- AknIconUtils::PreserveIconData( self->iBitmap );
- }
-
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-CMnrpMapModel::CDrawItem* CMnrpMapModel::CDrawItem::NewLC(
- const CPosLandmark& aLm,
- CPosLmCategoryManager& aCatman )
- {
- CDrawItem* self = NewLC( aLm );
-
- if ( !self->iBitmap )
- {
- // try icon from category
- RArray<TPosLmItemId> cats;
- CleanupClosePushL( cats );
- aLm.GetCategoriesL( cats );
-
- if ( cats.Count() == 1 )
- {
- CPosLandmarkCategory* cat = aCatman.ReadCategoryLC( cats[0] );
-
- TPtrC iconFile;
- TInt iconIndex, maskIndex;
- if ( KErrNone == cat->GetIcon( iconFile, iconIndex, maskIndex ) )
- {
- AknIconUtils::CreateIconL( self->iBitmap, self->iMask, iconFile, iconIndex, maskIndex );
- AknIconUtils::PreserveIconData( self->iBitmap );
- }
-
- CleanupStack::PopAndDestroy( cat );
- }
- CleanupStack::PopAndDestroy( &cats );
- }
-
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::CDrawItem::SetAbsolutePosition( const TLocality& aLocality )
- {
- iAbsolutePosition = TRealPoint( aLocality.Longitude(), aLocality.Latitude() );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-CMnrpMapModel::CDrawItem::~CDrawItem()
- {
- if ( iBitmap )
- {
- AknIconUtils::DestroyIconData( iBitmap );
- }
- delete iBitmap;
- delete iMask;
- delete iText;
- }
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-CMnrpMapModel::CMnrpMapModel(
- MMapModelObserver& aObserver,
- CMnrpEngine& aEngine )
- :
- iObserver( &aObserver ), iEngine( aEngine )
- {
- iScale = 1;
- iViewOrigin.Set( 0, 0 );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-CMnrpMapModel::CMnrpMapModel( CMnrpEngine& aEngine )
- : iEngine( aEngine )
- {
- iScale = 1;
- iViewOrigin.Set( 0, 0 );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-CMnrpMapModel::~CMnrpMapModel()
- {
- delete iPositionRequest;
- iDrawItems.ResetAndDestroy();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C CMnrpMapModel* CMnrpMapModel::NewL(
- MMapModelObserver& aObserver,
- CMnrpEngine& aEngine )
- {
- CMnrpMapModel* self = new (ELeave) CMnrpMapModel( aObserver, aEngine );
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop( self );
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C CMnrpMapModel* CMnrpMapModel::NewL( CMnrpEngine& aEngine )
- {
- CMnrpMapModel* self = new (ELeave) CMnrpMapModel( aEngine );
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop( self );
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::ConstructL()
- {
- _LIT( KRequestorName, "MnRefProvider" );
- iPositionRequest = CMnrpPositionRequest::NewL( KRequestorName, *this );
-
- TPositionUpdateOptions options;
- options.SetUpdateInterval( TTimeIntervalMicroSeconds( KUpdateInterval ) );
- options.SetUpdateTimeOut( TTimeIntervalMicroSeconds( KUpdateTimeout ) );
- iPositionRequest->SetOptionsL( options );
-
- AddCitiesL();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-TBool CMnrpMapModel::CheckDrawItemHasPositionL( CDrawItem& aItem, const CPosLandmark& aLandmark )
- {
- if ( !aItem.AbsolutePosition().IsValid() )
- {
- // try to find coordinate by address
- CPosLandmark* poi = iEngine.AddressToCoordL( aLandmark );
- if ( poi )
- {
- TLocality pos;
- poi->GetPosition( pos );
- aItem.SetAbsolutePosition( pos );
- }
- delete poi;
- }
-
- return aItem.AbsolutePosition().IsValid();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::UpdateModelL( CMnrpMapViewService& aService )
- {
- ASSERT( iObserver );
-
- iDrawItems.ResetAndDestroy();
-
- iShowCurrentLocation =
- aService.CurrentLocationOption() != CMnMapView::ECurrentLocationDisabled;
-
- if ( iShowCurrentLocation )
- {
- iPositionRequest->FetchNewPosition();
- }
-
- // Add client-defined marks
-
- iNumIgnoredLandmarks = 0;
- TRealPoint min, max;
-
- // add non-linked landmarks
- for ( TInt i = 0; i < aService.LandmarksToShow().Count(); i++)
- {
- const CPosLandmark* lm = aService.LandmarksToShow()[i];
-
- CDrawItem* item = CDrawItem::NewLC( *lm );
- if ( CheckDrawItemHasPositionL( *item, *lm ) )
- {
- iDrawItems.AppendL( item );
- CleanupStack::Pop( item );
- AdjustBoundingBox( *item, min, max );
- }
- else
- {
- CleanupStack::PopAndDestroy( item );
- iNumIgnoredLandmarks++;
- }
- }
-
- // add linked landmarks
- for ( TInt db = 0; db < aService.LandmarksToShowDatabases().Count(); db++ )
- {
- const HBufC* uri = aService.LandmarksToShowDatabases()[db];
-
- LOG1("MnRefProvider::LinkedLandmarks: database (%S)", uri );
-
- CPosLandmarkDatabase* lmdb = CPosLandmarkDatabase::OpenL( *uri );
- CleanupStack::PushL( lmdb );
-
- if ( lmdb->IsInitializingNeeded() )
- {
- ExecuteAndDeleteLD( lmdb->InitializeL() );
- }
-
- CPosLmCategoryManager* catman = CPosLmCategoryManager::NewL( *lmdb );
- CleanupStack::PushL( catman );
-
- for ( TInt i = 0; i < aService.LinkedLandmarksToShow(db).Count(); i++)
- {
- TPosLmItemId id = aService.LinkedLandmarksToShow(db)[i];
- LOG1("MnRefProvider::LinkedLandmarks: id (%d)", id );
-
- CPosLandmark* lm = lmdb->ReadLandmarkLC( id );
-
- CDrawItem* item = CDrawItem::NewLC( *lm, *catman );
- if ( CheckDrawItemHasPositionL( *item, *lm ) )
- {
- iDrawItems.AppendL( item );
- CleanupStack::Pop( item );
- AdjustBoundingBox( *item, min, max );
- }
- else
- {
- CleanupStack::PopAndDestroy( item );
- iNumIgnoredLandmarks++;
- }
-
- CleanupStack::PopAndDestroy( lm );
- }
-
- CleanupStack::PopAndDestroy( catman );
- CleanupStack::PopAndDestroy( lmdb );
- }
-
- // Add predefined places
- AddCitiesL();
-
- LOG4("MnRefProvider::BoundingBox: %f, %f, %f, %f", min.iX, min.iY, max.iX, max.iY );
-
- // set origin
- iUseCurrentLocationAsOrigin = EFalse;
- if ( aService.IsAreaCentralPointSet() )
- {
- TCoordinate center;
- aService.GetAreaCentralPoint( center );
- iViewOrigin.Set( center.Longitude(), center.Latitude() );
- }
- else if ( !Math::IsNaN( max.iX ) ) // others are also valid then
- {
- iViewOrigin.Set( ( max.iX + min.iX ) / 2, ( max.iY + min.iY ) / 2 );
- }
- else if ( iShowCurrentLocation )
- {
- // get current location and use it as center point
- // this implementation defers location acquiring
- iUseCurrentLocationAsOrigin = ETrue;
- // FetchCurrentLocation();
- iViewOrigin.Set( 0, 0 );
- }
- else
- {
- iViewOrigin.Set( 0, 0 );
- }
-
- LOG2("MnRefProvider: viewOrigin (%f, %f)", iViewOrigin.iX, iViewOrigin.iY);
-
- // set scale
- TReal desiredScale = 0;
- TReal radius = 0;
-
- if ( !Math::IsNaN( aService.AreaRadius() ) )
- {
- // Radius setting is easy in this implementation
- // because map is rectangular just convert meters to degrees
- radius = Abs( aService.AreaRadius() ) / KEarthEquator * 360;
- LOG1("MnRefProvider: user radius (%f)", radius );
- }
- else if ( !Math::IsNaN( max.iX ) ) // others are also valid then
- {
- // get radius from bounding box
- radius = Max( Abs( max.iX - min.iX ), Abs( max.iY - min.iY ) );
- LOG2("MnRefProvider: bounding radius (%f), with border (%f)", radius, radius * KRadiusBorderFactor );
- radius *= KRadiusBorderFactor;
- }
- else
- {
- // default radius
- }
-
- if ( radius <= 0 )
- {
- radius = KDefaultRadius;
- LOG1("MnRefProvider: default radius (%f)", radius );
- }
-
- desiredScale = radius / TReal( Max( iScreenSize.iWidth, iScreenSize.iHeight ) );
-
- LOG3("MnRefProvider: desired scale (%f), min (%f), max(%f)",
- desiredScale, KMinScale, MaxScale() );
-
- iScale = Max( Min( desiredScale, MaxScale() ), KMinScale );
- CheckBorders();
-
- LOG1("MnRefProvider: scale (%f)", iScale );
-
- iObserver->HandleModelUpdateL();
- }
-
-
-#ifdef RD_MAPNAV_BITMAP_ACCESS
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::UpdateModelL( const CMnrpMapImageService& aService )
- {
- iDrawItems.ResetAndDestroy();
-
- iShowCurrentLocation =
- aService.ShowOptions() & CMnMapImage::EShowOptionCurrentLocation;
-
- if ( iShowCurrentLocation )
- {
- iPositionRequest->FetchNewPosition();
- }
-
- if ( aService.ShowOptions() & CMnMapImage::EShowOptionLandmarks)
- {
-
- // Add user-defined marks
- TRealPoint min, max;
-
- // add default landmarks
- CPosLandmarkDatabase* lmdb = CPosLandmarkDatabase::OpenL();
- CleanupStack::PushL( lmdb );
-
- if ( lmdb->IsInitializingNeeded() )
- {
- ExecuteAndDeleteLD( lmdb->InitializeL() );
- }
-
- CPosLmCategoryManager* catman = CPosLmCategoryManager::NewL( *lmdb );
- CleanupStack::PushL( catman );
-
- CPosLmItemIterator* iter = lmdb->LandmarkIteratorL();
- CleanupStack::PushL( iter );
-
- TInt count = iter->NumOfItemsL();
- for ( TInt i = 0; i < count; i++)
- {
- TPosLmItemId id = iter->NextL();
-
- CPosLandmark* lm = lmdb->ReadLandmarkLC( id );
-
- CDrawItem* item = CDrawItem::NewLC( *lm, *catman );
- if ( CheckDrawItemHasPositionL( *item, *lm ) )
- {
- iDrawItems.AppendL( item );
- CleanupStack::Pop( item );
- AdjustBoundingBox( *item, min, max );
- }
- else
- {
- CleanupStack::PopAndDestroy( item );
- }
-
- CleanupStack::PopAndDestroy( lm );
- }
- CleanupStack::PopAndDestroy( iter );
- CleanupStack::PopAndDestroy( catman );
- CleanupStack::PopAndDestroy( lmdb );
-
- LOG4("MnRefProvider::BoundingBox: %f, %f, %f, %f", min.iX, min.iY, max.iX, max.iY );
- }
-
- if ( aService.ShowOptions() & CMnMapImage::EShowOptionPois )
- {
- // Add predefined places
- AddCitiesL();
- }
-
- TMnMapImageParams params = aService.MapImageParams();
-
- UpdateModel( params );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::UpdateModel( const TMnMapImageParams& aParams )
- {
- SetScreenSize( aParams.Size() );
-
- TCoordinate center;
- aParams.GetCenterPoint( center );
- iViewOrigin.Set( center.Longitude(), center.Latitude() );
-
- LOG2("MnRefProvider: viewOrigin (%f, %f)", iViewOrigin.iX, iViewOrigin.iY);
-
- // set scale
- TReal desiredScale = 0;
- TReal32 width, height;
- aParams.GetVisibleArea( width, height );
- TReal radius = Max( width, height );
-
- if ( radius <= 0 )
- {
- radius = KDefaultRadius;
- LOG1("MnRefProvider: default radius (%f)", radius );
- }
-
- desiredScale = radius / TReal( Max( iScreenSize.iWidth, iScreenSize.iHeight ) );
-
- LOG3("MnRefProvider: desired scale (%f), min (%f), max(%f)",
- desiredScale, KMinScale, MaxScale() );
-
- iScale = Max( Min( desiredScale, MaxScale() ), KMinScale );
- CheckBorders();
-
- LOG1("MnRefProvider: scale (%f)", iScale );
- }
-#endif
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::AddCitiesL()
- {
- TArray<CPosLandmark*> places = iEngine.KnownPlacesL();
- for ( TInt i = 0; i < places.Count(); i++)
- {
- CPosLandmark* lm = places[i];
- CDrawItem* item = CDrawItem::NewLC( *lm );
- item->iOwnPoi = ETrue;
- iDrawItems.AppendL( item );
- CleanupStack::Pop( item );
- }
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::GetGrid( CMnrpMapModel::TGrid& aGrid ) const
- {
- TReal angle = Min( Width(), Height() );
-
- TReal minAngle = Min( iScreenSize.iWidth, iScreenSize.iHeight ) * KMinScale;
-
- if ( angle > minAngle )
- {
- // 1. Find nice grid scale
-
- TInt dividerIndex = 0;
- TReal cellSize = KMaxCell;
-
- while ( cellSize * KBigCellsInView > angle )
- {
- cellSize /= KCellDividers[dividerIndex];
-
- if ( ++dividerIndex == KNumCellDividers )
- {
- dividerIndex = 0;
- }
- }
-
- aGrid.iAbsoluteGridStep = cellSize;
-
- // 2. Find closest grid point
-
- TReal x = TInt( iViewOrigin.iX / cellSize ) * cellSize;
- TReal y = TInt( iViewOrigin.iY / cellSize ) * cellSize;
-
- aGrid.iAbsoluteReference = TRealPoint( x, y ).Coordinate();
- }
- else
- {
- aGrid.iAbsoluteReference = TCoordinate( 0, 0 );
- aGrid.iAbsoluteGridStep = minAngle / KBigCellsInView;
- }
-
- // convert to screen coordinates
- aGrid.iReference = AbsoluteToScreen( aGrid.iAbsoluteReference );
- aGrid.iGridStep = AbsoluteToScreen( aGrid.iAbsoluteGridStep );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::Zoom( TReal aZoomRate )
- {
- iScale *= aZoomRate;
- CheckBorders();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::GoCenter()
- {
- iViewOrigin.Set( 0, 0 );
- CheckBorders();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::MoveTo( TCoordinate aTarget )
- {
- iViewOrigin = aTarget;
- CheckBorders();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::CheckBorders()
- {
- if ( Height() > KMapHeight || Width() > KMapWidth )
- {
- iScale = MaxScale();
- }
- if ( iScale < KMinScale )
- {
- iScale = KMinScale;
- }
- if ( Left() < KMinX )
- {
- iViewOrigin.iX = KMinX + Width() / 2;
- }
- if ( Right() > KMaxX )
- {
- iViewOrigin.iX = KMaxX - Width() / 2;
- }
- if ( Top() > KMaxY )
- {
- iViewOrigin.iY = KMaxY - Height() / 2;
- }
- if ( Bottom() < KMinY )
- {
- iViewOrigin.iY = KMinY + Height() / 2;
- }
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TReal CMnrpMapModel::Left() const
- {
- return iViewOrigin.iX - Width() / 2;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TReal CMnrpMapModel::Right() const
- {
- return iViewOrigin.iX + Width() / 2;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TReal CMnrpMapModel::Top() const
- {
- return iViewOrigin.iY + Height() / 2;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TReal CMnrpMapModel::Bottom() const
- {
- return iViewOrigin.iY - Height() / 2;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TReal CMnrpMapModel::Width() const
- {
- return TReal( iScreenSize.iWidth ) * iScale;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TReal CMnrpMapModel::Height() const
- {
- return TReal( iScreenSize.iHeight ) * iScale;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TCoordinate CMnrpMapModel::Center() const
- {
- return TCoordinate( iViewOrigin.iY, iViewOrigin.iX );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-TArray<CMnrpMapModel::CDrawItem*> CMnrpMapModel::Items() const
- {
- // adjust all items to screen coordinates
- for ( TInt i = 0; i < iDrawItems.Count(); i++ )
- {
- iDrawItems[i]->iScreenPosition = AbsoluteToScreen( iDrawItems[i]->iAbsolutePosition );
- }
- return iDrawItems.Array();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-CMnrpMapModel::TCurrentLocation CMnrpMapModel::CurrentLocation() const
- {
- TCurrentLocation current;
-
- TPosition pos;
- iPosInfo.GetPosition( pos );
-
- current.iAbsoluteLocation = pos;
-
- if ( !Math::IsNaN( pos.Latitude() ) && !Math::IsNaN( pos.Longitude() ) )
- {
- current.iLocation = AbsoluteToScreen( current.iAbsoluteLocation );
-
- // calculate error radius in degrees and pixels
- if ( !Math::IsNaN( pos.HorizontalAccuracy() ) )
- {
- current.iAbsoluteErrorDegrees = ( pos.HorizontalAccuracy() / KEarthEquator ) * 360;
- current.iErrorRadius = current.iAbsoluteErrorDegrees / iScale;
- }
- else
- {
- current.iErrorRadius = 0;
- current.iAbsoluteErrorDegrees = 0;
- }
-
- current.iIsValid = ETrue;
- }
- else
- {
- current.iIsValid = EFalse;
- }
-
- return current;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::SetScreenSize( TSize aScreenSize )
- {
- __ASSERT_DEBUG( aScreenSize.iWidth >= 1 && aScreenSize.iHeight >= 1,
- Panic( KErrGeneral ) );
- iScreenSize = aScreenSize;
- CheckBorders();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-TReal CMnrpMapModel::MaxScale() const
- {
- TReal scaleByWidth = KMapWidth / TReal( iScreenSize.iWidth );
- TReal scaleByHeight = KMapHeight / TReal( iScreenSize.iHeight );
- return Min( scaleByWidth, scaleByHeight );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-TPoint CMnrpMapModel::AbsoluteToScreen( TRealPoint aAbsolutePoint ) const
- {
- TRealPoint realScreen = ( aAbsolutePoint - TRealPoint( Left(), Bottom() ) ) / iScale;
- return TPoint( realScreen.iX, iScreenSize.iHeight - realScreen.iY );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TPoint CMnrpMapModel::AbsoluteToScreen( TCoordinate aAbsolutePoint ) const
- {
- TRealPoint real( aAbsolutePoint.Longitude(), aAbsolutePoint.Latitude() );
- return AbsoluteToScreen( real );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-TInt CMnrpMapModel::AbsoluteToScreen( TReal aDistance ) const
- {
- return aDistance / iScale;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TCoordinate CMnrpMapModel::ScreenToAbsolute( TPoint aScreenPoint ) const
- {
- TReal xdiff = aScreenPoint.iX * iScale;
- TReal ydiff = aScreenPoint.iY * iScale;
- return TCoordinate( Top() - ydiff, Left() + xdiff );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TReal CMnrpMapModel::ScreenToAbsolute( TInt aDistance ) const
- {
- return aDistance * iScale;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::AdjustBoundingBox(
- CMnrpMapModel::CDrawItem& aItem,
- TRealPoint& aMin,
- TRealPoint& aMax )
- {
- // X
- if ( !Math::IsNaN( aItem.iAbsolutePosition.iX ) )
- {
- if ( Math::IsNaN( aMin.iX ) || aItem.iAbsolutePosition.iX < aMin.iX )
- {
- aMin.iX = aItem.iAbsolutePosition.iX;
- }
- if ( Math::IsNaN( aMax.iX ) || aItem.iAbsolutePosition.iX > aMax.iX )
- {
- aMax.iX = aItem.iAbsolutePosition.iX;
- }
- }
-
- // Y
- if ( !Math::IsNaN( aItem.iAbsolutePosition.iY ) )
- {
- if ( Math::IsNaN( aMin.iY ) || aItem.iAbsolutePosition.iY < aMin.iY )
- {
- aMin.iY = aItem.iAbsolutePosition.iY;
- }
- if ( Math::IsNaN( aMax.iY ) || aItem.iAbsolutePosition.iY > aMax.iY )
- {
- aMax.iY = aItem.iAbsolutePosition.iY;
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::HandlePositionRequestCompletedL( TInt aError )
- {
- if ( !aError )
- {
- iPositionRequest->GetPosition( iPosInfo );
- if ( iObserver )
- {
- iObserver->HandleModelUpdateL();
- }
- }
- if ( iShowCurrentLocation )
- {
- iPositionRequest->FetchNewPosition();
- }
- }
-
-// =====================================================
-// DRAWING METHODS
-// =====================================================
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CMnrpMapModel::RenderL(
- CFbsBitmap& aBitmap,
- TRect aTargetRect,
- CFont* aTextFont,
- CFont* aItemFont ) const
- {
- // create an off-screen device and context
- CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( &aBitmap );
- CleanupStack::PushL( bitmapDevice );
-
- CFbsBitGc* gc = NULL;
- User::LeaveIfError( bitmapDevice->CreateContext( gc ) );
- CleanupStack::PushL( gc );
-
- gc->UseFont( aTextFont );
-
- // get data
- TGrid grid;
- GetGrid( grid );
-
- TBool isBackground = EFalse;
- // background
- if ( !isBackground )
- {
- // no map background, clear map area
- gc->Clear( aTargetRect );
- }
-
- gc->SetClippingRect( aTargetRect );
- gc->SetOrigin( aTargetRect.iTl );
-
- DrawGrid( *gc, aTargetRect.Size(), grid );
-
- gc->DiscardFont(); // text font
- gc->UseFont( aItemFont );
-
- // draw items
- DrawLandmarks( *gc, *aItemFont, aTargetRect.Size(), isBackground ); // invert shadow and text color
- DrawCurrentLocation( *gc, aTargetRect.Size() );
-
- // cleanup
-
- gc->DiscardFont(); // item font
-
- CleanupStack::PopAndDestroy( gc );
- CleanupStack::PopAndDestroy( bitmapDevice );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt CMnrpMapModel::NumIgnoredLandmarks()
- {
- return iNumIgnoredLandmarks;
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::DrawGrid(
- CFbsBitGc& aGc,
- const TSize& aBoxSize,
- CMnrpMapModel::TGrid& aGrid ) const
- {
- const TRgb KGridLineColor( 128, 128, 128 );
-
- aGc.SetPenSize( TSize( KGridPenSize, KGridPenSize ) );
- aGc.SetPenColor( KGridLineColor );
-
- if ( aGrid.iGridStep > 0 )
- {
- // 1. Vertical lines
- TInt x = aGrid.iReference.iX;
- // find leftmost vertical line
- while ( x > 0 )
- {
- x -= aGrid.iGridStep;
- }
- x += aGrid.iGridStep;
- // draw lines selecting different line colors for major and minor lines
- while ( x < aBoxSize.iWidth )
- {
- DrawVerticalLine( aGc, x, aBoxSize );
- x += aGrid.iGridStep;
- }
-
- // 2. Horizontal lines
- TInt y = aGrid.iReference.iY;
- // find topmost vertical line
- while ( y > 0 )
- {
- y -= aGrid.iGridStep;
- }
- y += aGrid.iGridStep;
- // draw lines selecting different line colors for major and minor lines
- while ( y < aBoxSize.iHeight )
- {
- DrawHorizontalLine( aGc, y, aBoxSize );
- y += aGrid.iGridStep;
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::DrawVerticalLine( CFbsBitGc& aGc, TInt aX, TSize aBoxSize ) const
- {
- aGc.DrawLine( TPoint( aX, 0 ), TPoint( aX, aBoxSize.iHeight ) );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::DrawHorizontalLine( CFbsBitGc& aGc, TInt aY, TSize aBoxSize ) const
- {
- aGc.DrawLine( TPoint( 0, aY ), TPoint( aBoxSize.iWidth, aY ) );
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::DrawLandmarks(
- CFbsBitGc& aGc,
- CFont& aFont,
- const TSize& aBoxSize,
- TBool aSwitchColorAndShadow ) const
- {
- const TSize KItemMarkSize( 3, 3 ); // pixels
- const TSize KItemIconSize( 20, 20 ); // pixels
-
- const TRgb KPoiColor( 0, 0, 192 );
- const TRgb KPoiTextColor( 0, 0, 0 );
- const TRgb KPoiTextShadowColor( 224, 224, 224 );
- const TRgb KLmColor( 255, 0, 0 );
- const TRgb KLmTextColor( 255, 0, 0 );
- const TRgb KLmTextShadowColor( 224, 224, 224 );
-
- TArray<CMnrpMapModel::CDrawItem*> items = Items();
-
- RArray<TRect> textBoxes;
-
- for ( TInt i = 0; i < items.Count(); i++ )
- {
- const TPoint& pos = items[i]->Position();
- if ( pos.iX >= 0 && pos.iX < aBoxSize.iWidth &&
- pos.iY >= 0 && pos.iY < aBoxSize.iHeight )
- {
- CFbsBitmap* icon = items[i]->Bitmap();
- CFbsBitmap* mask = items[i]->Mask();
-
- if ( icon && mask )
- {
- AknIconUtils::SetSize( icon, KItemIconSize );
-
- TRect iconBox( pos, KItemIconSize );
- iconBox.Move( -iconBox.Width() / 2, -iconBox.Height() / 2 );
-
- aGc.DrawBitmapMasked(
- iconBox,
- icon,
- KItemIconSize,
- mask,
- EFalse );
- }
- else
- {
- if ( items[i]->IsPoi() )
- {
- aGc.SetPenColor( KPoiColor );
- }
- else
- {
- aGc.SetPenColor( KLmColor );
- }
-
- TRect markBox( pos, KItemMarkSize );
- markBox.Move( -markBox.Width() / 2, -markBox.Height() / 2 );
- aGc.SetPenSize( KItemMarkSize );
- aGc.Plot( pos );
- }
-
- if ( items[i]->Text().Length() )
- {
- TPoint textPos( pos );
- textPos.iX += KLmTextOffset;
-
- TSize textSize( aFont.TextWidthInPixels( items[i]->Text() ), aFont.HeightInPixels() );
- TRect textBox( textPos, textSize );
-
- // verify this textbox does not intersect any previous ones
- TBool overlaps = EFalse;
- for ( TInt b = 0; b < textBoxes.Count(); b++ )
- {
- if ( textBox.Intersects( textBoxes[b] ) )
- {
- overlaps = ETrue;
- break;
- }
- }
-
- if ( !overlaps )
- {
- textBoxes.Append( textBox );
-
- aGc.SetPenSize( TSize( 1, 1 ) );
-
- TRgb textColor, textShadowColor;
-
- if ( items[i]->IsPoi() )
- {
- textColor = KPoiTextColor;
- textShadowColor = KPoiTextShadowColor;
- }
- else
- {
- textColor = KLmTextColor;
- textShadowColor = KLmTextShadowColor;
- }
-
- // text shadow
- TPoint shadowPos( textPos + TPoint( KLmTextShadowOffset, KLmTextShadowOffset ) );
- aGc.SetPenColor( aSwitchColorAndShadow ? textColor : textShadowColor );
- aGc.DrawText( items[i]->Text(), shadowPos );
-
- // text itself
- aGc.SetPenColor( aSwitchColorAndShadow ? textShadowColor : textColor );
- aGc.DrawText( items[i]->Text(), textPos );
- }
- }
- }
- }
- textBoxes.Close();
- }
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//
-void CMnrpMapModel::DrawCurrentLocation(
- CFbsBitGc& aGc,
- const TSize& aBoxSize ) const
- {
- const TSize KPositionPenSize( 20, 20 );
- const TSize KPositionErrorPenSize( 1, 1 );
- const TRgb KPositionColor( 255, 255, 0 );
-
- // draw current location
- CMnrpMapModel::TCurrentLocation location = CurrentLocation();
-
- if ( location.iIsValid )
- {
- TPoint& pos = location.iLocation;
-
- if ( pos.iX >= 0 && pos.iX < aBoxSize.iWidth &&
- pos.iY >= 0 && pos.iY < aBoxSize.iHeight )
- {
- if ( location.iErrorRadius )
- {
- TRect circleBox( pos.iX, pos.iY, pos.iX, pos.iY );
- circleBox.Grow( location.iErrorRadius, location.iErrorRadius );
-
- aGc.SetPenSize( KPositionErrorPenSize );
- aGc.SetBrushStyle( CGraphicsContext::EVerticalHatchBrush );
- aGc.SetBrushColor( KPositionColor );
- aGc.DrawEllipse( circleBox );
- }
-
- aGc.SetPenColor( KPositionColor );
- aGc.SetPenSize( KPositionPenSize );
- aGc.Plot( pos );
- }
- }
- }
-