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