landmarksui/uicontrols/src/CLmkEditorListField.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:    Methods for landmark editor text field.
*
*/







// INCLUDE FILES
#include <eikedwin.h>
#include <AknUtils.h>
#include <eikcapc.h>
#include <AknPopupField.h>
#include <StringLoader.h>
#include <lmkui.rsg>
#include "LmkConsts.h"
#include "CLmkDbUtils.h"
#include "MLmkEditorUiBuilder.h"
#include "CLmkEditorListField.h"

// CONSTANTS
_LIT(KEmptyCatName, " ");

/// Unnamed namespace for local definitions
namespace {
const TInt KNumberOfLines( 4 );
}  // namespace

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

// ----------------------------------------------------
// CLmkEditorListField::CLmkEditorListField
// ----------------------------------------------------
//
CLmkEditorListField::CLmkEditorListField
        ( MLmkFieldData& aField,
		  MLmkEditorUiBuilder& aUiBuilder ) :
    CLmkEditorFieldBase( aField, aUiBuilder )
    {
    }

// ----------------------------------------------------
// CLmkEditorListField::ConstructL
// ----------------------------------------------------
//
void CLmkEditorListField::ConstructL()
    {

    // Create and insert a line in the dialog
    iControl = static_cast<CEikEdwin*>( iUiBuilder.CreateLineL(
            FieldLabel(), LandmarkItemField().UniqueFieldIdentity(),
            EEikCtEdwin ) );

    // ctrl is now owned by the dialog
    AknEditUtils::ConstructEditingL( iControl,
                                     KMaxCategoryNameFieldLen,
                                     KNumberOfLines,
            EEikEdwinDisplayOnly | EEikEdwinResizable
            | EEikEdwinNoAutoSelection, EEikEdwinIgnoreVirtualCursor
            | EEikEdwinAvkonDisableCursor,
            EFalse, EFalse, EFalse );

    // Get text
    HBufC* textBuf = HBufC::NewLC( KMaxCategoryNameFieldLen);
    TPtr text= textBuf->Des();
    RArray<TPosLmItemId>& categories = LandmarkItemField().Categories();
    TInt count( categories.Count() );

    HBufC* catName;
    //if only one category
    if ( count == 1 )
        {
        catName = CLmkDbUtils::CategoryNameL( iUiBuilder.Database(),
                                    categories[0] );
        }
    else
        {
        if (count > 1)
	        {
	        catName = StringLoader::LoadL( R_LMK_CATEGORIES_LIST_FORMAT,
	                                       count,
	                                       const_cast< CEikonEnv *>( iEnv ));
	        }
	    else // No Category, Don't display the string
		    {
		    catName	=  HBufC::NewL(20);
			*catName = KEmptyCatName;
		    }
        }
    text.Append( *catName );
    delete catName;
    catName = NULL;
    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( text );
    iControl->SetAknEditorCase( EAknEditorTextCase );

    // Set formatted text to editor control
   	iControl->SetTextL( &text );
    // SetTextL method above copied the text to the control,
    // so it is safe to destroy the buffer
    CleanupStack::PopAndDestroy( textBuf );

	// readonly and no cursor
	iControl->AddFlagToUserFlags( CEikEdwin::EReadOnly | CEikEdwin::EDisplayOnly |
                                  CEikEdwin::EAvkonDisableCursor );

    // CreateTextViewL() is flagged as deprecated but if it is not
    // called here the ActivateL() below crashes sometimes.
    iControl->CreateTextViewL();
    iCaptionedCtrl = iUiBuilder.LineControl( ControlId() );
    }

