001/* 002 * $Id: GeoLatLonSelection.java,v 1.107 2011/03/28 18:50:36 jbeavers Exp $ 003 * 004 * This file is part of McIDAS-V 005 * 006 * Copyright 2007-2011 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 031package edu.wisc.ssec.mcidasv.data; 032 033import edu.wisc.ssec.mcidas.AreaDirectory; 034import edu.wisc.ssec.mcidas.AREAnav; 035 036import edu.wisc.ssec.mcidasv.Constants; 037 038import java.awt.Component; 039import java.awt.Dimension; 040import java.awt.event.*; 041import java.awt.Insets; 042import java.awt.geom.Rectangle2D; 043import java.rmi.RemoteException; 044import java.util.ArrayList; 045import java.util.Enumeration; 046import java.util.Hashtable; 047import java.util.List; 048 049import javax.accessibility.*; 050import javax.swing.*; 051import javax.swing.event.*; 052 053import org.slf4j.Logger; 054import org.slf4j.LoggerFactory; 055 056import ucar.unidata.data.DataChoice; 057import ucar.unidata.data.DataSelection; 058import ucar.unidata.data.DataSourceImpl; 059import ucar.unidata.data.DataSelectionComponent; 060import ucar.unidata.data.GeoLocationInfo; 061import ucar.unidata.data.GeoSelection; 062import ucar.unidata.geoloc.LatLonPoint; 063import ucar.unidata.idv.ui.IdvUIManager; 064import ucar.unidata.ui.LatLonWidget; 065import ucar.unidata.util.GuiUtils; 066import ucar.unidata.util.Misc; 067import ucar.unidata.util.StringUtil; 068 069import visad.VisADException; 070import visad.data.mcidas.AREACoordinateSystem; 071import visad.georef.*; 072 073 074public class GeoLatLonSelection extends DataSelectionComponent implements Constants { 075 076 private static final Logger logger = LoggerFactory.getLogger(GeoLatLonSelection.class); 077 078 private GeoLocationInfo geoLocInfo; 079 080 /** The spacing used in the grid layout */ 081 protected static final int GRID_SPACING = 3; 082 083 /** Used by derived classes when they do a GuiUtils.doLayout */ 084 protected static final Insets GRID_INSETS = new Insets(GRID_SPACING, 085 GRID_SPACING, 086 GRID_SPACING, 087 GRID_SPACING); 088 089 DataChoice dataChoice; 090 MapProjection sampleProjection; 091 092 /** earth coordinates */ 093 protected static final String TYPE_LATLON = "Latitude/Longitude"; 094 095 /** image */ 096 protected static final String TYPE_IMAGE = "Image Coordinates"; 097 098 /** area */ 099 protected static final String TYPE_AREA = "Area Coordinates"; 100 101 /** flag for center */ 102 protected static final String PLACE_CENTER = "CENTER"; 103 104 /** flag for upper left */ 105 protected static final String PLACE_ULEFT = "ULEFT"; 106 107 /** Property for image default value lat/lon */ 108 protected static final String PROP_LATLON = "LATLON"; 109 110 /** Property for image default value line/ele */ 111 protected static final String PROP_LINEELE = "LINELE"; 112 113 /** Property for image default value loc */ 114 protected static final String PROP_LOC = "LOC"; 115 116 /** Property for image default value mag */ 117 protected static final String PROP_MAG = "MAG"; 118 protected static final String PROP_LMAG = "LMAG"; 119 protected static final String PROP_EMAG = "EMAG"; 120 121 /** Property for image default value place */ 122 protected static final String PROP_PLACE = "PLACE"; 123 124 /** Property for image default value size */ 125 protected static final String PROP_SIZE = "SIZE"; 126 127 /** Property for image default value unit */ 128 protected static final String PROP_TYPE = "TYPE"; 129 130 /** Property for line resolution */ 131 protected static final String PROP_LRES = "LRES"; 132 protected static final String PROP_PLRES = "PLRES"; 133 134 /** Property for element resolution */ 135 protected static final String PROP_ERES = "ERES"; 136 protected static final String PROP_PERES = "PERES"; 137 138 protected static final String PROP_READOUT = "READOUT"; 139 140 /** This is the list of properties that are used in the advanced gui */ 141 private static final String[] ADVANCED_PROPS = { 142 PROP_TYPE, PROP_PLACE, PROP_LOC, PROP_SIZE, PROP_MAG, 143 PROP_LMAG, PROP_EMAG, PROP_READOUT 144 }; 145 146 /** This is the list of labels used for the advanced gui */ 147 private static final String[] ADVANCED_LABELS = { 148 "Coordinate Type:", "Placement:", "Location:", " Image Size:", 149 "Magnification:", "", "", "Approx. Area: " 150 }; 151 152 private static final String[] readoutLabels = { 153 "Center ", 154 "Upper Left ", 155 "Upper Right", 156 "Lower Left ", 157 "Lower Right" 158 }; 159 160 private String kmLbl = " km"; 161 162 /** Input for lat/lon center point */ 163 protected LatLonWidget latLonWidget = new LatLonWidget(); 164 165 /** Widget to hold the number of elements in the advanced */ 166 JTextField numElementsFld = new JTextField(); 167 168 /** Widget to hold the number of lines in the advanced */ 169 JTextField numLinesFld = new JTextField(); 170 171 /** Widget for the line center point in the advanced section */ 172 JTextField centerLineFld = new JTextField(); 173 174 /** Widget for the element center point in the advanced section */ 175 JTextField centerElementFld = new JTextField(); 176 177 JTextField lineMagFld = new JTextField(); 178 JTextField eleMagFld = new JTextField(); 179 180 /** Label used for the line center */ 181 private JLabel centerLineLbl = new JLabel(); 182 183 /** Label used for the element center */ 184 private JLabel centerElementLbl = new JLabel(); 185 186 /** Label used for the center latitude */ 187 private JLabel centerLatLbl = new JLabel(); 188 189 /** Label used for the center longitude */ 190 private JLabel centerLonLbl = new JLabel(); 191 192 /** _more_ */ 193 private JToggleButton lockBtn; 194 private JButton fullResBtn; 195 196 private JPanel lMagPanel; 197 private JPanel eMagPanel; 198 199 /** Widget for the line magnfication in the advanced section */ 200 protected JSlider lineMagSlider; 201 202 /** Label for the line mag. in the advanced section */ 203 JLabel lineMagLbl = new JLabel(); 204 JLabel lineResLbl = new JLabel(); 205 206 JLabel rawSizeLbl = new JLabel(); 207 208 /** Widget for the element magnfication in the advanced section */ 209 protected JSlider elementMagSlider; 210 211 /** Label for the element mag. in the advanced section */ 212 JLabel elementMagLbl = new JLabel(); 213 JLabel elementResLbl = new JLabel(); 214 215 /** location panel */ 216 protected GuiUtils.CardLayoutPanel locationPanel; 217 218 /** flag for setting properties */ 219 private boolean amSettingProperties = false; 220 221 JComboBox coordinateTypeComboBox; 222 JComboBox locationComboBox; 223 224 String[] coordinateTypes = { TYPE_LATLON, TYPE_IMAGE, TYPE_AREA }; 225 String[] locations = {"Center", "Upper Left"}; 226 227// static double dNaN = Double.NaN; 228 229/** the place string */ 230 private String defaultType = TYPE_LATLON; 231 private String place; 232 private String defaultPlace = PLACE_CENTER; 233 private int defaultNumLines = 1000; 234 private int defaultNumEles = 1000; 235 private int numLines = defaultNumLines; 236 private int numEles = defaultNumEles; 237 private double latitude; 238 private double defaultLat = Double.NaN; 239 private double longitude; 240 private double defaultLon = Double.NaN; 241 private boolean resetLatLon = true; 242 private int imageLine; 243 private int areaLine; 244 private int defaultLine = -1; 245 private int imageElement; 246 private int areaElement; 247 private int defaultElement = -1; 248 private int lineMag; 249 private double dLineMag; 250 private int defaultLineMag; 251 private int elementMag; 252 private double dElementMag; 253 private int defaultElementMag; 254 private boolean isLineEle = false; 255 private double lRes; 256 protected double baseLRes = 0.0; 257 private double eRes; 258 protected double baseERes = 0.0; 259 260 private Hashtable properties; 261 private int uLLine; 262 private int uLEle; 263 private int centerLine; 264 private int centerEle; 265 protected boolean amUpdating = false; 266 267 268 /** Maps the PROP_ property name to the gui component */ 269 private Hashtable propToComps = new Hashtable(); 270 271 /** size label */ JLabel sizeLbl; 272 273 /** base number of lines */ 274 private double baseNumLines; 275 276 /** base number of elements */ 277 private double baseNumElements; 278 279 private DataSourceImpl dataSource; 280 private static DataSourceImpl lastDataSource; 281 private AreaDirectory previewDir; 282 private AREAnav previewNav; 283 private AREAnav areaNav; 284 285 private List latLonLbls = new ArrayList(); 286 private List linEleImageLbls = new ArrayList(); 287 private List linEleAreaLbls = new ArrayList(); 288 private JPanel latLonPanel; 289 private JPanel lineElementPanel; 290 291 /** 292 * limit of slider 293 */ 294 private static final int SLIDER_MAX = 1; 295 private static final int SLIDER_MIN = -29; 296 private static final int SLIDER_WIDTH = 150; 297 private static final int SLIDER_HEIGHT = 16; 298 299 /** 300 * Keep track of the lines to element ratio 301 */ 302 private double linesToElements = 1.0; 303 304 double[][] imageEL = new double[2][5]; 305 double[][] areaEL = new double[2][5]; 306 double[][] displayEL = new double[2][5]; 307 double[][] latLon = new double[2][5]; 308 309 private int[] previewDirBlk; 310 311 private int previewLineRes = 1; 312 private int previewEleRes = 1; 313 private int maxLines = 0; 314 private int maxEles = 0; 315 316 private double bLRes = 0.0; 317 private double bERes = 0.0; 318 319 private List readoutLLWidget = new ArrayList(); 320 private List readoutLatFld = new ArrayList(); 321 private List readoutLonFld = new ArrayList(); 322 private JPanel latLonReadoutPanel; 323 324 private List readoutImageLinFld = new ArrayList(); 325 private List readoutImageEleFld = new ArrayList(); 326 private JPanel lineElementImageReadoutPanel; 327 328 private List readoutAreaLinFld = new ArrayList(); 329 private List readoutAreaEleFld = new ArrayList(); 330 private JPanel lineElementAreaReadoutPanel; 331 332 private GuiUtils.CardLayoutPanel readoutPanel; 333 334 public GeoLatLonSelection(DataSourceImpl dataSource, 335 DataChoice dataChoice, Hashtable initProps, MapProjection sample, 336 AreaDirectory dir, AREAnav nav) 337 throws VisADException, RemoteException { 338 super("Advanced"); 339 340 if (dataSource != lastDataSource) { 341 this.resetLatLon = true; 342 } 343 lastDataSource = dataSource; 344 345 this.properties = initProps; 346 this.dataSource = dataSource; 347 this.dataChoice = dataChoice; 348 this.sampleProjection = sample; 349 this.previewDir = dir; 350 351 setBaseNumLines(dir.getLines()); 352 setBaseNumElements(dir.getElements()); 353 this.previewNav = nav; 354 previewDirBlk = this.previewDir.getDirectoryBlock(); 355 int areaLinRes = previewDirBlk[11]; 356 int areaEleRes = previewDirBlk[12]; 357 this.areaNav = this.previewNav; 358 this.areaNav.setRes(areaLinRes, areaEleRes); 359 this.areaNav.setImageStart(previewDirBlk[5], previewDirBlk[6]); 360 361 int numberOfLines; 362 int numberOfElements; 363 if (properties.containsKey(PROP_SIZE)) { 364 String str = (String)properties.get(PROP_SIZE); 365 String[] strs = StringUtil.split(str, " ", 2); 366 numberOfLines = Integer.parseInt(strs[0]); 367 numberOfElements = Integer.parseInt(strs[1]); 368 } else { 369 try { 370 numberOfLines = this.previewDir.getLines(); 371 numberOfElements = this.previewDir.getElements(); 372 if (numberOfLines < defaultNumLines) 373 defaultNumLines = numberOfLines; 374 if (numberOfElements < defaultNumEles) 375 defaultNumEles = numberOfElements; 376 numberOfLines = defaultNumLines; 377 numberOfElements = defaultNumEles; 378 } catch (Exception e) { 379 logger.error("no directory", e); 380 return; 381 } 382 } 383 setNumLines(numberOfLines); 384 setNumEles(numberOfElements); 385 if (properties.containsKey(PROP_MAG)) { 386 String str = (String)properties.get(PROP_MAG); 387 String[] strs = StringUtil.split(str, " ", 2); 388 this.defaultLineMag = Integer.parseInt(strs[0]); 389 this.defaultElementMag = Integer.parseInt(strs[1]); 390 this.dLineMag = (double)this.defaultLineMag; 391 this.dElementMag = (double)this.defaultElementMag; 392 } else { 393 this.dLineMag = -(double)this.previewDir.getLines()/(double)numberOfLines; 394 this.dElementMag = -(double)this.previewDir.getElements()/(double)numberOfElements; 395 this.defaultLineMag = (int)(Math.floor(dLineMag)); 396 this.defaultElementMag = (int)(Math.floor(dElementMag)); 397 } 398 setLineMag(this.defaultLineMag); 399 setElementMag(this.defaultElementMag); 400 401 try { 402 if (properties.containsKey(PROP_LRES)) { 403 this.bLRes = Double.parseDouble((String)properties.get(PROP_LRES)); 404 //if (dir.getValue(11) == 1) this.bLRes = this.previewDir.getCenterLatitudeResolution(); 405 this.baseLRes = this.bLRes * (double)(dir.getValue(11)); 406 setLRes(this.baseLRes * Math.abs(this.defaultLineMag)); 407 } 408 if (properties.containsKey(PROP_ERES)) { 409 this.bERes = Double.parseDouble((String)properties.get(PROP_ERES)); 410 //if (dir.getValue(12) == 1) this.bERes = this.previewDir.getCenterLongitudeResolution(); 411 this.baseERes = this.bERes * (double)(dir.getValue(12)); 412 setERes(this.baseERes * Math.abs(this.defaultElementMag)); 413 } 414 } catch (Exception e) { 415 logger.error("unable to get resolution", e); 416 417 } 418 setBLRes(this.bLRes); 419 setBERes(this.bERes); 420 if (this.baseLRes == 0.0) 421 this.baseLRes = this.previewDir.getCenterLatitudeResolution(); 422 if (this.baseERes == 0.0) 423 this.baseERes = this.previewDir.getCenterLongitudeResolution(); 424 425 this.place = getPlace(); 426 if (properties.containsKey(PROP_PLACE)) { 427 setPlace((String)properties.get(PROP_PLACE)); 428 } 429 430 if (properties.containsKey(PROP_PLRES)) { 431 this.previewLineRes = Integer.parseInt((String)properties.get(PROP_PLRES)); 432 } 433 if (properties.containsKey(PROP_PERES)) { 434 this.previewEleRes = Integer.parseInt((String)properties.get(PROP_PERES)); 435 } 436 437 if (this.resetLatLon) { 438 if (this.previewDir != null) { 439 setLatitude(this.previewDir.getCenterLatitude()); 440 setLongitude(this.previewDir.getCenterLongitude()); 441 } 442 } else { 443 setLatitude(this.latitude); 444 setLongitude(this.longitude); 445 } 446 convertToLineEle(); 447 448 if (properties.containsKey(PROP_LATLON)) { 449 String str = (String)properties.get(PROP_LATLON); 450 String[] strs = StringUtil.split(str, " ", 2); 451 setLatitude(Double.parseDouble(strs[0])); 452 setLongitude(Double.parseDouble(strs[1])); 453 convertToLineEle(); 454 this.isLineEle = false; 455 } else if (properties.containsKey(PROP_LINEELE)) { 456 String str = (String)properties.get(PROP_LINEELE); 457 String[] strs = StringUtil.split(str, " ", 3); 458 setLine(Integer.parseInt(strs[0])); 459 setElement(Integer.parseInt(strs[1])); 460 convertToLatLon(); 461 this.isLineEle = true; 462 } 463 464 if (this.defaultLineMag > 1) { 465 numberOfLines = numberOfLines * this.defaultLineMag; 466 setNumLines(numberOfLines); 467 setLRes(lRes/this.defaultLineMag); 468 this.defaultLineMag = 1; 469 setLineMag(this.defaultLineMag); 470 } 471 if (this.defaultElementMag > 1) { 472 numberOfElements = numberOfElements * this.defaultElementMag; 473 setNumEles(numberOfElements); 474 setERes(lRes/this.defaultElementMag); 475 this.defaultElementMag = 1; 476 setElementMag(this.defaultElementMag); 477 } 478 } 479 480 protected JComponent doMakeContents() { 481 String[] propArray = getAdvancedProps(); 482 String[] labelArray = getAdvancedLabels(); 483 Insets dfltGridSpacing = new Insets(4, 0, 4, 0); 484 String dfltLblSpacing = " "; 485 List allComps = new ArrayList(); 486 487 for (int propIdx = 0; propIdx < propArray.length; propIdx++) { 488 JComponent propComp = null; 489 String prop = propArray[propIdx]; 490 if (prop.equals(PROP_TYPE)) { 491 allComps.add(new JLabel(" ")); 492 allComps.add(new JLabel(" ")); 493 coordinateTypeComboBox = new JComboBox(coordinateTypes); 494 coordinateTypeComboBox.addActionListener(new ActionListener() { 495 public void actionPerformed(ActionEvent ae) { 496 int selectedIndex = coordinateTypeComboBox.getSelectedIndex(); 497 flipLocationPanel(selectedIndex); 498 flipReadoutPanel(selectedIndex); 499 } 500 }); 501 propComp = (JComponent)coordinateTypeComboBox; 502 } 503 else if (prop.equals(PROP_LOC)) { 504 locationComboBox = new JComboBox(locations); 505 setPlace(this.place); 506 locationComboBox.addActionListener(new ActionListener() { 507 public void actionPerformed(ActionEvent ae) { 508 String selected = getPlace(); 509 cyclePlace(); 510 } 511 }); 512 propComp = (JComponent)locationComboBox; 513 addPropComp(PROP_LOC, propComp); 514 515 ActionListener latLonChange =new ActionListener() { 516 public void actionPerformed(ActionEvent ae) { 517 String type = getCoordinateType(); 518 if (type.equals(TYPE_LATLON)) { 519 setLatitude(); 520 setLongitude(); 521 convertToLineEle(); 522 getGeoLocationInfo(); 523 } else { 524 setLineElement(); 525 convertToLatLon(); 526 getGeoLocationInfo(); 527 } 528 } 529 }; 530 531 FocusListener linEleFocusChange = new FocusListener() { 532 public void focusGained(FocusEvent fe) { 533 } 534 public void focusLost(FocusEvent fe) { 535 setLineElement(); 536 convertToLatLon(); 537 getGeoLocationInfo(); 538 } 539 }; 540 541 if (latLonWidget == null) 542 latLonWidget = new LatLonWidget(latLonChange); 543 544 FocusListener latLonFocusChange = new FocusListener() { 545 public void focusGained(FocusEvent fe) { 546 JTextField latFld = latLonWidget.getLatField(); 547 latFld.setCaretPosition(latFld.getText().length()); 548 JTextField lonFld = latLonWidget.getLonField(); 549 lonFld.setCaretPosition(lonFld.getText().length()); 550 } 551 public void focusLost(FocusEvent fe) { 552 setLatitude(); 553 setLongitude(); 554 convertToLineEle(); 555 getGeoLocationInfo(); 556 } 557 }; 558 559 if (!this.isLineEle) { 560 latLonWidget.setLatLon(this.latitude, this.longitude); 561 } 562 String lineStr = ""; 563 String eleStr = ""; 564 setLine(this.imageLine); 565 setElement(this.imageElement); 566 if ((this.imageLine >= 0) && (this.imageElement >= 0)) { 567 lineStr =Integer.toString(this.imageLine); 568 eleStr =Integer.toString(this.imageElement); 569 } 570 centerLineFld = new JTextField(lineStr, 3); 571 centerLineFld.addActionListener(latLonChange); 572 centerLineFld.addFocusListener(linEleFocusChange); 573 final String lineField = ""; 574 centerElementFld = new JTextField(eleStr, 3); 575 centerElementFld.addActionListener(latLonChange); 576 centerElementFld.addFocusListener(linEleFocusChange); 577 final JButton centerPopupBtn = 578 GuiUtils.getImageButton( 579 "/auxdata/ui/icons/MapIcon16.png", getClass()); 580 centerPopupBtn.setToolTipText("Center on current displays"); 581 582 centerPopupBtn.addActionListener(new ActionListener() { 583 public void actionPerformed(ActionEvent ae) { 584 dataSource.getDataContext().getIdv().getIdvUIManager().popupCenterMenu( 585 centerPopupBtn, latLonWidget); 586 } 587 }); 588 589 JComponent centerPopup = GuiUtils.inset(centerPopupBtn, 590 new Insets(0, 0, 0, 4)); 591 592 593 GuiUtils.tmpInsets = dfltGridSpacing; 594 JTextField latFld = latLonWidget.getLatField(); 595 JTextField lonFld = latLonWidget.getLonField(); 596 latFld.addFocusListener(latLonFocusChange); 597 lonFld.addFocusListener(latLonFocusChange); 598 latLonPanel = GuiUtils.hbox(new Component[] { 599 centerLatLbl = GuiUtils.rLabel(" Lat:" + dfltLblSpacing), 600 latFld, 601 centerLonLbl = GuiUtils.rLabel(" Lon:" + dfltLblSpacing), 602 lonFld, 603 new JLabel(" "), centerPopup 604 }); 605 606 lineElementPanel = 607 GuiUtils.hbox(new Component[] { 608 centerLineLbl = 609 GuiUtils.rLabel(" Line:" + dfltLblSpacing), 610 centerLineFld, 611 centerElementLbl = GuiUtils.rLabel(" Element:" 612 + dfltLblSpacing), 613 centerElementFld }); 614 615 locationPanel = new GuiUtils.CardLayoutPanel(); 616 locationPanel.addCard(latLonPanel); 617 locationPanel.addCard(lineElementPanel); 618 619 if (propComp != null) { 620 allComps.add(GuiUtils.rLabel(labelArray[propIdx])); 621 allComps.add(GuiUtils.left(propComp)); 622 } 623 propComp = GuiUtils.hbox(new Component[] { locationPanel }, 1); 624 if (propComp != null) { 625 allComps.add(GuiUtils.rLabel(" ")); 626 allComps.add(GuiUtils.left(propComp)); 627 } 628 propComp = null; 629 } else if (prop.equals(PROP_SIZE)) { 630 ActionListener sizeChange =new ActionListener() { 631 public void actionPerformed(ActionEvent ae) { 632 int lines = getNumLines() * Math.abs(getLineMag()); 633 if (lines > maxLines) lines = maxLines; 634 setBaseNumLines(lines); 635 int eles = getNumEles() * Math.abs(getElementMag()); 636 if (eles > maxEles) eles = maxEles; 637 setBaseNumElements(eles); 638 getGeoLocationInfo(); 639 } 640 }; 641 FocusListener sizeFocusChange = new FocusListener() { 642 public void focusGained(FocusEvent fe) { 643 } 644 public void focusLost(FocusEvent fe) { 645 int lines = getNumLines() * Math.abs(getLineMag()); 646 if (lines > maxLines) lines = maxLines; 647 setBaseNumLines(lines); 648 int eles = getNumEles() * Math.abs(getElementMag()); 649 if (eles > maxEles) eles = maxEles; 650 setBaseNumElements(eles); 651 getGeoLocationInfo(); 652 } 653 }; 654 655 this.maxLines = this.previewDir.getLines(); 656 this.maxEles = this.previewDir.getElements(); 657 658 int lmag = getLineMag(); 659 int emag = getElementMag(); 660 if (lmag < 0) this.numLines = this.maxLines / Math.abs(lmag); 661 if (emag < 0) this.numEles = this.maxEles / Math.abs(emag); 662 663 setNumLines(this.numLines); 664 numLinesFld = new JTextField(Integer.toString(this.numLines), 4); 665 numLinesFld.addActionListener(sizeChange); 666 numLinesFld.addFocusListener(sizeFocusChange); 667 setNumEles(this.numEles); 668 numElementsFld = new JTextField(Integer.toString(this.numEles), 4); 669 numElementsFld.addActionListener(sizeChange); 670 numElementsFld.addFocusListener(sizeFocusChange); 671 numLinesFld.setToolTipText("Number of lines"); 672 numElementsFld.setToolTipText("Number of elements"); 673 GuiUtils.tmpInsets = dfltGridSpacing; 674 sizeLbl = GuiUtils.lLabel(""); 675 676 fullResBtn = GuiUtils.makeImageButton( 677 "/auxdata/ui/icons/arrow_out.png", this, 678 "setToFullResolution"); 679 fullResBtn.setContentAreaFilled(false); 680 fullResBtn.setToolTipText("Set fields to retrieve full image"); 681 682 lockBtn = 683 GuiUtils.getToggleImageButton(IdvUIManager.ICON_UNLOCK, 684 IdvUIManager.ICON_LOCK, 0, 0, true); 685 lockBtn.setContentAreaFilled(false); 686 lockBtn.setSelected(true); 687 lockBtn.setToolTipText( 688 "Unlock to automatically change size when changing magnification"); 689 690 rawSizeLbl = new JLabel(" Raw size: " + this.maxLines + " X " + 691 this.maxEles); 692 JPanel sizePanel = 693 GuiUtils.left(GuiUtils.doLayout(new Component[] { 694 numLinesFld, 695 new JLabel(" X "), numElementsFld, sizeLbl, new JLabel(" "), 696 fullResBtn, new JLabel(" "), lockBtn, 697 rawSizeLbl }, 9, GuiUtils.WT_N, GuiUtils.WT_N)); 698 addPropComp(PROP_SIZE, propComp = sizePanel); 699 } else if (prop.equals(PROP_MAG)) { 700 propComp = GuiUtils.hbox(new Component[] { new JLabel("") }, 1); 701 addPropComp(PROP_MAG, propComp); 702 } else if (prop.equals(PROP_LMAG)) { 703 boolean oldAmSettingProperties = amSettingProperties; 704 amSettingProperties = true; 705 ChangeListener lineListener = 706 new javax.swing.event.ChangeListener() { 707 public void stateChanged(ChangeEvent evt) { 708 if (amSettingProperties) { 709 return; 710 } 711 int val = getMagValue(lineMagSlider); 712 setLineMag(val); 713 amUpdating = true; 714 lineMagSliderChanged(!lockBtn.isSelected()); 715 amUpdating = false; 716 getGeoLocationInfo(); 717 } 718 }; 719 ActionListener lineMagChange =new ActionListener() { 720 public void actionPerformed(ActionEvent ae) { 721 if (amSettingProperties) { 722 return; 723 } 724 setLineMag(); 725 changeLineMagSlider(!lockBtn.isSelected()); 726 getGeoLocationInfo(); 727 } 728 }; 729 FocusListener lineMagFocusChange = new FocusListener() { 730 public void focusGained(FocusEvent fe) { 731 } 732 public void focusLost(FocusEvent fe) { 733 if (amSettingProperties) { 734 return; 735 } 736 setLineMag(); 737 changeLineMagSlider(!lockBtn.isSelected()); 738 getGeoLocationInfo(); 739 } 740 }; 741 JComponent[] lineMagComps = 742 GuiUtils.makeSliderPopup(SLIDER_MIN, SLIDER_MAX, 0, 743 lineListener); 744 lineMagSlider = (JSlider) lineMagComps[1]; 745 lineMagSlider.setPreferredSize(new Dimension(SLIDER_WIDTH,SLIDER_HEIGHT)); 746 lineMagSlider.setMajorTickSpacing(1); 747 lineMagSlider.setSnapToTicks(true); 748 lineMagSlider.setExtent(1); 749 int mag = getLineMag(); 750 setLineMagSlider(mag); 751 lineMagComps[0].setToolTipText( 752 "Change the line magnification"); 753 lineMagSlider.setToolTipText( 754 "Slide to set line magnification factor"); 755 String str = "Line Mag="; 756 lineMagFld = new JTextField(Integer.toString(mag),3); 757 lineMagFld.addFocusListener(lineMagFocusChange); 758 lineMagFld.addActionListener(lineMagChange); 759 lineMagLbl = 760 GuiUtils.getFixedWidthLabel(StringUtil.padLeft(str, 4)); 761 str = truncateNumericString(Double.toString(this.baseLRes*Math.abs(getLineMag())), 1); 762 str = " Res=" + str + kmLbl; 763 lineResLbl = 764 GuiUtils.getFixedWidthLabel(StringUtil.padLeft(str, 4)); 765 amSettingProperties = oldAmSettingProperties; 766 767 GuiUtils.tmpInsets = dfltGridSpacing; 768 lMagPanel = GuiUtils.doLayout(new Component[] { 769 lineMagLbl, lineMagFld, 770 GuiUtils.inset(lineMagComps[1], 771 new Insets(0, 4, 0, 0)), lineResLbl, }, 5, 772 GuiUtils.WT_N, GuiUtils.WT_N); 773 propComp = GuiUtils.hbox(new Component[] { new JLabel(" "), lMagPanel }, 2); 774 addPropComp(PROP_LMAG, propComp = lMagPanel); 775 } else if (prop.equals(PROP_EMAG)) { 776 boolean oldAmSettingProperties = amSettingProperties; 777 amSettingProperties = true; 778 ChangeListener elementListener = new ChangeListener() { 779 public void stateChanged( 780 javax.swing.event.ChangeEvent evt) { 781 if (amSettingProperties) { 782 return; 783 } 784 int val = getMagValue(elementMagSlider); 785 setElementMag(val); 786 amUpdating = true; 787 elementMagSliderChanged(true); 788 amUpdating = false; 789 getGeoLocationInfo(); 790 } 791 }; 792 ActionListener eleMagChange =new ActionListener() { 793 public void actionPerformed(ActionEvent ae) { 794 if (amSettingProperties) { 795 return; 796 } 797 setElementMag(); 798 changeEleMagSlider(!lockBtn.isSelected()); 799 getGeoLocationInfo(); 800 } 801 }; 802 FocusListener eleMagFocusChange = new FocusListener() { 803 public void focusGained(FocusEvent fe) { 804 } 805 public void focusLost(FocusEvent fe) { 806 if (amSettingProperties) { 807 return; 808 } 809 setElementMag(); 810 changeEleMagSlider(!lockBtn.isSelected()); 811 getGeoLocationInfo(); 812 } 813 }; 814 JComponent[] elementMagComps = 815 GuiUtils.makeSliderPopup(SLIDER_MIN, SLIDER_MAX, 0, 816 elementListener); 817 elementMagSlider = (JSlider) elementMagComps[1]; 818 elementMagSlider.setPreferredSize(new Dimension(SLIDER_WIDTH,SLIDER_HEIGHT)); 819 elementMagSlider.setExtent(1); 820 elementMagSlider.setMajorTickSpacing(1); 821 elementMagSlider.setSnapToTicks(true); 822 int mag = getElementMag(); 823 setElementMagSlider(mag); 824 elementMagComps[0].setToolTipText( 825 "Change the element magnification"); 826 elementMagSlider.setToolTipText( 827 "Slide to set element magnification factor"); 828 eleMagFld = new JTextField(Integer.toString(mag),3); 829 eleMagFld.addFocusListener(eleMagFocusChange); 830 eleMagFld.addActionListener(eleMagChange); 831 String str = "Ele Mag="; 832 elementMagLbl = 833 GuiUtils.getFixedWidthLabel(StringUtil.padLeft(str, 4)); 834 str = truncateNumericString(Double.toString(this.baseERes*Math.abs(getElementMag())), 1); 835 str = " Res=" + str + kmLbl; 836 elementResLbl = 837 GuiUtils.getFixedWidthLabel(StringUtil.padLeft(str, 4)); 838 amSettingProperties = oldAmSettingProperties; 839 840 GuiUtils.tmpInsets = dfltGridSpacing; 841 eMagPanel = GuiUtils.doLayout(new Component[] { 842 elementMagLbl, eleMagFld, 843 GuiUtils.inset(elementMagComps[1], 844 new Insets(0, 4, 0, 0)), elementResLbl, }, 5, 845 GuiUtils.WT_N, GuiUtils.WT_N); 846 propComp = GuiUtils.hbox(new Component[] { new JLabel(" "), eMagPanel }, 2); 847 addPropComp(PROP_EMAG, propComp = eMagPanel); 848 } else if (prop.equals(PROP_READOUT)) { 849 allComps.add(new JLabel(" ")); 850 allComps.add(new JLabel(" ")); 851 for (int i=0; i<5; i++) { 852 latLonLbls.add(GuiUtils.getFixedWidthLabel(" ")); 853 linEleImageLbls.add(GuiUtils.getFixedWidthLabel(" ")); 854 linEleAreaLbls.add(GuiUtils.getFixedWidthLabel(" ")); 855 } 856 latLonReadoutPanel = GuiUtils.left(GuiUtils.doLayout( 857 latLonLbls, 1, GuiUtils.WT_N, GuiUtils.WT_Y)); 858 lineElementImageReadoutPanel = GuiUtils.left(GuiUtils.doLayout( 859 linEleImageLbls, 1, GuiUtils.WT_N, GuiUtils.WT_Y)); 860 lineElementAreaReadoutPanel = GuiUtils.left(GuiUtils.doLayout( 861 linEleAreaLbls, 1, GuiUtils.WT_N, GuiUtils.WT_Y)); 862 863 readoutPanel = new GuiUtils.CardLayoutPanel(); 864 readoutPanel.addCard(latLonReadoutPanel); 865 readoutPanel.addCard(lineElementImageReadoutPanel); 866 readoutPanel.addCard(lineElementAreaReadoutPanel); 867 868 propComp = GuiUtils.hbox(new Component[] { readoutPanel }, 1); 869 addPropComp(PROP_READOUT, propComp); 870 if (propComp != null) { 871 allComps.add(GuiUtils.rLabel(labelArray[propIdx])); 872 allComps.add(GuiUtils.left(propComp)); 873 } 874 propComp = null; 875 } 876 if (propComp != null) { 877 allComps.add(GuiUtils.rLabel(labelArray[propIdx])); 878 allComps.add(GuiUtils.left(propComp)); 879 } 880 } 881 GuiUtils.tmpInsets = GRID_INSETS; 882 JPanel imagePanel = GuiUtils.doLayout(allComps, 2, GuiUtils.WT_NY, 883 GuiUtils.WT_N); 884 getGeoLocationInfo(); 885 return GuiUtils.top(imagePanel); 886 } 887 888 private void updateReadout() { 889 int numCols = 7; 890 for (int i=0; i<5; i++) { 891 String str = readoutLabels[i] + 892 " Lat: " + formatDoubleCoord(numCols, latLon[0][i]) + 893 " Lon: " + formatDoubleCoord(numCols, latLon[1][i]); 894 ((JLabel)latLonLbls.get(i)).setText(str); 895 896 String lineStr = formatIntegerCoord(numCols, imageEL[1][i]); 897 String eleStr = formatIntegerCoord(numCols, imageEL[0][i]); 898 str = readoutLabels[i] + " Line: " + lineStr + 899 " Element: " + eleStr; 900 ((JLabel)linEleImageLbls.get(i)).setText(str); 901 902 lineStr = formatIntegerCoord(numCols, areaEL[1][i]); 903 eleStr = formatIntegerCoord(numCols, areaEL[0][i]); 904 str = readoutLabels[i] + " Line: " + lineStr + 905 " Element: " + eleStr; 906 ((JLabel)linEleAreaLbls.get(i)).setText(str); 907 } 908 } 909 910 private String formatIntegerCoord(int cols, double val) { 911 String outStr = Misc.MISSING; 912 Double dbl = new Double(val); 913 if (!dbl.isNaN()) { 914 int ival = (int)Math.floor(val + 0.5); 915 outStr = Integer.toString(ival); 916 } 917 int len = outStr.length() + 1; 918 while (len < cols) { 919 outStr = new String(" ").concat(outStr); 920 len++; 921 } 922 return outStr; 923 } 924 925 private String formatDoubleCoord(int cols, double val) { 926 String outStr = Misc.MISSING; 927 Double dbl = new Double(val); 928 if (!dbl.isNaN()) { 929 outStr = Double.toString(val); 930 if (outStr.length() > cols) 931 outStr = outStr.substring(0, cols); 932 } 933 int len = outStr.length(); 934 while (len < cols) { 935 outStr = new String(" ").concat(outStr); 936 len++; 937 } 938 return outStr; 939 } 940 941 /** 942 * Change coordinate type panel 943 */ 944 protected void flipLocationPanel(int locPanel) { 945 int nowPlaying = locationPanel.getVisibleIndex(); 946 if (locPanel > 0) { 947 if (nowPlaying == 0) { 948 locationPanel.flip(); 949 } 950 setIsLineEle(true); 951 String type = getCoordinateType(); 952 int ele = this.imageElement; 953 int lin = this.imageLine; 954 if (type.equals(TYPE_AREA)) { 955 ele = this.areaElement; 956 lin = this.areaLine; 957 } 958 setElement(ele); 959 setLine(lin); 960 } else { 961 if (nowPlaying > 0) locationPanel.flip(); 962 setIsLineEle(false); 963 } 964 } 965 966 /** 967 * Change readout type panel 968 */ 969 protected void flipReadoutPanel(int roPanel) { 970 readoutPanel.show(roPanel); 971 } 972 973 /** 974 * Set to full resolution 975 */ 976 public void setToFullResolution() { 977 setPlace(PLACE_CENTER); 978 setLatitude(this.previewDir.getCenterLatitude()); 979 setLongitude(this.previewDir.getCenterLongitude()); 980 convertToLinEle(); 981 setNumLines(this.maxLines); 982 setNumEles(this.maxEles); 983 setBaseNumLines(this.maxLines); 984 setBaseNumElements(this.maxEles); 985 setLineMag(1); 986 setElementMag(1); 987 setLineMagSlider(1); 988 setLRes(this.baseLRes); 989 setElementMagSlider(1); 990 setERes(this.baseERes); 991 amUpdating = true; 992 lineMagSliderChanged(false); 993 elementMagSliderChanged(false); 994 amUpdating = false; 995 getGeoLocationInfo(); 996 } 997 998 @Override public void applyToDataSelection(DataSelection dataSelection) { 999 logger.trace("dataSelection={}", dataSelection); 1000 1001 if (dataSelection == null) { 1002 dataSelection = new DataSelection(true); 1003 } 1004 1005 if (geoLocInfo == null) { 1006 getGeoLocationInfo(); 1007 } 1008 1009 GeoLocationInfo geoInfo = geoLocInfo; 1010 if (geoInfo == null) { 1011 logger.trace("err, wtf?"); 1012 dataSelection = null; 1013 return; 1014 } 1015 1016 String coordType = getCoordinateType(); 1017 1018 if (!isLineEle) { 1019 logger.trace("dealing with LALO coords for datasel={}", dataSelection); 1020 double lat = getLatitude(); 1021 double lon = getLongitude(); 1022 if (lat > 90.0 && lon> 360.0) { 1023 convertToLatLon(); 1024 lat = getLatitude(); 1025 lon = getLongitude(); 1026 } 1027// if ((lat == dNaN) || (lon == dNaN)) { 1028// return; 1029// } 1030 if ((Double.isNaN(lat) || (Double.isNaN(lon)))) { 1031 return; 1032 } 1033 1034 String latString = Double.toString(lat); 1035 if (latString.length() > 8) { 1036 latString = latString.substring(0,7); 1037 } 1038 String lonString = Double.toString(lon); 1039 if (lonString.length() > 9) { 1040 lonString = lonString.substring(0,8); 1041 } 1042 dataSelection.putProperty(PROP_LATLON, (latString + " " + lonString)); 1043 } else { 1044 logger.trace("dealing with line-ele coords for datasel={}", dataSelection); 1045 int lin = getLine(); 1046 int ele = getElement(); 1047 if ((Double.isNaN(lin)) || (Double.isNaN(ele))) { 1048 return; 1049 } 1050// if ((lin == dNaN) || (ele == dNaN)) return; 1051 1052 String typeStr = " I"; 1053 if (coordType.equals(TYPE_AREA)) typeStr = " F"; 1054 String linString = Integer.toString(lin); 1055 String eleString = Integer.toString(ele); 1056 dataSelection.putProperty(PROP_LINEELE, (linString + " " + eleString + typeStr)); 1057 } 1058 1059 dataSelection.putProperty(PROP_PLACE, getPlace()); 1060 dataSelection.putProperty(PROP_MAG, (getLineMag() + " " + getElementMag())); 1061 1062 GeoSelection geoSelection = new GeoSelection(geoInfo); 1063 dataSelection.setGeoSelection(geoSelection); 1064 1065 int nlins = getNumLines(); 1066 int neles = getNumEles(); 1067 if (nlins > 0 && neles > 0) { 1068 dataSelection.putProperty(PROP_SIZE, (nlins + " " + neles)); 1069 } 1070 logger.trace("dataChoice={} dataSelection={}", dataChoice, dataSelection); 1071 dataChoice.setDataSelection(dataSelection); 1072 1073 this.dataSource.setDataSelection(dataSelection); 1074 } 1075 1076 @Override public boolean getShowInControlProperties() { 1077 return false; 1078 } 1079 1080 public GeoLocationInfo getGeoLocationInfo() { 1081 geoLocInfo = null; 1082 double[][] el = convertToDisplayCoords(); 1083 int ele = (int)Math.floor(el[0][0] + 0.5); 1084 if (ele < 0) ele = 0; 1085 int lin = (int)Math.floor(el[1][0] + 0.5); 1086 if (lin < 0) lin = 0; 1087 geoLocInfo = getGeoLocationInfo(lin, ele); 1088 return geoLocInfo; 1089 } 1090 1091 protected GeoLocationInfo getGeoLocationInfo(int lin, int ele) { 1092 int nLin = getNumLines(); 1093 if (nLin > 0) { 1094 int nEle = getNumEles(); 1095 if (nEle > 0) { 1096 int lMag = getLineMag(); 1097 if (lMag > 1) return geoLocInfo; 1098 int eMag = getElementMag(); 1099 if (eMag > 1) return geoLocInfo; 1100 geoLocInfo = makeGeoLocationInfo(lin, ele, nLin, nEle, 1101 lMag, eMag); 1102 return geoLocInfo; 1103 } 1104 } 1105 for (int i = 0; i < 2; i++) { 1106 for (int j = 0; j < 5; j++) { 1107 latLon[i][j] = Double.NaN; 1108 imageEL[i][j] = Double.NaN; 1109 areaEL[i][j] = Double.NaN; 1110 displayEL[i][j] = Double.NaN; 1111 } 1112 } 1113 updateReadout(); 1114 setLine(-1); 1115 setElement(-1); 1116 return null; 1117 } 1118 1119 private GeoLocationInfo makeGeoLocationInfo(int lin, int ele, int nlins, int neles, 1120 int linMag, int eleMag) { 1121 geoLocInfo = null; 1122 1123 String plc = getPlace(); 1124 String type = getCoordinateType(); 1125 1126 AREACoordinateSystem macs = (AREACoordinateSystem)sampleProjection; 1127 Rectangle2D mapArea = macs.getDefaultMapArea(); 1128 double previewXDim = mapArea.getWidth(); 1129 double previewYDim = mapArea.getHeight(); 1130 1131 double dLine = (double)nlins/(2.0*this.previewLineRes)*Math.abs(linMag); 1132 double dEle = (double)neles/(2.0*this.previewEleRes)*Math.abs(eleMag); 1133 1134 if (plc.equals(PLACE_CENTER)) { 1135 displayEL[0][0] = ele; 1136 displayEL[1][0] = lin; 1137 displayEL[0][1] = ele - dEle; 1138 if (displayEL[0][1] < 0) displayEL[0][1] = 0.0; 1139 displayEL[1][1] = lin + dLine; 1140 if (displayEL[1][1] > previewYDim) displayEL[1][1] = previewYDim; 1141 } else if (plc.equals(PLACE_ULEFT)) { 1142 displayEL[0][0] = ele + dEle; 1143 if (displayEL[0][0] > previewXDim) displayEL[0][0] = previewXDim; 1144 displayEL[1][0] = lin - dLine; 1145 if (displayEL[1][0] < 0) displayEL[1][0] = 0.0; 1146 displayEL[0][1] = ele; 1147 displayEL[1][1] = lin; 1148 } 1149 int cEle = (int)Math.ceil(displayEL[0][0]); 1150 int cLin = (int)Math.ceil(displayEL[1][0]); 1151 displayEL[0][2] = cEle + dEle; 1152 if (displayEL[0][2] > previewXDim) displayEL[0][2] = previewXDim; 1153 displayEL[1][2] = cLin + dLine; 1154 if (displayEL[1][2] > previewYDim) displayEL[1][2] = previewYDim; 1155 displayEL[0][3] = cEle - dEle; 1156 if (displayEL[0][3] < 0) displayEL[0][3] = 0.0; 1157 displayEL[1][3] = cLin - dLine; 1158 if (displayEL[1][3] < 0) displayEL[1][3] = 0.0; 1159 displayEL[0][4] = cEle + dEle; 1160 if (displayEL[0][4] > previewXDim) displayEL[0][4] = previewXDim; 1161 displayEL[1][4] = cLin - dLine; 1162 if (displayEL[1][4] < 0) displayEL[1][4] = 0.0; 1163/* 1164 System.out.println("\nDisplay:"); 1165 System.out.println(" 0: " + displayEL[1][0] + " " + displayEL[0][0]); 1166 System.out.println(" 1: " + displayEL[1][1] + " " + displayEL[0][1]); 1167 System.out.println(" 2: " + displayEL[1][2] + " " + displayEL[0][2]); 1168 System.out.println(" 3: " + displayEL[1][3] + " " + displayEL[0][3]); 1169 System.out.println(" 4: " + displayEL[1][4] + " " + displayEL[0][4]); 1170*/ 1171 areaEL = displayCoordToAreaCoord(displayEL); 1172/* 1173 System.out.println("\nArea:"); 1174 System.out.println(" 0: " + areaEL[1][0] + " " + areaEL[0][0]); 1175 System.out.println(" 1: " + areaEL[1][1] + " " + areaEL[0][1]); 1176 System.out.println(" 2: " + areaEL[1][2] + " " + areaEL[0][2]); 1177 System.out.println(" 3: " + areaEL[1][3] + " " + areaEL[0][3]); 1178 System.out.println(" 4: " + areaEL[1][4] + " " + areaEL[0][4]); 1179*/ 1180 for (int i=0; i<5; i++) { 1181 if (areaEL[0][i] < 0.0) areaEL[0][i] = 0.0; 1182 if (areaEL[0][i] > this.maxEles) areaEL[0][i] = (double)this.maxEles; 1183 if (areaEL[1][i] < 0.0) areaEL[1][i] = 0.0; 1184 if (areaEL[1][i] > this.maxLines) areaEL[1][i] = (double)this.maxLines; 1185 } 1186 1187 try { 1188 latLon = macs.toReference(displayEL); 1189 } catch (Exception e) { 1190 System.out.println("Error converting input lat/lon e=" + e); 1191 } 1192/* 1193 System.out.println("\nLat/Lon:"); 1194 System.out.println(" 0: " + latLon[0][0] + " " + latLon[1][0]); 1195 System.out.println(" 1: " + latLon[0][1] + " " + latLon[1][1]); 1196 System.out.println(" 2: " + latLon[0][2] + " " + latLon[1][2]); 1197 System.out.println(" 3: " + latLon[0][3] + " " + latLon[1][3]); 1198 System.out.println(" 4: " + latLon[0][4] + " " + latLon[1][4]); 1199*/ 1200 double maxLat = latLon[0][1]; 1201 if (latLon[0][2] > maxLat) maxLat = latLon[0][2]; 1202 double minLat = latLon[0][3]; 1203 if (latLon[0][4] < minLat) minLat = latLon[0][4]; 1204 double maxLon = latLon[1][4]; 1205 if (latLon[1][2] > maxLon) maxLon = latLon[1][2]; 1206 double minLon = latLon[1][1]; 1207 if (latLon[1][3] < minLon) minLon = latLon[1][3]; 1208 1209 imageEL = this.previewNav.areaCoordToImageCoord(areaEL); 1210/* 1211 System.out.println("\nImage:"); 1212 System.out.println(" 0: " + imageEL[1][0] + " " + imageEL[0][0]); 1213 System.out.println(" 1: " + imageEL[1][1] + " " + imageEL[0][1]); 1214 System.out.println(" 2: " + imageEL[1][2] + " " + imageEL[0][2]); 1215 System.out.println(" 3: " + imageEL[1][3] + " " + imageEL[0][3]); 1216 System.out.println(" 4: " + imageEL[1][4] + " " + imageEL[0][4]); 1217*/ 1218 updateReadout(); 1219 1220 geoLocInfo = new GeoLocationInfo(maxLat, minLon, minLat, maxLon); 1221 1222 return geoLocInfo; 1223 } 1224 1225 /** 1226 * Get the list of advanced property names 1227 * 1228 * @return array of advanced property names 1229 */ 1230 protected String[] getAdvancedProps() { 1231 return ADVANCED_PROPS; 1232 } 1233 1234 /** 1235 * Get the list of advanced property labels 1236 * 1237 * @return list of advanced property labels 1238 */ 1239 protected String[] getAdvancedLabels() { 1240 return ADVANCED_LABELS; 1241 } 1242 1243 1244 /** 1245 * Cycle the place 1246 */ 1247 public void cyclePlace() { 1248 1249 String type = getCoordinateType(); 1250 int dLine = getNumLines()/2 * Math.abs(getLineMag()); 1251 int dEle = getNumEles()/2 * Math.abs(getElementMag()); 1252 if (this.place.equals(PLACE_CENTER)) { 1253 int newVal = this.areaLine + dLine; 1254 if (newVal > this.maxLines/2) newVal = this.maxLines/2; 1255 this.areaLine = newVal; 1256 newVal = this.areaElement + dEle; 1257 if (newVal > this.maxEles/2) newVal = this.maxEles/2; 1258 this.areaElement = newVal; 1259 } else { 1260 int newVal = this.areaLine - dLine; 1261 if (newVal < 0) newVal = 0; 1262 this.areaLine = newVal; 1263 newVal = this.areaElement - dEle; 1264 if (newVal < 0) newVal = 0; 1265 this.areaElement = newVal; 1266 } 1267 double[][] el = new double[2][1]; 1268 el[0][0] = this.areaElement; 1269 el[1][0] = this.areaLine; 1270 double[][] vals = this.areaNav.areaCoordToImageCoord(el); 1271 this.imageElement = (int)Math.floor(vals[0][0] + 0.5); 1272 this.imageLine = (int)Math.floor(vals[1][0] + 0.5); 1273 1274 if (type.equals(TYPE_AREA)) { 1275 setLine(this.areaLine); 1276 setElement(this.areaElement); 1277 } else if (type.equals(TYPE_IMAGE)) { 1278 setLine(this.imageLine); 1279 setElement(this.imageElement); 1280 } 1281 double[][] ll = this.areaNav.toLatLon(el); 1282 setLatitude(ll[0][0]); 1283 setLongitude(ll[1][0]); 1284 } 1285 1286 1287 /** 1288 * Associates the goven JComponent with the PROP_ property 1289 * identified by the given propId 1290 * 1291 * @param propId The property 1292 * @param comp The gui component that allows the user to set the property 1293 * 1294 * @return Just returns the given comp 1295 */ 1296 protected JComponent addPropComp(String propId, JComponent comp) { 1297 Object oldComp = propToComps.get(propId); 1298 if (oldComp != null) { 1299 throw new IllegalStateException( 1300 "Already have a component defined:" + propId); 1301 } 1302 propToComps.put(propId, comp); 1303 return comp; 1304 } 1305 1306 /** 1307 * Translate a place name into a human readable form 1308 * 1309 * @param place raw name 1310 * 1311 * @return human readable name 1312 */ 1313 protected String translatePlace(String thisPlace) { 1314 if (thisPlace.equals("Upper Left")) { 1315 return PLACE_ULEFT; 1316 } 1317 if (thisPlace.equals("Center")) { 1318 return PLACE_CENTER; 1319 } 1320 return thisPlace; 1321 } 1322 1323 private void setNumberOfLines(int val) { 1324 numLinesFld.setText(Integer.toString(val)); 1325 } 1326 1327 private void setNumberOfElements(int val) { 1328 numElementsFld.setText(Integer.toString(val)); 1329 } 1330 1331 public String getPlace() { 1332 try { 1333 this.place = translatePlace((String)locationComboBox.getSelectedItem()); 1334 } catch (Exception e) { 1335 this.place = defaultPlace; 1336 } 1337 return this.place; 1338 } 1339 1340 public void setPlace(String str) { 1341 if (str.equals("")) str = defaultPlace; 1342 this.place = str; 1343 if (str.equals(PLACE_CENTER)) 1344 locationComboBox.setSelectedItem("Center"); 1345 else 1346 locationComboBox.setSelectedItem("Upper Left"); 1347 } 1348 1349 public int getNumLines() { 1350 int val = -1; 1351 try { 1352 val = Integer.parseInt(numLinesFld.getText().trim()); 1353 } catch (Exception e) { 1354 System.out.println("=====> exception in getNumLines: e=" + e); 1355 } 1356 setNumLines(val); 1357 return this.numLines; 1358 } 1359 1360 public void setNumLines(int val) { 1361 this.numLines = val; 1362 if (val >= 0) setNumberOfLines(val); 1363 } 1364 1365 public int getNumEles() { 1366 int val = -1; 1367 try { 1368 val = Integer.parseInt(numElementsFld.getText().trim()); 1369 } catch (Exception e) { 1370 System.out.println("=====> exception in getNumEles: e=" + e); 1371 } 1372 setNumEles(val); 1373 return this.numEles; 1374 } 1375 1376 public void setNumEles(int val) { 1377 val = (int)((double)val/4.0 + 0.5)*4; 1378 this.numEles = val; 1379 if (val >= 0) setNumberOfElements(val); 1380 } 1381 1382 public int getLine() { 1383 int val = -1; 1384 try { 1385 if (!(centerLineFld.getText().equals(Misc.MISSING))) 1386 val = Integer.parseInt(centerLineFld.getText().trim()); 1387 } catch (Exception e) { 1388 } 1389 return val; 1390 } 1391 1392 protected void setLineElement() { 1393 double[][] el = getLineElement(); 1394 String type = getCoordinateType(); 1395 if (type.equals(TYPE_IMAGE)) { 1396 this.imageElement = (int)Math.floor(el[0][0] + 0.5); 1397 this.imageLine = (int)Math.floor(el[1][0] + 0.5); 1398 double[][] vals = this.areaNav.imageCoordToAreaCoord(el); 1399 this.areaElement = (int)Math.floor(vals[0][0] + 0.5); 1400 this.areaLine = (int)Math.floor(vals[1][0] + 0.5); 1401 } else { 1402 this.areaElement = (int)Math.floor(el[0][0] + 0.5); 1403 this.areaLine = (int)Math.floor(el[1][0] + 0.5); 1404 double[][] vals = this.areaNav.areaCoordToImageCoord(el); 1405 this.imageElement = (int)Math.floor(vals[0][0] + 0.5); 1406 this.imageLine = (int)Math.floor(vals[1][0] + 0.5); 1407 } 1408 } 1409 1410 public void setLine(int val) { 1411 if (val < 0) 1412 centerLineFld.setText(Misc.MISSING); 1413 else 1414 centerLineFld.setText(Integer.toString(val)); 1415 } 1416 1417 public int getElement() { 1418 int val =-1; 1419 try { 1420 val = Integer.parseInt(centerElementFld.getText().trim()); 1421 } catch (Exception e) { 1422 } 1423 return val; 1424 } 1425 1426 private double[][] getLineElement() { 1427 double[][] el = new double[2][1]; 1428 el[0][0] = (double)getElement(); 1429 el[1][0] = (double)getLine(); 1430 return el; 1431 } 1432 1433 public void setElement(int val) { 1434 if (val < 0) 1435 centerElementFld.setText(Misc.MISSING); 1436 else 1437 centerElementFld.setText(Integer.toString(val)); 1438 } 1439 1440 public int getLineMag() { 1441 return this.lineMag; 1442 } 1443 1444 private void setElementMag() { 1445 int val = 1; 1446 try { 1447 val = Integer.parseInt(eleMagFld.getText().trim()); 1448 } catch (Exception e) { 1449 System.out.println(" setElementMag e=" + e); 1450 return; 1451 } 1452 setElementMag(val); 1453 } 1454 1455 public void setLineMag(int val) { 1456 if (val > SLIDER_MAX) val = SLIDER_MAX; 1457 if (val < SLIDER_MIN-1) val = SLIDER_MIN-1; 1458 if (val == -1) val = 1; 1459 this.lineMag = val; 1460 setDLineMag((double)val); 1461 } 1462 1463 private void setLineMagSlider(int val) { 1464 if (val == 1) val = -1; 1465 if (val > SLIDER_MAX) val = -1; 1466 if (val < SLIDER_MIN) val = SLIDER_MIN-1; 1467 lineMagSlider.setValue(val + 1); 1468 } 1469 1470 public int getElementMag() { 1471 return this.elementMag; 1472 } 1473 1474 private void setLineMag() { 1475 int val = 1; 1476 try { 1477 val = Integer.parseInt(lineMagFld.getText().trim()); 1478 } catch (Exception e) { 1479 } 1480 setLineMag(val); 1481 } 1482 1483 public void setDLineMag(double val) { 1484 this.dLineMag = val; 1485 } 1486 1487 public double getDLineMag() { 1488 return this.dLineMag; 1489 } 1490 1491 public void setDElementMag(double val) { 1492 this.dElementMag = val; 1493 } 1494 1495 private void setElementMagSlider(int val) { 1496 if (val == 1) val = -1; 1497 if (val > SLIDER_MAX) val = -1; 1498 if (val < SLIDER_MIN) val = SLIDER_MIN-1; 1499 elementMagSlider.setValue(val + 1); 1500 } 1501 1502 public double getDElementMag() { 1503 return this.dElementMag; 1504 } 1505 1506 public void setElementMag(int val) { 1507 if (val > SLIDER_MAX) val = SLIDER_MAX; 1508 if (val < SLIDER_MIN-1) val = SLIDER_MIN-1; 1509 if (val == -1) val = 1; 1510 this.elementMag = val; 1511 setDElementMag((double)val); 1512 } 1513 1514 public double getLatitude() { 1515 double val = latLonWidget.getLat(); 1516// Double dbl = new Double(val); 1517 if (Double.isNaN(val)) val = defaultLat; 1518 if (val < -90.0 || val > 90.0) val = defaultLat; 1519 setLatitude(val); 1520 return this.latitude; 1521 } 1522 1523 private void setLatitude() { 1524 this.latitude = latLonWidget.getLat(); 1525 } 1526 1527 public void setLatitude(double val) { 1528 if (val < -90.0 || val > 90.0) 1529 val = defaultLat; 1530 latLonWidget.setLat(val); 1531 this.latitude = val; 1532 this.resetLatLon = false; 1533 } 1534 1535 private void setLongitude() { 1536 this.longitude = latLonWidget.getLon(); 1537 } 1538 1539 public double getLongitude() { 1540 double val = latLonWidget.getLon(); 1541// Double dbl = new Double(val); 1542 if (Double.isNaN(val)) val = defaultLon; 1543 if (val < -180.0 || val > 180.0) val = defaultLon; 1544 setLongitude(val); 1545 return this.longitude; 1546 } 1547 1548 public void setLongitude(double val) { 1549 if (val < -180.0 || val > 180.0) 1550 val = defaultLon; 1551 latLonWidget.setLon(val); 1552 this.longitude = val; 1553 this.resetLatLon = false; 1554 } 1555 1556 protected void convertToLineEle() { 1557 double[][] ll = new double[2][1]; 1558 ll[0][0] = getLatitude(); 1559 ll[1][0] = getLongitude(); 1560 double[][] el = this.areaNav.toLinEle(ll); 1561 this.areaElement = (int)Math.floor(el[0][0] + 0.5); 1562 this.areaLine = (int)Math.floor(el[1][0] + 0.5); 1563 el = this.areaNav.areaCoordToImageCoord(el); 1564 this.imageElement = (int)Math.floor(el[0][0] + 0.5); 1565 this.imageLine = (int)Math.floor(el[1][0] + 0.5); 1566 } 1567 1568 protected void convertToLatLon() { 1569 double[][] el = getLineElement(); 1570 double[][] ll = new double[2][1]; 1571 String coordType = getCoordinateType(); 1572 if (coordType.equals(TYPE_IMAGE)) 1573 el = this.previewNav.imageCoordToAreaCoord(el); 1574 1575 try { 1576 AREACoordinateSystem macs = (AREACoordinateSystem)sampleProjection; 1577 ll = macs.toReference(el); 1578 setLatitude(ll[0][0]); 1579 setLongitude(ll[1][0]); 1580 getGeoLocationInfo(); 1581 } catch (Exception e) { 1582 System.out.println("convertToLatLon e=" + e); 1583 } 1584 } 1585 1586 protected void convertToLatLon(int ele, int lin) { 1587 try { 1588 double[][] el = new double[2][1]; 1589 double[][] ll = new double[2][1]; 1590 AREACoordinateSystem macs = (AREACoordinateSystem)sampleProjection; 1591 el[0][0] = (double)ele; 1592 el[1][0] = (double)lin; 1593 ll = macs.toReference(el); 1594 setLatitude(ll[0][0]); 1595 setLongitude(ll[1][0]); 1596 double[][] imageLE = new double[2][1]; 1597 double[][] areaLE = new double[2][1]; 1598 areaLE = this.previewNav.toLinEle(ll); 1599 imageLE = this.previewNav.areaCoordToImageCoord(areaLE); 1600 setCenterCoords((int)imageLE[0][0], (int)imageLE[1][0]); 1601 getGeoLocationInfo(); 1602 } catch (Exception e) { 1603 System.out.println("convertToLatLon e=" + e); 1604 } 1605 } 1606 1607 protected double[][] convertToDisplayCoords() { 1608 double[][] el = getLineElement(); 1609 try { 1610 double[][] ll = new double[2][1]; 1611 AREACoordinateSystem macs = (AREACoordinateSystem)sampleProjection; 1612 String type = getCoordinateType(); 1613 if (type.equals(TYPE_LATLON)) { 1614 ll[0][0] = getLatitude(); 1615 ll[1][0] = getLongitude(); 1616 el = macs.fromReference(ll); 1617 } else { 1618 int[] dirB = macs.getDirBlock(); 1619 int previewLineMag = dirB[11]; 1620 int previewEleMag = dirB[12]; 1621 int dirLMag = this.previewDir.getValue(11); 1622 int dirEMag = this.previewDir.getValue(12); 1623 if (type.equals(TYPE_IMAGE)) 1624 el = this.areaNav.imageCoordToAreaCoord(el); 1625 Rectangle2D mapArea = macs.getDefaultMapArea(); 1626 int previewXDim = new Long(new Double(mapArea.getMaxX() - mapArea.getMinX()).longValue()).intValue(); 1627 int previewYDim = new Long(new Double(mapArea.getMaxY() - mapArea.getMinY()).longValue()).intValue(); 1628 el[0][0] = el[0][0] * dirEMag / previewEleMag; 1629 el[1][0] = previewYDim - 1 - el[1][0] * dirLMag / previewLineMag;; 1630 } 1631 } catch (Exception e) { 1632 System.out.println("convertToDisplayCoords e=" + e); 1633 } 1634 return el; 1635 } 1636 1637 private double[][] displayCoordToAreaCoord(double[][] disp) { 1638 double[][] area = new double[2][disp[0].length]; 1639 try { 1640 if (sampleProjection != null) { 1641 AREACoordinateSystem macs = (AREACoordinateSystem)sampleProjection; 1642 double[][] ll = macs.toReference(disp); 1643 double[][] el = this.areaNav.toLinEle(ll); 1644 int midEle = (int)Math.floor(el[0][0] + 0.5); 1645 int midLin = (int)Math.floor(el[1][0] + 0.5); 1646 1647 int width = (int)Math.floor(Math.abs(disp[0][2] - disp[0][1]) 1648 * getPreviewEleRes() + 0.5); 1649 1650 int height = (int)Math.floor(Math.abs(disp[1][3] - disp[1][1]) 1651 * getPreviewLineRes() + 0.5); 1652 int deltaEle = width/2; 1653 int deltaLin = height/2; 1654 1655 area[0][0] = midEle; 1656 area[1][0] = midLin; 1657 area[0][1] = midEle - deltaEle; 1658 area[1][1] = midLin - deltaLin; 1659 area[0][2] = midEle + deltaEle; 1660 area[1][2] = midLin - deltaLin; 1661 area[0][3] = midEle - deltaEle; 1662 area[1][3] = midLin + deltaLin; 1663 area[0][4] = midEle + deltaEle; 1664 area[1][4] = midLin + deltaLin; 1665 1666 } 1667 } catch (Exception e) { 1668 System.out.println("displayCoordToAreaCoord e=" + e); 1669 } 1670 return area; 1671 } 1672 1673 private double[][] areaCoordToDisplayCoord(double[][] area) { 1674 double[][] disp = new double[2][area[0].length]; 1675 try { 1676 if (sampleProjection != null) { 1677 AREACoordinateSystem macs = (AREACoordinateSystem)sampleProjection; 1678 int[] dirB = macs.getDirBlock(); 1679 int previewLineMag = dirB[11]; 1680 int previewEleMag = dirB[12]; 1681 Rectangle2D mapArea = macs.getDefaultMapArea(); 1682 int previewXDim = new Long(new Double(mapArea.getMaxX() - mapArea.getMinX()).longValue()).intValue(); 1683 int previewYDim = new Long(new Double(mapArea.getMaxY() - mapArea.getMinY()).longValue()).intValue(); 1684 for (int i=0; i<area[0].length; i++) { 1685 disp[0][i] = area[0][i] / previewEleMag; 1686 disp[1][i] = previewYDim - 1 - area[1][i] / previewLineMag; 1687 } 1688 } 1689 } catch (Exception e) { 1690 System.out.println("displayCoordToAreaCoord e=" + e); 1691 } 1692 return disp; 1693 } 1694 1695 protected void convertToLinEle() { 1696 try { 1697 double[][] el = new double[2][1]; 1698 double[][] ll = new double[2][1]; 1699 AREACoordinateSystem macs = (AREACoordinateSystem)sampleProjection; 1700 ll[0][0] = getLatitude(); 1701 ll[1][0] = getLongitude(); 1702 String coordType = getCoordinateType(); 1703 el = this.previewNav.toLinEle(ll); 1704 if (coordType.equals(TYPE_IMAGE)) 1705 el = this.previewNav.areaCoordToImageCoord(el); 1706 setLine((int)el[1][0]); 1707 setElement((int)el[0][0]); 1708 getGeoLocationInfo(); 1709 } catch (Exception e) { 1710 System.out.println("convertToLinEle e=" + e); 1711 } 1712 } 1713 1714 public String getCoordinateType() { 1715 String ret = defaultType; 1716 try { 1717 ret = (String)coordinateTypeComboBox.getSelectedItem(); 1718 } catch (Exception e) { 1719 } 1720 return ret; 1721 } 1722 1723 protected void setCoordinateType(String type) { 1724 if (!type.equals(TYPE_IMAGE)) { 1725 if (!type.equals(TYPE_AREA)) { 1726 type = TYPE_LATLON; 1727 } 1728 } 1729 coordinateTypeComboBox.setSelectedItem(type); 1730 } 1731 1732 protected void setLockOn(boolean val) { 1733 lockBtn.setSelected(val); 1734 } 1735 1736 public boolean getLockOn() { 1737 return lockBtn.isSelected(); 1738 } 1739 1740 protected void setULCoords(double x, double y) { 1741 uLLine = (int)y; 1742 uLEle = (int)x; 1743 } 1744 1745 protected void setCenterCoords(int x, int y) { 1746 centerLine = y; 1747 setLine(y); 1748 centerEle = x; 1749 setElement(x); 1750 } 1751 1752 protected void elementMagSliderChanged(boolean recomputeLineEleRatio) { 1753 int value = getElementMag(); 1754 if (!amUpdating) { 1755 value = getElementMagValue(); 1756 setElementMag(value); 1757 } 1758 if ((Math.abs(value) < SLIDER_MAX)) { 1759 int lineMag = getLineMagValue(); 1760 if (lineMag > value) { 1761 linesToElements = Math.abs(lineMag 1762 / (double) value); 1763 } else { 1764 linesToElements = Math.abs((double) value 1765 / lineMag); 1766 } 1767 } 1768 elementMagLbl.setText("Ele Mag="); 1769 eleMagFld.setText(new Integer(value).toString()); 1770 String str = " Res=" + 1771 truncateNumericString(Double.toString(this.baseERes*Math.abs(value)), 1); 1772 elementResLbl.setText(StringUtil.padLeft(str, 4) + kmLbl); 1773 1774 if (!lockBtn.isSelected()) { 1775 if (value > 0) { 1776 setNumberOfElements((int)(this.baseNumElements * value)); 1777 } else { 1778 setNumberOfElements((int)(this.baseNumElements 1779 / (double) -value)); 1780 } 1781 } 1782 } 1783 1784 private void changeLineMagSlider(boolean autoSetSize) { 1785 int value = getLineMag(); 1786 setLineMagSlider(value); 1787 } 1788 1789 private void changeEleMagSlider(boolean autoSetSize) { 1790 int value = getElementMag(); 1791 setElementMagSlider(value); 1792 } 1793 1794 /** 1795 * Handle the line mag slider changed event 1796 * 1797 * @param evt the event 1798 */ 1799 protected void lineMagSliderChanged(boolean autoSetSize) { 1800 try { 1801 int value = getLineMag(); 1802 if (!amUpdating) { 1803 value = getLineMagValue(); 1804 setLineMag(value); 1805 } 1806 lineMagLbl.setText("Line Mag="); 1807 lineMagFld.setText(new Integer(value).toString()); 1808 String str = " Res=" + 1809 truncateNumericString(Double.toString(this.baseLRes*Math.abs(value)), 1); 1810 lineResLbl.setText(StringUtil.padLeft(str, 4) + kmLbl); 1811 1812 if (autoSetSize) { 1813 if (value > 0) { 1814 setNumberOfLines((int)(this.baseNumLines * value)); 1815 } else { 1816 setNumberOfLines((int)(this.baseNumLines 1817 / (double) -value)); 1818 } 1819 } 1820 1821 if (value == 1) { // special case 1822 if (linesToElements < 1.0) { 1823 value = (int) (-value / linesToElements); 1824 } else { 1825 value = (int) (value * linesToElements); 1826 } 1827 } else if (value > 1) { 1828 value = (int) (value * linesToElements); 1829 } else { 1830 value = (int) (value / linesToElements); 1831 } 1832 1833 amSettingProperties = true; 1834 setElementMag(value); 1835 setElementMagSlider(value); 1836 amSettingProperties = false; 1837 elementMagSliderChanged(false); 1838 } catch (Exception exc) { 1839 System.out.println("Setting line magnification" + exc); 1840 } 1841 } 1842 1843 /** 1844 * Get the value of the line magnification slider. 1845 * 1846 * @return The magnification value for the line 1847 */ 1848 protected int getLineMagValue() { 1849 int val = getMagValue(lineMagSlider); 1850 return val; 1851 } 1852 1853 /** 1854 * Get the value of the element magnification slider. 1855 * 1856 * @return The magnification value for the element 1857 */ 1858 protected int getElementMagValue() { 1859 int val = getMagValue(elementMagSlider) - 1; 1860 setElementMag(val); 1861 return val; 1862 } 1863 1864 /** 1865 * Get the value of the given magnification slider. 1866 * 1867 * @param slider The slider to get the value from 1868 * @return The magnification value 1869 */ 1870 private int getMagValue(JSlider slider) { 1871 //Value is [-SLIDER_MAX,SLIDER_MAX]. We change 0 and -1 to 1 1872 int value = slider.getValue(); 1873 if (value == 0) { 1874 value = SLIDER_MAX; 1875 return value; 1876 } else if (value < SLIDER_MIN) { 1877 value = SLIDER_MIN; 1878 } 1879 return value - 1; 1880 } 1881 1882 1883 /** 1884 * _more_ 1885 * 1886 * @param el _more_ 1887 * @param name _more_ 1888 * @param listener _more_ 1889 * 1890 * @return _more_ 1891 */ 1892 1893 private JMenuItem makeLocationMenuItem(final LatLonPoint llp, 1894 final String name) { 1895 JMenuItem mi = null; 1896 try { 1897 double alt = 0.0; 1898 EarthLocationTuple elt = 1899 new EarthLocationTuple(llp.getLatitude(), llp.getLongitude(), alt); 1900 mi = 1901 new JMenuItem( 1902 StringUtil.padRight(name + ": ", 15, " ") 1903 + dataSource.getDataContext().getIdv().getDisplayConventions() 1904 .formatLatLonPoint(elt.getLatLonPoint())); 1905 GuiUtils.setFixedWidthFont(mi); 1906 } catch (Exception e) { 1907 System.out.println("makeLocationMenuItem e=" + e); 1908 } 1909 return mi; 1910 } 1911 1912 1913 public boolean getIsLineEle() { 1914 return this.isLineEle; 1915 } 1916 1917 public void setIsLineEle(boolean val) { 1918 this.isLineEle = val; 1919 } 1920 1921 1922 public double getLRes() { 1923 return this.lRes; 1924 } 1925 1926 public void setLRes(double val) { 1927 if (val < 1) val = this.baseLRes; 1928 this.lRes = val; 1929 } 1930 1931 public void setBLRes(double val) { 1932 this.bLRes = val; 1933 } 1934 1935 public void setBERes(double val) { 1936 this.bERes = val; 1937 } 1938 1939 public double getBLRes() { 1940 return this.bLRes; 1941 } 1942 1943 public double getBERes() { 1944 return this.bERes; 1945 } 1946 1947 public double getERes() { 1948 return this.eRes; 1949 } 1950 1951 public void setERes(double val) { 1952 if (val < 1) val = this.baseERes; 1953 this.eRes = val; 1954 } 1955 1956 public int getPreviewLineRes() { 1957 return this.previewLineRes; 1958 } 1959 1960 public void setPreviewLineRes(int val) { 1961 this.previewLineRes = val; 1962 } 1963 1964 public int getPreviewEleRes() { 1965 return this.previewEleRes; 1966 } 1967 1968 public void setPreviewEleRes(int val) { 1969 this.previewEleRes = val; 1970 } 1971 1972 private String truncateNumericString(String str, int numDec) { 1973 int indx = str.indexOf(".") + numDec + 1; 1974 if (indx >= str.length()) indx = str.length(); 1975 return str.substring(0,indx); 1976 } 1977 1978 public String getLatLonType() { 1979 return TYPE_LATLON; 1980 } 1981 1982 protected double[][] getLatLonPoints() { 1983 return latLon; 1984 } 1985 1986 protected double[][] getImagePoints() { 1987 return imageEL; 1988 } 1989 1990 protected double[][] getAreaPoints() { 1991 return areaEL; 1992 } 1993 1994 protected double[][] getDisplayELPoints() { 1995 return displayEL; 1996 } 1997 1998 protected double getBaseLRes() { 1999 return this.baseLRes; 2000 } 2001 2002 protected double getBaseERes() { 2003 return this.baseERes; 2004 } 2005 2006 protected void setBaseNumLines(int val) { 2007 this.baseNumLines = (double)val; 2008 } 2009 2010 public void setDataChoice(DataChoice choice) { 2011 logger.trace("oldChoice={} newChoice={}", this.dataChoice, choice); 2012 this.dataChoice = choice; 2013 } 2014 2015 public DataChoice getDataChoice() { 2016 return this.dataChoice; 2017 } 2018 2019 protected void setBaseNumElements(int val) { 2020 this.baseNumElements = (double)val; 2021 } 2022 2023 public void update(AreaDirectory dir, MapProjection sample, AREAnav nav, 2024 String coordType, double[] coords) { 2025 boolean saveLock = getLockOn(); 2026 setLockOn(true); 2027 this.maxLines = dir.getLines(); 2028 this.maxEles = dir.getElements(); 2029 sampleProjection = sample; 2030 2031 double baseLResOld = getBaseLRes(); 2032 double baseEResOld = getBaseERes(); 2033 double lDMagOld = getDLineMag(); 2034 double eDMagOld = getDElementMag(); 2035 int lMagOld = getLineMag(); 2036 int eMagOld = getElementMag(); 2037 int lSizeOld = getNumLines(); 2038 int eSizeOld = getNumEles(); 2039 2040 double baseLResNew = getBLRes(); 2041 double baseEResNew = getBERes(); 2042 try { 2043 baseLResNew *= (double)(dir.getValue(11)); 2044 baseEResNew *= (double)(dir.getValue(12)); 2045 } catch (Exception e) { 2046 } 2047 2048 double lDMagNew = lDMagOld * baseLResOld / baseLResNew; 2049 int lMagNew = (int)Math.ceil(lDMagNew - 0.5); 2050 if (lMagNew > -2) lMagNew = 1; 2051 double eDMagNew = eDMagOld * baseEResOld / baseEResNew; 2052 int eMagNew = (int)Math.ceil(eDMagNew - 0.5); 2053 if (eMagNew > -2) eMagNew = 1; 2054 2055 double lResOld = Math.abs(lMagOld) * baseLResOld; 2056 double eResOld = Math.abs(eMagOld) * baseEResOld; 2057 double lResNew = Math.abs(lMagNew) * baseLResNew; 2058 double eResNew = Math.abs(eMagNew) * baseEResNew; 2059 2060 int lSizeNew = (int)Math.floor(((double)lSizeOld * lResOld / lResNew) + 0.5); 2061 if (lSizeNew > this.maxLines) lSizeNew = this.maxLines; 2062 int eSizeNew = (int)Math.floor(((double)eSizeOld * eResOld / eResNew) + 0.5); 2063 if (eSizeNew > this.maxEles) eSizeNew = this.maxEles; 2064 setNumLines(lSizeNew); 2065 setNumEles(eSizeNew); 2066 2067 this.baseLRes = baseLResNew; 2068 this.baseERes = baseEResNew; 2069 2070 amUpdating = true; 2071 amSettingProperties = true; 2072 int newVal = 0; 2073 try { 2074 this.defaultLineMag = lMagNew; 2075 setLRes(lResNew); 2076 newVal = lMagNew; 2077 if (newVal > -2) newVal = 1; 2078 setLineMag(newVal); 2079 changeLineMagSlider(!lockBtn.isSelected()); 2080 } catch (Exception e) { 2081 System.out.println("lineMagSlider: e=" + e); 2082 } 2083 2084 try { 2085 this.defaultElementMag = eMagNew; 2086 setERes(eResNew); 2087 newVal = eMagNew; 2088 if (newVal > -2) newVal = 1; 2089 } catch (Exception e) { 2090 System.out.println("elementMagSlider: e=" + e); 2091 } 2092 amUpdating = false; 2093 amSettingProperties = false; 2094 2095 int ele = 0; 2096 AREACoordinateSystem macs = (AREACoordinateSystem)sampleProjection; 2097 Rectangle2D mapArea = macs.getDefaultMapArea(); 2098 double previewYDim = mapArea.getHeight(); 2099 int line = (int)Math.floor(previewYDim); 2100 try { 2101 int lat = (int)Math.floor(getLatitude() + 0.5); 2102 if ((lat <= 90.0) && (lat >= -90.0)) { 2103 double[][] ll = new double[2][1]; 2104 ll[0][0] = lat; 2105 ll[1][0] = getLongitude(); 2106 double[][] el = sample.fromReference(ll); 2107 ele = (int)Math.floor(el[0][0] + 0.5); 2108 line = (int)Math.floor(el[1][0] + 0.5); 2109 } 2110 this.areaNav = nav; 2111 int areaLinRes = dir.getValue(11); 2112 int areaEleRes = dir.getValue(12); 2113 int startLine = dir.getValue(5); 2114 int startEle = dir.getValue(6); 2115 this.previewDir = dir; 2116 this.areaNav = this.previewNav; 2117 this.areaNav.setRes(areaLinRes, areaEleRes); 2118 this.areaNav.setImageStart(startLine, startEle); 2119 2120 setCoordinateType(coordType); 2121 if (coordType.equals(TYPE_LATLON)) { 2122 setLatitude(coords[0]); 2123 setLongitude(coords[1]); 2124 convertToLineEle(); 2125 } else if (coordType.equals(TYPE_AREA)) { 2126 double dCoord = coords[0] * baseLResOld/baseLResNew; 2127 setLine((int)Math.floor(dCoord+0.5)); 2128 dCoord = coords[1] * baseEResOld/baseEResNew; 2129 setElement((int)Math.floor(dCoord+0.5)); 2130 setLineElement(); 2131 convertToLatLon(); 2132 } 2133 2134 } catch (Exception e) { 2135 System.out.println("e=" + e); 2136 } 2137 2138 try { 2139 rawSizeLbl.setText(" Raw size: " + this.maxLines + " X " + this.maxEles); 2140 } catch (Exception e) { 2141 System.out.println("updating raw size: e=" + e); 2142 } 2143 2144 amUpdating = true; 2145 lineMagSliderChanged(false); 2146 setElementMag(newVal); 2147 elementMagSliderChanged(false); 2148 amUpdating = false; 2149 changeEleMagSlider(!lockBtn.isSelected()); 2150 setLockOn(saveLock); 2151 getGeoLocationInfo(line, ele); 2152 } 2153}