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); } } }