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