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