content: package com.egantt.swing.cell.editor.state.resize;
  
  import java.awt.Cursor;
  import java.awt.Point;
  import java.awt.Rectangle;
  import java.awt.event.MouseEvent;
  
  import javax.swing.JComponent;
  
  import com.egantt.model.drawing.ContextResources;
  import com.egantt.model.drawing.DrawingContext;
  import com.egantt.model.drawing.DrawingState;
  import com.egantt.model.drawing.DrawingTransform;
  import com.egantt.model.drawing.axis.AxisInterval;
  import com.egantt.model.drawing.axis.AxisView;
  import com.egantt.model.drawing.axis.MutableInterval;
  import com.egantt.model.drawing.axis.interval.LongInterval;
  
  public class ResizeFinishEditor extends AbstractResizeEditor {
  
  	boolean isMiddle = false;
  	Point originalPoint;
  	MutableInterval interval = null;
  	MutableInterval savedInterval = null;
  	
  	public void mousePressed(MouseEvent e, Rectangle bounds, DrawingState drawing, Object axisKey, DrawingContext context) {
  		this.interval =  getInterval(e.getPoint(), 5, drawing, axisKey);
  		this.originalPoint = e.getPoint();
  		this.savedInterval = (MutableInterval) interval != null ? (MutableInterval) interval.clone() : null;
  		calculateCursor(interval, bounds, 5, e, axisKey, context);
  	}
  
  	public void mouseDragged(MouseEvent e, Rectangle bounds, DrawingState drawing, Object axisKey, DrawingContext context) {
  		if (interval == null)
  			return;
  		
  		interval.setStart(savedInterval.getStart());
  		interval.setFinish(savedInterval.getFinish());
  
  		updateDrawing(interval, bounds, e, drawing, axisKey, context);
  	}
  
  	public void mouseReleased(MouseEvent e, Rectangle bounds, DrawingState drawing, Object axisKey, DrawingContext context) {
  		if (interval == null)
  			return;
  
  		interval.setStart(savedInterval.getStart());
  		interval.setFinish(savedInterval.getFinish());
  		updateDrawing(interval, bounds, e, drawing, axisKey, context);
  	}
  	
  	protected void updateDrawing(MutableInterval interval, Rectangle bounds, MouseEvent e, DrawingState drawing, Object axisKey, DrawingContext context) {
  		AxisView view = (AxisView) context.get(axisKey,
  				ContextResources.AXIS_VIEW);
  		
  		int size;
  		int pos;
  		switch (view.getOrientation()) 
  		{
  			case AxisView.HORIZONTAL: 
  				size = ((JComponent) e.getSource()).getSize().width;
  				pos = e.getPoint().x;
  				break;
  			case AxisView.VERTICAL: 
  				size = ((JComponent) e.getSource()).getSize().height;
  				pos = e.getPoint().y;
  				break;
  			default:
  				return;
  		}
  
  		DrawingTransform transform = view.getTransform();
  
  		if (isMiddle) {
  			interval.setFinish(transform.inverseTransform(pos, size));
  		}
  	}
  
  	public void mouseMoved(MouseEvent e, Rectangle bounds, DrawingState drawing, Object axisKey, DrawingContext context) {
  		AxisInterval interval = (LongInterval) getInterval(e.getPoint(),3,  drawing, axisKey);
  		
  		calculateCursor(interval, bounds, 3, e, axisKey, context);
  	}
  	
  	//	________________________________________________________________________
  	
  	protected void calculateCursor(AxisInterval interval, Rectangle bounds, int offset, MouseEvent e, Object axisKey, DrawingContext context) {
  		if (interval == null) {
  			Cursor cursor = new Cursor(Cursor.DEFAULT_CURSOR);
  		e.getComponent().setCursor(cursor);
  			return;
  		}
  
  		AxisView view = (AxisView) context.get(axisKey,
  				ContextResources.AXIS_VIEW);
  	
  		int size;
  		int pos;
  		switch (view.getOrientation()) 
  		{
  			case AxisView.HORIZONTAL: 
  				size = bounds.width;
  				pos = e.getPoint().x;
  				break;
  			case AxisView.VERTICAL: 
  				size = bounds.height;
  				pos = e.getPoint().y;
  				break;
  			default:
  				return;
  		}
  		
  		DrawingTransform transform = view.getTransform();
  		int left = transform.transform(interval.getStart(), size);
  		int right = transform.transform(interval.getFinish(), size);
  
  		isMiddle = (pos >= left - offset && pos - offset <= right) ;
  
  		if (isMiddle) {
  			Cursor cursor = new Cursor(Cursor.MOVE_CURSOR);
  			e.getComponent().setCursor(cursor);
  		}
  		else
  		{
  			Cursor cursor = new Cursor(Cursor.DEFAULT_CURSOR);
  			e.getComponent().setCursor(cursor);
  		}
  	}
  }