diff -r 3104fc151679 -r 9a48e301e94b uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsheadercontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailsheadercontrol.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,386 @@ +/* +* 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 details view layout +* +*/ + + +#include "cvimpstdetailsheadercontrol.h" + +#include "cvimpstdetailsimagedecoder.h" +#include "mvimpstdetailspresencehandler.h" +#include "cvimpstdetailsviewbrandhandler.h" +#include +#include +#include +#include +#include +#include +#include //cdl +#include +#include + +// virtual phonebook +#include +#include +#include +#include +#include +#include + +#include "uiservicetabtracer.h" +// constants declaration +const TInt KLabelLineCount = 3; + +// Size of thumbnail images stored to contacts +#define KPbkPersonalImageSize TSize(80,96) + +// --------------------------------------------------------------------------- +// NewL, two-phase construction +// --------------------------------------------------------------------------- +// +CVIMPSTDetailsHeaderControl* CVIMPSTDetailsHeaderControl::NewL(CVIMPSTDetailsViewBrandHandler& aBrandHandler, + MVIMPSTDetailsPresenceHandler& aPresenceHandler) + { + CVIMPSTDetailsHeaderControl* self= new (ELeave) CVIMPSTDetailsHeaderControl(aBrandHandler, aPresenceHandler ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// C++ (first phase) constructor +// --------------------------------------------------------------------------- +// +CVIMPSTDetailsHeaderControl::CVIMPSTDetailsHeaderControl(CVIMPSTDetailsViewBrandHandler& aBrandHandler, + MVIMPSTDetailsPresenceHandler& aPresenceHandler) + : iBrandHandler( aBrandHandler), + iPresenceHandler( aPresenceHandler ) + { + // No implementation required + } + +// --------------------------------------------------------------------------- +// ConstructL, second phase constructor +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsHeaderControl::ConstructL() + { + TRACER_AUTO; + // Create the header image + iImage = new (ELeave) CEikImage(); + iImage->SetPictureOwnedExternally(ETrue); //EHLeftVCenter + iImage->SetAlignment(EHCenterVCenter); + // Create the header labels + for (TInt i=0; i < KLabelLineCount; i++) + { + CEikLabel* label = new(ELeave) CEikLabel; + CleanupStack::PushL(label); + label->SetTextL(KNullDesC()); + label->SetAlignment(EHLeftVCenter);// EHCenterVCenter, EHLeftVCenter + iLabels.AppendL(label); + CleanupStack::Pop(label); + } + iContactImageSize = KPbkPersonalImageSize; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CVIMPSTDetailsHeaderControl::~CVIMPSTDetailsHeaderControl() + { + iLabels.ResetAndDestroy(); + + if (iImageDecoder) + { + if (iImageDecoder->IsActive()) + { + iImageDecoder->Cancel(); + } + delete iImageDecoder; + iImageDecoder = NULL; + } + delete iHeaderField; + + if (iImage) + { + delete iImage; + iImage = NULL; + } + + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + if (iMask) + { + delete iMask; + iMask = NULL; + } + } + + +// --------------------------------------------------------------------------- +// From CCoeControl, returns the number of child controls to the framework +// --------------------------------------------------------------------------- +// +TInt CVIMPSTDetailsHeaderControl::CountComponentControls() const + { + // image control + Label Count + return 1 + iLabels.Count(); + } + +// --------------------------------------------------------------------------- +// From CCoeControl, returns the child controls to the framework by index +// --------------------------------------------------------------------------- +// +CCoeControl* CVIMPSTDetailsHeaderControl::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 CVIMPSTDetailsHeaderControl::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 ( iImageDecoder ) + { + // if bitmap was set resize it + if (iImageDecoder->IsActive()) + { + iImageDecoder->Cancel(); + } + TRAP_IGNORE( iImageDecoder->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)); + + TRAP_IGNORE(LabelsSizeChangedL()); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsHeaderControl::LabelsSizeChangedL() +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsHeaderControl::LabelsSizeChangedL() + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + TRgb color; + AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 ); + + if (iLabels.Count() > 0) + { + for (TInt i=0; i < iLabels.Count(); i++) + { + iLabels[i]->SetTextL( iPresenceHandler.GetHeaderLabelDataL(i) ); + iLabels[i]->CropText(); + iLabels[i]->OverrideColorL( EColorLabelText, color ); + iLabels[i]->DrawDeferred(); + } + } + } +// --------------------------------------------------------------------------- +// CVIMPSTDetailsHeaderControl::HeaderSizeChangedL() +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsHeaderControl::HeaderSizeChangedL() + { + CFbsBitmap* bmp = NULL; + CFbsBitmap* bmpMask = NULL; + TVIMPSTEnums::TOnlineStatus onlineStatus = iPresenceHandler.GetPresenceStatus(); + if(TVIMPSTEnums::EPending == onlineStatus) + { + iBrandHandler.LoadBitMapLC(bmp, + bmpMask, + EMbmVimpstuiQgn_prop_service_friend_request_sent , + EMbmVimpstuiQgn_prop_service_friend_request_sent_mask ); + } + else if(TVIMPSTEnums::EBlocked == onlineStatus) + { + iBrandHandler.LoadBitMapLC(bmp, + bmpMask, + EMbmVimpstuiQgn_servtab_avatar_blocked , + EMbmVimpstuiQgn_servtab_avatar_blocked_mask ); + } + else + { + iBrandHandler.LoadBitMapLC(bmp, + bmpMask, + EMbmVimpstuiQgn_prop_service_default_avatar , + EMbmVimpstuiQgn_prop_service_default_avatar_mask ); + } + SetBitmap(bmp, bmpMask);//ownership transferred + CleanupStack::Pop(2); // bitmap,bmpMask + SizeChanged(); + + } +// --------------------------------------------------------------------------- +// From CCoeControl, overridden to set the container windows for the child +// controls of this control (labels and image) +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsHeaderControl::SetContainerWindowL(const CCoeControl& aContainer) + { + CCoeControl::SetContainerWindowL(aContainer); + iImage->SetContainerWindowL(aContainer); + for (TInt i=0; i < iLabels.Count(); i++) + { + iLabels[i]->SetContainerWindowL(aContainer); + } + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsHeaderControl :: SetBitmap +// Sets the bitmap shown in the header image +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsHeaderControl::SetBitmap(CFbsBitmap* aBmp, CFbsBitmap* aMask ) + { + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + if (iMask) + { + delete iMask; + iMask = NULL; + } + iBitmap = aBmp; + iMask = aMask; + + iImage->SetPicture(aBmp, NULL); + iImage->DrawDeferred(); + + TRAP_IGNORE( LabelsSizeChangedL() ); + } + +// --------------------------------------------------------------------------- +// CVIMPSTDetailsHeaderControl :: ClearL +// Clears the header texts & image to blank +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsHeaderControl::ClearL() + { + iImage->SetPicture(NULL, NULL); + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + if (iMask) + { + delete iMask; + iMask = NULL; + } + for (TInt i = 0; i < iLabels.Count(); i++) + { + iLabels[i]->SetTextL(KNullDesC()); + } + + } +// --------------------------------------------------------------------------- +// CVIMPSTDetailsHeaderControl :: CreateHeaderPresentationL +// Clears the header texts & image to blank +// --------------------------------------------------------------------------- +// +void CVIMPSTDetailsHeaderControl::CreateHeaderPresentationL(MVPbkStoreContact& aContact ) + { + TRACER_AUTO; + if( iHeaderField ) + { + delete iHeaderField; + iHeaderField = NULL ; + } + + MVPbkStoreContactFieldCollection& fieldCollection = aContact.Fields(); + + TInt fieldCount = fieldCollection.FieldCount(); + + for( TInt i=0; i< fieldCount; i++ ) + { + MVPbkStoreContactField& field = fieldCollection.FieldAt( i ); + const MVPbkFieldType* type = field.BestMatchingFieldType() ; + if( R_VPBK_FIELD_TYPE_THUMBNAILPIC == type->FieldTypeResId() ) + { + iHeaderField = field.CloneLC(); + CleanupStack::Pop(); + break; + } + } + if( iHeaderField ) + { + // field available + const MVPbkContactFieldData& fieldData = iHeaderField->FieldData(); + if( fieldData.DataType() == EVPbkFieldStorageTypeBinary ) + { + TPtrC8 data = MVPbkContactFieldBinaryData::Cast(fieldData).BinaryData(); + if (iImageDecoder) + { + if (iImageDecoder->IsActive()) + { + iImageDecoder->Cancel(); + } + delete iImageDecoder; + iImageDecoder = NULL; + } + iImageDecoder = CVIMPSTDetailsImageDecoder::NewL(*this, data ); + iImageDecoder->StartL(iContactImageSize); + } + } + + } + +// end of file +