landmarksui/uicontrols/src/CLmkDlgPackageSelectorImpl.cpp
branchRCL_3
changeset 18 870918037e16
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarksui/uicontrols/src/CLmkDlgPackageSelectorImpl.cpp	Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,638 @@
+/*
+ * Copyright (c) 2002-2010 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:    LandmarksUi Packaged Landmarks Selector View Implementation
+ *
+ */
+
+// SYSTEM INCLUDE FILES
+#include <featmgr.h>
+#include <AknDef.h>
+#include <StringLoader.h>
+#include <AknQueryDialog.h>
+#include <EPos_CPosLmCategoryManager.h>
+#include <AknsConstants.h>
+#include <AknIconArray.h>
+#include <eikmenup.h>
+#include <eikspane.h>
+#include <AknWaitDialog.h>
+#include <e32math.h>
+#include <hlplch.h>
+#include <csxhelp/lmmes.hlp.hrh>
+#include <avkon.mbg>
+#include <lmkui.rsg>
+
+// USER INCLUDE FILES
+#include "CLmkSaveLandmarkUtils.h"
+#include "CLmkDlgPackageSelectorImpl.h"
+#include "CLmkLmItemListProvider.h"
+#include "LmkListProviderFactory.h"
+#include "CLmkMultiSelectorDialog.h"
+#include "CLmkParser.h"
+#include "LmkConsts.h"
+#include "LmkUID.h"
+#include "CLmkSender.h"
+#include "CLmkPackageEditorImpl.h"
+#include "CLmkDlgSelectorImplBase.h"
+#include "CLmkUiUtils.h"
+#include "CLmkSelectorDialog.h"
+#include "CLmkSelectorLBModelBase.h"
+#include "CLmkSingleGraphicLBModel.h"
+#include "CLmkMultiSelectionLBModel.h"
+#include "CLmkLmItemListMemento.h"
+#include "CLmkSelectorIconMgr.h"
+#include "CLmkAOOperation.h"
+
+// ================= LOCAL FUNCTIONS =======================
+static void CleanupArray(TAny* aArray)
+    {
+    ( static_cast<RPointerArray<CPosLandmark>*>( aArray ) )->ResetAndDestroy();
+    }
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CLmkDlgPackageSelectorImpl::CLmkDlgPackageSelectorImpl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CLmkDlgPackageSelectorImpl::CLmkDlgPackageSelectorImpl(
+    CPosLandmarkDatabase& aDb,
+    CLmkParser& aParser,
+    CLmkSender& aSender )
+    : CLmkDlgLmSelectorImpl( aDb ),
+      iParser( aParser ),
+      iSender( aSender ),
+      iDb(aDb)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkDlgPackageSelectorImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::ConstructL()
+    {
+    CLmkDlgLmSelectorImpl::ConstructL();
+    iMapNavInterface = CLmkMapNavigationInterface::NewL( iDb );
+    iMapNavInterface->AttachAIWInterestL(R_LMK_PKGVIEWER_MENU, R_LMK_PACKAGE_AIW_INTEREST_SHOWONMAP);
+     for (TUint i(0); i < iParser.NumOfParsedLandmarks(); i++)
+	    {
+	    User::LeaveIfError( iTotalLms.Append(i) );
+	    }
+	iSaveLmUtils = CLmkSaveLandmarkUtils::NewL(iDb,iParser);
+	//setting of observer is needed for the search operation.
+	iSaveLmUtils->SetObserver(this);
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkDlgPackageSelectorImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CLmkDlgPackageSelectorImpl* CLmkDlgPackageSelectorImpl::NewL(
+    CPosLandmarkDatabase& aDb,
+    CLmkParser& aParser,
+    CLmkSender& aSender )
+    {
+    CLmkDlgPackageSelectorImpl* self =
+        new( ELeave ) CLmkDlgPackageSelectorImpl( aDb, aParser, aSender );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::~CLmkDlgPackageSelectorImpl
+// ----------------------------------------------------
+//
+CLmkDlgPackageSelectorImpl::~CLmkDlgPackageSelectorImpl()
+    {
+    if(iMapNavInterface)
+    	{
+    	iMapNavInterface->Release();
+    	}
+    iTotalLms.Close();
+    delete iSaveLmUtils;
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::HelpContext
+// ----------------------------------------------------
+//
+TCoeHelpContext CLmkDlgPackageSelectorImpl::HelpContext() const
+    {
+    return TCoeHelpContext( TUid::Uid( KLmkMsgViewerAppUID3 ),
+                            KLM_HLP_RECEIVED_PACKAGE );
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::SetupListProviderL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::SetupListProviderL()
+    {
+    if ( !iListProvider )
+        {
+        iListProvider =
+            LmkListProviderFactory::CreateProviderL( iParser );
+        iListProvider->AddObserverL( *this );
+        iListProvider->InitializeL();
+        }
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::GetDlgResources
+// ----------------------------------------------------
+//
+
+
+void CLmkDlgPackageSelectorImpl::GetDlgResources(
+    TBool /*aIsSingleSelector*/,
+    TInt& aTitlePaneResource,
+    TInt& aMenuBarResource,
+    TInt& aDialogResource ) const
+    {
+    aTitlePaneResource = KZeroResourceId;
+    aMenuBarResource = R_LMK_PKGVIEWER_MENUBAR;
+    aDialogResource = R_LMK_PKGVIEWER_OPTIONS_BACK_DLG;
+    }
+
+
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::HandleLaunchingEventL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::HandleLaunchingEventL()
+    {
+    // Call base class implementation:
+    CLmkDlgSelectorImplBase::HandleLaunchingEventL();
+
+    // cast is safe, package selector is always multiselector
+    static_cast<CLmkMultiSelectorDialog*>( iDialog )->SetupSendMenu(
+                    iSender, R_LMK_PKGVIEWER_MENU, R_LMK_SENDUI_MENU_TEXT );
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkDlgPackageSelectorImpl::HandleOperationL
+// -----------------------------------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::HandleOperationL(
+                                       TOperationTypes aType,
+                                       TReal32 /*aProgress*/,
+                                       TInt aStatus )
+    {
+    if(aType == ENewPkgCategory && aStatus != KPosLmOperationNotComplete)
+    	{
+    	if (iSaveLmUtils->CategoryAddConfirmationQueryL(iNoOfNewCategories,iNewCategoryFound) )
+			{
+			iType  = EImport;
+			iParser.StartImportingL( iTotalLms, ETrue );// Save landmarks with new categories
+			}
+		else
+			{
+			iType  = EImport;
+			iParser.StartImportingL( iTotalLms , EFalse); //Save landmarks without new categories
+			}
+    	}
+    else if( (aType == EImport ) && (aStatus != KPosLmOperationNotComplete && iWaitNote ))
+    	{
+    	iWaitNote->ProcessFinishedL();
+        iWaitNote = NULL;
+    	}
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::GetLandmarksInPackageL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::GetLandmarksInPackageL(RPointerArray<CPosLandmark> &aLmkArray)
+	{
+	const CArrayFix<TInt>* indexes = iDialog->ListBox()->SelectionIndexes();
+	CPosLandmark* lmk;
+	if(indexes->Count() == 0)
+		{
+		lmk = iParser.LandmarkLC(iDialog->ListBox()->CurrentItemIndex());
+		aLmkArray.Append(lmk);
+		CleanupStack::Pop();//iParser.LandmarkLC
+		}
+	else
+		{
+		TInt count = indexes->Count();
+		for(TInt i = 0;i < count; ++i)
+			{
+			TInt index = indexes->At(i);
+			lmk = iParser.LandmarkLC(index);
+			aLmkArray.Append(lmk);
+			CleanupStack::Pop();//iParser.LandmarkLC
+			}
+		}
+	}
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::ProcessCommandL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::ProcessCommandL( TInt aCommandId )
+    {
+    TInt aiwCmd = iMapNavInterface->GetServiceCmdByMenuCmd(aCommandId);
+
+    if(KAiwCmdNone != aiwCmd)
+    	{
+    	RPointerArray<CPosLandmark> lmkArray;
+    	switch(aiwCmd)
+    		{
+    		case KAiwCmdMnShowMap:
+    			{
+    			GetLandmarksInPackageL(lmkArray);
+    			CleanupStack::PushL( TCleanupItem( CleanupArray, &lmkArray ) );
+    			iMapNavInterface->ShowLandmarksOnMapL(lmkArray, aCommandId,
+    												CLmkMapNavigationInterface::EByLmkView);
+    			CleanupStack::PopAndDestroy(); // lmkArray
+    			break;
+    			}
+    		default:
+    			{
+    			break;
+    			}
+    		}
+    	return;
+    	}
+    switch ( aCommandId )
+        {
+        case EAknCmdHelp:
+            {
+            HlpLauncher::LaunchHelpApplicationL( iEnv->WsSession(),
+                                iEnv->EikAppUi()->AppHelpContextL() );
+            break;
+            }
+        case ELmkCmdSendVia1: // These commands are used by SendUi
+        case ELmkCmdSendVia2:
+        case ELmkCmdSendVia3:
+        case ELmkCmdSendVia4:
+        case ELmkCmdSendVia5:
+        case ELmkCmdSendVia6:
+        case ELmkCmdSendVia7:
+        case ELmkCmdSendVia8:
+        case ELmkCmdSendVia9:
+        case ELmkCmdSendVia10:
+        case ELmkCmdSend:
+            {
+            SendSelectedLandmarksCmdL(aCommandId);
+            break;
+            }
+        case ELmkCmdOpenLm:
+            {
+            OpenLandmarkCmdL();
+            break;
+            }
+        case ELmkCmdSaveSelectedLms:
+            {
+            SaveLandmarksCmdL();
+            break;
+            }
+        case ELmkCmdSaveAllLms:
+            {
+            SaveAllLandmarksCmdL();
+            break;
+            }
+        case ELmkCmdSendSelectedLms:
+            {
+            SendSelectedLandmarksCmdL(aCommandId);
+            break;
+            }
+        case ELmkCmdSendAllLms:
+            {
+            SendAllLandmarksCmdL(aCommandId);
+            break;
+            }
+        default:
+            {
+            // Command not handled here, forward it to the app ui.
+            static_cast<MEikCommandObserver*>(iEnv->EikAppUi())->ProcessCommandL( aCommandId );
+            break;
+            }
+        }
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::DynInitDlgMenuPaneL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::DynInitDlgMenuPaneL(TInt aResourceId,
+        CEikMenuPane* aMenuPane)
+    {
+    iMapNavInterface->HandleMenuOperationL(aResourceId, aMenuPane,
+            ELmkCmdMnNav);
+
+    TInt markedCount = ListMarkedItemCountL();
+
+    switch (aResourceId)
+        {
+        case R_LMK_PKGVIEWER_MENU:
+            {
+            if (FeatureManager::FeatureSupported(KFeatureIdLandmarksConverter))
+                {
+                aMenuPane->SetItemDimmed(ELmkCmdSendDummy, EFalse);
+                }
+            else
+                {
+                aMenuPane->SetItemDimmed(ELmkCmdSendDummy, ETrue);
+                }
+
+            if (FeatureManager::FeatureSupported(KFeatureIdHelp)
+                    && !iIsHideHelp)
+                {
+                aMenuPane->SetItemDimmed(EAknCmdHelp, EFalse);
+                }
+            else
+                {
+                aMenuPane->SetItemDimmed(EAknCmdHelp, ETrue);
+                }
+
+            if (markedCount < 1)
+                {
+                aMenuPane->SetItemDimmed(ELmkCmdOpenLm, ETrue);
+                }
+            else if (markedCount == 1)
+                {
+                aMenuPane->SetItemDimmed(ELmkCmdOpenLm, EFalse);
+                }
+            else if (markedCount > 1)
+                {
+                aMenuPane->SetItemDimmed(ELmkCmdOpenLm, ETrue);
+                }
+
+            TBool isLandmarkDataEmpty = EFalse;
+
+            // check for show on map for single selected landmark
+            if (markedCount == 1)
+                {
+                CLmkLandmark* lmklandmark = iParser.LmkLandmarkLC(
+                        iDialog->CurrentItemIndex());
+                if (IsLandmarkDataEmptyL(lmklandmark->PosLandmark()))
+                    {
+                    isLandmarkDataEmpty = ETrue;
+                    }
+                CleanupStack::PopAndDestroy(lmklandmark); //lmklandmark
+                }
+            else if (markedCount < 1)
+                {
+                isLandmarkDataEmpty = ETrue;
+                }
+
+            TInt cnt = aMenuPane->NumberOfItemsInPane();
+            for (TInt i = 0; i < cnt; ++i)
+                {
+                CEikMenuPaneItem::SData& itemData =
+                        aMenuPane->ItemDataByIndexL(i);
+                if (iMapNavInterface->GetServiceCmdByMenuCmd(
+                        itemData.iCommandId) == KAiwCmdMnShowMap)
+                    {
+		            if (isLandmarkDataEmpty)
+		                aMenuPane->SetItemDimmed(itemData.iCommandId, ETrue);
+		            else 
+		                aMenuPane->SetItemDimmed(itemData.iCommandId, EFalse);
+		            break;
+                    }
+                }
+            break;
+            }
+        case R_LMK_PKGVIEWER_SAVE_LANDMARK_SUBMENU:
+            {
+            if (markedCount < 1)
+                {
+                aMenuPane->SetItemDimmed(ELmkCmdSaveSelectedLms, ETrue);
+                }
+            break;
+            }
+        case R_LMK_PKGVIEWER_SEND_LANDMARK_SUBMENU:
+            {
+            if (markedCount < 1)
+                {
+                aMenuPane->SetItemDimmed(ELmkCmdSendSelectedLms, ETrue);
+                }
+            break;
+            }
+        default:
+            break;
+        }
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::OpenLandmarkCmdL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::OpenLandmarkCmdL()
+    {
+    CLmkPackageEditorImpl* editorImpl =
+        CLmkPackageEditorImpl::NewL( iDb, iParser, iSender,
+                                     iDialog->CurrentItemIndex() );
+    iParser.ChangeObserver(*editorImpl);
+    editorImpl->ExecuteLD();
+    // Restore the parser's observer back to LmkPkg Selector
+    iParser.ChangeObserver(*this);
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::SaveLandmarksCmdL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::SaveLandmarksCmdL()
+    {
+    const CArrayFix<TInt>* markedIndexes = iDialog->SelectionIndexes();
+    RArray<TUint> importIndexes;
+    CleanupClosePushL( importIndexes );
+    TInt count( markedIndexes->Count() );
+    TUint markedIndex (0);
+    if ( count > 0 )
+        {
+        for ( TInt i( 0 ); i < count; ++i )
+            {
+            User::LeaveIfError(
+                importIndexes.Append( markedIndexes->At( i ) ) );
+            }
+        markedIndex = importIndexes[0];
+        }
+    else
+        { // only highlighted item, no marked items
+        User::LeaveIfError(
+            importIndexes.Append( iDialog->CurrentItemIndex() ) );
+        markedIndex = iDialog->CurrentItemIndex();
+        }
+
+
+ 	CLmkSaveLandmarkUtils* saveLmUtils = CLmkSaveLandmarkUtils::NewL(iDb,iParser);
+	CleanupStack::PushL(saveLmUtils );
+
+	RArray<TCategoryName> newCategories;
+	CleanupClosePushL(newCategories);
+	TCategoryName newCategoryFound;
+
+	TInt noOfNewCategories = saveLmUtils->CheckForNewCategoriesL( importIndexes,newCategoryFound,newCategories);
+
+	if (saveLmUtils->CategoryAddConfirmationQueryL( noOfNewCategories,newCategoryFound) )
+		{
+		iParser.StartImportingL( importIndexes, ETrue );// Save landmarks with new categories
+		}
+	else
+		{
+		iParser.StartImportingL( importIndexes , EFalse); //Save landmarks without new categories
+		}
+    // wait note
+    iWaitNote = new (ELeave) CAknWaitDialog( NULL, ETrue );
+    if ( !iWaitNote->ExecuteLD( R_LMK_IMPORTING_WAIT_NOTE ) )
+        {
+        //making iWaitNote null, since framework destroys waitnote
+        //dialog on pressing cancel.
+        iWaitNote = NULL;
+        iParser.CancelImporting();
+       	CleanupStack::PopAndDestroy(3); // newCategories, saveLmUtils,totalLms
+		return;
+        }
+
+    // Saved confirmation note
+    saveLmUtils->LmsSavedConfirmationNoteL(importIndexes, markedIndex);
+
+	iDialog->ListBox()->ClearSelection();
+	iDialog->UpdateMskL();
+    CleanupStack::PopAndDestroy(3); // newCategories, saveLmUtils,importIndexes
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::SaveAllLandmarksCmdL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::SaveAllLandmarksCmdL()
+	{
+
+	RArray<TCategoryName> newCategories;
+	CleanupClosePushL(newCategories);
+	iSaveLmUtils->StartSearchNewCatL(iNoOfNewCategories,newCategories,iNewCategoryFound);
+	iType  = ENewPkgCategory;
+	// wait note
+	iWaitNote = new (ELeave) CAknWaitDialog( NULL, ETrue );
+	if ( !iWaitNote->ExecuteLD( R_LMK_IMPORTING_WAIT_NOTE ) )
+		{
+		//making iWaitNote null, since framework destroys waitnote
+	    //dialog on pressing cancel.
+	    iWaitNote = NULL;
+		(iType == ENewPkgCategory )?iSaveLmUtils->CancelSearchNewCat():iParser.CancelImporting();
+	    CleanupStack::PopAndDestroy();//newCategories
+		return;
+		}
+	// Saved confirmation note
+    iSaveLmUtils->LmsSavedConfirmationNoteL( iTotalLms );
+    CleanupStack::PopAndDestroy();//newCategories
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::SendSelectedLandmarksCmdL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::SendSelectedLandmarksCmdL(TInt aCommandId)
+    {
+    RPointerArray<CLmkLandmark> lmkArray;
+    const CArrayFix<TInt>* constMarkedIndexes = iDialog->SelectionIndexes();
+    TUint index(0);
+    TBool oneItemSelected = EFalse;
+    if (constMarkedIndexes->Count() == 0)
+        {
+        oneItemSelected = ETrue;
+        }
+    TInt markedItemCount = constMarkedIndexes->Count();
+    TInt i(0);
+    while( markedItemCount >0 || oneItemSelected)
+	    {
+	    if(oneItemSelected)
+		    {
+		    index = iDialog->CurrentItemIndex();
+		    oneItemSelected = EFalse;
+		    }
+		else
+			{
+			index = constMarkedIndexes->At(i);
+			i++;
+			}
+		CLmkLandmark* lmklandmark = iParser.LmkLandmarkLC(index);
+        User::LeaveIfError(lmkArray.Append(lmklandmark));
+        CleanupStack::Pop();//lmklandmark
+        --markedItemCount;
+	    }
+	iDialog->ListBox()->ClearSelection();
+	iDialog->UpdateMskL();
+    iSender.SendLandmarksL(aCommandId,iParser.PackageName(),lmkArray);
+    lmkArray.ResetAndDestroy();
+    }
+
+// ----------------------------------------------------
+// CLmkDlgPackageSelectorImpl::SendAllLandmarksCmdL
+// ----------------------------------------------------
+//
+void CLmkDlgPackageSelectorImpl::SendAllLandmarksCmdL(TInt aCommandId)
+    {
+
+    RPointerArray<CLmkLandmark> lmkArray;
+    for ( TInt i(0); i < iParser.NumOfParsedLandmarks(); i++ )
+        {
+        CLmkLandmark* lmklandmark = iParser.LmkLandmarkLC(i);
+        User::LeaveIfError(lmkArray.Append(lmklandmark));
+        CleanupStack::Pop();//lmklandmark
+        }
+
+	iSender.SendLandmarksL(aCommandId,iParser.PackageName(),lmkArray);
+    lmkArray.ResetAndDestroy();
+    }
+
+// -----------------------------------------------------------------------------
+// CLmkDlgPackageSelectorImpl::IsLandmarkDataEmptyL
+// -----------------------------------------------------------------------------
+//
+TBool CLmkDlgPackageSelectorImpl::IsLandmarkDataEmptyL(
+        CPosLandmark* aLandmark)
+    {
+    // verify that destination landmark has coordinates
+    TLocality loc;
+    TBool isValid = (KErrNone == aLandmark->GetPosition(loc));
+    isValid &= !Math::IsNaN(loc.Latitude()) && !Math::IsNaN(loc.Longitude());
+    return !isValid;
+    
+/*    if (!isValid)
+        {
+        // verify that destination landmark has address info
+        TPositionFieldId fieldId = aLandmark->FirstPositionFieldId();
+        while (fieldId != EPositionFieldNone)
+            {
+            if (fieldId > EPositionFieldAddressCapabilitiesBegin && fieldId
+                    < EPositionFieldBuildingTelephone)
+                {
+                TPtrC field;
+                aLandmark->GetPositionField(fieldId, field);
+                if (field.Length())
+                    {
+                    isValid = ETrue;
+                    break;
+                    }
+                }
+            fieldId = aLandmark->NextPositionFieldId(fieldId);
+            }
+        }
+    return !isValid;*/
+    }
+
+//  End of File