diff -r 000000000000 -r 2f259fa3e83a commonuisupport/grid/src/GRDCURS.CPP --- /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 +#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::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); + }