/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.canvas;
import icy.gui.viewer.Viewer;
import icy.sequence.DimensionId;
import icy.type.point.Point3D;
import icy.type.rectangle.Rectangle3D;
import java.awt.Point;
/**
* @author Stephane
*/
public abstract class IcyCanvas3D extends IcyCanvas
{
/**
*
*/
private static final long serialVersionUID = 6001100311244609559L;
/** mouse position (image coordinate space) */
protected Point3D.Double mouseImagePos;
public IcyCanvas3D(Viewer viewer)
{
super(viewer);
// default for 3D canvas
posX = -1;
posY = -1;
posZ = -1;
posT = 0;
// initial mouse position
mouseImagePos = new Point3D.Double();
}
@Override
public void setPositionT(int t)
{
// position -1 not supported for T dimension on this canvas
if (t != -1)
super.setPositionT(t);
}
@Override
public double getMouseImagePosX()
{
// can be called before constructor ended
if (mouseImagePos == null)
return 0d;
return mouseImagePos.x;
}
@Override
public double getMouseImagePosY()
{
// can be called before constructor ended
if (mouseImagePos == null)
return 0d;
return mouseImagePos.y;
}
@Override
public double getMouseImagePosZ()
{
// can be called before constructor ended
if (mouseImagePos == null)
return 0d;
return mouseImagePos.z;
}
/**
* Return mouse image position
*/
public Point3D.Double getMouseImagePos()
{
return (Point3D.Double) mouseImagePos.clone();
}
public void setMouseImagePos(double x, double y, double z)
{
if ((mouseImagePos.x != x) || (mouseImagePos.y != y) || (mouseImagePos.z != z))
{
mouseImagePos.x = x;
mouseImagePos.y = y;
mouseImagePos.z = z;
// direct update of mouse canvas position
mousePos = imageToCanvas(mouseImagePos);
// notify change
mouseImagePositionChanged(DimensionId.NULL);
}
}
/**
* Set mouse image position
*/
public void setMouseImagePos(Point3D.Double point)
{
setMouseImagePos(point.x, point.y, point.z);
}
@Override
public boolean setMousePos(int x, int y)
{
final boolean result = super.setMousePos(x, y);
if (result)
{
if (mouseImagePos == null)
mouseImagePos = new Point3D.Double();
final Point3D newPos = canvasToImage(mousePos);
final double newX = newPos.getX();
final double newY = newPos.getY();
final double newZ = newPos.getZ();
boolean changed = false;
// need to check against NaN is conversion is not supported
if (!Double.isNaN(newX) && (newX != mouseImagePos.x))
{
mouseImagePos.x = newX;
changed = true;
}
// need to check against NaN is conversion is not supported
if (!Double.isNaN(newY) && (newY != mouseImagePos.y))
{
mouseImagePos.y = newY;
changed = true;
}
// need to check against NaN is conversion is not supported
if (!Double.isNaN(newZ) && (newZ != mouseImagePos.z))
{
mouseImagePos.z = newZ;
changed = true;
}
// notify change
if (changed)
mouseImagePositionChanged(DimensionId.NULL);
}
return result;
}
/**
* Convert specified image point to canvas point.
*/
@SuppressWarnings("static-method")
public Point imageToCanvas(double x, double y, double z)
{
// default implementation, must be override in IcyCanvas3D implementation
return new Point(0, 0);
}
/**
* Convert specified image point to canvas point
*/
public Point imageToCanvas(Point3D.Double point)
{
return imageToCanvas(point.x, point.y, point.z);
}
/**
* Convert specified canvas point to image point
*/
@SuppressWarnings("static-method")
public Point3D.Double canvasToImage(int x, int y)
{
// default implementation, must be override in IcyCanvas3D implementation
return new Point3D.Double(0d, 0d, 0d);
}
/**
* Convert specified canvas point to image point
*/
public Point3D.Double canvasToImage(Point point)
{
return canvasToImage(point.x, point.y);
}
/**
* Adjust view position and possibly scaling factor to ensure the specified region become visible.<br>
* It's up to the Canvas implementation to decide how to make the region visible.
*
* @param region
* the region we want to see
*/
public void centerOn(Rectangle3D.Integer region)
{
// override it in Canvas implementation
}
}