diff -r 1fc85118c3ae -r 870918037e16 landmarksui/app/src/CLmkByLmView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/app/src/CLmkByLmView.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,633 @@ +/* + * Copyright (c) 2005-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: Provides Landmarksui main view class methods. + * + */ + +// INCLUDE FILES +#include +#include +#include +#include // R_SENDUI_MENU +#include +#include +#include +#include "landmarks.hrh" +#include "CLmkByLmContainer.h" +#include "CLmkAppSelectorImplBase.h" +#include "MLmkListMemento.h" +#include "CLmkAppUi.h" +#include "CLmkByLmView.h" +#include "CLmkSender.h" +#include "Debug.h" +#include "landmarks.hrh" +#include "clmkmapnavigationinterface.h" +#include "CLmkDocument.h" +#include + +// ================= LOCAL FUNCTIONS ======================= +static void CleanupArray(TAny* aArray) + { + (static_cast*> (aArray))->ResetAndDestroy(); + } + +// ================= MEMBER FUNCTIONS ======================= +// ---------------------------------------------------------------------------- +// CLmkByLmView::NewLC +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CLmkByLmView* CLmkByLmView::NewLC(MLmkKeyProcessor& aKeyProcessor, + CLmkSender& aLmkSender) + { + CLmkByLmView* self = new (ELeave) CLmkByLmView(aKeyProcessor, aLmkSender); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::CLmkByLmView +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CLmkByLmView::CLmkByLmView(MLmkKeyProcessor& aKeyProcessor, + CLmkSender& aLmkSender) : + CLmkBaseView(aKeyProcessor), iLmkSender(aLmkSender) + { + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::ConstructL +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CLmkByLmView::ConstructL() + { + CLmkAppUi* lmkAppUi = static_cast (AppUi()); + if (iEikonEnv->StartedAsServerApp()) + { + BaseConstructL( R_LMK_BYLM_EMBEDDED_VIEW); + isEmbeddedLaunch = ETrue; + } + else + { + BaseConstructL( R_LMK_BYLM_VIEW); + } + CPosLandmarkDatabase& db = lmkAppUi->Document().LmDbL(); + iMapNavInterface = CLmkMapNavigationInterface::NewL(db); + AttachAIWMenuInterestL(); + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::~CLmkByLmView +// ---------------------------------------------------------------------------- +// +CLmkByLmView::~CLmkByLmView() + { + if (iContainer) + { + AppUi()->RemoveFromViewStack(*this, iContainer); + } + delete iContainer; + delete iListMemento; + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::ProcessKeyEventL +// ---------------------------------------------------------------------------- +// +TBool CLmkByLmView::ProcessKeyEventL(const TKeyEvent& aKeyEvent, + TEventCode aType) + { + return CLmkBaseView::ProcessKeyEventL(aKeyEvent, aType); + } + +// ---------------------------------------------------------------------------- +// TUid CLmkByLmView::Id +// ---------------------------------------------------------------------------- +// +TUid CLmkByLmView::Id() const + { + return TUid::Uid(ELmkByLmView); + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::AttachAIWMenuInterestL +// ---------------------------------------------------------------------------- +// +void CLmkByLmView::AttachAIWMenuInterestL() + { + iMapNavInterface->AttachAIWInterestL(R_LMK_NEW_LANDMARK_SUBMENU, + R_LMK_AIW_INTEREST_SELECTFROMMAP); + iMapNavInterface->AttachAIWInterestL(R_LMK_BYLM_MENU1, + R_LMK_AIW_INTEREST_SHOWONMAP); + iMapNavInterface->AttachAIWInterestL(R_LMK_BYLM_MENU1, + R_LMK_AIW_INTEREST_NAVIGATETO); + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::HandleCommandL +// ---------------------------------------------------------------------------- +// +void CLmkByLmView::HandleCommandL(TInt aCommand) + { + DEBUG1( CLmkByLmView::HandleCommandL entered with aCommand=%d, aCommand); + + AknSelectionService::HandleMarkableListProcessCommandL(aCommand, + &(iContainer->ListBox())); + CLmkAppSelectorImplBase& selector = iContainer->SelectorImpl(); + //first give a chance to M&N framework. + TInt aiwCmd = iMapNavInterface->GetServiceCmdByMenuCmd(aCommand); + if (KAiwCmdNone == aiwCmd) + { + aiwCmd = selector.ServiceCmdByMenuCmd(aCommand); + } + //Handle AIW command + if (HandleAIWserviceCommandsL(aiwCmd, aCommand)) + { + iContainer->ListBox().ClearSelection(); + EnableMskLabelL( ETrue); + return; + } + switch (aCommand) + { + case ELmkCmdNewLmCurrentLocation: + case ELmkCmdNewLmEmpty: + case ELmkCmdEditLm: + case ELmkCmdDeleteLm: + case ELmkCmdChangeIcon: + case ELmkCmdAddToCat: + 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: + case ELmkCmdOpenLm: + case EAknCmdMark: + case EAknCmdUnmark: + case EAknMarkAll: + case EAknUnmarkAll: + case ELmkCmdLaunchPositionSettings: + { + // Set pointer event handling EFalse, to handle the multiplt tap , + // Second tap becomes a pointer event for container, which has to be ignored + // fix for bug ECYU-7C24HQ + iContainer->SetHandlePointerEventBool(EFalse); + + TInt markedCount( + iContainer->SelectorImpl().ListMarkedItemCountL()); + DEBUG1( CLmkByLmView::HandleCommandL markedcount=%d,markedCount ); + + if (markedCount > 0 && aCommand == ELmkCmdOpenLm + && !iContainer->IsEditorOpened()) + { + if (MenuBar()) + { + MenuBar()->SetContextMenuTitleResourceId(R_LMK_OK_MENUBAR); + MenuBar()->TryDisplayContextMenuBarL(); + } + } + else if (aCommand == ELmkCmdOpenLm + && !iContainer->IsEditorOpened()) + { + iContainer->SelectorImpl().ProcessCommandL(aCommand); + iContainer->SetEditorOpenedBool(ETrue); + } + else + { + iContainer->SelectorImpl().ProcessCommandL(aCommand); + } + // Set pointer event handling ETrue + iContainer->SetHandlePointerEventBool(ETrue); + break; + } + default: + { + (static_cast (AppUi()))->HandleCommandL(aCommand); + break; + } + } + DEBUG ( CLmkByLmView::HandleCommandL End ); + } + +// --------------------------------------------------------- +// CLmkByLmView::DynInitMenuPaneL +// --------------------------------------------------------- +// +void CLmkByLmView::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane) + { + DEBUG( CLmkByLmView::DynInitMenuPaneL entered ); + iMapNavInterface->HandleMenuOperationL(aResourceId, aMenuPane, + ELmkCmdMnNav); + + AknSelectionService::HandleMarkableListDynInitMenuPane(aResourceId, + aMenuPane, &(iContainer->ListBox())); + + CLmkAppSelectorImplBase& selector = iContainer->SelectorImpl(); + TInt markedCount(selector.ListMarkedItemCountL()); + TInt visibleCount(selector.ListVisibleItemCount()); + DEBUG1( CLmkByLmView::DynInitMenuPaneL markedCount=%d,markedCount ); + DEBUG1( CLmkByLmView::DynInitMenuPaneL visibleCount=%d,visibleCount ); + + switch (aResourceId) + { + case R_LMK_BYLM_MENU1: + { + //always dimmed + aMenuPane->SetItemDimmed(ERemoveFromCat, ETrue); + aMenuPane->SetItemDimmed(ELmkCmdSendDummy, ETrue); + + // Send menu is handled by the sender: + if ( FeatureManager::FeatureSupported( KFeatureIdLandmarksConverter ) ) + { + iLmkSender.DisplaySendMenuL( *aMenuPane, visibleCount ); + if( visibleCount > 0 ) + { + TInt pos( 0 ); + aMenuPane->ItemAndPos( ELmkCmdSend, pos ); + if( pos > 0 ) + { + aMenuPane->SetItemDimmed(ELmkCmdSend,EFalse ); + aMenuPane->SetItemSpecific(ELmkCmdSend,ETrue); + } + } + } + + /* + If multiple landmarks are selected then we have to dim + Navigate To option. + if only one landmark is in focus then we have to dim + Navigate To & Show On Map options if the particular landmark + does not either have address or coordinates. + */ + + TBool isLandmarkDataEmpty = EFalse; + if (visibleCount == 0) + { + isLandmarkDataEmpty = ETrue; + } + else + { + if (markedCount == 1 || markedCount == 0) + { + // Get the selected landmark and check if it is empty + RPointerArray lmkArray; + TInt retVal = iContainer->GetSelectedLandmarksL(lmkArray); + if (retVal != KErrNotFound) + { + CleanupStack::PushL(TCleanupItem(CleanupArray, + &lmkArray)); + isLandmarkDataEmpty + = iContainer->IsLandmarkDataEmptyL( + lmkArray[0]); + CleanupStack::PopAndDestroy();// lmkArray + } + } + } + + TInt showOnMapCmd = -1; + TInt navigateToCmd = -1; + + TInt cnt = aMenuPane->NumberOfItemsInPane(); + + for (TInt i = 0; i < cnt; ++i) + { + CEikMenuPaneItem::SData& itemData = + aMenuPane->ItemDataByIndexL(i); + + if (iMapNavInterface->GetServiceCmdByMenuCmd( + itemData.iCommandId) == KAiwCmdMnShowMap) + { + showOnMapCmd = itemData.iCommandId; + } + if (iMapNavInterface->GetServiceCmdByMenuCmd( + itemData.iCommandId) == KAiwCmdMnNavigateTo) + { + navigateToCmd = itemData.iCommandId; + } + } + if (showOnMapCmd < 0 && navigateToCmd < 0) + { + break; + } + + if (isLandmarkDataEmpty || markedCount > 1) + { + aMenuPane->SetItemDimmed(showOnMapCmd, ETrue); + aMenuPane->SetItemDimmed(navigateToCmd, ETrue); + } + else + { + aMenuPane->SetItemDimmed(showOnMapCmd, EFalse); + aMenuPane->SetItemSpecific(showOnMapCmd, ETrue); + + aMenuPane->SetItemDimmed(navigateToCmd, EFalse); + aMenuPane->SetItemSpecific(navigateToCmd, ETrue); + } + break; + } + case R_LMK_OK_MENU: + { + DEBUG( CLmkByLmView::DynInitMenuPaneL R_LMK_OK_MENU ); + // Let send ui add the send menu if MTMs are available: + if (FeatureManager::FeatureSupported(KFeatureIdLandmarksConverter)) + { + iLmkSender.DisplaySendMenuL(*aMenuPane, visibleCount); + } + else + { + aMenuPane->SetItemDimmed(ELmkCmdSendDummy, ETrue); + } + if (visibleCount == 0) + { + aMenuPane->SetItemDimmed(ELmkCmdAddToCat, ETrue); + aMenuPane->SetItemDimmed(ELmkCmdDeleteLm, ETrue); + aMenuPane->SetItemDimmed(ELmkCmdNewLm, EFalse); + } + break; + } + case R_LMK_MAIN_MENU: + { + CLmkBaseView::HandleHelpFeature(aMenuPane); + break; + } + case R_SENDUI_MENU: // Dynamically created send ui menu + { + if (FeatureManager::FeatureSupported(KFeatureIdLandmarksConverter)) + { + iLmkSender.DisplaySendCascadeMenuL(*aMenuPane); + } + break; + } + case R_LMK_NEW_LANDMARK_SUBMENU: + { + if (FeatureManager::FeatureSupported( + KFeatureIdLocationFrameworkCore)) + { + aMenuPane->SetItemDimmed(ELmkCmdNewLmCurrentLocation, EFalse); + } + else + { + aMenuPane->SetItemDimmed(ELmkCmdNewLmCurrentLocation, ETrue); + } + + if (iIsHideCoordinate) + { + aMenuPane->SetItemDimmed(ELmkCmdNewLmEmpty, ETrue); + } + else + { + aMenuPane->SetItemDimmed(ELmkCmdNewLmEmpty, EFalse); + } + break; + } + default: + { + break; + } + } +DEBUG ( CLmkByLmView::DynInitMenuPaneL end ); + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::DoActivateL +// ---------------------------------------------------------------------------- +// +void CLmkByLmView::DoActivateL(const TVwsViewId& /*aPrevViewId*/, + TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/) + { + DEBUG( CLmkByLmView::DoActivateL entered ); + if (!iContainer) + { + iContainer + = CLmkByLmContainer::NewL(*this, this, ClientRect(), *this); + CLmkAppSelectorImplBase& selector = iContainer->SelectorImpl(); + AppUi()->AddToStackL(*this, iContainer); + +#ifdef RD_SCALABLE_UI_V2 + //for touch event + iContainer->SetListBoxObserver(this); +#endif//RD_SCALABLE_UI_V2 + if (!iListMemento) + { // Memento not created yet, create it now: + iListMemento = selector.MementoL(); + } + selector.SetMemento(*iListMemento); + selector.RestoreMemento(); + EnableMskMenuL( EFalse); + EnableMskLabelL(EFalse); + } +DEBUG ( CLmkByLmView::DoActivateL End ); + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::DoDeactivate +// ---------------------------------------------------------------------------- +// +void CLmkByLmView::DoDeactivate() + { + if (iContainer) + { + iContainer->SelectorImpl().StoreMemento(); + AppUi()->RemoveFromViewStack(*this, iContainer); + } + TRAP_IGNORE( EnableMskMenuL(EFalse)); + TRAP_IGNORE( EnableMskLabelL(EFalse)); + delete iContainer; + iContainer = NULL; + } + +// ---------------------------------------------------------------------------- +// CLmkByLmView::Update() +// ---------------------------------------------------------------------------- +// +void CLmkByLmView::Update() + { + iContainer->SetRect(ClientRect()); + } + +// --------------------------------------------------------- +// CLmkBaseView::EnableMskMenuL() +// --------------------------------------------------------- +// +void CLmkByLmView::EnableMskMenuL(TBool aEnable) + { + CEikButtonGroupContainer* cbaGrp = Cba(); + if (cbaGrp) + { + if (aEnable) + { + cbaGrp->RemoveCommandFromStack(KMskCommandPos, ELmkCmdOpenLm); + TInt + cbaRes = + isEmbeddedLaunch + ? R_LMK_SOFTKEYS_OPTIONS_BACK_CONTEXTOPTIONS + : R_LMK_SOFTKEYS_OPTIONS_EXIT_CONTEXTOPTIONS; + cbaGrp->SetCommandSetL(cbaRes); + cbaGrp->MakeCommandVisible(EAknSoftkeyContextOptions, ETrue); + if (MenuBar()) + MenuBar()->SetContextMenuTitleResourceId(R_LMK_OK_MENUBAR); + } + else + { + cbaGrp->MakeCommandVisible(EAknSoftkeyContextOptions, EFalse); + } + } + } + +// --------------------------------------------------------- +// CLmkBaseView::EnableMskLabelL() +// --------------------------------------------------------- +// +void CLmkByLmView::EnableMskLabelL(TBool aEnable) + { + + CEikButtonGroupContainer* cbaGrp = Cba(); + if (cbaGrp) + { + if (aEnable) + { + + HBufC* mskOpenTxt = NULL; + mskOpenTxt = StringLoader::LoadLC(R_LMK_MSK_OPEN, iEikonEnv); + cbaGrp->RemoveCommandFromStack(KMskCommandPos, + EAknSoftkeyContextOptions); + cbaGrp->AddCommandToStackL(KMskCommandPos, ELmkCmdOpenLm, + mskOpenTxt->Des()); + cbaGrp->MakeCommandVisible(ELmkCmdOpenLm, ETrue); + CleanupStack::PopAndDestroy(mskOpenTxt); + } + else + { + cbaGrp->MakeCommandVisible(ELmkCmdOpenLm, EFalse); + } + } + } + +#ifdef RD_SCALABLE_UI_V2 +// --------------------------------------------------------- +// CLmkByLmView::HandleListBoxEventL() +// --------------------------------------------------------- +// +void CLmkByLmView::HandleListBoxEventL(CEikListBox* /*aListBox*/, + TListBoxEvent aEventType) + { + TLmkMskDispItem dispItem = iContainer->ResolveMskDisplayItem(); + + switch (aEventType) + { + //case EEventItemDoubleClicked: + case EEventEmptyListClicked: + case EEventItemSingleClicked: + { + if (dispItem == EContextMenu) + { + UpdateMskViewL(dispItem); + CEikMenuBar* menubar = + static_cast (iAvkonAppUi)->View( + TUid::Uid(ELmkByLmView))->MenuBar(); + if (menubar) + { + TRAPD( err, menubar->TryDisplayContextMenuBarL() ); + User::LeaveIfError(err); + } + } + else if (dispItem == ELabel) + { + UpdateMskViewL(dispItem); + HandleCommandL(ELmkCmdOpenLm); + } + break; + } + + //case EEventItemClicked: + case EEventPanningStarted: + case EEventPanningStopped: + case EEventFlickStarted: + case EEventFlickStopped: + case EEventPenDownOnItem: + case EEventItemDraggingActioned: + { + if (dispItem == EContextMenu) + { + UpdateMskViewL(dispItem); + } + else if (dispItem == ELabel) + { + UpdateMskViewL(dispItem); + } + break; + } + default: + break; + } + } +#endif//RD_SCALABLE_UI_V2 +// --------------------------------------------------------- +// CLmkByLmView::HandleAIWserviceCommandsL() +// --------------------------------------------------------- +// +TBool CLmkByLmView::HandleAIWserviceCommandsL(TInt aServiceCommand, + TInt aMenuCommand) + { + TBool result = ETrue; + RPointerArray lmkArray; + switch (aServiceCommand) + { + case KAiwCmdMnNavigateTo: + { + if (iContainer->GetSelectedLandmarksL(lmkArray) == KErrNone) + { + CleanupStack::PushL(TCleanupItem(CleanupArray, &lmkArray)); + iMapNavInterface->NavigateToLandmarkL(lmkArray[0], + aMenuCommand); + CleanupStack::PopAndDestroy(); // lmkArray + } + break; + } + case KAiwCmdMnShowMap: + { + if (iContainer->GetSelectedLandmarksL(lmkArray) == KErrNone) + { + CleanupStack::PushL(TCleanupItem(CleanupArray, &lmkArray)); + iMapNavInterface->ShowLandmarksOnMapL(lmkArray, aMenuCommand, + CLmkMapNavigationInterface::EByLmkView); + CleanupStack::PopAndDestroy(); // lmkArray + } + break; + } + case KAiwCmdMnSelectFromMap: + { + iMapNavInterface->SetObserver(&iContainer->SelectorImpl()); + iMapNavInterface->GetLandmarkFromMapL(aMenuCommand); + break; + } + default: + { + result = EFalse; + break; + } + } + return result; + } + +// End of File