001 /* 002 * This file is part of McIDAS-V 003 * 004 * Copyright 2007-2013 005 * Space Science and Engineering Center (SSEC) 006 * University of Wisconsin - Madison 007 * 1225 W. Dayton Street, Madison, WI 53706, USA 008 * https://www.ssec.wisc.edu/mcidas 009 * 010 * All Rights Reserved 011 * 012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and 013 * some McIDAS-V source code is based on IDV and VisAD source code. 014 * 015 * McIDAS-V is free software; you can redistribute it and/or modify 016 * it under the terms of the GNU Lesser Public License as published by 017 * the Free Software Foundation; either version 3 of the License, or 018 * (at your option) any later version. 019 * 020 * McIDAS-V is distributed in the hope that it will be useful, 021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 023 * GNU Lesser Public License for more details. 024 * 025 * You should have received a copy of the GNU Lesser Public License 026 * along with this program. If not, see http://www.gnu.org/licenses. 027 */ 028 029 package edu.wisc.ssec.mcidasv.data.hydra; 030 031 import ucar.visad.display.LineDrawing; 032 import ucar.visad.display.Displayable; 033 034 035 import visad.*; 036 import visad.java2d.*; 037 038 import visad.java3d.*; 039 040 import visad.bom.*; 041 042 import java.rmi.RemoteException; 043 044 import java.awt.event.InputEvent; 045 046 047 /** 048 * Provides support for a Displayable that comprises a set of 049 * drawn curves. The curves can be drawn in in spherical and 050 * other non-Cartesian coordinate systems by selecting the 051 * appropriate RealTypes or RealTupleType.<P> 052 * Sample usage:<P> 053 * <PRE> 054 * CurveDrawer curveDraw = 055 * new CurveDrawer(RealType.Latitude, RealType.Longitude); 056 * curveDraw.addAction(new ActionImpl() { 057 * public void doAction() 058 * throws VisADException, RemoteException 059 * { 060 * UnionSet curves = curveDraw.getData(); 061 * (do something useful with the curves) 062 * } 063 * }); 064 * </PRE> 065 * @author Don Murray 066 * @version $Revision$ 067 */ 068 public class CurveDrawer extends LineDrawing { 069 070 /** The type for the drawing space */ 071 private RealTupleType type; 072 073 /** the set of drawn curves */ 074 private UnionSet curves; 075 076 /** mask for mouse events */ 077 private int mask; 078 079 /** data renderer */ 080 private DataRenderer curver; 081 082 /** 083 * Construct a CurveDrawer using xType as the X coordinate and 084 * yType as the Y coordinate of the box. 085 * @param xType RealType of the X coordinate of the box 086 * @param yType RealType of the Y coordinate of the box 087 * @throws VisADException VisAD error 088 * @throws RemoteException Remote error 089 */ 090 public CurveDrawer(RealType xType, RealType yType) 091 throws VisADException, RemoteException { 092 this(new RealTupleType(xType, yType), 0); 093 } 094 095 /** 096 * Construct a CurveDrawer using xType as the X coordinate and 097 * yType as the Y coordinate of the box. 098 * @param xType RealType of the X coordinate of the box 099 * @param yType RealType of the Y coordinate of the box 100 * @param mask key mask to use for mouse button 101 * @throws VisADException VisAD error 102 * @throws RemoteException Remote error 103 */ 104 public CurveDrawer(RealType xType, RealType yType, int mask) 105 throws VisADException, RemoteException { 106 this(new RealTupleType(xType, yType), mask); 107 } 108 109 /** 110 * Construct a CurveDrawer using the RealTupleType 111 * @param type RealTupleType of the drawing space 112 * @throws VisADException VisAD error 113 * @throws RemoteException Remote error 114 */ 115 public CurveDrawer(RealTupleType type) 116 throws VisADException, RemoteException { 117 this(type, 0); 118 } 119 120 /** 121 * Construct a CurveDrawer using the RealTupleType of the drawing 122 * space and a mask for the mouse 123 * @param type RealTupleType of the drawing space 124 * @param mask key mask to use for mouse button 125 * @throws VisADException VisAD error 126 * @throws RemoteException Remote error 127 */ 128 public CurveDrawer(RealTupleType type, int mask) 129 throws VisADException, RemoteException { 130 this(new UnionSet(new Gridded2DSet[]{ 131 new Gridded2DSet(type, new float[][] { 132 { 0.0f }, { 0.0f } 133 }, 1) })); 134 } 135 136 137 /** 138 * Construct a CurveDrawer with a predefined set of curves. 139 * @param curves UnionSet of curves 140 * @throws VisADException VisAD error 141 * @throws RemoteException Remote error 142 */ 143 public CurveDrawer(UnionSet curves) 144 throws VisADException, RemoteException { 145 this(curves, 0); 146 } 147 148 /** 149 * Construct a CurveDrawer with a predefined set of curves. 150 * @param curves UnionSet of curves 151 * @param mask key mask to use for mouse button 152 * 153 * @throws RemoteException Java RMI error 154 * @throws VisADException problem creating VisAD object 155 */ 156 public CurveDrawer(UnionSet curves, int mask) 157 throws VisADException, RemoteException { 158 159 super("Curve Drawer"); 160 161 this.type = ((SetType) curves.getType()).getDomain(); 162 this.mask = mask; 163 setManipulable(true); 164 setData(curves); 165 } 166 167 /** 168 * Constructor for creating a CurveDrawer from another instance 169 * @param that other instance 170 * @throws VisADException VisAD error 171 * @throws RemoteException Remote error 172 */ 173 protected CurveDrawer(CurveDrawer that) 174 throws VisADException, RemoteException { 175 176 super(that); 177 178 this.type = that.type; 179 this.curves = that.curves; 180 this.mask = that.mask; 181 } 182 183 /** 184 * Invoked when box mouse is released. Subclasses should invoke 185 * super.dataChange() to ensure the the curves are set. 186 * 187 * @throws RemoteException Java RMI error 188 * @throws VisADException problem creating VisAD object 189 */ 190 protected void dataChange() throws VisADException, RemoteException { 191 192 curves = (UnionSet) getData(); 193 super.dataChange(); 194 195 } 196 197 /** 198 * Return the curves of the CurveDrawer. The UnionSet that 199 * is returned contains the lines. 200 * @return set containing sets of curves 201 */ 202 public UnionSet getCurves() { 203 return curves; 204 } 205 206 /** 207 * Set the curves of the CurveDrawer. The input must have the 208 * same MathType as this instance. 209 * @param curves set of curves to display 210 * 211 * @throws RemoteException Java RMI error 212 * @throws VisADException problem creating VisAD object 213 */ 214 public void setCurves(UnionSet curves) 215 throws VisADException, RemoteException { 216 217 if ( !((SetType) curves.getType()).getDomain().equals(type)) { 218 throw new IllegalArgumentException("MathType of curve must be " 219 + type); 220 } 221 setData(curves); 222 } 223 224 225 /** 226 * Set whether the curves are manipulable or not. 227 * 228 * @param b true to enable 229 * 230 * @throws RemoteException Java RMI error 231 * @throws VisADException problem creating VisAD object 232 */ 233 public void setDrawingEnabled(boolean b) 234 throws VisADException, RemoteException { 235 setManipulable(b); 236 } 237 238 /** 239 * Set whether the curves are manipulable or not. 240 * @return true if drawing is enabled 241 */ 242 public boolean getDrawingEnabled() { 243 return isManipulable(); 244 } 245 246 /** 247 * Returns a clone of this instance suitable for another VisAD display. 248 * Underlying data objects are not cloned. 249 * @return A semi-deep clone of this instance. 250 * @throws VisADException VisAD failure. 251 * @throws RemoteException Java RMI failure. 252 */ 253 public Displayable cloneForDisplay() 254 throws RemoteException, VisADException { 255 return new CurveDrawer(this); 256 } 257 258 /** 259 * Returns the DataRenderer for this displayable. This method does not 260 * verify that the VisAD display has been set. 261 * @return The DataRenderer associated with this 262 * displayable. 263 */ 264 protected DataRenderer getDataRenderer() { 265 266 LocalDisplay display = getDisplay(); 267 268 return isManipulable() 269 ? (display.getDisplayRenderer() instanceof DisplayRendererJ2D) 270 ? (DataRenderer) new CurveManipulationRendererJ2D() 271 : (DataRenderer) new CurveManipulationRendererJ3D() 272 : (display.getDisplayRenderer() instanceof DisplayRendererJ2D) 273 ? (DataRenderer) new DefaultRendererJ2D() 274 : (DataRenderer) new DefaultRendererJ3D(); 275 } 276 } 277 278 279 280 281