001 /* 002 * $Id: DragLine.java,v 1.2 2012/02/19 17:35:46 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 package edu.wisc.ssec.mcidasv.display.hydra; 031 032 import java.awt.Color; 033 import java.awt.Component; 034 import java.awt.event.ActionEvent; 035 import java.awt.event.ActionListener; 036 import java.rmi.RemoteException; 037 import java.util.ArrayList; 038 import java.util.Enumeration; 039 import java.util.HashMap; 040 import java.util.Hashtable; 041 import java.util.List; 042 import java.util.Map; 043 044 import ucar.unidata.util.LogUtil; 045 import edu.wisc.ssec.mcidasv.data.hydra.GrabLineRendererJ3D; 046 import visad.util.Util; 047 048 049 import visad.*; 050 051 052 public class DragLine extends CellImpl { 053 private final String selectorId = hashCode() + "_selector"; 054 private final String lineId = hashCode() + "_line"; 055 private final String controlId; 056 057 private ConstantMap[] mappings = new ConstantMap[5]; 058 059 private DataReference line; 060 061 private DataReference selector; 062 063 private RealType domainType; 064 private RealType rangeType; 065 066 private RealTupleType tupleType; 067 068 private LocalDisplay display; 069 070 private float[] YRANGE; 071 072 protected float lastSelectedValue; 073 074 075 public DragLine(Gridded1DSet domain, RealType domainType, RealType rangeType, 076 final float lastSelectedValue, LocalDisplay display, final String controlId, 077 final ConstantMap[] color, float[] YRANGE) throws Exception 078 { 079 if (controlId == null) 080 throw new NullPointerException("must provide a non-null control ID"); 081 if (color == null) 082 throw new NullPointerException("must provide a non-null color"); 083 084 this.controlId = controlId; 085 this.YRANGE = YRANGE; 086 this.display = display; 087 this.domainType = domainType; 088 089 090 for (int i = 0; i < color.length; i++) { 091 mappings[i] = (ConstantMap)color[i].clone(); 092 } 093 mappings[4] = new ConstantMap(-0.5, Display.YAxis); 094 095 096 tupleType = new RealTupleType(domainType, rangeType); 097 098 selector = new DataReferenceImpl(selectorId); 099 line = new DataReferenceImpl(lineId); 100 101 display.addReferences(new GrabLineRendererJ3D(domain), new DataReference[] { selector }, new ConstantMap[][] { mappings }); 102 display.addReference(line, cloneMappedColor(color)); 103 104 addReference(selector); 105 } 106 107 private static ConstantMap[] cloneMappedColor(final ConstantMap[] color) throws Exception { 108 assert color != null && color.length >= 3 : color; 109 return new ConstantMap[] { 110 (ConstantMap)color[0].clone(), 111 (ConstantMap)color[1].clone(), 112 (ConstantMap)color[2].clone(), 113 }; 114 } 115 116 public void annihilate() { 117 try { 118 display.removeReference(selector); 119 display.removeReference(line); 120 } catch (Exception e) { 121 LogUtil.logException("DragLine.annihilate", e); 122 } 123 } 124 125 public String getControlId() { 126 return controlId; 127 } 128 129 /** 130 * Handles drag and drop updates. 131 */ 132 public void doAction() throws VisADException, RemoteException { 133 setSelectedValue(getSelectedValue()); 134 } 135 136 public float getSelectedValue() { 137 float val = (float)display.getDisplayRenderer().getDirectAxisValue(domainType); 138 if (Float.isNaN(val)) 139 val = lastSelectedValue; 140 return val; 141 } 142 143 public void setSelectedValue(final float val) throws VisADException, 144 RemoteException 145 { 146 // don't do work for stupid values 147 if ((Float.isNaN(val)) 148 || (selector.getThing() != null && val == lastSelectedValue)) 149 return; 150 151 line.setData(new Gridded2DSet(tupleType, 152 new float[][] { { val, val }, { YRANGE[0], YRANGE[1] } }, 2)); 153 154 selector.setData(new Real(domainType, val)); 155 lastSelectedValue = val; 156 this.update(); 157 } 158 159 //- applications can extend and override 160 public void update() { 161 162 } 163 }