calendarui/controller/src/calenviewattachmentsdialog.cpp
author andy simpson <andrews@symbian.org>
Thu, 02 Sep 2010 15:47:07 +0100
branchRCL_3
changeset 67 1539a383d7b6
parent 20 21239b3bcd78
parent 66 bd7edf625bdd
permissions -rw-r--r--
Merge after removal of incorrect RCL_3 drop

/*
* Copyright (c) 2009 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:
*
*/

// ========== INCLUDE FILES ================================

#include <eikspane.h>
#include <eikmenup.h>
#include <AknDef.h>
#include <aknappui.h>
#include <akntitle.h>
#include <aknnavi.h>
#include <aknlists.h>
#include <gulicon.h>
#include <coeutils.h>               // for ConeUtils::FileExists
#include <bautils.h>
#include <aknnotewrappers.h>
#include <AknWaitDialog.h>          // CAknWaitDialog
#include <DocumentHandler.h>
#include <StringLoader.h>           // StringLoader
#include <AiwCommon.h>
#include <NpdApi.h>
#include <avkon.hrh>
#include <aknlayout.cdl.h>
#include <aknlayoutscalable_avkon.cdl.h>
#include <AknUtils.h>
#include <AknsUtils.h>          // skinned icons
#include <AknsConstants.h>      // skinned icon ids
#include <barsread.h>
#include <calendar.mbg>
#include <Calendar.rsg>
#include <StringLoader.h>
#include <AknsBasicBackgroundControlContext.h>
#include <calencommonui.rsg>
#include <aknlistloadertfx.h>
#include <aknlistboxtfxinternal.h>
#include <hlplch.h>
#include <csxhelp/mail.hlp.hrh>
#include <featmgr.h>
#include <sysutil.h>
#include <ErrorUI.h>
#include <calentoolbar.h>

#include "calenviewattachmentsdialog.h"
#include "calencontroller.h"
#include "calenattachmentinfo.h"
#include "calenattachmentmodel.h"
#include "calenattachmentutils.h"
#include "calendarui_debug.h"
#include "calendar.hrh"
#include "calenmultidbeditor.h"
#include "CalendarPrivateCRKeys.h"
#include "calendarui_debug.h"
#include "calenattachmentutils.h"

//CONSTANTS

const TInt KMSKControlID(3);
_LIT8( KNotePadTextDataType, "text/plain" );

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

