/*
* org.openmicroscopy.shoola.util.roi.model.ROICollection
*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2007 University of Dundee. All rights reserved.
*
*
* This program 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 2 of the License, or
* (at your option) any later version.
* This program 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 this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.util.roi.model;
//Java imports
import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.TreeMap;
//Third-party libraries
//Application-internal dependencies
import org.openmicroscopy.shoola.util.roi.exception.NoSuchROIException;
import org.openmicroscopy.shoola.util.roi.exception.ROICreationException;
import org.openmicroscopy.shoola.util.roi.model.ROI;
import org.openmicroscopy.shoola.util.roi.model.ROIMap;
import org.openmicroscopy.shoola.util.roi.model.ROIRelationship;
import org.openmicroscopy.shoola.util.roi.model.ROIRelationshipList;
import org.openmicroscopy.shoola.util.roi.model.ROIRelationshipMap;
import org.openmicroscopy.shoola.util.roi.model.ROIShape;
import org.openmicroscopy.shoola.util.roi.model.ROIShapeRelationship;
import org.openmicroscopy.shoola.util.roi.model.ROIShapeRelationshipList;
import org.openmicroscopy.shoola.util.roi.model.ROIShapeRelationshipMap;
import org.openmicroscopy.shoola.util.roi.model.ShapeList;
import org.openmicroscopy.shoola.util.roi.model.util.Coord3D;
/**
*
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* <small>
* (<b>Internal version:</b> $Revision: $Date: $)
* </small>
* @since OME3.0
*/
public class ROICollection
extends Component
implements PropertyChangeListener
{
/** A TreeMap object of the ROI, id and ROIShapeList Coord Map.*/
private ROIMap roiMap;
/** The ROIRelationships Map relating ROI to relationships. */
private ROIRelationshipMap roiRelationshipMap;
/** The ROIShapeRelatiions map relating ROIShapes to Relationships. */
private ROIShapeRelationshipMap shapeRelationshipMap;
/** The last id assigned to a ROI. */
private long lastID;
/**
* The ROICollection contains the separate objects which manage the
* ROI, ROIShape and Relationships.
*
*/
public ROICollection()
{
roiMap = new ROIMap();
roiRelationshipMap = new ROIRelationshipMap();
shapeRelationshipMap = new ROIShapeRelationshipMap();
generateInitialID();
}
/**
* Create a staring ROI. This is the method that most likely will call the
* DB and get assigned an ROI. The resulting id will then offset all ROI's
* created from this point, so that when the ROIs are saved back to the DB
* the id's can map correcly to the DB's ids.
*/
private void generateInitialID()
{
lastID = 0;
}
/**
* Get the next id in the system.
* @return next id.
*/
public long getNextID()
{
lastID = lastID+1;
return lastID;
}
/**
* Returns true if the roiComponent contains the roi with id.
* @param id see above.
* @return see above.
*/
public boolean containsROI(long id)
{
return roiMap.containsROI(id);
}
/**
* Create an ROI with id. Add the ROI to the ROIMap, specifying if the ROI
* is clientside.
*
* @param id see above.
* @param clientSideObject see above.
* @param editable Flag indicating the figure can/cannot be edited.
* @param deletable Flag indicating the figure can/cannot be deleted.
* @param annotatable Flag indicating the figure can/cannot be annotated.
* @return see above.
*/
public ROI createROI(long id, boolean clientSideObject,
boolean editable, boolean deletable, boolean annotatable)
{
ROI newROI = new ROI(id, clientSideObject, editable, deletable,
annotatable);
if (lastID < id) lastID = id+1;
roiMap.add(newROI.getID(), newROI);
return newROI;
}
/**
* Create a new ROI, assign it an id and add it to the ROIMap.
* @return newly created ROI.
*/
public ROI createROI()
{
ROI newROI = new ROI(getNextID(), true, true, true, true);
roiMap.add(newROI.getID(), newROI);
return newROI;
}
/**
* Get the Map containing the ROI.
* @return return the ROIMap.
*/
public TreeMap<Long, ROI> getROIMap()
{
return roiMap.getROIMap();
}
/**
* Return the ROI with id.
* @param id see above.
* @return see above.
* @throws NoSuchROIException Throw exception if ROI does not exist.
*/
public ROI getROI(long id) throws NoSuchROIException
{
return roiMap.getROI(id);
}
/**
* Get the ROIShape with ROI id and on plane coord.
* @param id id of the ROI.
* @param coord plane where ROIShape resides.
* @return see above.
* @throws NoSuchROIException Throw exception if ROIShape does not exist.
*/
public ROIShape getShape(long id, Coord3D coord)
throws NoSuchROIException
{
return roiMap.getShape(id, coord);
}
/**
* Get the ROIShapeList for ROIShapes on plane coord
* @param coord plane where ROIShapes resides.
* @return see above.
* @throws NoSuchROIException Throw exception if no shapes on plane.
*/
public ShapeList getShapeList(Coord3D coord) throws
NoSuchROIException
{
return roiMap.getShapeList(coord);
}
/**
* Delete the ROI with id.
* @param id see above.
* @throws NoSuchROIException Throw exception if ROI does not exist.
*/
public void deleteROI(long id) throws NoSuchROIException
{
roiMap.deleteROI(id);
}
/**
* Delete the ROIShape with ROI.Id id and on plane coord. If the ROI
* will not contain any ROIShapes after this shape is deleted, delete ROI.
* @param id id of the ROI.
* @param coord coord of the ROIShape.
* @throws NoSuchROIException Throw exception if the ROI or ROIShape
* does not exist.
*/
public void deleteShape(long id, Coord3D coord)
throws NoSuchROIException
{
roiMap.deleteShape(id, coord);
}
/**
* Add the ROIShape shape to the ROI on plane coord.
* @param id id of the ROI.
* @param coord coord of the plane.
* @param shape the ROIShape.
* @throws ROICreationException Thrown if shape already exists in ROI.
* @throws NoSuchROIException Thrown if ROI does not exist.
*/
public void addShape(long id, Coord3D coord, ROIShape shape)
throws ROICreationException,
NoSuchROIException
{
roiMap.addShape(id, coord, shape);
}
/**
* Propagate the ROIShape on plane 'selectedShape' through the planes
* [start, end]
* @param id ROI id where the selected shape belongs.
* @param selectedShape The coord of the ROIShape.
* @param start the start of the plane to propagate from.
* @param end the end plane to propagate to.
* @throws ROICreationException Thrown if an ROIShape already exists in ROI
* between [start,end].
* @throws NoSuchROIException Thrown if ROI does not exist.
*/
public List<ROIShape> propagateShape(long id, Coord3D selectedShape,
Coord3D start, Coord3D end)
throws ROICreationException, NoSuchROIException
{
return roiMap.propagateShape(id, selectedShape, start, end);
}
/**
* Delete the ROIShape from the ROI from [start, end], if there are missing
* ROIShapes between [start, end] the component will to the next plane.
* @param id ROI id where the selected shape belongs.
* @param start the start of the plane to delete from.
* @param end the end plane to delete to.
* @throws NoSuchROIException Thrown if ROI does not exist.
*/
public void deleteShape(long id, Coord3D start, Coord3D end)
throws NoSuchROIException
{
roiMap.deleteShape(id, start, end);
}
/**
* Create a relationship in the ROI relationship map.
* @param relationship the relationship to add to the map.
*/
public void addROIRelationship(ROIRelationship relationship)
{
roiRelationshipMap.add(relationship);
}
/**
* Create a relationship in the ROIShape relationship map.
* @param relationship the relationship to add to the map.
*/
public void addROIShapeRelationship(ROIShapeRelationship relationship)
{
shapeRelationshipMap.add(relationship);
}
/**
* Remove relationship from the ROIRelationshipMap.
* @param relationship the id of the relationship.
*/
public void removeROIRelationship(long relationship)
{
roiRelationshipMap.remove(relationship);
}
/**
* Remove relationship from the ROIShapeRelationshipMap.
* @param relationship the id of the relationship.
*/
public void removeROIShapeRelationship(long relationship)
{
shapeRelationshipMap.remove(relationship);
}
/**
* Return true if relationship exists in the ROI relationshipmap.
* @param relationship the id of the relationship.
* @return see above.
*/
public boolean containsROIRelationship(long relationship)
{
return roiRelationshipMap.contains(relationship);
}
/**
* Return true if relationship exists in the ROIShape relationshipmap.
* @param relationship the id of the relationship.
* @return see above.
*/
public boolean containsROIShapeRelationship(long relationship)
{
return shapeRelationshipMap.contains(relationship);
}
/**
* Get the ROIRelationshipList, the list of all relationships
* associated with the ROI.
* @param roiID the id of the ROI.
* @return see above.
*/
public ROIRelationshipList getROIRelationshipList(long roiID)
{
return roiRelationshipMap.getRelationshipList(roiID);
}
/**
* Get the ROIShapeRelationshipList, the list of all relationships
* associated with the ROIShapes of ROI.
* @param roiID the id of the ROI.
* @return see above.
*/
public ROIShapeRelationshipList getROIShapeRelationshipList(long roiID)
{
return shapeRelationshipMap.getRelationshipList(roiID);
}
/* (non-Javadoc)
* @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt) {
// TODO Auto-generated method stub
}
}