--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiapp/src/cimcvappsmileicondialog.cpp Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,516 @@
+/*
+* 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 ), iLayoutChanged(EFalse)
+ {
+
+ }
+
+
+
+// ---------------------------------------------------------
+// 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 )
+ {
+ iLayoutChanged = ETrue;
+ 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") );
+
+ 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;
+ //check LAF docs for constants
+ //AknLayoutUtils::LayoutMetricsRect
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EApplicationWindow,
+ clientRect);
+ 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 viewableWidth = 0;
+
+ for (TInt i = varietyNumber; i >= 0; i--)
+ {
+
+ TAknWindowLineLayout popupGridDialogLayout(
+ AknLayoutScalable_Avkon::popup_grid_graphic_window(i));
+
+ TAknLayoutRect dialogRect;
+
+ dialogRect.LayoutRect(clientRect, 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(clientRect, popupGridDialogLayout);
+ grid->SetViewableWindowWidth(viewableWidth);
+ SetRect(dialogRect.Rect());
+ }
+ // If there is no suitable solution for the smiley dialog layout
+ else
+ {
+ // No variety of the popup_grid_graphic_window has provided sufficient area
+ // for the grid display. Hence selecting 0 variety for displaying the grid
+ // because it has the greatest area.
+ varietyNumber = 0;
+ TAknWindowLineLayout popupGridDialogLayout(
+ AknLayoutScalable_Avkon::popup_grid_graphic_window(
+ varietyNumber));
+
+ TAknLayoutRect dialogRect;
+
+ dialogRect.LayoutRect(clientRect, 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)
+ {
+ // topMargin is the height of the margin which the smiley grid has
+ // above its top horizontal line and bottom horizontal line.
+ TInt topMargin = aRect.Height();
+
+ TRect dialogRect = aDialogRect.Rect();
+
+ TInt vWidth = 0;
+ TInt vheight = 0;
+ TInt vArea = 0;
+ vheight = dialogRect.iBr.iY - dialogRect.iTl.iY - 2*topMargin;
+ if ( !iIsMirrored )
+ {
+ vWidth = dialogRect.iBr.iX - dialogRect.iTl.iX - 2*aRect.iTl.iX;;
+ }
+ else
+ {
+ // Patch fix for mirrored layout when mode changes from portrait to
+ // landscape or vice versa the width calculation differs to adjust the correct width
+ if (iLayoutChanged) // mode change like portrait to landscape or vice versa
+ {
+ vWidth = (2*aRect.iBr.iX) - (dialogRect.iBr.iX - dialogRect.iTl.iX);
+ }
+ else
+ {
+ vWidth = dialogRect.iBr.iX - dialogRect.iTl.iX + 2*aRect.iBr.iX;
+ }
+ }
+ vArea = vWidth*vheight;
+
+ TInt iconCount = iIconArray.Count();
+
+ TInt areaOfIcon = iconCount * aRect.Width() * aRect.Height();
+
+ if(areaOfIcon > vArea)
+ {
+ return 0;
+ }
+ else
+ {
+ return vWidth;
+ }
+ }
+
+
+// ---------------------------------------------------------
+// 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