imstutils/imconversationview/imcvuiapp/src/cimcvappsmileicongrid.cpp
changeset 0 5e5d6b214f4f
child 16 d20aea8a18b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiapp/src/cimcvappsmileicongrid.cpp	Tue Feb 02 10:12:18 2010 +0200
@@ -0,0 +1,680 @@
+/*
+* 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:  Grid for smile icons
+*
+*/
+
+
+// INCLUDE FILES
+#include "cimcvappsmileicongrid.h"
+#include "imcvappsmileutility.hrh"
+#include <AknUtils.h>
+#include <AknIconUtils.h>
+#include <AknLayout.lag>
+#include <gulicon.h>
+#include <eikdialg.h>
+#include <AknsDrawUtils.h>
+#include <aknappui.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknDef.h>
+#include "imcvlogger.h"
+#include "imcvuiapputils.h"
+
+#include "mimcvtapeventobserver.h"
+
+// CONSTANTS
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CIMCVAppSmileIconGrid::NewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+CIMCVAppSmileIconGrid* CIMCVAppSmileIconGrid::NewL( CEikDialog* aParent,
+							    const RPointerArray<CGulIcon>& aIconArray )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::NewL() start") );
+    CIMCVAppSmileIconGrid* self = new (ELeave) CIMCVAppSmileIconGrid( aParent, 
+                                                            aIconArray );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::NewL() end") );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppSmileIconGrid::~CIMCVAppSmileIconGrid
+// -----------------------------------------------------------------------------
+CIMCVAppSmileIconGrid::~CIMCVAppSmileIconGrid()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppSmileIconGrid::CIMCVAppSmileIconGrid
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// C++ constructor can NOT contain any code, that
+// might leave.
+//
+CIMCVAppSmileIconGrid::CIMCVAppSmileIconGrid( CEikDialog* aParent,
+                                    const RPointerArray<CGulIcon>& aIconArray )
+:iParent( aParent ), iIconArray( aIconArray )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppSmileIconGrid::ConstructL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+// default constructor can leave.
+void CIMCVAppSmileIconGrid::ConstructL()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::ConstructL() start") );
+	iIconCount = iIconArray.Count();
+	
+	iIsMirrored = ETrue ;
+    SetContainerWindowL( *iParent );
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::ConstructL() end") );
+    }
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::MoveCursor
+// Move cursor and redraw highlight.
+// Called when arrow-key is pressed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconGrid::MoveCursor( TInt aKeyCode )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::MoveCursor() start") );
+    iPrevCursorPos = iCursorPos;
+
+    switch( aKeyCode )
+        {
+        case EKeyLeftArrow:
+            {
+			if( AknLayoutUtils::LayoutMirrored() )
+				{
+				iCursorPos++;
+				if( iCursorPos >= iIconCount )
+					{
+					iCursorPos = 0;
+					}
+				}
+			else
+				{
+				iCursorPos--;
+				if( iCursorPos < 0 )
+					{
+					iCursorPos = iIconCount - 1;
+					}
+				}
+            break;
+            }
+        case EKeyRightArrow:
+            {
+			if( AknLayoutUtils::LayoutMirrored() )
+				{
+				iCursorPos--;
+				if( iCursorPos < 0 )
+					{
+					iCursorPos = iIconCount - 1;
+					}
+				}
+			else
+				{
+				iCursorPos++;
+				if( iCursorPos >= iIconCount )
+					{
+					iCursorPos = 0;
+					}
+				}
+            break;
+            }
+        case EKeyUpArrow:
+            {
+			if( iCursorPos < iMaxColumns )
+                {
+                iCursorPos += ( iRowCount * iMaxColumns ) - 1;
+
+                if( iCursorPos >= iIconCount )
+                    {
+                    iCursorPos -= iMaxColumns;
+                    }
+
+				if( iCursorPos < 0 )
+					{
+					iCursorPos = iIconCount - 1;
+					}
+				}
+			else
+				{
+                iCursorPos -= iMaxColumns;
+				}
+            break;
+            }
+        case EKeyDownArrow:
+            {
+            if( iCursorPos < ( iIconCount - iMaxColumns ) )
+                {
+                iCursorPos += iMaxColumns;
+                }
+			else
+				{
+				iCursorPos %= iMaxColumns;
+				iCursorPos++;
+				if( iCursorPos >= iMaxColumns ||
+					iCursorPos >= iIconCount )
+					{
+					iCursorPos = 0;
+					}
+				}
+            break;
+            }
+        default:
+            {
+            return;
+            }
+        }
+
+    DrawDeferred();
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::MoveCursor() end") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::SelectedBitmapId
+// Called when OK-key or Select-softkey is pressed.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CIMCVAppSmileIconGrid::SelectedBitmapId()
+    {
+    return iCursorPos;
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::HeightInRows
+// Return row count of grid.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CIMCVAppSmileIconGrid::HeightInRows()
+    {
+    return iRowCount;
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::SetLayout
+// Set layout of identifier grid.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconGrid::SetLayout()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::SetLayout() start") );
+ 	iIsMirrored = AknLayoutUtils::LayoutMirrored() ;
+    
+    // popup_grid_graphic_window (Parent)
+    TRect parentRect( iParent->Rect() );
+   
+    // listscroll_popup_graphic_pane (this compoment)
+    TAknLayoutRect listLayoutRect;
+    listLayoutRect.LayoutRect( 
+        parentRect, 
+        AknLayoutScalable_Avkon::listscroll_popup_graphic_pane() );
+    
+    // grid_graphic_popup_pane
+    TAknLayoutRect gridLayoutRect;
+    gridLayoutRect.LayoutRect( 
+        listLayoutRect.Rect(), 
+        AknLayoutScalable_Avkon::grid_graphic_popup_pane( 0 ) );
+  
+	// cell_graphic_popup_pane (upper left cell)
+	TAknLayoutRect oneCellRect;
+	oneCellRect.LayoutRect( 
+        gridLayoutRect.Rect(), 
+        AknLayoutScalable_Avkon::cell_graphic_popup_pane( 0, 0, 0 ) );
+   
+    iFirstCell = oneCellRect.Rect();
+    iCellWidth = iFirstCell.Width();
+    iCellHeight = iFirstCell.Height();
+
+    // cell_graphic_popup_pane_g1 (icon size)
+    TAknLayoutRect myIconRect;
+    myIconRect.LayoutRect( 
+        iFirstCell, 
+        AknLayoutScalable_Avkon::cell_graphic2_pane_g5(0) );
+    
+    iIconSize = myIconRect.Rect().Size();
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::SetLayout() end") );
+    }
+   
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::MinimumSize
+// Return minimum size to use the control.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TSize CIMCVAppSmileIconGrid::MinimumSize()
+    {       
+    TAknLayoutRect gridRect;
+    gridRect.LayoutRect(
+        iParent->Rect(),
+        AknLayoutScalable_Avkon::listscroll_popup_graphic_pane() );
+    return gridRect.Rect().Size();
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::SizeChanged
+// Control rectangle is set.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconGrid::SizeChanged()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::SizeChanged() start") );
+    SetLayout();
+    
+    TInt iconCount( iIconArray.Count() );
+	for ( TInt i = 0; i < iconCount; i++  )
+	    {
+		AknIconUtils::SetSize( iIconArray[i]->Bitmap(), 
+		                       iIconSize );
+	    }
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::SizeChanged() end") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::HandleResourceChange
+// Notifier for changing layout
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+void CIMCVAppSmileIconGrid::HandleResourceChange( TInt aType )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::HandleResourceChange() start") );
+    if( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        SetLayout();
+        }
+    else
+        {
+        CCoeControl::HandleResourceChange( aType );
+        }
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::HandleResourceChange() end") );
+    }
+
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::Draw
+// Drawing control.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconGrid::Draw( const TRect& /* aRect */ ) const
+	{
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::Draw() start") );
+	CWindowGc& gc = SystemGc();
+
+	MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+	MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+
+	if( !iDragEvent )
+		{
+		//draw the grid
+		gc.SetPenStyle(CGraphicsContext::ESolidPen);    
+		gc.SetBrushStyle(CGraphicsContext::ENullBrush);
+		gc.SetPenSize(TSize(1,1));    
+		gc.SetPenColor(AKN_LAF_COLOR(215));
+
+		// For some reason the dialog does not draw it's background
+		// completely, so we'll have to do it here.
+		// This should work with bgRect = Rect(), but it doesn't.
+		// Change this if you know how it should be done.
+		TRect bgRect = iParent->Rect();
+		bgRect.iTl.iY = Rect().iTl.iY;
+		// ---
+
+		TBool skins = AknsDrawUtils::Background( skin, cc, this, gc, bgRect );
+
+		if ( !skins )
+			{
+			TRgb color = AKN_LAF_COLOR( 0 );
+            AknsUtils::GetCachedColor(skin,color,KAknsIIDQsnIconColors,EAknsCIQsnIconColorsCG1); 
+			gc.SetBrushColor(color);
+			gc.Clear( bgRect );
+			}
+
+    	TInt lastRowIconsCount = iIconCount % iMaxColumns;
+		if( lastRowIconsCount == 0 && iIconCount > 0 )
+			{
+			// last row is full
+    	    lastRowIconsCount = iMaxColumns;
+			}
+
+		TInt i( 0 );
+
+		if(!iIsMirrored)	
+			{
+			//draw horizontal lines
+			for( i = 0; i <= iRowCount; ++i )
+				{
+				TPoint startPoint( iFirstCell.iTl );
+				TPoint endPoint( iFirstCell.iTl );
+				startPoint.iY += i * iCellHeight;
+				endPoint.iY += i * iCellHeight;
+				endPoint.iX += ( ( i == iRowCount ) || ( i == 0 && iRowCount == 1 )
+				    ? ( lastRowIconsCount ) 
+    		    * iCellWidth : iMaxColumns * iCellWidth );
+				// add 1 pixel to remove the gap from bottom right corners
+				++endPoint.iX;
+				gc.DrawLine( startPoint, endPoint );
+				}
+
+			//draw vertical lines
+    	for( i = 0; i <= iMaxColumns; ++i )
+				{
+				TPoint startPoint( iFirstCell.iTl );
+				TPoint endPoint( iFirstCell.iTl );
+				startPoint.iX += i * iCellWidth;
+				endPoint.iX += i * iCellWidth;
+				endPoint.iY += ( i <= lastRowIconsCount ? 
+				    iCellHeight * iRowCount : iCellHeight * ( iRowCount - 1  ) );
+				gc.DrawLine( startPoint, endPoint );
+				}
+			}
+		else
+			{
+			//draw horizontal lines
+			for( i = 0; i <= iRowCount; ++i )
+				{
+				TPoint startPoint( iFirstCell.iBr.iX, iFirstCell.iTl.iY);
+				TPoint endPoint( iFirstCell.iBr.iX, iFirstCell.iTl.iY );
+				startPoint.iY += i * iCellHeight;
+				endPoint.iY += i * iCellHeight;
+				endPoint.iX -= ( ( i == iRowCount ) || ( i == 0 && iRowCount == 1 )
+				    ? ( lastRowIconsCount ) 
+    		    * iCellWidth : iMaxColumns * iCellWidth );
+				// sub 1 pixel to remove the gap from bottom left corners
+				--endPoint.iX;
+				gc.DrawLine( startPoint, endPoint );
+				}
+
+			//draw vertical lines
+    	for( i = 0; i <= iMaxColumns; ++i )
+				{
+				TPoint startPoint( iFirstCell.iBr.iX, iFirstCell.iTl.iY );
+				TPoint endPoint( iFirstCell.iBr.iX, iFirstCell.iTl.iY);
+				startPoint.iX -= i * iCellWidth;
+				endPoint.iX -= i * iCellWidth;
+				endPoint.iY += ( i <= lastRowIconsCount ? 
+				    iCellHeight * iRowCount : iCellHeight * ( iRowCount - 1  ) );
+				gc.DrawLine( startPoint, endPoint );
+				}
+
+			}
+
+		//draw icons
+		for( i = 0; i < iIconCount; ++i )
+			{
+			DrawItem( gc, skins, skin, cc, i, i == iCursorPos );
+			}
+		}
+	else
+		{
+		// only selection changed, highlight new pos
+		DrawItem( gc, cc != NULL, skin, cc, iCursorPos, ETrue );        
+		// and clear old
+		DrawItem( gc, cc != NULL, skin, cc, iPrevCursorPos, EFalse );
+		}
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::Draw() end") );    
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::DrawItem
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CIMCVAppSmileIconGrid::DrawItem( CWindowGc& aGc, 
+                       TBool aSkinEnabled,
+                       MAknsSkinInstance* aSkin, 
+                       MAknsControlContext* aSkinCc,
+                       TInt aIndex, TBool aSelected ) const
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::DrawItem() start") );
+    //lets count currect cell
+    TRect myRect  = iFirstCell;
+    TPoint offset;
+    
+    if(!iIsMirrored)
+    {
+    	offset.iX = ( aIndex % iMaxColumns ) * iCellWidth;	
+    }
+    else
+    {
+    	offset.iX = -(( aIndex % iMaxColumns ) * iCellWidth);
+    }
+    
+    offset.iY = aIndex / iMaxColumns * iCellHeight;
+    
+    myRect.Move( offset );
+
+    // don't draw bg/highlight over borderlines
+    TRect myHighLightRect = myRect;
+    myHighLightRect.iTl.iX++;
+    myHighLightRect.iTl.iY++;
+    
+    if( aSelected )
+        {
+        // HIGHLIGHT
+        if( !aSkinEnabled )
+            {
+            aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+            }            
+
+        TRgb color = AKN_LAF_COLOR(210);
+        AknsUtils::GetCachedColor( aSkin, color, KAknsIIDQsnIconColors,
+                                   EAknsCIQsnComponentColorsCG17 ); 
+        aGc.SetBrushColor( color );
+        aGc.Clear( myHighLightRect );                
+        }
+    else
+        {
+        TRgb color = AKN_LAF_COLOR( 0 );
+        AknsUtils::GetCachedColor( aSkin, color, KAknsIIDQsnIconColors,
+                                   EAknsCIQsnIconColorsCG1 );
+        aGc.SetBrushColor( color );
+        if ( aSkinEnabled )
+            {
+            AknsDrawUtils::Background( aSkin, aSkinCc, aGc, myHighLightRect );                    
+            }
+        else
+            {
+            aGc.DrawRect( myHighLightRect );    
+            }
+        }
+    
+    TAknWindowLineLayout myIconLayout( AknLayoutScalable_Avkon::cell_graphic2_pane_g5(0) );
+
+    TAknLayoutRect myIconRect;
+    myIconRect.LayoutRect( myRect, myIconLayout );
+
+	if( aIndex < iIconArray.Count() )
+	    {
+		myIconRect.DrawImage( aGc,
+			iIconArray[ aIndex ]->Bitmap(),
+			iIconArray[ aIndex ]->Mask() );
+	    }
+	IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::DrawItem() end") );    
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppSmileIconGrid::HandlePointerEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppSmileIconGrid::HandlePointerEventL(
+    const TPointerEvent& aPointerEvent )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::HandlePointerEventL() start") );
+    if( !IMCVUiAppUtils::PenEnabled() )
+        {
+        // Ignore event
+        //return;
+        }
+        
+    TInt oldSelection = iCursorPos;
+    TPoint hitPos = aPointerEvent.iPosition;
+    
+    // Convert XY position to linear cursor position
+    hitPos -= iFirstCell.iTl;
+    TInt xPos = hitPos.iX / iCellWidth;
+    TInt yPos = hitPos.iY / iCellHeight;
+    TInt newSelection = yPos * iMaxColumns + xPos;
+    
+    // Check that the selection is inside the grid
+    TBool validItem = xPos <= iMaxColumns - 1 &&
+                      Rng( 0, newSelection, iIconCount - 1 ) && 
+                      hitPos.iX >= 0 && 
+                      hitPos.iY >= 0;
+    if( !validItem )
+        {
+        // not valid point --> ignore event
+        return;
+        }
+        
+    // Only update if something new was selected
+    if( newSelection != oldSelection )
+        {
+        // New valid item
+        iPrevCursorPos = iCursorPos;
+        iCursorPos = newSelection;
+        iDragEvent = ETrue;
+        DrawDeferred();
+        iDragEvent = EFalse;
+        }
+    
+    // Notify observer
+    if( iTapObserver &&
+        aPointerEvent.iType == TPointerEvent::EButton1Up )
+        {
+        // Smiley was tapped
+        iTapObserver->HandleTapEventL( MIMCVTapEventObserver::ESingleTap, 
+                                       iTapControlId );
+        }
+
+    if( aPointerEvent.iType == TPointerEvent::EButton1Down )
+        {
+        // enable dragging when button1 is down
+        EnableDragEvents();
+       // single tap has to insert the smiley.
+       //  this code is not required
+       // Window().SetPointerGrab( ETrue );
+        
+        // and make sure that we get the dragging events
+     //   ClaimPointerGrab( ETrue );
+        }
+    
+    CCoeControl::HandlePointerEventL( aPointerEvent );
+    IM_CV_LOGS(TXT("CIMCVAppSmileIconGrid::HandlePointerEventL() end") );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppSmileIconGrid::SetTapObserver
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppSmileIconGrid::SetTapObserver( MIMCVTapEventObserver* aObserver, 
+                                       TUint aId )
+    {
+    iTapObserver = aObserver;
+    iTapControlId = aId;
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppSmileIconGrid::SetViewableWindowWidth
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppSmileIconGrid::SetViewableWindowWidth(TInt aViewableWidth)
+{
+    TRect parentRect( iParent->Rect() );
+
+    // listscroll_popup_graphic_pane (this compoment)
+    TAknLayoutRect listLayoutRect;
+    listLayoutRect.LayoutRect( 
+        parentRect, 
+        AknLayoutScalable_Avkon::listscroll_popup_graphic_pane() );
+	
+    // grid_graphic_popup_pane
+    TAknLayoutRect gridLayoutRect;
+    gridLayoutRect.LayoutRect( 
+        listLayoutRect.Rect(), 
+        AknLayoutScalable_Avkon::grid_graphic_popup_pane( 0 ) );
+
+	// cell_graphic_popup_pane (upper left cell)
+	TAknLayoutRect oneCellRect;
+	oneCellRect.LayoutRect( 
+        gridLayoutRect.Rect(), 
+        AknLayoutScalable_Avkon::cell_graphic_popup_pane( 0, 0, 0 ) );
+	
+	TInt cellWidth = oneCellRect.Rect().Width();
+	
+	iMaxColumns = aViewableWidth/cellWidth;    
+	
+	iRowCount = iIconCount / iMaxColumns;
+	
+    if (iIconCount % iMaxColumns)
+        {
+        iRowCount++;
+        }
+	
+}
+
+// -----------------------------------------------------------------------------
+// CIMCVAppSmileIconGrid::GetFirstCellRect
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TRect CIMCVAppSmileIconGrid::GetFirstCellRect()
+	{
+	// popup_grid_graphic_window (Parent)
+    TRect parentRect( iParent->Rect() );
+
+    // listscroll_popup_graphic_pane (this compoment)
+    TAknLayoutRect listLayoutRect;
+    listLayoutRect.LayoutRect( 
+        parentRect, 
+        AknLayoutScalable_Avkon::listscroll_popup_graphic_pane() );
+	
+    // grid_graphic_popup_pane
+    TAknLayoutRect gridLayoutRect;
+    gridLayoutRect.LayoutRect( 
+        listLayoutRect.Rect(), 
+        AknLayoutScalable_Avkon::grid_graphic_popup_pane( 0 ) );
+
+	// cell_graphic_popup_pane (upper left cell)
+	TAknLayoutRect oneCellRect;
+	oneCellRect.LayoutRect( 
+        gridLayoutRect.Rect(), 
+        AknLayoutScalable_Avkon::cell_graphic_popup_pane( 0, 0, 0 ) );
+	
+	return oneCellRect.Rect();
+	//return iFirstCell;
+	
+	}
+// End of File