imstutils/imconversationview/imcvuiapp/src/cimcvappsmileicondialog.cpp
changeset 0 5e5d6b214f4f
child 11 bef90b82da71
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiapp/src/cimcvappsmileicondialog.cpp	Tue Feb 02 10:12:18 2010 +0200
@@ -0,0 +1,519 @@
+/*
+* Copyright (c) 2007-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:  Dialog for selecting smile icon.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+
+#include "cimcvappsmileicondialog.h"
+#include "cimcvappsmileicongrid.h"
+#include "imcvappsmileutility.hrh"
+#include <AknDef.h>
+#include <aknappui.h>
+#include <aknutils.h>
+#include <aknconsts.h>
+#include <aknborders.h>
+#include <AknsDrawUtils.h>
+#include <AknLayoutScalable_Avkon.cdl.h>
+#include <aknlists.h> 
+#include <AknUtils.h> 
+#include "imcvlogger.h"
+#include "imcvuiapputils.h"
+
+#include "e32property.h"
+// CONSTANTS
+
+const TInt KAknSctCBaButtonDirections = 3; // bottom, right and left
+
+
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::NewL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+CIMCVAppSmileIconDialog* CIMCVAppSmileIconDialog::NewL( 
+            const RPointerArray<CGulIcon>& aIconArray,
+			TInt& aSelectedIconId )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::NewL() start") );
+    CIMCVAppSmileIconDialog* self =
+        new (ELeave) CIMCVAppSmileIconDialog( aIconArray, aSelectedIconId );
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::NewL() end") );
+    return self;
+    }
+
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::~CIMCVAppSmileIconDialog
+// ---------------------------------------------------------
+//
+CIMCVAppSmileIconDialog::~CIMCVAppSmileIconDialog()
+    {
+	
+    }
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::CIMCVAppSmileIconDialog
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CIMCVAppSmileIconDialog::CIMCVAppSmileIconDialog( 
+                            const RPointerArray<CGulIcon>& aIconArray,
+							TInt& aSelectedIconId )
+:iIconArray( aIconArray ), iIconId( aSelectedIconId )
+    {
+    
+    }
+
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::OfferKeyEventL
+// Handle key event.
+// If key code is other than OK and arrow key, no action.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CIMCVAppSmileIconDialog::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::OfferKeyEventL() start") );
+    TKeyResponse response( EKeyWasConsumed );
+    switch( aKeyEvent.iCode )
+        {
+		// fall through
+        case EKeyLeftArrow:
+        case EKeyRightArrow:
+        case EKeyUpArrow:
+        case EKeyDownArrow:
+            {
+            CIMCVAppSmileIconGrid* grid =
+				static_cast< CIMCVAppSmileIconGrid*>(
+				Control( EIMIdSelectSmileGrid ) );
+            grid->MoveCursor( aKeyEvent.iCode );
+            break;
+            }
+        case EKeyEscape: // handle dialog shutdown.
+            {
+			TryExitL( EAknSoftkeyExit );
+            return EKeyWasNotConsumed;
+            }
+        default:
+            {
+            response = CAknDialog::OfferKeyEventL(aKeyEvent, aType);
+            break;
+            }
+        }
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::OfferKeyEventL() end") );
+    return response;
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::OkToExitL
+// Called when CBA-key or OK-key is pressed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconDialog::HandleResourceChange( TInt aType )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::HandleResourceChange() start") );
+    if( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        SetLayout();
+        }
+	CAknDialog::HandleResourceChange( aType );
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::HandleResourceChange() end") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::OkToExitL
+// Called when CBA-key or OK-key is pressed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CIMCVAppSmileIconDialog::OkToExitL( TInt aButtonId )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::OkToExitL() start") );
+    if( aButtonId == EAknSoftkeySelect ||
+        aButtonId == EEikBidOk )
+        {
+		CIMCVAppSmileIconGrid* grid =
+			static_cast< CIMCVAppSmileIconGrid*>(
+			Control( EIMIdSelectSmileGrid ) );
+		iIconId = grid->SelectedBitmapId();
+        }
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::OkToExitL() end") );
+    return ETrue;
+    }
+
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::PreLayoutDynInitL
+// Prepare for drawing dialog.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconDialog::PreLayoutDynInitL()
+    {
+    SetLineNonFocusing( EIMIdSelectSmileLabel );
+    EnableDragEvents();
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::SetSizeAndPosition
+// Control size is set. This is called just after PreLayoutDynInitL().
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconDialog::SetSizeAndPosition(const TSize& /*aSize*/)
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::SetSizeAndPosition() start") );
+	SetLayout();
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::SetSizeAndPosition() end") );
+    }
+
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::CalculatePopupVariety
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+TInt CIMCVAppSmileIconDialog::CalculatePopupVariety()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::CalculatePopupVariety() start") );
+	CIMCVAppSmileIconGrid* grid =
+			static_cast< CIMCVAppSmileIconGrid*>(
+			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;
+        }
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::CalculatePopupVariety() end") );
+	
+	if ((maxVarietyOffset + varietyOffset)>maxVariety)
+		return maxVariety;
+	else
+    	return maxVarietyOffset + varietyOffset;
+	
+    }
+
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::SetLayout
+// Set dialog layout.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconDialog::SetLayout()
+	{   
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::SetLayout() start") );
+	iIsMirrored = AknLayoutUtils::LayoutMirrored() ;
+	TRect clientRect = iAvkonAppUi->ApplicationRect();
+    //check LAF docs for constants
+    TAknLayoutRect mainPane;
+    mainPane.LayoutRect( clientRect, AknLayoutScalable_Avkon::main_pane( 6 ) );
+	
+	CIMCVAppSmileIconGrid* grid =
+
+			static_cast< CIMCVAppSmileIconGrid*>(
+
+			Control( EIMIdSelectSmileGrid ) ); 	
+			
+    // Select correct popup layout
+
+    TInt varietyNumber = CalculatePopupVariety();
+    TRect rect = grid->GetFirstCellRect();
+    TInt iconCount = iIconArray.Count();
+    // calculating the number of rows required by the icon grid.
+    TInt rowCount = 1 + ( iconCount/4 );
+    
+    // 4 * rowCount denotes the maximum number of icons accomodated
+    // in the row.
+    TInt areaOfIcon = 4 * rowCount * rect.Width() * rect.Height();
+	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 );
+		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 );
+
+	  
+
+	    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 );
+	        }
+	    }
+	}
+
+
+
+// ---------------------------------------------------------
+
+// CIMCVAppSmileIconDialog::CheckDialog
+
+// Check if Dialog is suitable to fit all smile icon
+
+// (other items were commented in a header).
+
+// ---------------------------------------------------------
+
+TInt CIMCVAppSmileIconDialog::CheckDialog(TAknLayoutRect aDialogRect,TRect aRect)
+		{
+        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();
+
+	    // calculating the number of rows required by the icon grid.
+	    TInt rowCount = 1 + ( iconCount/4 );
+	    
+	    // 4 * rowCount denotes the maximum number of icons accomodated
+	    // in the row.
+	    TInt areaOfIcon = 4 * rowCount * aRect.Width() * aRect.Height();
+	    
+	    if(areaOfIcon > viewableArea)
+		    {
+			return 0;
+		    }
+		else
+			{
+			return viewableWidth;
+			}
+		}
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconDialog::CreateCustomControlL
+// Create CIMCVAppSmileIconGrid class in order to display
+// icons in grid.
+// This is called when dialog is created.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+SEikControlInfo CIMCVAppSmileIconDialog::CreateCustomControlL(
+										TInt aControlType )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::SetLayout() start") );
+    SEikControlInfo controlInfo;
+    controlInfo.iControl = NULL;
+    controlInfo.iTrailerTextId = 0;
+    controlInfo.iFlags = 0;
+    if( aControlType == EIMCtrlSelectSmileGrid )
+        {
+        controlInfo.iControl = CIMCVAppSmileIconGrid::NewL( this, iIconArray );
+
+        static_cast<CIMCVAppSmileIconGrid*>
+
+            (controlInfo.iControl)->SetTapObserver( this, 0 );
+
+        }
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconDialog::SetLayout() end") );
+    return controlInfo;
+    }
+
+
+
+// ---------------------------------------------------------
+
+// CIMCVAppSmileIconDialog::HandleDialogPageEventL
+
+// (other items were commented in a header).
+
+// ---------------------------------------------------------
+
+//
+
+void CIMCVAppSmileIconDialog::HandleDialogPageEventL( TInt aEventID )
+
+    {
+    if( IMCVUiAppUtils::PenEnabled() )
+        {
+        if ( iSmileyPointed &&
+             aEventID == MEikDialogPageObserver::EDialogPageTapped )
+            {        
+            // Exit requested, exit with ok. 
+            TryExitL( EAknSoftkeyOk );
+            }
+         
+         //else keep dialog as it is do not exit.  
+        }
+    }
+
+// ---------------------------------------------------------
+
+// CIMCVAppSmileIconDialog::HandleTapEventL
+
+// (other items were commented in a header).
+
+// ---------------------------------------------------------
+
+//
+
+void CIMCVAppSmileIconDialog::HandleTapEventL( TTapEvent aEvent, 
+
+                                          TUint /*aControlId*/ )
+
+    {
+
+    // User tapped on smiley.
+
+    if( aEvent == MIMCVTapEventObserver::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