diff -r 000000000000 -r 094583676ce7 wvuing/wvuiave/AppSrc/CCASmileIconDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiave/AppSrc/CCASmileIconDialog.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,691 @@ +/* +* Copyright (c) 2003-2005 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: Dialog for selecting smile icon. + +* +*/ + + + + +// INCLUDE FILES + +#include "CCASmileIconDialog.h" + +#include "CCASmileIconGrid.h" + +#include "IMSmileUtilityNG.hrh" + +#include "layoutdebugprint.h" + +#include "catouchutils.h" + + + +#include + +#include + +#include + +#include + +#include + +#include + +#include + +#include + + + + + +// CONSTANTS + +const TInt KAknSctCBaButtonDirections = 3; // bottom, right and left + + + + + +// ================= MEMBER FUNCTIONS ======================= + + + + + +// Two-phased constructor. + +CCASmileIconDialog* CCASmileIconDialog::NewL( + + const RPointerArray& aIconArray, + + TInt& aSelectedIconId ) + + { + + CCASmileIconDialog* self = + + new ( ELeave ) CCASmileIconDialog( aIconArray, aSelectedIconId ); + + return self; + + } + + + +// Destructor + +CCASmileIconDialog::~CCASmileIconDialog() + + { + + } + + + +// C++ constructor can NOT contain any code, that + +// might leave. + +// + +CCASmileIconDialog::CCASmileIconDialog( + + const RPointerArray& aIconArray, + + TInt& aSelectedIconId ) + + : iIconArray( aIconArray ), iIconId( aSelectedIconId ), iIsMirrored( EFalse ) + + { + + } + + + +// --------------------------------------------------------- + +// CCASmileIconDialog::OfferKeyEventL + +// Handle key event. + +// If key code is other than OK and arrow key, no action. + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +TKeyResponse CCASmileIconDialog::OfferKeyEventL( + + const TKeyEvent& aKeyEvent, TEventCode aType ) + + { + + TKeyResponse response( EKeyWasConsumed ); + + + + switch ( aKeyEvent.iCode ) + + { + + // fall through + + case EKeyLeftArrow: + + case EKeyRightArrow: + + case EKeyUpArrow: + + case EKeyDownArrow: + + { + + CCASmileIconGrid* grid = + + static_cast< CCASmileIconGrid*>( + + Control( EIMIdSelectSmileGrid ) ); + + grid->MoveCursor( aKeyEvent.iCode ); + + break; + + } + +// case EKeyEscape: // handle dialog shutdown. let it go in its default way + case EKeyEnter: + { + + TryExitL( EAknSoftkeySelect ); + + return EKeyWasConsumed; + + } + + default: + + { + + response = CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + + break; + + } + + } + + return response; + + } + +// --------------------------------------------------------- + +// CCASmileIconDialog::OkToExitL + +// Called when CBA-key or OK-key is pressed. + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +void CCASmileIconDialog::HandleResourceChange( TInt aType ) + + { + + if ( aType == KEikDynamicLayoutVariantSwitch ) + + { + + SetLayout(); + + } + + CAknDialog::HandleResourceChange( aType ); + + } + + + +// --------------------------------------------------------- + +// CCASmileIconDialog::OkToExitL + +// Called when CBA-key or OK-key is pressed. + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +TBool CCASmileIconDialog::OkToExitL( TInt aButtonId ) + + { + + if ( aButtonId == EAknSoftkeySelect || + + aButtonId == EEikBidOk ) + + { + + CCASmileIconGrid* grid = + + static_cast< CCASmileIconGrid*>( + + Control( EIMIdSelectSmileGrid ) ); + + iIconId = grid->SelectedBitmapId(); + return ETrue; + } + + return EFalse; + + } + + + +// --------------------------------------------------------- + +// CCASmileIconDialog::PreLayoutDynInitL + +// Prepare for drawing dialog. + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +void CCASmileIconDialog::PreLayoutDynInitL() + + { + + SetLineNonFocusing( EIMIdSelectSmileLabel ); + + EnableDragEvents(); + + } + + + +// --------------------------------------------------------- + +// CCASmileIconDialog::SetSizeAndPosition + +// Control size is set. This is called just after PreLayoutDynInitL(). + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +void CCASmileIconDialog::SetSizeAndPosition( const TSize& /*aSize*/ ) + + { + + SetLayout(); + + } + + + +// --------------------------------------------------------- + +// CCASmileIconDialog::CalculatePopupVariety + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +TInt CCASmileIconDialog::CalculatePopupVariety() + + { + + CCASmileIconGrid* grid = + + static_cast< CCASmileIconGrid*>( + + Control( EIMIdSelectSmileGrid ) ); + + + + TAknLayoutScalableParameterLimits smileyDialogVariety = + + AknLayoutScalable_Avkon::popup_grid_graphic_window_ParamLimits(); + + TInt maxVariety = smileyDialogVariety.LastVariety(); + + + + // CBA location affects popup layout + + AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation(); + + + + // bottom variety + + TInt maxVarietyOffset = 0; + + TInt varietyOffset = maxVariety + 1; + + + + // right variety + + if ( cbaLocation == AknLayoutUtils::EAknCbaLocationRight ) + + { + + varietyOffset = ( maxVariety + 1 ) / KAknSctCBaButtonDirections; + + maxVarietyOffset = varietyOffset; + + } + + + + // left variety + + else if ( cbaLocation == AknLayoutUtils::EAknCbaLocationLeft ) + + { + + varietyOffset = ( maxVariety + 1 ) / KAknSctCBaButtonDirections; + + maxVarietyOffset = varietyOffset + varietyOffset; + + } + + if ( ( maxVarietyOffset + varietyOffset ) > maxVariety ) + return maxVariety; + else + return maxVarietyOffset + varietyOffset; + } + + + +// --------------------------------------------------------- + +// CCASmileIconDialog::SetLayout + +// Set dialog layout. + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +void CCASmileIconDialog::SetLayout() + + { + + iIsMirrored = AknLayoutUtils::LayoutMirrored() ; + TRect clientRect = iAvkonAppUi->ApplicationRect(); + + //check LAF docs for constants + + TAknLayoutRect mainPane; + + mainPane.LayoutRect( clientRect, AknLayoutScalable_Avkon::main_pane( 6 ) ); + + LAYOUT_DP_RECT( "CCASmileIconDialog main_pane( 6 )", + + mainPane.Rect() ); + + CCASmileIconGrid* grid = + + static_cast< CCASmileIconGrid*>( + + Control( EIMIdSelectSmileGrid ) ); + + // Select correct popup layout + + TInt varietyNumber = CalculatePopupVariety(); + TRect rect = grid->GetFirstCellRect(); + TInt iconCount = iIconArray.Count(); + TInt areaOfIcon = iconCount * rect.Width() * rect.Height(); + TInt variety = varietyNumber; + TInt viewableWidth = 0; + + for ( TInt i = varietyNumber; i > 0; i-- ) + { + + TAknWindowLineLayout popupGridDialogLayout( + AknLayoutScalable_Avkon::popup_grid_graphic_window( i ) ); + + + TAknLayoutRect dialogRect; + + dialogRect.LayoutRect( + mainPane.Rect(), popupGridDialogLayout ); + + viewableWidth = CheckDialog( dialogRect, rect ); + if ( viewableWidth ) + { + varietyNumber = i; + break; + } + } + + if ( viewableWidth ) + { + TAknWindowLineLayout popupGridDialogLayout( + AknLayoutScalable_Avkon::popup_grid_graphic_window( varietyNumber ) ); + + TAknLayoutRect dialogRect; + + dialogRect.LayoutRect( + mainPane.Rect(), popupGridDialogLayout ); + + LAYOUT_DP_RECT( "CCASmileIconDialog popup_grid_graphic_window", + dialogRect.Rect() ); + + grid->SetViewableWindowWidth( viewableWidth ); + + SetRect( dialogRect.Rect() ); + } + // If there is no suitable solution for the smiley dialog layout + else + { + // Use the max variety number + varietyNumber = CalculatePopupVariety(); + + TAknWindowLineLayout popupGridDialogLayout( + AknLayoutScalable_Avkon::popup_grid_graphic_window( varietyNumber ) ); + + TAknLayoutRect dialogRect; + + dialogRect.LayoutRect( + mainPane.Rect(), popupGridDialogLayout ); + + LAYOUT_DP_RECT( "CCASmileIconDialog popup_grid_graphic_window", + dialogRect.Rect() ); + + if ( !iIsMirrored ) + { + // Right Margin of the top left (top right) icon's X + TInt leftMargin = rect.iTl.iX; + + // Use the max viewable width + viewableWidth = dialogRect.Rect().iBr.iX - dialogRect.Rect().iTl.iX - leftMargin; + } + else + { + // Left Margin of the top left (top right) icon's X + TInt rightMargin = rect.iBr.iX; + + // Use the max viewable width + viewableWidth = dialogRect.Rect().iBr.iX - dialogRect.Rect().iTl.iX + rightMargin; + } + + grid->SetViewableWindowWidth( viewableWidth ); + + if ( !iIsMirrored ) + SetRect( dialogRect.Rect() ); + // When the Hebrew is the language as well as the Arb languages + // The align is not right + else + { + TRect mirroredDialogRect; + + // Align to right. + mirroredDialogRect = dialogRect.Rect(); + + // Get the rect of the cba pane. + TRect controlPaneRect; + AknLayoutUtils::LayoutMetricsRect( + AknLayoutUtils::EControlPane, controlPaneRect ); + + TInt cbaWidth = controlPaneRect.iBr.iX - controlPaneRect.iTl.iX; + + mirroredDialogRect.iTl.iX -= cbaWidth; + mirroredDialogRect.iBr.iX -= cbaWidth; + + SetRect( mirroredDialogRect ); + } + } + } + +// --------------------------------------------------------- + +// CCASmileIconDialog::CheckDialog + +// Check if Dialog is suitable to fit all smile icon + +// (other items were commented in a header). + +// --------------------------------------------------------- + +TInt CCASmileIconDialog::CheckDialog( TAknLayoutRect aDialogRect, TRect aRect ) + { + CCASmileIconGrid* grid = static_cast< CCASmileIconGrid* >( Control( EIMIdSelectSmileGrid ) ); + + TInt topMargin = aRect.iTl.iY; + + TInt viewableWidth = 0; + + if ( !iIsMirrored ) + { + TInt leftMargin = aRect.iTl.iX; + + viewableWidth = aDialogRect.Rect().iBr.iX - aDialogRect.Rect().iTl.iX - 2 * leftMargin; + } + else + { + TInt rightMargin = aRect.iBr.iX; + + viewableWidth = aDialogRect.Rect().iBr.iX - aDialogRect.Rect().iTl.iX + 2 * rightMargin; + } + TInt viewableHight = aDialogRect.Rect().iBr.iY - aDialogRect.Rect().iTl.iY - topMargin; + + TInt viewableArea = viewableWidth * viewableHight; + + TInt iconCount = iIconArray.Count(); + TInt areaOfIcon = iconCount * aRect.Width() * aRect.Height(); + + if ( areaOfIcon > viewableArea ) + { + return 0; + } + else + { + return viewableWidth; + } + } + +// --------------------------------------------------------- + +// CCASmileIconDialog::CreateCustomControlL + +// Create CCASmileIconGrid class in order to display + +// icons in grid. + +// This is called when dialog is created. + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +SEikControlInfo CCASmileIconDialog::CreateCustomControlL( + + TInt aControlType ) + + { + + SEikControlInfo controlInfo; + + controlInfo.iControl = NULL; + + controlInfo.iTrailerTextId = 0; + + controlInfo.iFlags = 0; + + + + if ( aControlType == EIMCtrlSelectSmileGrid ) + + { + + controlInfo.iControl = CCASmileIconGrid::NewL( this, iIconArray ); + + static_cast + + ( controlInfo.iControl )->SetTapObserver( this, 0 ); + + } + + return controlInfo; + + } + + + +// --------------------------------------------------------- + +// CCASmileIconDialog::HandleDialogPageEventL + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +void CCASmileIconDialog::HandleDialogPageEventL( TInt aEventID ) + + { + if ( CATouchUtils::PenEnabled() ) + { + if ( iSmileyPointed && + aEventID == MEikDialogPageObserver::EDialogPageTapped ) + { + // Exit requested, exit with ok. + TryExitL( EAknSoftkeyOk ); + } + //else keep dialog as it is do not exit. + } + } + +// --------------------------------------------------------- + +// CCASmileIconDialog::HandleTapEventL + +// (other items were commented in a header). + +// --------------------------------------------------------- + +// + +void CCASmileIconDialog::HandleTapEventL( TTapEvent aEvent, + + TUint /*aControlId*/ ) + + { + + // User tapped on smiley. + + if ( aEvent == MCATapEventObserver::ESingleTap ) + + { + + // Smiley was selected but we can't exit directly from here. + + // Instead we put the flag on and wait for + + // HandleDialogPageEventL. + + iSmileyPointed = ETrue; + + } + + } + + + +// End of File