phonebookui/Phonebook2/UIControls/src/Pbk2ContactEditorFieldFactory.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIControls/src/Pbk2ContactEditorFieldFactory.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,343 @@
+/*
+* Copyright (c) 2002-2007 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:  Phonebook 2 contact editor field factory.
+*
+*/
+
+
+#include "Pbk2ContactEditorFieldFactory.h"
+
+// Phonebook 2
+#include "CPbk2ContactEditorTextField.h"
+#include "CPbk2ContactEditorNumberField.h"
+#include "CPbk2ContactEditorPhoneNumberField.h"
+#include "CPbk2ContactEditorPostalCodeField.h"
+#include "CPbk2ContactEditorReadingField.h"
+#include "CPbk2ContactEditorUrlField.h"
+#include "CPbk2ContactEditorImppField.h"
+#include "CPbk2ContactEditorDateField.h"
+#include "CPbk2ContactEditorSyncField.h"
+#include "CPbk2ContactEditorDTMFField.h"
+#include "CPbk2ContactEditorEmailField.h"
+#include "CPbk2ContactEditorRingtoneField.h"
+#include "CPbk2ContactEditorImageField.h"
+#include "MPbk2UIField.h"
+#include "CPbk2ContactEditorUIAddressField.h"
+#include "CPbk2ContactEditorUIAddressHomeField.h"
+#include "CPbk2ContactEditorUIAddressOfficeField.h"
+#include <MPbk2ContactEditorExtensionExtension.h>
+#include "CPbk2IconInfoContainer.h"
+#include <Pbk2CommonUi.rsg>
+
+#include <MPbk2ContactEditorExtension.h>
+#include <Pbk2FieldProperty.hrh>
+
+#include <MPbk2FieldProperty.h>
+#include <MPbk2FieldProperty2.h>
+#include <CPbk2PresentationContactField.h>
+
+// Virtual Phonebook
+#include <VPbkFieldType.hrh>
+#include <MVPbkContactFieldData.h>
+#include <MVPbkContactFieldUriData.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+#ifdef _DEBUG
+
+enum TPanicCode
+    {
+    EInvalidType_EPbk2FieldCtrlTypeTextEditor,
+    EInvalidType_EPbk2FieldCtrlTypeDateEditor,
+    EInvalidType_EPbk2FieldCtrlTypeNumberEditor,
+    EInvalidType_EPbk2FieldCtrlTypePhoneNumberEditor,
+    EInvalidType_EPbk2FieldCtrlURLEditor,
+    EInvalidType_EPbk2FieldCtrlEmailEditor,
+    EInvalidType_EPbk2FieldCtrlPostalCodeEditor,
+    EInvalidType_EPbk2FieldCtrlTypeReadingEditor,
+    EInvalidType_EPbk2FieldCtrlTypeChoiceItemEditor,
+    EInvalidType_EPbk2FieldCtrlTypeDTMFEditor,
+    EInvalidType_EPbk2FieldCtrlTypeRingtoneEditor,
+    EInvalidType_EPbk2FieldCtrlTypeImageEditor,
+    ECreateFieldL_PostCond
+    };
+
+void Panic(TInt aReason)
+    {
+    _LIT( KPanicText, "Pbk2ContactEditorFieldFactory" );
+    User::Panic( KPanicText, aReason );
+    }
+
+#endif // _DEBUG
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPbk2ContactEditorFieldFactory::CPbk2ContactEditorFieldFactory
+// --------------------------------------------------------------------------
+//
+CPbk2ContactEditorFieldFactory::CPbk2ContactEditorFieldFactory
+        ( MPbk2ContactEditorUiBuilder& aUiBuilder, 
+          MPbk2ContactEditorExtension& aEditorExtension )
+          :iUiBuilder(aUiBuilder), iEditorExtension(aEditorExtension)
+    {
+    }
+        
+// --------------------------------------------------------------------------
+// CPbk2ContactEditorFieldFactory::~CPbk2ContactEditorFieldFactory
+// --------------------------------------------------------------------------
+//
+CPbk2ContactEditorFieldFactory::~CPbk2ContactEditorFieldFactory()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactEditorFieldFactory::NewL
+// --------------------------------------------------------------------------
+//
+ CPbk2ContactEditorFieldFactory* CPbk2ContactEditorFieldFactory::NewL
+        ( MPbk2ContactEditorUiBuilder& aUiBuilder, 
+          MPbk2ContactEditorExtension& aEditorExtension )
+    {
+    CPbk2ContactEditorFieldFactory* self = 
+    new(ELeave) CPbk2ContactEditorFieldFactory( aUiBuilder, aEditorExtension );
+    
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+ 
+ // --------------------------------------------------------------------------
+ // CPbk2ContactEditorFieldFactory::NewL
+ // --------------------------------------------------------------------------
+ //
+  void CPbk2ContactEditorFieldFactory::ConstructL()
+     {
+     }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactEditorFieldFactory::CreateFieldL
+// --------------------------------------------------------------------------
+//
+MPbk2ContactEditorField* CPbk2ContactEditorFieldFactory::CreateFieldLC
+        ( CPbk2PresentationContactField& aField,
+          TInt aCustomPosition, CPbk2IconInfoContainer& aIconInfoContainer )
+    {
+    MPbk2ContactEditorField* field = NULL;
+    TPbk2FieldCtrlType ctrlType = aField.FieldProperty().CtrlType();
+
+    // Offer the field first to extensions
+    field = iEditorExtension.CreateEditorFieldL( aField.StoreField(),
+        aField.FieldProperty(), iUiBuilder, aIconInfoContainer );
+    if ( field )
+        {
+        CleanupDeletePushL( field );
+        }
+    else
+        {
+        switch( ctrlType )
+            {
+            case EPbk2FieldCtrlTypeTextEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeTextEditor ) );
+                field = CPbk2ContactEditorTextField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlTypeDateEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeDateTime,
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeDateEditor ) );
+                field = CPbk2ContactEditorDateField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlTypeNumberEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeNumberEditor ) );
+                field = CPbk2ContactEditorNumberField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlTypePhoneNumberEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlTypePhoneNumberEditor ) );
+                field = CPbk2ContactEditorPhoneNumberField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlURLEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlURLEditor ) );
+                field = CPbk2ContactEditorUrlField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlEmailEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlEmailEditor ) );
+                field = CPbk2ContactEditorEmailField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlPostalCodeEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlPostalCodeEditor ) );
+                field = CPbk2ContactEditorPostalCodeField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlTypeReadingEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeReadingEditor ) );
+                field = CPbk2ContactEditorReadingField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlTypeChoiceItems:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeChoiceItemEditor ) );
+                field = CPbk2ContactEditorSyncField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;
+                }
+            case EPbk2FieldCtrlTypeDTMFEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeText,
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeDTMFEditor ) );
+                field = CPbk2ContactEditorDTMFField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer );
+                break;            
+                }
+            case EPbk2FieldCtrlTypeIMPPEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                    EVPbkFieldStorageTypeUri,
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeTextEditor ) );
+                
+                MPbk2FieldProperty2* fieldPropertyExtension =
+                    reinterpret_cast<MPbk2FieldProperty2*>(
+                        const_cast<MPbk2FieldProperty&>( aField.FieldProperty() ).
+                            FieldPropertyExtension(
+                                KMPbk2FieldPropertyExtension2Uid ) );
+                User::LeaveIfNull( fieldPropertyExtension ); 
+                
+                // There is no support for fields with unspecified service name
+                TBool invalid = ((fieldPropertyExtension->XSpName() == KNullDesC) &&
+                        (MVPbkContactFieldUriData::Cast(aField.FieldData()).Scheme()
+                        == KNullDesC));
+                        
+                if ( !invalid )
+                    {
+                    field = CPbk2ContactEditorImppField::NewLC
+                        ( aField, iUiBuilder, aIconInfoContainer );
+                    }
+                break;
+                }
+            case EPbk2FieldCtrlTypeRingtoneEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                EVPbkFieldStorageTypeText, 
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeRingtoneEditor ) );
+                field = CPbk2ContactEditorRingtoneField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer, aCustomPosition ); 
+                break;
+                }       
+            case EPbk2FieldCtrlTypeImageEditor:
+                {
+                __ASSERT_DEBUG( aField.FieldData().DataType() ==
+                EVPbkFieldStorageTypeText, 
+                        Panic( EInvalidType_EPbk2FieldCtrlTypeImageEditor ) );
+                field = CPbk2ContactEditorImageField::NewLC
+                    ( aField, iUiBuilder, aIconInfoContainer, aCustomPosition );
+                break;
+                }                
+            case EPbk2FieldCtrlTypeNone:    // FALLTHROUGH
+            default:
+                {
+                PBK2_DEBUG_ONLY( Panic( ECreateFieldL_PostCond ) );
+                break;
+                }
+            }
+        }
+
+    return field;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactEditorFieldFactory::CreateFieldL
+// --------------------------------------------------------------------------
+//
+MPbk2ContactEditorUIField* CPbk2ContactEditorFieldFactory::CreateFieldLC
+        ( MPbk2UIField& aField,
+          TInt aCustomPosition, 
+          MPbk2ContactEditorUiBuilder& aUiBuilder,
+          const TDesC& aCustomText, CPbk2IconInfoContainer& aIconInfoContainer )
+    {
+    MPbk2ContactEditorUIField* field = NULL;
+    MPbk2ContactEditorExtensionExtension* extext = 
+    	static_cast<MPbk2ContactEditorExtensionExtension*>
+    		(iEditorExtension.ContactEditorExtensionExtension(TUid::Null()));
+    
+    if( extext )
+    	{
+    	field = extext->CreateFieldLC( aField, aCustomPosition, aUiBuilder, KNullDesC(), aIconInfoContainer );
+    	if( field )
+    		{
+    		return field;
+    		}
+    	}
+    
+    switch(aField.CtrlType())
+    	{
+    	case EPbk2FieldCtrlTypeExtAddressEditor:
+    		field = CPbk2ContactEditorUIAddressField::NewL(&aField, aUiBuilder, aIconInfoContainer, aCustomPosition, aCustomText);
+    		CleanupStack::PushL(field);
+    		break;
+    	case EPbk2FieldCtrlTypeExtAddressHomeEditor:
+    		field = CPbk2ContactEditorUIAddressHomeField::NewL(&aField, aUiBuilder, aIconInfoContainer, aCustomPosition, aCustomText);
+    		CleanupStack::PushL(field);
+    		break;
+    	case EPbk2FieldCtrlTypeExtAddressOfficeEditor:
+    		field = CPbk2ContactEditorUIAddressOfficeField::NewL(&aField, aUiBuilder, aIconInfoContainer, aCustomPosition, aCustomText);
+    		CleanupStack::PushL(field);
+    		break;
+    	}
+    return field;
+    }
+
+// End of File