/*-
*******************************************************************************
* Copyright (c) 2011, 2014 Diamond Light Source Ltd.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Peter Chang - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.dawnsci.analysis.dataset.roi.handler;
import org.eclipse.dawnsci.analysis.dataset.roi.RectangularROI;
/**
* Wrapper class for a RectangularROI that adds handles
*/
public class RectangularROIHandler extends ROIHandler<RectangularROI> {
/**
* Number of handle areas
*/
private final static int NHANDLE = 9;
/**
* Handler for RectangularROI
* @param roi
*/
public RectangularROIHandler(RectangularROI roi) {
super();
for (int h = 0; h < NHANDLE; h++) {
add(-1);
}
this.roi = roi;
}
@Override
public int getCentreHandle() {
return 4;
}
@Override
public double[] getHandlePoint(int handle, int size) {
double[] pt = null;
switch (handle) {
case 0:
pt = roi.getPoint();
break;
case 1:
pt = roi.getPoint(0.5, 0);
pt[0] -= size/2;
break;
case 2:
pt = roi.getPoint(1.0, 0);
pt[0] -= size;
break;
case 3:
pt = roi.getPoint(0.0, 0.5);
pt[1] -= size/2;
break;
case 4:
pt = roi.getPoint(0.5, 0.5);
pt[0] -= size/2;
pt[1] -= size/2;
break;
case 5:
pt = roi.getPoint(1.0, 0.5);
pt[0] -= size;
pt[1] -= size/2;
break;
case 6:
pt = roi.getPoint(0.0, 1.0);
pt[1] -= size;
break;
case 7:
pt = roi.getPoint(0.5, 1.0);
pt[0] -= size/2;
pt[1] -= size;
break;
case 8:
pt = roi.getPoint(1.0, 1.0);
pt[0] -= size;
pt[1] -= size;
break;
}
return pt;
}
@Override
public double[] getAnchorPoint(int handle, int size) {
double[] pt = null;
switch (handle) {
case 0:
pt = roi.getPoint();
break;
case 1:
pt = roi.getPoint(0.5, 0);
break;
case 2:
pt = roi.getPoint(1.0, 0);
break;
case 3:
pt = roi.getPoint(0.0, 0.5);
break;
case 4:
pt = roi.getPoint(0.5, 0.5);
break;
case 5:
pt = roi.getPoint(1.0, 0.5);
break;
case 6:
pt = roi.getPoint(0.0, 1.0);
break;
case 7:
pt = roi.getPoint(0.5, 1.0);
break;
case 8:
pt = roi.getPoint(1.0, 1.0);
break;
}
return pt;
}
/**
* @param spt starting point
* @param pt
* @return resized ROI
*/
public RectangularROI resize(double[] spt, double[] pt) {
RectangularROI rroi = null;
double[] ept;
if (handle == 4)
return rroi;
rroi = roi.copy();
ept = rroi.getEndPoint();
switch (handle) {
case -1: // new definition
rroi.setPoint(spt);
rroi.setEndPoint(pt);
break;
case 0:
pt[0] -= spt[0];
pt[1] -= spt[1];
rroi.setPointKeepEndPoint(pt, true, true);
break;
case 1:
pt[0] -= spt[0];
pt[1] -= spt[1];
rroi.setPointKeepEndPoint(pt, false, true);
break;
case 2:
rroi.adjustKeepDiagonalPoint(spt, ept, pt, true);
break;
case 3:
pt[0] -= spt[0];
pt[1] -= spt[1];
rroi.setPointKeepEndPoint(pt, true, false);
break;
case 5:
pt[0] += ept[0] - spt[0];
pt[1] += ept[1] - spt[1];
rroi.setEndPoint(pt, true, false);
break;
case 6:
rroi.adjustKeepDiagonalPoint(spt, ept, pt, false);
break;
case 7:
pt[0] += ept[0] - spt[0];
pt[1] += ept[1] - spt[1];
rroi.setEndPoint(pt, false, true);
break;
case 8:
pt[0] += ept[0] - spt[0];
pt[1] += ept[1] - spt[1];
rroi.setEndPoint(pt, true, true);
break;
default:
break;
}
return rroi;
}
/**
* @param pt
* @return reoriented ROI
*/
public RectangularROI reorient(double[] pt) {
RectangularROI rroi = null;
if (handle == 4 || handle % 2 != 0)
return rroi;
rroi = roi.copy();
double nang, oang;
switch (handle) {
case 0: // keep end point
oang = roi.getAngleRelativeToPoint(1.0, 1.0, roi.getPoint());
nang = roi.getAngleRelativeToPoint(1.0, 1.0, pt);
rroi.addAngle(nang-oang);
rroi.setEndPointKeepLengths(roi.getEndPoint());
break;
case 2:
oang = roi.getAngleRelativeToPoint(0.0, 1.0, roi.getPoint(1.0, 0.0));
nang = roi.getAngleRelativeToPoint(0.0, 1.0, pt);
rroi.translate(0.0, 1.0);
rroi.addAngle(nang-oang);
rroi.translate(0.0, -1.0);
break;
case 6:
oang = roi.getAngleRelativeToPoint(1.0, 0.0, roi.getPoint(0.0, 1.0));
nang = roi.getAngleRelativeToPoint(1.0, 0.0, pt);
rroi.translate(1.0, 0.0);
rroi.addAngle(nang-oang);
rroi.translate(-1.0, 0.0);
break;
case 8: // keep start point
oang = roi.getAngleRelativeToPoint(0, 0, roi.getPoint(1.0, 1.0));
nang = roi.getAngleRelativeToPoint(0, 0, pt);
rroi.addAngle(nang-oang);
break;
}
return rroi;
}
@Override
public RectangularROI interpretMouseDragging(double[] spt, double[] ept) {
RectangularROI croi = null; // return null if not a valid event
switch (status) {
case RMOVE:
croi = roi.copy();
ept[0] -= spt[0];
ept[1] -= spt[1];
croi.addPoint(ept);
break;
case NONE:
croi = roi.copy();
croi.setEndPoint(ept);
break;
case REORIENT:
croi = reorient(ept);
break;
case RESIZE:
croi = resize(spt, ept);
break;
case ROTATE:
croi = roi.copy();
double ang = croi.getAngleRelativeToMidPoint(ept);
double[] mpt = croi.getMidPoint();
croi.setAngle(ang);
croi.setMidPoint(mpt);
break;
case CMOVE:
break;
case CRMOVE:
break;
}
return croi;
}
}