email/mail/EditorSrc/CMsgAddMailHeadersDlg.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/EditorSrc/CMsgAddMailHeadersDlg.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,195 @@
+/*
+* Copyright (c) 2002-2006 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:  View for setting additional mail headers
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CMsgAddMailHeadersDlg.h"
+#include "MsgMailPreferences.h"
+#include <StringLoader.h>
+#include <MsgMailEditor.rsg>
+#include <akncheckboxsettingpage.h>
+#include <aknsettingitemlist.h>
+#include <aknlistquerydialog.h>
+#include "MailUtils.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMsgAddMailHeadersDlg::CMsgAddMailHeadersDlg
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMsgAddMailHeadersDlg::CMsgAddMailHeadersDlg(
+	RPointerArray<TAdditionalHeaderStatus>& aHeaders): iHeaders(aHeaders)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgAddMailHeadersDlg::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMsgAddMailHeadersDlg* CMsgAddMailHeadersDlg::NewLC(
+	RPointerArray<TAdditionalHeaderStatus>& aHeaders)
+    {
+    CMsgAddMailHeadersDlg* self = new(ELeave) CMsgAddMailHeadersDlg(aHeaders);
+	CleanupStack::PushL(self);
+    return self;
+    }
+
+
+// Destructor
+CMsgAddMailHeadersDlg::~CMsgAddMailHeadersDlg()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMsgAddMailHeadersDlg::ExecuteDialogL
+// Constructs a CSelectionList array and launches the setting view
+// Collects the changed values to iHeaders array
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CMsgAddMailHeadersDlg::ExecuteDialogL()
+    {       
+    TBool rc(EFalse);
+
+    CArrayFixFlat<TInt>* arrayChoices = 
+    	new(ELeave) CArrayFixFlat<TInt>( iHeaders.Count() );
+    CleanupStack::PushL(arrayChoices);
+
+    CAknListQueryDialog* dlg = new(ELeave) CAknListQueryDialog(arrayChoices);
+    dlg->PrepareLC( R_ADDITIONAL_HEADERS_LIST_QUERY );
+
+    CDesCArrayFlat* headersArray = CreateItemTextArrayLC( arrayChoices );
+        
+    dlg->SetItemTextArray( headersArray );
+    dlg->SetOwnershipType( ELbmOwnsItemArray );
+    CleanupStack::Pop( headersArray );
+        
+    CEikListBox* listbox = dlg->ListBox();    
+    listbox->SetSelectionIndexesL(arrayChoices);
+
+    if(dlg->RunLD())
+        {
+        UpdateHeadersArrayL( arrayChoices );
+        rc = ETrue;
+        }
+
+    CleanupStack::PopAndDestroy(arrayChoices);
+    return rc;
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgAddMailHeadersDlg::CreateItemTextArrayLC
+// -----------------------------------------------------------------------------
+//
+CDesCArrayFlat* CMsgAddMailHeadersDlg::CreateItemTextArrayLC(
+    CArrayFixFlat<TInt>* aVisibleItems )
+    {
+    ASSERT( aVisibleItems );
+    CDesCArrayFlat* headersArray = 
+        new ( ELeave ) CDesCArrayFlat( iHeaders.Count() );
+    CleanupStack::PushL( headersArray );
+    
+    for ( TInt index(0); index<iHeaders.Count(); ++index )
+        {
+        if( iHeaders[index]->iStatus == EHeaderVisible )
+            {
+            aVisibleItems->AppendL( index );
+            }
+        TInt resource(0);
+        switch (iHeaders[index]->iHeaderValue)
+            {
+            case EMsgComponentIdCc:
+                resource = R_QTN_MSG_HEADERS_CC;
+                break;
+            case EMsgComponentIdBcc:
+                resource = R_QTN_MSG_HEADERS_BCC;
+                break;
+            case EMsgComponentIdSubject:
+                resource = R_QTN_MSG_HEADERS_SUBJECT;
+                break;
+            default:
+                __ASSERT_DEBUG( EFalse, User::Invariant() );               
+            }
+        HBufC* headerText = StringLoader::LoadLC( resource );
+        headersArray->AppendL( * headerText );
+        CleanupStack::PopAndDestroy(headerText); // headerText            
+        }
+    return headersArray;        
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgAddMailHeadersDlg::UpdateHeadersArrayL
+// -----------------------------------------------------------------------------
+//    
+void CMsgAddMailHeadersDlg::UpdateHeadersArrayL(
+    CArrayFixFlat<TInt>* aSelectedItems )
+    {
+    ASSERT( aSelectedItems );
+    // Reset visibility
+    for ( TInt index(0); index<iHeaders.Count(); ++index )
+        {
+        iHeaders[index]->iStatus = EHeaderHidden;
+        }
+    // Set selected items visible
+    for ( TInt ii=0; ii<aSelectedItems->Count(); ii++ )
+        {
+        iHeaders[aSelectedItems->At(ii)]->iStatus = EHeaderVisible;
+        }
+    // Find invisible items that has some content
+    TInt contentCount(0);
+    for ( TInt xx=0;xx<iHeaders.Count();xx++ )
+    	{
+    	if( iHeaders[xx]->iStatus == 
+    		EHeaderHidden && iHeaders[xx]->iHasContent )
+    		{
+    		contentCount++;
+    		}
+    	}     
+    // We are removing control that has some content	    
+    if( contentCount )
+    	{
+    	// plural?
+    	TUint queryString = (contentCount > 1) ? 
+    	    R_QTN_MSG_QRY_HEADERS_REMOVE : 
+    	    R_QTN_MSG_QRY_HEADER_REMOVE;
+            
+       TInt queryResult = MailUtils::ConfirmationQueryL(
+            queryString,
+        	R_MAIL_EDITOR_DELETE_MESSAGE);
+        
+        // Do not remove control, only save visibility of controls
+        if( !queryResult )
+        	{
+        	for ( TInt yy=0;yy<iHeaders.Count();yy++ )
+    			{
+    			if( iHeaders[yy]->iStatus == 
+    				EHeaderHidden && iHeaders[yy]->iHasContent )
+    				{
+    				iHeaders[yy]->iStatus = EHeaderOnlySave;
+    				}	
+    			}
+        	}       	
+    	}
+    
+    }
+//  End of File