diff -r 000000000000 -r d11fb78c4374 ImagePrint/ImagePrintUI/imageprinteng/src/settingsconverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ImagePrint/ImagePrintUI/imageprinteng/src/settingsconverter.cpp Thu Dec 17 08:45:53 2009 +0200 @@ -0,0 +1,220 @@ +/* +* 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 + +#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