ImagePrint/ImagePrintUI/imageprinteng/src/settingsconverter.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:45:53 +0200
changeset 0 d11fb78c4374
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2004-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:  
*
*/


#include <StringLoader.h>

#include "settingsconverter.h"
#include "ctintcapability.h"
#include "clistcapability.h"
#include "cfloatcapability.h"
#include "stringids.h"
#include "tprintcapability.h"
#include "imageprintvariant.h"
#include "clog.h"
#include "crealfactory.h"

const TInt KEngineLimitValue( -1 );
const TInt KMenuItemsRequired( 2 );

// Converts TCapability to CTIntCapability
CTIntCapability* SettingsConverter::AddTIntCapabilityLC(
    TPrintCapability& aCapability,
    TInt aIndexOnList,
    TInt aCapabUid )
    {
    LOG("SettingsConverter::AddTIntCapabilityLC Begin");
    CTIntCapability* intC = new ( ELeave ) CTIntCapability;
    CleanupStack::PushL( intC );

    // If engine returns KEngineLimitValue as low/high limit then it means
    // that there is no minimum or maximum limit
    if ( aCapability.iLow == KEngineLimitValue )
        {
        intC->iMax = KMinTInt32;
        }
    else
        {
        intC->iMin = aCapability.iLow;
        }

    if ( aCapability.iHigh == KEngineLimitValue )
        {
        intC->iMax = KMaxTInt32;
        }
    else
        {
        intC->iMax = aCapability.iHigh;
        }

    // Initialize TInt capability and return it
    intC->iTitle = SettingsConverter::TextStringLC( aCapabUid )->Des();
    CleanupStack::PopAndDestroy();  // SettingsConverter text string
    intC->iIndexOnList = aIndexOnList;
    intC->iUid = aCapabUid;
    intC->iValue = aCapability.iDefaultValue;
	
	LOG("SettingsConverter::AddTIntCapabilityLC End");
    return intC;
    }

// Converts TCapability to CListCapability
CListCapability* SettingsConverter::AddListCapabilityLC(
    TPrintCapability& aCapability,
    TInt aIndexOnList,
    TInt aCapabUid,
    CRealFactory* aFactory )
    {
    LOG("SettingsConverter::AddListCapabilityLC Begin");
    CListCapability* listC = new ( ELeave ) CListCapability( aFactory );
    CleanupStack::PushL( listC );
    listC->iIndexOnList = aIndexOnList;
    listC->iUid = aCapabUid;
 
	/* There's a problem with some usb printers:
	   They offer "normal" print quality twice and nothing else.
	   This has to be handled so that user is not shown the option
	   as he cannot change it anyway in this case */
	TBool qualityDuplicates = EFalse;
	if ( aCapabUid == EPrintCapabQuality && 
		 aCapability.iEnumCount == KMenuItemsRequired )
		{
		if ( aCapability.iEnumCodes[0] == aCapability.iEnumCodes[1] )
			{
			LOG("SettingsConverter::AddListCapabilityLC duplicate quality detected!");
			qualityDuplicates = ETrue;
			}
		} 
		 
    // If there is only one value for certain capability, empty
    // title is added so the capability is not visible on the
    // settings menu.
    if( aCapability.iEnumCount < KMenuItemsRequired || qualityDuplicates )
        {
        listC->iTitle = SettingsConverter::TextStringLC( 0 )->Des();
        }
    else
        {
        listC->iTitle = SettingsConverter::TextStringLC( aCapabUid )->Des();        
        }    

    CleanupStack::PopAndDestroy();  // SettingsConverter text string
    listC->iValue = aCapability.iDefaultValue;

    TBool enumLabels = listC->iTitle.CompareF( KNullDesC() ) !=  0;
    TInt i( 0 );
    TInt num( aCapability.iEnumCount );
    for ( i = 0; i < num; i++ )
        {
        User::LeaveIfError(
            listC->iEnumIDs.Append( aCapability.iEnumCodes[i] ) );

        // Find matching text for the enumeration if the capability is
        // visible on the settings view
#ifdef IMG_PRINT_DYNAMIC_PRINT_SETTINGS        
        if ( enumLabels || aCapability.iEnumCount < KMenuItemsRequired )
#else
		// Not for layout if no dynamic print settings
        if (( enumLabels || aCapability.iEnumCount < KMenuItemsRequired ) &&
            aCapabUid != EPrintCapabLayout )
#endif
            {
            LOG("SettingsConverter::AddListCapabilityLC Adding real value");
            User::LeaveIfError( listC->iTexts.Append(
                SettingsConverter::TextStringLC( aCapability.iEnumCodes[i] )));
            CleanupStack::Pop();    // SettingsConverter text string                   	
            }
        else
            {
            LOG("SettingsConverter::AddListCapabilityLC Adding EMPTY value");
            User::LeaveIfError( listC->iTexts.Append(
                StringLoader::LoadLC( R_EMPTY ) ) );
            CleanupStack::Pop();	// SettingsConverter text string
            }
        }

    if ( aCapability.iEnumCount > 0 )
        {
        i = 0;
        // Check that current active capability code is found from the
        // list of codes and activate first one if not found
        TInt num( aCapability.iEnumCount );
        while ( i < num &&
                listC->iValue != aCapability.iEnumCodes[i] )
            {
            i++;
            }
        if ( i >= aCapability.iEnumCount )
            {
            listC->iValue = aCapability.iEnumCodes[0];
            }
        }

	LOG("SettingsConverter::AddListCapabilityLC End");
    return listC;
    }

// Converts TCapability to CFloatCapability
CFloatCapability* SettingsConverter::AddFloatCapabilityLC(
    TPrintCapability& aCapability,
    TInt aIndexOnList,
    TInt aCapabUid )
    {
    LOG("SettingsConverter::AddFloatCapabilityLC Begin");
    CFloatCapability* floatC = new ( ELeave ) CFloatCapability;
    CleanupStack::PushL( floatC );

    floatC->iIndexOnList = aIndexOnList;
    floatC->iUid = aCapabUid;
    floatC->iTitle = SettingsConverter::TextStringLC( aCapabUid )->Des();
    CleanupStack::PopAndDestroy();  // SettingsConverter text string

    floatC->SetValues( aCapability.iLow,
                       aCapability.iDefaultValue, aCapability.iHigh );
    
    LOG("SettingsConverter::AddFloatCapabilityLC End");
    return floatC;
    }

// Fetches text string based on the enumeration ID
HBufC* SettingsConverter::TextStringLC(
    TInt aId )
    {
    LOG1("SettingsConverter::TextStringLC Begin: %d", aId );
    HBufC* buf = 0;
    TBool found( EFalse );

    TInt i( 0 );
    for ( i = 0; i < KConverterTableCount && !found; i++ )
        {
        if ( aId == KIDConverterTable[i][0] )
            {
            buf = StringLoader::LoadLC( KIDConverterTable[i][1] );
            found = ETrue;
            }
        }

    if ( !found )
        {
        User::Leave( KErrNotFound );
        }

	LOG("SettingsConverter::TextStringLC End");
    return buf;
    }

//  End of File