// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.ImportImagePlugin; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; import java.util.Vector; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.geotools.referencing.CRS; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.openstreetmap.josm.Main; /** * UI-Dialog which provides: * - general and spatial information about the georeferenced image * - a possiblitly to change the source reference system of the image * * * @author Christoph Beekmans, Fabian Kowitz, Anna Robaszkiewicz, Oliver Kuhn, Martin Ulitzny * */ public class LayerPropertiesDialog extends JFrame { private Vector<String> supportedCRS; private ImageLayer imageLayer; private JPanel mainPanel = null; private JPanel jPanel = null; private JPanel buttonPanel = null; private JTabbedPane jTabbedPane = null; private JPanel infoPanel = null; private JPanel crsPanel = null; private JButton okButton = null; private JLabel layerNameLabel = null; private JLabel layerNameValueLabel = null; private JLabel imageFileLabel = null; private JLabel imageFileValueLabel = null; private JLabel sizeLabel = null; private JLabel sizeValueLabel = null; private JLabel crsLabel = null; private JLabel crsValueLabel = null; private JLabel extentLabel = null; private JLabel defaultCRSDescriptorLabel = null; private JLabel defaultCRSLabel = null; private JTextField searchField = null; private JScrollPane crsListScrollPane = null; private JList<String> crsJList = null; private JButton useDefaultCRSButton = null; private JButton applySelectedCRSButton = null; private JButton setSelectedCRSAsDefaultButton = null; private JLabel searchFieldLabel = null; private JCheckBox eastingFirstCheckBox = null; private JLabel eastingFirstLabel = null; private JLabel tabDescriptionLabel = null; private JLabel upperLeftLabel = null; private JLabel lowerLeftLabel = null; private JLabel upperRightLabel = null; private JLabel lowerRightLabel = null; private JLabel upperLeftValueLabel = null; private JLabel upperRightValueLabel = null; private JLabel lowerLeftValueLabel = null; private JLabel lowerRightValueLabel = null; private JLabel currentCRSLabel = null; private JLabel currentCRSValueLabel = null; /** * This method initializes * */ public LayerPropertiesDialog(ImageLayer imageLayer, Vector<String> supportedCRS) { super(imageLayer.getName()); this.supportedCRS = supportedCRS; this.imageLayer = imageLayer; initialize(); } /** * This method initializes * */ public LayerPropertiesDialog(Vector<String> supportedCRS) { super(); this.supportedCRS = supportedCRS; initialize(); } /** * This method initializes this * */ private void initialize() { this.setMinimumSize(new Dimension(404, 485)); this.setContentPane(getMainPanel()); this.setPreferredSize(new Dimension(404, 485)); } /** * This method initializes mainPanel * * @return javax.swing.JPanel */ private JPanel getMainPanel() { if (mainPanel == null) { mainPanel = new JPanel(); mainPanel.setLayout(null); mainPanel.add(getJPanel(), null); mainPanel.add(getButtonPanel(), null); } return mainPanel; } /** * This method initializes jPanel * * @return javax.swing.JPanel */ private JPanel getJPanel() { if (jPanel == null) { GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.gridy = 0; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.gridx = 0; jPanel = new JPanel(); jPanel.setLayout(new GridBagLayout()); jPanel.setBounds(new Rectangle(0, 0, 391, 406)); jPanel.add(getJTabbedPane(), gridBagConstraints); } return jPanel; } /** * This method initializes buttonPanel * * @return javax.swing.JPanel */ private JPanel getButtonPanel() { if (buttonPanel == null) { buttonPanel = new JPanel(); buttonPanel.setLayout(null); buttonPanel.setBounds(new Rectangle(0, 405, 391, 46)); buttonPanel.add(getOkButton(), null); } return buttonPanel; } /** * This method initializes jTabbedPane * * @return javax.swing.JTabbedPane */ private JTabbedPane getJTabbedPane() { if (jTabbedPane == null) { jTabbedPane = new JTabbedPane(); jTabbedPane.addTab("General Information", null, getInfoPanel(), null); jTabbedPane.addTab("Source Reference System", null, getCrsPanel(), null); } return jTabbedPane; } /** * This method initializes infoPanel * * @return javax.swing.JPanel */ private JPanel getInfoPanel() { if (infoPanel == null) { lowerRightValueLabel = new JLabel(); lowerRightValueLabel.setBounds(new Rectangle(210, 315, 134, 16)); lowerRightValueLabel.setHorizontalAlignment(SwingConstants.RIGHT); lowerRightValueLabel.setText((float) imageLayer.getBbox().getMinX() + ", " + (float) imageLayer.getBbox().getMaxY()); lowerLeftValueLabel = new JLabel(); lowerLeftValueLabel.setBounds(new Rectangle(30, 315, 133, 16)); lowerLeftValueLabel.setHorizontalAlignment(SwingConstants.LEFT); lowerLeftValueLabel.setText((float) imageLayer.getBbox().getMinX() + ", " + (float) imageLayer.getBbox().getMinY()); upperRightValueLabel = new JLabel(); upperRightValueLabel.setBounds(new Rectangle(210, 255, 138, 16)); upperRightValueLabel.setHorizontalAlignment(SwingConstants.RIGHT); upperRightValueLabel.setText((float) imageLayer.getBbox().getMaxX() + ", " + (float) imageLayer.getBbox().getMaxY()); upperLeftValueLabel = new JLabel(); upperLeftValueLabel.setBounds(new Rectangle(30, 255, 133, 16)); upperLeftValueLabel.setHorizontalAlignment(SwingConstants.LEFT); upperLeftValueLabel.setText((float) imageLayer.getBbox().getMaxX() + ", " + (float) imageLayer.getBbox().getMinY()); lowerRightLabel = new JLabel(); lowerRightLabel.setBounds(new Rectangle(287, 344, 74, 16)); lowerRightLabel.setText("Lower Right"); upperRightLabel = new JLabel(); upperRightLabel.setBounds(new Rectangle(285, 225, 91, 16)); upperRightLabel.setText("Upper Right"); lowerLeftLabel = new JLabel(); lowerLeftLabel.setBounds(new Rectangle(15, 345, 92, 16)); lowerLeftLabel.setText("Lower Left"); upperLeftLabel = new JLabel(); upperLeftLabel.setBounds(new Rectangle(15, 224, 91, 16)); upperLeftLabel.setText("Upper Left"); extentLabel = new JLabel(); extentLabel.setBounds(new Rectangle(120, 195, 136, 16)); extentLabel.setEnabled(false); extentLabel.setHorizontalAlignment(SwingConstants.CENTER); extentLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED); extentLabel.setText("Extent"); crsValueLabel = new JLabel(); crsValueLabel.setBounds(new Rectangle(150, 150, 226, 16)); String crsDescription = ""; try { crsDescription = imageLayer.getBbox().getCoordinateReferenceSystem().getIdentifiers().iterator().next().toString(); } catch (Exception e) { Main.debug(e); } crsValueLabel.setText(crsDescription + "(" + imageLayer.getBbox().getCoordinateReferenceSystem().getName().toString() + ")"); crsLabel = new JLabel(); crsLabel.setBounds(new Rectangle(15, 150, 118, 16)); crsLabel.setText("Reference System"); sizeValueLabel = new JLabel(); sizeValueLabel.setBounds(new Rectangle(150, 105, 226, 16)); sizeValueLabel.setText(imageLayer.getImage().getHeight() + " x " + imageLayer.getImage().getWidth()); sizeLabel = new JLabel(); sizeLabel.setBounds(new Rectangle(15, 105, 121, 16)); sizeLabel.setText("Image size"); imageFileValueLabel = new JLabel(); imageFileValueLabel.setBounds(new Rectangle(150, 60, 226, 16)); imageFileValueLabel.setText(imageLayer.getImageFile().getAbsolutePath()); imageFileValueLabel.setToolTipText(imageLayer.getImageFile().getAbsolutePath()); imageFileLabel = new JLabel(); imageFileLabel.setBounds(new Rectangle(15, 60, 121, 16)); imageFileLabel.setText("Image file"); layerNameValueLabel = new JLabel(); layerNameValueLabel.setBounds(new Rectangle(150, 15, 226, 16)); layerNameValueLabel.setText(imageLayer.getName()); layerNameLabel = new JLabel(); layerNameLabel.setBounds(new Rectangle(15, 15, 121, 16)); layerNameLabel.setText("Layer name"); infoPanel = new JPanel(); infoPanel.setLayout(null); infoPanel.setFont(new Font("Dialog", Font.BOLD, 12)); infoPanel.add(layerNameLabel, null); infoPanel.add(layerNameValueLabel, null); infoPanel.add(imageFileLabel, null); infoPanel.add(imageFileValueLabel, null); infoPanel.add(sizeLabel, null); infoPanel.add(sizeValueLabel, null); infoPanel.add(crsLabel, null); infoPanel.add(crsValueLabel, null); infoPanel.add(extentLabel, null); infoPanel.add(upperLeftLabel, null); infoPanel.add(lowerLeftLabel, null); infoPanel.add(upperRightLabel, null); infoPanel.add(lowerRightLabel, null); infoPanel.add(upperLeftValueLabel, null); infoPanel.add(upperRightValueLabel, null); infoPanel.add(lowerLeftValueLabel, null); infoPanel.add(lowerRightValueLabel, null); } return infoPanel; } /** * This method initializes crsPanel * * @return javax.swing.JPanel */ private JPanel getCrsPanel() { if (crsPanel == null) { currentCRSValueLabel = new JLabel(); currentCRSValueLabel.setBounds(new Rectangle(78, 33, 297, 16)); String crsDescription = "unknown"; try { crsDescription = imageLayer.getSourceRefSys().getIdentifiers().iterator().next().toString(); } catch (Exception e) { Main.debug(e); } currentCRSValueLabel.setText(crsDescription); currentCRSLabel = new JLabel(); currentCRSLabel.setBounds(new Rectangle(15, 33, 52, 16)); currentCRSLabel.setText("Current:"); tabDescriptionLabel = new JLabel(); tabDescriptionLabel.setBounds(new Rectangle(15, 9, 361, 16)); tabDescriptionLabel.setText("Set here the source reference system of the image"); eastingFirstLabel = new JLabel(); eastingFirstLabel.setBounds(new Rectangle(315, 210, 76, 46)); eastingFirstLabel.setHorizontalTextPosition(SwingConstants.TRAILING); eastingFirstLabel.setHorizontalAlignment(SwingConstants.CENTER); eastingFirstLabel.setText("<html>Easting<br>first</html>"); searchFieldLabel = new JLabel(); searchFieldLabel.setBounds(new Rectangle(298, 114, 84, 16)); searchFieldLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED); searchFieldLabel.setHorizontalTextPosition(SwingConstants.TRAILING); searchFieldLabel.setHorizontalAlignment(SwingConstants.CENTER); searchFieldLabel.setText("Search"); defaultCRSLabel = new JLabel(); defaultCRSLabel.setBounds(new Rectangle(15, 89, 361, 16)); defaultCRSLabel.setText(PluginOperations.defaultSourceCRSDescription); defaultCRSDescriptorLabel = new JLabel(); defaultCRSDescriptorLabel.setBounds(new Rectangle(15, 63, 226, 16)); defaultCRSDescriptorLabel.setText("Default Reference System:"); crsPanel = new JPanel(); crsPanel.setLayout(null); crsPanel.add(defaultCRSDescriptorLabel, null); crsPanel.add(defaultCRSLabel, null); crsPanel.add(getSearchField(), null); crsPanel.add(getCrsListScrollPane(), null); crsPanel.add(getUseDefaultCRSButton(), null); crsPanel.add(getApplySelectedCRSButton(), null); crsPanel.add(getSetSelectedCRSAsDefaultButton(), null); crsPanel.add(searchFieldLabel, null); crsPanel.add(getEastingFirstCheckBox(), null); crsPanel.add(eastingFirstLabel, null); crsPanel.add(tabDescriptionLabel, null); crsPanel.add(currentCRSLabel, null); crsPanel.add(currentCRSValueLabel, null); } return crsPanel; } /** * This method initializes okButton * * @return javax.swing.JButton */ private JButton getOkButton() { if (okButton == null) { okButton = new JButton(); okButton.setBounds(new Rectangle(134, 5, 136, 31)); okButton.setText("OK"); okButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent e) { setVisible(false); dispose(); } }); } return okButton; } /** * This method initializes searchField * * @return javax.swing.JTextField */ private JTextField getSearchField() { if (searchField == null) { searchField = new JTextField(); searchField.setBounds(new Rectangle(13, 111, 282, 20)); searchField.setToolTipText("Enter keywords or EPSG codes"); searchField.addKeyListener(new java.awt.event.KeyAdapter() { @Override public void keyTyped(java.awt.event.KeyEvent e) { for (Iterator<String> iterator = supportedCRS.iterator(); iterator.hasNext();) { String type = iterator.next(); if (type.contains(searchField.getText())) { crsJList.setSelectedIndex(supportedCRS.indexOf(type)); crsJList.ensureIndexIsVisible(supportedCRS.indexOf(type)); break; } } } }); } return searchField; } /** * This method initializes crsListScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getCrsListScrollPane() { if (crsListScrollPane == null) { crsListScrollPane = new JScrollPane(); crsListScrollPane.setBounds(new Rectangle(15, 135, 301, 241)); crsListScrollPane.setViewportView(getCrsJList()); } return crsListScrollPane; } /** * This method initializes crsJList * * @return javax.swing.JList */ private JList<String> getCrsJList() { if (crsJList == null) { crsJList = new JList<>(supportedCRS); crsJList.addListSelectionListener(new ListSelectionHandler()); } return crsJList; } /** * This method initializes useDefaultCRSButton * * @return javax.swing.JButton */ private JButton getUseDefaultCRSButton() { if (useDefaultCRSButton == null) { useDefaultCRSButton = new JButton(); useDefaultCRSButton.setBounds(new Rectangle(253, 54, 118, 28)); useDefaultCRSButton.setText("Apply Default"); useDefaultCRSButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent e) { try { setCursor(new Cursor(Cursor.WAIT_CURSOR)); if (PluginOperations.defaultSourceCRS != null) { imageLayer.resample(PluginOperations.defaultSourceCRS); } else { JOptionPane.showMessageDialog(getContentPane(), "<html>No default reference system available.<br>Please select one from the list</html>"); } } catch (NoSuchAuthorityCodeException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (FactoryException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } finally { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } } }); } return useDefaultCRSButton; } /** * This method initializes applySelectedCRSButton * * @return javax.swing.JButton */ private JButton getApplySelectedCRSButton() { if (applySelectedCRSButton == null) { applySelectedCRSButton = new JButton(); applySelectedCRSButton.setBounds(new Rectangle(315, 135, 69, 61)); applySelectedCRSButton.setHorizontalAlignment(SwingConstants.CENTER); applySelectedCRSButton.setHorizontalTextPosition(SwingConstants.TRAILING); applySelectedCRSButton.setText("<html>Apply<br>Selection</html>"); applySelectedCRSButton.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent e) { String selection = crsJList.getSelectedValue(); String code = selection.substring(selection.indexOf("[-") + 2, selection.indexOf("-]")); CoordinateReferenceSystem newRefSys = null; try { newRefSys = CRS.decode(code, eastingFirstCheckBox.isSelected()); setCursor(new Cursor(Cursor.WAIT_CURSOR)); imageLayer.resample(newRefSys); } catch (NoSuchAuthorityCodeException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (FactoryException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } finally { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } } }); } return applySelectedCRSButton; } /** * This method initializes setSelectedCRSAsDefaultButton * * @return javax.swing.JButton */ private JButton getSetSelectedCRSAsDefaultButton() { if (setSelectedCRSAsDefaultButton == null) { setSelectedCRSAsDefaultButton = new JButton(); setSelectedCRSAsDefaultButton.setBounds(new Rectangle(315, 300, 69, 61)); setSelectedCRSAsDefaultButton.setText("<html>Set as<br>Default</html>"); setSelectedCRSAsDefaultButton .addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent e) { if (crsJList.getSelectedValue() != null) { String selection = crsJList.getSelectedValue(); String code = selection.substring(selection.indexOf("[-") + 2, selection.indexOf("-]")); try { PluginOperations.defaultSourceCRS = CRS.decode(code, eastingFirstCheckBox.isSelected()); PluginOperations.defaultSourceCRSDescription = selection; ImportImagePlugin.pluginProps.setProperty("default_crs_eastingfirst", "" + eastingFirstCheckBox.isSelected()); ImportImagePlugin.pluginProps.setProperty("default_crs_srid", code); try (FileWriter fileWriter = new FileWriter(new File(ImportImagePlugin.PLUGINPROPERTIES_PATH))) { ImportImagePlugin.pluginProps.store(fileWriter, null); } defaultCRSLabel.setText(selection); } catch (IOException | FactoryException e2) { Main.error(e2); } } else { JOptionPane.showMessageDialog(getContentPane(), "Please make a selection from the list."); } } }); } return setSelectedCRSAsDefaultButton; } /** * This method initializes eastingFirstCheckBox * * @return javax.swing.JCheckBox */ private JCheckBox getEastingFirstCheckBox() { if (eastingFirstCheckBox == null) { eastingFirstCheckBox = new JCheckBox(); eastingFirstCheckBox.setBounds(new Rectangle(345, 255, 21, 21)); eastingFirstCheckBox.setSelected(true); } return eastingFirstCheckBox; } /** * Listener setting text in the search field if selection has changed. * */ class ListSelectionHandler implements ListSelectionListener { @Override public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { searchField.setText(supportedCRS.get(e.getLastIndex())); searchField.setEditable(true); } } } } // @jve:decl-index=0:visual-constraint="142,39"