commonuisupport/grid/src/GRDCURS.CPP
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuisupport/grid/src/GRDCURS.CPP	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,262 @@
+// Copyright (c) 1997-2009 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:
+//
+
+// This module contains all the main logic connected with movement and selection in CGridImg.
+//
+#include "GRDSTD.H"
+#include "GRDPANIC.H"
+
+#if !defined(__WINC__)
+#include <w32std.h>
+#endif
+
+
+GLREF_C void CleanupGc(TAny* aObject);
+
+void CGridImg::DrawCursorOrRegionL(TUint aMoveFlags)
+	{
+	//
+	// Does the appropriate operation on the cursor given the conditions in the parameters
+	//
+	if (iGridLay->IsRowPermanentlySelected())
+		aMoveFlags|=EIsRowSelected;
+	RRegion oldRegion;
+	CleanupClose<RRegion>::PushL(oldRegion);
+	AppendTotalHighlightRegionL(oldRegion);
+	TInt oldCursorRow=iCursorPos.iRow;
+	TInt selectCount=iSelected->Count();
+	if (selectCount)
+		{
+		if (aMoveFlags&EIsWithSelect)
+			{
+			if (aMoveFlags&EIsAtBoundary)
+				iNewCursorPos = iCursorPos;
+			else 
+				UpdateSelectedRegion(selectCount,aMoveFlags);
+			}
+		else
+			{
+			if (aMoveFlags&EIsWithControl)
+				{
+				if (aMoveFlags&(EIsRowSelected|EIsColumnSelected))
+					AddLabelToRegionL(aMoveFlags);
+				else
+					{
+					iAnchorPos=iCursorPos=iNewCursorPos;
+					StartSelectedRegionL(aMoveFlags);
+					}
+				}
+			else
+				{
+ 				iSelected->Reset();
+				if ((aMoveFlags&(EIsRowSelected|EIsColumnSelected)) && (!(aMoveFlags&EIsAtBoundary)
+					|| iGridLay->IsRowPermanentlySelected()))
+					{
+					AddLabelToRegionL(aMoveFlags);
+					}
+				else
+					{
+					if (aMoveFlags&EIsAtBoundary)
+						iNewCursorPos=iCursorPos=iAnchorPos;
+					else
+						iCursorPos=iNewCursorPos;
+					}
+				}
+			}
+		}
+	else
+		{
+		if (aMoveFlags&EIsAtBoundary)
+			iNewCursorPos = iCursorPos;
+		else
+			{
+			if (aMoveFlags&(EIsWithSelect|EIsWithControl))
+				{
+				if (aMoveFlags&EIsWithSelect)
+					StartSelectedRegionL(aMoveFlags);
+				else
+					{
+					if (aMoveFlags&(EIsRowSelected|EIsColumnSelected))
+						AddLabelToRegionL(aMoveFlags);
+					else
+						{
+						iAnchorPos=iCursorPos=iNewCursorPos;
+						StartSelectedRegionL(aMoveFlags);
+						}
+					}
+				}
+			else
+				{
+				if (aMoveFlags&(EIsRowSelected|EIsColumnSelected))
+					AddLabelToRegionL(aMoveFlags);
+				else
+					iCursorPos = iNewCursorPos;
+				}
+			}
+		}
+	if (iCursorPos.iRow!=oldCursorRow || aMoveFlags&EIsColumnSelected)
+		{
+		RemoveRowLabelFromRegionL(oldCursorRow,oldRegion);
+		RemoveRowLabelFromRegionL(iCursorPos.iRow,oldRegion);
+#if !defined(__WINC__)
+		CreateGc(iGc);
+		CleanupStack::PushL(TCleanupItem(CleanupGc,this));
+		DrawSideGridLabelIfOnScreenL(oldCursorRow);
+		DrawSideGridLabelIfOnScreenL(iCursorPos.iRow);
+		CleanupStack::PopAndDestroy();	// gc cleanup
+#endif
+		}
+	HighlightNewRegionFromOldL(oldRegion);
+	CleanupStack::PopAndDestroy();	// oldRegion
+	}
+
+void CGridImg::UpdateSelectedRegion(TInt aSelectCount,TUint aMoveFlags)
+	{
+	//
+	// Updates the latest selected region in accordance with the passed parameters.
+	//
+	__ASSERT_DEBUG(aSelectCount>0,Panic(ECellRegionNothingSelected));
+
+	TRangeRef range = (*iSelected)[aSelectCount-1];
+	TRangeRef bounds(iGridLay->GridRange());
+	if (aMoveFlags&EIsAbsoluteMove)
+		{
+		if (((aMoveFlags&(EIsColumnSelected|EIsRowSelected|EIsWithDrag))==EIsColumnSelected)
+			|| (iSelected->IsColSelectedLastIndex(iCursorPos.iCol) && (aMoveFlags&EIsWithDrag)
+			&& !iSelected->IsRowSelectedLastIndex(iCursorPos.iRow)))
+			{
+			iGridLay->LimitCell(iNewCursorPos);
+			range.iFrom.iCol = Min(iAnchorPos.iCol, iNewCursorPos.iCol);
+			range.iTo.iCol = Max(iAnchorPos.iCol, iNewCursorPos.iCol);
+			range.iFrom.iRow = bounds.iFrom.iRow;
+			range.iTo.iRow = bounds.iTo.iRow;
+			iCursorPos.iCol = iNewCursorPos.iCol;
+			iNewCursorPos.iRow = iCursorPos.iRow;
+			}
+		else if (((aMoveFlags&(EIsRowSelected|EIsColumnSelected|EIsWithDrag))==EIsRowSelected)
+			|| (iSelected->IsRowSelectedLastIndex(iCursorPos.iRow) && (aMoveFlags&EIsWithDrag)
+			&& !iSelected->IsColSelectedLastIndex(iCursorPos.iCol)))
+			{
+			iGridLay->LimitCell(iNewCursorPos);
+			range.iFrom.iRow = Min(iAnchorPos.iRow, iNewCursorPos.iRow);
+			range.iTo.iRow = Max(iAnchorPos.iRow, iNewCursorPos.iRow);
+			range.iFrom.iCol = bounds.iFrom.iCol;
+			range.iTo.iCol = bounds.iTo.iCol;
+			iCursorPos.iRow = iNewCursorPos.iRow;
+			iNewCursorPos.iCol = iCursorPos.iCol;
+			}
+		else if ((aMoveFlags&(EIsRowSelected|EIsColumnSelected|EIsWithDrag))==
+			(EIsRowSelected|EIsColumnSelected))
+			{
+			range = bounds;
+			iNewCursorPos = iCursorPos = bounds.iTo;
+			}
+		else if (!(iSelected->IsRangeSelectedLastIndex(iGridLay->GridRange()) &&
+			(aMoveFlags&EIsWithDrag)))
+			{
+			iGridLay->LimitCell(iNewCursorPos);
+ 			range.iFrom.iCol = Min(iAnchorPos.iCol, iNewCursorPos.iCol);
+			range.iTo.iCol = Max(iAnchorPos.iCol, iNewCursorPos.iCol);
+   			range.iFrom.iRow = Min(iAnchorPos.iRow, iNewCursorPos.iRow);
+			range.iTo.iRow = Max(iAnchorPos.iRow, iNewCursorPos.iRow);
+			iCursorPos = iNewCursorPos;
+			}
+		}
+	else
+		{
+		if (iNewCursorPos.iRow != iCursorPos.iRow)
+			{
+ 			range.iFrom.iRow = Min(iAnchorPos.iRow, iNewCursorPos.iRow);
+			range.iTo.iRow = Max(iAnchorPos.iRow, iNewCursorPos.iRow);
+			iCursorPos.iRow = iNewCursorPos.iRow;
+			}
+		if (iNewCursorPos.iCol != iCursorPos.iCol && !iGridLay->IsRowPermanentlySelected())
+			{
+ 			range.iFrom.iCol = Min(iAnchorPos.iCol, iNewCursorPos.iCol);
+			range.iTo.iCol = Max(iAnchorPos.iCol, iNewCursorPos.iCol);
+			iCursorPos.iCol = iNewCursorPos.iCol;
+			}
+		}
+	iSelected->SetLastCellRange(range);
+	}
+
+void CGridImg::AddLabelToRegionL(TUint aMoveFlags)
+	{
+	//
+	// Adds an entire row/column/grid to the selected region 
+	// depending on iNewCursorPos
+	//
+	if ((aMoveFlags&(EIsRowSelected|EIsColumnSelected))==(EIsRowSelected|EIsColumnSelected))
+		{
+		TRangeRef gridRange=iGridLay->GridRange();
+		iSelected->AddCellRangeL(gridRange);
+		iAnchorPos.iRow=(iGridLay->IsHorizontalTitleLine()) ? iGridLay->TitleRange().iFrom.iRow
+			: iGridLay->VisibleRange().iFrom.iRow;
+		iAnchorPos.iCol=(iGridLay->IsVerticalTitleLine()) ? iGridLay->TitleRange().iFrom.iCol
+			: iGridLay->VisibleRange().iFrom.iCol;
+		iCursorPos=iNewCursorPos=iGridLay->GridRange().iTo;
+		}
+	else if (aMoveFlags&EIsColumnSelected)
+		{
+		iSelected->AddColL(iNewCursorPos.iCol);
+		iAnchorPos.iCol = iCursorPos.iCol = iNewCursorPos.iCol;
+		iAnchorPos.iRow=(iGridLay->IsHorizontalTitleLine()) ? iGridLay->TitleRange().iFrom.iRow
+			: iGridLay->VisibleRange().iFrom.iRow;
+		iCursorPos.iRow = iNewCursorPos.iRow = iGridLay->GridRange().iTo.iRow;
+		}
+	else if (aMoveFlags&EIsRowSelected)
+		{
+		iSelected->AddRowL(iNewCursorPos.iRow);
+		iAnchorPos.iRow = iCursorPos.iRow = iNewCursorPos.iRow;
+		iAnchorPos.iCol=(iGridLay->IsVerticalTitleLine()) ? iGridLay->TitleRange().iFrom.iCol
+			: iGridLay->VisibleRange().iFrom.iCol;
+		iCursorPos.iCol = iNewCursorPos.iCol = iGridLay->GridRange().iTo.iCol;
+		}
+	}
+
+void CGridImg::StartSelectedRegionL(TUint aMoveFlags)
+	{
+	//
+	// Sets the anchor to the current cursor position and selects the region between
+	// the anchor and the new cursor position
+	//
+	if (aMoveFlags&(EIsRowSelected|EIsColumnSelected) && (aMoveFlags&EIsWithDrag))
+		return;
+	iAnchorPos = iCursorPos;
+	iCursorPos = iNewCursorPos;
+	TRangeRef range;
+	if ((aMoveFlags&EIsColumnSelected) && (aMoveFlags&EIsRowSelected))
+		range = iGridLay->GridRange();
+	else
+		{
+		range.iFrom.iRow = Min(iAnchorPos.iRow, iNewCursorPos.iRow);
+		range.iTo.iRow = Max(iAnchorPos.iRow, iNewCursorPos.iRow);
+		range.iFrom.iCol = Min(iAnchorPos.iCol, iNewCursorPos.iCol);
+		range.iTo.iCol = Max(iAnchorPos.iCol, iNewCursorPos.iCol);
+		if (aMoveFlags&EIsRowSelected)
+			{
+			TRangeRef gridRange=iGridLay->GridRange();
+			range.iFrom.iCol = gridRange.iFrom.iCol;
+			range.iTo.iCol = gridRange.iTo.iCol;
+			}
+		if (aMoveFlags&EIsColumnSelected)
+			{
+			TRangeRef gridRange=iGridLay->GridRange();
+	   		range.iFrom.iRow = gridRange.iFrom.iRow;
+			range.iTo.iRow = gridRange.iTo.iRow;
+			}
+		}
+	iSelected->AddCellRangeL(range);
+	}