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 MoveResizeEditor extends AbstractResizeEditor {
boolean isFinish = false;
boolean isStart = false;
boolean isMiddle = false;
Point originalPoint;
MutableInterval interval = null;
private MutableInterval savedInterval;
// ________________________________________________________________________
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;
int originalPos;
switch (view.getOrientation())
{
case AxisView.HORIZONTAL:
size = ((JComponent) e.getSource()).getSize().width;
pos = e.getPoint().x;
originalPos = originalPoint.x;
break;
case AxisView.VERTICAL:
size = ((JComponent) e.getSource()).getSize().height;
pos = e.getPoint().y;
originalPos = originalPoint.y;
break;
default:
return;
}
DrawingTransform transform = view.getTransform();
int startX = transform.transform(interval.getStart(), size);
int finishX = transform.transform(interval.getFinish(), size);
if (isStart)
interval.setStart(transform.inverseTransform(startX - ((originalPos - pos) *2), size));
else if (isFinish)
interval.setFinish(transform.inverseTransform(finishX - ((originalPos - pos)*2), size));
else if (isMiddle) {
Object start = transform.inverseTransform(startX
- (originalPos - pos), size);
if (!view.getAxis().getInterval().containsValue(start))
return;
Object finish = transform.inverseTransform(finishX
- (originalPos - pos), size);
if (!view.getAxis().getInterval().containsValue(finish))
return;
interval.setStart(start);
interval.setFinish(finish);
}
}
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);
isStart = (pos + offset >= left && pos - offset <= left);
isFinish = (pos + offset >= right && pos - offset <= right);
isMiddle = (pos >= left && pos <= right) && (!isStart) && (!isFinish);
if (isStart) {
Cursor cursor;
if (view.getOrientation() == AxisView.VERTICAL)
cursor = new Cursor(Cursor.N_RESIZE_CURSOR);
else
cursor = new Cursor(Cursor.W_RESIZE_CURSOR);
e.getComponent().setCursor(cursor);
}
else if (isFinish)
{
Cursor cursor;
if (view.getOrientation() == AxisView.VERTICAL)
cursor = new Cursor(Cursor.S_RESIZE_CURSOR);
else
cursor = new Cursor(Cursor.E_RESIZE_CURSOR);
e.getComponent().setCursor(cursor);
}
else 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);
}
}
}