// ----------------------------------------------------------------------------
// CCalenAttachmentSelectionObserver::NewL
// 1st phase of construction
// ----------------------------------------------------------------------------
//
CCalenViewAttachmentsDialog* CCalenViewAttachmentsDialog::NewL(TDesC& aTitle,
                                                                CCalenAttachmentModel& aAttachmentModel,
                                                                CCalenController& aController)
    {
    TRACE_ENTRY_POINT;
    
    CCalenViewAttachmentsDialog* self = new (ELeave) CCalenViewAttachmentsDialog(aTitle,
                                                                                aAttachmentModel,
                                                                                aController);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    
    TRACE_EXIT_POINT;
    return self;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::CCalenViewAttachmentsDialog
// Constructor.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenViewAttachmentsDialog::CCalenViewAttachmentsDialog(TDesC& aTitle,
      CCalenAttachmentModel& aAttachmentModel,CCalenController& aController )
    : iAttachmentModel( aAttachmentModel ),
      iController(aController),
      iNewTitle( aTitle ),
      iEmbeddedFileOpened(EFalse)  
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }

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

    // because it's not possible to set externally owned icon array
    // for listbox, we delete our icon array here and set listbox
    // icon array to NULL.
    delete iIconArray;
    if ( iListBox )
        {
        TRAP_IGNORE( iListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL( NULL ) );
        }

    delete iListItems;
    delete iDocHandler;

    // remove empty navi pane.
    if ( iNaviPane )
        {
        iNaviPane->Pop();
        }
    delete iOpenParamList;
    
    iController.CancelNotifications( this );
    
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::ConstructL
// 2nd phase constructor.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::ConstructL()
    {
    TRACE_ENTRY_POINT;
    
    DoConstructL();
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::DoConstructL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::DoConstructL()
    {
    TRACE_ENTRY_POINT;
    
    CAknDialog::ConstructL( R_CALENDAR_ATTACHMENT_MENUBAR );

    iDocHandler = CDocumentHandler::NewL( iEikonEnv->Process() );

    // replace navi pane with empty one.
    iNaviPane = static_cast<CAknNavigationControlContainer*>
        ( iEikonEnv->AppUiFactory()->StatusPane()->ControlL(
            TUid::Uid( EEikStatusPaneUidNavi ) ) );
        
    // CAknNavigationControlContainer internal array of decorators seem to
    // have big enough granularity that it does not need realloc
    // and therefore PushDefaultL does not leave.
    iNaviPane->PushDefaultL();

    iDocHandler->SetExitObserver( this );
    
    iController.RegisterForNotificationsL( this, ECalenNotifyAttachmentAdded );
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::CurrentListItemIndex
// returns current item index.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TInt CCalenViewAttachmentsDialog::CurrentListItemIndex()
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    return iListBox->CurrentItemIndex();
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::UpdateIcon
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::UpdateIcon( TInt aListIndex )
    {
    TRACE_ENTRY_POINT;
    
    iListBox->DrawItem( aListIndex );
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::ProcessCommandL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::ProcessCommandL( TInt aCommandId )
    {
    TRACE_ENTRY_POINT;
    
    HideMenu();

    TFileName filename;
    TInt index = iListBox->CurrentItemIndex();

    switch ( aCommandId )
        {
        case ECalenViewAttachmentCmdOpen:
            {
          	 if ( CheckSpaceBelowCriticalLevelL() )
			        {    
			        TRACE_EXIT_POINT;
			        
			        return;
			        }
            else if(index!=KErrNotFound)
                {
                //get the attachmentinfo for the current index
                CCalenAttachmentInfo& attInfo =
                    iAttachmentModel.AttachmentInfoAt( index );

                TDataType datatype( attInfo.DataType() );
                RFile file = iAttachmentModel.GetAttachmentFileL( index );
                CleanupClosePushL(file);
                OpenAttachmentViewerL(file, *this);
                CleanupStack::PopAndDestroy(&file);
                }                                
            }
        break;
      
        case ECalenViewAttachmentCmdSave:
            {
            if ( CheckSpaceBelowCriticalLevelL() )
               {    
               TRACE_EXIT_POINT;
               return;
               }
            //get the attachmentinfo for the current index
            CCalenAttachmentInfo& attInfo =
            iAttachmentModel.AttachmentInfoAt( index );
            
            TDataType datatype( attInfo.DataType() );
            RFile file = iAttachmentModel.GetAttachmentFileL( index );
            CleanupClosePushL(file);
            CCalenAttachmentUtils::SaveAttachmentL(file, *this);
            CleanupStack::PopAndDestroy(&file);
            }
            break;
      
        case ECalenViewAttachmentCmdRemove:
            {
            if ( index != KErrNotFound )
                {          
                //modify the model
                if(RemoveAttachmentL(index))
                    {
                    //update the ui
                    ItemRemovedL( index );
                    }
                }
            break;
            }
        case ECalenViewAttachmentAdd:
            {
            //issue this command and it will be handled by attachmentui. 
            iController.Services().IssueCommandL(ECalenAddAttachmentFromViewer);
            
            }
            break;
        case ECalenViewerCmdAttachmentCmdExit:
            TryExitL(EAknSoftkeyOk);
            break;
        case EAknCmdHelp:
            // Launch help
            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
                iEikonEnv->EikAppUi()->AppHelpContextL() );
            break;
        case EAknCmdExit:
        case EEikCmdExit:
            {
            static_cast<MEikCommandObserver*>( iEikonEnv->EikAppUi() )
                ->ProcessCommandL( EAknCmdExit );
            break;
            }
        default:
            {
            break;
            }
        }
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::DynInitMenuPaneL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::DynInitMenuPaneL(
    TInt aMenuId, CEikMenuPane* aMenuPane )
    {
    TRACE_ENTRY_POINT;
    
    switch(aMenuId)
          {
          case R_CALENDAR_ATTACHMENT_MENUPANE:
              {  
              const TInt index(CurrentListItemIndex());
              // this shouldn't happen...
              if (index == KErrNotFound)
                  {
                  return;
                  }
              
              if(!(iAttachmentModel.NumberOfItems()))                  
                  {                  
                  //remove the options open and remove if count is 0.
                  
                  aMenuPane->SetItemDimmed(ECalenViewAttachmentCmdOpen,ETrue);
                  aMenuPane->SetItemDimmed(ECalenViewAttachmentCmdSave,ETrue);
                  aMenuPane->SetItemDimmed(ECalenViewAttachmentCmdRemove,ETrue);
                  }  
              else
                  {
                  aMenuPane->SetItemDimmed(ECalenViewAttachmentCmdOpen,EFalse);
				  aMenuPane->SetItemDimmed(ECalenViewAttachmentCmdSave,EFalse);
                  aMenuPane->SetItemDimmed(ECalenViewAttachmentCmdRemove,EFalse);
                  }
               }
            break;  
          default:
           break;  
            }
  
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::HandleResourceChangeL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::HandleResourceChange(TInt aType)
    {
    TRACE_ENTRY_POINT;
    
    if ( aType == KEikDynamicLayoutVariantSwitch ||
        aType == KAknsMessageSkinChange )
        {
        TRAP_IGNORE( iAttachmentModel.LoadResourcesL() );
        }    
    CEikDialog::HandleResourceChange( aType );
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::HandleServerAppExit
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::HandleServerAppExit( TInt aReason)
    {
    TRACE_ENTRY_POINT;
    
    iEmbeddedFileOpened = EFalse;
    if (aReason == EAknCmdExit)
        {
        //issue this notification, which will be handled by attachmentui.
        iController.BroadcastNotification(ECalenNotifyAttachmentViewerClosed);
        }
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::HandleControlStateChangeL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::HandleControlStateChangeL( TInt aControlId )
    {
    TRACE_ENTRY_POINT;
    
    if ( aControlId == ECalenAttachmentListBoxId )
        {
        DoUpdateUiL();
        }
        
    CAknDialog::HandleControlStateChangeL( aControlId );
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::OkToExitL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TBool CCalenViewAttachmentsDialog::HandleOkToExitL( TInt aButtonId )
    {
    TRACE_ENTRY_POINT;
    

    if ( aButtonId == EAknSoftkeyBack )
        {
        iTitlePane->SetTextL( *iOldTitle );
        
        //issue this notification, which will be handled by attachmentui.
        iController.BroadcastNotification(ECalenNotifyAttachmentViewerClosed);
        }
    else if ( aButtonId == EAknSoftkeyOpen )
        {
        if(iAttachmentModel.NumberOfItems()!= 0)
                {
                //open the attachment if user taps on the item.
                ProcessCommandL( ECalenViewAttachmentCmdOpen );
                }
        TRACE_EXIT_POINT;
        
        return EFalse;
        }
    TRACE_EXIT_POINT;
    
    return CAknDialog::OkToExitL( aButtonId );
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::CreateCustomControlL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
SEikControlInfo CCalenViewAttachmentsDialog::CreateCustomControlL( TInt aControlType )
    {
    TRACE_ENTRY_POINT;
    
    SEikControlInfo controlInfo;
    controlInfo.iControl = NULL;
    controlInfo.iTrailerTextId = 0;
    controlInfo.iFlags = 0;

    if ( aControlType == ECalenAttachmentListBox )
        {
        //create the attachment listbox to list all the attachments
        controlInfo.iControl = new ( ELeave ) CCalenAttachmentsListBox( iAttachmentModel );
        }
    TRACE_EXIT_POINT;
    
    return controlInfo;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::HandleListBoxEventL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
#ifdef RD_SCALABLE_UI_V2
void CCalenViewAttachmentsDialog::HandleListBoxEventL( CEikListBox* /*aListBox*/, 
                                                              TListBoxEvent aEventType )
    {
    TRACE_ENTRY_POINT;
 
    if ( !MenuShowing() )
       {
	    //Single click integration
       if ( aEventType == EEventEnterKeyPressed ||
            
            aEventType == EEventItemSingleClicked )
           {
           const TInt index(CurrentListItemIndex());
           if ( index != KErrNotFound )
               {
               UpdateMiddleSoftKeyL( index );
               OpenAttachmentL();
               }
           }
       }
    TRACE_EXIT_POINT;
    }
#else
void CCalenViewAttachmentsDialog::HandleListBoxEventL( CEikListBox* /*aListBox*/, 
                                                              TListBoxEvent /*aEventType*/ )
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }
#endif // RD_SCALABLE_UI_V2


// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::PreLayoutDynInitL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::PreLayoutDynInitL()
    {
    TRACE_ENTRY_POINT;
    
    CEikStatusPane *sp = static_cast<CAknAppUi*>
        ( iEikonEnv->EikAppUi() )->StatusPane();
        
    iTitlePane = static_cast<CAknTitlePane*>
        ( sp->ControlL( TUid::Uid(EEikStatusPaneUidTitle ) ) );

    const TDesC* title = iTitlePane->Text();
    iOldTitle = title->AllocL();

    iTitlePane->SetTextL( iNewTitle );

    iListBox = static_cast<CCalenAttachmentsListBox*>
        ( Control( ECalenAttachmentListBoxId ) );

    iListBox->SetContainerWindowL( *this);    
    iListBox->CreateScrollBarFrameL( ETrue );
   
    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
        CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
    
    iListBox->SetListBoxObserver( this );
    
    LoadFormDataL();
    
    if(iAttachmentModel.NumberOfItems() == 0)
        {    
		UpdateButtonVisiblity( ECalenViewAttachmentCmdOpen, EFalse );
        }
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::LoadFormDataL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::LoadFormDataL()
    {
    TRACE_ENTRY_POINT;
    
    // iconarray for two icons.
    // index 0: application icon.
    // index 1: indicator.
    iIconArray = new ( ELeave ) CArrayPtrFlat<CGulIcon>( 2 );

    iListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL( iIconArray );

    // list items is not actually an array but object that returns
    // list item text for listbox in MdcaPoint method.
    iListItems = CCalenAttaListItemArray::NewL( iAttachmentModel, iIconArray );
    iListBox->Model()->SetItemTextArray( iListItems );
    iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::ItemAddedL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
void CCalenViewAttachmentsDialog::ItemAddedL( TInt aIndex )
    {
    iTitlePane->SetTextL( iNewTitle );
    iListBox->View()->CalcBottomItemIndex();
    
    TInt itemIndex = aIndex;
    
    if ( aIndex == -1 )
        {
        itemIndex = Max( iListBox->Model()->NumberOfItems() - 1, 0 );
        }
    
    iListBox->SetCurrentItemIndexAndDraw(itemIndex);
    
    if ( !ButtonGroupContainer().IsCommandVisible( EAknSoftkeyOpen ) )
        {
        // Set middle button visible if invisible and inserted attachment
        // has content (i.e. it is not empty)        
		UpdateButtonVisiblity( ECalenViewAttachmentCmdOpen, ETrue );
        }
    
    iListBox->HandleItemAdditionL();
    iListBox->DrawNow();

    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::ItemRemovedL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
void CCalenViewAttachmentsDialog::ItemRemovedL( TInt aIndex )
    {
    TRACE_ENTRY_POINT;
    
    iTitlePane->SetTextL( iNewTitle );
    iListBox->HandleItemRemovalL();
    TInt lastItem = Max( iListBox->Model()->NumberOfItems() - 1, 0 );

    if ( aIndex - 1 == lastItem )
        {
        TInt numItems = iListBox->View()->NumberOfItemsThatFitInRect(
            iListBox->View()->ViewRect() );
        TInt topItem  = Max( lastItem - numItems, 0 );
        iListBox->SetTopItemIndex( topItem );
        }

    iListBox->SetCurrentItemIndex( Min( aIndex, lastItem ) );    
    iListBox->DrawNow();    
    
    if ( iAttachmentModel.NumberOfItems() == 0 )
        {        
        UpdateButtonVisiblity( ECalenViewAttachmentCmdOpen, EFalse ); 
        }
    TRACE_EXIT_POINT;
    }


// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::RemoveAttachmentL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TBool CCalenViewAttachmentsDialog::RemoveAttachmentL( TInt aIndex )
    {
    TRACE_ENTRY_POINT;
    
    TBool attachmentDeleted(EFalse);
    // delete item from attachment model (notifies its observer about deletion).
    attachmentDeleted = iAttachmentModel.DeleteAttachment( aIndex );
    
    TRACE_EXIT_POINT;
    return attachmentDeleted;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::CleanupWaitDialog
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::CleanupWaitDialog( TAny* aAny )
    {
    TRACE_ENTRY_POINT;
    
    //not used as of now, but we can use when attaching is in progress 
    CAknWaitDialog** dialog = (CAknWaitDialog**) aAny;
    if ( dialog && *dialog )
        {
        delete *dialog;
        }
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::DoUpdateUiL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::DoUpdateUiL()
    {
    TRACE_ENTRY_POINT;
    
    if ( iAttachmentModel.NumberOfItems() == 0 )
        {        
		UpdateButtonVisiblity( ECalenViewAttachmentCmdOpen, EFalse );
        }
    else
        {        
		UpdateButtonVisiblity( ECalenViewAttachmentCmdOpen, ETrue );
        }
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::UpdateButtonVisiblity
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::UpdateButtonVisiblity( TInt aCommandId, TBool aValue )
    {
    TRACE_ENTRY_POINT;
    
    if ( ButtonGroupContainer().ControlOrNull( aCommandId ) )
        {
        ButtonGroupContainer().MakeCommandVisible( aCommandId, aValue );
        }
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::HandleNotification
// Calls back when notifications that it has been registered for are broadcast
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::HandleNotification(const TCalenNotification aNotification )
    {
    TRACE_ENTRY_POINT;
    
    PIM_TRAPD_HANDLE( HandleNotificationL( aNotification ) );
  
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::HandleNotificationL
// Called from HandleNotification() when notifications that it has been
//  registered for are broadcast
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::HandleNotificationL( TCalenNotification aNotification )
    {
    TRACE_ENTRY_POINT;
    
    switch( aNotification )
        {
        case ECalenNotifyAttachmentAdded:
            {
            TInt currentItemIndex = iAttachmentModel.NumberOfItems()-1;
            ItemAddedL(currentItemIndex);
            }
            break;
        default:
            break; 
        }

    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::CountComponentControls
// Gets the number of controls contained in a compound control.
// -----------------------------------------------------------------------------
//
TInt CCalenViewAttachmentsDialog::CountComponentControls() const
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;

    return 1;
    }

// -----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::ComponentControl
// Gets the specified component of a compound control.
// -----------------------------------------------------------------------------
//
CCoeControl* CCalenViewAttachmentsDialog::ComponentControl(TInt aIndex) const
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    switch (aIndex)
        {
        case 0:
            return iListBox;
        default:
            return NULL;
        }
    }


// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::HandlePointerEventL
// Process pointer event.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::HandlePointerEventL(const TPointerEvent& aPointerEvent)
    {
    TRACE_ENTRY_POINT;
     //Single click integration
    if ( iListBox && !iEmbeddedFileOpened)
        {
        iListBox->HandlePointerEventL( aPointerEvent );
        }
    TRACE_EXIT_POINT;
    } 


// -----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::NotifySizeChanged
// -----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::NotifySizeChanged()
    {    
    TRACE_ENTRY_POINT;
    
    if(iListBox)
        {
        iListBox->SizeChanged();
        }    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::UpdateAttachmentsFetchFlags
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::UpdateAttachmentsFetchFlags()
    {    
    TRACE_ENTRY_POINT;
    
    //Update attachmentmodel to secure model is up to date.
    for(TInt itemIndex=0; itemIndex<iAttachmentModel.NumberOfItems(); itemIndex++)
        {
        CCalenAttachmentInfo& attInfo =
        iAttachmentModel.AttachmentInfoAt(itemIndex);                      
        attInfo.SetFetched( ETrue );               
        }
        
    //If there are attachments update the middle soft key
    //according to the first attachment
    if( iAttachmentModel.NumberOfItems() > 0 )
        {
        TRAP_IGNORE( UpdateMiddleSoftKeyL(CurrentListItemIndex()) );    
        }
    TRACE_EXIT_POINT;
    
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::OfferKeyEventL
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TKeyResponse CCalenViewAttachmentsDialog::OfferKeyEventL(
    const TKeyEvent& aKeyEvent, TEventCode aType)
    {
    TRACE_ENTRY_POINT;
    
    // Consume send keys, so that they are not handled in the appui
    if( aType == EEventKey && aKeyEvent.iCode == EKeyYes )
        {
        TRACE_EXIT_POINT;
        
        return EKeyWasConsumed;
        }  
    
    TInt index( CurrentListItemIndex() );
     if ( index != KErrNotFound && !MenuShowing() )
        {
        if ( aType == EEventKey )
            {
            if( aKeyEvent.iCode == EKeyOK )
                {
                 //Single click integration
                iListBox->OfferKeyEventL( aKeyEvent, aType );
                return EKeyWasConsumed;
                }
            else if( aKeyEvent.iCode == EKeyBackspace
                    && iMenuBar->ItemSpecificCommandsEnabled() )
                {
                //todo isssue a confirmation query
                CCalenAttachmentInfo& attaInfo =
                    iAttachmentModel.AttachmentInfoAt(index);
                if ( CanRemoveAttachment( attaInfo ) )
                    {
                    ProcessCommandL(ECalenViewAttachmentCmdRemove);
                    }
                TRACE_EXIT_POINT;
                
                return EKeyWasConsumed;
                }
            else if(aKeyEvent.iCode == EKeyNo)
               {
               iController.BroadcastNotification(ECalenNotifyAttachmentViewerClosed);
               }
			   else if(aKeyEvent.iCode == EKeyEscape)
               {
               MCalenToolbar* toolbar = iController.Services().ToolbarOrNull();
				if(toolbar)
                {
                    toolbar->SetToolbarVisibilityL(ETrue);
                }
			   iController.BroadcastNotification(ECalenNotifyAttachmentViewerClosed);
               }
            }
        else if ( aType == EEventKeyUp )
            {
            UpdateMiddleSoftKeyL( index );
            }
        }
     TRACE_EXIT_POINT;

    return CAknDialog::OfferKeyEventL(aKeyEvent, aType);
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::OpenAttachmentL
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::OpenAttachmentL()
    {
    TRACE_ENTRY_POINT;
    
    if ( CheckSpaceBelowCriticalLevelL() )
        {    
        TRACE_EXIT_POINT;
        
        return;
        }
    else
        {
        CCalenViewAttachmentsDialog::ProcessCommandL(ECalenViewAttachmentCmdOpen);
        } 
    TRACE_EXIT_POINT;
    
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::CanRemoveAttachment
// ----------------------------------------------------------------------------
//
TBool CCalenViewAttachmentsDialog::CanRemoveAttachment(
    CCalenAttachmentInfo& aInfo )
    {    
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    return (aInfo.IsFetched() );
    }

// ---------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::SetMiddleSoftKeyLabelL
// ---------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::SetMiddleSoftKeyLabelL(
    TInt aResourceId, TInt aCommandId )
    {
    TRACE_ENTRY_POINT;
    
    HBufC* middleSKText = StringLoader::LoadLC( aResourceId );

    ButtonGroupContainer().AddCommandToStackL(
        KMSKControlID,
        aCommandId,
        *middleSKText );
    CleanupStack::PopAndDestroy( middleSKText );
    
    TRACE_EXIT_POINT;
    }

// ---------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::UpdateMiddleSoftKeyL
// ---------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::UpdateMiddleSoftKeyL( TInt aIndex )
    {
    TRACE_ENTRY_POINT;
    
    ASSERT( aIndex >= 0 && aIndex < iAttachmentModel.NumberOfItems() );

        // set command as "open"
        ButtonGroupContainer().RemoveCommandFromStack(
            KMSKControlID, EAknSoftkeyOpen );
        SetMiddleSoftKeyLabelL(
            R_QTN_MSK_FETCH, ECalenViewAttachmentCmdOpen );
    
    TRACE_EXIT_POINT;
    }

// ----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::GetHelpContext
// This function is called when Help application is launched.
// ----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::GetHelpContext(TCoeHelpContext& /*aContext*/) const
    {
    TRACE_ENTRY_POINT;
    TRACE_EXIT_POINT;
    }

 // -----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::OkToExitL
// -----------------------------------------------------------------------------
//
TBool CCalenViewAttachmentsDialog::OkToExitL(TInt aButtonId)
    {
    TRACE_ENTRY_POINT;
    
    //Check if user has selected exit from menu
    // -> whole application shall be closed.
    if ( aButtonId == EAknSoftkeyOk )
        {
        if ( CCalenViewAttachmentsDialog::HandleOkToExitL(aButtonId) )
           {
           CEikAppUi* appUi = iEikonEnv->EikAppUi();
           static_cast<MEikCommandObserver*>(appUi)->ProcessCommandL(
            EAknCmdExit );
           return ETrue;
           }
        else
           {
           TRACE_EXIT_POINT;
           
           return EFalse;
           }
        }

     else if ( aButtonId == ECalenViewAttachmentCmdOpen )
        {
        ProcessCommandL( aButtonId );
        
        TRACE_EXIT_POINT;
        
        return EFalse;
        }
    TRACE_EXIT_POINT;
    
    //Let base class decide if it ok to exit
    return CCalenViewAttachmentsDialog::HandleOkToExitL(aButtonId);
    }


// -----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::UpdateAttatchmentListL
// Update attatchmentlist
// -----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::UpdateAttatchmentListL()
    {
    TRACE_ENTRY_POINT;
    
    // Handles item addition
    ItemAddedL();   
    TRACE_EXIT_POINT;
    }

// -----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::CheckSpaceBelowCriticalLevelL
// Checks if the Flash File System storage will fall below critical level. 
// If there is not enough space, display an error message and return EFalse.
// Return ETrue otherwise.
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TBool CCalenViewAttachmentsDialog::CheckSpaceBelowCriticalLevelL()
    {
    TRACE_ENTRY_POINT;
    
    // FIXME: Could be moved to commonui 
    TBool retcode(EFalse);

    if (SysUtil::FFSSpaceBelowCriticalLevelL(&(iCoeEnv->FsSession())))
        {
        CErrorUI* errorUi = CErrorUI::NewLC();
        errorUi->ShowGlobalErrorNoteL(KErrDiskFull);
        CleanupStack::PopAndDestroy( errorUi ); 
        retcode = ETrue;
        }
    TRACE_EXIT_POINT;
    
    return retcode;
    }

// -----------------------------------------------------------------------------
// CCalenViewAttachmentsDialog::OpenAttachmentL
// Opens a particular attachment
// -----------------------------------------------------------------------------
//
void CCalenViewAttachmentsDialog::OpenAttachmentViewerL(RFile& aFile, MAknServerAppExitObserver& /*aExitObserver*/)
    {
    TRACE_ENTRY_POINT;
    
    TBuf<250> fileName;
    aFile.FullName(fileName);
    TDataType datatype( CCalenAttachmentUtils::GetMimeType(aFile) );
    
    TInt ret = KErrNone;
    
    if(datatype == KNotePadTextDataType())
        {
        if(iEmbeddedFileOpened)
            {
            return;
            }
        iEmbeddedFileOpened = ETrue;   
        const TDesC& notepadTitle = _L("NotePad");
        ret = CNotepadApi::ExecFileViewerL( aFile, 
                                           &notepadTitle,
                                           ETrue,
                                           ETrue,
                                           KCharacterSetIdentifierIso88591 );
        iEmbeddedFileOpened = EFalse;        
        }
    else
        {
        //doc handler will open the other files (other than text file).
        TRAP( ret, iDocHandler->OpenFileEmbeddedL( aFile, datatype ) );
        if(ret == KErrNone)
            {
            iEmbeddedFileOpened = ETrue;
            }
        }

    switch(ret)
        {
        case KErrNone:
            break;
        default:
            {
            CAknInformationNote* note = new ( ELeave ) CAknInformationNote;
            HBufC* cannotOpen = StringLoader::LoadLC( 
                    R_QTN_CALEN_INFO_CANNOT_OPEN, CEikonEnv::Static() );
            note->ExecuteLD( *cannotOpen );
            CleanupStack::PopAndDestroy();
            }
            break;
        }
    TRACE_EXIT_POINT
    }  

// End of File