landmarksui/uicontrols/src/CLmkPackageEditorImpl.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:27 +0100
branchRCL_3
changeset 18 870918037e16
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
 * 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 Package viewer implementation 
 *                  For Received Landmark
 *
 */

// INCLUDE FILES
#include <featmgr.h>
#include <aknnotewrappers.h>
#include <AknWaitDialog.h>
#include <aknlists.h>
#include <StringLoader.h>
#include <AknQueryDialog.h>
#include <lmkui.rsg>
#include <eikmenup.h>
#include <hlplch.h>
#include <sendnorm.rsg> // R_SENDUI_MENU
#include <CLmkEditorDlg.h> // from system include!
#include "CLmkParser.h"
#include "landmarks.hrh"
#include "LmkUID.h"
#include <csxhelp/lmmes.hlp.hrh>
#include "CLmkUiUtils.h"
#include "CLmkEditorFieldArray.h"
#include "MLmkEditorField.h"
#include "LmkNotes.h"
#include "LmkConsts.h"
#include "CLmkDbUtils.h"
#include "CLmkLocationService.h"
#include "CLmkDlgCategorySelectorImpl.h"
#include "CLmkSender.h"
#include "CLmkLandMarkCategoriesName.h"
#include "CLmkPackageEditorImpl.h"
#include "CLmkSaveLandmarkUtils.h"

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CLmkPackageEditorImpl::CLmkPackageEditorImpl
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CLmkPackageEditorImpl::CLmkPackageEditorImpl(CPosLandmarkDatabase& aDb,
        CLmkParser& aParser, CLmkSender& aSender, TInt aItemIndex) :
    CLmkEditorImpl(aDb, aSender, CLmkEditorDlg::ELmkViewer), // viewing only mode!
            iParser(aParser), iItemIndex(aItemIndex)
    {
    TCoeHelpContext
            help(TUid::Uid(KLmkMsgViewerAppUID3), KLM_HLP_RECEIVED_LM);
    SetHelpContext(help);
    }

// -----------------------------------------------------------------------------
// CLmkPackageEditorImpl::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CLmkPackageEditorImpl::ConstructL()
    {
    iLandmark = iParser.LandmarkLC(iItemIndex);
    iCategoryNameArray = iParser.CategoryNameLC(iItemIndex);
    iCategoryNameArray->GetCategoryNames(iCategoryNames);
    iCalegorySelectionFlag = ETrue;
    CleanupStack::Pop(2); //iLandmark ,iCategoryNames
    TLmkEditorAttributes arguments(CLmkEditorDlg::ELmkAll);
    iIsLmkReceiveMode = ETrue;
    CLmkEditorImpl::ConstructL(iLandmark, arguments);
    }

// -----------------------------------------------------------------------------
// CLmkPackageEditorImpl::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C CLmkPackageEditorImpl* CLmkPackageEditorImpl::NewL(
        CPosLandmarkDatabase& aDb, CLmkParser& aParser, CLmkSender& aSender,
        TInt aItemIndex)
    {
    CLmkPackageEditorImpl* self = new (ELeave) CLmkPackageEditorImpl(aDb,
            aParser, aSender, aItemIndex);

    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(); //self
    return self;
    }

// -----------------------------------------------------------------------------
// CLmkPackageEditorImpl::~CLmkPackageEditorImpl()
// -----------------------------------------------------------------------------
//
CLmkPackageEditorImpl::~CLmkPackageEditorImpl()
    {
    if (iWaitNote)
        {
        TRAPD(err, iWaitNote->ProcessFinishedL());
        if (err != KErrNone)
            {
            delete iWaitNote;
            iWaitNote = NULL;
            }
        }
    delete iLandmark;
    delete iCategoryNameArray;
    }

// -----------------------------------------------------------------------------
// CLmkPackageEditorImpl::HandleOperationL
// -----------------------------------------------------------------------------
//
void CLmkPackageEditorImpl::HandleOperationL(TOperationTypes aType,
        TReal32 /*aProgress*/, TInt aStatus)
    {
    if (aType == EImport)
        {
        if (aStatus != KPosLmOperationNotComplete && iWaitNote)
            {
            iWaitNote->ProcessFinishedL();
            iWaitNote = NULL;
            }
        }
    }

