diff -r 41a7f70b3818 -r 5266b1f337bd phoneuis/BubbleManager/Src/BMBubbleOutlookConference.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneuis/BubbleManager/Src/BMBubbleOutlookConference.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -0,0 +1,736 @@ +/* +* Copyright (c) 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: Outlook Conference +* +*/ + + +// INCLUDE FILES +#include "BMBubbleManager.h" //for enumerations +#include "BMBubbleOutlookConference.h" +#include "BMBubbleImageManager.h" +#include "BMResourceManager.h" +#include "BMConfHeader.h" +#include "BMLayout.h" +#include "BMUtils.h" +#include "BMPanic.h" +#include "BMLayout2.h" +#include "BMLayout4.h" + +#include +#include +#include +#include +#include + +// ========================= MEMBER FUNCTIONS ================================ + +CBubbleOutlookConference::CBubbleOutlookConference( + CBubbleManager& aBubbleManager ) + : CBubbleOutlook( aBubbleManager ) + { + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::ConstructL +// --------------------------------------------------------------------------- +// + +void CBubbleOutlookConference::ConstructL( const TUint8& aCallAmount ) + { + iPaneAmount = aCallAmount; + iHeader = NULL; + + // create panes for each call + CBubbleConfPane* pane; + iConfPanes = new ( ELeave ) CArrayPtrFlat( iPaneAmount ); + iConfPanes->SetReserveL( iPaneAmount ); + + for ( TUint8 i = 0 ; i < iPaneAmount ; i++ ) + { + pane = new( ELeave ) CBubbleConfPane; + CleanupStack::PushL( pane ); + pane->SetContainerWindowL( *this ); + pane->ConstructL( iBubbleManager.IsTouchCallHandling() ); + iConfPanes->InsertL( i , pane ); + CleanupStack::Pop( pane ); + } + + // Create space for headers + iCalls = new( ELeave ) CArrayPtrFlat( iPaneAmount ); + iCalls->SetReserveL( iPaneAmount ); + + + CBubbleOutlook::ConstructL(); + ActivateL(); + } + +// Destructor +CBubbleOutlookConference::~CBubbleOutlookConference() + { + + if ( iCalls && iConfPanes ) + { + Reset(); + } + + if ( iCalls ) + { + iCalls->Reset( ); + delete iCalls; + } + + if ( iConfPanes ) + { + iConfPanes->ResetAndDestroy() ; + delete iConfPanes; + } + + iHeader = NULL; + } + + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::Reset +// +// +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::Reset() + { + iBubbleManager.ResourceManager().ReleaseEikImage( iBubble ); + iBubbleManager.ResourceManager().ReleaseEikLabel( iTimerCost ); + for ( TUint8 i = 0 ; i < iPaneAmount ; i++ ) + { + iBubbleManager.ResourceManager().ReleaseEikImage( + iConfPanes->At( i )->iCallIndication ); + iBubbleManager.ResourceManager().ReleaseEikImage( + iConfPanes->At( i )->iCyphOffImage ); + iBubbleManager.ResourceManager().ReleaseEikLabel( + iConfPanes->At( i )->iTextLine ); + iConfPanes->At( i )->Reset( ); + } + + iCalls->Delete( 0 , iCalls->Count() ); + + iHeader = NULL; + } + + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::ReadBubbleHeader +// +// +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::ReadBubbleHeader( CBubbleHeader& aHeader ) + { + if ( !aHeader.IsUsed() || !aHeader.IsConference() ) + { + return; + } + + iHeader = static_cast< CBubbleConfHeader* >( &aHeader ); + + // get call's info. Function returns calls in drawing order. + iHeader->GetRows( *iCalls ); + __ASSERT_ALWAYS( iCalls->Count( ) == iPaneAmount, + Panic( EBMPanicInvalidNumberOfHeaders ) ); + + + iBubble = iBubbleManager.ResourceManager().ReserveEikImage( ETrue ); + + if ( !iCallObjectDisplay ) + { + // Get bubble graphics + GetCall1BubbleBitmaps(); + } + + // Get call indicator for each pane. + TUint32 flags = 0; + CBubbleManager::TPhoneCallState state; + + TInt indicationPicture = KErrNotFound; + TInt indicationPictureMask =KErrNotFound; + + for ( TUint8 i = 0 ; i < iPaneAmount ; i++ ) + { + flags = iCalls->At( i )->CallFlags( ); + state = iCalls->At( i )->CallState( ); + CEikImage*& image = iConfPanes->At( i )->CallIndicationHandle( ); + + indicationPicture = KErrNotFound; + indicationPictureMask = KErrNotFound; + + if ( state == CBubbleManager::EDisconnected ) + { + indicationPicture = EQgn_indi_call_disconn_conf; + indicationPictureMask = EQgn_indi_call_disconn_conf_mask; + } + else if ( state == CBubbleManager::EActive ) + { + indicationPicture = EQgn_indi_call_active_conf; + indicationPictureMask = EQgn_indi_call_active_conf_mask; + } + else + { + indicationPicture = EQgn_indi_call_held_conf; + indicationPictureMask = EQgn_indi_call_held_conf_mask; + } + + if ( indicationPicture != KErrNotFound ) + { + image = iBubbleManager.ResourceManager().ReserveEikImage(); + if ( indicationPictureMask == KErrNotFound ) + { + iBubbleManager.ImageManager().SetBitmapToImage( + image, (TBMIcons) indicationPicture ); + } + else + { + iBubbleManager.ImageManager().SetBitmapToImage( + image, + (TBMIcons) indicationPicture , + (TBMIcons) indicationPictureMask); + } + } + + // Cyph off + if ( flags&CBubbleManager::ENoCiphering ) + { + iConfPanes->At( i )->iCyphOffImage = + iBubbleManager.ResourceManager().ReserveEikImage(); + iBubbleManager.ImageManager().SetBitmapToImage( + iConfPanes->At( i )->iCyphOffImage, + EQgn_indi_call_cyphering_off, + EQgn_indi_call_cyphering_off_mask ); + } + + // set CLI to pane + if ( ( iCalls->At( i )->ParticipantListCLI() == + CBubbleManager::EParticipantListCNAP ) && + iCalls->At( i )->CNAP().Length() ) + { + // Phonenumber + iConfPanes->At( i )->iTextLine = + iBubbleManager.ResourceManager().ReserveEikLabel(); + iConfPanes->At( i )->SetText( iCalls->At( i )->CNAP(), + iCalls->At( i )->CNAPClipDirection( ) ); + } + else + { + // CLI text + iConfPanes->At( i )->iTextLine = + iBubbleManager.ResourceManager().ReserveEikLabel(); + iConfPanes->At( i )->SetText( iCalls->At( i )->CLI(), + iCalls->At( i )->CLIClipDirection( ) ); + } + + iConfPanes->At( i )->iCallObjectDisplay = iCallObjectDisplay; + } + + // get highlight + for ( TUint8 t = 0 ; t < iConfPanes->Count() ; t++ ) + { + iConfPanes->At( t )->SetHighlight( EFalse ); + } + + if ( iHeader->Highlight() != 0 ) + { + iConfPanes->At( iHeader->Highlight() - 1 )->SetHighlight( ETrue ); + } + + // place timer/cost text to label + if ( !iBubbleManager.IsTouchCallHandling() ) + { + iTimerCost = iBubbleManager.ResourceManager().ReserveEikLabel(); + BubbleUtils::ClipToLabel( + iHeader->TimerCost( ) , iTimerCost , CBubbleManager::ERight ); + + } + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::SizeChanged +// called by framwork when the view size is changed +// Works with all the conference situations. +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::SizeChanged() + { + if( !iHeader ) + { + return; + } + + AknsUtils::RegisterControlPosition( this ); + + if ( iBubbleManager.IsTouchCallHandling() ) + { + TRAPD( err, DoCall4LayoutL() ); + if ( err ) + { + iBubble->SetPicture( NULL, NULL ); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + AknsDrawUtils::PrepareFrame( skin, + iOuterRect, + iInnerRect, + iFrameId, + KAknsIIDDefault ); + } + } + else if ( !iCallObjectDisplay ) + { + DoCall1Layout(); + } + else + { + TRAPD( err, DoCall2LayoutL() ); + if ( err ) + { + iBubble->SetPicture( NULL, NULL ); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + AknsDrawUtils::PrepareFrame( skin, + iOuterRect, + iInnerRect, + iFrameId, + KAknsIIDDefault ); + } + } + + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::CountComponentControls +// +// +// --------------------------------------------------------------------------- +// +TInt CBubbleOutlookConference::CountComponentControls() const + { + if ( iTimerCost ) + { + return 1 + iConfPanes->Count( ); + } + return iConfPanes->Count( ); + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::ComponentControl +// +// +// --------------------------------------------------------------------------- +// +CCoeControl* CBubbleOutlookConference::ComponentControl(TInt aIndex) const + { + if ( iTimerCost ) + { + if ( aIndex < iConfPanes->Count( ) ) + { + return iConfPanes->At( aIndex ); + } + else if ( aIndex == iConfPanes->Count( ) ) + { + return iTimerCost; + } + else + { + return NULL; + } + } + return iConfPanes->At( aIndex ); + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::Draw +// +// +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::Draw( const TRect& /*aRect*/ ) const + { + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::DrawTimerCostNow +// +// +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::DrawTimerCostNow() + { + if ( iHeader == NULL || iTimerCost == NULL ) + { + return; + } + + if ( iHeader->CallState() != CBubbleManager::EActive + || iTimerCost->Text()->Compare( iHeader->TimerCost() ) == 0 ) + { + return; + } + + BubbleUtils::ClipToLabel( + iHeader->TimerCost() , iTimerCost , CBubbleManager::ERight ); + DrawLabelNow( iTimerCost ); + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::DrawCLINow +// +// +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::DrawCLINow() + { + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::DrawRowNow +// +// +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::DrawRowNow( CBubbleManager::TRowNumber aRow ) + { + if ( iHeader == NULL || aRow == 0 ) + { + return; + } + + // get highlight + for ( TUint8 t = 0 ; t < iConfPanes->Count() ; t++ ) + { + iConfPanes->At( t )->SetHighlight( EFalse ); + } + + if ( iHeader->Highlight() != 0 ) + { + iConfPanes->At( iHeader->Highlight() - 1 )->SetHighlight( ETrue ); + } + + DrawLabelNow( iConfPanes->At( aRow - 1 ) ); + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::DrawBitmaps +// +// +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::DrawBitmaps( CBitmapContext& aGc ) const + { + // Check that proper conference header is set + if ( iHeader == NULL ) + { + return; + } + + if ( !iHeader->IsUsed() || !iHeader->IsConference( ) ) + { + return; + } + + aGc.SetBrushColor( AKN_LAF_COLOR( BubbleLayout::LayoutColourWhite() ) ); + + if ( !iCallObjectDisplay ) + { + BubbleUtils::DrawMaskedImage( aGc , iBubble ); + } + else + { + if ( iBubble->Bitmap() ) + { + BubbleUtils::DrawMaskedImage( aGc , iBubble ); + } + else + { + // Draw bubble frame + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + if ( !AknsDrawUtils::DrawFrame( skin, + (CWindowGc&) aGc, + iOuterRect, + iInnerRect, + iFrameId, + KAknsIIDDefault ) ) + { + BubbleUtils::DrawBackgroundRect( aGc, Rect() ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::HandleAnimationStartL +// +// +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::HandleAnimationStartL() const + { + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::DrawCallHeaderText +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::DrawCallHeaderText() + { + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::DoCall1Layout +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::DoCall1Layout() + { + // Deprecated + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::DoCall2Layout +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::DoCall2LayoutL() + { + iBubble->SetPictureOwnedExternally( EFalse ); + iBubble->SetPicture( NULL, NULL ); + + TAknLayoutRect bubbleRect; + bubbleRect.LayoutRect( + Rect(), + BubbleLayout2::popup_call2_conf_pane_background() ); + + TRect frameRect( TPoint(0,0), bubbleRect.Rect().Size() ); + TRect outerRect; + TRect innerRect; + BubbleLayout2::BubbleFrameInnerOuterRects( frameRect, + outerRect, + innerRect ); + + iFrameId = KAknsIIDQsnFrCall2BubbleFirst; + TAknsItemID coMaskFrameId = KAknsIIDQsnFrCall2BubbleFirstCoMask; + + iOuterRect = outerRect; + iOuterRect.Move( Rect().iTl ); + iInnerRect = innerRect; + iInnerRect.Move( Rect().iTl ); + + // CLI list and panes + TAknLayoutRect cliList; + cliList.LayoutRect( Rect(), + BubbleLayout2::popup_call2_conf_cli_list() ); + TRect cliListRect = cliList.Rect(); + + for ( TUint8 paneIndex = 0; paneIndex < iPaneAmount; paneIndex++ ) + { + TAknLayoutRect singlePane; + singlePane.LayoutRect( cliListRect, + BubbleLayout2::popup_call2_conf_single_list_graphic_pane( + paneIndex ) ); + TRect singlePaneRect = singlePane.Rect(); + iConfPanes->At( paneIndex )->SetRect( singlePaneRect ); + } + + // Timer + BubbleUtils::LayoutLabel( + iTimerCost, + Rect(), + BubbleLayout2::popup_call2_conf_window_call_timer_text() ); + + // Create call object bitmaps + iBubble->SetRect( bubbleRect.Rect() ); + + BubbleUtils::PrepareBubbleImageL( + iFrameId, + outerRect, + innerRect, + iBubble ); + + if ( iHeader->CallObjectImage() ) + { + // Scale image according to bubble size + TSize imageSize( Rect().Size() ); + imageSize.iWidth -= imageSize.iWidth / 2; + + BubbleUtils::PrepareCallObjectImageL( + *iHeader, + imageSize ); + + TAknLayoutRect cliRect; + cliRect.LayoutRect( + frameRect, + BubbleLayout2::popup_call2_bubble_pane_graphics_cli() ); + + // Combine image to bubble image + BubbleUtils::PrepareCallObjectToBubbleImageL( + iHeader->CallObjectImage(), + iHeader->CallObjectImageMask(), + cliRect.Rect(), + coMaskFrameId, // gradient image mask + outerRect, + innerRect, + iBubble ); + } + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::DoCall4LayoutL +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::DoCall4LayoutL() + { + iBubble->SetPictureOwnedExternally( EFalse ); + iBubble->SetPicture( NULL, NULL ); + + TAknLayoutRect bubbleRect; + bubbleRect.LayoutRect( + Rect(), + BubbleLayout4::popup_call4_conf_pane_background() ); + + TRect frameRect( TPoint(0,0), bubbleRect.Rect().Size() ); + TRect outerRect; + TRect innerRect; + BubbleLayout2::BubbleFrameInnerOuterRects( frameRect, + outerRect, + innerRect ); + + iFrameId = KAknsIIDQsnFrCall2BubbleFirst; + TAknsItemID coMaskFrameId = KAknsIIDQsnFrCall2BubbleFirstCoMask; + + iOuterRect = outerRect; + iOuterRect.Move( Rect().iTl ); + iInnerRect = innerRect; + iInnerRect.Move( Rect().iTl ); + + // CLI list and panes + TAknLayoutRect cliList; + cliList.LayoutRect( Rect(), + BubbleLayout4::popup_call4_conf_cli_list() ); + TRect cliListRect = cliList.Rect(); + + for ( TUint8 paneIndex = 0; paneIndex < iPaneAmount; paneIndex++ ) + { + TAknLayoutRect singlePane; + singlePane.LayoutRect( cliListRect, + BubbleLayout4::popup_call4_conf_single_list_graphic_pane( + paneIndex ) ); + TRect singlePaneRect = singlePane.Rect(); + iConfPanes->At( paneIndex )->SetRect( singlePaneRect ); + } + + // Create call object bitmaps + iBubble->SetRect( bubbleRect.Rect() ); + + BubbleUtils::PrepareBubbleImageL( + iFrameId, + outerRect, + innerRect, + iBubble ); + + if ( iHeader->CallObjectImage() ) + { + // Scale image according to bubble size + TSize imageSize( Rect().Size() ); + imageSize.iWidth -= imageSize.iWidth / 2; + + BubbleUtils::PrepareCallObjectImageL( + *iHeader, + imageSize ); + + TAknLayoutRect cliRect; + cliRect.LayoutRect( + frameRect, + BubbleLayout2::popup_call2_bubble_pane_graphics_cli() ); + + // Combine image to bubble image + BubbleUtils::PrepareCallObjectToBubbleImageL( + iHeader->CallObjectImage(), + iHeader->CallObjectImageMask(), + cliRect.Rect(), + coMaskFrameId, // gradient image mask + outerRect, + innerRect, + iBubble ); + } + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::GetCall1BubbleBitmaps +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::GetCall1BubbleBitmaps() + { + switch ( iPaneAmount ) + { + case 2: + iBubbleManager.ImageManager().SetBitmapToImage( + iBubble , + EQgn_graf_call_conf_two , + EQgn_graf_call_conf_two_mask ); + break; + case 3: + iBubbleManager.ImageManager().SetBitmapToImage( + iBubble , + EQgn_graf_call_conf_three , + EQgn_graf_call_conf_three_mask ); + break; + case 4: + iBubbleManager.ImageManager().SetBitmapToImage( + iBubble , + EQgn_graf_call_conf_four , + EQgn_graf_call_conf_four_mask ); + break; + case 5: + iBubbleManager.ImageManager().SetBitmapToImage( + iBubble , + EQgn_graf_call_conf_five , + EQgn_graf_call_conf_five_mask ); + break; + default: + Panic( EBMPanicTooManyCallsInConference ); + break; + } + } + +// --------------------------------------------------------------------------- +// CBubbleOutlookConference::HandlePointerEventL +// --------------------------------------------------------------------------- +// +void CBubbleOutlookConference::HandlePointerEventL + ( const TPointerEvent& aPointerEvent ) + { + if ( !iHeader->Highlight() || + aPointerEvent.iType != TPointerEvent::EButton1Up ) + return; + + for ( TInt i=0; i < iPaneAmount; i++ ) + { + if ( iConfPanes->At( i )->Rect().Contains( + aPointerEvent.iPosition ) ) + { + TInt hightlight = i+1; + if ( iHeader->Highlight() != hightlight ) + { + iConfPanes->At( iHeader->Highlight() - 1 )->SetHighlight( EFalse ); + iConfPanes->At( iHeader->Highlight() - 1 )->DrawDeferred(); + iHeader->SetHighlight( hightlight ); + iConfPanes->At( i )->SetHighlight( ETrue ); + iConfPanes->At( i )->DrawDeferred(); + } + } + } + } + +// End of File