// ----------------------------------------------------
// CLmkEditorListField::NewL
// ----------------------------------------------------
//
CLmkEditorListField* CLmkEditorListField::NewL
        ( MLmkFieldData& aField,
		 MLmkEditorUiBuilder& aUiBuilder  )
    {
    CLmkEditorListField* self =
        new(ELeave) CLmkEditorListField( aField, aUiBuilder );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// ----------------------------------------------------
// CLmkEditorListField::~CLmkEditorListField
// ----------------------------------------------------
//
CLmkEditorListField::~CLmkEditorListField()
    {
    }

// ----------------------------------------------------
// CLmkEditorListField::SaveFieldL
// ----------------------------------------------------
//
TBool CLmkEditorListField::SaveFieldL()
    {
    return ETrue;
    }

// ----------------------------------------------------
// CLmkEditorListField::ActivateL
// ----------------------------------------------------
//
void CLmkEditorListField::ActivateL()
    {
    iCaptionedCtrl->ActivateL();
    }

// ----------------------------------------------------
// CLmkEditorListField::UpdateL
// ----------------------------------------------------
//
void CLmkEditorListField::UpdateL()
    {
    HBufC* textBuf = HBufC::NewLC( KMaxCategoryNameFieldLen );
    TPtr text= textBuf->Des();
    RArray<TPosLmItemId> categories = LandmarkItemField().Categories();
    TInt count( categories.Count() );

    HBufC* catName;
    if ( count == 1 )
        {
        catName = CLmkDbUtils::CategoryNameL( iUiBuilder.Database(),
                                    categories[0] );
        }
    else
        {
   		if ( count > 1 )
	        {
	        catName = StringLoader::LoadL( R_LMK_CATEGORIES_LIST_FORMAT,
		                                   count,
		                                   const_cast< CEikonEnv *>( iEnv ) );
		    }
		else // No Category, Don't display the string
		    {
		    catName	=  HBufC::NewL(20);
			*catName = KEmptyCatName;
		    }
        }

    text.Append( *catName );
    delete catName;
    catName = NULL;
    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( text );
    iControl->SetTextL( &text );
    iControl->DrawDeferred();
    CleanupStack::PopAndDestroy( textBuf );

    HBufC* label;
    if ( count > 1 )
        {
        label = iEnv->AllocReadResourceL( R_LMK_CATEGORIES_LABEL );
        }
    else
        {
        label = iEnv->AllocReadResourceL( R_LMK_CATEGORY_LABEL );
        }

    CleanupStack::PushL( label );
    LandmarkItemField().SetLabel( label );
    SetFieldLabelL( label );
    CleanupStack::PopAndDestroy();
    }

// Added newly............ for supporting Single Category Name in Editor

// ----------------------------------------------------
// CLmkEditorListField::ConstructL
// ----------------------------------------------------
//
void CLmkEditorListField::ConstructL(const TDesC& aCategoryName)
    {

    // Create and insert a line in the dialog
    iControl = static_cast<CEikEdwin*>( iUiBuilder.CreateLineL(
            FieldLabel(), LandmarkItemField().UniqueFieldIdentity(),
            EEikCtEdwin ) );

    // ctrl is now owned by the dialog
    AknEditUtils::ConstructEditingL( iControl,
                                     KMaxCategoryNameFieldLen,
                                     KNumberOfLines,
            EEikEdwinDisplayOnly | EEikEdwinResizable
            | EEikEdwinNoAutoSelection, EEikEdwinIgnoreVirtualCursor
            | EEikEdwinAvkonDisableCursor,
            EFalse, EFalse, EFalse );

    // Get text
    HBufC* textBuf = HBufC::NewLC( KMaxCategoryNameFieldLen );
    TPtr text= textBuf->Des();
    RArray<TPosLmItemId>& categories = LandmarkItemField().Categories();
    TInt count( categories.Count() );

    HBufC* catName;
    //if only one category
    if ( count == 1 )
        {
		text.Append(aCategoryName);
        }
    else
        {
        if ( count > 1 )
	        {
	        catName = StringLoader::LoadL( R_LMK_CATEGORIES_LIST_FORMAT,
	                                       count,
	                                       const_cast< CEikonEnv *>( iEnv ));
			text.Append( *catName );
			delete catName;
			catName = NULL;
	        }
	    else // No Category, Don't display the string
		    {
		    catName	=  HBufC::NewL(20);
			*catName = KEmptyCatName;
		    }
        }

    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( text );
    iControl->SetAknEditorCase( EAknEditorTextCase );

    // Set formatted text to editor control
   	iControl->SetTextL( &text );
    // SetTextL method above copied the text to the control,
    // so it is safe to destroy the buffer
    CleanupStack::PopAndDestroy( textBuf );

	// readonly and no cursor
	iControl->AddFlagToUserFlags( CEikEdwin::EReadOnly | CEikEdwin::EDisplayOnly |
                                  CEikEdwin::EAvkonDisableCursor );

    // CreateTextViewL() is flagged as deprecated but if it is not
    // called here the ActivateL() below crashes sometimes.
    iControl->CreateTextViewL();
    iCaptionedCtrl = iUiBuilder.LineControl( ControlId() );
    }

// ----------------------------------------------------
// CLmkEditorListField::NewL
// ----------------------------------------------------
//
CLmkEditorListField* CLmkEditorListField::NewL
        ( MLmkFieldData& aField,
		 MLmkEditorUiBuilder& aUiBuilder,
		 const TDesC& aCategoryName  )
    {
    CLmkEditorListField* self =
        new(ELeave) CLmkEditorListField( aField, aUiBuilder );
    CleanupStack::PushL( self );
    self->ConstructL(aCategoryName);
    CleanupStack::Pop( self );
    return self;
    }

// ----------------------------------------------------
// CLmkEditorListField::Control
// ----------------------------------------------------
//

CEikEdwin* CLmkEditorListField::Control()
	{
	return iControl;
	}
// End of File