VALID );
			handleInvalidInput( );
		}
		if ( stateTransition( STATE_INITIAL, STATE_DRAG_IN_PROGRESS ) )
		{
			if ( getCurrentInput( ).isControlKeyDown( ) )
				setSelectionMode( TOGGLE_MODE );
			else if ( getCurrentInput( ).isShiftKeyDown( ) )
				setSelectionMode( APPEND_MODE );
		}
		return true;
	}

	/**
	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int)
	 */
	protected boolean handleButtonUp( int button )
	{
		if ( stateTransition( STATE_DRAG_IN_PROGRESS, STATE_TERMINAL ) )
		{
			eraseTargetFeedback( );
			eraseMarqueeFeedback( );
			performMarqueeSelect( );
		}
		handleFinished( );
		return true;
	}

	/**
	 * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
	 */
	protected boolean handleDragInProgress( )
	{
		if ( isInState( STATE_DRAG | STATE_DRAG_IN_PROGRESS ) )
		{
			showMarqueeFeedback( );
			eraseTargetFeedback( );
			selectedEditParts = calculateNewSelection( );
			showTargetFeedback( );
		}
		return true;
	}

	/**
	 * @see org.eclipse.gef.tools.AbstractTool#handleFocusLost()
	 */
	protected boolean handleFocusLost( )
	{
		if ( isInState( STATE_DRAG | STATE_DRAG_IN_PROGRESS ) )
		{
			handleFinished( );
			return true;
		}
		return false;
	}

	/**
	 * This method is called when mouse or keyboard input is invalid and erases
	 * the feedback.
	 * 
	 * @return <code>true</code>
	 */
	protected boolean handleInvalidInput( )
	{
		eraseTargetFeedback( );
		eraseMarqueeFeedback( );
		return true;
	}

	/**
	 * Handles high-level processing of a key down event. KeyEvents are
	 * forwarded to the current viewer's {@link KeyHandler}, via
	 * {@link KeyHandler#keyPressed(KeyEvent)}.
	 * 
	 * @see AbstractTool#handleKeyDown(KeyEvent)
	 */
	protected boolean handleKeyDown( KeyEvent e )
	{
		if ( super.handleKeyDown( e ) )
			return true;
		if ( getCurrentViewer( ).getKeyHandler( ) != null
				&& getCurrentViewer( ).getKeyHandler( ).keyPressed( e ) )
			return true;
		return false;
	}

	private boolean isFigureVisible( IFigure fig )
	{
		Rectangle figBounds = fig.getBounds( ).getCopy( 