// -----------------------------------------------------------------------------
// CLmkPackageEditorImpl::DynInitMenuPaneL
// -----------------------------------------------------------------------------
//
void CLmkPackageEditorImpl::DynInitMenuPaneL(TInt aResourceId,
        CEikMenuPane* aMenuPane)
    {
    switch (aResourceId)
        {
        case R_AVKON_FORM_MENUPANE:
            {
            CAknForm::DynInitMenuPaneL(aResourceId, aMenuPane);
            TBool hideMN = EFalse;
            if (iIsHideCoordinate)
                {
                if (IsLandmarkDataEmptyL(iLandmark))
                    {
                    hideMN = ETrue;
                    }
                }
            else if (ArePositionFieldEmptyL())
                {
                hideMN = ETrue;
                }

            if (hideMN)
                {
                // delete the show on map & Navigate To options
                aMenuPane->DeleteMenuItem(ELmkShowOnMapPlaceHolder);
                aMenuPane->DeleteMenuItem(ELmkNavigateToPlaceHolder);
                }
            iMapNavInterface->AttachMenuPaneL(aMenuPane, R_LMK_EDITOR_MENU,
                    ELmkCmdMnNav);

            // Send menu is handled by the sender:
            if ( FeatureManager::FeatureSupported( KFeatureIdLandmarksConverter ) )
                {
                aMenuPane->SetItemDimmed(ELmkCmdSendDummy, EFalse);

                // Use default "Send" item text from SendUI
                iSender.DisplaySendMenuL(*aMenuPane, 1);
                }
            else
                {
                aMenuPane->SetItemDimmed(ELmkCmdSendDummy, ETrue);
                }

            if (FeatureManager::FeatureSupported(KFeatureIdHelp)
                    && !iIsHideHelp)
                {
                aMenuPane->SetItemDimmed(EAknCmdHelp, EFalse);
                }
            else
                {
                aMenuPane->SetItemDimmed(EAknCmdHelp, ETrue);
                }

            //shown in package editor mode:
            aMenuPane->SetItemDimmed(ELmkCmdSaveLm, EFalse);
            DimmMenuItemsL(aMenuPane);
            //always dimmed
            aMenuPane->SetItemDimmed(EAknFormCmdEdit, ETrue);
            aMenuPane->SetItemDimmed(EAknFormCmdSave, ETrue);
            aMenuPane->SetItemDimmed(EAknFormCmdLabel, ETrue);
            aMenuPane->SetItemDimmed(EAknFormCmdAdd, ETrue);
            aMenuPane->SetItemDimmed(EAknFormCmdDelete, ETrue);
            break;
            }
        case R_SENDUI_MENU: // Dynamically created send ui menu
            {
            if (FeatureManager::FeatureSupported(KFeatureIdLandmarksConverter))
                {
                iSender.DisplaySendCascadeMenuL(*aMenuPane);
                }
            break;
            }
        case R_LMK_EDITOR_MENU:
            {
            TBool hideMN = EFalse;
            if (iIsHideCoordinate)
                {
                if (IsLandmarkDataEmptyL(iLandmark))
                    {
                    hideMN = ETrue;
                    }
                }
            else if (ArePositionFieldEmptyL())
                {
                hideMN = ETrue;
                }

            if (hideMN)
                {
                // delete the show on map & Navigate To options
                aMenuPane->DeleteMenuItem(ELmkShowOnMapPlaceHolder);
                aMenuPane->DeleteMenuItem(ELmkNavigateToPlaceHolder);
                }
            iMapNavInterface->AttachMenuPaneL(aMenuPane, R_LMK_EDITOR_MENU,
                    ELmkCmdMnNav);

            // Send menu is handled by the sender:
            if (FeatureManager::FeatureSupported(KFeatureIdLandmarksConverter))
                {
                aMenuPane->SetItemDimmed(ELmkCmdSendDummy, EFalse);

                // Use default "Send" item text from SendUI
                iSender.DisplaySendMenuL(*aMenuPane, 1);
                }
            DimmMenuItemsL(aMenuPane);
            break;
            }
        default:
            {
            break;
            }
        }
    iMapNavInterface->HandleMenuOperationL(aResourceId, aMenuPane,
            ELmkCmdMnNav);
    }

// -----------------------------------------------------------------------------
// CLmkPackageEditorImpl::ProcessCommandL
// -----------------------------------------------------------------------------
//
void CLmkPackageEditorImpl::ProcessCommandL(TInt aCommandId)
    {
    CAknDialog::ProcessCommandL(aCommandId);
    iContextMenuBar->StopDisplayingMenuBar();
    // Override just a couple of CLmkEditorImpl implementations:
    switch (aCommandId)
        {
        case ELmkCmdSaveLm:
            {
            SaveLandmarkCmdL();
            break;
            }
            // fall through all send cmds:
        case ELmkCmdSendVia1:
        case ELmkCmdSendVia2:
        case ELmkCmdSendVia3:
        case ELmkCmdSendVia4:
        case ELmkCmdSendVia5:
        case ELmkCmdSendVia6:
        case ELmkCmdSendVia7:
        case ELmkCmdSendVia8:
        case ELmkCmdSendVia9:
        case ELmkCmdSendVia10:
        case ELmkCmdSend:
            {
            SendLandmarkCmdL(aCommandId);
            break;
            }
        case EAknSoftkeyContextOptions:
            {
            iContextMenuBar->SetContextMenuTitleResourceId(
                    R_LMK_MSGVIEWER_CONTEXT_MENUBAR);            
            iContextMenuBar->TryDisplayContextMenuBarL();
            break;
            }
        default:
            {
            CLmkEditorImpl::ProcessCommandL(aCommandId);
            break;
            }
        }
    }

