/*
* Copyright 2003-2010 Tufts University Licensed under the
* Educational Community License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package tufts.vue;
/**
*
* This class essentially just a parameter block for picking LWTraversals.
*
* @version $Revision: 1.14 $ / $Date: 2010-02-03 19:17:41 $ / $Author: mike $
* @author Scott Fraize
*
*/
public class PickContext
{
public interface Acceptor {
public boolean accept(PickContext pc, LWComponent c);
}
/** Where in the tree to start picking. Usually this is top-level object in the MapViewer (the focal), but sometimes a sub-focal. */
public LWComponent root;
/** the DrawContext that produced the current display */
public final DrawContext dc;
// /** Max layer to access -- determined by the UI/viewer (currently a hack till real layers) */
// public int maxLayer = Short.MAX_VALUE;
/** 1 means top level only, 0 will pick nothing. Default is only a loop-preventing Short.MAX_VALUE. */
public int maxDepth = Short.MAX_VALUE; // we could use that to allow only root picking?
/** If true, don't pick anything that's already selected */
public boolean ignoreSelected = false;
/** If non-null, we're picking for a valid drop target for this object */
public Object dropping;
/** Don't ever pick this one particular node */
public LWComponent excluded = null;
/** If true, special picking rules for the zoomed rollover pick */
public boolean isZoomRollover;
/** Only pick instances of this type (some LWComponent subclass) */
//public Class pickType = null;
public Acceptor acceptor = null;
/** A modifier for how deep to allow the pick: mediated by the LWComponent hierarcy with pickChild/defaultPick */
public int pickDepth = 0;
/** An optional zoom scale can be provided for more accurately adjusting for slop (near misses), etc. */
public float zoom = 1f;
/** The location being picked, or start of region for region pick. */
public final float x, y;
/** If this is a region-pick, the size of the region */
public final float width, height;
public PickContext(DrawContext dc, float x, float y) {
this.dc = dc;
this.x = x;
this.y = y;
width = height = 0;
}
// public PickContext() {
// this(Float.NaN,Float.NaN);
// }
public PickContext(DrawContext dc, java.awt.geom.Rectangle2D.Float r) {
this.dc = dc;
x = r.x;
y = r.y;
width = r.width;
height = r.height;
}
public PickContext(DrawContext dc, java.awt.geom.Rectangle2D r) {
this.dc = dc;
x = (float) r.getX();
y = (float) r.getY();
width = (float) r.getWidth();
height = (float) r.getHeight();
}
public boolean isPointPick() {
return width <= 0 || height <= 0;
}
public boolean isRegionPick() {
return width > 0 && height > 0;
}
public String toString() {
return String.format("PickContext[%.1f,%.1f", x, y)
+ " root=" + root
+ " exclued=" + excluded
+ " dropping=" + dropping
+ " ignoreSelected=" + ignoreSelected
+ " pickDepth=" + pickDepth
//+ " maxLayer=" + maxLayer
+ " maxDepth=" + maxDepth
+ " acceptor=" + acceptor
//+ " pickType=" + pickType
+ "]";
}
}