rsors.CROSS );
		setUnloadWhenFinished( false );
	}

	private List calculateNewSelection( )
	{

		List newSelections = new ArrayList( );
		List children = getAllChildren( );

		// Calculate new selections based on which children fall
		// inside the marquee selection rectangle. Do not select
		// children who are not visible
		for ( int i = 0; i < children.size( ); i++ )
		{
			EditPart child = (EditPart) children.get( i );
			if ( !child.isSelectable( ) || isInTable( child ) )
				continue;
			IFigure figure = ( (GraphicalEditPart) child ).getFigure( );
			Rectangle r = figure.getBounds( ).getCopy( );
			figure.translateToAbsolute( r );

			if ( getMarqueeSelectionRectangle( ).contains( r.getTopLeft( ) )
					&& getMarqueeSelectionRectangle( ).contains( r.getBottomRight( ) )
					&& figure.isShowing( )
					&& child.getTargetEditPart( MARQUEE_REQUEST ) == child
					&& isFigureVisible( figure ) )
				newSelections.add( child );

		}
		return newSelections;
	}

	/**
	 * Judges the editpart if in table
	 * 
	 * @param child
	 * @return
	 */
	private boolean isInTable( EditPart child )
	{
		if ( child instanceof AbstractCellEditPart || child instanceof ListBandEditPart)
		{
			return true;
		}
		
		EditPart part = child.getParent( );
		if (part instanceof MultipleEditPart)
		{
			return true;
		}
		while ( part != null )
		{
			if ( part instanceof AbstractCellEditPart )
			{
				return true;
			}
			part = part.getParent( );
		}
		return false;
	}

	private Request createTargetRequest( )
	{
		return MARQUEE_REQUEST;
	}

	/**
	 * Erases feedback if necessary and puts the tool into the terminal state.
	 */
	public void deactivate( )
	{
		if ( isInState( STATE_DRAG_IN_PROGRESS ) )
		{
			eraseMarqueeFeedback( );
			eraseTargetFeedback( );
		}
		super.deactivate( );
		allChildren = new ArrayList( );
		setState( STATE_TERMINAL );
	}

	private void eraseMarqueeFeedback( )
	{
		if ( marqueeRectangleFigure != null )
		{
			removeFeedback( marqueeRectangleFigure );
			marqueeRectangleFigure = null;
		}
	}

	private void er