diff -r 1fc85118c3ae -r 870918037e16 mapnavproviderrefapp/src/mnrpappui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mapnavproviderrefapp/src/mnrpappui.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -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 +#include +#include + +#include +#include +#include + +#include +#include +#include "mnrp.hrh" + +#include +#include + +#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* ) aArray)->ResetAndDestroy(); + delete aArray; + LOG("MnRefProvider::CleanupIconArray out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void AddIconL( + CArrayPtr& 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* CreateIconListLC( TInt aGranularity ) + { + CArrayPtrSeg* iconList = + new (ELeave) CArrayPtrSeg( aGranularity ); + CleanupStack::PushL( TCleanupItem( CleanupIconArray, iconList ) ); + + AddIconL( + *iconList, + KMbmFile, + EMbmMnrefproviderDefault_lm, + EMbmMnrefproviderDefault_lm_mask); + + return iconList; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void AddLandmarkL( + const CPosLandmark& aLandmark, + CDesCArray& aTextArray, + CArrayPtr& 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( + 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* 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 dbIndices; + RArray 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"); +}