messagingappbase/msgeditor/appuisrc/MsgViewAttachmentsDialog.cpp
changeset 0 72b543305e3a
child 12 caea42e26caa
equal deleted inserted replaced
-1:000000000000 0:72b543305e3a
       
     1 /*
       
     2 * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  MsgViewAttachmentsDialog implementation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // ========== INCLUDE FILES ================================
       
    21 #include <msvapi.h>
       
    22 #include <eikspane.h>
       
    23 #include <eikmenup.h>
       
    24 #include <AknDef.h>
       
    25 #include <aknappui.h>
       
    26 #include <akntitle.h>
       
    27 #include <aknnavi.h>
       
    28 #include <aknlists.h>
       
    29 #include <gulicon.h>
       
    30 #include <coeutils.h>               // for ConeUtils::FileExists
       
    31 #include <bautils.h>
       
    32 #include <aknnotewrappers.h>
       
    33 #include <AknWaitDialog.h>          // CAknWaitDialog
       
    34 #include <DocumentHandler.h>
       
    35 #include <StringLoader.h>           // StringLoader
       
    36 #include <AiwCommon.h>
       
    37 #include <NpdApi.h>
       
    38 
       
    39 #include <mmsvattachmentmanager.h>
       
    40 
       
    41 #include <avkon.hrh>
       
    42 
       
    43 #include <aknlayout.cdl.h>
       
    44 #include <aknlayoutscalable_avkon.cdl.h>
       
    45 
       
    46 #include <AknUtils.h>
       
    47 #include <AknsUtils.h>          // skinned icons
       
    48 #include <AknsConstants.h>      // skinned icon ids
       
    49 
       
    50 #include "MsgEditorCommon.h"        // for KMsgEditorMbm
       
    51 #include "MsgEditorDocument.h"
       
    52 #include "MsgAttachmentInfo.h"
       
    53 #include "MsgAttachmentModel.h"
       
    54 #include "MsgViewAttachmentsDialog.h"
       
    55 #include "MsgAttachmentUtils.h"
       
    56 
       
    57 #include <msgeditor.mbg>
       
    58 #include "MsgEditorAppUi.hrh"
       
    59 #include <MsgEditorAppUi.rsg>       // resouce identifiers
       
    60 
       
    61 #include <aknlistloadertfx.h>
       
    62 #include <aknlistboxtfxinternal.h>
       
    63 
       
    64 // ========== EXTERNAL DATA STRUCTURES =====================
       
    65 
       
    66 // ========== EXTERNAL FUNCTION PROTOTYPES =================
       
    67 
       
    68 // ========== CONSTANTS ====================================
       
    69 
       
    70 _LIT8( KTextDataType, "text/plain" );
       
    71 const TUid KNotepadUID3 = { 0x1000599d };
       
    72 
       
    73 // ========== MACROS =======================================
       
    74 
       
    75 // ========== LOCAL CONSTANTS AND MACROS ===================
       
    76 
       
    77 // ========== MODULE DATA STRUCTURES =======================
       
    78 
       
    79 // ========== LOCAL FUNCTION PROTOTYPES ====================
       
    80 
       
    81 // ========== LOCAL FUNCTIONS ==============================
       
    82 
       
    83 // ========== MEMBER FUNCTIONS =============================
       
    84 
       
    85 // ---------------------------------------------------------
       
    86 // CMsgViewAttachmentsDialog::CMsgViewAttachmentsDialog
       
    87 //
       
    88 // Constructor.
       
    89 // ---------------------------------------------------------
       
    90 //
       
    91 EXPORT_C CMsgViewAttachmentsDialog::CMsgViewAttachmentsDialog(
       
    92     TDesC& aTitle, TInt aMenuId, CMsgAttachmentModel& aAttachmentModel )
       
    93     : iAttachmentModel( aAttachmentModel ),
       
    94       iNewTitle( aTitle ),
       
    95       iMenuId( aMenuId )
       
    96     {
       
    97     }
       
    98 
       
    99 // ---------------------------------------------------------
       
   100 // CMsgViewAttachmentsDialog::~CMsgViewAttachmentsDialog
       
   101 //
       
   102 // Destructor.
       
   103 // ---------------------------------------------------------
       
   104 //
       
   105 EXPORT_C CMsgViewAttachmentsDialog::~CMsgViewAttachmentsDialog()
       
   106     {
       
   107     delete iOldTitle;
       
   108 
       
   109     // because it's not possible to set externally owned icon array
       
   110     // for listbox, we delete our icon array here and set listbox
       
   111     // icon array to NULL.
       
   112     delete iIconArray;
       
   113     if ( iListBox )
       
   114         {
       
   115         TRAP_IGNORE( iListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL( NULL ) );
       
   116         }
       
   117 
       
   118     delete iListItems;
       
   119     delete iDocHandler;
       
   120 
       
   121     // remove empty navi pane.
       
   122     if ( iNaviPane )
       
   123         {
       
   124         iNaviPane->Pop();
       
   125         }
       
   126     delete iOpenParamList;
       
   127     }
       
   128 
       
   129 // ---------------------------------------------------------
       
   130 // CMsgViewAttachmentsDialog::ConstructL
       
   131 //
       
   132 // 2nd phase constructor.
       
   133 // ---------------------------------------------------------
       
   134 //
       
   135 EXPORT_C void CMsgViewAttachmentsDialog::ConstructL()
       
   136     {
       
   137     DoConstructL();
       
   138     }
       
   139 
       
   140 // ---------------------------------------------------------
       
   141 // CMsgViewAttachmentsDialog::ConstructL
       
   142 //
       
   143 // 2nd phase constructor.
       
   144 // ---------------------------------------------------------
       
   145 //
       
   146 EXPORT_C void CMsgViewAttachmentsDialog::ConstructL( CMsvEntry& aMessageEntry )
       
   147     {
       
   148     iMessageEntry = &aMessageEntry;
       
   149     DoConstructL();
       
   150     }
       
   151 
       
   152 // ---------------------------------------------------------
       
   153 // CMsgViewAttachmentsDialog::DoConstructL
       
   154 // ---------------------------------------------------------
       
   155 //
       
   156 void CMsgViewAttachmentsDialog::DoConstructL()
       
   157     {
       
   158     CAknDialog::ConstructL( R_MEB_ATTACHMENTS_MENUBAR );
       
   159 
       
   160     iDocHandler = CDocumentHandler::NewL( iEikonEnv->Process() );
       
   161 
       
   162     // replace navi pane with empty one.
       
   163     iNaviPane = static_cast<CAknNavigationControlContainer*>
       
   164         ( iEikonEnv->AppUiFactory()->StatusPane()->ControlL(
       
   165             TUid::Uid( EEikStatusPaneUidNavi ) ) );
       
   166     // CAknNavigationControlContainer internal array of decorators seem to
       
   167     // have big enough granularity that it does not need realloc
       
   168     // and therefore PushDefaultL does not leave.
       
   169     iNaviPane->PushDefaultL();
       
   170 
       
   171     iDocHandler->SetExitObserver( this );
       
   172     }
       
   173 
       
   174 // ---------------------------------------------------------
       
   175 // CMsgViewAttachmentsDialog::CurrentListItemIndex
       
   176 //
       
   177 //
       
   178 // ---------------------------------------------------------
       
   179 //
       
   180 EXPORT_C TInt CMsgViewAttachmentsDialog::CurrentListItemIndex()
       
   181     {
       
   182     return iListBox->CurrentItemIndex();
       
   183     }
       
   184 
       
   185 // ---------------------------------------------------------
       
   186 // CMsgViewAttachmentsDialog::UpdateIcon
       
   187 //
       
   188 //
       
   189 // ---------------------------------------------------------
       
   190 //
       
   191 EXPORT_C void CMsgViewAttachmentsDialog::UpdateIcon( TInt aListIndex )
       
   192     {
       
   193     iListBox->DrawItem( aListIndex );
       
   194     }
       
   195 
       
   196 // ---------------------------------------------------------
       
   197 // CMsgViewAttachmentsDialog::ProcessCommandL
       
   198 //
       
   199 //
       
   200 // ---------------------------------------------------------
       
   201 //
       
   202 EXPORT_C void CMsgViewAttachmentsDialog::ProcessCommandL( TInt aCommandId )
       
   203     {
       
   204     HideMenu();
       
   205 
       
   206     TFileName filename;
       
   207     TInt index = iListBox->CurrentItemIndex();
       
   208 
       
   209     switch ( aCommandId )
       
   210         {
       
   211         case EMsgViewAttachmentCmdOpen:
       
   212             {
       
   213             if ( iBusy )
       
   214                 {
       
   215                 return;
       
   216                 }
       
   217             
       
   218             if ( index != KErrNotFound )
       
   219                 {
       
   220                 iBusy = ETrue;
       
   221                 CleanupStack::PushL( TCleanupItem( CleanupPointer, &iBusy ) );
       
   222                 CMsgAttachmentInfo& attInfo =
       
   223                     iAttachmentModel.AttachmentInfoAt( index );
       
   224 
       
   225                 TDataType datatype( attInfo.DataType() );
       
   226                 RFile file = iAttachmentModel.GetAttachmentFileL( index );
       
   227                 
       
   228                 TInt ret( KErrNone );
       
   229                                                
       
   230                 if ( datatype == KTextDataType() )
       
   231                     {
       
   232                                         
       
   233                     TInt charset( attInfo.CharacterSet() );
       
   234                     
       
   235                     CleanupClosePushL( file );
       
   236                     
       
   237                     // file handle ownership transferred.
       
   238                     ret = CNotepadApi::ExecFileViewerL( file, 
       
   239                                                         NULL,
       
   240                                                         ETrue,
       
   241                                                         charset != KErrNotFound ? EFalse : ETrue,
       
   242                                                         charset );
       
   243                     
       
   244                     CleanupStack::Pop( &file );
       
   245                     }
       
   246                 else
       
   247                     {
       
   248                     CleanupClosePushL( file );
       
   249                     
       
   250                     if ( iOpenParamList )
       
   251                         {
       
   252                         TRAP( ret,iDocHandler->OpenFileEmbeddedL( file, datatype, *iOpenParamList ) );
       
   253                         }
       
   254                     else
       
   255                         {
       
   256                         TRAP( ret,iDocHandler->OpenFileEmbeddedL( file, datatype ) );
       
   257                         }
       
   258                     
       
   259                     CleanupStack::PopAndDestroy( &file );
       
   260                     }
       
   261                 // sets iBusy to EFalse.
       
   262                CleanupStack::PopAndDestroy(); // CleanupPointer
       
   263                 
       
   264                 switch ( ret )
       
   265                     {
       
   266                     case KErrNone:
       
   267                         {
       
   268                         if (datatype != KTextDataType())
       
   269                             {
       
   270                                 iBusy = ETrue;
       
   271                             }
       
   272                             
       
   273                         }
       
   274                     case KUserCancel:
       
   275                         {
       
   276                         break;
       
   277                         }
       
   278                     case KErrNoMemory:
       
   279                     case KErrDiskFull:
       
   280                         {
       
   281                         User::Leave( ret );
       
   282                         }
       
   283                     default:
       
   284                         {
       
   285                         CAknInformationNote* note = new ( ELeave ) CAknInformationNote;
       
   286                         HBufC* text = StringLoader::LoadLC( R_QTN_MMS_INFO_CANNOT_OPEN, iCoeEnv );
       
   287                         note->ExecuteLD( *text );
       
   288                         CleanupStack::PopAndDestroy(); // text
       
   289                         }
       
   290                     }
       
   291                 }
       
   292             break;
       
   293             }
       
   294         case EMsgViewAttachmentCmdSave:
       
   295             {
       
   296             if ( index != KErrNotFound )
       
   297                 {
       
   298                 // Save to the default location of this type
       
   299                 TInt ret = KErrNone;
       
   300                 CMsgAttachmentInfo& attInfo = iAttachmentModel.AttachmentInfoAt( index );
       
   301                 TDataType datatype( attInfo.DataType() );
       
   302 
       
   303                 RFile file  = iAttachmentModel.GetAttachmentFileL( index );
       
   304                 CleanupClosePushL( file );
       
   305                 
       
   306                 if ( datatype == KTextDataType() )
       
   307                     {
       
   308                     ret = DoSaveTextFileL( file, attInfo.CharacterSet() );
       
   309                     }
       
   310                 else
       
   311                     {
       
   312                     TFileName dst;
       
   313                     User::LeaveIfError( file.Name( dst ) );
       
   314                     ret = iDocHandler->CopyL( file, dst, datatype, KEntryAttNormal );
       
   315                     }
       
   316                 
       
   317                 CleanupStack::PopAndDestroy( &file );
       
   318                 
       
   319                 if ( ret != KErrNone && ret != KUserCancel )
       
   320                     {
       
   321                     User::LeaveIfError( ret );
       
   322                     }
       
   323                 else if ( ret == KErrNone )
       
   324                     {
       
   325                     attInfo.SetSaved( ETrue );
       
   326                     }
       
   327                 }
       
   328             break;
       
   329             }
       
   330         case EMsgViewAttachmentCmdRemove:
       
   331             {
       
   332             if ( index != KErrNotFound )
       
   333                 {
       
   334                 RemoveAttachmentL( index );
       
   335                 ItemRemovedL( index );
       
   336                 }
       
   337             break;
       
   338             }
       
   339         case EMsgViewAttachmentCmdInsertImage:
       
   340             {
       
   341             if ( MsgAttachmentUtils::FetchFileL(
       
   342                 MsgAttachmentUtils::EImage, filename ) )
       
   343                 {
       
   344                 InsertAttachmentL( filename, aCommandId );
       
   345                 }
       
   346             break;
       
   347             }
       
   348         case EMsgViewAttachmentCmdInsertAudio:
       
   349             {
       
   350             if ( MsgAttachmentUtils::FetchFileL(
       
   351                 MsgAttachmentUtils::EAudio, filename ) )
       
   352                 {
       
   353                 InsertAttachmentL( filename, aCommandId );
       
   354                 }
       
   355             break;
       
   356             }
       
   357         case EMsgViewAttachmentCmdInsertVideo:
       
   358             {
       
   359             if ( MsgAttachmentUtils::FetchFileL(
       
   360                 MsgAttachmentUtils::EVideo, filename ) )
       
   361                 {
       
   362                 InsertAttachmentL( filename, aCommandId );
       
   363                 }
       
   364             break;
       
   365             }
       
   366         case EMsgViewAttachmentCmdInsertNote:
       
   367             {
       
   368             if ( MsgAttachmentUtils::FetchFileL(
       
   369                 MsgAttachmentUtils::ENote, filename ) )
       
   370                 {
       
   371                 InsertAttachmentL( filename, aCommandId );
       
   372                 }
       
   373             break;
       
   374             }
       
   375         case EAknCmdExit:
       
   376         case EEikCmdExit:
       
   377             {
       
   378             static_cast<MEikCommandObserver*>( iEikonEnv->EikAppUi() )
       
   379                 ->ProcessCommandL( EAknCmdExit );
       
   380             break;
       
   381             }
       
   382         default:
       
   383             {
       
   384             break;
       
   385             }
       
   386         }
       
   387     }
       
   388 
       
   389 // ---------------------------------------------------------
       
   390 // CMsgViewAttachmentsDialog::DynInitMenuPaneL
       
   391 //
       
   392 //
       
   393 // ---------------------------------------------------------
       
   394 //
       
   395 EXPORT_C void CMsgViewAttachmentsDialog::DynInitMenuPaneL(
       
   396     TInt aMenuId, CEikMenuPane* aMenuPane )
       
   397     {
       
   398     if ( aMenuId == R_MEB_ATTACHMENTS_MENUPANE )
       
   399         {
       
   400         // Add menu items from given menu.
       
   401         aMenuPane->AddMenuItemsL( iMenuId, 0, ETrue );
       
   402         // Delete our dummy first menu item.
       
   403         aMenuPane->DeleteMenuItem( 0 );
       
   404         }
       
   405     }
       
   406 
       
   407 // ---------------------------------------------------------
       
   408 // CMsgViewAttachmentsDialog::HandleResourceChangeL
       
   409 //
       
   410 //
       
   411 // ---------------------------------------------------------
       
   412 //
       
   413 EXPORT_C void CMsgViewAttachmentsDialog::HandleResourceChange(TInt aType)
       
   414     {
       
   415     if ( aType == KEikDynamicLayoutVariantSwitch ||
       
   416         aType == KAknsMessageSkinChange )
       
   417         {
       
   418         TRAP_IGNORE( iAttachmentModel.LoadResourcesL() );
       
   419         }    
       
   420     CEikDialog::HandleResourceChange( aType );
       
   421     }
       
   422 
       
   423 // ---------------------------------------------------------
       
   424 // CMsgViewAttachmentsDialog::HandleServerAppExit
       
   425 // ---------------------------------------------------------
       
   426 //
       
   427 EXPORT_C void CMsgViewAttachmentsDialog::HandleServerAppExit( TInt /*aReason*/)
       
   428     {
       
   429     // replace navi pane with empty one.
       
   430     iNaviPane->PushDefaultL();
       
   431     iBusy = EFalse;
       
   432     }
       
   433 
       
   434 // ---------------------------------------------------------
       
   435 // CMsgViewAttachmentsDialog::HandleControlStateChangeL
       
   436 //
       
   437 //
       
   438 // ---------------------------------------------------------
       
   439 //
       
   440 EXPORT_C void CMsgViewAttachmentsDialog::HandleControlStateChangeL( TInt aControlId )
       
   441     {
       
   442     if ( aControlId == EMsgAttachmentListBoxId )
       
   443         {
       
   444         DoUpdateUiL();
       
   445         }
       
   446         
       
   447     CAknDialog::HandleControlStateChangeL( aControlId );
       
   448     }
       
   449 
       
   450 // ---------------------------------------------------------
       
   451 // CMsgViewAttachmentsDialog::OkToExitL
       
   452 //
       
   453 //
       
   454 // ---------------------------------------------------------
       
   455 //
       
   456 EXPORT_C TBool CMsgViewAttachmentsDialog::OkToExitL( TInt aButtonId )
       
   457     {
       
   458     if ( iBusy )
       
   459         {
       
   460         return EFalse;
       
   461         }
       
   462 
       
   463     if ( aButtonId == EAknSoftkeyBack )
       
   464         {
       
   465         iTitlePane->SetTextL( *iOldTitle );
       
   466         }
       
   467     else if ( aButtonId == EAknSoftkeyOpen )
       
   468         {
       
   469         if ( iAttachmentModel.NumberOfItems() != 0 &&
       
   470              !iAttachmentModel.AttachmentInfoAt( CurrentListItemIndex() ).IsEmptyAttachment() )
       
   471                 {
       
   472                 ProcessCommandL( EMsgViewAttachmentCmdOpen );
       
   473                 }
       
   474                 
       
   475         return EFalse;
       
   476         }
       
   477 
       
   478     return CAknDialog::OkToExitL( aButtonId );
       
   479     }
       
   480 
       
   481 // ---------------------------------------------------------
       
   482 // CMsgViewAttachmentsDialog::CreateCustomControlL
       
   483 //
       
   484 //
       
   485 // ---------------------------------------------------------
       
   486 //
       
   487 EXPORT_C SEikControlInfo CMsgViewAttachmentsDialog::CreateCustomControlL( TInt aControlType )
       
   488     {
       
   489     SEikControlInfo controlInfo;
       
   490     controlInfo.iControl = NULL;
       
   491     controlInfo.iTrailerTextId = 0;
       
   492     controlInfo.iFlags = 0;
       
   493 
       
   494     if ( aControlType == EMsgAttachmentListBox )
       
   495         {
       
   496         controlInfo.iControl = new ( ELeave ) CMsgAttachmentsListBox( iAttachmentModel );
       
   497         }
       
   498 
       
   499     return controlInfo;
       
   500     }
       
   501 
       
   502 // ---------------------------------------------------------
       
   503 // CMsgViewAttachmentsDialog::HandleListBoxEventL
       
   504 //
       
   505 //
       
   506 // ---------------------------------------------------------
       
   507 //
       
   508 #ifdef RD_SCALABLE_UI_V2
       
   509 EXPORT_C void CMsgViewAttachmentsDialog::HandleListBoxEventL( CEikListBox* /*aListBox*/, 
       
   510                                                               TListBoxEvent aEventType )
       
   511     {
       
   512     if ( aEventType == MEikListBoxObserver::EEventItemSingleClicked &&
       
   513          !iAttachmentModel.AttachmentInfoAt( CurrentListItemIndex() ).IsEmptyAttachment() )
       
   514         {
       
   515         ProcessCommandL( EMsgViewAttachmentCmdOpen );
       
   516         }
       
   517     }
       
   518 #else
       
   519 EXPORT_C void CMsgViewAttachmentsDialog::HandleListBoxEventL( CEikListBox* /*aListBox*/, 
       
   520                                                               TListBoxEvent /*aEventType*/ )
       
   521     {
       
   522     }
       
   523 #endif // RD_SCALABLE_UI_V2
       
   524 // ---------------------------------------------------------
       
   525 // CMsgViewAttachmentsDialog::PreLayoutDynInitL
       
   526 //
       
   527 //
       
   528 // ---------------------------------------------------------
       
   529 //
       
   530 EXPORT_C void CMsgViewAttachmentsDialog::PreLayoutDynInitL()
       
   531     {
       
   532     CEikStatusPane *sp = static_cast<CAknAppUi*>
       
   533         ( iEikonEnv->EikAppUi() )->StatusPane();
       
   534     iTitlePane = static_cast<CAknTitlePane*>
       
   535         ( sp->ControlL( TUid::Uid(EEikStatusPaneUidTitle ) ) );
       
   536 
       
   537     const TDesC* title = iTitlePane->Text();
       
   538     iOldTitle = title->AllocL();
       
   539 
       
   540     iTitlePane->SetTextL( iNewTitle );
       
   541 
       
   542     iListBox = static_cast<CMsgAttachmentsListBox*>
       
   543         ( Control( EMsgAttachmentListBoxId ) );
       
   544 
       
   545     iListBox->CreateScrollBarFrameL( ETrue );
       
   546     iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
       
   547         CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
       
   548     
       
   549     iListBox->SetListBoxObserver( this );
       
   550     
       
   551     LoadFormDataL();
       
   552     
       
   553 
       
   554     }
       
   555 
       
   556 // ---------------------------------------------------------
       
   557 // CMsgViewAttachmentsDialog::LoadFormDataL
       
   558 //
       
   559 //
       
   560 // ---------------------------------------------------------
       
   561 //
       
   562 EXPORT_C void CMsgViewAttachmentsDialog::LoadFormDataL()
       
   563     {
       
   564     // iconarray for two icons.
       
   565     // index 0: application icon.
       
   566     // index 1: indicator.
       
   567     iIconArray = new ( ELeave ) CArrayPtrFlat<CGulIcon>( 2 );
       
   568 
       
   569     iListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL( iIconArray );
       
   570 
       
   571     // list items is not actually an array but object that returns
       
   572     // list item text for listbox in MdcaPoint method.
       
   573     iListItems = CMsgAttaListItemArray::NewL( iAttachmentModel, iIconArray );
       
   574     iListBox->Model()->SetItemTextArray( iListItems );
       
   575     iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
       
   576     }
       
   577 
       
   578 // ---------------------------------------------------------
       
   579 // CMsgViewAttachmentsDialog::ItemAddedL
       
   580 //
       
   581 //
       
   582 // ---------------------------------------------------------
       
   583 EXPORT_C void CMsgViewAttachmentsDialog::ItemAddedL( TInt aIndex )
       
   584     {
       
   585     iListBox->View()->CalcBottomItemIndex();
       
   586     
       
   587     TInt itemIndex = aIndex;
       
   588     
       
   589     if ( aIndex == -1 )
       
   590         {
       
   591         itemIndex = Max( iListBox->Model()->NumberOfItems() - 1, 0 );
       
   592         }
       
   593     
       
   594     iListBox->SetCurrentItemIndex( itemIndex );
       
   595     
       
   596     if ( !iAttachmentModel.AttachmentInfoAt( itemIndex ).IsEmptyAttachment() )
       
   597         {
       
   598         if ( !ButtonGroupContainer().IsCommandVisible( EAknSoftkeyOpen ) )
       
   599             {
       
   600             // Set middle button visible if invisible and inserted attachment
       
   601             // has content (i.e. it is not empty)
       
   602             UpdateButtonVisiblity( EAknSoftkeyOpen, ETrue );
       
   603             }
       
   604         }
       
   605     else
       
   606         {
       
   607         if ( ButtonGroupContainer().IsCommandVisible( EAknSoftkeyOpen ) )
       
   608             {
       
   609             // Set middle button invisible if visible and inserted attachment
       
   610             // does not hava content (i.e. it is empty)
       
   611             UpdateButtonVisiblity( EAknSoftkeyOpen, EFalse );
       
   612             }
       
   613         }
       
   614     
       
   615     iListBox->HandleItemAdditionL();
       
   616     }
       
   617 
       
   618 // ---------------------------------------------------------
       
   619 // CMsgViewAttachmentsDialog::ItemRemovedL
       
   620 //
       
   621 //
       
   622 // ---------------------------------------------------------
       
   623 EXPORT_C void CMsgViewAttachmentsDialog::ItemRemovedL( TInt aIndex )
       
   624     {
       
   625     iListBox->HandleItemRemovalL();
       
   626     TInt lastItem = Max( iListBox->Model()->NumberOfItems() - 1, 0 );
       
   627 
       
   628     if ( aIndex - 1 == lastItem )
       
   629         {
       
   630         TInt numItems = iListBox->View()->NumberOfItemsThatFitInRect(
       
   631             iListBox->View()->ViewRect() );
       
   632         TInt topItem  = Max( lastItem - numItems, 0 );
       
   633         iListBox->SetTopItemIndex( topItem );
       
   634         }
       
   635 
       
   636     iListBox->SetCurrentItemIndex( Min( aIndex, lastItem ) );
       
   637     iListBox->DrawNow();
       
   638     
       
   639     if ( iAttachmentModel.NumberOfItems() == 0 || 
       
   640          iAttachmentModel.AttachmentInfoAt( CurrentListItemIndex() ).IsEmptyAttachment() )
       
   641         {
       
   642         UpdateButtonVisiblity( EAknSoftkeyOpen, EFalse );
       
   643         }
       
   644     }
       
   645 
       
   646 // ---------------------------------------------------------
       
   647 // CMsgViewAttachmentsDialog::InsertAttachmentL
       
   648 //
       
   649 //
       
   650 // ---------------------------------------------------------
       
   651 //
       
   652 EXPORT_C void CMsgViewAttachmentsDialog::InsertAttachmentL(
       
   653     const TFileName& aFileName,
       
   654     TInt /*aCommandId*/,
       
   655     TInt aIndex /*= -1*/ )
       
   656     {
       
   657     iBusy = ETrue;
       
   658     // sets iBusy to EFalse on leave.
       
   659     CleanupStack::PushL( TCleanupItem( CleanupPointer, &iBusy ) );
       
   660 
       
   661     iWaitDialog = new ( ELeave ) CAknWaitDialog(
       
   662         reinterpret_cast<CEikDialog**>( &iWaitDialog ),
       
   663         ETrue );
       
   664     CleanupStack::PushL( TCleanupItem( CleanupWaitDialog, (TAny**)&iWaitDialog ) );
       
   665 
       
   666     iWaitDialog->PrepareLC( R_MEB_WAIT_NOTE );
       
   667 
       
   668     HBufC* text = StringLoader::LoadLC( R_QTN_MAIL_WAIT_INSERT_ATTACHMENT );
       
   669     iWaitDialog->SetTextL( *text );
       
   670     CleanupStack::PopAndDestroy(); // text
       
   671 
       
   672     iWaitDialog->RunLD();
       
   673 
       
   674     // find file size
       
   675     TInt filesize = 0;
       
   676     RFile file;
       
   677     RFs& fs = iEikonEnv->FsSession();
       
   678 
       
   679     TInt err = file.Open( fs, aFileName, EFileShareAny );
       
   680     if ( err == KErrAccessDenied || err == KErrInUse )
       
   681         {
       
   682         err = file.Open( fs, aFileName, EFileShareReadersOnly );
       
   683         }
       
   684     if ( err == KErrNone )
       
   685         {
       
   686         file.Size( filesize );
       
   687         }
       
   688     file.Close();
       
   689 
       
   690     iAttachmentModel.AddAttachmentL( aFileName, filesize, 0, ETrue, aIndex );
       
   691 
       
   692     ItemAddedL( aIndex );
       
   693 
       
   694     // will delete iWaitDialog.
       
   695     CleanupStack::PopAndDestroy(); // CleanupWaitDialog
       
   696 
       
   697     // sets iBusy to EFalse.
       
   698     CleanupStack::PopAndDestroy(); // CleanupPointer
       
   699     }
       
   700 
       
   701 // ---------------------------------------------------------
       
   702 // CMsgViewAttachmentsDialog::RemoveAttachmentL
       
   703 //
       
   704 //
       
   705 // ---------------------------------------------------------
       
   706 //
       
   707 EXPORT_C void CMsgViewAttachmentsDialog::RemoveAttachmentL( TInt aIndex )
       
   708     {
       
   709     // delete item from attachment model (notifies its observer about deletion).
       
   710     iAttachmentModel.DeleteAttachment( aIndex );
       
   711     }
       
   712 
       
   713 // ---------------------------------------------------------
       
   714 // CMsgViewAttachmentsDialog::CleanupPointer
       
   715 //
       
   716 //
       
   717 // ---------------------------------------------------------
       
   718 //
       
   719 EXPORT_C void CMsgViewAttachmentsDialog::CleanupPointer( TAny* aItem )
       
   720     {
       
   721     TInt* item = static_cast<TInt*>( aItem );
       
   722     *item = EFalse;
       
   723     }
       
   724 
       
   725 // ---------------------------------------------------------
       
   726 // CMsgViewAttachmentsDialog::CleanupWaitDialog
       
   727 //
       
   728 //
       
   729 // ---------------------------------------------------------
       
   730 //
       
   731 void CMsgViewAttachmentsDialog::CleanupWaitDialog( TAny* aAny )
       
   732     {
       
   733     CAknWaitDialog** dialog = (CAknWaitDialog**) aAny;
       
   734     if ( dialog && *dialog )
       
   735         {
       
   736         delete *dialog;
       
   737         }
       
   738     }
       
   739 
       
   740 // ---------------------------------------------------------
       
   741 // CMsgViewAttachmentsDialog::SetOpenParamList
       
   742 //
       
   743 //
       
   744 // ---------------------------------------------------------
       
   745 //
       
   746 EXPORT_C void CMsgViewAttachmentsDialog::SetOpenParamList(CAiwGenericParamList* aOpenParamList)
       
   747     {
       
   748     delete iOpenParamList;
       
   749     iOpenParamList = aOpenParamList;
       
   750     }
       
   751 
       
   752 // ---------------------------------------------------------
       
   753 // CMsgViewAttachmentsDialog::OpenParamList
       
   754 //
       
   755 //
       
   756 // ---------------------------------------------------------
       
   757 //
       
   758 EXPORT_C CAiwGenericParamList* CMsgViewAttachmentsDialog::OpenParamList( )
       
   759     {
       
   760     return iOpenParamList;
       
   761     }
       
   762 
       
   763 // ---------------------------------------------------------
       
   764 // CMsgViewAttachmentsDialog::DoSaveTextFileL
       
   765 // ---------------------------------------------------------
       
   766 //
       
   767 TInt CMsgViewAttachmentsDialog::DoSaveTextFileL( RFile& aFile, TInt aCharSet )
       
   768     {
       
   769     TInt result( KErrNone );
       
   770     
       
   771     if ( aCharSet == KErrNotFound )
       
   772         {
       
   773         TRAP( result, CNotepadApi::SaveFileAsMemoL( aFile ) );
       
   774         }
       
   775     else
       
   776         {
       
   777         TRAP( result, CNotepadApi::SaveFileAsMemoL( aFile, 
       
   778                                                     aCharSet ) );
       
   779         }
       
   780 
       
   781     // Show confirmation note
       
   782     RApaLsSession appList;
       
   783     if ( result == KErrNone && 
       
   784          appList.Connect() == KErrNone )
       
   785         {
       
   786         CleanupClosePushL( appList );
       
   787         
       
   788         TApaAppInfo appInfo;
       
   789         if ( appList.GetAppInfo( appInfo, KNotepadUID3 ) == KErrNone )
       
   790             {
       
   791             HBufC* text = StringLoader::LoadLC( R_MSG_FILE_SAVED_TO, appInfo.iCaption );
       
   792             
       
   793             CAknConfirmationNote* note = new( ELeave ) CAknConfirmationNote( ETrue );
       
   794             note->ExecuteLD( *text );
       
   795             
       
   796             CleanupStack::PopAndDestroy( text );
       
   797             }
       
   798         
       
   799         CleanupStack::PopAndDestroy( &appList );
       
   800         }
       
   801     
       
   802     return result;
       
   803     }
       
   804 
       
   805 // ---------------------------------------------------------
       
   806 // CMsgViewAttachmentsDialog::DoUpdateUiL
       
   807 // ---------------------------------------------------------
       
   808 //
       
   809 void CMsgViewAttachmentsDialog::DoUpdateUiL()
       
   810     {
       
   811     if ( iAttachmentModel.NumberOfItems() == 0 || 
       
   812          iAttachmentModel.AttachmentInfoAt( CurrentListItemIndex() ).IsEmptyAttachment() )
       
   813         {
       
   814         UpdateButtonVisiblity( EAknSoftkeyOpen, EFalse );
       
   815         }
       
   816     else
       
   817         {
       
   818         UpdateButtonVisiblity( EAknSoftkeyOpen, ETrue );
       
   819         }
       
   820     }
       
   821 
       
   822 // ---------------------------------------------------------
       
   823 // CMsgViewAttachmentsDialog::UpdateButtonVisiblity
       
   824 // ---------------------------------------------------------
       
   825 //
       
   826 void CMsgViewAttachmentsDialog::UpdateButtonVisiblity( TInt aCommandId, TBool aValue )
       
   827     {
       
   828     if ( ButtonGroupContainer().ControlOrNull( aCommandId ) )
       
   829         {
       
   830         ButtonGroupContainer().MakeCommandVisible( aCommandId, aValue );
       
   831         }
       
   832     }
       
   833 
       
   834 // End of File