--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mapnavproviderrefapp/src/mnrpappui.cpp Tue Feb 02 00:16:03 2010 +0200
@@ -0,0 +1,492 @@
+/*
+* 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: CMnrpAppUi class implementation
+*
+*/
+
+
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <eikbtgpc.h>
+
+#include <AknIconUtils.h>
+#include <aknselectionlist.h>
+#include <gulicon.h>
+
+#include <mnrefprovider.rsg>
+#include <MnRefProvider.mbg>
+#include "mnrp.hrh"
+
+#include <EPos_CPosLandmark.h>
+#include <EPos_CPosLandmarkDatabase.h>
+
+#include "mnrpappview.h"
+#include "mnrpnaviview.h"
+#include "mnrpmapview.h"
+
+#include "mnrpmapviewservice.h"
+#include "mnrpnavigationservice.h"
+
+#include "mnrpdocument.h"
+#include "mnrpengine.h"
+#include "mnrpappui.h"
+#include "mnrputils.h"
+#include "debug.h"
+
+const TInt KDefaultLmIconIndex = 0;
+_LIT( KMbmFile, "\\resource\\apps\\MnRefProvider.mbm");
+
+// ============================ LOCAL FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CleanupIconArray( TAny* aArray )
+ {
+ LOG("MnRefProvider::CleanupIconArray in");
+ ( ( CArrayPtrSeg<CGulIcon>* ) aArray)->ResetAndDestroy();
+ delete aArray;
+ LOG("MnRefProvider::CleanupIconArray out");
+ }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void AddIconL(
+ CArrayPtr<CGulIcon>& aIconArray,
+ const TDesC& aFileName,
+ TInt aIconIndex,
+ TInt aMaskIndex )
+ {
+ LOG("MnRefProvider::AddIconL in");
+ CFbsBitmap* icon = NULL;
+ CFbsBitmap* mask = NULL;
+
+ AknIconUtils::CreateIconLC( icon, mask, aFileName, aIconIndex, aMaskIndex );
+ CGulIcon* gul = CGulIcon::NewL( icon, mask );
+
+ gul->SetBitmapsOwnedExternally( EFalse );
+ CleanupStack::PushL( gul );
+ aIconArray.AppendL( gul );
+ CleanupStack::Pop( 3 ); // gul, icon & mask
+ LOG("MnRefProvider::AddIconL out");
+ }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CArrayPtrSeg<CGulIcon>* CreateIconListLC( TInt aGranularity )
+ {
+ CArrayPtrSeg<CGulIcon>* iconList =
+ new (ELeave) CArrayPtrSeg<CGulIcon>( aGranularity );
+ CleanupStack::PushL( TCleanupItem( CleanupIconArray, iconList ) );
+
+ AddIconL(
+ *iconList,
+ KMbmFile,
+ EMbmMnrefproviderDefault_lm,
+ EMbmMnrefproviderDefault_lm_mask);
+
+ return iconList;
+ }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void AddLandmarkL(
+ const CPosLandmark& aLandmark,
+ CDesCArray& aTextArray,
+ CArrayPtr<CGulIcon>& aIconArray )
+ {
+ TPtrC name;
+ aLandmark.GetLandmarkName( name );
+
+ HBufC* printableName = MnrpUtils::PrintableStringLC( name );
+
+ TPtrC iconFile;
+ TInt iconIndex, maskIndex, iconArrayIndex;
+
+ if ( aLandmark.GetIcon( iconFile, iconIndex, maskIndex ) == KErrNone )
+ {
+ AddIconL( aIconArray, iconFile, iconIndex, maskIndex );
+ iconArrayIndex = aIconArray.Count() - 1;
+ }
+ else
+ {
+ iconArrayIndex = KDefaultLmIconIndex;
+ }
+
+ _LIT(KListItemFormat, "%d\t%S\t\t");
+ const TInt KListItemMinSize = 20;
+
+ HBufC* item = HBufC::NewLC( printableName->Size() + KListItemMinSize );
+ item->Des().Format( KListItemFormat, iconArrayIndex, printableName );
+
+ aTextArray.AppendL( *item );
+
+ CleanupStack::PopAndDestroy( item );
+ CleanupStack::PopAndDestroy( printableName );
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CMnrpAppUi::CMnrpAppUi( CMnrpEngine& aEngine )
+ : iEngine( aEngine )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMnrpAppUi::ConstructL()
+ {
+ BaseConstructL( EAknEnableSkin );
+
+ // This is empty view, it will be shown by UI framework,
+ // when application starts
+ iAppView = CMnrpAppView::NewL();
+ AddViewL( iAppView );
+
+ if ( !iEikonEnv->StartedAsServerApp() )
+ {
+ // switch to map view if started normally
+ iMapView = CMnrpMapView::NewL( EFalse, iEngine );
+ AddViewL( iMapView );
+ ActivateLocalViewL( iMapView->Id() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CMnrpAppUi::~CMnrpAppUi()
+ {
+ delete iNaviPaneLabel;
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMnrpAppUi::HandleCommandL( TInt aCommand )
+ {
+ switch(aCommand)
+ {
+ case EAknSoftkeyBack:
+ {
+ CEikAppServer* server = iEikonEnv->AppServer();
+ if ( server )
+ {
+ server->NotifyServerExit( EEikCmdExit );
+ }
+ Exit();
+ break;
+ }
+
+ case EEikCmdExit:
+ case EAknSoftkeyExit:
+ {
+ CEikAppServer* server = iEikonEnv->AppServer();
+ if ( server )
+ {
+ server->NotifyServerExit( EAknCmdExit ); // this will close client also
+ }
+ Exit();
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool CMnrpAppUi::IsChainedMode()
+ {
+ return ( iParentWg != 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool CMnrpAppUi::IsAnyUserViewActive()
+ {
+ TVwsViewId viewId;
+ if ( ( GetActiveViewId( viewId ) == KErrNotFound ) ||
+ ( viewId.iViewUid.iUid != EMnrpMapViewId &&
+ viewId.iViewUid.iUid != EMnrpNavigationViewId ) )
+ {
+ return EFalse;
+ }
+ else
+ {
+ return ETrue;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+void CMnrpAppUi::SetNaviPaneTitleL( const TDesC& aPaneTitle )
+ {
+ if ( !iNaviPane )
+ {
+ iNaviPane = static_cast<CAknNavigationControlContainer*>(
+ StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+ }
+
+ if ( iNaviPaneLabel )
+ {
+ CAknNavigationDecorator* naviLabel = iNaviPane->CreateNavigationLabelL( aPaneTitle );
+ CleanupStack::PushL( naviLabel );
+
+ iNaviPane->ReplaceL( *iNaviPaneLabel, *naviLabel );
+
+ delete iNaviPaneLabel;
+ iNaviPaneLabel = naviLabel;
+
+ CleanupStack::Pop( naviLabel );
+ }
+ else
+ {
+ iNaviPaneLabel = iNaviPane->CreateNavigationLabelL( aPaneTitle );
+ iNaviPane->PushL( *iNaviPaneLabel );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+void CMnrpAppUi::SetRightSoftkeyCommandL( TInt aCommand, const TDesC& aButtonTitle )
+ {
+ if ( Cba() )
+ {
+ Cba()->SetCommandL( 1, aCommand, aButtonTitle );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TBool CMnrpAppUi::ProcessCommandParametersL( CApaCommandLine &aCommandLine )
+ {
+ iParentWg = aCommandLine.ParentWindowGroupID();
+ LOG1("parent window group id %d", iParentWg );
+
+ return CAknAppUi::ProcessCommandParametersL( aCommandLine );
+ }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+void CMnrpAppUi::HandleResourceChangeL( TInt aType )
+ {
+ CAknAppUi::HandleResourceChangeL( aType );
+
+ TRect rect( ClientRect() );
+ if ( Cba() )
+ {
+ Cba()->SetBoundingRect( TRect() );
+ Cba()->ReduceRect( rect );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMnrpAppUi::ShowMapL( CMnrpMapViewService& aService )
+ {
+ if ( !iMapView )
+ {
+ iMapView = CMnrpMapView::NewL( IsChainedMode(), iEngine );
+ AddViewL( iMapView );
+ }
+
+ iMapView->SetMapModeL( aService );
+ ActivateLocalViewL( iMapView->Id() );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMnrpAppUi::ShowNavigationL( const CPosLandmark& aDestination )
+ {
+ if ( !iNaviView )
+ {
+ iNaviView = CMnrpNaviView::NewL( IsChainedMode(), iEngine );
+ AddViewL( iNaviView );
+ }
+
+ iNaviView->SetDestinationL( aDestination );
+ ActivateLocalViewL( iNaviView->Id() );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMnrpAppUi::StartSelectionL(
+ CMnrpMapViewService& aService,
+ MMapSelectionCallback& aCallback )
+ {
+ SetNaviPaneTitleL( aService.SelectionRequestText() );
+
+ if ( aService.Options() & CMnMapView::EOptionRestrictSelection )
+ {
+ // select from dialog
+ SelectFromDialogL( aService, aCallback );
+ }
+ else
+ {
+ // select from map
+ if ( !iMapView )
+ {
+ iMapView = CMnrpMapView::NewL( IsChainedMode(), iEngine );
+ AddViewL( iMapView );
+ }
+
+ iMapView->SetSelectionModeL( aService, aCallback );
+ ActivateLocalViewL( iMapView->Id() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMnrpAppUi::StopSelection()
+ {
+ __ASSERT_DEBUG( iMapView, Panic( KErrGeneral ) );
+ iMapView->StopSelection();
+
+ // Selection is done - close selection view
+ TRAP_IGNORE( ActivateLocalViewL( iAppView->Id() ) );
+ }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CMnrpAppUi::SelectFromDialogL(
+ CMnrpMapViewService& aService,
+ MMapSelectionCallback& aCallback )
+ {
+ LOG("MnRefProvider::SelectFromDialogL in");
+
+ const TInt KGranularity = 8;
+
+ CDesCArraySeg *textArray = new (ELeave) CDesCArraySeg( KGranularity );
+ CleanupStack::PushL( textArray );
+ CArrayPtrSeg<CGulIcon>* iconArray = CreateIconListLC( KGranularity );
+
+ TInt linkedLmsOffset = 0;
+
+ CMnrpDocument* doc = ( CMnrpDocument* ) Document();
+ CMnrpEngine& engine = doc->Engine();
+
+ // add non-linked landmarks
+ LOG("MnRefProvider::DoSelectionDialogL adding non-linked landmarks");
+ for ( TInt i = 0; i < aService.LandmarksToShow().Count(); i++)
+ {
+ const CPosLandmark* lm = aService.LandmarksToShow()[i];
+ AddLandmarkL( *lm, *textArray, *iconArray );
+ }
+
+ // add linked landmarks
+ LOG("MnRefProvider::DoSelectionDialogL adding linked landmarks");
+
+ // create dictionary of linked landmarks
+ // in order to ease searching for return values
+ // when completing request
+ RArray<TInt> dbIndices;
+ RArray<TPosLmItemId> lmIds;
+
+ CleanupClosePushL( dbIndices );
+ CleanupClosePushL( lmIds );
+
+ linkedLmsOffset = textArray->Count();
+ for ( TInt db = 0; db < aService.LandmarksToShowDatabases().Count(); db++ )
+ {
+ const HBufC* uri = aService.LandmarksToShowDatabases()[db];
+
+ CPosLandmarkDatabase* lmdb = CPosLandmarkDatabase::OpenL( *uri );
+ CleanupStack::PushL( lmdb );
+
+ if ( lmdb->IsInitializingNeeded() )
+ {
+ ExecuteAndDeleteLD( lmdb->InitializeL() );
+ }
+
+ for ( TInt i = 0; i < aService.LinkedLandmarksToShow(db).Count(); i++)
+ {
+ TPosLmItemId id = aService.LinkedLandmarksToShow(db)[i];
+
+ CPosLandmark* lm = lmdb->ReadLandmarkLC( id );
+ AddLandmarkL( *lm, *textArray, *iconArray );
+
+ dbIndices.AppendL( db );
+ lmIds.AppendL( id );
+
+ CleanupStack::PopAndDestroy( lm );
+ }
+
+ CleanupStack::PopAndDestroy( lmdb );
+ }
+
+ TInt selected = 0;
+ CAknSelectionListDialog *dialog =
+ CAknSelectionListDialog::NewL( selected, textArray, R_MNREFPROVIDER_MENUBAR );
+
+ dialog->PrepareLC( R_MNREFPROVIDER_SELECTION_DIALOG );
+
+ dialog->SetIconArrayL( iconArray );
+ CleanupStack::Pop(); // iconArray cleanup
+
+ LOG1("MnRefProvider::SelectFromDialogL launching dialog with %d items", textArray->Count() );
+ TInt result = dialog->RunLD();
+ if ( result )
+ {
+ LOG("MnRefProvider::SelectFromDialogL approved");
+ if ( selected < linkedLmsOffset )
+ {
+ aCallback.HandleSelectionL( selected );
+ }
+ else
+ {
+ TInt linkedLmIndex = selected - linkedLmsOffset;
+ if ( linkedLmIndex < dbIndices.Count() &&
+ linkedLmIndex < lmIds.Count() )
+ {
+ aCallback.HandleSelectionL( lmIds[linkedLmIndex], dbIndices[linkedLmIndex] );
+ }
+ else
+ {
+ // never happens
+ LOG("MnRefProvider::SelectFromDialogL selection out of range, out");
+ aCallback.HandleSelectionErrorL( KErrGeneral );
+ }
+ }
+ }
+ else
+ {
+ LOG("MnRefProvider::SelectFromDialogL cancelled, out");
+ aCallback.HandleSelectionErrorL( KErrCancel );
+ }
+
+ CleanupStack::PopAndDestroy( &lmIds );
+ CleanupStack::PopAndDestroy( &dbIndices );
+
+ CleanupStack::PopAndDestroy( textArray );
+ LOG("MnRefProvider::SelectFromDialogL out");
+}