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 package edu.wisc.ssec.mcidasv.control; 029 030 import java.awt.Container; 031 import java.awt.FlowLayout; 032 import java.awt.event.ActionEvent; 033 import java.awt.event.ActionListener; 034 import java.rmi.RemoteException; 035 import java.util.Iterator; 036 037 import javax.swing.Box; 038 import javax.swing.JButton; 039 import javax.swing.JLabel; 040 import javax.swing.JPanel; 041 import javax.swing.JTextField; 042 043 import net.miginfocom.swing.MigLayout; 044 045 import ucar.unidata.data.DataChoice; 046 import ucar.unidata.data.DataSelection; 047 import ucar.unidata.idv.control.DisplayControlImpl; 048 import ucar.unidata.util.ColorTable; 049 import ucar.unidata.util.LogUtil; 050 import ucar.visad.display.DisplayMaster; 051 052 import visad.BaseColorControl; 053 import visad.CoordinateSystem; 054 import visad.Data; 055 import visad.FieldImpl; 056 import visad.FlatField; 057 import visad.FunctionType; 058 import visad.ScalarMap; 059 import visad.ScalarMapControlEvent; 060 import visad.ScalarMapEvent; 061 import visad.ScalarMapListener; 062 import visad.VisADException; 063 import visad.georef.MapProjection; 064 065 import edu.wisc.ssec.mcidasv.data.hydra.ImageRGBDisplayable; 066 067 public class RGBCompositeControl extends DisplayControlImpl { 068 069 /** Displayable for the data */ 070 private ImageRGBDisplayable imageDisplay; 071 072 private DisplayMaster displayMaster; 073 074 private ScalarMap redMap = null; 075 private ScalarMap grnMap = null; 076 private ScalarMap bluMap = null; 077 078 float[][] redTable = null; 079 float[][] grnTable = null; 080 float[][] bluTable = null; 081 082 final private double[] redRange = new double[] {Double.NaN, Double.NaN}; 083 final private double[] grnRange = new double[] {Double.NaN, Double.NaN}; 084 final private double[] bluRange = new double[] {Double.NaN, Double.NaN}; 085 086 final double[] initRedRange = new double[] {Double.NaN, Double.NaN}; 087 final double[] initGrnRange = new double[] {Double.NaN, Double.NaN}; 088 final double[] initBluRange = new double[] {Double.NaN, Double.NaN}; 089 090 private FieldImpl imageField = null; 091 private MapProjection mapProjection = null; 092 093 private double gamma = 1.0; 094 095 private double redGamma = 1.0; 096 private double grnGamma = 1.0; 097 private double bluGamma = 1.0; 098 099 private final JTextField gammaTxtFld = 100 new JTextField(Float.toString(1f), 4); 101 private final JTextField redGammaTxtFld = 102 new JTextField(Float.toString(1f), 4); 103 private final JTextField grnGammaTxtFld = 104 new JTextField(Float.toString(1f), 4); 105 private final JTextField bluGammaTxtFld = 106 new JTextField(Float.toString(1f), 4); 107 108 private final JTextField redLowTxtFld = 109 new JTextField(Float.toString(1f), 10); 110 private final JTextField redHighTxtFld = 111 new JTextField(Float.toString(1f), 10); 112 private final JTextField grnLowTxtFld = 113 new JTextField(Float.toString(1f), 10); 114 private final JTextField grnHighTxtFld = 115 new JTextField(Float.toString(1f), 10); 116 private final JTextField bluLowTxtFld = 117 new JTextField(Float.toString(1f), 10); 118 private final JTextField bluHighTxtFld = 119 new JTextField(Float.toString(1f), 10); 120 121 public RGBCompositeControl() { 122 super(); 123 } 124 125 public boolean init(DataChoice dataChoice) throws VisADException, RemoteException { 126 displayMaster = getViewManager().getMaster(); 127 DataSelection dataSelection = getDataSelection(); 128 imageField = (FieldImpl) dataChoice.getData(dataSelection); 129 130 131 imageDisplay = new ImageRGBDisplayable("rgb composite", null, false, imageField); 132 133 Iterator iter = imageDisplay.getScalarMapSet().iterator(); 134 while (iter.hasNext()) { 135 ScalarMap map = (ScalarMap) iter.next(); 136 if (map.getScalarName().startsWith("redimage")) { 137 redMap = map; 138 } 139 if (map.getScalarName().startsWith("greenimage")) { 140 grnMap = map; 141 } 142 if (map.getScalarName().startsWith("blueimage")) { 143 bluMap = map; 144 } 145 } 146 147 if (checkRange()) { //- from unpersistence if true, initialize gui, ScalarMaps 148 double[] redRange = getRedRange(); 149 double[] grnRange = getGrnRange(); 150 double[] bluRange = getBluRange(); 151 152 initRedRange[0] = redRange[0]; 153 initRedRange[1] = redRange[1]; 154 initGrnRange[0] = grnRange[0]; 155 initGrnRange[1] = grnRange[1]; 156 initBluRange[0] = bluRange[0]; 157 initBluRange[1] = bluRange[1]; 158 159 redLowTxtFld.setText(Float.toString((float)redRange[0])); 160 redHighTxtFld.setText(Float.toString((float)redRange[1])); 161 grnLowTxtFld.setText(Float.toString((float)grnRange[0])); 162 grnHighTxtFld.setText(Float.toString((float)grnRange[1])); 163 bluLowTxtFld.setText(Float.toString((float)bluRange[0])); 164 bluHighTxtFld.setText(Float.toString((float)bluRange[1])); 165 166 gammaTxtFld.setText(Float.toString((float)gamma)); 167 redGammaTxtFld.setText(Float.toString((float)redGamma)); 168 grnGammaTxtFld.setText(Float.toString((float)grnGamma)); 169 bluGammaTxtFld.setText(Float.toString((float)bluGamma)); 170 171 redMap.setRange(redRange[0], redRange[1]); 172 grnMap.setRange(grnRange[0], grnRange[1]); 173 bluMap.setRange(bluRange[0], bluRange[1]); 174 } 175 else { 176 redMap.resetAutoScale(); 177 grnMap.resetAutoScale(); 178 bluMap.resetAutoScale(); 179 180 redMap.addScalarMapListener(new ColorMapListener(redMap, initRedRange, redRange, redLowTxtFld, redHighTxtFld)); 181 grnMap.addScalarMapListener(new ColorMapListener(grnMap, initGrnRange, grnRange, grnLowTxtFld, grnHighTxtFld)); 182 bluMap.addScalarMapListener(new ColorMapListener(bluMap, initBluRange, bluRange, bluLowTxtFld, bluHighTxtFld)); 183 } 184 185 setShowInDisplayList(true); 186 187 addDisplayable(imageDisplay, FLAG_COLORTABLE); 188 189 return true; 190 } 191 192 public void initDone() { 193 while (true) { 194 if (null != redMap.getControl()) { 195 redTable = ((BaseColorControl) redMap.getControl()).getTable(); 196 break; 197 } 198 } 199 while (true) { 200 if (null != grnMap.getControl()) { 201 grnTable = ((BaseColorControl) grnMap.getControl()).getTable(); 202 break; 203 } 204 } 205 while (true) { 206 if (null != bluMap.getControl()) { 207 bluTable = ((BaseColorControl) bluMap.getControl()).getTable(); 208 break; 209 } 210 } 211 212 float[][] newRedTbl = getZeroOutArray(redTable); 213 float[][] newGrnTbl = getZeroOutArray(grnTable); 214 float[][] newBluTbl = getZeroOutArray(bluTable); 215 216 for (int k=0; k<redTable[0].length; k++) { 217 newRedTbl[0][k] = (float) Math.pow(redTable[0][k], redGamma); 218 newGrnTbl[1][k] = (float) Math.pow(grnTable[1][k], grnGamma); 219 newBluTbl[2][k] = (float) Math.pow(bluTable[2][k], bluGamma); 220 } 221 222 try { 223 displayMaster.setDisplayInactive(); 224 ((BaseColorControl)redMap.getControl()).setTable(newRedTbl); 225 ((BaseColorControl)grnMap.getControl()).setTable(newGrnTbl); 226 ((BaseColorControl)bluMap.getControl()).setTable(newBluTbl); 227 imageDisplay.loadData(imageField); 228 displayMaster.setDisplayActive(); 229 } catch(Exception ex) { 230 LogUtil.logException("setDisplayInactive", ex); 231 } 232 } 233 234 public MapProjection getDataProjection() { 235 CoordinateSystem cs = null; 236 try { 237 if (imageField instanceof FlatField) { 238 cs = ((FunctionType)imageField.getType()).getDomain().getCoordinateSystem(); 239 } 240 else if (imageField instanceof FieldImpl) { 241 Data dat = imageField.getSample(0, false); 242 if (dat instanceof FlatField) { 243 FlatField img = (FlatField) dat; 244 cs = ((FunctionType)img.getType()).getDomain().getCoordinateSystem(); 245 } 246 } 247 } 248 catch (Exception ex) { 249 LogUtil.logException("problem accessing data", ex); 250 } 251 252 if (cs instanceof MapProjection) mapProjection = (MapProjection) cs; 253 254 return mapProjection; 255 } 256 257 boolean checkRange() { 258 if (Double.isNaN(redRange[0]) || Double.isNaN(grnRange[0]) || Double.isNaN(bluRange[0])) { 259 return false; 260 } 261 else { 262 return true; 263 } 264 } 265 266 private void updateRedRange(double lo, double hi) { 267 redRange[0] = lo; 268 redRange[1] = hi; 269 try { 270 redMap.setRange(lo, hi); 271 } catch (VisADException ex) { 272 LogUtil.logException("redMap.setRange", ex); 273 } catch (RemoteException ex) { 274 LogUtil.logException("redMap.setRange", ex); 275 } 276 } 277 278 public void setRedRange(double[] range) { 279 redRange[0] = range[0]; 280 redRange[1] = range[1]; 281 } 282 283 public double[] getRedRange() { 284 return new double[] {redRange[0], redRange[1]}; 285 } 286 287 private void updateGrnRange(double lo, double hi) { 288 grnRange[0] = lo; 289 grnRange[1] = hi; 290 try { 291 grnMap.setRange(lo, hi); 292 } catch (VisADException ex) { 293 LogUtil.logException("grnMap.setRange", ex); 294 } catch (RemoteException ex) { 295 LogUtil.logException("grnMap.setRange", ex); 296 } 297 } 298 299 public void setGrnRange(double[] range) { 300 grnRange[0] = range[0]; 301 grnRange[1] = range[1]; 302 } 303 304 public double[] getGrnRange() { 305 return new double[] {grnRange[0], grnRange[1]}; 306 } 307 308 private void updateBluRange(double lo, double hi) { 309 bluRange[0] = lo; 310 bluRange[1] = hi; 311 try { 312 bluMap.setRange(lo, hi); 313 } catch (VisADException ex) { 314 LogUtil.logException("bluMap.setRange", ex); 315 } catch (RemoteException ex) { 316 LogUtil.logException("bluMap.setRange", ex); 317 } 318 } 319 320 public void setBluRange(double[] range) { 321 bluRange[0] = range[0]; 322 bluRange[1] = range[1]; 323 } 324 325 public double[] getBluRange() { 326 return new double[] {bluRange[0], bluRange[1]}; 327 } 328 329 public void setRedGamma(double gamma) { 330 redGamma = gamma; 331 } 332 333 public double getRedGamma() { 334 return redGamma; 335 } 336 337 public void setGrnGamma(double gamma) { 338 grnGamma = gamma; 339 } 340 341 public double getGrnGamma() { 342 return grnGamma; 343 } 344 345 public void setBluGamma(double gamma) { 346 bluGamma = gamma; 347 } 348 349 public double getBluGamma() { 350 return bluGamma; 351 } 352 353 public void setGamma(double gamma) { 354 this.gamma = gamma; 355 } 356 357 public double getGamma() { 358 return gamma; 359 } 360 361 private void updateGamma(double gamma) { 362 setGamma(gamma); 363 setRedGamma(gamma); 364 setGrnGamma(gamma); 365 setBluGamma(gamma); 366 redGammaTxtFld.setText(Float.toString((float)gamma)); 367 grnGammaTxtFld.setText(Float.toString((float)gamma)); 368 bluGammaTxtFld.setText(Float.toString((float)gamma)); 369 370 float[][] newRedTbl = getZeroOutArray(redTable); 371 float[][] newGrnTbl = getZeroOutArray(grnTable); 372 float[][] newBluTbl = getZeroOutArray(bluTable); 373 374 for (int k=0; k<redTable[0].length; k++) { 375 newRedTbl[0][k] = (float) Math.pow(redTable[0][k], gamma); 376 newGrnTbl[1][k] = (float) Math.pow(grnTable[1][k], gamma); 377 newBluTbl[2][k] = (float) Math.pow(bluTable[2][k], gamma); 378 } 379 try { 380 displayMaster.setDisplayInactive(); 381 ((BaseColorControl)redMap.getControl()).setTable(newRedTbl); 382 ((BaseColorControl)grnMap.getControl()).setTable(newGrnTbl); 383 ((BaseColorControl)bluMap.getControl()).setTable(newBluTbl); 384 displayMaster.setDisplayActive(); 385 } catch(Exception ex) { 386 LogUtil.logException("setDisplayInactive", ex); 387 } 388 } 389 390 private void updateRedGamma(double gamma) { 391 setRedGamma(gamma); 392 393 float[][] newRedTbl = getZeroOutArray(redTable); 394 395 for (int k=0; k<redTable[0].length; k++) { 396 newRedTbl[0][k] = (float) Math.pow(redTable[0][k], gamma); 397 } 398 399 try { 400 displayMaster.setDisplayInactive(); 401 ((BaseColorControl)redMap.getControl()).setTable(newRedTbl); 402 displayMaster.setDisplayActive(); 403 } catch(Exception ex) { 404 LogUtil.logException("setDisplayInactive", ex); 405 } 406 } 407 408 private void updateGrnGamma(double gamma) { 409 setGrnGamma(gamma); 410 411 float[][] newGrnTbl = getZeroOutArray(grnTable); 412 for (int k=0; k<grnTable[0].length; k++) { 413 newGrnTbl[1][k] = (float) Math.pow(grnTable[1][k], gamma); 414 } 415 416 try { 417 displayMaster.setDisplayInactive(); 418 ((BaseColorControl)grnMap.getControl()).setTable(newGrnTbl); 419 displayMaster.setDisplayActive(); 420 } catch(Exception ex) { 421 LogUtil.logException("setDisplayInactive", ex); 422 } 423 } 424 425 private void updateBluGamma(double gamma) { 426 setBluGamma(gamma); 427 428 float[][] newBluTbl = getZeroOutArray(bluTable); 429 for (int k=0; k<bluTable[0].length; k++) { 430 newBluTbl[2][k] = (float) Math.pow(bluTable[2][k], gamma); 431 } 432 433 try { 434 displayMaster.setDisplayInactive(); 435 ((BaseColorControl)bluMap.getControl()).setTable(newBluTbl); 436 displayMaster.setDisplayActive(); 437 } catch(Exception ex) { 438 LogUtil.logException("setDisplayInactive", ex); 439 } 440 } 441 442 public float[][] getZeroOutArray(float[][] array) { 443 float[][] newArray = new float[array.length][array[0].length]; 444 for (int i=0; i<newArray.length; i++) { 445 for (int j=0; j<newArray[0].length; j++) { 446 newArray[i][j] = 0f; 447 } 448 } 449 return newArray; 450 } 451 452 protected ColorTable getInitialColorTable() { 453 return getDisplayConventions().getParamColorTable("image"); 454 } 455 456 public Container doMakeContents() { 457 458 JButton allGammaButton = new JButton("Apply to All Gamma Fields"); 459 allGammaButton.addActionListener(new ActionListener() { 460 public void actionPerformed(ActionEvent e) { 461 String tmp = gammaTxtFld.getText().trim(); 462 updateGamma(Double.valueOf(tmp)); 463 } 464 }); 465 466 gammaTxtFld.addActionListener(new ActionListener() { 467 public void actionPerformed(ActionEvent e) { 468 String tmp = gammaTxtFld.getText().trim(); 469 updateGamma(Double.valueOf(tmp)); 470 } 471 }); 472 473 redLowTxtFld.addActionListener(new ActionListener() { 474 public void actionPerformed(ActionEvent e) { 475 String tmp = redLowTxtFld.getText().trim(); 476 updateRedRange(Double.valueOf(tmp), redRange[1]); 477 } 478 }); 479 480 redHighTxtFld.addActionListener(new ActionListener() { 481 public void actionPerformed(ActionEvent e) { 482 String tmp = redHighTxtFld.getText().trim(); 483 updateRedRange(redRange[0], Double.valueOf(tmp)); 484 } 485 }); 486 487 redGammaTxtFld.addActionListener(new ActionListener() { 488 public void actionPerformed(ActionEvent e) { 489 String tmp = redGammaTxtFld.getText().trim(); 490 updateRedGamma(Double.valueOf(tmp)); 491 } 492 }); 493 494 JButton redReset = new JButton("Reset"); 495 redReset.addActionListener(new ActionListener() { 496 public void actionPerformed(ActionEvent e) { 497 updateRedRange(initRedRange[0], initRedRange[1]); 498 redRange[0] = initRedRange[0]; 499 redRange[1] = initRedRange[1]; 500 redLowTxtFld.setText(Float.toString((float)redRange[0])); 501 redHighTxtFld.setText(Float.toString((float)redRange[1])); 502 updateRedGamma(1.0); 503 redGammaTxtFld.setText("1.0"); 504 } 505 }); 506 507 grnLowTxtFld.addActionListener(new ActionListener() { 508 public void actionPerformed(ActionEvent e) { 509 String tmp = grnLowTxtFld.getText().trim(); 510 updateGrnRange(Double.valueOf(tmp), grnRange[1]); 511 } 512 }); 513 514 grnHighTxtFld.addActionListener(new ActionListener() { 515 public void actionPerformed(ActionEvent e) { 516 String tmp = grnHighTxtFld.getText().trim(); 517 updateGrnRange(grnRange[0], Double.valueOf(tmp)); 518 } 519 }); 520 521 grnGammaTxtFld.addActionListener(new ActionListener() { 522 public void actionPerformed(ActionEvent e) { 523 String tmp = grnGammaTxtFld.getText().trim(); 524 updateGrnGamma(Double.valueOf(tmp)); 525 } 526 }); 527 528 JButton grnReset = new JButton("Reset"); 529 grnReset.addActionListener(new ActionListener() { 530 public void actionPerformed(ActionEvent e) { 531 updateGrnRange(initGrnRange[0], initGrnRange[1]); 532 grnRange[0] = initGrnRange[0]; 533 grnRange[1] = initGrnRange[1]; 534 grnLowTxtFld.setText(Float.toString((float)grnRange[0])); 535 grnHighTxtFld.setText(Float.toString((float)grnRange[1])); 536 updateGrnGamma(1.0); 537 grnGammaTxtFld.setText("1.0"); 538 } 539 }); 540 541 bluLowTxtFld.addActionListener(new ActionListener() { 542 public void actionPerformed(ActionEvent e) { 543 String tmp = bluLowTxtFld.getText().trim(); 544 updateBluRange(Double.valueOf(tmp), bluRange[1]); 545 } 546 }); 547 548 bluHighTxtFld.addActionListener(new ActionListener() { 549 public void actionPerformed(ActionEvent e) { 550 String tmp = bluHighTxtFld.getText().trim(); 551 updateBluRange(bluRange[0], Double.valueOf(tmp)); 552 } 553 }); 554 555 bluGammaTxtFld.addActionListener(new ActionListener() { 556 public void actionPerformed(ActionEvent e) { 557 String tmp = bluGammaTxtFld.getText().trim(); 558 updateBluGamma(Double.valueOf(tmp)); 559 } 560 }); 561 562 JButton bluReset = new JButton("Reset"); 563 bluReset.addActionListener(new ActionListener() { 564 public void actionPerformed(ActionEvent e) { 565 updateBluRange(initBluRange[0], initBluRange[1]); 566 bluRange[0] = initBluRange[0]; 567 bluRange[1] = initBluRange[1]; 568 bluLowTxtFld.setText(Float.toString((float)bluRange[0])); 569 bluHighTxtFld.setText(Float.toString((float)bluRange[1])); 570 updateBluGamma(1.0); 571 bluGammaTxtFld.setText("1.0"); 572 } 573 }); 574 575 JButton applyButton = new JButton("Apply"); 576 applyButton.addActionListener(new ActionListener() { 577 public void actionPerformed(ActionEvent e) { 578 String redLow = redLowTxtFld.getText().trim(); 579 String redHigh = redHighTxtFld.getText().trim(); 580 updateRedRange(Double.valueOf(redLow), Double.valueOf(redHigh)); 581 String grnLow = grnLowTxtFld.getText().trim(); 582 String grnHigh = grnHighTxtFld.getText().trim(); 583 updateGrnRange(Double.valueOf(grnLow), Double.valueOf(grnHigh)); 584 String bluLow = bluLowTxtFld.getText().trim(); 585 String bluHigh = bluHighTxtFld.getText().trim(); 586 updateBluRange(Double.valueOf(bluLow), Double.valueOf(bluHigh)); 587 588 String tmp = redGammaTxtFld.getText().trim(); 589 updateRedGamma(Double.valueOf(tmp)); 590 tmp = grnGammaTxtFld.getText().trim(); 591 updateGrnGamma(Double.valueOf(tmp)); 592 tmp = bluGammaTxtFld.getText().trim(); 593 updateBluGamma(Double.valueOf(tmp)); 594 } 595 }); 596 597 JPanel topPanel = new JPanel(new MigLayout()); 598 topPanel.add(new JLabel("Red range: ")); 599 topPanel.add(redLowTxtFld); 600 topPanel.add(redHighTxtFld); 601 topPanel.add(new JLabel("Red Gamma: ")); 602 topPanel.add(redGammaTxtFld); 603 topPanel.add(redReset, "wrap"); 604 605 topPanel.add(new JLabel("Green range: ")); 606 topPanel.add(grnLowTxtFld); 607 topPanel.add(grnHighTxtFld); 608 topPanel.add(new JLabel("Green Gamma: ")); 609 topPanel.add(grnGammaTxtFld); 610 topPanel.add(grnReset, "wrap"); 611 612 topPanel.add(new JLabel("Blue range: ")); 613 topPanel.add(bluLowTxtFld); 614 topPanel.add(bluHighTxtFld); 615 topPanel.add(new JLabel("Blue Gamma: ")); 616 topPanel.add(bluGammaTxtFld); 617 topPanel.add(bluReset, "wrap"); 618 619 topPanel.add(Box.createHorizontalStrut(1), "span 5"); 620 topPanel.add(applyButton, "wrap"); 621 622 JPanel bottomPanel = new JPanel(new MigLayout()); 623 bottomPanel.add(new JLabel("Common Gamma: ")); 624 bottomPanel.add(gammaTxtFld); 625 bottomPanel.add(allGammaButton); 626 627 JPanel mainPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 628 mainPanel.add(topPanel); 629 mainPanel.add(bottomPanel); 630 631 return mainPanel; 632 } 633 634 private class ColorMapListener implements ScalarMapListener 635 { 636 ScalarMap clrMap; 637 638 double[] range = null; 639 double[] initRange = null; 640 641 JTextField lowTxtFld; 642 JTextField highTxtFld; 643 644 ColorMapListener(ScalarMap clrMap, double[] initRange, double[] range, JTextField lowTxtFld, JTextField highTxtFld) { 645 this.clrMap = clrMap; 646 this.lowTxtFld = lowTxtFld; 647 this.highTxtFld = highTxtFld; 648 this.range = range; 649 this.initRange = initRange; 650 } 651 652 653 public void controlChanged(ScalarMapControlEvent event) throws RemoteException, VisADException { 654 } 655 656 public void mapChanged(ScalarMapEvent event) throws RemoteException, VisADException { 657 if (event.getId() == ScalarMapEvent.AUTO_SCALE) { 658 double[] rng = clrMap.getRange(); 659 boolean shouldRemove = false; 660 //Ghansham: decide whether it is first time. The cleaner way 661 if (!Double.isNaN(rng[0]) && !Double.isNaN(rng[1]) && Double.isNaN(initRange[0]) && Double.isNaN(initRange[1])) { 662 shouldRemove = true; 663 } 664 range[0] = rng[0]; 665 range[1] = rng[1]; 666 initRange[0] = rng[0]; 667 initRange[1] = rng[1]; 668 lowTxtFld.setText(Float.toString((float)rng[0])); 669 highTxtFld.setText(Float.toString((float)rng[1])); 670 //Ghansham:If its first time remove the scalarmaplistener and setRange manually to disable autscaling of the scalarmap 671 if(shouldRemove) { 672 clrMap.removeScalarMapListener(this); 673 //-Lock out auto-scaling 674 clrMap.disableAutoScale(); 675 } 676 } 677 else if (event.getId() == ScalarMapEvent.MANUAL) { 678 double[] rng = clrMap.getRange(); 679 range[0] = rng[0]; 680 range[1] = rng[1]; 681 } 682 } 683 } 684 685 686 }