landmarksui/uicontrols/src/CLmkEditorFieldArray.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:27 +0100
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002 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:    LandmarksUi Content File -
*           Methods for Landmark editor field array.
*
*/







// INCLUDE FILES
#include "CLmkEditorFieldArray.h"  // this class
#include "MLmkEditorUiBuilder.h"
#include "MLmkEditorField.h"
#include "LmkEditorFieldFactory.h"
#include "CLmkFields.h"
#include "landmarks.hrh"
#include "CLmkUiUtils.h"
#include <bldvariant.hrh>
#include <EPos_CPosLandmark.h>
// Code added
#include <e32math.h>
#include <e32des16.h>

// CONSTANTS
/// Unnamed namespace for local definitions
namespace {
const TInt KNumberOfFields( 5 );
}  // namespace
// ================= MEMBER FUNCTIONS =======================

// ----------------------------------------------------
// CLmkEditorFieldArray::CLmkEditorFieldArray
// ----------------------------------------------------
//
CLmkEditorFieldArray::CLmkEditorFieldArray( CLmkFields& aLmkFields,
        MLmkEditorUiBuilder& aUiBuilder ) :
    iLmkFields( aLmkFields ),
    iUiBuilder( aUiBuilder ),
    iFieldArray(KNumberOfFields)
    {
    }

// ----------------------------------------------------
// CLmkEditorFieldArray::ConstructL
// ----------------------------------------------------
//
void CLmkEditorFieldArray::ConstructL()
    {
	    iCategoryFlag = EFalse; // Used for showing categories
    }

// ----------------------------------------------------
// CLmkEditorFieldArray::NewL
// ----------------------------------------------------
//
CLmkEditorFieldArray* CLmkEditorFieldArray::NewL
        ( CLmkFields& aLmkFields,
        MLmkEditorUiBuilder& aUiBuilder )
    {
	CLmkEditorFieldArray* dlg = new(ELeave) CLmkEditorFieldArray( aLmkFields,
                                                                  aUiBuilder );
    CleanupStack::PushL( dlg );
    dlg->ConstructL();
    CleanupStack::Pop();  // dlg
    return dlg;
    }

// ----------------------------------------------------
// CLmkEditorFieldArray::~CLmkEditorFieldArray
// ----------------------------------------------------
//
CLmkEditorFieldArray::~CLmkEditorFieldArray()
    {
    iFieldArray.ResetAndDestroy();
    }

// ----------------------------------------------------
// CLmkEditorFieldArray::UpdateFieldsL
// ----------------------------------------------------
//
void CLmkEditorFieldArray::UpdateFieldsL( const TUint16 aFieldType )
    {
    TInt count = iFieldArray.Count();
    for ( TInt i=0; i < count; i++ )
        {
        if ( ( iFieldArray[i]->LandmarkItemField().FieldType() ==
               aFieldType ) || ( aFieldType == EAllEditorItems ) )
            {
            iFieldArray[i]->UpdateL();
            }
        }
    }

// ----------------------------------------------------
// CLmkEditorFieldArray::CreateFieldsFromLmkL
// ----------------------------------------------------
//
void CLmkEditorFieldArray::CreateFieldsFromLmkL()
    {
    CArrayPtrFlat<MLmkFieldData>& fields = iLmkFields.Fields();
    TInt count = fields.Count();

    for ( TInt i = 0; i < count; i++ )
        {
        MLmkFieldData& lmkItemField = *fields[i];
        TBool tight = ETrue;
        if(iUiBuilder.EditMode())
	        {
	        tight =  CheckIfFieldIsEmpty(lmkItemField);
	        }
	        MLmkEditorField* editorField = NULL;
	        if( tight && iCategoryFlag && lmkItemField.EditorType() == EListFieldEditor )
	        {	//if there are
		        editorField = LmkEditorFieldFactory::CreateFieldL(
	                                        lmkItemField, iUiBuilder,iCategoryName);
	            iCategoryFlag = EFalse; // Safty purpose....
	        }
	        else if(tight)
			{
	        	editorField = LmkEditorFieldFactory::CreateFieldL(
	                                        lmkItemField, iUiBuilder );
			}
        CleanupStack::PushL( editorField );
        if ( editorField )
            {
            iFieldArray.AppendL( editorField );
            }
        CleanupStack::Pop(); //editorField
        }
    }

