--- /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 <akndef.h>
+
+#include <aknappui.h>
+
+#include <aknutils.h>
+
+#include <aknconsts.h>
+
+#include <aknborders.h>
+
+#include <AknsDrawUtils.h>
+
+#include <AknLayoutScalable_Avkon.cdl.h>
+
+#include <eikbtgpc.h>
+
+
+
+
+
+// CONSTANTS
+
+const TInt KAknSctCBaButtonDirections = 3; // bottom, right and left
+
+
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+
+
+
+// Two-phased constructor.
+
+CCASmileIconDialog* CCASmileIconDialog::NewL(
+
+ const RPointerArray<CGulIcon>& 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<CGulIcon>& 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<CCASmileIconGrid*>
+
+ ( 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