epoc32/include/mw/akngridview.h
branchSymbian2
changeset 2 2fe1408b6811
parent 1 666f914201fb
child 4 837f303aceeb
--- a/epoc32/include/mw/akngridview.h	Tue Nov 24 13:55:44 2009 +0000
+++ b/epoc32/include/mw/akngridview.h	Tue Mar 16 16:12:26 2010 +0000
@@ -1,1 +1,545 @@
-akngridview.h
+/*
+* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*     CAknGridView handles the drawing, the mapping
+*     of the grid data index to the underlying listbox index (and
+*     visa versa) as well as the movement around the grid.
+*
+*/
+
+#ifndef __AKNGRIDVIEW_H__
+#define __AKNGRIDVIEW_H__
+
+// INCLUDES
+#include <eiklbv.h>
+#include <akngridm.h>
+#include <eiklabel.h>
+
+// CLASS DECLARATION
+
+/**
+* @c CAknGridView handles the drawing, the mapping of the grid data index
+* to the underlying listbox index (and vice versa) as well as the movement
+* around the grid. Differentiation is needed between a data index and the
+* list box index since the inherited list box code handles the top, bottom
+* and current indexes as though everything is order topdown and left to
+* right. This is no good for grid that maybe order in 8 different
+* ways so need conversion between list box index and actual data
+* index.
+* List box index is the index for the data item according to the
+* snaking list box format of numbering data items.
+* Data index is the actual index in the grid according to the
+* ordering applied to the data by the user.
+* Note: the logical position is the intermediate form used to map
+* from a list box index to a data index or vi sa versa. It is
+* essentialy the position of the item in relation to the top left
+* corner of the grid. I.e. the top left position has logical
+* position 0,0.
+* 
+* @since 0.9
+* @lib avkon.lib
+*/
+class CAknGridView : public CListBoxView 
+	{
+public:
+	/** Enumeration flags for grid.*/
+	enum TGridFlags
+		{
+		/** Vertical is primary direction.*/
+		EPrimaryIsVertical	= 0x0001,
+		/** From top to bottom.*/
+		ETopToBottom		= 0x0002,
+		/** From left to right.*/
+		ELeftToRight		= 0x0004
+		};
+	/** Enumeration for different scrolling types.*/
+	enum TScrollingType
+		{
+		/** Scrolling follows items and stops.*/
+		EScrollFollowsItemsAndStops,
+		/** Scrolling follows items and loops.*/
+		EScrollFollowsItemsAndLoops,
+		/** Scrolling follows grid. */
+		EScrollFollowsGrid,
+		/** Scrolling stops. */
+		EScrollStops,
+		/** Scrolls one line and stops.*/
+		EScrollIncrementLineAndStops,
+		/** Scrolls one line and loops.*/
+		EScrollIncrementLineAndLoops
+		};
+	/** Enumeration flags for different layouts.*/
+	struct SGrid
+		{
+		/** Current size of entire grid. */
+		TSize iGridDimensions;
+		/** Flags. */
+		TInt iGridFlags;
+		/** Size of the viewable area ( iColsInView * iRowsInView ). */
+		TInt iPageSize;
+		/** The number of columns in the viewable area. */
+		TInt iColsInView;
+		/** The number of rows in the viewable area. */
+		TInt iRowsInView;
+		/** The size of gap between items (height and width). */
+		TSize iSizeBetweenItems;
+		/** The size of an item. */
+		TSize iSizeOfItems;
+		};
+
+protected:
+	/** Enumeration flags for pages.*/
+	enum TPageIndex 
+		{
+		/** Previous page.*/
+		EPreviousPage,
+		/** Next page.*/
+		ENextPage,
+		/** First page. */
+		EHome,
+		/** Last page.*/
+		EEnd
+		};
+	/* Enumeration of position of current index.*/
+	enum TPositionCurrentIndex
+		{
+		/** Page. */
+		EPage,
+		/** Column.*/
+		EColumn,
+		/** Opposite corner.*/
+		EOppositeCorner
+		};
+
+public:
+	/**
+	* Default C++ constructor.
+	*/
+	IMPORT_C CAknGridView();
+	
+	/**
+	* Destructor.
+	*/
+	IMPORT_C virtual ~CAknGridView();
+
+	// actual <-> listbox index conversion routines
+	/**
+	* Returns the actual index of given listbox index.
+	* @param aListBoxIndex The index of the listbox.
+	* @return The actual data index.
+	*/
+	IMPORT_C TInt ActualDataIndex(TInt aListBoxIndex) const;
+	
+	/**
+	* Returns the listbox index of given data index.
+	* @param aDataIndex The index of the actual data.
+	* @return The index in listbox.
+	*/
+	IMPORT_C TInt ListBoxIndex(TInt aDataIndex) const;
+
+	/**
+	* Returns the current data index with respect to the ordering of the cells
+	* in the grid.
+	* @return Current data index.
+	*/
+	IMPORT_C TInt CurrentDataIndex() const;
+	
+	/**
+ 	* Sets the current data index with a value given with respect to the
+ 	* ordering of the cells in the grid.
+ 	* @param aDataIndex The index to be set.
+ 	*/
+	IMPORT_C void SetCurrentDataIndex(TInt aDataIndex);
+
+	/**
+ 	* Sets the form of scroll to activate upon reaching the limit when moving
+ 	* in the primary direction of grid, primary meaning whether the items are
+ 	* organised vertically or horizontally.
+ 	* @param aScrollingType The primary scrolling type.
+ 	*/
+	IMPORT_C void SetPrimaryScrollingType(TScrollingType aScrollingType);
+	/**
+ 	* Sets the form of scroll to activate upon reaching the limit when moving
+ 	* in the secondary direction of grid.
+ 	* @param aSecondaryScrolling The secondary scrolling type.
+ 	*/
+	IMPORT_C void SetSecondaryScrollingType(TScrollingType aSecondaryScrolling);
+
+	/**
+ 	* Checks that number of cells in the grid is always enough to fill the
+ 	* current grid dimensions. This method should be called after any method
+ 	* that may alter the amount of data within the grid.
+ 	* @param aGridDimensions Grid diemnsions.
+ 	*/
+	IMPORT_C void SetGridCellDimensions(TSize aGridDimensions);
+	
+	/**
+ 	* Returns the current grid dimensions.
+ 	* @return The size of the current grid.
+ 	*/
+	IMPORT_C TSize GridCellDimensions() const;
+	/**
+	* Sets the size of the spaces between items.
+	* @param aSizeOfSpaceBetweenItems The size of the spaces between items.
+ 	*/
+	IMPORT_C void SetSpacesBetweenItems(TSize aSizeOfSpaceBetweenItems);
+	
+	/**
+ 	* Returns @c ETrue if the primary dimension of the grid is vertical.
+ 	* @return @ETrue if vertical is set as primary, otherwise @c EFalse.
+ 	*/
+	IMPORT_C TBool IsPrimaryVertical() const;
+
+	/**
+ 	* Converts a logical position on the grid, where the co-ordinates are with
+ 	* respect to the top left hand corner of the grid, to an index for the cell
+ 	* with respect to the ordering of the cells in the grid.
+ 	* @param aItemIndex Reference to the index for the cell in the grid. 
+ 	* @param aRowIndex The row in the grid.
+ 	* @param aColIndex The column in the grid.
+ 	*/
+	IMPORT_C void DataIndexFromLogicalPos(
+		TInt& aItemIndex,
+		TInt aRowIndex,
+		TInt aColIndex) const;
+	
+	/**
+ 	* Converts an index for a cell in the grid, given with respect to the
+ 	* ordering of the cells in the grid, to a logical position on the grid,
+ 	* where the co-ordinates are with respect to the top left hand corner of
+ 	* the grid.
+ 	* @param aItemIndex The index for the cell in the grid. 
+ 	* @param aRowIndex Reference to the row in the grid.
+ 	* @param aColIndex Reference to the column in the grid.
+ 	*/
+	IMPORT_C void LogicalPosFromDataIndex(
+		TInt aItemIndex,
+		TInt& aRowIndex,
+		TInt& aColIndex) const;
+	
+	/**
+ 	* Converts a CEikListBox index for a cell in the grid, given with respect
+ 	* to the snaking listbox top down, left to right structure underlying the
+ 	* grid structure, to a logical position on the grid, where the co-ordinates
+ 	* are with respect to the top left hand corner of the grid.
+ 	* @param aItemIndex Reference to the index for the cell in the grid. 
+ 	* @param aRowIndex The row in the grid.
+ 	* @param aColIndex The column in the grid.
+ 	*/	
+	IMPORT_C void ListBoxIndexFromLogicalPos(
+		TInt& aItemIndex,
+		TInt aRowIndex,
+		TInt aColIndex) const;
+	/**
+ 	* Converts a logical position on the grid, where the co-ordinates are with
+ 	* respect to the top left hand corner of the grid, to a CEikListBox index
+ 	* for the cell with respect to the snaking listbox top down, left to right
+ 	* structure underlying the grid structure.
+ 	* @param aItemIndex The index for the cell in the grid. 
+ 	* @param aRowIndex Reference to the row in the grid.
+ 	* @param aColIndex Reference to the column in the grid.
+ 	*/
+	IMPORT_C void LogicalPosFromListBoxIndex(
+		TInt aItemIndex,
+		TInt& aRowIndex,
+		TInt& aColIndex) const;
+
+	/**
+	* Draws empty grid list.
+	*/
+	IMPORT_C virtual void DrawEmptyList() const;
+
+	/**
+ 	* Grid initialisation function.
+ 	* @param aGridDetails Struct of grid details.
+ 	*/
+	IMPORT_C void SetGridDetails(SGrid aGridDetails);
+
+	/**
+ 	* This moves to the item and draws the grid in the right place.
+ 	* @param aItemIndex The wanted item index.
+ 	* @param aSelectionMode Mode for modifying the selection.
+ 	*/
+	IMPORT_C void MoveToItemIndexL(TInt aItemIndex, TSelectionMode aSelectionMode);
+
+	/**
+	* This function returns the number of visible columns.
+	* @return The number of visible columns in view.
+	*/
+	IMPORT_C TInt NumberOfColsInView() const;
+
+	/**
+ 	* This function returns the number of visible rows.
+ 	* @return The number of visible rows in view.
+ 	*/
+	IMPORT_C TInt NumberOfRowsInView() const;
+
+    /**
+    * Moves cursor with repeats.
+    * @param aNext ETrue if next, EFalse if previous.
+    * @param aSelectionMode selection mode.
+    * @param aAmount Amount of steps to move.
+    * @since S60 3.2
+    */
+    void MoveCursorWithRepeatsL( 
+        TBool aNextOrPrev, 
+        TSelectionMode aSelectionMode, 
+        TInt aAmount );
+    
+public: // from CListBoxView 
+	/**
+	* From @c CListBoxView. Basically empty implementation of 
+	* @c CListBoxView::DrawMatcherCursor.
+	*/
+	IMPORT_C virtual void DrawMatcherCursor();
+
+	/** 
+	* From @c CListBoxView. This function returns the current item in the grid
+	* and -1 if there is no current item,
+	* @return The current item.
+	*/
+	IMPORT_C TInt CurrentItemIndex() const;
+
+protected:
+	/**
+	* This function tests whether an item exists.
+	* @param aListBoxIndex Index to test.
+	* @return @c ETrue if the specified item exists, @c EFalse otherwise.
+	*/
+	IMPORT_C TBool ItemExists(TInt aListBoxIndex) const;
+
+public: // code moved from CSnakingListBoxView
+	/**
+ 	* This function sets the width of the grid column. This should only be 
+ 	* called via the selection box class's @c SetColumnWidth method.
+ 	* @param aColumnWidth The required width of all columns in the view, 
+ 	* in pixels.
+ 	*/
+	IMPORT_C void SetColumnWidth(TInt aColumnWidth);
+	
+	/**
+	* Overloaded @c MoveCursorL method to process cursor movement according to
+ 	* orientation of the grid.
+ 	* @param aCursorMovement The cursor movement to apply 
+ 	* etc. @c ECursorNextItem and @c ECursorPreviousItem.
+ 	* @param aSelectionMode The selection mode of the calling list box. 	
+ 	*/	
+	IMPORT_C virtual void MoveCursorL(
+		TCursorMovement aCursorMovement,
+		TSelectionMode aSelectionMode);
+
+	/**
+	* This function draws every visible item into the specified rectangle. 
+	* As implemented in @c CListBoxView, this function's argument is ignored
+	* and the internal viewing rectangle is used. See @c SetViewRect().
+	* @param @c TRect* @c aClipRect = @c NULL The rectangle to draw into.
+	*/
+	IMPORT_C virtual void Draw(const TRect* aClipRect = NULL) const;
+
+	/**
+ 	* This has been overloaded to ensure that only valid cells are drawn and 
+ 	* not the empty cells.
+ 	* @param aItemIndex Index number of the item to draw.
+	*/ 	
+	IMPORT_C virtual void DrawItem(TInt aItemIndex) const;
+
+	/**
+	* This function gets the position of the top left corner of the specified 
+	* item, in pixels. 
+	* @param aItemIndex An item in the model. 
+	* @return @c TPoint position of the top left corner of the item, in pixels.
+	*/ 
+	IMPORT_C virtual TPoint ItemPos(TInt aItemIndex) const;
+	
+	/**
+	* This function has been overloaded to draw items correctly. Recalculates 
+	* the bottom item’s index. This is called by the list box control when 
+	* either the size or the number of items in its model changes. 
+	*/ 	
+	IMPORT_C virtual void CalcBottomItemIndex();
+	
+	/**
+	* This function gets the item the view would need to be moved to in order 
+	* to make the specified item visible.
+	* @param aItemIndex The item to make visible.
+	* @return The item to scroll to to make @c aItemIndex visible.
+	*/	
+	IMPORT_C virtual TInt CalcNewTopItemIndexSoItemIsVisible(TInt aItemIndex) const;
+	
+	/**
+	* This function draws every item between the start and end indices
+	* inclusively.
+	* @param aStartItemIndex The first item to draw.
+	* @param aEndItemIndex The final item to draw.
+	*/
+	IMPORT_C virtual void DrawItemRange(TInt aStartItemIndex, TInt aEndItemIndex) const;
+
+	/**
+	* This function gets the width of all columns in the view.
+	* @return The width of all columns in the view, in pixels.
+	*/
+	inline TInt ColumnWidth() const;
+	
+	/**
+	* Sets which item appears at the top left corner of the view. The function
+	* changes items displayed in the view appropriately.
+	* @param aItemIndex Index of the item to set at the top left.
+	*/
+	IMPORT_C virtual void SetTopItemIndex(TInt aItemIndex);
+	
+	/**
+	* This function sets item height in pixels.
+	* @param aItemHeight New height in pixels for this view’s items.
+	*/	
+	IMPORT_C virtual void SetItemHeight(TInt aItemHeight);
+	
+	/*
+	* This function converts an (x, y) pixel position to an item index.
+	* @param aPosition Pixel position in the viewing rectangle.
+	* @param aItemIndex Reference to the item index.
+	* @return Whether there was an item at aPosition.
+	*/	
+	IMPORT_C virtual TBool XYPosToItemIndex(TPoint aPosition, TInt& aItemIndex) const;
+
+	/**
+	* Calculates the data width in columns. @c iDataWidth is calculated based on
+	* model and drawer information.
+	*/	
+	IMPORT_C virtual void CalcDataWidth();
+	
+	/**
+	* Gets the visible width of the specified rectangle in pixels.
+	* @param aRect Reference to the rectangle for which to get the visible 
+	* width.
+	* @return Visible width of aRect in pixels.
+	*/	
+	IMPORT_C virtual TInt VisibleWidth(const TRect& aRect) const;
+	
+	/**
+	* Makes the specified item visible by moving the view location and 
+	* redrawing the control. Index of the item to make visible. 
+	* @param aItemIndex Index of the item to make visible. 
+	* @return @c ETrue if the control was redrawn, @c EFalse if no redraw 
+	* happened (i.e. the item was already visible, or redraw was disabled).
+	*/
+	IMPORT_C virtual TBool ScrollToMakeItemVisible(TInt aItemIndex);
+	
+	/**
+	* Gets the number of columns that this view would need to be scrolled by 
+	* to make the specified item visible. The function returns 0 if no 
+	* scrolling is needed. @c ScrollToMakeItemVisible() uses this function.
+	* @param aItemIndex Item to make visible.
+	* @return The number of columns to scroll, or zero if no scrolling is
+	* needed.
+	*/
+	IMPORT_C virtual TInt CalculateHScrollOffsetSoItemIsVisible(TInt aItemIndex);
+	
+	/**
+	* Gets the size of the specified item.
+	* @param aItemIndex=0 The index of the item whose size this call is to get.
+	* @return @c TSize The size of the item in pixels.
+	*/
+	IMPORT_C virtual TSize ItemSize(TInt aItemIndex=0) const;
+	
+	/**
+	* Converts an item index into the (row, column) pair describing that item.
+	* @param aItemIndex The item index.
+	* @param aRowIndex Reference to the row index.
+	* @param aColIndex Reference the column index.
+	*/	
+	IMPORT_C void CalcRowAndColIndexesFromItemIndex(TInt aItemIndex, TInt& aRowIndex, TInt& aColIndex) const;
+	
+	/**
+	* This function converts a row/column pair into the item index for that 
+	* item.
+	* @param aItemIndex Reference to the item index. 
+	* @param aRowIndex Row index of the item.
+	* @param aColIndex Column index of the item.
+	*/
+	IMPORT_C void CalcItemIndexFromRowAndColIndexes(TInt& aItemIndex, TInt aRowIndex, TInt aColIndex) const;
+
+protected: // code moved from CSnakingListBoxView
+	/**
+	* This function draws every item in every column between the start and end
+	* columns inclusively.
+	* @param aStartColIndex The first column to draw. 
+	* @param aEndColIndex The last column to draw. 
+	*/
+	IMPORT_C void DrawColumnRange(TInt aStartColIndex, TInt aEndColIndex) const;
+
+	/**
+	* This function clears each item’s rectangle between the specified start
+	* and finish item’s indexes.
+	* @param aStartItemIndex The first item to clear.
+	* @param aEndItemIndex The last item to clear.
+	*/	
+	IMPORT_C void ClearUnusedItemSpace(TInt aStartItemIndex, TInt aEndItemIndex) const;
+
+	/**
+	* This function updates the horizontal scroll offset (iHScrollOffset) 
+	* based on the top item’s index. This function is called internally by
+	* @c CEikSnakingListBoxes when needed.
+	*/	
+	IMPORT_C void UpdateHScrollOffsetBasedOnTopItemIndex();
+
+protected:
+	/**
+	* This inline function is grid model helper.
+	* @return A pointer to @c CAknGridM object.
+	*/	
+	inline CAknGridM* GridModel() const;
+
+	/** 
+	* This function handles movement routines.
+	* @param aCursorMovement Handles cursor movements etc. @c ECursorNextItem
+	* and @c ECursorPreviousItem.
+	* @param aSelectionMode Modes for modifying the selection.
+	*/
+	IMPORT_C void DoMoveL(TCursorMovement aCursorMovement, TSelectionMode aSelectionMode);
+
+private:
+	// movement handling routines
+	IMPORT_C TInt SearchByLines(TInt aX, TInt aY, TCursorMovement aCursorMovement, TBool aBeginSearchOnIndex = EFalse);
+	IMPORT_C TInt FindNextItem(TInt aItemIndex, TBool aLookDown, TBool aLookRight, TBool aFirstLookHorizontal, TBool aBeginSearchOnIndex = EFalse);
+	TBool IsEdgePassed(TInt aItemIndex, TBool aLookDown, TBool aLookRight, TBool aFirstLookHorizontal, TBool aBeginSearchOnIndex, TInt& aNewIndex);
+
+	TBool IsMoveRight(TCursorMovement aCursorMovement);
+	TBool IsMoveDown(TCursorMovement aCursorMovement);
+private: // overridden from CListBoxView
+	IMPORT_C virtual TAny* Reserved_1();
+
+private:
+    
+    /**
+    * Draws the portion of the grid view rectangle that contains no items.
+    */
+    void DrawUnusedViewPortion() const;
+    
+private:
+	TScrollingType iScrollingType;
+	TScrollingType iScrollInSecondaryDimension;
+
+	SGrid iGridDetails;
+    TInt iSpare[2];
+	};
+
+inline CAknGridM* CAknGridView::GridModel() const
+	{
+	return STATIC_CAST(CAknGridM*,iModel);
+	}
+
+inline TInt CAknGridView::ColumnWidth() const
+	{ return iGridDetails.iSizeOfItems.iWidth; }
+
+#endif // __AKNGRIDVIEW_H__