diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherheadercontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherheadercontrol.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,636 @@ +/* +* Copyright (c) 2008-2008 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: Implementation of the header part control(s) of the comm launcher view +* +*/ + + +#include "ccappcommlauncherheadercontrol.h" +#include "CPbkThumbnailManager.h" +#include +#include +#include +#include +#include + +const TInt KLabelLineCount = 3; + +// --------------------------------------------------------------------------- +// NewL, two-phase construction +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherHeaderControl* CCCAppCommLauncherHeaderControl::NewL( + CCCAppCommLauncherPlugin& aPlugin ) + { + CCCAppCommLauncherHeaderControl* self= new (ELeave) CCCAppCommLauncherHeaderControl( aPlugin ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// C++ (first phase) constructor +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherHeaderControl::CCCAppCommLauncherHeaderControl( CCCAppCommLauncherPlugin& aPlugin ) + : iHasContactImage(EFalse), iPlugin( aPlugin ) + { + // No implementation required + } + +// --------------------------------------------------------------------------- +// ConstructL, second phase constructor +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::ConstructL() + { + // Create the header image + iImage = new (ELeave) CEikImage(); + iImage->SetPictureOwnedExternally(ETrue); + iImage->SetAlignment(EHCenterVCenter); + + // Create the header labels + for (TInt i=0; i < KLabelLineCount; i++) + { + CEikLabel* label = new(ELeave) CEikLabel; + CleanupStack::PushL(label); + iLabels.AppendL(label); + CleanupStack::Pop(label); + iLabels[i]->SetTextL(KNullDesC()); + iLabels[i]->SetAlignment(EHLeftVCenter); + iLabels[i]->CropText(); + } + iContactImageSize = KPbkPersonalImageSize; + // Create the text order + iTextOrder = CCCAppCommLauncherHeaderTextOrder::NewL(); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CCCAppCommLauncherHeaderControl::~CCCAppCommLauncherHeaderControl() + { + delete iContactImageFullName; + delete iContactThumbnailData; + + iCmsContactFields.Close(); + iLabels.ResetAndDestroy(); + if (iImage) + { + delete iImage; + iImage = NULL; + } + if (iImageDecoding) + { + if (iImageDecoding->IsActive()) + { + iImageDecoding->Cancel(); + } + delete iImageDecoding; + iImageDecoding = NULL; + } + if (iTextOrder) + { + delete iTextOrder; + iTextOrder = NULL; + } + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + if (iMask) + { + delete iMask; + iMask = NULL; + } + if ( iImageSelectionPopup ) + { + delete iImageSelectionPopup; + iImageSelectionPopup = NULL; + } + if( iPbkCmd ) + { + delete iPbkCmd; + iPbkCmd = NULL; + } + } + +// --------------------------------------------------------------------------- +// From CCoeControl, returns the number of child controls to the framework +// --------------------------------------------------------------------------- +// +TInt CCCAppCommLauncherHeaderControl::CountComponentControls() const + { + return 1 + iLabels.Count(); + } + +// --------------------------------------------------------------------------- +// From CCoeControl, returns the child controls to the framework by index +// --------------------------------------------------------------------------- +// +CCoeControl* CCCAppCommLauncherHeaderControl::ComponentControl(TInt aIndex) const + { + if (aIndex == 0) + { + return iImage; + } + else if (aIndex - 1 < iLabels.Count()) + { + return iLabels[aIndex-1]; + } + else + { + return NULL; + } + } + +// --------------------------------------------------------------------------- +// From CCoeControl, called when the control's size changes, handles portrait-landscape switch +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::SizeChanged() + { + TInt isLandscape = Layout_Meta_Data::IsLandscapeOrientation() ? 1 : 0; + + AknLayoutUtils::LayoutImage( + iImage, Rect(), AknLayoutScalable_Apps::cl_header_pane_g1(isLandscape)); + + TPoint position = iImage->Position(); + TSize size = iImage->Size(); + + const TPoint newImagePosition = TPoint( position.iX/2, position.iY/2 ); + iImage->SetPosition( newImagePosition ); + + const TSize newImageSize = TSize( size.iWidth + 2*( position.iX - newImagePosition.iX ) , + size.iHeight + 2*( position.iY - newImagePosition.iY ) ); + + iImage->SetSize( newImageSize ); + + iContactImageSize = newImageSize; + + if ( iImageDecoding ) + { + // if bitmap was set resize it + if (iImageDecoding->IsActive()) + { + iImageDecoding->Cancel(); + } + TRAP_IGNORE( iImageDecoding->StartL( iContactImageSize ) ); + } + + TAknLayoutRect labelsRect; + labelsRect.LayoutRect(Rect(), AknLayoutScalable_Apps::cl_header_name_pane(isLandscape)); + + AknLayoutUtils::LayoutLabel(iLabels[0], labelsRect.Rect(), AknLayoutScalable_Apps::cl_header_name_pane_t1(2)); + AknLayoutUtils::LayoutLabel(iLabels[1], labelsRect.Rect(), AknLayoutScalable_Apps::cl_header_name_pane_t2(2)); + AknLayoutUtils::LayoutLabel(iLabels[2], labelsRect.Rect(), AknLayoutScalable_Apps::cl_header_name_pane_t3(2)); + + if( iImageSelectionPopup ) + { + delete iImageSelectionPopup; + iImageSelectionPopup = NULL; + } + + TRAP_IGNORE(LabelsSizeChangedL()); + } + +// --------------------------------------------------------------------------- +// CCCAppCommLauncherHeaderControl::LabelsSizeChangedL() +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::LabelsSizeChangedL() + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + TRgb color; + AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 ); + + if (iLabels.Count() > 0) + { + iTextOrder->ClipL(*iLabels[0]->Font(), iLabels[0]->Rect().Width()); + for (TInt i=0; i < iLabels.Count(); i++) + { + iLabels[i]->SetTextL(iTextOrder->GetTextForRow(i)); + iLabels[i]->OverrideColorL( EColorLabelText, color ); + } + } + } + +// --------------------------------------------------------------------------- +// From CCoeControl, overridden to set the container windows for the child +// controls of this control (labels and image) +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::SetContainerWindowL(const CCoeControl& aContainer) + { + CCoeControl::SetContainerWindowL(aContainer); + iImage->SetContainerWindowL(aContainer); + for (TInt i=0; i < iLabels.Count(); i++) + { + iLabels[i]->SetContainerWindowL(aContainer); + } + } + +// --------------------------------------------------------------------------- +// The container calls this when its ContactInfoFetchedNotifyL (from +// MCCAppContactHandlerNotifier) is called. Info about the contact is received +// here. +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::ContactInfoFetchedNotifyL( + const CCmsContactFieldInfo& aContactFieldInfo ) + { + } + +// --------------------------------------------------------------------------- +// The container calls this when its ContactFieldFetchedNotifyL (from +// MCCAppContactHandlerNotifier) is called. Data about the contact is received +// here. +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::ContactFieldFetchedNotifyL( + const CCmsContactField& aContactField ) + { + TInt field = aContactField.Type(); + if ( aContactField.Type() == CCmsContactFieldItem::ECmsImageName ) + { + TPtrC data( aContactField.ItemL( 0 ).Data() ); + if ( data.Length() > 0 ) + { + delete iContactImageFullName; + iContactImageFullName = NULL; + iContactImageFullName = data.AllocL(); + } + } + else if ( aContactField.Type() == CCmsContactFieldItem::ECmsThumbnailPic ) + { + TPtrC8 data( aContactField.ItemL( 0 ).BinaryData() ); + if ( data.Length() > 0 ) + { + delete iContactThumbnailData; + iContactThumbnailData = NULL; + iContactThumbnailData = data.AllocL(); + } + else + { + // When removing header image from the detail view of a contact, + // making the picture as NULL firstly. + iImage->SetPicture(NULL, NULL); + delete iBitmap; + iBitmap = NULL; + delete iMask; + iMask = NULL; + } + } + else + { + iCmsContactFields.AppendL(aContactField); + } + } + +// --------------------------------------------------------------------------- +// Performs processing of retrieved contact fields +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::ContactFieldFetchingCompletedL() + { + ProcessContactImageDisplayL(); + iTextOrder->ProcessContactFieldsL(iCmsContactFields); + iCmsContactFields.Reset(); + + if (iLabels.Count() > 0) + { + iTextOrder->ClipL(*iLabels[0]->Font(), iLabels[0]->Rect().Width()); + } + for (TInt i = 0; i < iLabels.Count(); i++) + { + iLabels[i]->SetTextL(iTextOrder->GetTextForRow(i)); + } + DrawDeferred(); + } + +// --------------------------------------------------------------------------- +// Sets the bitmap shown in the header image +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::SetBitmap(CFbsBitmap* aBmp) + { + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + if (iMask) + { + delete iMask; + iMask = NULL; + } + iBitmap = aBmp; + iImage->SetPicture(aBmp, NULL); + iImage->DrawDeferred(); + } + +// --------------------------------------------------------------------------- +// Clears the header texts to blank +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::ClearL() + { + for (TInt i = 0; i < iLabels.Count(); i++) + { + iLabels[i]->SetTextL(KNullDesC()); + } + iTextOrder->Reset(); + } + +// --------------------------------------------------------------------------- +// SetContactStoreL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::SetContactStoreL(TCmsContactStore aContactStore) + { + if (!iBitmap && !iMask) + { + switch (aContactStore) + { + case ECmsContactStorePbk: + AknIconUtils::CreateIconL( + iBitmap, iMask, KPbk2ECEIconFileName, + EMbmPhonebook2eceQgn_prop_pb_thumb_unknown, EMbmPhonebook2eceQgn_prop_pb_thumb_unknown_mask ); + iImage->SetPicture(iBitmap, iMask); + SizeChanged(); + break; + + case ECmsContactStoreSim: + AknIconUtils::CreateIconL( + iBitmap, iMask, KPbk2ECEIconFileName, + EMbmPhonebook2eceQgn_note_sim, EMbmPhonebook2eceQgn_note_sim_mask ); + iImage->SetPicture(iBitmap, iMask); + SizeChanged(); + break; + + case ECmsContactStoreSdn: + AknIconUtils::CreateIconL( + iBitmap, iMask, KPbk2ECEIconFileName, + EMbmPhonebook2eceQgn_menu_simin, EMbmPhonebook2eceQgn_menu_simin_mask ); + iImage->SetPicture(iBitmap, iMask); + SizeChanged(); + break; + } + } + } + +// --------------------------------------------------------------------------- +// HandlePointerEventL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::HandlePointerEventL( + const TPointerEvent& aPointerEvent) + { + CCoeControl::HandlePointerEventL( aPointerEvent ); + switch(aPointerEvent.iType) + { + case TPointerEvent::EButton1Down: + + // Image selection popup + if( iPlugin.ContactHandler().ContactStore() != ECmsContactStoreSdn + && IsPhoneMemoryInConfigurationL() + && iImage->Rect().Contains(aPointerEvent.iPosition) ) + { + // Show the feedback + MTouchFeedback* feedback = MTouchFeedback::Instance(); + if ( feedback ) + { + feedback->InstantFeedback( ETouchFeedbackBasic ); + } + LaunchStylusPopupL( aPointerEvent ); + } + break; + + default: + break; + } + } + +// --------------------------------------------------------------------------- +// ProcessCommandL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::ProcessCommandL(TInt aCommandId) + { + switch(aCommandId) + { + case ECCAppCommLauncherStylusViewImageCmd: + DoViewImageCmdL(); + break; + + case ECCAppCommLauncherStylusChangeImageCmd: + DoChangeImageCmdL(); + break; + + case ECCAppCommLauncherStylusRemoveImageCmd: + DoRemoveImageCmdL(); + break; + + case ECCAppCommLauncherStylusAddImageCmd: + DoAddImageCmdL(); + break; + + default: + break; + } + } + +// --------------------------------------------------------------------------- +// SetEmphasis +// --------------------------------------------------------------------------- +// + void CCCAppCommLauncherHeaderControl::SetEmphasis( + CCoeControl* /*aMenuControl*/,TBool /*aEmphasis*/) + { + // No implementation + } + + // --------------------------------------------------------------------------- + // PosToScreenCoordinates + // --------------------------------------------------------------------------- + // + void CCCAppCommLauncherHeaderControl::PosToScreenCoordinates( + CCoeControl* aControl, TPoint& aPos ) + { + TPoint leftUpperPos = aControl->Parent()->PositionRelativeToScreen(); + aPos += leftUpperPos; + } + + // --------------------------------------------------------------------------- + // LaunchStylusPopupL + // --------------------------------------------------------------------------- + // +void CCCAppCommLauncherHeaderControl::LaunchStylusPopupL( const TPointerEvent& aPointerEvent ) + { + iPos = TPoint(0,0); + if ( !iImageSelectionPopup ) + { + iImageSelectionPopup = CAknStylusPopUpMenu::NewL( this, iPos, NULL ); + TInt resourceReaderId = R_CCACOMMLAUNCHER_CONTACT_IMAGE_STYLUS_MENU; + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC( reader , resourceReaderId ); + iImageSelectionPopup->ConstructFromResourceL( reader ); + CleanupStack::PopAndDestroy(); // reader + } + + if( iHasContactImage ) + { + iImageSelectionPopup->SetItemDimmed(ECCAppCommLauncherStylusViewImageCmd, EFalse); + iImageSelectionPopup->SetItemDimmed(ECCAppCommLauncherStylusChangeImageCmd, EFalse); + iImageSelectionPopup->SetItemDimmed(ECCAppCommLauncherStylusRemoveImageCmd, EFalse); + iImageSelectionPopup->SetItemDimmed(ECCAppCommLauncherStylusAddImageCmd, ETrue); + } + else + { + iImageSelectionPopup->SetItemDimmed(ECCAppCommLauncherStylusViewImageCmd, ETrue); + iImageSelectionPopup->SetItemDimmed(ECCAppCommLauncherStylusChangeImageCmd, ETrue); + iImageSelectionPopup->SetItemDimmed(ECCAppCommLauncherStylusRemoveImageCmd, ETrue); + iImageSelectionPopup->SetItemDimmed(ECCAppCommLauncherStylusAddImageCmd, EFalse); + } + + iPos.iY = aPointerEvent.iPosition.iY; + iPos.iX = aPointerEvent.iPosition.iX; + PosToScreenCoordinates(this, iPos); + + + + iImageSelectionPopup->SetPosition(iPos); + iImageSelectionPopup->ShowMenu(); + } + +// --------------------------------------------------------------------------- +// DoViewImageCmdL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::DoViewImageCmdL() + { + if( !iPbkCmd ) + iPbkCmd = CCCAppCommLauncherPbkCmd::NewL( iPlugin ); + + iPbkCmd->ExecutePbk2CmdViewImageL( + *iPlugin.ContactHandler().ContactIdentifierLC() ); + + CleanupStack::PopAndDestroy( 1 ); // ContactIdentifierLC + } + +// --------------------------------------------------------------------------- +// DoChangeImageCmdL +// --------------------------------------------------------------------------- +// +void CCCAppCommLauncherHeaderControl::DoChangeImageCmdL() + { + if( !iPbkCmd ) + iPbkCmd = CCCAppCommLauncherPbkCmd::NewL( iPlugin ); + + iPbkCmd->ExecutePbk2CmdChangeImageL( + *iPlugin.ContactHandler().ContactIdentifierLC() ); + + CleanupStack::PopAndDestroy( 1 ); // ContactIdentifierLC + } + + // --------------------------------------------------------------------------- + // DoRemoveImageCmdL + // --------------------------------------------------------------------------- + // + void CCCAppCommLauncherHeaderControl::DoRemoveImageCmdL() + { + if( !iPbkCmd ) + iPbkCmd = CCCAppCommLauncherPbkCmd::NewL( iPlugin ); + + iPbkCmd->ExecutePbk2CmdRemoveImageL( + *iPlugin.ContactHandler().ContactIdentifierLC() ); + + CleanupStack::PopAndDestroy( 1 ); // ContactIdentifierLC + } + + // --------------------------------------------------------------------------- + // DoAddImageCmdL + // --------------------------------------------------------------------------- + // + void CCCAppCommLauncherHeaderControl::DoAddImageCmdL() + { + if( !iPbkCmd ) + iPbkCmd = CCCAppCommLauncherPbkCmd::NewL( iPlugin ); + + iPbkCmd->ExecutePbk2CmdAddImageL( + *iPlugin.ContactHandler().ContactIdentifierLC() ); + + CleanupStack::PopAndDestroy( 1 ); // ContactIdentifierLC + } + + // -------------------------------------------------------------------------- + // CCCAppCommLauncherHeaderControl::IsPhoneMemoryInConfigurationL + // -------------------------------------------------------------------------- + // + TBool CCCAppCommLauncherHeaderControl::IsPhoneMemoryInConfigurationL() + { + CPbk2ContactRelocator* contactRelocator = CPbk2ContactRelocator::NewL(); + CleanupStack::PushL( contactRelocator ); + TBool ret = contactRelocator->IsPhoneMemoryInConfigurationL(); + CleanupStack::PopAndDestroy( contactRelocator ); + return ret; + } + + TKeyResponse CCCAppCommLauncherHeaderControl::OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType) + { + TKeyResponse ret( EKeyWasNotConsumed ); + + // If there is a command running in the background + // the send key is automatically consumed. This + // avoids e.g launching of a call + if ( iPbkCmd && iPbkCmd->IsPbk2CommandRunning() ) + { + if (EKeyYes == aKeyEvent.iCode) + { + ret = EKeyWasConsumed; + } + } + return ret; + } + + void CCCAppCommLauncherHeaderControl::ProcessContactImageDisplayL() + { + iHasContactImage = EFalse; + + if (iImageDecoding) + { + if (iImageDecoding->IsActive()) + { + iImageDecoding->Cancel(); + } + delete iImageDecoding; + iImageDecoding = NULL; + } + + if ( iContactThumbnailData ) + { + iImageDecoding = CCCAppCommLauncherImageDecoding::NewL(this, iContactThumbnailData, iContactImageFullName ); + iImageDecoding->StartL( iContactImageSize ); + iHasContactImage = ETrue; + } + + delete iContactImageFullName; + iContactImageFullName = NULL; + delete iContactThumbnailData; + iContactThumbnailData = NULL; + }