calendarui/controller/src/calenactionui.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 09 Jun 2010 09:40:23 +0300
branchRCL_3
changeset 20 9c5b1510919f
parent 16 55d60436f00b
child 29 12af337248b1
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

/*
* Copyright (c) 2007-2008 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:  Calendar action ui
*
*/


// INCLUDES
#include <aknViewAppUi.h>
#include <avkon.hrh>
#include <aknnavi.h>
#include <akntitle.h>
#include <eikspane.h>
#include <Calendar.rsg>
#include <calencommonui.rsg>
#include <calenservices.h>
#include <calentoolbar.h>

#include "calendarui_debug.h"
#include "calenactionui.h"
#include "calencontroller.h"
#include "calendeleteui.h"
#include "caleneditui.h"
#include "calenlocationui.h"
#include "calensettingsui.h"
#include "calennotifier.h"
#include "calenmultipledbui.h"
#include "calenattachmentui.h"
#include "CalenUid.h"
#include "calenviewmanager.h"

// ----------------------------------------------------------------------------
// CCalenActionUi::NewL
// 1st phase of construction
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenActionUi* CCalenActionUi::NewL( CCalenController& aController )
    {
    TRACE_ENTRY_POINT;

    CCalenActionUi* self = new( ELeave ) CCalenActionUi( aController );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );

    TRACE_EXIT_POINT;
    return self;
    }

// ----------------------------------------------------------------------------
// CCalenActionUi::CCalenActionUi
// C++ default constructor.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenActionUi::CCalenActionUi( CCalenController& aController )
    : iController( aController )
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenActionUi::ConstructL
// 2nd phase of construction.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenActionUi::ConstructL()
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenActionUi::~CCalenActionUi
// Destructor.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenActionUi::~CCalenActionUi()
    {
    TRACE_ENTRY_POINT;

    delete iDeleteUi;
    delete iEditUi;
    delete iLocationUi;
    delete iAttachmentUi;
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenActionUi::GetCommandHandlerL
// Gets a command handler
// ----------------------------------------------------------------------------
//
MCalenCommandHandler* CCalenActionUi::GetCommandHandlerL( TInt aCommand )
    {
    MCalenCommandHandler* handler = NULL;

    if( aCommand >= ECalenEditCommandBase &&
        aCommand < ECalenDeleteCommandBase )
        {
        if(!iEditUi)
            {
            iEditUi = CCalenEditUi::NewL(iController);
            }
        handler = iEditUi;
        }
    else if( aCommand >= ECalenDeleteCommandBase &&
             aCommand < ECalenSettingsCommandBase )
        {
        if(!iDeleteUi)
            {
            iDeleteUi = CCalenDeleteUi::NewL( iController );
            }
        handler = iDeleteUi;
        }
    else if( aCommand >= ECalenSettingsCommandBase &&
             aCommand < ECalenMapCommandBase )
        {
        handler = this;
        }
    else if( aCommand >= ECalenMapCommandBase &&
             aCommand < ECalenAttachmentCommandBase )
        {
        if(!iLocationUi)
            {
            iLocationUi = CCalenLocationUi::NewL( iController );
            }
        handler = iLocationUi;
        }
    else if( aCommand >= ECalenAttachmentCommandBase && 
             aCommand < ECalenLastCommand )
        {
        if(!iAttachmentUi)
            {
            iAttachmentUi = CCalenAttachmentUi::NewL(iController);
            }
        handler = iAttachmentUi;
        }

    TRACE_EXIT_POINT;
    return handler;
    }

// ----------------------------------------------------------------------------
// CCalenActionUi::HandleCommmandL
// Handles Calendar commands. Delegates to appropriate action ui.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
/*TBool CCalenActionUi::HandleActionUiCommandL( TInt aCommand )
    {
    TRACE_ENTRY_POINT;

    // Lazy initialisation for action uis.
    TBool handled( EFalse );

    if( aCommand >= ECalenEditCommandBase && aCommand < ECalenLastCommand )
        {
        if( !iEditUi )
            {
            iEditUi = CCalenEditUi::NewL( iController );
            }
        handled = iEditUi->HandleActionUiCommandL( aCommand );

        if( !handled )
            {
            if( !iDeleteUi )
                {
                iDeleteUi = CCalenDeleteUi::NewL( iController );
                }
            handled = iDeleteUi->HandleActionUiCommandL( aCommand );
            }

        if( !handled && aCommand == ECalenShowSettings )
            {
            handled = ETrue;

            ShowSettingsL();
            }
        }

    TRACE_EXIT_POINT;
    return handled;
    }*/


// ----------------------------------------------------------------------------
// CCalenActionUi::HandleCommandL
// Handles key presses.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TBool CCalenActionUi::HandleCommandL( const TCalenCommand& aCommand )
    {
    TRACE_ENTRY_POINT;
    TBool continueCommand(EFalse);

    switch(aCommand.Command())
        {
        case ECalenShowSettings:
            {
            ShowSettingsL();
            }
            break;
        case ECalenShowCalendars:
            {
            ShowCalendarsL();
            }
            break;
        default:
            break;
        }

    TRACE_EXIT_POINT;
    return continueCommand;
    }

// ----------------------------------------------------------------------------
// CCalenActionUi::CalenCommandHandlerExtensionL
// Dummy implementation.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TAny* CCalenActionUi::CalenCommandHandlerExtensionL( TUid /*aExtensionUid*/ )
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    return NULL;
    }

