--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintUI/imageprintapp/src/cpropertiesboxmodel.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,531 @@
+/*
+* 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 <akntextsettingpage.h>
+#include <eiklbx.h>
+#include <StringLoader.h>
+#include <AknQueryValueText.h>
+#include <aknpopupsettingpage.h>
+#include <aknslidersettingpage.h>
+#include <bautils.h>
+#include <pathinfo.h>
+#include <aknmessagequerydialog.h>
+#include <apgcli.h> // rapalssession
+#include <imageprintapp.rsg>
+#include <AknQueryDialog.h>
+#include <driveinfo.h>
+
+#include "imageprint.h"
+#include "cprintsettings.h"
+#include "cbasecapability.h"
+#include "cimageprintsettingscontainer.h"
+#include "cimageprintengine.h"
+#include "ciffactory.h"
+#include "mdiscoveryobserver.h"
+#include "mdiscovery.h"
+#include "clog.h"
+#include "clistcapability.h"
+#include "imageprintvariant.h"
+#include "cpropertiesboxmodel.h"
+
+const TInt KListItemsRequired( 2 );
+const TInt KDefaultPrinterIndex( 0 );
+const TInt KNumerOfCopiesIndex( 1 );
+
+// CONSTRUCTION
+CPropertiesBoxModel* CPropertiesBoxModel::NewL(
+ CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer )
+ {
+ CPropertiesBoxModel* self =
+ CPropertiesBoxModel::NewLC( aEngine, aSettings, aContainer );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+CPropertiesBoxModel* CPropertiesBoxModel::NewLC(
+ CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer )
+ {
+ CPropertiesBoxModel* self =
+ new ( ELeave ) CPropertiesBoxModel( aEngine, aSettings, aContainer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// Constructor
+CPropertiesBoxModel::CPropertiesBoxModel(
+ CImagePrintEngine& aEngine,
+ MPrintSettings* aSettings,
+ CImagePrintSettingsContainer* aContainer ) :
+ iEngine( aEngine ),
+ iSettingsIF( aSettings ),
+ iContainer( aContainer )
+ {
+ }
+
+// Destructor
+CPropertiesBoxModel::~CPropertiesBoxModel()
+ {
+ delete iPrintSettings;
+ delete iDefaultPrinter;
+ delete iNumberOfCopiesText;
+ delete iMMC;
+ delete iPictBridge;
+ }
+
+// 2nd phase constructor
+void CPropertiesBoxModel::ConstructL()
+ {
+ InitSettingsL();
+ iDefaultPrinter = StringLoader::LoadL( R_PRINT_SELECTED_PRINTER );
+ iNumberOfCopiesText = StringLoader::LoadL( R_QTN_PRINT_SETTINGS_NOC );
+ iMMC = StringLoader::LoadL( R_PRINT_MEMORY_CARD );
+ iPictBridge = StringLoader::LoadL( R_QTN_PRINT_SETTINGS_DEFAULT_USB );
+ iNumberOfCopiesValue = 1;
+ }
+
+void CPropertiesBoxModel::InitSettingsL()
+ {
+ delete iPrintSettings;
+ iPrintSettings = NULL;
+ iPrintSettings = iSettingsIF->PrinterSettingsL();
+ iCount = iPrintSettings->iCapabilities.Count();
+ TInt i( 0 );
+ TInt counter = iPrintSettings->iCapabilities.Count();
+ // If current protocol is MMC remove one item, because there is no layouts for mmc.
+ if ( MDiscoveryObserver::EMMC == iSettingsIF->GetCurrentPrinterProtocol() )
+ {
+ iCount--;
+ }
+
+ for ( i = 0; i < counter; i++ )
+ {
+ if ( iPrintSettings->iCapabilities[i]->iTitle.CompareF( KNullDesC ) == 0 )
+ {
+ // Remove non-title capability items as those won't be displayed
+ iCount--;
+ }
+ }
+
+ // Add always first two for default printer item and for Number of copies item
+ iCount = iCount + KListItemsRequired;
+ }
+
+// Returns the number of listbox items
+TInt CPropertiesBoxModel::MdcaCount() const
+ {
+ LOG1("CPropertiesBoxModel::MdcaCount: %d", iCount );
+ return iCount;
+ }
+
+// Creates the text string for the list box item and returns it
+TPtrC CPropertiesBoxModel::MdcaPoint( TInt aIndex ) const
+ {
+ LOG1("CPropertiesBoxModel::MdcaPoint START index: %d", aIndex );
+
+ switch ( aIndex )
+ {
+ case KDefaultPrinterIndex:
+ {
+ SetDefaultPrinterItem();
+ break;
+ }
+ case KNumerOfCopiesIndex:
+ {
+ SetNumberOfCopiesItem();
+ break;
+ }
+ default:
+ {
+ SetOtherCapability( aIndex );
+ break;
+ }
+ }
+
+ LOG1("CPropertiesBoxModel::MdcaPoint END, iBuf: %S", &iBuf );
+ return iBuf;
+ }
+
+void CPropertiesBoxModel::SetDefaultPrinterItem() const
+ {
+ LOG("CPropertiesBoxModel::SetDefaultPrinterItem START");
+
+ iBuf.Copy( KTabChar );
+ iBuf.Append( *iDefaultPrinter );
+ iBuf.Append( KTabChar );
+ iBuf.Append( KTabChar );
+ if( iSettingsIF->GetDefaultPrinterProtocol() ==
+ MDiscoveryObserver::EMMC ) // mmc
+ {
+ iBuf.Append( *iMMC );
+ }
+ else if( iSettingsIF->GetDefaultPrinterProtocol() ==
+ MDiscoveryObserver::EUSB ) // pictbridge
+ {
+ iBuf.Append( *iPictBridge );
+ }
+ else
+ {
+ // No can do if this fails. Not leaving function.
+ TRAP_IGNORE(
+ HBufC* defaultPrinterName =
+ iSettingsIF->GetDefaultPrinterNameLC();
+ iBuf.Append( *defaultPrinterName );
+ CleanupStack::PopAndDestroy( defaultPrinterName );
+ );
+ }
+
+ LOG("CPropertiesBoxModel::SetDefaultPrinterItem END");
+ }
+
+void CPropertiesBoxModel::SetNumberOfCopiesItem() const
+ {
+ LOG("CPropertiesBoxModel::SetNumberOfCopiesItem START");
+
+ iBuf.Copy( KTabChar );
+ iBuf.Append( *iNumberOfCopiesText );
+ iBuf.Append( KTabChar );
+ iBuf.Append( KTabChar );
+ iBuf.AppendNum( iNumberOfCopiesValue );
+
+ LOG("CPropertiesBoxModel::SetNumberOfCopiesItem END");
+ }
+
+void CPropertiesBoxModel::SetOtherCapability( const TInt &aIndex ) const
+ {
+ LOG("CPropertiesBoxModel::SetOtherCapability START");
+
+ iBuf.Zero();
+ HBufC* buf = NULL;
+
+ // Get the text for the list box
+ TInt position = CapabilityArrayIndex( aIndex - KListItemsRequired );
+ TRAPD( err,
+ buf = iPrintSettings->iCapabilities[position]->ListBoxTextL() );
+ if ( !err && buf )
+ {
+ iBuf = buf->Des();
+ delete buf;
+ }
+
+ LOG("CPropertiesBoxModel::SetOtherCapability END");
+ }
+
+// Handles the list box (enter) events by launching the pop-up list
+void CPropertiesBoxModel::HandleListBoxEventL(
+ CEikListBox* aListBox,
+ TListBoxEvent aEventType )
+ {
+ LOG("CPropertiesBoxModel::HandleListBoxEventL START");
+
+ if ( (aEventType == EEventEnterKeyPressed || aEventType == EEventItemDoubleClicked) &&
+ aListBox->CurrentItemIndex() != KErrNotFound )
+ {
+ if( aListBox->CurrentItemIndex() == 0 )
+ {
+ // launch dialog query for selecting default printer this returns
+ // protocol id as defined in DiscoveryObserver.h or -1 if failed.
+ TInt protocol = LaunchDefaultPrinterListL();
+ if( protocol >= 0 )
+ {
+ iContainer->DoDiscoveryL( protocol );
+ InitSettingsL();
+ iContainer->UpdateListBox();
+ iContainer->DrawNow();
+ }
+ }
+
+ if( aListBox->CurrentItemIndex() == 1 )
+ {
+ LaunchNumberOfCopiesDialogL();
+ iContainer->UpdateListBox();
+ iContainer->DrawNow();
+ }
+
+ if ( aListBox->CurrentItemIndex() > 1 )
+ {
+ TInt selIndex = CapabilityArrayIndex( aListBox->CurrentItemIndex() - KListItemsRequired );
+ TBool valueChanged = iPrintSettings->iCapabilities[selIndex]->LaunchPopupListL();
+
+ if( valueChanged )
+ {
+ SaveCurrentSelectionL( *(iPrintSettings->iCapabilities[ selIndex ]), aListBox );
+ InitSettingsL();
+ iContainer->UpdateListBox();
+ iContainer->DrawNow();
+ }
+ }
+ }
+
+ LOG("CPropertiesBoxModel::HandleListBoxEventL END");
+ }
+
+// Saves selection to engine
+void CPropertiesBoxModel::SaveCurrentSelectionL(
+ CBaseCapability &aCapab,
+ CEikListBox* aListBox )
+ {
+ LOG("CPropertiesBoxModel::SaveCurrentSelectionL START");
+
+ TInt initList = iSettingsIF->SetPrinterSettingL( aCapab );
+ if( initList == 0 )
+ {
+ CPrintSettings* tempSettings = iSettingsIF->PrinterSettingsL();
+ delete iPrintSettings;
+ iPrintSettings = tempSettings;
+
+ // Sets the active page to be the first one, if settings have truly
+ // changed
+ iSettingsIF->SetActivePageL( 1 );
+
+ aListBox->HandleItemRemovalL();
+ aListBox->HandleItemAdditionL();
+ }
+
+ LOG("CPropertiesBoxModel::SaveCurrentSelectionL END");
+ }
+
+// Returns capability array index based on the list box index
+TUint CPropertiesBoxModel::CapabilityArrayIndex(
+ TInt aListBoxIndex ) const
+ {
+ LOG("CPropertiesBoxModel::CapabilityArrayIndex START");
+
+ // Skip capabilities with empty title as they won't be placed to list box
+ TInt found( EFalse );
+ TInt i( 0 );
+
+ while ( !found )
+ {
+ if ( iPrintSettings->iCapabilities[i]->
+ iTitle.CompareF( KNullDesC ) != 0 )
+ {
+ aListBoxIndex--;
+ }
+
+ if ( aListBoxIndex >= 0 )
+ {
+ i++;
+ }
+ else
+ {
+ found = ETrue;
+ }
+ }
+
+ LOG("CPropertiesBoxModel::CapabilityArrayIndex END");
+ return TUint( i );
+ }
+
+
+void CPropertiesBoxModel::LaunchNumberOfCopiesDialogL()
+ {
+ LOG("CPropertiesBoxModel::LaunchNumberOfCopiesDialogL START");
+ CAknNumberQueryDialog* dlg = new( ELeave ) CAknNumberQueryDialog ( iNumberOfCopiesValue );
+ dlg->PrepareLC( R_NOC_QUERY);
+ dlg->RunLD();
+
+ // After selecting copies, NaviText is updated.
+ iContainer->ChangeStatusPaneTextL( iNumberOfCopiesValue );
+
+ // Set value for settings
+ SetNumberOfCopiesValueL();
+
+ LOG("CPropertiesBoxModel::LaunchNumberOfCopiesDialogL END");
+ }
+
+
+void CPropertiesBoxModel::SetNumberOfCopiesValueL()
+ {
+ RArray<TInt> numberOfCopiesArray;
+ CleanupClosePushL( numberOfCopiesArray );
+ iSettingsIF->NumberOfCopies( numberOfCopiesArray );
+
+ // Images selected in print job
+ TInt imagesCount = iEngine.FileArray().Count();
+
+ // Get number of copies for current image
+ if( numberOfCopiesArray.Count() != imagesCount )
+ {
+ numberOfCopiesArray.Reset();
+ for( TInt i=0; i < imagesCount; ++i )
+ {
+ numberOfCopiesArray.Append( 1 );
+ }
+ }
+
+ TInt oldNOC( numberOfCopiesArray[ 0 ] );
+
+ // if new value was entered
+ if (iNumberOfCopiesValue != oldNOC)
+ {
+ // Set Number of copies value for each image.
+ // Value is same for all images in IP 6.2
+ for ( TInt i=0; i<imagesCount; i++ )
+ {
+ numberOfCopiesArray[ i ] = iNumberOfCopiesValue;
+ }
+
+ iSettingsIF->SetNumberOfCopiesL( numberOfCopiesArray );
+ }
+
+ CleanupStack::PopAndDestroy( &numberOfCopiesArray );
+ }
+
+TInt CPropertiesBoxModel::LaunchDefaultPrinterListL()
+ {
+ const TInt expectedNumberOfProtocols( 4 );
+
+ // Array for list item descriptors.
+ CDesCArrayFlat* protocolNameArray =
+ new( ELeave ) CDesCArrayFlat( expectedNumberOfProtocols );
+ CleanupStack::PushL( protocolNameArray );
+
+ // Map from list item index to protocol.
+ RArray<TInt> indexToProtocolMap( expectedNumberOfProtocols );
+ CleanupClosePushL( indexToProtocolMap );
+
+ // Get supported protocols from the engine
+ TInt supportedProtocols =
+ iEngine.InterfaceFactory().DiscoveryIF()->SupportedProtocols();
+
+ // Read list item descriptors, append them in array and update map.
+
+ // Bluetooth printer
+ if( supportedProtocols & KImagePrint_PrinterProtocol_BPP )
+ {
+ protocolNameArray->AppendL( CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_PRINT_SETTINGS_DEFAULT_BT )->Des() );
+ indexToProtocolMap.AppendL( MDiscoveryObserver::EBPP );
+ CleanupStack::PopAndDestroy(); // protocolNameArray
+ }
+
+ // Memory card printer
+ if( supportedProtocols & KImagePrint_PrinterProtocol_DPOF )
+ {
+ RFs fs;
+ CleanupClosePushL( fs );
+ if( fs.Connect() == KErrNone )
+ {
+ TInt driveId (-1);
+ TFileName path;
+ User::LeaveIfError( DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage, driveId ) );
+ User::LeaveIfError( PathInfo::GetRootPath( path, driveId ) );
+
+ if ( BaflUtils::PathExists( fs, path ))
+ {
+ protocolNameArray->AppendL( CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_PRINT_MEMORY_CARD )->Des() );
+ indexToProtocolMap.AppendL( MDiscoveryObserver::EMMC );
+ CleanupStack::PopAndDestroy(); // protocolNameArray
+ }
+
+ CleanupStack::PopAndDestroy( &fs );
+ }
+ }
+
+ // USB printers
+ if( supportedProtocols & KImagePrint_PrinterProtocol_PictBridge )
+ {
+ protocolNameArray->AppendL( CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_PRINT_SETTINGS_DEFAULT_USB )->Des() );
+ indexToProtocolMap.AppendL( MDiscoveryObserver::EUSB );
+ CleanupStack::PopAndDestroy(); // protocolNameArray
+ }
+
+ // WLAN printers
+ if ( supportedProtocols & KImagePrint_PrinterProtocol_UPnP )
+ {
+ protocolNameArray->AppendL( CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_PRINT_SETTINGS_DEFAULT_WLAN )->Des() );
+ indexToProtocolMap.AppendL( MDiscoveryObserver::EWLAN );
+ CleanupStack::PopAndDestroy(); // protocolNameArray
+ }
+
+ // Prepare arrays for dialog
+ CAknQueryValueTextArray* queryTextArray = CAknQueryValueTextArray::NewL();
+ CleanupStack::PushL( queryTextArray );
+ queryTextArray->SetArray( *protocolNameArray );
+
+ CAknQueryValueText* queryValue = CAknQueryValueText::NewL();
+ CleanupStack::PushL( queryValue );
+ queryValue->SetArrayL( queryTextArray );
+
+ // Determine which is the default protocol using settings interface.
+ // Here defaultProtocol is protocol id as defined in MDiscoveryObserver.h.
+ TInt defaultProtocol = iSettingsIF->GetDefaultPrinterProtocol();
+
+ // Then do lookup in indexToProtocolMap to find correct index for this
+ // protocol id. Note that after this defaultProtocol is an index.
+ defaultProtocol = indexToProtocolMap.Find( defaultProtocol );
+ if ( defaultProtocol != KErrNotFound )
+ {
+ queryValue->SetCurrentValueIndex( defaultProtocol );
+ }
+ else
+ {
+ // Default protocol not available, get current protocol
+ // This is for example for the case where MMC is default,
+ // but removed from phone.
+ TInt currentProtocol = iSettingsIF->GetCurrentPrinterProtocol();
+ currentProtocol = indexToProtocolMap.Find( currentProtocol );
+ if ( currentProtocol != KErrNotFound )
+ {
+ queryValue->SetCurrentValueIndex( currentProtocol );
+ }
+ }
+
+ CAknPopupSettingPage* page = new ( ELeave ) CAknPopupSettingPage(
+ iDefaultPrinter,
+ EAknSettingPageNoOrdinalDisplayed,
+ EAknCtPopupSettingList,
+ R_EMPTY_PROTOCOL_SETTING_LIST,
+ R_SETTING_GENERIC_PROTOCOL_PAGE,
+ *queryValue );
+
+ CleanupStack::PushL( page );
+ page->ConstructL();
+ CleanupStack::Pop( page );
+
+ // Execute dialog and check that it returns properly. If so get the selected
+ // index and use it to protocol map to get name of the selected protocol.
+ TInt selectedProtocolId( -1 );
+ if( page->ExecuteLD() )
+ {
+ selectedProtocolId =
+ indexToProtocolMap[ queryValue->CurrentValueIndex() ];
+ }
+
+ // CleanupStack contains 4 items:
+ // protocolNameArray, indexToProtocolMap (close), queryTextArray and
+ // queryArray.
+ const TInt numberOfItemsInCleanupStack( 4 );
+ CleanupStack::PopAndDestroy( numberOfItemsInCleanupStack, protocolNameArray );
+ return selectedProtocolId;
+ }
+
+TInt CPropertiesBoxModel::NumberOfCopies()
+ {
+ return iNumberOfCopiesValue;
+ }
+
+// End of File