phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherheadercontrol.cpp
changeset 0 e686773b3f54
child 3 04ab22b956c2
--- /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 <phonebook2ece.mbg>
+#include <aknstyluspopupmenu.h>
+#include <CPbk2ContactRelocator.h>
+#include <touchfeedback.h>
+#include <w32std.h>
+
+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;   
+	 }