// ----------------------------------------------------
// CLmkPackageEditorImpl::SaveLandmarkCmdL
// ----------------------------------------------------
//
void CLmkPackageEditorImpl::SaveLandmarkCmdL()
    {
    // Only one item is stored but API requires an array:
    RArray<TUint> importIndexes(1);
    CleanupClosePushL(importIndexes);
    User::LeaveIfError(importIndexes.Append(iItemIndex));
    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
        }
    CleanupStack::PopAndDestroy(); // newCategories
    // 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(2);// saveLmUtils, importIndexes
        return;
        }
    // Saved confirmation note
    saveLmUtils->LmsSavedConfirmationNoteL(importIndexes, iItemIndex);
    CleanupStack::PopAndDestroy(2);// saveLmUtils, importIndexes
    }

// ----------------------------------------------------
// CLmkPackageEditorImpl::SendLandmarkCmdL
// ----------------------------------------------------
//
void CLmkPackageEditorImpl::SendLandmarkCmdL(TInt aCommandId)
    {
    CLmkLandmark* lmk = iParser.LmkLandmarkLC(iItemIndex);
    iSender.SendSingleLandmarkL(aCommandId, *lmk);
    CleanupStack::PopAndDestroy();//lmk
    }

// ----------------------------------------------------
// CLmkPackageEditorImpl::UpdateMskOnArrowMoveForViewerL
// ----------------------------------------------------
//
void CLmkPackageEditorImpl::UpdateMskOnArrowMoveForViewerL()
    {
    MLmkEditorField* field = iEditorFieldArray->Find(IdOfFocusControl());
    TUint type = field->LandmarkItemField().FieldType();
    switch (type)
        {
        case ECategories:
            {
            CEikButtonGroupContainer* cba =
                    CEikButtonGroupContainer::Current();
            cba->RemoveCommandFromStack(KMskCommandPos,
                    EAknSoftkeyContextOptions);
            AddMskCommandL(R_LM_MSK_SHOW, ELmkCmdShow);
            break;
            }
        default:
            {
            EnableMskMenuL();
            break;
            }
        }
    }

// ----------------------------------------------------
// CLmkPackageEditorImpl::EnableMskMenuL
// ----------------------------------------------------
//
void CLmkPackageEditorImpl::EnableMskMenuL()
    {
    CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
    cba->RemoveCommandFromStack(KMskCommandPos, ELmkCmdShow);
    cba->SetCommandSetL(
            R_LMK_RECEIVED_VIEWER_SOFTKEYS_OPTIONS_BACK_CONTEXTOPTIONS);
    cba->MakeCommandVisible(EAknSoftkeyContextOptions, ETrue);
    iContextMenuBar->SetContextMenuTitleResourceId(
            R_LMK_MSGVIEWER_CONTEXT_MENUBAR);
    }

// ----------------------------------------------------
// CLmkPackageEditorImpl::PostLayoutDynInitL
// ----------------------------------------------------
//
void CLmkPackageEditorImpl::PostLayoutDynInitL()
    {
    CLmkEditorImpl::PostLayoutDynInitL();
    CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
    EnableMskMenuL();
    }

// ----------------------------------------------------
// CLmkPackageEditorImpl::DimmMenuItems
// ----------------------------------------------------
//
void CLmkPackageEditorImpl::DimmMenuItemsL(CEikMenuPane* aMenuPane)
    {
    //not shown in package editor mode:
    aMenuPane->SetItemDimmed(ELmkCmdCategories, ETrue);
    aMenuPane->SetItemDimmed(ELmkCmdDeleteLm, ETrue);
    aMenuPane->SetItemDimmed(ELmkCmdSelectCategories, ETrue);
    aMenuPane->SetItemDimmed(ELmkCmdCurrentLocation, ETrue);
    aMenuPane->SetItemDimmed(ELmkCmdChangeIcon, ETrue);
    aMenuPane->SetItemDimmed(ELmkCmdEditTextLm, ETrue);
    //additional commands always dimmed in this class:
    aMenuPane->SetItemDimmed(ELmkCmdEditLm, ETrue);
    aMenuPane->SetItemDimmed(ELmkCmdCall, ETrue);
    aMenuPane->SetItemDimmed(ELmkCmdGoToUrl, ETrue);
    aMenuPane->SetItemDimmed(ELmkCmdClearPosInfo, ETrue);
    }

#ifdef RD_SCALABLE_UI_V2
// -----------------------------------------------------------------------------
// CLmkPackageEditorImpl::HandleDialogPageEventL
// -----------------------------------------------------------------------------
//
void CLmkPackageEditorImpl::HandleDialogPageEventL(TInt aEventID)
    {
    CAknForm::HandleDialogPageEventL(aEventID);
    if (aEventID == MEikDialogPageObserver::EDialogPageTapped)
        {
        iContextMenuBar->SetContextMenuTitleResourceId(
                R_LMK_MSGVIEWER_CONTEXT_MENUBAR);    
        iContextMenuBar->TryDisplayContextMenuBarL();        
        }
    }
#endif//RD_SCALABLE_UI_V2

//  End of File