--- a/landmarksui/uicontrols/src/lmkiconmap.cpp Thu Aug 19 09:48:36 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2137 +0,0 @@
-/*
- * Copyright (c) 2002-2010 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: LandmarksUi Content File - Landmarks icon selector map
- *
- */
-
-// INCLUDE FILES
-#include <eikenv.h>
-#include <eiksbfrm.h>
-#include <eikscrlb.h>
-#include <bidivisual.h>
-#include <avkon.rsg>
-#include <AknPanic.h>
-#include <avkon.hrh>
-#include <AknUtils.h>
-#include <aknlayoutscalable_avkon.cdl.h>
-#include <layoutmetadata.cdl.h>
-#include <AknLayout.lag>
-
-#include <aknappui.h>
-#include <aknconsts.h>
-#include <AknDef.h>
-#include <PUAcodes.hrh>
-#include <s32file.h>
-
-#ifdef RD_TACTILE_FEEDBACK
-#include <touchfeedback.h>
-#endif //RD_TACTILE_FEEDBACK
-// For the TEikScrollBarModelType
-#include <eikscrlb.h>
-
-#include <AknsDrawUtils.h>
-#include <featmgr.h>
-
-#include <AknsFrameBackgroundControlContext.h>
-
-#include <lmkui.mbg>
-
-#include "lmkiconmap.h"
-#include "CLmkUiUtils.h"
-#include <lmkerrors.h>
-
-// The offset because of CEikDialogPage
-const TInt KHorizontalDialogMargin = 0;
-const TInt KVerticalDialogMargin = 0;
-const TInt KAknSctCBaButtonDirections = 3; // bottom, right and left
-
-
-/// Unnamed namespace for local definitions
-namespace
- {
- const TInt KNumOfIcons(16);
- _LIT( KPanicMsg, "CLmkIconMap" );
-
- void Panic(TPanicCode aReason)
- {
- User::Panic(KPanicMsg, aReason);
- }
- } // namespace
-
-// ============================ EXTENSION CLASS ===============================
-//Class Declaration
-NONSHARABLE_CLASS(CLmkIconMapExtension) : public CBase,
-public MObjectProvider
- {
-public:
- CLmkIconMapExtension();
- ~CLmkIconMapExtension();
-
-protected:
- TTypeUid::Ptr MopSupplyObject(TTypeUid aId);
- MObjectProvider* MopNext();
-
-public:
- // data
- MCoeControlObserver *iObserver;
-
- TUint iFlags;
- MObjectProvider* iIconMap;
- TInt iMaxVisibleRows;
- CAknsFrameBackgroundControlContext* iBgContext;
- };
-
-// ============================ MEMBER FUNCTIONS OF CLmkIconMapExtension ===============================
-
-// -----------------------------------------------------------------------------
-// CLmkIconMapExtension::CLmkIconMapExtension
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CLmkIconMapExtension::CLmkIconMapExtension() :
- iMaxVisibleRows(0)
- {
- iObserver = NULL;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMapExtension::MopSupplyObject()
-// -----------------------------------------------------------------------------
-//
-TTypeUid::Ptr CLmkIconMapExtension::MopSupplyObject(TTypeUid aId)
- {
- return MAknsControlContext::SupplyMopObject(aId, iBgContext);
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMapExtension::MopNext()
-// -----------------------------------------------------------------------------
-//
-MObjectProvider* CLmkIconMapExtension::MopNext()
- {
- return iIconMap;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMapExtension::~CLmkIconMapExtension()
-// -----------------------------------------------------------------------------
-//
-CLmkIconMapExtension::~CLmkIconMapExtension()
- {
-
- delete iBgContext;
- }
-
-// ============================ MEMBER FUNCTIONS OF CLmkIconMap ===============================
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::CLmkIconMap
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CLmkIconMap::CLmkIconMap() :
- iCursorPos(TPoint(0, 0)), iOldCursorPos(TPoint(0, 0)), iMaxColumns(-1),
- iCurrentPage(0), iNumPages(0)
- {
- iConsArray = (CArrayPtr<CGulIcon>*) NULL;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CLmkIconMap* CLmkIconMap::NewL()
- {
- CLmkIconMap* self = new (ELeave) CLmkIconMap();
-
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self); //self
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::ConstructL()
- {
- // Must be created here to get the member variables available
- iExtension = new (ELeave) CLmkIconMapExtension;
- iExtension->iIconMap = this;
-
- iConsArray = new (ELeave) CAknIconArray(KNumOfIcons);
-
- iExtension->iFlags = 0x00;
-
- DoLayout();
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::~CLmkIconMap()
-// -----------------------------------------------------------------------------
-//
-CLmkIconMap::~CLmkIconMap()
- {
- delete iSBFrame;
- iSBFrame = (CEikScrollBarFrame*) NULL;
-
- delete iOffscreenBg;
- delete iBitmapDevice;
- delete iBitmapGc;
-
- delete iExtension;
- iExtension = (CLmkIconMapExtension*) NULL;
-
- if (iConsArray)
- {
- iConsArray->ResetAndDestroy();
- delete iConsArray;
- iConsArray = (CArrayPtr<CGulIcon>*) NULL;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::DoLayout()
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::DoLayout()
- {
- TRAPD(err, LoadIconL());
- if (err)
- return;
-
- iIsMirrored = AknLayoutUtils::LayoutMirrored();
- iDrawnBefore = EFalse;
- CountMaxColumnsAndCellSizes();
- SizeChanged();
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::ConstructFromResourceL()
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::ConstructFromResourceL(TResourceReader& /*aReader*/)
- {
- LoadIconL();
- CreateScrollBarAndIconRowL();
-
- Extension()->iBgContext = CAknsFrameBackgroundControlContext::NewL(
- KAknsIIDQsnFrPopup, TRect(0, 0, 1, 1), TRect(0, 0, 1, 1), EFalse);
-
- if (DrawableWindow() && AknLayoutUtils::PenEnabled())
- {
- EnableDragEvents();
- SetGloballyCapturing( ETrue);
- SetPointerCapture(ETrue);
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::LoadIcons()
-// This actually load the all icons to be shown on dialog from icon file
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::LoadIconL()
- {
- if (iConsArray)
- {
- iConsArray->ResetAndDestroy();
- }
- // Draw all the Icons.
- TFileName* iconFile = CLmkUiUtils::LmkUiIconFileLC();
-
- // Create icon bitmap and mask.
- for (TInt i(0); i < (KNumOfIcons * 2); i++)
- {
- CFbsBitmap* bitmap = NULL;
- CFbsBitmap* bitmapMask = NULL;
- AknIconUtils::CreateIconLC(bitmap, bitmapMask, *iconFile,
- EMbmLmkuiQgn_prop_lm_transport + i,
- EMbmLmkuiQgn_prop_lm_transport + i + 1);
- i++;
- AknIconUtils::SetSize(bitmap, TSize(iGridItemWidth, iGridItemHeight)); //fix
- AknIconUtils::SetSize(bitmapMask, TSize(iGridItemWidth,
- iGridItemHeight)); //fix
- CGulIcon* icon = CGulIcon::NewL(bitmap, bitmapMask);
- CleanupStack::PushL(icon);
- if (iConsArray)
- iConsArray->AppendL(icon);
- CleanupStack::Pop(icon); // icon
- CleanupStack::Pop(bitmapMask); // mask
- CleanupStack::Pop(bitmap); // bitmap
- }
- CleanupStack::PopAndDestroy();// iconFile
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::HeightInRows()
-// This actually returns the no of rows to be shown on a page
-// Depends upon the Layout size
-// -----------------------------------------------------------------------------
-//
-TInt CLmkIconMap::HeightInRows()
- {
- return (iRows);
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::CreateScrollBarAndIconRowL()
-// This actually creates the scroll bar sets the number of
-// pages and rows on a page to be shown
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::CreateScrollBarAndIconRowL()
- {
- __ASSERT_DEBUG(iExtension, Panic(KLmkPanicInvalidResourceData));
-
- __ASSERT_ALWAYS(iConsArray, Panic(KLmkPanicInvalidResourceData));
-
- iRows = ((iConsArray->Count() - 1) / iMaxColumns) + 1;
- iFirstVisibleRow = 0;
- iAnimated = EFalse;
- iCursorPos = TPoint(0, 0);
- iNumPages = (iRows / iExtension->iMaxVisibleRows) + (iRows
- % iExtension->iMaxVisibleRows ? 1 : 0);
- iCurrentPage = 1;
-
- // Create and set the scb visible even though there is nothing to scroll
- delete iSBFrame;
- iSBFrame = NULL;
-
- if (AknLayoutUtils::PenEnabled())
- {
- iSBFrame = new (ELeave) CEikScrollBarFrame(this, this, ETrue);
- }
- else
- {
- iSBFrame = new (ELeave) CEikScrollBarFrame(this, NULL, ETrue);
- }
- // Decide which type of scrollbar is shown
- CAknAppUi* appUi = iAvkonAppUi;
- if (AknLayoutUtils::DefaultScrollBarType(appUi)
- == CEikScrollBarFrame::EDoubleSpan)
- {
- // For EDoubleSpan type scrollbar
- if (AknLayoutUtils::PenEnabled())
- {
- iSBFrame->CreateDoubleSpanScrollBarsL(ETrue, EFalse, ETrue,
- EFalse); // window owning scrollbar
- }
- else
- {
- iSBFrame->CreateDoubleSpanScrollBarsL(EFalse, EFalse, ETrue,
- EFalse); // non-window owning scrollbar
- }
- iSBFrame->SetTypeOfVScrollBar(CEikScrollBarFrame::EDoubleSpan);
- }
- else
- {
- // For EArrowHead type scrollbar
- iSBFrame->SetTypeOfVScrollBar(CEikScrollBarFrame::EArrowHead);
- }
-
- iSBFrame->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff,
- CEikScrollBarFrame::EAuto);
- iSBFrame->VerticalScrollBar()->SetMopParent(iExtension);
- UpdateScrollIndicatorL();
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::SetIndex
-// set the reference of the selected icon index from the table
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::SetIndex(TInt& aIconIndex)
- {
- iIconIndex = &aIconIndex;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::MinimumSize
-//
-// -----------------------------------------------------------------------------
-//
-TSize CLmkIconMap::MinimumSize()
- {
- iIsMirrored = AknLayoutUtils::LayoutMirrored();
- CountMaxColumnsAndCellSizes();
-
- TRect rect;
- // Used the set rect, but resolution changes cannot be handled when it is used
-
- TAknLayoutRect dialogLayRect;
-
- // Main pane without softkeys
- TRect mainPaneRect;
- if (!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,
- mainPaneRect))
- {
- mainPaneRect = iAvkonAppUi->ClientRect();
- }
-
- // Dialog layout, check variety first
- TAknLayoutScalableParameterLimits iconMapDialogVariety =
- AknLayoutScalable_Avkon::popup_grid_graphic_window_ParamLimits();
-
- // Calc the variety
- TInt maxVariety = iconMapDialogVariety.LastVariety();
-
- // Check the CBA, if the orientation is not landscape
- // there is not so much varieties
- AknLayoutUtils::TAknCbaLocation location = AknLayoutUtils::CbaLocation();
- TInt maxVarietyOffset = 0; // the offset for the certain cba location variety
- TInt varietyOffset = maxVariety + 1; // the number of varieties
-
- // landscape variety number must be calculated offset == number of varieties
- // same applies to the variety number for the biggest sized layout for the variety
- if (Layout_Meta_Data::IsLandscapeOrientation())
- {
- varietyOffset = (maxVariety + 1) / KAknSctCBaButtonDirections; // the offset for one variety
- }
-
- // for right and left cba buttons the max variety is not zero
- // the varities are ordered by the location of the cba and the descending order
- // e.g the biggest sized layout first, the smallest last
- if (location == AknLayoutUtils::EAknCbaLocationRight)
- {
- maxVarietyOffset = varietyOffset;
- }
- else if (location == AknLayoutUtils::EAknCbaLocationLeft)
- {
- maxVarietyOffset = varietyOffset + varietyOffset; // 2*
- }
-
- TInt varietyNumber = varietyOffset - iRows - 1;
-
- // if more lines than possible to show, use the default
- // (the biggest grid) variety
- if (varietyNumber < 0)
- varietyNumber = 0;
- // if zero rows, use the minimum
- else if (iRows <= 0)
- varietyNumber -= 1;
-
- //add the varietyoffset
- varietyNumber += maxVarietyOffset;
-
- if (Layout_Meta_Data::IsLandscapeOrientation() && (location
- == AknLayoutUtils::EAknCbaLocationRight))
- {
- varietyNumber = 10;
- }
- else
- {
- if (iRows == 0)
- {
- varietyNumber = 5;
- }
- else
- {
- varietyNumber = 3;
- }
- }
- // Layout the dialog size
- dialogLayRect.LayoutRect(mainPaneRect,
- AknLayoutScalable_Avkon::popup_grid_graphic_window(varietyNumber));
-
- // Layout the grid
- TAknLayoutRect gridWithScrollLayRect;
- gridWithScrollLayRect.LayoutRect(dialogLayRect.Rect(),
- AknLayoutScalable_Avkon::listscroll_popup_graphic_pane());
-
- return TSize(dialogLayRect.Rect().Width(),
- gridWithScrollLayRect.Rect().Height());
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::ActivateL()
-// This method is needed to set correct initial value to scroll indicator.
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::ActivateL()
- {
- CCoeControl::ActivateL();
- if (iRows > Extension()->iMaxVisibleRows)
- {
- UpdateScrollIndicatorL();
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::OfferKeyEventL
-// Handles all the Keypad events
-// -----------------------------------------------------------------------------
-//
-TKeyResponse CLmkIconMap::OfferKeyEventL(const TKeyEvent& aKeyEvent,
- TEventCode /*aModifiers*/)
- {
- TUint code = aKeyEvent.iCode;
-
- switch (code)
- {
- case EKeyLeftArrow:
- case '4':
- MoveCursorL(-1, 0);
- break;
- case EKeyRightArrow:
- case '6':
- MoveCursorL(1, 0);
- break;
- case EKeyUpArrow:
- case '2':
- MoveCursorL(0, -1);
- break;
- case EKeyDownArrow:
- case '8':
- MoveCursorL(0, 1);
- break;
- case EKeyOK:
- case '5':
- case EKeySpace:
- case EKeyEnter:
- {
- if (iConsArray)
- {
- TInt ret = iMaxColumns * (iFirstVisibleRow + iCursorPos.iY)
- + iCursorPos.iX;
- if (ret <= iConsArray->Count())
- {
- *iIconIndex = ret;
- }
- else
- {
- *iIconIndex = -1;
- }
- }
-
- }
- break;
- default:
- return EKeyWasNotConsumed;
-
- }
- return EKeyWasConsumed;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::InputCapabilities()
-//
-// -----------------------------------------------------------------------------
-//
-TCoeInputCapabilities CLmkIconMap::InputCapabilities() const
- {
- return TCoeInputCapabilities(TCoeInputCapabilities::EAllText);
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::SizeChanged()
-// Control position of this control is registered for skin library when necessary
-// in CEikDialogPage::SetDataPosition, so we do not do that in this method.
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::SizeChanged()
- {
- // Get the layout
-
- // Main pane without softkeys
- TRect mainPaneRect;
-
- if (!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,
- mainPaneRect))
- {
- mainPaneRect = iAvkonAppUi->ClientRect();
- }
-
- // Dialog layout, check variety first
- TAknLayoutScalableParameterLimits iconMapDialogVariety =
- AknLayoutScalable_Avkon::popup_grid_graphic_window_ParamLimits();
-
- TInt maxVariety = iconMapDialogVariety.LastVariety();
-
- // Check the CBA, if the orientation is not landscape
- // there is not so much varieties
- AknLayoutUtils::TAknCbaLocation location = AknLayoutUtils::CbaLocation();
- TInt maxVarietyOffset = 0; // the offset for the certain cba location variety
- TInt varietyOffset = maxVariety + 1;
-
- // landscape variety number must be calculated offset == number of varieties
- // same applies to the variety number for the biggest sized layout for the variety
- if (Layout_Meta_Data::IsLandscapeOrientation())
- {
- varietyOffset = (maxVariety + 1) / KAknSctCBaButtonDirections; // the offset for one variety
- }
-
- // for right and left cba buttons the max variety is not zero
- // the varities are ordered by the location of the cba and the descending order
- // e.g the biggest sized layout first, the smallest last
- if (location == AknLayoutUtils::EAknCbaLocationRight)
- {
- maxVarietyOffset = varietyOffset;
- }
- else if (location == AknLayoutUtils::EAknCbaLocationLeft)
- {
- maxVarietyOffset = varietyOffset + varietyOffset; // 2*
- }
-
- TInt varietyNumber = varietyOffset - iRows - 1;
-
- // if more lines than possible to show, use the default
- // (the biggest grid) variety
- if (varietyNumber < 0)
- varietyNumber = 0;
- // if zero rows, use the minimum
- else if (iRows <= 0)
- varietyNumber -= 1;
-
- //add the varietyoffset
- varietyNumber += maxVarietyOffset;
-
- if (Layout_Meta_Data::IsLandscapeOrientation() && (location
- == AknLayoutUtils::EAknCbaLocationRight))
- {
- varietyNumber = 10;
- }
- else
- {
- if (iRows == 0)
- {
- varietyNumber = 5;
- }
- else
- {
- varietyNumber = 3;
- }
-
- }
-
- TAknLayoutRect popupGridLayRect;
- popupGridLayRect.LayoutRect(mainPaneRect,
- AknLayoutScalable_Avkon::popup_grid_graphic_window(varietyNumber));
-
- // Calculate the size relatively
- TRect relativeDialog(TPoint(0, 0), popupGridLayRect.Rect().Size());
-
- // Get the layout of the actual icon grid with scrollbar
- TAknLayoutRect gridWithScrollLayRect;
- gridWithScrollLayRect.LayoutRect(relativeDialog,
- AknLayoutScalable_Avkon::listscroll_popup_graphic_pane());
-
- // Then the grid area without scrollbar
- // NOTE: The grid with scroll bar is used as reference
- TAknLayoutRect gridLayRect;
- gridLayRect.LayoutRect(gridWithScrollLayRect.Rect(),
- AknLayoutScalable_Avkon::grid_graphic_popup_pane(0));
-
- // Different parent if SCT inside editing menu.
- TRect contentRect = gridLayRect.Rect();
-
- // The x coordinate is 3 pixels to right and y coordinate 3 pixels up
- // so substract from x coordinate and add to y coordinate
- if (iIsMirrored)
- {
- iOffset = TPoint(contentRect.iBr.iX - KHorizontalDialogMargin
- - iGridItemWidth + 1, contentRect.iTl.iY
- - KVerticalDialogMargin + 1);
- iGridTopLeft.iX = contentRect.iBr.iX - KHorizontalDialogMargin
- - (iMaxColumns * iGridItemWidth);
- iGridTopLeft.iY = contentRect.iTl.iY - KVerticalDialogMargin;
- }
- else // not mirrored
- {
- iOffset = TPoint(contentRect.iTl.iX - KHorizontalDialogMargin + 1,
- contentRect.iTl.iY - KVerticalDialogMargin + 1);
- iGridTopLeft.iX = contentRect.iTl.iX - KHorizontalDialogMargin;
- iGridTopLeft.iY = contentRect.iTl.iY - KVerticalDialogMargin;
- }
-
- // The last, update background context
- if (Extension()->iBgContext)
- {
- TInt bgVariety = 0;
- if (Layout_Meta_Data::IsLandscapeOrientation())
- bgVariety = 1;
-
- TAknLayoutRect innerRect;
- innerRect.LayoutRect(relativeDialog,
- AknLayoutScalable_Avkon::bg_popup_window_pane_g1(bgVariety));
-
- Extension()->iBgContext->SetFrameRects(relativeDialog,
- innerRect.Rect());
- }
- TRAPD(err, UpdateScrollIndicatorL());
- if (err)
- return;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::HandleResourceChange()
-//
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::HandleResourceChange(TInt aType)
- {
- if (aType == KEikDynamicLayoutVariantSwitch)
- {
- // save the old info for the magnitudes of the SCT grid
- TInt oldMaxColumns = iMaxColumns;
- //TInt oldMaxRows = 0;
- //oldMaxRows = iRows;
- // calculate the new magnitudes
- DoLayout();
-
- // then calculate the index position of the cursor in the icon table
- // and update the x and y positions for the new grid with it
-
- TInt oldCursorPosition = (iFirstVisibleRow + iOldCursorPos.iY)
- * oldMaxColumns + iOldCursorPos.iX;
-
- TInt currentCursorPosition = (iFirstVisibleRow + iCursorPos.iY)
- * oldMaxColumns + iCursorPos.iX;
-
- // the new first row is the top row on the page where the new focus is
- iFirstVisibleRow = Extension()->iMaxVisibleRows
- * (currentCursorPosition / (iMaxColumns
- * Extension()->iMaxVisibleRows));
-
- // the cursor positions are relative to current page
- iCursorPos.iY = (currentCursorPosition - (iMaxColumns
- * iFirstVisibleRow)) / iMaxColumns;
- iCursorPos.iX = currentCursorPosition - (iMaxColumns
- * iFirstVisibleRow) - (iMaxColumns * iCursorPos.iY);
-
- iOldCursorPos.iY = (oldCursorPosition - (iMaxColumns
- * iFirstVisibleRow)) / iMaxColumns;
- iOldCursorPos.iX = oldCursorPosition - (iMaxColumns
- * iFirstVisibleRow) - (iMaxColumns * iOldCursorPos.iY);
- }
-
- if (aType == KAknsMessageSkinChange)
- {
- iOffscreenBgDrawn = EFalse;
- }
- CCoeControl::HandleResourceChange(aType);
-
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::Draw()
-//
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::Draw(const TRect& /*aRect*/) const
- {
-
- TInt cursorPos = 0;
- CWindowGc& gc = SystemGc();
-
- MAknsSkinInstance* skin = AknsUtils::SkinInstance();
- MAknsControlContext* cc = AknsDrawUtils::ControlContext(this);
-
- TRect rect = Rect();
-
- // Main pane without softkeys
- TRect mainPaneRect;
- if (!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,
- mainPaneRect))
- {
- mainPaneRect = iAvkonAppUi->ClientRect();
- }
-
- // Dialog layout, check variety first
- TAknLayoutScalableParameterLimits iconMapDialogVariety =
- AknLayoutScalable_Avkon::popup_grid_graphic_window_ParamLimits();
-
- // The variety starts from 0 so add +1
- TInt maxVariety = iconMapDialogVariety.LastVariety();
-
- // Check the CBA, if the orientation is not landscape
- // there is not so much varieties
- AknLayoutUtils::TAknCbaLocation location = AknLayoutUtils::CbaLocation();
- TInt maxVarietyOffset = 0; // the offset for the certain cba location variety
- TInt varietyOffset = maxVariety + 1;
-
- // landscape variety number must be calculated offset == number of varieties
- // same applies to the variety number for the biggest sized layout for the variety
- if (Layout_Meta_Data::IsLandscapeOrientation())
- {
- varietyOffset = (maxVariety + 1) / KAknSctCBaButtonDirections; // the offset for one variety
- }
-
- // for right and left cba buttons the max variety is not zero
- // the varities are ordered by the location of the cba and the descending order
- // e.g the biggest sized layout first, the smallest last
- if (location == AknLayoutUtils::EAknCbaLocationRight)
- {
- maxVarietyOffset = varietyOffset;
- }
- else if (location == AknLayoutUtils::EAknCbaLocationLeft)
- {
- maxVarietyOffset = varietyOffset + varietyOffset; // 2*
- }
-
- TInt varietyNumber = varietyOffset - iRows - 1;
-
- // if more lines than possible to show, use the default
- // (the biggest grid) variety
- if (varietyNumber < 0)
- varietyNumber = 0;
- // if zero rows, use the minimum
- else if (iRows <= 0)
- varietyNumber -= 1;
-
- //add the varietyoffset
- varietyNumber += maxVarietyOffset;
-
- if (Layout_Meta_Data::IsLandscapeOrientation() && (location
- == AknLayoutUtils::EAknCbaLocationRight))
- {
- varietyNumber = 10;
- }
- else
- {
- varietyNumber = 3;
- }
- // Layout the dialog size
- TAknLayoutRect dialogLayRect;
- dialogLayRect.LayoutRect(mainPaneRect,
- AknLayoutScalable_Avkon::popup_grid_graphic_window(varietyNumber));
-
- // Get the missing height for the background
- TInt backgroundHeightOffset = dialogLayRect.Rect().Height() - rect.iBr.iY;
-
- rect.iBr.iY += backgroundHeightOffset;
-
- // Check if we got an offscreen bitmap allocated for skin background and
- // there is bitmap background in the current skin.
- if (iOffscreenBg && iHasBitmapBackground)
- {
- DrawOffscreenBackgroundIfRequired();
- gc.BitBlt(rect.iTl, iOffscreenBg);
- }
- else
- {
- AknsDrawUtils::Background(skin, cc, this, gc, rect);
- }
-
- TInt numberOfIconsToBeDrawn = iConsArray->Count();
- numberOfIconsToBeDrawn -= (iFirstVisibleRow * iMaxColumns);
- if (numberOfIconsToBeDrawn > 0)
- {
- if (numberOfIconsToBeDrawn > (Extension()->iMaxVisibleRows
- * iMaxColumns))
- {
- numberOfIconsToBeDrawn = Extension()->iMaxVisibleRows
- * iMaxColumns;
- }
- __ASSERT_DEBUG( numberOfIconsToBeDrawn >= 1, Panic( KLmkPanicOutOfRange ) );
-
- gc.SetPenStyle(CGraphicsContext::ESolidPen);
- gc.SetBrushStyle(CGraphicsContext::ENullBrush);
- gc.SetPenSize(TSize(1, 1));
-
- // 2) Draw the grid
- const TSize gridItemRectSize(iGridItemWidth + 1, iGridItemHeight + 1);
-
- TInt numberOfGridCellsToBeDrawn = numberOfIconsToBeDrawn;
-
- TRgb colorLine = AKN_LAF_COLOR(219);
- AknsUtils::GetCachedColor(skin, colorLine, KAknsIIDQsnLineColors,
- EAknsCIQsnLineColorsCG5);
- TRgb colorRecentLine = AKN_LAF_COLOR(215);
- AknsUtils::GetCachedColor(skin, colorRecentLine,
- KAknsIIDQsnLineColors, EAknsCIQsnLineColorsCG7);
-
- // default pen color
- gc.SetPenColor(colorLine);
-
- TInt fullRows = numberOfGridCellsToBeDrawn / iMaxColumns;
-
- // how many left after the full rows
- numberOfGridCellsToBeDrawn -= fullRows * iMaxColumns;
-
- TPoint pos = iGridTopLeft;
-
- TInt endX = pos.iX + iGridItemWidth * iMaxColumns + 1;
- TInt endY = pos.iY + iGridItemHeight * fullRows;
-
- TInt ii = 0;
-
- if (fullRows)
- {
- // Draw full vertical lines
- for (ii = 0; ii <= iMaxColumns; ii++)
- {
- gc.SetPenColor(colorLine);
- gc.SetPenSize(TSize(1, 1));
- gc.DrawLine(pos, TPoint(pos.iX, endY));
- pos.iX += iGridItemWidth;
- }
-
- pos = iGridTopLeft;
-
- // Draw full horizontal lines
- for (ii = 0; ii <= fullRows; ii++)
- {
- gc.SetPenSize(TSize(1, 1));
- gc.SetPenColor(colorLine);
- gc.DrawLine(pos, TPoint(endX, pos.iY));
- pos.iY += iGridItemHeight;
- }
- gc.SetPenColor(colorLine);
- gc.SetPenSize(TSize(1, 1));
- }
-
- if (numberOfGridCellsToBeDrawn)
- {
- // Remaining cells in the last, non-full row
- pos = iOffset;
- pos.iX--; // iOffset is cell area topLeft, grid is not included in it
- pos.iY--;
-
- pos.iY += iGridItemHeight * fullRows;
-
- for (ii = 0; ii < numberOfGridCellsToBeDrawn; ii++)
- {
- gc.DrawRect(TRect(pos, gridItemRectSize));
-
- if (iIsMirrored)
- pos.iX -= iGridItemWidth;
- else
- // not mirrored
- pos.iX += iGridItemWidth;
- }
- }
-
- TInt iconIndex = (iCurrentPage - 1) * (iMaxColumns
- * Extension()->iMaxVisibleRows);
- TInt lCnt = iConsArray->Count();
- cursorPos = iCursorPos.iX + iCursorPos.iY * iMaxColumns;
- if (lCnt > 0)
- {
- TRect cellRect(TPoint(0, 0), TSize(iGridItemWidth - 1,
- iGridItemHeight - 1));
- for (TInt j = iconIndex, i = 0; j < lCnt && (i
- < numberOfIconsToBeDrawn); j++, i++)
- {
- DrawItem(gc, CursorRect(i), j, (cursorPos == i), EFalse);
- }
- }
-
- }
- iDrawnBefore = ETrue;
- gc.DiscardFont();
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::DrawItem()
-//
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::DrawItem(CWindowGc& aGc, const TRect& aSctPosition,
- TInt aIconIndex, TBool aHighlighted, TBool aDrawBackground) const
- {
- MAknsSkinInstance* skin = AknsUtils::SkinInstance();
- MAknsControlContext* cc = AknsDrawUtils::ControlContext(this);
-
- TBool skins = AknsDrawUtils::Background(skin, cc, aGc, aSctPosition);
- TRgb color;
- if (!skins)
- aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
- if (aHighlighted)
- {
- TRgb colorHightLightRect = AKN_LAF_COLOR(215);
- AknsUtils::GetCachedColor(skin, colorHightLightRect,
- KAknsIIDQsnLineColors, EAknsCIQsnLineColorsCG7);
- aGc.SetPenColor(colorHightLightRect);
- aGc.DrawRect(aSctPosition);
-
- // Shrink by one pixel in all directions.
- TRect innerRect = aSctPosition;
- innerRect.Shrink(1, 1);
-
- color = AKN_LAF_COLOR(210);
- AknsUtils::GetCachedColor(skin, color, KAknsIIDQsnHighlightColors,
- EAknsCIQsnHighlightColorsCG1);
- aGc.SetBrushColor(color);
- aGc.Clear(innerRect);
- }
- else if (aDrawBackground)
- {
- TRect innerRect = aSctPosition;
- aGc.SetBrushColor(AKN_LAF_COLOR(0));
- if (!skins)
- aGc.Clear(innerRect);
- else
- AknsDrawUtils::Background(skin, cc, this, aGc, innerRect);
- }
-
- if (iConsArray)
- {
- TInt lCnt = iConsArray->Count();
- if (lCnt > 0 && aIconIndex < lCnt && aIconIndex >= 0)
- {
- TRect cellRect(TPoint(0, 0), TSize(iGridItemWidth - 1,
- iGridItemHeight - 1));
-
- CGulIcon* bitmap = NULL;
- bitmap = iConsArray->At(aIconIndex);
- TInt numIconsInaPage = Extension()->iMaxVisibleRows * iMaxColumns;
- TInt cellIndex = aIconIndex;
- if (aIconIndex >= numIconsInaPage)
- {
- cellIndex = aIconIndex % numIconsInaPage;
- }
- aGc.BitBltMasked(CursorPoint(cellIndex), bitmap->Bitmap(),
- cellRect, bitmap->Mask(), EFalse);
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::DrawCursor()
-// Optimizes drawing. Only cursor is drawn.
-// -----------------------------------------------------------------------------
-void CLmkIconMap::DrawCursor() const
- {
- // Whole Icon Map has to be drawn at least once.
- // If the user presses arrow key before Icon Map has been drawn,
- // only cursor position is drawn without this check.
- if (!iDrawnBefore)
- {
- DrawNow();
- }
- // Only redraw old and new cursor position cells
- ActivateGc();
- CWindowGc& gc = SystemGc();
-
- TInt cursorPos = iOldCursorPos.iX + iOldCursorPos.iY * iMaxColumns;
- if (cursorPos >= 0)
- {
- DrawCell(cursorPos, EFalse);
-
- cursorPos = iCursorPos.iX + iCursorPos.iY * iMaxColumns;
- DrawCell(cursorPos, ETrue);
- }
-
- gc.DiscardFont();
- DeactivateGc();
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::DrawCell
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::DrawCell(TInt aCursorPos, TBool aHighLighted) const
- {
- // calculate icon index
- TInt iconIndex = aCursorPos + iFirstVisibleRow * iMaxColumns;
-
- // If we are only redrawing for animations, no need to draw non-animated items.
- TRect rect = CursorRect(aCursorPos);
-
- Window().Invalidate(rect);
- Window().BeginRedraw(rect);
- DrawItem(SystemGc(), rect, iconIndex, aHighLighted, ETrue);
- Window().EndRedraw();
- SystemGc().DiscardFont();
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::CursorRect
-// -----------------------------------------------------------------------------
-//
-TRect CLmkIconMap::CursorRect(TInt aCursorPos) const
- {
- TPoint pos = iOffset;
-
- if (iIsMirrored)
- {
- pos.iX -= (aCursorPos % iMaxColumns) * iGridItemWidth;
- }
- else // Not mirrored
- {
- pos.iX += (aCursorPos % iMaxColumns) * iGridItemWidth;
- }
-
- pos.iY += (aCursorPos / iMaxColumns) * iGridItemHeight;
- return TRect(pos, TSize(iGridItemWidth - 1, iGridItemHeight - 1));
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::CursorPoint
-// -----------------------------------------------------------------------------
-//
-TPoint CLmkIconMap::CursorPoint(TInt aCursorPos) const
- {
- TPoint pos = iOffset;
-
- if (iIsMirrored)
- {
- pos.iX -= (aCursorPos % iMaxColumns) * iGridItemWidth;
- }
- else // Not mirrored
- {
- pos.iX += (aCursorPos % iMaxColumns) * iGridItemWidth;
- }
-
- pos.iY += (aCursorPos / iMaxColumns) * iGridItemHeight;
- return pos;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::MoveCursorL
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::MoveCursorL(TInt aDeltaX, TInt aDeltaY)
- {
- __ASSERT_DEBUG((aDeltaX <= 1) && (aDeltaX >= -1) && (aDeltaY <= 1)
- && (aDeltaY >= -1) && ((aDeltaX * aDeltaY) == 0), Panic(
- KLmkPanicOutOfRange));
-
- if (iIsMirrored)
- aDeltaX = -aDeltaX;
-
- if ((iConsArray->Count() < 8))
- return;
-
- iOldCursorPos = iCursorPos;
- TInt oldFirstVisibleRow = iFirstVisibleRow;
-
- TInt globalYPos = iCursorPos.iY + iFirstVisibleRow;
- TInt lastColumnOnLastRow = ((iConsArray->Count() - 1) % iMaxColumns);
-
- TInt skipicon = aDeltaX != 0 ? 1 : 0;
-
- if (aDeltaX < 0)
- {
- // Cursor was moved to left.
- if (iCursorPos.iX > skipicon - 1)
- {
- iCursorPos.iX -= skipicon;
- }
- else
- {
- if (skipicon > iMaxColumns)
- {
- globalYPos--;
- iCursorPos.iX = iMaxColumns;
- }
- // Go to previous line
- globalYPos--;
- if (globalYPos < 0)
- {
- // Cursor was on the first line - go to last line.
- globalYPos = iRows - 1;
- // x - position to the last item on the last row.
- iCursorPos.iX = lastColumnOnLastRow;
- }
- else
- {
- // x - position to last column.
- iCursorPos.iX = iMaxColumns - skipicon;
- }
- }
- }
-
- if (aDeltaX > 0)
- {
- // Cursor was moved to right.
- if (globalYPos < iRows - 1)
- {
- // Not in the last row.
- if (iCursorPos.iX < iMaxColumns - skipicon)
- {
- // If not on the last columns, move cursor to next column.
- iCursorPos.iX += skipicon;
- }
- else
- {
- // Cursor was on last column,
- // move to first column of the next line.
- iCursorPos.iX = 0;
- globalYPos++;
- }
- }
- else
- {
- // Currently on the last row.
- if (iCursorPos.iX < lastColumnOnLastRow)
- {
- // If there are more items on this row, move cursor to next item.
- iCursorPos.iX++;
- }
- else
- {
- // No more item on the current row.
- // Move to first item on the first row.
- iCursorPos.iX = 0;
- globalYPos = 0;
- }
- }
- }
-
- if (aDeltaY < 0)
- {
- iCursorPos.iX -= skipicon;
- if (iCursorPos.iX < 0)
- {
- iCursorPos.iX += (iMaxColumns - 1);
- globalYPos--;
- }
- // Cursor was moved to up.
- if (globalYPos > 0)
- {
- // Cursor was not on the first line - move it to previous row.
- globalYPos--;
- }
- else
- {
- // Move cursot to last to row.
- globalYPos = iRows - 1;
- if (iCursorPos.iX > lastColumnOnLastRow)
- {
- // No items in the current column on the last row -
- // move cursor to last item on the row.
- iCursorPos.iX = lastColumnOnLastRow;
- }
- }
- }
-
- if (aDeltaY > 0)
- {
- iCursorPos.iX = (iCursorPos.iX + skipicon) % iMaxColumns;
- globalYPos += (iCursorPos.iX + skipicon) / iMaxColumns;
- // Cursor was moved to down.
- if (globalYPos < iRows - 1)
- {
- // Cursor is not on the last row. Move cursor to next row.
- globalYPos++;
- if (globalYPos == iRows - 1 && iCursorPos.iX
- > lastColumnOnLastRow)
- {
- // No items in the current column on the last row -
- // move cursor to last item on the row.
- iCursorPos.iX = lastColumnOnLastRow;
- }
- }
- else
- {
- // Cursor was at the last row - move it to the first row.
- globalYPos = 0;
- }
- }
- iCursorPos.iY = globalYPos - iFirstVisibleRow;
-
- if (globalYPos < iFirstVisibleRow)
- {
- // Cursor was moved from the top row.
- if (globalYPos <= 0)
- {
- iFirstVisibleRow = 0;
- iCursorPos = TPoint(iCursorPos.iX, 0);
- }
- else
- {
- // If cursor was moved up out of the visible area - show it again.
- iFirstVisibleRow -= Extension()->iMaxVisibleRows;
- iCursorPos = TPoint(iCursorPos.iX, Extension()->iMaxVisibleRows
- - 1);
- }
- }
-
- if (globalYPos > iFirstVisibleRow + Extension()->iMaxVisibleRows - 1)
- {
- if (globalYPos == iRows - 1)
- {
- // When cursor has moved from the top line,
- // it is adjusted to a page boundary.
- iCursorPos = TPoint(iCursorPos.iX, (iRows - 1)
- % Extension()->iMaxVisibleRows);
- iFirstVisibleRow = ((iRows - 1) / Extension()->iMaxVisibleRows)
- * Extension()->iMaxVisibleRows;
- }
- else
- {
- // If cursor was moved down out of the visible area - show it again.
- iFirstVisibleRow += Extension()->iMaxVisibleRows;
- iCursorPos = TPoint(iCursorPos.iX, 0);
- }
- }
-
- //TInt increment(1);
- //if (aDeltaY < 0 || aDeltaX < 0)
- // {
- //// increment = -1;
- // }
- if ((iRows > Extension()->iMaxVisibleRows) && (iOldCursorPos.iY
- + oldFirstVisibleRow != iCursorPos.iY + iFirstVisibleRow))
- {
- UpdateScrollIndicatorL();
- }
-
- if (oldFirstVisibleRow == iFirstVisibleRow)
- {
- // Draw only cursor if the view to the content was not scrolled.
- DrawCursor();
- }
- else
- {
- DrawNow();
- }
-
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::UpdateScrollIndicatorL()
-//
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::UpdateScrollIndicatorL()
- {
- if (!iSBFrame)
- {
- return;
- }
- TEikScrollBarModel hSbarModel;
- TEikScrollBarModel vSbarModel;
-
- TEikScrollBarFrameLayout layout;
-
- // Main pane without softkeys
- TRect mainPaneRect;
- if (!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,
- mainPaneRect))
- {
- mainPaneRect = iAvkonAppUi->ClientRect();
- }
-
- // Dialog layout, check variety first
- TAknLayoutScalableParameterLimits iconMapDialogVariety =
- AknLayoutScalable_Avkon::popup_grid_graphic_window_ParamLimits();
-
- TInt maxVariety = iconMapDialogVariety.LastVariety();
-
- // Check the CBA, if the orientation is not landscape
- // there is not so much varieties
- AknLayoutUtils::TAknCbaLocation location = AknLayoutUtils::CbaLocation();
- TInt maxVarietyOffset = 0; // the offset for the certain cba location variety
- TInt varietyOffset = maxVariety + 1;
-
- // landscape variety number must be calculated offset == number of varieties
- // same applies to the variety number for the biggest sized layout for the variety
- if (Layout_Meta_Data::IsLandscapeOrientation())
- {
- varietyOffset = (maxVariety + 1) / KAknSctCBaButtonDirections; // the offset for one variety
- }
-
- // for right and left cba buttons the max variety is not zero
- // the varities are ordered by the location of the cba and the descending order
- // e.g the biggest sized layout first, the smallest last
- if (location == AknLayoutUtils::EAknCbaLocationRight)
- {
- maxVarietyOffset = varietyOffset;
- }
- else if (location == AknLayoutUtils::EAknCbaLocationLeft)
- {
- maxVarietyOffset = varietyOffset + varietyOffset; // 2*
- }
-
- TInt varietyNumber = varietyOffset - iRows - 1;
-
- // if more lines than possible to show, use the default
- // (the biggest grid) variety
- if (varietyNumber < 0)
- varietyNumber = 0;
- // if zero rows, use the minimum
- else if (iRows <= 0)
- varietyNumber -= 1;
-
- //add the varietyoffset
- varietyNumber += maxVarietyOffset;
-
- if (Layout_Meta_Data::IsLandscapeOrientation() && (location
- == AknLayoutUtils::EAknCbaLocationRight))
- {
- varietyNumber = 10;
- }
- else
- {
- varietyNumber = 3;
- }
- // Layout the dialog size
- TAknLayoutRect dialogLayRect;
- dialogLayRect.LayoutRect(mainPaneRect,
- AknLayoutScalable_Avkon::popup_grid_graphic_window(varietyNumber));
-
- TRect dialogRect = dialogLayRect.Rect();
-
- // Get the layout of the actual icon grid with scrollbar
- TAknLayoutRect gridWithScrollLayRect;
-
- gridWithScrollLayRect.LayoutRect(TRect(TPoint(0, 0), TSize(
- dialogRect.Size())),
- AknLayoutScalable_Avkon::listscroll_popup_graphic_pane());
-
- // Calculate the relative rect for the grid
- TRect parent = gridWithScrollLayRect.Rect();
-
- TAknWindowComponentLayout scrollbarLayout =
- AknLayoutScalable_Avkon::scroll_pane_cp5();
-
- iCurrentPage = (iFirstVisibleRow / Extension()->iMaxVisibleRows) + 1;
-
- vSbarModel.iScrollSpan = iNumPages * Extension()->iMaxVisibleRows;
- vSbarModel.iThumbSpan = Extension()->iMaxVisibleRows;
-
- if (iSBFrame && iSBFrame->TypeOfVScrollBar()
- == CEikScrollBarFrame::EDoubleSpan)
- {
- // For EDoubleSpan type scrollbar
- vSbarModel.iThumbPosition = (iCurrentPage - 1)
- * Extension()->iMaxVisibleRows;
- TAknDoubleSpanScrollBarModel hDsSbarModel(hSbarModel);
- TAknDoubleSpanScrollBarModel vDsSbarModel(vSbarModel);
-
- // The y coordinate must be sifted 3 pixels up and x 3 to left
- parent.iTl.iY -= KVerticalDialogMargin;
- parent.iBr.iY -= KVerticalDialogMargin;
- parent.iTl.iX -= KHorizontalDialogMargin;
- parent.iBr.iX -= KHorizontalDialogMargin;
-
- layout.iTilingMode = TEikScrollBarFrameLayout::EInclusiveRectConstant;
- iSBFrame->Tile(&vDsSbarModel);
- AknLayoutUtils::LayoutVerticalScrollBar(iSBFrame, parent,
- scrollbarLayout);
- iSBFrame->SetVFocusPosToThumbPos(vDsSbarModel.FocusPosition());
- }
- else
- {
- // For EArrowHead type scrollbar
- vSbarModel.iThumbPosition = iCursorPos.iY + iFirstVisibleRow;
- iSBFrame->TileL(&hSbarModel, &vSbarModel, parent, parent, layout);
- iSBFrame->SetVFocusPosToThumbPos(vSbarModel.iThumbPosition);
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::Reserved_1()
-//
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::Reserved_1()
- {
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::Reserved_2()
-//
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::Reserved_2()
- {
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::DrawOffscreenBackgroundIfRequired
-//
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::DrawOffscreenBackgroundIfRequired() const
- {
- if (iOffscreenBg && iHasBitmapBackground)
- {
- if (!iOffscreenBgDrawn)
- {
- TRect mainPaneRect;
- if (!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,
- mainPaneRect))
- {
- mainPaneRect = iAvkonAppUi->ClientRect();
- }
-
- // Dialog layout, check variety first
- TAknLayoutScalableParameterLimits
- iconMapDialogVariety =
- AknLayoutScalable_Avkon::popup_grid_graphic_window_ParamLimits();
-
- TInt maxVariety = iconMapDialogVariety.LastVariety();
-
- // Check the CBA, if the orientation is not landscape
- // there is not so much varieties
- AknLayoutUtils::TAknCbaLocation location =
- AknLayoutUtils::CbaLocation();
- TInt maxVarietyOffset = 0; // the offset for the certain cba location variety
- TInt varietyOffset = maxVariety + 1;
-
- // landscape variety number must be calculated offset == number of varieties
- // same applies to the variety number for the biggest sized layout for the variety
- if (Layout_Meta_Data::IsLandscapeOrientation())
- {
- varietyOffset = (maxVariety + 1) / KAknSctCBaButtonDirections; // the offset for one variety
- }
-
- // for right and left cba buttons the max variety is not zero
- // the varities are ordered by the location of the cba and the descending order
- // e.g the biggest sized layout first, the smallest last
- if (location == AknLayoutUtils::EAknCbaLocationRight)
- {
- maxVarietyOffset = varietyOffset;
- }
- else if (location == AknLayoutUtils::EAknCbaLocationLeft)
- {
- maxVarietyOffset = varietyOffset + varietyOffset; // 2*
- }
- TInt varietyNumber = varietyOffset - iRows - 1;
-
- // if more lines than possible to show, use the default
- // (the biggest grid) variety
- if (varietyNumber < 0)
- varietyNumber = 0;
- // if zero rows, use the minimum
- else if (iRows <= 0)
- varietyNumber -= 1;
-
- //add the varietyoffset
- varietyNumber += maxVarietyOffset;
-
- TAknLayoutRect popupGridLayRect;
- popupGridLayRect.LayoutRect(mainPaneRect,
- AknLayoutScalable_Avkon::popup_grid_graphic_window(5));
-
- TRect popupGridRect = popupGridLayRect.Rect();
-
- // set the top left height as the control starting point
- popupGridRect.iTl.iY = Rect().iTl.iY;
-
- //if(popupGridRect.iBr.iY < mainPaneRect.iBr.iY)
- // popupGridRect.iBr.iY = mainPaneRect.iBr.iY
- MAknsSkinInstance* skin = AknsUtils::SkinInstance();
- MAknsControlContext* cc = AknsDrawUtils::ControlContext(this);
-
- // draw to upper left corner, and normalize the retangle to
- // fact that the dialog starts from coordinates (0,0),
- // so the y-coordinate is correct (heading pane)
- // but x must be set to zero
- TPoint point = TPoint(0, 0);
- popupGridRect.Move(-popupGridRect.iTl.iX, 0);
-
- AknsDrawUtils::DrawBackground(skin, cc, this, *iBitmapGc, point,
- popupGridRect, KAknsDrawParamDefault);
-
- iOffscreenBgDrawn = ETrue;
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::ComponentControl(TInt aIndex) const
-// Return the controll pointer
-// -----------------------------------------------------------------------------
-//
-CCoeControl* CLmkIconMap::ComponentControl(TInt aIndex) const
- {
- if (aIndex == 0 && iSBFrame && iSBFrame->TypeOfVScrollBar()
- == CEikScrollBarFrame::EDoubleSpan)
- {
- return iSBFrame->VerticalScrollBar();
- }
- else
- {
- return NULL;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::CountComponentControls()
-// Return no of controll to be placed on the container control
-// -----------------------------------------------------------------------------
-//
-TInt CLmkIconMap::CountComponentControls() const
- {
- if (iSBFrame && iSBFrame->TypeOfVScrollBar()
- == CEikScrollBarFrame::EDoubleSpan)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::CountMaxColumnsAndCellSizes
-// Counts no of columns and the cell size will be displayed in the icon table
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::CountMaxColumnsAndCellSizes()
- {
-
- TRect cellRect; // retangle of one item in grid
- TRect gridRect; // retangle of the grid contaning the items
-
- // 1. Get the layout
-
- // Get the parent rect
- TRect mainPaneRect;
- if (!AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,
- mainPaneRect))
- {
- mainPaneRect = iAvkonAppUi->ClientRect();
- }
-
- // Calculate the layout of the whole popup with the biggest possible -> 0
- // Dialog layout, check variety first
-
- // Get the layout rect of the dialog
-
- // Check variety first
- TAknLayoutScalableParameterLimits iconMapDialogVariety =
- AknLayoutScalable_Avkon::popup_grid_graphic_window_ParamLimits();
-
- TInt maxVariety = iconMapDialogVariety.LastVariety();
-
- // Check the CBA, if the orientation is not landscape
- // there is not so much varieties
- AknLayoutUtils::TAknCbaLocation location = AknLayoutUtils::CbaLocation();
- TInt maxVarietyOffset = 0; // the offset for the certain cba location variety
- TInt varietyOffset = maxVariety + 1; // the number of varieties
-
- // landscape variety number must be calculated offset == number of varieties
- // same applies to the variety number for the biggest sized layout for the variety
- if (Layout_Meta_Data::IsLandscapeOrientation())
- {
- varietyOffset = (maxVariety + 1) / KAknSctCBaButtonDirections; // the offset for one variety
- }
-
- if (location == AknLayoutUtils::EAknCbaLocationRight)
- {
- maxVarietyOffset = varietyOffset;
- }
- else if (location == AknLayoutUtils::EAknCbaLocationLeft)
- {
- maxVarietyOffset = varietyOffset + varietyOffset; // 2*
- }
-
- TAknLayoutRect popupGridLayRect;
- popupGridLayRect.LayoutRect(mainPaneRect,
- AknLayoutScalable_Avkon::popup_grid_graphic_window(
- maxVarietyOffset));
-
- // Get the layout of the actual icon grid with scrollbar
- TAknLayoutRect gridWithScrollLayRect;
- gridWithScrollLayRect.LayoutRect(popupGridLayRect.Rect(),
- AknLayoutScalable_Avkon::listscroll_popup_graphic_pane());
-
- // Then the grid area without scrollbar
- // NOTE: The grid with scroll bar is used as reference
- TAknLayoutRect gridLayRect;
- gridLayRect.LayoutRect(gridWithScrollLayRect.Rect(),
- AknLayoutScalable_Avkon::grid_graphic_popup_pane(0));
-
- // Different parent if SCT inside editing menu.
- TRect rect = Rect();
- gridRect = gridLayRect.Rect();
- // cell size, AGAIN 7 item
- TAknLayoutRect cellLayRect;
- cellLayRect.LayoutRect(gridRect,
- AknLayoutScalable_Avkon::cell_graphic_popup_pane(0, 0, 0));
-
- cellRect = cellLayRect.Rect();
-
- // 2. Calculate width related
- // - item width
- // - max number of columns
-
- // Width of the items area
- TInt gridWidth = gridRect.Width();
-
- // Width of one item
- TInt cellWidth = cellRect.Width();
-
- // ensure the item width and store it
- TAknLayoutRect secondCellLayRect;
- secondCellLayRect.LayoutRect(gridRect,
- AknLayoutScalable_Avkon::cell_graphic_popup_pane(0, 1, 0));
-
- iGridItemWidth = secondCellLayRect.Rect().iTl.iX
- - cellLayRect.Rect().iTl.iX;
-
- if (iGridItemWidth < 0)
- {
- // The result is negative with lay file data if the layout is mirrored.
- iGridItemWidth = -iGridItemWidth;
- }
-
- // Calculate the amount of columns
- iMaxColumns = gridWidth / cellWidth;
-
- // 2. Calculate height related
- // - item height
- // - max number of rows
-
- // Get the grid height
- // NOTE: in landscape the LAF is wrong so use the main panes height
- TInt gridHeight = gridRect.Height();
-
- // get the item height
- TInt cellHeight = cellRect.Height();
-
- // calculate the number of items fitting to grid
- Extension()->iMaxVisibleRows = 3;//gridHeight / cellHeight;
-
-
- // Store the item height
- TAknLayoutRect secondRowLayRect;
- secondRowLayRect.LayoutRect(gridLayRect.Rect(),
- AknLayoutScalable_Avkon::cell_graphic_popup_pane(0, 0, 1));
-
- iGridItemHeight = secondRowLayRect.Rect().iTl.iY
- - cellLayRect.Rect().iTl.iY;
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::HandleScrollEventL
-// Handles the different scroll events so that the map reacts accordingly.
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::HandleScrollEventL(CEikScrollBar* aScrollBar,
- TEikScrollEvent aEventType)
- {
- TBool update = EFalse;
-
- switch (aEventType)
- {
- case EEikScrollUp:
- case EEikScrollPageUp:
- {
- // nothing done if we are already on the first page.
- if (iFirstVisibleRow != 0)
- {
- iFirstVisibleRow -= Extension()->iMaxVisibleRows;
- update = ETrue;
- }
- UpdateScrollIndicatorL();
- }
- break;
- case EEikScrollDown:
- case EEikScrollPageDown:
- {
- // nothing done if we are already on the last page.
- if (iFirstVisibleRow != (iRows / Extension()->iMaxVisibleRows)
- * Extension()->iMaxVisibleRows)
- {
- iFirstVisibleRow += Extension()->iMaxVisibleRows;
- update = ETrue;
- }
- UpdateScrollIndicatorL();
- }
- break;
- case EEikScrollThumbDragVert:
- {
- TInt thumbPosition;
- TInt halfPage = Extension()->iMaxVisibleRows / 2;
- // Ask which type of scrollbar is shown
- //CAknAppUi* appUi = iAvkonAppUi;
- TBool isDoubleSpan = CEikScrollBarFrame::EDoubleSpan
- == iSBFrame->TypeOfVScrollBar();
- if (isDoubleSpan)
- {
- thumbPosition
- = static_cast<const TAknDoubleSpanScrollBarModel*> (aScrollBar->Model())->FocusPosition();
- }
- else
- {
- thumbPosition = aScrollBar->Model()->iThumbPosition;
- }
-
- // If the slider is in the range of less then a half page from a possible correct thumb position.
- // thus 0 <= iFirstVisibleRow - thumbPosition < halfPage. Or in the other direction:
- // 0 <= thumbPosition - iFirstVisibleRow < halfPage
- if (!((0 <= iFirstVisibleRow - thumbPosition && iFirstVisibleRow
- - thumbPosition < halfPage) || (0 <= thumbPosition
- - iFirstVisibleRow && thumbPosition - iFirstVisibleRow
- < halfPage)))
- {
- TReal toRound = thumbPosition
- / (TReal) Extension()->iMaxVisibleRows;
- if (toRound * 2 > (TInt) toRound * 2 + 1)
- {
- toRound++;
- }
- iFirstVisibleRow = (TInt) toRound
- * Extension()->iMaxVisibleRows;
- iCurrentPage = (iFirstVisibleRow
- / Extension()->iMaxVisibleRows) + 1;
- update = ETrue;
- }
- }
- break;
- case EEikScrollThumbReleaseVert:
- {
- UpdateScrollIndicatorL();
- }
- break;
- case EEikScrollLeft: // flow through
- case EEikScrollRight: // flow through
- case EEikScrollPageLeft: // flow through
- case EEikScrollPageRight: // flow through
- case EEikScrollThumbDragHoriz: // flow through
- case EEikScrollThumbReleaseHoriz: // flow through
- // do nothing
- break;
- default:
- // do nothing
- break;
- }
-
- // If we have moved down to the last page we check that the cursor is in a place where it can be
- // drawn.
- if (iFirstVisibleRow == (iRows / Extension()->iMaxVisibleRows)
- * Extension()->iMaxVisibleRows)
- {
- // the old cursor is set to a "safe" position where it at least can be.
- iOldCursorPos.iX = 0;
- iOldCursorPos.iY = 0;
- // if the last page has only one line which isn't filled complitely.
- if (iConsArray->Count() % iMaxColumns - 1 < iCursorPos.iX && iRows
- % Extension()->iMaxVisibleRows == 1)
- {
- TInt xVal = iConsArray->Count() % iMaxColumns - 1;
- if (xVal >= 0)
- iCursorPos.iX = xVal;
- }
- // If the cursor is in a position where it would go unto a spot with out
- // a icon when scrolled.
- if (iCursorPos.iY + iFirstVisibleRow >= iRows)
- {
- if (iConsArray->Count() % iMaxColumns > iCursorPos.iX)
- {
- TInt yVal = iRows - 1 - iFirstVisibleRow;
- if (yVal >= 0)
- iCursorPos.iY = yVal;
- }
- else
- {
- TInt yVal = iRows - 2 - iFirstVisibleRow;
- if (yVal >= 0)
- iCursorPos.iY = yVal;
- }
- }
- // If the cursor is actually on the last row, but is still in the
- // area where there is now icons. (the rest of the last row)
- if (iConsArray->Count() <= (iFirstVisibleRow + iCursorPos.iY)
- * iMaxColumns + iCursorPos.iX && iCursorPos.iY
- + iFirstVisibleRow + 1 == iRows)
- {
- iCursorPos.iY--;
- }
- // if the corrections did not help and the cursor is in the area
- // where there is a valid row, but no icons anymore
- }
-
- // to avoid flicker we draw only if there really was something new to draw.
- if (update)
- {
- if (Extension()->iObserver)
- {
- Extension()->iObserver->HandleControlEventL(this,
- MCoeControlObserver::EEventRequestFocus);
- }
- DrawDeferred();
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::Extension
-// Asserts that extension object has been created.
-// -----------------------------------------------------------------------------
-//
-CLmkIconMapExtension* CLmkIconMap::Extension() const
- {
- __ASSERT_ALWAYS(iExtension, Panic(KLmkPanicNullPointer));
- return iExtension;
- }
-
-#ifdef RD_SCALABLE_UI_V2
-//--------------------------------------------------------------------------
-// void CLmkIconMap::HandlePointerEventL()
-//--------------------------------------------------------------------------
-void CLmkIconMap::HandlePointerEventL(const TPointerEvent& aPointerEvent)
- {
- if (AknLayoutUtils::PenEnabled())
- {
- TInt newGridX; // For the whole
- TInt newGridY; // For the whole grid.
- TInt yInPixels = aPointerEvent.iPosition.iY - iGridTopLeft.iY;
- newGridY = yInPixels / iGridItemHeight;
- if ((aPointerEvent.iPosition.iX - iGridTopLeft.iX) < 0)
- {
- newGridX = -1;
- }
- else
- {
- newGridX = (aPointerEvent.iPosition.iX - iGridTopLeft.iX)
- / iGridItemWidth;
- }
- TInt previousRows = (iRows / iExtension->iMaxVisibleRows)
- * iExtension->iMaxVisibleRows;
- TUint lastRowsLength = iConsArray->Count() % iMaxColumns;
-
- // The pointer has been set down or dragged into the area of the grid. (it might be in
- // the "white space" at the end of the grid)
- if ((yInPixels >= 0 && yInPixels < iGridItemHeight
- * iExtension->iMaxVisibleRows) &&
- // When the pointer is in rows except the recent icon row
- ((((newGridY + iFirstVisibleRow) != 0) && newGridX
- < iMaxColumns && newGridX >= 0) ||
- // When the pointer is in the recent icon row
- ((newGridY + iFirstVisibleRow == 0) && (newGridX
- < iMaxColumns))))
- {
- // For any action to be taken, the pointer event must either be a Button1Down or a drag event
- // which has originated from a Button1Down in to the grid.
- if (aPointerEvent.iType == TPointerEvent::EButton1Down)
- {
- TUint globalY = newGridY + iFirstVisibleRow;
- // The user tapps a cell which has no icon. it is ignored.
- if (iConsArray->Count() > globalY * iMaxColumns + newGridX)
- {
- //If icon is already selected then on single tap it should change the icon.
- if (iCursorPos.iY == newGridY && iCursorPos.iX
- == newGridX)
- {
-#ifdef RD_TACTILE_FEEDBACK
- // The user tapps a cell which has icon, selection has been accepted
- MTouchFeedback* feedback = MTouchFeedback::Instance();
- if (feedback)
- {
- feedback->InstantFeedback(this,
- ETouchFeedbackBasic);
- }
-#endif //RD_TACTILE_FEEDBACK
- //iIsChangeIcon = ETrue;
- }
- else if (iCursorPos.iX + (iCursorPos.iY
- + iFirstVisibleRow) * iMaxColumns
- < iConsArray->Count())
- {
-#ifdef RD_TACTILE_FEEDBACK
- // The user tapps a cell which has icon, send feedback if position has changed
- MTouchFeedback* feedback = MTouchFeedback::Instance();
- const TBool feedbackNeeded = (iCursorPos.iY
- != newGridY) || (iCursorPos.iX != newGridX);
- if (feedback && feedbackNeeded)
- {
- feedback->InstantFeedback(this,
- ETouchFeedbackBasic);
- }
-#endif //RD_TACTILE_FEEDBACK
- iOldCursorPos = iCursorPos;
- iCursorPos.iY = newGridY;
- iCursorPos.iX = newGridX;
- DrawCursor();
- }
- else
- {
- iOldCursorPos = iCursorPos;
- iCursorPos.iY = newGridY;
- iCursorPos.iX = newGridX;
- DrawCursor();
- }
- }
- }
- else if (aPointerEvent.iType == TPointerEvent::EDrag)
- {
- //Handle drag event only if the icon is not already selected, if already selected then do nothing for EDrag event
- if (iCursorPos.iY != newGridY || iCursorPos.iX != newGridX)
- {
- //iIsChangeIcon = EFalse;
- TUint globalY = newGridY + iFirstVisibleRow;
- // The user tapps a cell which has no icon. it is ignored.
- if (iConsArray->Count() > globalY * iMaxColumns
- + newGridX)
- {
- if (iCursorPos.iX
- + (iCursorPos.iY + iFirstVisibleRow)
- * iMaxColumns < iConsArray->Count())
- {
-#ifdef RD_TACTILE_FEEDBACK
- // While dragging cell is changed, give sensitive feedback
- MTouchFeedback* feedback =
- MTouchFeedback::Instance();
- const TBool feedbackNeeded = (iCursorPos.iY
- != newGridY) || (iCursorPos.iX
- != newGridX);
- if (feedback && feedbackNeeded)
- {
- feedback->InstantFeedback(this,
- ETouchFeedbackSensitive);
- }
-#endif //RD_TACTILE_FEEDBACK
- iOldCursorPos = iCursorPos;
- iCursorPos.iY = newGridY;
- iCursorPos.iX = newGridX;
- DrawCursor();
- }
- else
- {
- iOldCursorPos.iX = 0;
- iOldCursorPos.iY = 0;
- }
- }
- }
-
- }
- else if (aPointerEvent.iType == TPointerEvent::EButton1Up)
- {
- //if (iIsChangeIcon)
-
- {
- iExtension->iObserver->HandleControlEventL(this,
- MCoeControlObserver::EEventStateChanged);
- //iIsChangeIcon = EFalse;
- }
- }
- }
- // Events: Drag and repeat pointer events which are not on the scrollbar are handled here.
-
- else if (iConsArray->Count() > iMaxColumns
- * iExtension->iMaxVisibleRows && newGridX < iMaxColumns
- && newGridX >= 0 && newGridY < iExtension->iMaxVisibleRows
- && newGridY >= 0)
- {
- TRect ignoreUpRect(TPoint(KMinTInt, KMinTInt), TPoint(KMaxTInt,
- iGridTopLeft.iY));
- TRect ignoreDownRect(TPoint(KMinTInt, (iGridTopLeft.iY
- + iGridItemHeight * iExtension->iMaxVisibleRows)),
- TPoint(KMaxTInt, KMaxTInt));
- // Drag events
- if (aPointerEvent.iType == TPointerEvent::EDrag
- || aPointerEvent.iType == TPointerEvent::EButtonRepeat)
- {
- // The pointer is dragged upwards from map
- if (aPointerEvent.iPosition.iY < iGridTopLeft.iY
- && aPointerEvent.iPosition.iX < iGridTopLeft.iX) //scroll up
- {
- // focus on first page
- if (iFirstVisibleRow == 0)
- {
- iFirstVisibleRow = previousRows;
- // if the last page contains only one partial row.
- if (lastRowsLength - 1 < iCursorPos.iX && iRows
- % iExtension->iMaxVisibleRows == 1)
- {
- iCursorPos.iX = lastRowsLength - 1;
- }
- }
- // focus on some other page than first
- else
- {
- iFirstVisibleRow -= iExtension->iMaxVisibleRows;
- }
- // For odd reason the user has been able to induce upward dragging with out moving
- // up through the grid.
- if (iCursorPos.iY + iExtension->iMaxVisibleRows
- != iFirstVisibleRow)
- {
- iCursorPos.iY = 0;
- }
- UpdateScrollIndicatorL();
- if (iExtension->iObserver)
- {
- iExtension->iObserver->HandleControlEventL(this,
- MCoeControlObserver::EEventRequestFocus);
- }
- DrawDeferred();
- }
- // the pointer is dragged downwards from the map.
- else if (yInPixels >= iGridItemHeight
- * iExtension->iMaxVisibleRows) //scroll down
- {
- // The focus is on the last page
- if (iFirstVisibleRow == previousRows)
- {
- iFirstVisibleRow = 0;
- iCursorPos.iY = iExtension->iMaxVisibleRows - 1;
- }
- // The focus is on some other page than the last one.
- else
- {
- iFirstVisibleRow += iExtension->iMaxVisibleRows;
- // if the next page is the last page
- if (iFirstVisibleRow == previousRows)
- {
- // the old cursor is set to a "safe" position where it at least can be.
- iOldCursorPos.iX = 0;
- iOldCursorPos.iY = 0;
-
- // if the last page has only one line which isn't filled complitely.
- if (lastRowsLength - 1 < iCursorPos.iX && iRows
- % iExtension->iMaxVisibleRows == 1)
- {
- iCursorPos.iX = lastRowsLength - 1;
- }
- // If the cursor is in a position where it would go unto a spot with out
- // a icon when scrolled.
- if (lastRowsLength > iCursorPos.iX)
- {
- //
- iCursorPos.iY = iRows - 1 - iFirstVisibleRow;
- }
- else
- {
- //
- iCursorPos.iY = iRows - 2 - iFirstVisibleRow;
- }
- }
- }
- UpdateScrollIndicatorL();
- if (iExtension->iObserver)
- {
- iExtension->iObserver->HandleControlEventL(this,
- MCoeControlObserver::EEventRequestFocus);
- }
- DrawDeferred();
- }
- }
- }
-
- else // For a non window owning scrollbar.
- {
- CCoeControl::HandlePointerEventL(aPointerEvent);
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CLmkIconMap::SetObserver
-// Sets the observer.
-// -----------------------------------------------------------------------------
-//
-void CLmkIconMap::SetObserver( MCoeControlObserver* aObserver )
- {
- if (iExtension)
- {
- iExtension->iObserver = aObserver;
- }
- }
-
-#endif //RD_SCALABLE_UI_V2
-// End of File