// ----------------------------------------------------------------------------
// CCalenActionUi::ShowCalendarsL
// Shows the multiple db calendar's dialog
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenActionUi::ShowCalendarsL()
    {
    TRACE_ENTRY_POINT;
    // Create settings own titlepane and navipane, and swap with existing ones
    CEikStatusPane* sp = CEikonEnv::Static()->AppUiFactory()->StatusPane();
    
    // Titlepane
    CAknTitlePane* newtp = new( ELeave ) CAknTitlePane();
    CleanupStack::PushL( newtp );
    CCoeControl* oldtp = sp->SwapControlL( TUid::Uid(EEikStatusPaneUidTitle), newtp );
    CleanupStack::Pop( newtp ); // ownership is passed to statuspane
    TRect oldRect( 0, 0, 0, 0 );
    if( oldtp )
        {
        CleanupStack::PushL( oldtp );
        oldRect = oldtp->Rect();
        CCoeControl* ctrl = sp->ContainerControlL( TUid::Uid( EEikStatusPaneUidTitle ));
        newtp->SetContainerWindowL( *ctrl );
        newtp->ConstructL();
        newtp->SetRect(oldRect);
        newtp->ActivateL();
        }        
    // NaviPane
    CAknNavigationControlContainer* newnp = new( ELeave )CAknNavigationControlContainer();
    CleanupStack::PushL( newnp );
    CCoeControl* oldnp = sp->SwapControlL( TUid::Uid( EEikStatusPaneUidNavi ), newnp );
    CleanupStack::Pop( newnp ); // ownership is passed to statuspane
    if( oldnp )
        {
        CleanupStack::PushL( oldnp );
        oldRect = oldnp->Rect();
        CCoeControl* ctrl = sp->ContainerControlL( TUid::Uid( EEikStatusPaneUidNavi ) );
        newnp->SetContainerWindowL( *ctrl );
        newnp->ConstructL();
        newnp->SetRect( oldRect );
        newnp->PushDefaultL();
        newnp->ActivateL();
        }
            
        // Hide the toolbar before we display settings menu
        MCalenToolbar* toolbar = iController.Services().ToolbarOrNull();
        if(toolbar)
            {
            toolbar->SetToolbarVisibilityL(EFalse);  
            }
        
        // defer settings notifications before launching the settings  
        CCalenNotifier& notifier = iController.Notifier();
        notifier.DeferSettingsNotifications();
        
        CCalenMultipleDbUi* dlg = CCalenMultipleDbUi::NewL(iController);
        TInt retValue = KErrNone;
        // Trap showing settings so settings watcher is always resumed.
        PIM_TRAPD_HANDLE( retValue = dlg->ExecuteLD( R_CALEN_MULTIPLEDB_DIALOG ) );
        notifier.ResumeSettingsNotifications();
        
        // Unhide the toolbar when manage calendar view is closed
        TUid activeViewUid = iController.ViewManager().CurrentView();
        if(toolbar && (activeViewUid != KUidCalenMissedAlarmsView ) &&(activeViewUid != KUidCalenMissedEventView ) )
            {
            toolbar->SetToolbarVisibilityL(ETrue); 
            }
        
    // When setting is closed, swap back old titlepane and navipane
    if( oldnp && sp->SwapControlL( TUid::Uid(EEikStatusPaneUidNavi), oldnp ) )
        {
        CleanupStack::Pop( oldnp );
        delete newnp;
        oldnp->ActivateL();
        }
    if( oldtp && sp->SwapControlL( TUid::Uid(EEikStatusPaneUidTitle), oldtp ) )
        {
        CleanupStack::Pop( oldtp );
        delete newtp;
        oldtp->ActivateL();
        }
    
    iController.BroadcastNotification( ECalenNotifyCalendarFieldChanged );

    if( retValue == EAknCmdExit ||
        retValue == EKeyEscape )
        {
        // iController.IssueCommandL( EAknCmdExit );
        // FIX ME ::
        // Issuing the command from here will not exit the application properly
        // because aknviewappui is not exited
        // Calling ProcessCommandL of aknviewappui will exits the application
        iController.AppUi().ProcessCommandL(EAknCmdExit);
        }
    else if(retValue == EAknSoftkeyExit)
        {
        // iController.IssueCommandL( EAknCmdExit );
        // FIX ME ::
        // Issuing the command from here will not exit the application properly
        // because aknviewappui is not exited
        // Calling ProcessCommandL of aknviewappui will exits the application
        iController.AppUi().ProcessCommandL(EAknSoftkeyExit);
        }

    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenActionUi::ShowSettingsL
// Shows the settings dialog
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenActionUi::ShowSettingsL()
    {
    TRACE_ENTRY_POINT;
    
    // Create settings own titlepane and navipane, and swap with existing ones
    CEikStatusPane* sp = CEikonEnv::Static()->AppUiFactory()->StatusPane();
    
    // Titlepane
    CAknTitlePane* newtp = new( ELeave ) CAknTitlePane();
    CleanupStack::PushL( newtp );
    CCoeControl* oldtp = sp->SwapControlL( TUid::Uid(EEikStatusPaneUidTitle), newtp );
    CleanupStack::Pop( newtp ); // ownership is passed to statuspane
    TRect oldRect( 0, 0, 0, 0 );
    if( oldtp )
        {
        CleanupStack::PushL( oldtp );
        oldRect = oldtp->Rect();
        CCoeControl* ctrl = sp->ContainerControlL( TUid::Uid( EEikStatusPaneUidTitle ));
        newtp->SetContainerWindowL( *ctrl );
        newtp->ConstructL();
        newtp->SetRect(oldRect);
        newtp->ActivateL();
        }        
    
    // NaviPane
    CAknNavigationControlContainer* newnp = new( ELeave )CAknNavigationControlContainer();
    CleanupStack::PushL( newnp );
    CCoeControl* oldnp = sp->SwapControlL( TUid::Uid( EEikStatusPaneUidNavi ), newnp );
    CleanupStack::Pop( newnp ); // ownership is passed to statuspane
    if( oldnp )
        {
        CleanupStack::PushL( oldnp );
        oldRect = oldnp->Rect();
        CCoeControl* ctrl = sp->ContainerControlL( TUid::Uid( EEikStatusPaneUidNavi ) );
        newnp->SetContainerWindowL( *ctrl );
        newnp->ConstructL();
        newnp->SetRect( oldRect );
        newnp->PushDefaultL();
        newnp->ActivateL();
        }
        
    // Hide the toolbar before we display settings menu
    MCalenToolbar* toolbar = iController.Services().ToolbarOrNull();
    if(toolbar)
        {
        toolbar->SetToolbarVisibilityL(EFalse);  
        }
    
    // defer settings notifications before launching the settings  
    CCalenNotifier& notifier = iController.Notifier();
    notifier.DeferSettingsNotifications();
    
    CCalenSettingsUi* dlg = CCalenSettingsUi::NewL(iController.CustomisationManager());
    TInt retValue = KErrNone;
    // Trap showing settings so settings watcher is always resumed.
    PIM_TRAPD_HANDLE( retValue = dlg->ExecuteLD( R_CALEN_SETTING_DIALOG ) );
    notifier.ResumeSettingsNotifications();
    
    // Unhide the toolbar when settings is closed
    TUid activeViewUid = iController.ViewManager().CurrentView();
    if(toolbar && (activeViewUid != KUidCalenMissedAlarmsView ) &&(activeViewUid != KUidCalenMissedEventView ) )
        {
        toolbar->SetToolbarVisibilityL(ETrue); 
        }
    
    // When setting is closed, swap back old titlepane and navipane
    if( oldnp && sp->SwapControlL( TUid::Uid(EEikStatusPaneUidNavi), oldnp ) )
        {
        CleanupStack::Pop( oldnp );
        delete newnp;
        oldnp->ActivateL();
        }
    if( oldtp && sp->SwapControlL( TUid::Uid(EEikStatusPaneUidTitle), oldtp ) )
        {
        CleanupStack::Pop( oldtp );
        delete newtp;
        oldtp->ActivateL();
        }
    
    iController.BroadcastNotification( ECalenNotifySettingsClosed );

      if( retValue == EAknCmdExit ||
        retValue == EKeyEscape )
        {
        // iController.IssueCommandL( EAknCmdExit );
        // FIX ME ::
        // Issuing the command from here will not exit the application properly
        // because aknviewappui is not exited
        // Calling ProcessCommandL of aknviewappui will exits the application
        iController.AppUi().ProcessCommandL(EAknCmdExit);
        }
    else if(retValue == EAknSoftkeyExit)
        {
        // iController.IssueCommandL( EAknCmdExit );
        // FIX ME ::
        // Issuing the command from here will not exit the application properly
        // because aknviewappui is not exited
        // Calling ProcessCommandL of aknviewappui will exits the application
        iController.AppUi().ProcessCommandL(EAknSoftkeyExit);
        }
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenActionUi::IsEditorActive
// Tells framework whether editor is active or not
// -----------------------------------------------------------------------------
//
TBool CCalenActionUi::IsEditorActive()
    {
    if(iEditUi)
        {
        return(iEditUi->IsEditorActive());
        }
    else
        return EFalse;
    }

// End of file