// ----------------------------------------------------
// CLmkEditorFieldArray::AreAllFieldsEmptyL
// ----------------------------------------------------
//
TBool CLmkEditorFieldArray::AreAllFieldsEmptyL() const
   {
   TBool result = ETrue;
   TReal localVar;

   const TInt fieldCount = iFieldArray.Count();
   for ( TInt i=0; i < fieldCount; i++ )
        {
        switch( iFieldArray[i]->LandmarkItemField().EditorType() )
            {
            //case ETextFieldEditor:
            case ETextGenericFieldEditor:
            case ETextPhoneNumberFieldEditor:
                {
                HBufC* fieldText = iFieldArray[i]->ControlTextL();
                if ( fieldText && fieldText->Length() > 0 )
                    {
					//Check if any active character or not
					TPtr16 ptr = fieldText->Des();
					ptr.Trim();
					if (ptr.Length() == 0)
						{
						result = ETrue;
						}
					else
						{
						result = EFalse;
						}
                    }
                delete fieldText;
                break;
                }
            case ETextUriFieldEditor:
                {
                HBufC* fieldText = iFieldArray[i]->ControlTextL();

                if( fieldText && fieldText->Length() > 0 )
                    {
                    //Check if any active character or not
					TPtr16 ptr = fieldText->Des();
					ptr.Trim();
					// Checking if the String present is only "http:\\"
					// If that is the case then the field is still
					// considered empty
					if(!CLmkUiUtils::FindIfWebAddrFieldIsEmpty(ptr))
					    {
					    result = EFalse;
					    }
                    }
                delete fieldText;
                break;
                }
            case EListFieldEditor:
                {
                if ( iFieldArray[i]->LandmarkItemField().Categories().Count() )
                    {
                    result = EFalse;
                    }
                break;
                }
           case ENumberFieldEditor:
   		        {
                localVar = iFieldArray[i]->FieldValue();
                if (!Math::IsNaN(localVar))
			        result = EFalse;
			    break;
		        }

           case ECoordinateFieldEditor:
   		        {
                localVar = iFieldArray[i]->FieldValue();
                if (!Math::IsNaN(localVar))
                    result = EFalse;
			    break;
		        }


            default:
                {
                break;
                }
            }

        if ( !result )
            {
            break;
            }
        }
    return result;
    }

// ----------------------------------------------------
// CLmkEditorFieldArray::FieldAt
// ----------------------------------------------------
//
const MLmkEditorField& CLmkEditorFieldArray::FieldAt
		( TInt aFieldIndex )
	{
    return *iFieldArray[aFieldIndex];
	}

// ----------------------------------------------------
// CLmkEditorFieldArray::Find
// ----------------------------------------------------
//
MLmkEditorField* CLmkEditorFieldArray::Find( TInt aControlId, TInt* aPos,
											 TInt* aPrevControlId ) const
    {
    MLmkEditorField* field = NULL;
	const TInt count = iFieldArray.Count();
    for (TInt i = 0; i < count; ++i)
        {
        MLmkEditorField* temp = iFieldArray.At(i);
        if (temp && temp->ControlId() == aControlId )
            {
            field = temp;
            if(aPos)
	            {
	            *aPos =i;
	            }
            break;
            }
        if( (temp && aPrevControlId) && temp->ControlId() < aControlId)
	        {
	        *aPrevControlId = temp->ControlId();
	        }
        }
    return field;
    }

// ----------------------------------------------------
// CLmkEditorFieldArray::SaveFieldsL
// ----------------------------------------------------
//
TBool CLmkEditorFieldArray::SaveFieldsL()
    {
	TBool result = EFalse;
    for ( TInt i(0); i < iFieldArray.Count(); ++i )
        {
        if ( iFieldArray[i]->SaveFieldL() )
			{
			result = ETrue;
			}
        }

    iLmkFields.SaveFieldsL();
    return result;
	}

// ----------------------------------------------------
// CLmkEditorFieldArray::SetCategoryName
// ----------------------------------------------------
//
void CLmkEditorFieldArray::SetCategoryName(const TDesC& aCategoryName)
{
	iCategoryName.Copy(aCategoryName);
	iCategoryFlag = ETrue;
}

// ----------------------------------------------------
// CLmkEditorFieldArray::SaveFieldsToBufferL
// ----------------------------------------------------
//
void CLmkEditorFieldArray::SaveFieldsToBufferL()
	{
    for ( TInt i(0); i < iFieldArray.Count(); ++i )
        {
        iFieldArray[i]->SaveFieldL();
        }
	}

// ----------------------------------------------------
// CLmkEditorFieldArray::GetFieldArray
// ----------------------------------------------------
//
CArrayPtrFlat<MLmkEditorField>& CLmkEditorFieldArray::GetFieldArray()
{
	return iFieldArray;
}

// ----------------------------------------------------
// CLmkEditorFieldArray::CheckIfFieldIsEmpty
// ----------------------------------------------------
//
TBool CLmkEditorFieldArray::CheckIfFieldIsEmpty(MLmkFieldData& a)
	{
	TBool result = EFalse;
	switch( a.EditorType() )
	    {
	    //case ETextFieldEditor:
	    case ETextGenericFieldEditor:
	    case ETextPhoneNumberFieldEditor:
	    case ETextUriFieldEditor:
	        {
	        TPtrC buf = a.TextData();
	        if ( buf.Length() > 0 )
	            {
	            result = ETrue;
	            }
	        break;
	        }
	    case EListFieldEditor:
	    	{
	    	RArray<TPosLmItemId>& t = a.Categories();
	    	if ( t.Count() > 0 )
	            {
	            result = ETrue;
	            }
	        break;
	        }
	    case ENumberFieldEditor:
	        {
	        TReal32 y = a.FloatData();
	        if(!Math::IsNaN(y))
	            {
	            result = ETrue;
	            }
	        break;
	        }
	    case ECoordinateFieldEditor:
	    	{
	    	TReal64 z = a.DoubleData();
	    	if(!Math::IsNaN(z))
	            {
	            result = ETrue;
	            }
	        break;
	        }
	    }
	  return result;
	}
// End of File