--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Commands/src/CPbk2PrependCmd.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,293 @@
+/*
+* Copyright (c) 2005-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: Prepend command object.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2PrependCmd.h"
+
+// From Phonebook2
+#include "CPbk2CallCmd.h"
+#include "CPbk2AiwInterestArray.h"
+#include <Pbk2UIControls.rsg>
+#include <CPbk2PrependDlg.h>
+#include <Pbk2Commands.hrh>
+#include <CPbk2ContactUiControlSubstitute.h>
+#include <CPbk2PresentationContact.h>
+#include <CPbk2FieldPropertyArray.h>
+#include <CPbk2PresentationContactFieldCollection.h>
+#include <CPbk2PresentationContactField.h>
+#include <MPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+
+// From VirtualPhonebook
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkContactStore.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+// Definition for buffer size
+const TInt KBufferSize( 50 );
+
+#ifdef _DEBUG
+
+enum TPanicCode
+ {
+ EMaxLengthOfEditorL_OOB = 1
+ };
+
+void Panic( TPanicCode aPanic )
+ {
+ _LIT( KPanicCat, "CPbk2PrependCmd" );
+ User::Panic( KPanicCat, aPanic );
+ }
+
+#endif // _DEBUG
+
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::CPbk2PrependCmd
+// --------------------------------------------------------------------------
+//
+CPbk2PrependCmd::CPbk2PrependCmd(
+ TInt aMenuCommandId,
+ MPbk2ContactUiControl& aUiControl,
+ CAiwServiceHandler& aServiceHandler,
+ CPbk2CallTypeSelector& aSelector,
+ MVPbkStoreContact*& aStoreContact,
+ CPbk2FieldPropertyArray& aFieldProperties) :
+ iUiControl(&aUiControl),
+ iServiceHandler(aServiceHandler),
+ iSelector(aSelector),
+ iMenuCommandId( aMenuCommandId),
+ iStoreContact( aStoreContact ),
+ iFieldProperties( aFieldProperties )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::~CPbk2PrependCmd
+// --------------------------------------------------------------------------
+//
+CPbk2PrependCmd::~CPbk2PrependCmd()
+ {
+ delete iUiControlSubstitute;
+ delete iTempContact;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2PrependCmd* CPbk2PrependCmd::NewL(
+ TInt aMenuCommandId,
+ MPbk2ContactUiControl& aUiControl,
+ CAiwServiceHandler& aServiceHandler,
+ CPbk2CallTypeSelector& aSelector,
+ MVPbkStoreContact*& aStoreContact,
+ CPbk2FieldPropertyArray& aFieldProperties)
+ {
+ CPbk2PrependCmd* self =
+ new(ELeave) CPbk2PrependCmd(
+ aMenuCommandId, aUiControl,
+ aServiceHandler, aSelector,
+ aStoreContact,
+ aFieldProperties);
+
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2PrependCmd::ConstructL()
+ {
+ iUiControlSubstitute = CPbk2ContactUiControlSubstitute::NewL();
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::ExecuteLD
+// --------------------------------------------------------------------------
+//
+void CPbk2PrependCmd::ExecuteLD()
+ {
+ CleanupStack::PushL( this );
+
+ ExecuteDlgL();
+
+ CleanupStack::PopAndDestroy( this );
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::ResetUiControl
+// --------------------------------------------------------------------------
+//
+void CPbk2PrependCmd::ResetUiControl(
+ MPbk2ContactUiControl& aUiControl)
+ {
+ if (iUiControl == &aUiControl)
+ {
+ iUiControl = NULL;
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::AddObserver
+// --------------------------------------------------------------------------
+//
+void CPbk2PrependCmd::AddObserver( MPbk2CommandObserver& /*aObserver*/ )
+ {
+ // Do nothing
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::ExecuteDlgL
+// --------------------------------------------------------------------------
+//
+void CPbk2PrependCmd::ExecuteDlgL()
+ {
+ if (iStoreContact && iUiControl)
+ {
+ // get field text (phone no)
+ TInt fieldIndex( iUiControl->FocusedFieldIndex() );
+ MVPbkStoreContactField* field =
+ iStoreContact->Fields().FieldAtLC(
+ ToStoreFieldIndexL( fieldIndex ) );
+ TPtrC phoneNo =
+ MVPbkContactFieldTextData::Cast( field->FieldData() ).Text();
+ HBufC* number = HBufC::NewLC( KBufferSize );
+ number->Des().Copy( phoneNo );
+ TPtr numberPtr = number->Des();
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( numberPtr );
+ // show dialog with that no
+ CPbk2PrependDlg* dlg = CPbk2PrependDlg::NewL( numberPtr );
+ CleanupStack::PushL( dlg );
+ TInt maxLength( MaxLengthOfEditorL( fieldIndex ) );
+ CleanupStack::Pop( dlg );
+ if ( maxLength != KErrNotFound )
+ {
+ // The length of prepend dialog's editor should be same as
+ // field's maxlength. If maxLength is KErrNotFound use resource's
+ // length.
+ dlg->SetMaxLength( maxLength );
+ }
+ // Get the contact store and field type from the iStoreContact before the prepend dialog is poped up,
+ // since it might be changed When the dialog is poped up.
+ MVPbkContactStore& store = iStoreContact->ParentStore();
+ const MVPbkFieldType* fieldType = field->BestMatchingFieldType();
+ if ( dlg->ExecuteLD(R_PBK2_PREPEND_QUERY) )
+ {
+ // Create temporary contact for phone call
+ delete iTempContact;
+ iTempContact = NULL;
+ iTempContact = store.CreateNewContactLC();
+ CleanupStack::Pop(); // iTempContact
+ if( fieldType )
+ {
+ // User has pressed ok, execute call
+ MVPbkStoreContactField* tempField =
+ iTempContact->CreateFieldLC( *fieldType );
+
+ MVPbkContactFieldTextData::Cast( tempField->FieldData() ).
+ SetTextL( numberPtr );
+ // Takes ownership
+ TInt tempFieldIndex = iTempContact->AddFieldL( tempField );
+ CleanupStack::Pop(); // tempField
+ tempField = NULL;
+ tempField = iTempContact->Fields().FieldAtLC(
+ tempFieldIndex );
+ CleanupStack::Pop(); // tempField
+
+ iUiControlSubstitute->SetFocusedStoreContact( *iTempContact );
+ iUiControlSubstitute->SetFocusedField( *tempField );
+ iUiControlSubstitute->SetFocusedFieldIndex( tempFieldIndex );
+
+ // Create call command to execute phone call
+ CPbk2CallCmd* cmd = CPbk2CallCmd::NewL(
+ iTempContact,
+ tempField,
+ *iUiControlSubstitute,
+ EPbk2CmdCall,
+ iServiceHandler,
+ iSelector );
+
+ cmd->ExecuteLD();
+ }
+
+ iUiControl->UpdateAfterCommandExecution();
+ }
+ CleanupStack::PopAndDestroy( 2 ); // field, number
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::ToStoreFieldIndexL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2PrependCmd::ToStoreFieldIndexL
+ ( TInt aPresIndex )
+ {
+ TInt index( KErrNotFound );
+ CPbk2PresentationContact* presentationContact =
+ CreatePresentationContactLC();
+ index = presentationContact->PresentationFields().StoreIndexOfField
+ ( aPresIndex );
+
+ CleanupStack::PopAndDestroy( presentationContact );
+
+ return index;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::MaxLengthOfEditorL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2PrependCmd::MaxLengthOfEditorL( TInt aFieldIndex )
+ {
+ TInt maxLength( KErrNotFound );
+ CPbk2PresentationContact* presentationContact =
+ CreatePresentationContactLC();
+
+ __ASSERT_DEBUG( presentationContact->PresentationFields().FieldCount() >
+ aFieldIndex, Panic( EMaxLengthOfEditorL_OOB ) );
+
+ maxLength = presentationContact->PresentationFields().At( aFieldIndex ).
+ MaxDataLength();
+
+ CleanupStack::PopAndDestroy( presentationContact );
+
+ return maxLength;
+ }
+
+// --------------------------------------------------------------------------
+// CPbk2PrependCmd::CreatePresenationContactLC
+// --------------------------------------------------------------------------
+//
+CPbk2PresentationContact* CPbk2PrependCmd::CreatePresentationContactLC()
+ {
+ CPbk2PresentationContact* presentationContact =
+ CPbk2PresentationContact::NewL(*iStoreContact, iFieldProperties);
+ CleanupStack::PushL( presentationContact );
+ return presentationContact;
+ }
+
+// End of File