package edu.oregonstate.cartography.gui; import com.bric.swing.MultiThumbSlider; import edu.oregonstate.cartography.app.FileUtils; import edu.oregonstate.cartography.app.ImageUtils; import edu.oregonstate.cartography.grid.ColorLUT; import edu.oregonstate.cartography.grid.EsriASCIIGridReader; import edu.oregonstate.cartography.grid.Grid; import edu.oregonstate.cartography.grid.Model; import edu.oregonstate.cartography.grid.Model.ColorRamp; import edu.oregonstate.cartography.grid.Model.ForegroundVisualization; import edu.oregonstate.cartography.grid.operators.ColorizerOperator; import edu.oregonstate.cartography.grid.operators.ColorizerOperator.ColorVisualization; import static edu.oregonstate.cartography.gui.SettingsPanel.RenderSpeed.FAST; import static edu.oregonstate.cartography.gui.SettingsPanel.RenderSpeed.REGULAR; import edu.oregonstate.cartography.gui.bivariate.BivariateColorPoint; import edu.oregonstate.cartography.gui.bivariate.BivariateColorRenderer; import java.awt.CardLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.ItemEvent; import java.awt.image.BufferedImage; import java.beans.PropertyChangeListener; import java.io.IOException; import java.text.DecimalFormat; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.DefaultComboBoxModel; import javax.swing.JDialog; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JRootPane; import javax.swing.JSlider; import javax.swing.event.ChangeListener; /** * * @author Bernhard Jenny, Cartography and Geovisualization Group, Oregon State * University */ public class SettingsPanel extends javax.swing.JPanel { protected enum RenderSpeed { FAST, REGULAR } // A SwingWorker for rendering the image. class Renderer extends SwingWorkerWithProgressIndicatorPanel<Void> { private final BufferedImage backgroundImage; private final BufferedImage foregroundImage; protected Renderer(BufferedImage backgroundImage, BufferedImage foregroundImage, ProgressPanel progressPanel) { super(progressPanel); this.backgroundImage = backgroundImage; this.foregroundImage = foregroundImage; this.setIndeterminate(false); this.setCancellable(false); this.removeMessageField(); } @Override public Void doInBackground() { // initialize the progress dialog start(); model.renderBackgroundImage(backgroundImage, this); model.renderForegroundImage(foregroundImage, this); return null; } @Override protected void done() { Graphics g = null; MainWindow mainWindow = getOwnerWindow(); try { if (!isCancelled() && mainWindow != null) { get(); BufferedImage displayImage = mainWindow.getImage(); if (displayImage == null) { mainWindow.initDisplayImage(); displayImage = mainWindow.getImage(); } int w = displayImage.getWidth(); int h = displayImage.getHeight(); g = displayImage.getGraphics(); // erase previous image g.setColor(Color.WHITE); g.fillRect(0, 0, displayImage.getWidth(), displayImage.getHeight()); // copy background image into the display image g.drawImage(backgroundImage, 0, 0, w, h, null); // copy foreground image into the display image if required. if (model.isRenderingForeground()) { BufferedImage img = ImageUtils.getScaledInstance(foregroundImage, displayImage.getWidth(), displayImage.getHeight(), RenderingHints.VALUE_INTERPOLATION_BILINEAR, true); g.drawImage(img, 0, 0, w, h, null); } } } catch (Exception ignore) { } finally { completeProgress(); if (g != null) { g.dispose(); } if (!isCancelled() && mainWindow != null) { mainWindow.repaintImage(); } } } } private Model model; private Renderer renderer; private ProgressPanel progressPanel; public SettingsPanel() { initComponents(); // hide experimental plan oblique rendering panel planObliquePanel.setVisible(false); } public void setProgressPanel(ProgressPanel progressPanel) { this.progressPanel = progressPanel; } private void updateColorPickerFromBivariatePanel() { BivariateColorPoint pt = bivariateColorPanel.getSelectedPoint(); if (pt == null || pt.getColor() == null) { colorPicker.setColor(Color.GRAY); } else { colorPicker.setColor(pt.getColor()); } } private void updateColorPickerFromColorGradientSlider() { Color[] colors = colorGradientSlider.getValues(); int selectedID = colorGradientSlider.getSelectedThumb(false); if (selectedID >= 0 && selectedID < colors.length) { colorPicker.setColor(colors[selectedID]); } else { colorGradientSlider.setSelectedThumb(0); } } /** * Adjusts the visibility of the GUI components for configuring the * different visualization types. */ private void updateVisualizationPanelsVisibility() { boolean isShading = false; boolean isColored = false; boolean isLocal = false; boolean isSolidColor = false; boolean uses2DLUT = false; boolean isExpositionElevationLUT = model.backgroundVisualization == ColorVisualization.EXPOSITION_ELEVATION; if (model != null && model.backgroundVisualization != null) { isShading = model.backgroundVisualization.isShading(); isColored = model.backgroundVisualization.isColored(); isLocal = model.backgroundVisualization.isLocal(); isSolidColor = model.backgroundVisualization == ColorVisualization.CONTINUOUS; uses2DLUT = model.backgroundVisualization.uses2DLUT(); } boolean isIlluminatedContours = model != null && model.foregroundVisualization != ForegroundVisualization.NONE; verticalExaggerationPanel.setVisible(isShading); colorGradientPanel.setVisible(isColored && !uses2DLUT); colorPicker.setVisible(isColored); localHypsoPanel.setVisible(isLocal); solidColorPanel.setVisible(isSolidColor); // GUI for 2D LUT bivariateColorGroupPanel.setVisible(uses2DLUT); bivariateColorPanel.setRenderer(model.getColorLUTRenderer()); bivariateHorizontalButton.setVisible(!isExpositionElevationLUT); bivariateVerticalButton.setVisible(!isExpositionElevationLUT); azimuthSlider.setEnabled(isShading || isIlluminatedContours); zenithSlider.setEnabled(isShading); ambientLightSlider.setEnabled(isShading); // adjust size of dialog to make sure all components are visible JRootPane rootPane = getRootPane(); if (rootPane != null) { ((JDialog) (rootPane.getParent())).pack(); } contoursBlankBackgroundButton.setEnabled(!isSolidColor); if (uses2DLUT) { updateColorPickerFromBivariatePanel(); } else { updateColorPickerFromColorGradientSlider(); } } public void updateImage(RenderSpeed renderSpeed) { try { MainWindow mainWindow = getOwnerWindow(); if (mainWindow == null || model == null) { return; } // if we are currently rendering an image, first cancel the current rendering if (renderer != null && !renderer.isDone()) { renderer.cancel(false); } // block the event dispatching thread until the BackgroundRenderer worker thread // is done. This is to avoid that two BackgroundRenderer threads write to // the same image. // get() throws a CancellationException if the worker has been cancelled. try { if (renderer != null && !renderer.isCancelled()) { renderer.get(); } } catch (InterruptedException | ExecutionException ex) { Logger.getLogger(SettingsPanel.class.getName()).log(Level.SEVERE, null, ex); } // create destination image // note: it is not possible to reuse this image. Flickering artifacts // will appear otherwise. BufferedImage backgroundImage = model.createDestinationImage(1); if (backgroundImage == null) { return; } int foregroundScale = (renderSpeed == FAST ? 1 : 2); BufferedImage foregroundImage = model.createDestinationImage(foregroundScale); // create a new renderer and run it renderer = new Renderer(backgroundImage, foregroundImage, progressPanel); renderer.execute(); } catch (Throwable e) { String msg = "<html>An error occured when rendering the terrain.</html>"; String title = "Error"; ErrorDialog.showErrorDialog(msg, title, e, null); e.printStackTrace(); } } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; colorPopupMenu = new javax.swing.JPopupMenu(); bivariateInterpolationButtonGroup = new javax.swing.ButtonGroup(); tabbedPane = new javax.swing.JTabbedPane(); javax.swing.JPanel visualizationContainer = new TransparentMacPanel(); visualizationPanel = new TransparentMacPanel(); visualizationComboBox = new javax.swing.JComboBox(); verticalExaggerationPanel = new TransparentMacPanel(); verticalExaggerationLabel = new javax.swing.JLabel(); verticalExaggerationSlider = new javax.swing.JSlider(); colorGradientPanel = new TransparentMacPanel(); javax.swing.JLabel colorInfoLabel = new javax.swing.JLabel(); colorGradientSlider = new com.bric.swing.GradientSlider(); colorPresetsButton = new edu.oregonstate.cartography.gui.MenuToggleButton(); localHypsoPanel = new TransparentMacPanel(); javax.swing.JLabel jLabel1 = new javax.swing.JLabel(); javax.swing.JLabel jLabel2 = new javax.swing.JLabel(); localGridStandardDeviationFilterSizeSlider = new javax.swing.JSlider(); localGridHighPassSlider = new javax.swing.JSlider(); javax.swing.JLabel jLabel3 = new javax.swing.JLabel(); solidColorPanel = new TransparentMacPanel(); solidColorButton = new edu.oregonstate.cartography.gui.ColorButton(); planObliquePanel = new TransparentMacPanel(); planObliqueSlider = new javax.swing.JSlider(); jLabel4 = new javax.swing.JLabel(); colorPicker = new com.bric.swing.ColorPicker(); bivariateColorGroupPanel = new TransparentMacPanel(); bivariateColorPanel = new edu.oregonstate.cartography.gui.bivariate.BivariateColorPanel(); idwRadioButton = new javax.swing.JRadioButton(); gaussRadioButton = new javax.swing.JRadioButton(); jLabel9 = new javax.swing.JLabel(); javax.swing.JLabel idwExponentSliderLabel = new javax.swing.JLabel(); idwExponentSlider = new javax.swing.JSlider(); bivariateColorExponentValueLabel = new javax.swing.JLabel(); bivariateHorizontalButton = new javax.swing.JButton(); bivariateVerticalButton = new javax.swing.JButton(); bivariateVerticalLabel = new edu.oregonstate.cartography.gui.RotatedLabel(); bivariateHorizontalLabel = new javax.swing.JLabel(); javax.swing.JPanel generalizationContainer = new TransparentMacPanel(); generalizationPanel = new TransparentMacPanel(); javax.swing.JLabel generalizationDetailsRemovalLabel = new javax.swing.JLabel(); generalizationDetailSlider = new javax.swing.JSlider(); javax.swing.JLabel generalizationMaxLabel = new javax.swing.JLabel(); generalizationMaxLevelsSpinner = new javax.swing.JSpinner(); generalizationDetaiIsLabel = new javax.swing.JLabel(); generalizationInfoLabel = new javax.swing.JLabel(); javax.swing.JPanel illuminationContainer = new TransparentMacPanel(); illuminationPanel = new TransparentMacPanel(); javax.swing.JLabel azLabel = new javax.swing.JLabel(); azimuthSlider = new javax.swing.JSlider(); javax.swing.JLabel zeLabel = new javax.swing.JLabel(); zenithSlider = new javax.swing.JSlider(); javax.swing.JLabel ambientLightLabel = new javax.swing.JLabel(); ambientLightSlider = new javax.swing.JSlider(); contoursPanel = new TransparentMacPanel(); illuminatedContoursPanel = new TransparentMacPanel(); contoursComboBox = new javax.swing.JComboBox(); contoursCardPanel = new TransparentMacPanel(); contoursEmptyPanel = new TransparentMacPanel(); contoursSettingsPanel = new TransparentMacPanel(); javax.swing.JLabel contoursIlluminatedLineWidthLabel = new javax.swing.JLabel(); javax.swing.JLabel contoursIlluminatedHighestLabel = new javax.swing.JLabel(); contoursIlluminatedHighestLineWidthSlider = new javax.swing.JSlider(); contoursIlluminatedLockedToggleButton = new javax.swing.JToggleButton(); javax.swing.JLabel contoursIlluminatedLowestLabel = new javax.swing.JLabel(); contoursIlluminatedLowestLineWidthSlider = new javax.swing.JSlider(); javax.swing.JLabel contoursShadwoLineWidthSlider = new javax.swing.JLabel(); javax.swing.JLabel contoursShadowedHighest = new javax.swing.JLabel(); contoursShadowHighestLineWidthSlider = new javax.swing.JSlider(); contoursShadowedLockedToggleButton = new javax.swing.JToggleButton(); javax.swing.JLabel contoursShadowedLowest = new javax.swing.JLabel(); contoursShadowLowestLineWidthSlider = new javax.swing.JSlider(); javax.swing.JLabel contoursMinLineWidthLabel = new javax.swing.JLabel(); contoursMinLineWidthSlider = new javax.swing.JSlider(); contoursMinLineWidthValueLabel = new javax.swing.JLabel(); contoursMinDistanceSlider = new javax.swing.JSlider(); javax.swing.JLabel contoursWidthInfoLabel = new javax.swing.JLabel(); contoursMinDistanceLabel = new javax.swing.JLabel(); javax.swing.JLabel contoursIntervalLabel = new javax.swing.JLabel(); contoursIntervalTextBox = new javax.swing.JFormattedTextField(); javax.swing.JLabel contoursGradientLabel = new javax.swing.JLabel(); contoursGradientSlider = new javax.swing.JSlider(); javax.swing.JLabel contoursDespeckleLabel = new javax.swing.JLabel(); contoursDespeckleSlider = new javax.swing.JSlider(); javax.swing.JLabel contoursTransitionLabel = new javax.swing.JLabel(); contoursTransitionSlider = new javax.swing.JSlider(); javax.swing.JLabel contoursExportInfoLabel = new javax.swing.JLabel(); contoursBlankBackgroundButton = new javax.swing.JButton(); contoursMinDistanceValueLabel = new javax.swing.JLabel(); contoursShadowLineWidthHighValueField = new javax.swing.JFormattedTextField(); contoursShadowLineWidthLowValueField = new javax.swing.JFormattedTextField(); contoursIlluminatedLineWidthHighValueField = new javax.swing.JFormattedTextField(); contoursIlluminatedLineWidthLowValueField = new javax.swing.JFormattedTextField(); contoursIlluminatedColorButton = new edu.oregonstate.cartography.gui.ColorButton(); contoursShadowedColorButton = new edu.oregonstate.cartography.gui.ColorButton(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); spacingPanel = new TransparentMacPanel(); colorPopupMenu.setLightWeightPopupEnabled(false); setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 2, 2)); visualizationPanel.setLayout(new java.awt.GridBagLayout()); visualizationComboBox.setMaximumRowCount(15); visualizationComboBox.setModel(new DefaultComboBoxModel(ColorizerOperator.ColorVisualization.values())); visualizationComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { visualizationComboBoxItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; visualizationPanel.add(visualizationComboBox, gridBagConstraints); verticalExaggerationPanel.setLayout(new java.awt.GridBagLayout()); verticalExaggerationLabel.setText("Vertical Exaggeration for Shading"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; verticalExaggerationPanel.add(verticalExaggerationLabel, gridBagConstraints); verticalExaggerationSlider.setMajorTickSpacing(5); verticalExaggerationSlider.setMaximum(50); verticalExaggerationSlider.setMinorTickSpacing(1); verticalExaggerationSlider.setPaintLabels(true); verticalExaggerationSlider.setPaintTicks(true); verticalExaggerationSlider.setSnapToTicks(true); verticalExaggerationSlider.setToolTipText("Vertical exaggeration to the grid applied for shading calculation."); verticalExaggerationSlider.setValue(10); verticalExaggerationSlider.setPreferredSize(new java.awt.Dimension(300, 52)); { java.util.Hashtable labels = verticalExaggerationSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); DecimalFormat df = new DecimalFormat("#.#"); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); String v = df.format(Integer.parseInt(label.getText()) / 10f); label.setText("\u00d7" + v); } } verticalExaggerationSlider.setLabelTable(labels); } verticalExaggerationSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { verticalExaggerationSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 8; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; verticalExaggerationPanel.add(verticalExaggerationSlider, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); visualizationPanel.add(verticalExaggerationPanel, gridBagConstraints); colorGradientPanel.setLayout(new java.awt.GridBagLayout()); colorInfoLabel.setFont(colorInfoLabel.getFont().deriveFont(colorInfoLabel.getFont().getSize()-2f)); colorInfoLabel.setText("Click on slider to add color. Hit delete key to remove selected color."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 0, 10, 0); colorGradientPanel.add(colorInfoLabel, gridBagConstraints); colorGradientSlider.setPreferredSize(new java.awt.Dimension(360, 30)); colorGradientSlider.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { colorGradientSliderPropertyChange(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; colorGradientPanel.add(colorGradientSlider, gridBagConstraints); colorPresetsButton.setText("Color Presets"); colorPresetsButton.setPopupMenu(colorPopupMenu); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 7; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; colorGradientPanel.add(colorPresetsButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); visualizationPanel.add(colorGradientPanel, gridBagConstraints); localHypsoPanel.setLayout(new java.awt.GridBagLayout()); jLabel1.setText("High Pass Filter Size"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0); localHypsoPanel.add(jLabel1, gridBagConstraints); jLabel2.setText("Std Dev Filter Size"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0); localHypsoPanel.add(jLabel2, gridBagConstraints); localGridStandardDeviationFilterSizeSlider.setMajorTickSpacing(1); localGridStandardDeviationFilterSizeSlider.setMaximum(10); localGridStandardDeviationFilterSizeSlider.setMinimum(1); localGridStandardDeviationFilterSizeSlider.setPaintLabels(true); localGridStandardDeviationFilterSizeSlider.setPaintTicks(true); localGridStandardDeviationFilterSizeSlider.setSnapToTicks(true); localGridStandardDeviationFilterSizeSlider.setPreferredSize(new java.awt.Dimension(240, 38)); localGridStandardDeviationFilterSizeSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { localGridStandardDeviationFilterSizeSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; localHypsoPanel.add(localGridStandardDeviationFilterSizeSlider, gridBagConstraints); localGridHighPassSlider.setMajorTickSpacing(10); localGridHighPassSlider.setMinorTickSpacing(5); localGridHighPassSlider.setPaintLabels(true); localGridHighPassSlider.setPaintTicks(true); localGridHighPassSlider.setValue(10); localGridHighPassSlider.setPreferredSize(new java.awt.Dimension(240, 38)); localGridHighPassSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { localGridHighPassSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; localHypsoPanel.add(localGridHighPassSlider, gridBagConstraints); jLabel3.setText("Local Terrain Filtering"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; localHypsoPanel.add(jLabel3, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); visualizationPanel.add(localHypsoPanel, gridBagConstraints); solidColorPanel.setLayout(new java.awt.GridBagLayout()); solidColorButton.setText("Background Color"); solidColorButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { solidColorButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; solidColorPanel.add(solidColorButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); visualizationPanel.add(solidColorPanel, gridBagConstraints); planObliquePanel.setLayout(new java.awt.GridBagLayout()); planObliqueSlider.setMajorTickSpacing(15); planObliqueSlider.setMaximum(90); planObliqueSlider.setMinimum(15); planObliqueSlider.setMinorTickSpacing(5); planObliqueSlider.setPaintLabels(true); planObliqueSlider.setPaintTicks(true); planObliqueSlider.setValue(90); { java.util.Hashtable labels = planObliqueSlider.createStandardLabels(15); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); label.setText(label.getText() + "\u00b0"); } } planObliqueSlider.setLabelTable(labels); } planObliqueSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { planObliqueSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; planObliquePanel.add(planObliqueSlider, gridBagConstraints); jLabel4.setText("Plan Oblique Relief (experimental - not for local hypsometry)"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; planObliquePanel.add(jLabel4, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 9; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); visualizationPanel.add(planObliquePanel, gridBagConstraints); colorPicker.setPreferredSize(new java.awt.Dimension(380, 300)); colorPicker.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { colorPickerPropertyChange(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 8; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); visualizationPanel.add(colorPicker, gridBagConstraints); bivariateColorGroupPanel.setLayout(new java.awt.GridBagLayout()); bivariateColorPanel.setPreferredSize(new java.awt.Dimension(200, 200)); bivariateColorPanel.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { bivariateColorPanelPropertyChange(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.gridheight = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; bivariateColorGroupPanel.add(bivariateColorPanel, gridBagConstraints); bivariateInterpolationButtonGroup.add(idwRadioButton); idwRadioButton.setText("Inverse Distance"); idwRadioButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { idwRadioButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; bivariateColorGroupPanel.add(idwRadioButton, gridBagConstraints); bivariateInterpolationButtonGroup.add(gaussRadioButton); gaussRadioButton.setSelected(true); gaussRadioButton.setText("Gaussian Weight"); gaussRadioButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { gaussRadioButtonidwRadioButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; bivariateColorGroupPanel.add(gaussRadioButton, gridBagConstraints); jLabel9.setFont(jLabel9.getFont().deriveFont(jLabel9.getFont().getSize()-2f)); jLabel9.setText("<html>Click to add a point. Click and drag to move a point. Press the<br>delete key to remove the selected point. Right-click on the map<br>to add color points to the diagram.</html>"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 8; gridBagConstraints.gridwidth = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(4, 0, 0, 0); bivariateColorGroupPanel.add(jLabel9, gridBagConstraints); idwExponentSliderLabel.setText("Exponent"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(15, 6, 0, 0); bivariateColorGroupPanel.add(idwExponentSliderLabel, gridBagConstraints); idwExponentSlider.setMajorTickSpacing(10); idwExponentSlider.setMaximum(50); idwExponentSlider.setMinorTickSpacing(5); idwExponentSlider.setPaintTicks(true); idwExponentSlider.setPreferredSize(new java.awt.Dimension(130, 38)); idwExponentSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { idwExponentSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; bivariateColorGroupPanel.add(idwExponentSlider, gridBagConstraints); bivariateColorExponentValueLabel.setFont(bivariateColorExponentValueLabel.getFont().deriveFont(bivariateColorExponentValueLabel.getFont().getSize()-2f)); bivariateColorExponentValueLabel.setText("1.3"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; bivariateColorGroupPanel.add(bivariateColorExponentValueLabel, gridBagConstraints); bivariateHorizontalButton.setText("Horizontal Axis"); bivariateHorizontalButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bivariateHorizontalButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_END; gridBagConstraints.weighty = 1.0; bivariateColorGroupPanel.add(bivariateHorizontalButton, gridBagConstraints); bivariateVerticalButton.setText("Vertical Axis"); bivariateVerticalButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bivariateVerticalButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 6; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_END; bivariateColorGroupPanel.add(bivariateVerticalButton, gridBagConstraints); bivariateVerticalLabel.setText("-"); bivariateVerticalLabel.setFont(bivariateVerticalLabel.getFont().deriveFont(bivariateVerticalLabel.getFont().getSize()-2f)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridheight = 7; bivariateColorGroupPanel.add(bivariateVerticalLabel, gridBagConstraints); bivariateHorizontalLabel.setFont(bivariateHorizontalLabel.getFont().deriveFont(bivariateHorizontalLabel.getFont().getSize()-2f)); bivariateHorizontalLabel.setText("-"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 7; gridBagConstraints.insets = new java.awt.Insets(0, 0, 8, 0); bivariateColorGroupPanel.add(bivariateHorizontalLabel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 7; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); visualizationPanel.add(bivariateColorGroupPanel, gridBagConstraints); visualizationContainer.add(visualizationPanel); tabbedPane.addTab("Visualization", visualizationContainer); generalizationPanel.setLayout(new java.awt.GridBagLayout()); generalizationDetailsRemovalLabel.setText("Details Removal"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 10); generalizationPanel.add(generalizationDetailsRemovalLabel, gridBagConstraints); generalizationDetailSlider.setMajorTickSpacing(100); generalizationDetailSlider.setMinimum(-100); generalizationDetailSlider.setMinorTickSpacing(10); generalizationDetailSlider.setPaintTicks(true); generalizationDetailSlider.setToolTipText(""); generalizationDetailSlider.setValue(-100); generalizationDetailSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { generalizationDetailSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(5, 0, 5, 0); generalizationPanel.add(generalizationDetailSlider, gridBagConstraints); generalizationMaxLabel.setText("Landforms Removal"); generalizationMaxLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 10); generalizationPanel.add(generalizationMaxLabel, gridBagConstraints); generalizationMaxLevelsSpinner.setModel(new javax.swing.SpinnerNumberModel(3, 1, 10, 1)); generalizationMaxLevelsSpinner.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { generalizationMaxLevelsSpinnerStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; generalizationPanel.add(generalizationMaxLevelsSpinner, gridBagConstraints); generalizationDetaiIsLabel.setText("100%"); generalizationDetaiIsLabel.setPreferredSize(new java.awt.Dimension(40, 16)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0); generalizationPanel.add(generalizationDetaiIsLabel, gridBagConstraints); generalizationInfoLabel.setText("No Generalization"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 9, 0, 0); generalizationPanel.add(generalizationInfoLabel, gridBagConstraints); generalizationContainer.add(generalizationPanel); tabbedPane.addTab("Generalization", generalizationContainer); illuminationPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); illuminationPanel.setLayout(new java.awt.GridBagLayout()); azLabel.setText("Azimuth (Horizontal Direction)"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; illuminationPanel.add(azLabel, gridBagConstraints); azimuthSlider.setMajorTickSpacing(45); azimuthSlider.setMaximum(360); azimuthSlider.setMinorTickSpacing(15); azimuthSlider.setPaintLabels(true); azimuthSlider.setPaintTicks(true); azimuthSlider.setValue(45); azimuthSlider.setPreferredSize(new java.awt.Dimension(380, 52)); { java.util.Hashtable labels = azimuthSlider.createStandardLabels(45); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); int angle = Integer.parseInt(label.getText()); switch (angle) { case 0: case 360: label.setText("N"); break; case 45: label.setText("NE"); break; case 90: label.setText("E"); break; case 135: label.setText("SE"); break; case 180: label.setText("S"); break; case 225: label.setText("SW"); break; case 270: label.setText("W"); break; case 315: label.setText("NW"); break; } } } azimuthSlider.setLabelTable(labels); } azimuthSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { azimuthSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; illuminationPanel.add(azimuthSlider, gridBagConstraints); zeLabel.setText("Zenith (Vertical Direction)"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); illuminationPanel.add(zeLabel, gridBagConstraints); zenithSlider.setMajorTickSpacing(15); zenithSlider.setMaximum(90); zenithSlider.setMinorTickSpacing(5); zenithSlider.setPaintLabels(true); zenithSlider.setPaintTicks(true); zenithSlider.setValue(45); { java.util.Hashtable labels = zenithSlider.createStandardLabels(15); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); label.setText(label.getText() + "\u00b0"); } } zenithSlider.setLabelTable(labels); } zenithSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { zenithSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; illuminationPanel.add(zenithSlider, gridBagConstraints); ambientLightLabel.setText("Ambient Light"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(20, 0, 0, 0); illuminationPanel.add(ambientLightLabel, gridBagConstraints); ambientLightSlider.setMajorTickSpacing(10); ambientLightSlider.setMaximum(50); ambientLightSlider.setMinimum(-50); ambientLightSlider.setMinorTickSpacing(5); ambientLightSlider.setPaintLabels(true); ambientLightSlider.setPaintTicks(true); ambientLightSlider.setValue(0); { java.util.Hashtable labels = ambientLightSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); DecimalFormat df = new DecimalFormat("0.#"); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); double d = Double.parseDouble(label.getText()) / 100d; label.setText(df.format(d)); } } ambientLightSlider.setLabelTable(labels); } ambientLightSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { ambientLightSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; illuminationPanel.add(ambientLightSlider, gridBagConstraints); illuminationContainer.add(illuminationPanel); tabbedPane.addTab("Illumination", illuminationContainer); illuminatedContoursPanel.setLayout(new java.awt.GridBagLayout()); contoursComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "No Contours", "Illuminated & Shadowed Contours", "Shadowed Contours" })); contoursComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { contoursComboBoxItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 0, 10, 0); illuminatedContoursPanel.add(contoursComboBox, gridBagConstraints); contoursCardPanel.setLayout(new java.awt.CardLayout()); contoursCardPanel.add(contoursEmptyPanel, "emptyCard"); contoursSettingsPanel.setLayout(new java.awt.GridBagLayout()); contoursIlluminatedLineWidthLabel.setText("Maximum Illuminated Line Width"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(10, 0, 0, 0); contoursSettingsPanel.add(contoursIlluminatedLineWidthLabel, gridBagConstraints); contoursIlluminatedHighestLabel.setText("Highest"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursIlluminatedHighestLabel, gridBagConstraints); contoursIlluminatedHighestLineWidthSlider.setMajorTickSpacing(10); contoursIlluminatedHighestLineWidthSlider.setMaximum(50); contoursIlluminatedHighestLineWidthSlider.setMinorTickSpacing(5); contoursIlluminatedHighestLineWidthSlider.setPaintLabels(true); contoursIlluminatedHighestLineWidthSlider.setPaintTicks(true); contoursIlluminatedHighestLineWidthSlider.setToolTipText("Line widths are relative to grid cell size."); contoursIlluminatedHighestLineWidthSlider.setValue(0); { java.util.Hashtable labels = contoursIlluminatedHighestLineWidthSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); int sliderValue = Integer.parseInt(label.getText()); label.setText(Integer.toString(sliderValue / 10)); } } contoursIlluminatedHighestLineWidthSlider.setLabelTable(labels); } contoursIlluminatedHighestLineWidthSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursIlluminatedHighestLineWidthSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 6; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; contoursSettingsPanel.add(contoursIlluminatedHighestLineWidthSlider, gridBagConstraints); contoursIlluminatedLockedToggleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/oregonstate/cartography/gui/icons/unlocked14.png"))); // NOI18N contoursIlluminatedLockedToggleButton.setSelected(true); contoursIlluminatedLockedToggleButton.setBorderPainted(false); contoursIlluminatedLockedToggleButton.setContentAreaFilled(false); contoursIlluminatedLockedToggleButton.setPreferredSize(new java.awt.Dimension(14, 14)); contoursIlluminatedLockedToggleButton.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/oregonstate/cartography/gui/icons/locked14.png"))); // NOI18N contoursIlluminatedLockedToggleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { contoursIlluminatedLockedToggleButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 6; gridBagConstraints.gridheight = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; contoursSettingsPanel.add(contoursIlluminatedLockedToggleButton, gridBagConstraints); contoursIlluminatedLowestLabel.setText("Lowest"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 7; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursIlluminatedLowestLabel, gridBagConstraints); contoursIlluminatedLowestLineWidthSlider.setMajorTickSpacing(10); contoursIlluminatedLowestLineWidthSlider.setMaximum(50); contoursIlluminatedLowestLineWidthSlider.setMinorTickSpacing(5); contoursIlluminatedLowestLineWidthSlider.setPaintLabels(true); contoursIlluminatedLowestLineWidthSlider.setPaintTicks(true); contoursIlluminatedLowestLineWidthSlider.setToolTipText("Line widths are relative to grid cell size."); contoursIlluminatedLowestLineWidthSlider.setValue(0); { java.util.Hashtable labels = contoursIlluminatedLowestLineWidthSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); int sliderValue = Integer.parseInt(label.getText()); label.setText(Integer.toString(sliderValue / 10)); } } contoursIlluminatedLowestLineWidthSlider.setLabelTable(labels); } contoursIlluminatedLowestLineWidthSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursIlluminatedLowestLineWidthSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 7; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; contoursSettingsPanel.add(contoursIlluminatedLowestLineWidthSlider, gridBagConstraints); contoursShadwoLineWidthSlider.setText("Maximum Shadowed Line Width"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0); contoursSettingsPanel.add(contoursShadwoLineWidthSlider, gridBagConstraints); contoursShadowedHighest.setText("Highest"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursShadowedHighest, gridBagConstraints); contoursShadowHighestLineWidthSlider.setMajorTickSpacing(10); contoursShadowHighestLineWidthSlider.setMaximum(50); contoursShadowHighestLineWidthSlider.setMinorTickSpacing(5); contoursShadowHighestLineWidthSlider.setPaintLabels(true); contoursShadowHighestLineWidthSlider.setPaintTicks(true); contoursShadowHighestLineWidthSlider.setToolTipText("Line widths are relative to grid cell size."); contoursShadowHighestLineWidthSlider.setValue(0); { java.util.Hashtable labels = contoursShadowHighestLineWidthSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); int sliderValue = Integer.parseInt(label.getText()); label.setText(Integer.toString(sliderValue / 10)); } } contoursShadowHighestLineWidthSlider.setLabelTable(labels); } contoursShadowHighestLineWidthSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursShadowHighestLineWidthSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; contoursSettingsPanel.add(contoursShadowHighestLineWidthSlider, gridBagConstraints); contoursShadowedLockedToggleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/oregonstate/cartography/gui/icons/unlocked14.png"))); // NOI18N contoursShadowedLockedToggleButton.setSelected(true); contoursShadowedLockedToggleButton.setBorderPainted(false); contoursShadowedLockedToggleButton.setContentAreaFilled(false); contoursShadowedLockedToggleButton.setPreferredSize(new java.awt.Dimension(16, 16)); contoursShadowedLockedToggleButton.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/oregonstate/cartography/gui/icons/locked14.png"))); // NOI18N contoursShadowedLockedToggleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { contoursShadowedLockedToggleButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 2; gridBagConstraints.gridheight = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; contoursSettingsPanel.add(contoursShadowedLockedToggleButton, gridBagConstraints); contoursShadowedLowest.setText("Lowest"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursShadowedLowest, gridBagConstraints); contoursShadowLowestLineWidthSlider.setMajorTickSpacing(10); contoursShadowLowestLineWidthSlider.setMaximum(50); contoursShadowLowestLineWidthSlider.setMinorTickSpacing(5); contoursShadowLowestLineWidthSlider.setPaintLabels(true); contoursShadowLowestLineWidthSlider.setPaintTicks(true); contoursShadowLowestLineWidthSlider.setToolTipText("Line widths are relative to grid cell size."); contoursShadowLowestLineWidthSlider.setValue(0); { java.util.Hashtable labels = contoursShadowLowestLineWidthSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); int sliderValue = Integer.parseInt(label.getText()); label.setText(Integer.toString(sliderValue / 10)); } } contoursShadowLowestLineWidthSlider.setLabelTable(labels); } contoursShadowLowestLineWidthSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursShadowLowestLineWidthSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; contoursSettingsPanel.add(contoursShadowLowestLineWidthSlider, gridBagConstraints); contoursMinLineWidthLabel.setText("Minimum Line Width"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 9; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursMinLineWidthLabel, gridBagConstraints); contoursMinLineWidthSlider.setMajorTickSpacing(10); contoursMinLineWidthSlider.setMaximum(50); contoursMinLineWidthSlider.setMinorTickSpacing(5); contoursMinLineWidthSlider.setPaintLabels(true); contoursMinLineWidthSlider.setPaintTicks(true); contoursMinLineWidthSlider.setToolTipText("Line widths are relative to grid cell size."); contoursMinLineWidthSlider.setValue(0); { java.util.Hashtable labels = contoursMinLineWidthSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); int sliderValue = Integer.parseInt(label.getText()); label.setText(Integer.toString(sliderValue / 10)); } } contoursMinLineWidthSlider.setLabelTable(labels); } contoursMinLineWidthSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursMinLineWidthSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 9; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; contoursSettingsPanel.add(contoursMinLineWidthSlider, gridBagConstraints); contoursMinLineWidthValueLabel.setFont(contoursMinLineWidthSlider.getFont()); contoursMinLineWidthValueLabel.setText("123"); contoursMinLineWidthValueLabel.setPreferredSize(new java.awt.Dimension(30, 16)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 9; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); contoursSettingsPanel.add(contoursMinLineWidthValueLabel, gridBagConstraints); contoursMinDistanceSlider.setMajorTickSpacing(10); contoursMinDistanceSlider.setMaximum(50); contoursMinDistanceSlider.setMinorTickSpacing(5); contoursMinDistanceSlider.setPaintLabels(true); contoursMinDistanceSlider.setPaintTicks(true); contoursMinDistanceSlider.setToolTipText("Line widths are relative to grid cell size."); contoursMinDistanceSlider.setValue(0); { java.util.Hashtable labels = contoursMinDistanceSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); int sliderValue = Integer.parseInt(label.getText()); label.setText(Integer.toString(sliderValue / 10)); } } contoursMinDistanceSlider.setLabelTable(labels); } contoursMinDistanceSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursMinDistanceSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 10; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; contoursSettingsPanel.add(contoursMinDistanceSlider, gridBagConstraints); contoursWidthInfoLabel.setFont(contoursWidthInfoLabel.getFont().deriveFont(contoursWidthInfoLabel.getFont().getSize()-2f)); contoursWidthInfoLabel.setText("Line widths and minimum distance are relative to grid cell size."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 11; gridBagConstraints.gridwidth = 4; gridBagConstraints.insets = new java.awt.Insets(0, 0, 10, 0); contoursSettingsPanel.add(contoursWidthInfoLabel, gridBagConstraints); contoursMinDistanceLabel.setText("Minimum Distance"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 10; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursMinDistanceLabel, gridBagConstraints); contoursIntervalLabel.setText("Interval"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursIntervalLabel, gridBagConstraints); contoursIntervalTextBox.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter())); contoursIntervalTextBox.setToolTipText("Contour interval"); contoursIntervalTextBox.setPreferredSize(new java.awt.Dimension(120, 28)); contoursIntervalTextBox.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { contoursIntervalTextBoxPropertyChange(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; contoursSettingsPanel.add(contoursIntervalTextBox, gridBagConstraints); contoursGradientLabel.setText("Gradient Angle"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 15; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursGradientLabel, gridBagConstraints); contoursGradientSlider.setMajorTickSpacing(10); contoursGradientSlider.setMaximum(50); contoursGradientSlider.setMinorTickSpacing(5); contoursGradientSlider.setPaintLabels(true); contoursGradientSlider.setPaintTicks(true); contoursGradientSlider.setToolTipText("A gradient between black and white is created within this angle."); contoursGradientSlider.setValue(0); { java.util.Hashtable labels = contoursGradientSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); label.setText(label.getText() + "\u00b0"); } } contoursGradientSlider.setLabelTable(labels); } contoursGradientSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursGradientSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 15; contoursSettingsPanel.add(contoursGradientSlider, gridBagConstraints); contoursDespeckleLabel.setText("Despeckle"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 13; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursDespeckleLabel, gridBagConstraints); contoursDespeckleSlider.setMajorTickSpacing(25); contoursDespeckleSlider.setMinorTickSpacing(5); contoursDespeckleSlider.setPaintLabels(true); contoursDespeckleSlider.setPaintTicks(true); contoursDespeckleSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursDespeckleSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 13; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; contoursSettingsPanel.add(contoursDespeckleSlider, gridBagConstraints); contoursTransitionLabel.setText("Transition Angle"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 16; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursTransitionLabel, gridBagConstraints); contoursTransitionSlider.setMajorTickSpacing(45); contoursTransitionSlider.setMaximum(180); contoursTransitionSlider.setMinorTickSpacing(15); contoursTransitionSlider.setPaintLabels(true); contoursTransitionSlider.setPaintTicks(true); contoursTransitionSlider.setValue(90); { java.util.Hashtable labels = contoursTransitionSlider.createStandardLabels(45); java.util.Enumeration e = labels.elements(); while(e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent)e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel)(comp); label.setText(label.getText() + "\u00b0"); } } contoursTransitionSlider.setLabelTable(labels); } contoursTransitionSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { contoursTransitionSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 16; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; contoursSettingsPanel.add(contoursTransitionSlider, gridBagConstraints); contoursExportInfoLabel.setFont(contoursExportInfoLabel.getFont().deriveFont(contoursExportInfoLabel.getFont().getSize()-2f)); contoursExportInfoLabel.setText("Use File > Save Contour Image for high resolution contour image."); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 21; gridBagConstraints.gridwidth = 4; gridBagConstraints.insets = new java.awt.Insets(10, 0, 0, 0); contoursSettingsPanel.add(contoursExportInfoLabel, gridBagConstraints); contoursBlankBackgroundButton.setText("Blank Background"); contoursBlankBackgroundButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { contoursBlankBackgroundButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 20; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; contoursSettingsPanel.add(contoursBlankBackgroundButton, gridBagConstraints); contoursMinDistanceValueLabel.setFont(contoursMinLineWidthSlider.getFont()); contoursMinDistanceValueLabel.setText("123"); contoursMinDistanceValueLabel.setPreferredSize(new java.awt.Dimension(30, 16)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 10; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); contoursSettingsPanel.add(contoursMinDistanceValueLabel, gridBagConstraints); contoursShadowLineWidthHighValueField.setFont(contoursShadowHighestLineWidthSlider.getFont()); contoursShadowLineWidthHighValueField.setPreferredSize(new java.awt.Dimension(45, 28)); { javax.swing.text.NumberFormatter nf = new javax.swing.text.NumberFormatter(new DecimalFormat("#0.0#")); nf.setMinimum(0.); contoursShadowLineWidthHighValueField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(nf)); } contoursShadowLineWidthHighValueField.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { contoursShadowLineWidthHighValueFieldPropertyChange(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 0); contoursSettingsPanel.add(contoursShadowLineWidthHighValueField, gridBagConstraints); contoursShadowLineWidthLowValueField.setFont(contoursShadowHighestLineWidthSlider.getFont()); contoursShadowLineWidthLowValueField.setPreferredSize(new java.awt.Dimension(45, 28)); { javax.swing.text.NumberFormatter nf = new javax.swing.text.NumberFormatter(new DecimalFormat("#0.0#")); nf.setMinimum(0.); contoursShadowLineWidthLowValueField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(nf)); } contoursShadowLineWidthLowValueField.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { contoursShadowLineWidthLowValueFieldPropertyChange(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 0); contoursSettingsPanel.add(contoursShadowLineWidthLowValueField, gridBagConstraints); contoursIlluminatedLineWidthHighValueField.setFont(contoursShadowHighestLineWidthSlider.getFont()); contoursIlluminatedLineWidthHighValueField.setPreferredSize(new java.awt.Dimension(45, 28)); { javax.swing.text.NumberFormatter nf = new javax.swing.text.NumberFormatter(new DecimalFormat("#,##0.0#")); nf.setMinimum(0.); contoursIlluminatedLineWidthHighValueField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(nf)); } contoursIlluminatedLineWidthHighValueField.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { contoursIlluminatedLineWidthHighValueFieldPropertyChange(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 0); contoursSettingsPanel.add(contoursIlluminatedLineWidthHighValueField, gridBagConstraints); contoursIlluminatedLineWidthLowValueField.setFont(contoursShadowHighestLineWidthSlider.getFont()); contoursIlluminatedLineWidthLowValueField.setPreferredSize(new java.awt.Dimension(45, 28)); { javax.swing.text.NumberFormatter nf = new javax.swing.text.NumberFormatter(new DecimalFormat("#0.0#")); nf.setMinimum(0.); contoursIlluminatedLineWidthLowValueField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(nf)); } contoursIlluminatedLineWidthLowValueField.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { contoursIlluminatedLineWidthLowValueFieldPropertyChange(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 7; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 0); contoursSettingsPanel.add(contoursIlluminatedLineWidthLowValueField, gridBagConstraints); contoursIlluminatedColorButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { contoursIlluminatedColorButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 18; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursIlluminatedColorButton, gridBagConstraints); contoursShadowedColorButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { contoursShadowedColorButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 17; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; contoursSettingsPanel.add(contoursShadowedColorButton, gridBagConstraints); jLabel5.setText("Illuminated Line Color"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 18; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 7, 0, 0); contoursSettingsPanel.add(jLabel5, gridBagConstraints); jLabel6.setText("Shadowed Line Color"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 17; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(0, 7, 0, 0); contoursSettingsPanel.add(jLabel6, gridBagConstraints); spacingPanel.setMinimumSize(new java.awt.Dimension(12, 10)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 8; gridBagConstraints.gridwidth = 5; contoursSettingsPanel.add(spacingPanel, gridBagConstraints); contoursCardPanel.add(contoursSettingsPanel, "contoursSettingsCard"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; illuminatedContoursPanel.add(contoursCardPanel, gridBagConstraints); contoursPanel.add(illuminatedContoursPanel); tabbedPane.addTab("Contours", contoursPanel); add(tabbedPane); }// </editor-fold>//GEN-END:initComponents protected void updateGUI() { generalizationMaxLevelsSpinner.setValue(model.generalizationMaxLevels); generalizationDetailSlider.setValue((int) Math.round(model.getGeneralizationDetails() * 100)); azimuthSlider.setValue(model.azimuth); zenithSlider.setValue(model.zenith); ambientLightSlider.setValue((int) Math.round(model.ambientLight * 100)); contoursShadowLineWidthHighValueField.setValue(model.contoursShadowWidthHigh); contoursShadowLineWidthLowValueField.setValue(model.contoursShadowWidthLow); contoursIlluminatedLineWidthHighValueField.setValue(model.contoursIlluminatedWidthHigh); contoursIlluminatedLineWidthLowValueField.setValue(model.contoursIlluminatedWidthLow); contoursMinLineWidthSlider.setValue((int) Math.round(model.contoursMinWidth * 10)); contoursMinDistanceSlider.setValue((int) Math.round(model.contoursMinDist * 10)); contoursGradientSlider.setValue(model.contoursGradientAngle); contoursIntervalTextBox.setValue(model.contoursInterval); contoursDespeckleSlider.setValue((int) Math.round(model.contoursAspectGaussBlur * 20D)); contoursTransitionSlider.setValue(model.contoursTransitionAngle); verticalExaggerationSlider.setValue(Math.round(model.shadingVerticalExaggeration * 10f)); colorGradientSlider.setValues(model.colorRamp.colorPositions, model.colorRamp.colors); solidColorButton.setColor(model.solidColor); planObliqueSlider.setValue(model.planObliqueAngle); updateGeneralizationInfoLabelVisiblity(); if (model.laplacianPyramid != null && model.laplacianPyramid.getLevels() != null) { localGridHighPassSlider.setMaximum(model.laplacianPyramid.getLevels().length * 10); // adjust slider labels java.util.Hashtable labels = localGridHighPassSlider.createStandardLabels(10); java.util.Enumeration e = labels.elements(); while (e.hasMoreElements()) { javax.swing.JComponent comp = (javax.swing.JComponent) e.nextElement(); if (comp instanceof javax.swing.JLabel) { javax.swing.JLabel label = (javax.swing.JLabel) (comp); String str = Integer.toString(Integer.parseInt(label.getText()) / 10); label.setText(str); } } localGridHighPassSlider.setLabelTable(labels); } else { localGridHighPassSlider.setMajorTickSpacing(0); } localGridHighPassSlider.setValue((int) Math.round(model.getLocalGridHighPassWeight() * 10)); localGridStandardDeviationFilterSizeSlider.setValue(model.getLocalGridStandardDeviationLevels()); colorPopupMenu.removeAll(); for (ColorRamp cr : model.predefinedColorRamps) { JMenuItem colorMenuItem = new JMenuItem(cr.name); colorMenuItem.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { JMenuItem menuItem = (JMenuItem) evt.getSource(); model.selectColorRamp(menuItem.getText()); colorGradientSlider.setValues(model.colorRamp.colorPositions, model.colorRamp.colors); updateImage(REGULAR); } }); colorPopupMenu.add(colorMenuItem); } contoursIlluminatedColorButton.setColor(new Color(model.contoursIlluminatedColor)); contoursShadowedColorButton.setColor(new Color(model.contoursShadowedColor)); int exp = (int) Math.round(model.getColorLUTRenderer().getExponentP() * 10); idwExponentSlider.setValue(exp); idwRadioButton.setSelected(model.getColorLUTRenderer().isUseIDW()); updateVisualizationPanelsVisibility(); updateImage(REGULAR); } public void setModel(Model m) { this.model = m; bivariateColorPanel.setBivariateColorRenderer(model.getBivariateColorRenderer()); bivariateColorPanel.selectFirstPoint(); updateGUI(); } private MainWindow getOwnerWindow() { JRootPane rootPane = getRootPane(); if (rootPane != null) { JDialog dialog = (JDialog) (rootPane.getParent()); return (MainWindow) (dialog.getOwner()); } return null; } private void azimuthSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_azimuthSliderStateChanged model.azimuth = azimuthSlider.getValue(); updateImage(azimuthSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_azimuthSliderStateChanged private void updateGeneralizationInfoLabelVisiblity() { generalizationInfoLabel.setVisible(!model.isGeneralizing()); } private void generalizationDetailSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_generalizationDetailSliderStateChanged //don't take action until user has finished adjusting if (generalizationDetailSlider.getValueIsAdjusting() == false) { model.setGeneralizationDetails(generalizationDetailSlider.getValue() / 100d); //compute the summed pyramids using the original grid model.updateGeneralizedGrid(); //shade, color, and redraw updateImage(REGULAR); } // write value to GUI double detailVal = generalizationDetailSlider.getValue() / 100d; detailVal = (detailVal + 1) / 2; String valString = new DecimalFormat("#%").format(detailVal); generalizationDetaiIsLabel.setText(valString); updateGeneralizationInfoLabelVisiblity(); }//GEN-LAST:event_generalizationDetailSliderStateChanged private void zenithSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_zenithSliderStateChanged model.zenith = zenithSlider.getValue(); updateImage(zenithSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_zenithSliderStateChanged private void generalizationMaxLevelsSpinnerStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_generalizationMaxLevelsSpinnerStateChanged model.generalizationMaxLevels = (Integer) (generalizationMaxLevelsSpinner.getValue()); //compute the summed pyramids using the original grid model.updateGeneralizedGrid(); //shade, color, and redraw updateImage(REGULAR); updateGeneralizationInfoLabelVisiblity(); }//GEN-LAST:event_generalizationMaxLevelsSpinnerStateChanged private void verticalExaggerationSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_verticalExaggerationSliderStateChanged model.shadingVerticalExaggeration = verticalExaggerationSlider.getValue() / 10f; updateImage(verticalExaggerationSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_verticalExaggerationSliderStateChanged private void colorGradientSliderPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_colorGradientSliderPropertyChange String propName = evt.getPropertyName(); //Check if the changed property is either value or color for one of the thumbs if (MultiThumbSlider.VALUES_PROPERTY.equals(propName) || MultiThumbSlider.ADJUST_PROPERTY.equals(propName)) { model.colorRamp.colors = colorGradientSlider.getValues(); model.colorRamp.colorPositions = colorGradientSlider.getThumbPositions(); updateImage(colorGradientSlider.isValueAdjusting() ? FAST : REGULAR); } if (MultiThumbSlider.VALUES_PROPERTY.equals(propName) || MultiThumbSlider.SELECTED_THUMB_PROPERTY.equals(propName)) { updateColorPickerFromColorGradientSlider(); } }//GEN-LAST:event_colorGradientSliderPropertyChange private void contoursIntervalTextBoxPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_contoursIntervalTextBoxPropertyChange Object contourTextVal = contoursIntervalTextBox.getValue(); if (contourTextVal != null) { double d = ((Number) contourTextVal).doubleValue(); if (d != model.contoursInterval) { model.contoursInterval = d; updateImage(REGULAR); } } }//GEN-LAST:event_contoursIntervalTextBoxPropertyChange /** * Adjust the value of the slider with the minimum contours line width. This * value is always smaller than the other width values. * * @param movingSlider The slider that is currently moved. */ private void adjustContoursMinLineWidthSlider(JSlider movingSlider) { // temporarily remove event listener to avoid triggering a render event ChangeListener listener = contoursMinLineWidthSlider.getChangeListeners()[0]; contoursMinLineWidthSlider.removeChangeListener(listener); int width = Math.min(movingSlider.getValue(), (int) Math.round(model.contoursMinWidth * 10)); contoursMinLineWidthSlider.setValue(width); // add the event lister back to the slider contoursMinLineWidthSlider.addChangeListener(listener); // also update the model model.contoursMinWidth = width / 10d; String t = new DecimalFormat("0.0").format(model.contoursMinWidth); contoursMinLineWidthValueLabel.setText(t); } private void contoursIlluminatedHighestLineWidthSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursIlluminatedHighestLineWidthSliderStateChanged double val = contoursIlluminatedHighestLineWidthSlider.getValue() / 10.d; contoursIlluminatedLineWidthHighValueField.setValue(val); if (!contoursIlluminatedHighestLineWidthSlider.getValueIsAdjusting()) { updateImage(REGULAR); } }//GEN-LAST:event_contoursIlluminatedHighestLineWidthSliderStateChanged private void contoursShadowHighestLineWidthSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursShadowHighestLineWidthSliderStateChanged double val = contoursShadowHighestLineWidthSlider.getValue() / 10.d; contoursShadowLineWidthHighValueField.setValue(val); if (!contoursShadowHighestLineWidthSlider.getValueIsAdjusting()) { updateImage(REGULAR); } }//GEN-LAST:event_contoursShadowHighestLineWidthSliderStateChanged private static void setSliderValueWithoutTriggeringEvent(JSlider slider, int value) { // temporarily remove event listeners ChangeListener[] listeners = slider.getChangeListeners(); for (ChangeListener l : listeners) { slider.removeChangeListener(l); } slider.setValue(value); // add the event lister back to the slider for (ChangeListener l : listeners) { slider.addChangeListener(l); } } private static void setFieldValueWithoutTriggeringEvent(JFormattedTextField field, double value) { // temporarily remove event listeners PropertyChangeListener[] listeners = field.getPropertyChangeListeners(); for (PropertyChangeListener l : listeners) { field.removePropertyChangeListener(l); } field.setValue(value); // add the event listeners back to the slider for (PropertyChangeListener l : listeners) { field.addPropertyChangeListener(l); } } private void contoursMinLineWidthSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursMinLineWidthSliderStateChanged double v; int sliderVal; model.contoursMinWidth = contoursMinLineWidthSlider.getValue() / 10.; v = ((Number) contoursShadowLineWidthHighValueField.getValue()).doubleValue(); model.contoursShadowWidthHigh = Math.max(v, model.contoursMinWidth); sliderVal = (int) Math.round(model.contoursShadowWidthHigh * 10); setSliderValueWithoutTriggeringEvent(contoursShadowHighestLineWidthSlider, sliderVal); v = ((Number) contoursShadowLineWidthLowValueField.getValue()).doubleValue(); model.contoursShadowWidthLow = Math.max(v, model.contoursMinWidth); sliderVal = (int) Math.round(model.contoursShadowWidthLow * 10); setSliderValueWithoutTriggeringEvent(contoursShadowLowestLineWidthSlider, sliderVal); v = ((Number) contoursIlluminatedLineWidthHighValueField.getValue()).doubleValue(); model.contoursIlluminatedWidthHigh = Math.max(v, model.contoursMinWidth); sliderVal = (int) Math.round(model.contoursIlluminatedWidthHigh * 10); setSliderValueWithoutTriggeringEvent(contoursIlluminatedHighestLineWidthSlider, sliderVal); v = ((Number) contoursIlluminatedLineWidthLowValueField.getValue()).doubleValue(); model.contoursIlluminatedWidthLow = Math.max(v, model.contoursMinWidth); sliderVal = (int) Math.round(model.contoursIlluminatedWidthLow * 10); setSliderValueWithoutTriggeringEvent(contoursIlluminatedLowestLineWidthSlider, sliderVal); // update text fields setFieldValueWithoutTriggeringEvent(contoursShadowLineWidthHighValueField, model.contoursShadowWidthHigh); setFieldValueWithoutTriggeringEvent(contoursShadowLineWidthLowValueField, model.contoursShadowWidthLow); setFieldValueWithoutTriggeringEvent(contoursIlluminatedLineWidthHighValueField, model.contoursIlluminatedWidthHigh); setFieldValueWithoutTriggeringEvent(contoursIlluminatedLineWidthLowValueField, model.contoursIlluminatedWidthLow); // update map updateImage(contoursMinLineWidthSlider.getValueIsAdjusting() ? FAST : REGULAR); DecimalFormat df = new DecimalFormat("0.0"); String t = df.format(model.contoursMinWidth); contoursMinLineWidthValueLabel.setText(t); }//GEN-LAST:event_contoursMinLineWidthSliderStateChanged private void contoursGradientSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursGradientSliderStateChanged model.contoursGradientAngle = contoursGradientSlider.getValue(); updateImage(contoursGradientSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_contoursGradientSliderStateChanged private void solidColorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_solidColorButtonActionPerformed model.solidColor = solidColorButton.getColor(); updateImage(REGULAR); }//GEN-LAST:event_solidColorButtonActionPerformed private void updateContoursGUI(boolean illuminated) { contoursIlluminatedHighestLineWidthSlider.setEnabled(illuminated); contoursIlluminatedLowestLineWidthSlider.setEnabled(illuminated); contoursTransitionSlider.setEnabled(illuminated); contoursGradientSlider.setEnabled(illuminated); contoursIlluminatedColorButton.setEnabled(illuminated); } private void contoursComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_contoursComboBoxItemStateChanged if (evt.getStateChange() == ItemEvent.SELECTED) { switch (contoursComboBox.getSelectedIndex()) { case 0: model.foregroundVisualization = ForegroundVisualization.NONE; ((CardLayout) (contoursCardPanel.getLayout())).show(contoursCardPanel, "emptyCard"); break; case 1: model.foregroundVisualization = ForegroundVisualization.ILLUMINATED_CONTOURS; ((CardLayout) (contoursCardPanel.getLayout())).show(contoursCardPanel, "contoursSettingsCard"); updateContoursGUI(true); break; case 2: model.foregroundVisualization = ForegroundVisualization.SHADED_CONTOURS; ((CardLayout) (contoursCardPanel.getLayout())).show(contoursCardPanel, "contoursSettingsCard"); updateContoursGUI(false); break; } updateVisualizationPanelsVisibility(); updateImage(REGULAR); } }//GEN-LAST:event_contoursComboBoxItemStateChanged private void visualizationComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_visualizationComboBoxItemStateChanged if (evt.getStateChange() == ItemEvent.SELECTED) { model.backgroundVisualization = (ColorVisualization) visualizationComboBox.getSelectedItem(); updateVisualizationPanelsVisibility(); updateImage(REGULAR); } }//GEN-LAST:event_visualizationComboBoxItemStateChanged private void localGridStandardDeviationFilterSizeSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_localGridStandardDeviationFilterSizeSliderStateChanged if (localGridStandardDeviationFilterSizeSlider.getValueIsAdjusting() == false) { int levels = localGridStandardDeviationFilterSizeSlider.getValue(); model.setLocalGridStandardDeviationLevels(levels); updateImage(REGULAR); } }//GEN-LAST:event_localGridStandardDeviationFilterSizeSliderStateChanged private void localGridHighPassSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_localGridHighPassSliderStateChanged if (localGridHighPassSlider.getValueIsAdjusting() == false) { int filterSize = localGridHighPassSlider.getValue(); model.setLocalGridHighPassWeight(filterSize / 10d); updateImage(REGULAR); } }//GEN-LAST:event_localGridHighPassSliderStateChanged private void contoursDespeckleSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursDespeckleSliderStateChanged model.contoursAspectGaussBlur = contoursDespeckleSlider.getValue() / 20D; updateImage(contoursDespeckleSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_contoursDespeckleSliderStateChanged private void contoursTransitionSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursTransitionSliderStateChanged model.contoursTransitionAngle = contoursTransitionSlider.getValue(); updateImage(contoursTransitionSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_contoursTransitionSliderStateChanged private void contoursBlankBackgroundButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_contoursBlankBackgroundButtonActionPerformed model.backgroundVisualization = ColorVisualization.CONTINUOUS; visualizationComboBox.setSelectedIndex(ColorVisualization.CONTINUOUS.ordinal()); updateVisualizationPanelsVisibility(); updateImage(REGULAR); }//GEN-LAST:event_contoursBlankBackgroundButtonActionPerformed /** * Call this after a slider for adjusting contour line width on illuminated * or shadowed slopes has been adjusted. * * @param masterSlider The dragged slider * @param slaveSlider The slider linked to the master slider. * @param masterLabel The label for the master slider. * @param slaveLabel The label for the slave slider. * @param locked True if the slave slider is linked to the master slider. */ private void contoursWidthSliderStateChanged(JSlider masterSlider, JSlider slaveSlider, JLabel masterLabel, JLabel slaveLabel, boolean locked) { double w = masterSlider.getValue() / 10.f; adjustContoursMinLineWidthSlider(masterSlider); updateImage(masterSlider.getValueIsAdjusting() ? FAST : REGULAR); String t = new DecimalFormat("0.0").format(w); masterLabel.setText(t); if (locked) { setSliderValueWithoutTriggeringEvent(slaveSlider, masterSlider.getValue()); slaveLabel.setText(t); } } private void contoursIlluminatedLowestLineWidthSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursIlluminatedLowestLineWidthSliderStateChanged double val = contoursIlluminatedLowestLineWidthSlider.getValue() / 10.d; contoursIlluminatedLineWidthLowValueField.setValue(val); if (!contoursIlluminatedLowestLineWidthSlider.getValueIsAdjusting()) { updateImage(REGULAR); } }//GEN-LAST:event_contoursIlluminatedLowestLineWidthSliderStateChanged private void contoursIlluminatedLockedToggleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_contoursIlluminatedLockedToggleButtonActionPerformed if (contoursIlluminatedLockedToggleButton.isSelected()) { int val = contoursIlluminatedHighestLineWidthSlider.getValue(); contoursIlluminatedLowestLineWidthSlider.setValue(val); } }//GEN-LAST:event_contoursIlluminatedLockedToggleButtonActionPerformed private void contoursShadowedLockedToggleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_contoursShadowedLockedToggleButtonActionPerformed if (contoursShadowedLockedToggleButton.isSelected()) { int val = contoursShadowHighestLineWidthSlider.getValue(); contoursShadowLowestLineWidthSlider.setValue(val); } }//GEN-LAST:event_contoursShadowedLockedToggleButtonActionPerformed private void contoursShadowLowestLineWidthSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursShadowLowestLineWidthSliderStateChanged double val = contoursShadowLowestLineWidthSlider.getValue() / 10.d; contoursShadowLineWidthLowValueField.setValue(val); if (!contoursShadowLowestLineWidthSlider.getValueIsAdjusting()) { updateImage(REGULAR); } }//GEN-LAST:event_contoursShadowLowestLineWidthSliderStateChanged private void planObliqueSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_planObliqueSliderStateChanged model.planObliqueAngle = planObliqueSlider.getValue(); updateImage(planObliqueSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_planObliqueSliderStateChanged private void contoursMinDistanceSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_contoursMinDistanceSliderStateChanged model.contoursMinDist = contoursMinDistanceSlider.getValue() / 10.; updateImage(contoursMinDistanceSlider.getValueIsAdjusting() ? FAST : REGULAR); DecimalFormat df = new DecimalFormat("0.0"); String t = df.format(model.contoursMinDist); contoursMinDistanceValueLabel.setText(t); }//GEN-LAST:event_contoursMinDistanceSliderStateChanged private void adjustMinWidth(double val) { model.contoursMinWidth = Math.min(val, model.contoursMinWidth); int sliderVal = (int) Math.round(model.contoursMinWidth * 10f); setSliderValueWithoutTriggeringEvent(contoursMinLineWidthSlider, sliderVal); String t = new DecimalFormat("0.0").format(model.contoursMinWidth); contoursMinLineWidthValueLabel.setText(t); } private void contoursShadowLineWidthHighValueFieldPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_contoursShadowLineWidthHighValueFieldPropertyChange if ("value".equals(evt.getPropertyName()) == false) { return; } model.contoursShadowWidthHigh = ((Number) contoursShadowLineWidthHighValueField.getValue()).doubleValue(); int sliderVal = (int) Math.round(model.contoursShadowWidthHigh * 10); setSliderValueWithoutTriggeringEvent(contoursShadowHighestLineWidthSlider, sliderVal); boolean locked = contoursShadowedLockedToggleButton.isSelected(); if (locked) { setSliderValueWithoutTriggeringEvent(contoursShadowLowestLineWidthSlider, sliderVal); model.contoursShadowWidthLow = model.contoursShadowWidthHigh; setFieldValueWithoutTriggeringEvent(contoursShadowLineWidthLowValueField, model.contoursShadowWidthLow); } adjustMinWidth(model.contoursShadowWidthHigh); updateImage(contoursShadowHighestLineWidthSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_contoursShadowLineWidthHighValueFieldPropertyChange private void contoursShadowLineWidthLowValueFieldPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_contoursShadowLineWidthLowValueFieldPropertyChange if ("value".equals(evt.getPropertyName()) == false) { return; } model.contoursShadowWidthLow = ((Number) contoursShadowLineWidthLowValueField.getValue()).doubleValue(); int sliderVal = (int) Math.round(model.contoursShadowWidthLow * 10); setSliderValueWithoutTriggeringEvent(contoursShadowLowestLineWidthSlider, sliderVal); boolean locked = contoursShadowedLockedToggleButton.isSelected(); if (locked) { setSliderValueWithoutTriggeringEvent(contoursShadowHighestLineWidthSlider, sliderVal); model.contoursShadowWidthHigh = model.contoursShadowWidthLow; setFieldValueWithoutTriggeringEvent(contoursShadowLineWidthHighValueField, model.contoursShadowWidthHigh); } adjustMinWidth(model.contoursShadowWidthLow); updateImage(contoursShadowLowestLineWidthSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_contoursShadowLineWidthLowValueFieldPropertyChange private void contoursIlluminatedLineWidthHighValueFieldPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_contoursIlluminatedLineWidthHighValueFieldPropertyChange if ("value".equals(evt.getPropertyName()) == false) { return; } model.contoursIlluminatedWidthHigh = ((Number) contoursIlluminatedLineWidthHighValueField.getValue()).doubleValue(); int sliderVal = (int) Math.round(model.contoursIlluminatedWidthHigh * 10); setSliderValueWithoutTriggeringEvent(contoursIlluminatedHighestLineWidthSlider, sliderVal); boolean locked = contoursIlluminatedLockedToggleButton.isSelected(); if (locked) { setSliderValueWithoutTriggeringEvent(contoursIlluminatedLowestLineWidthSlider, sliderVal); model.contoursIlluminatedWidthLow = model.contoursIlluminatedWidthHigh; setFieldValueWithoutTriggeringEvent(contoursIlluminatedLineWidthLowValueField, model.contoursIlluminatedWidthLow); } adjustMinWidth(model.contoursIlluminatedWidthHigh); updateImage(contoursIlluminatedHighestLineWidthSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_contoursIlluminatedLineWidthHighValueFieldPropertyChange private void contoursIlluminatedLineWidthLowValueFieldPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_contoursIlluminatedLineWidthLowValueFieldPropertyChange if ("value".equals(evt.getPropertyName()) == false) { return; } model.contoursIlluminatedWidthLow = ((Number) contoursIlluminatedLineWidthLowValueField.getValue()).doubleValue(); int sliderVal = (int) Math.round(model.contoursIlluminatedWidthLow * 10); setSliderValueWithoutTriggeringEvent(contoursIlluminatedLowestLineWidthSlider, sliderVal); boolean locked = contoursIlluminatedLockedToggleButton.isSelected(); if (locked) { setSliderValueWithoutTriggeringEvent(contoursIlluminatedHighestLineWidthSlider, sliderVal); model.contoursIlluminatedWidthHigh = model.contoursIlluminatedWidthLow; setFieldValueWithoutTriggeringEvent(contoursIlluminatedLineWidthHighValueField, model.contoursIlluminatedWidthHigh); } adjustMinWidth(model.contoursIlluminatedWidthLow); updateImage(contoursIlluminatedLowestLineWidthSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_contoursIlluminatedLineWidthLowValueFieldPropertyChange private void contoursIlluminatedColorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_contoursIlluminatedColorButtonActionPerformed Color color = contoursIlluminatedColorButton.getColor(); model.contoursIlluminatedColor = color.getRGB(); updateImage(REGULAR); }//GEN-LAST:event_contoursIlluminatedColorButtonActionPerformed private void contoursShadowedColorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_contoursShadowedColorButtonActionPerformed Color color = contoursShadowedColorButton.getColor(); model.contoursShadowedColor = color.getRGB(); updateImage(REGULAR); }//GEN-LAST:event_contoursShadowedColorButtonActionPerformed private void ambientLightSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_ambientLightSliderStateChanged model.ambientLight = ambientLightSlider.getValue() / 100d; updateImage(ambientLightSlider.getValueIsAdjusting() ? FAST : REGULAR); }//GEN-LAST:event_ambientLightSliderStateChanged private void idwRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_idwRadioButtonActionPerformed model.getColorLUTRenderer().setUseIDW(idwRadioButton.isSelected()); updateImage(REGULAR); bivariateColorGroupPanel.repaint(); }//GEN-LAST:event_idwRadioButtonActionPerformed private void gaussRadioButtonidwRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gaussRadioButtonidwRadioButtonActionPerformed model.getColorLUTRenderer().setUseIDW(idwRadioButton.isSelected()); updateImage(REGULAR); bivariateColorGroupPanel.repaint(); }//GEN-LAST:event_gaussRadioButtonidwRadioButtonActionPerformed private void idwExponentSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_idwExponentSliderStateChanged double exp = idwExponentSlider.getValue() / 10d; model.getColorLUTRenderer().setExponentP(exp); updateImage(idwExponentSlider.getValueIsAdjusting() ? FAST : REGULAR); bivariateColorExponentValueLabel.setText(Double.toString(exp)); bivariateColorGroupPanel.repaint(); if (idwExponentSlider.getValueIsAdjusting() == false) { updateImage(REGULAR); } }//GEN-LAST:event_idwExponentSliderStateChanged private void bivariateColorPanelPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_bivariateColorPanelPropertyChange if ("selectedPoint".equals(evt.getPropertyName())) { updateColorPickerFromBivariatePanel(); } // color changed or point was moved if ("colorChanged".equals(evt.getPropertyName()) || "colorDeleted".equals(evt.getPropertyName())) { if (bivariateColorPanel.isValueAdjusting() == false || "colorDeleted".equals(evt.getPropertyName())) { updateImage(REGULAR); } } }//GEN-LAST:event_bivariateColorPanelPropertyChange private void colorPickerPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_colorPickerPropertyChange if ("selected color".equals(evt.getPropertyName()) && model != null) { if (model.backgroundVisualization.uses2DLUT()) { bivariateColorPanel.setSelectedColor(colorPicker.getColor()); model.getBivariateColorRenderer().colorPointsChanged(); } else { int selectedThumbID = colorGradientSlider.getSelectedThumb(false); Color[] colors = colorGradientSlider.getValues(); if (selectedThumbID >= 0 && selectedThumbID < colors.length) { colors[selectedThumbID] = colorPicker.getColor(); float[] thumbPositions = colorGradientSlider.getThumbPositions(); colorGradientSlider.setValues(thumbPositions, colors); } } updateImage(REGULAR); } }//GEN-LAST:event_colorPickerPropertyChange /** * Open a grid file. * * @param filePath The file to open * @throws IOException */ private void openGridForBivariateColor(final String filePath, final boolean horizontalGrid) throws IOException { SwingWorkerWithProgressIndicatorDialog worker; String dialogTitle = "Pyramid Shader"; worker = new SwingWorkerWithProgressIndicatorDialog<Void>(null, dialogTitle, "", true) { @Override public void done() { try { // a call to get() will throw an ExecutionException if an // exception occured in doInBackground get(); // hide the progress dialog before rendering the image // if rendering throws an error, the progress dialog should // have been closed completeProgress(); String fileName = FileUtils.getFileNameWithoutExtension(filePath); if (horizontalGrid) { bivariateHorizontalLabel.setText(fileName); } else { bivariateVerticalLabel.setText(fileName); } updateImage(REGULAR); bivariateColorPanel.repaint(); } catch (InterruptedException | CancellationException e) { } catch (Throwable e) { // hide the progress dialog completeProgress(); // an exception was thrown in doInBackground String msg = "<html>An error occured when importing the terrain model." + "<br>The file must be in Esri ASCII Grid format.</html>"; ErrorDialog.showErrorDialog(msg, "Error", null, null); } finally { // hide the progress dialog completeProgress(); } } @Override protected Void doInBackground() throws Exception { start(); //import the DEM and create pyramids Grid grid = EsriASCIIGridReader.read(filePath, this); this.setIndeterminate(true); this.setCancellable(false); if (horizontalGrid) { model.getBivariateColorRenderer().setAttribute1Grid(grid); } else { model.getBivariateColorRenderer().setAttribute2Grid(grid); } return null; } }; worker.setMaxTimeWithoutDialogMilliseconds(1000); worker.setIndeterminate(false); worker.setMessage("Importing Terrain Model"); worker.execute(); } private void bivariateHorizontalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bivariateHorizontalButtonActionPerformed try { // ask the user for a file String filePath = FileUtils.askFile(null, "Select an Esri ASCII Grid", true); if (filePath != null) { openGridForBivariateColor(filePath, true); } } catch (IOException ex) { ErrorDialog.showErrorDialog("Could not open grid file.", "Error", ex, this); } }//GEN-LAST:event_bivariateHorizontalButtonActionPerformed private void bivariateVerticalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bivariateVerticalButtonActionPerformed try { // ask the user for a file String filePath = FileUtils.askFile(null, "Select an Esri ASCII Grid", true); if (filePath != null) { openGridForBivariateColor(filePath, false); } } catch (IOException ex) { ErrorDialog.showErrorDialog("Could not open grid file.", "Error", ex, this); } }//GEN-LAST:event_bivariateVerticalButtonActionPerformed /** * user right-clicked on the map. Use the clicked location to add a color * point to the bivariate color panel * * @param xPerc * @param yPerc */ public void mouseRightClicked(double xPerc, double yPerc) { if (model.getBivariateColorRenderer().hasGrids() == false || model.backgroundVisualization.uses2DLUT() == false) { return; } BivariateColorRenderer bivariateRenderer = model.getBivariateColorRenderer(); Point lutPt = bivariateRenderer.getLUTCoordinates(xPerc, yPerc); BivariateColorPoint pt = new BivariateColorPoint(); int rgb = bivariateRenderer.getLUTColor(lutPt.x, lutPt.y); Color color = new Color(rgb); pt.setColor(color); pt.setAttribute1((double) lutPt.x / BivariateColorRenderer.LUT_SIZE); pt.setAttribute2(1 - (double) lutPt.y / BivariateColorRenderer.LUT_SIZE); bivariateRenderer.addPoint(pt); bivariateRenderer.colorPointsChanged(); bivariateColorPanel.selectPoint(pt); updateImage(RenderSpeed.REGULAR); bivariateColorPanel.repaint(); } /** * Mouse pointer was moved over the map. Extract LUT location for the passed * location. * * @param xPerc Horizontal pointer location in percentage. * @param yPerc Vertical pointer location in percentage, from top to bottom. */ public void mouseMoved(double xPerc, double yPerc) { if (model.getBivariateColorRenderer().hasGrids() == false || model.backgroundVisualization.uses2DLUT() == false) { return; } Point pt = model.getBivariateColorRenderer().getLUTCoordinates(xPerc, yPerc); if (pt != null) { xPerc = 100d * pt.x / BivariateColorRenderer.LUT_SIZE; yPerc = 100d * pt.y / BivariateColorRenderer.LUT_SIZE; } else { xPerc = -1; yPerc = -1; } bivariateColorPanel.setCrossPerc(xPerc, yPerc); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JSlider ambientLightSlider; private javax.swing.JSlider azimuthSlider; private javax.swing.JLabel bivariateColorExponentValueLabel; private javax.swing.JPanel bivariateColorGroupPanel; private edu.oregonstate.cartography.gui.bivariate.BivariateColorPanel bivariateColorPanel; private javax.swing.JButton bivariateHorizontalButton; private javax.swing.JLabel bivariateHorizontalLabel; private javax.swing.ButtonGroup bivariateInterpolationButtonGroup; private javax.swing.JButton bivariateVerticalButton; private edu.oregonstate.cartography.gui.RotatedLabel bivariateVerticalLabel; private javax.swing.JPanel colorGradientPanel; private com.bric.swing.GradientSlider colorGradientSlider; private com.bric.swing.ColorPicker colorPicker; private javax.swing.JPopupMenu colorPopupMenu; private edu.oregonstate.cartography.gui.MenuToggleButton colorPresetsButton; private javax.swing.JButton contoursBlankBackgroundButton; private javax.swing.JPanel contoursCardPanel; private javax.swing.JComboBox contoursComboBox; private javax.swing.JSlider contoursDespeckleSlider; private javax.swing.JPanel contoursEmptyPanel; private javax.swing.JSlider contoursGradientSlider; private edu.oregonstate.cartography.gui.ColorButton contoursIlluminatedColorButton; private javax.swing.JSlider contoursIlluminatedHighestLineWidthSlider; private javax.swing.JFormattedTextField contoursIlluminatedLineWidthHighValueField; private javax.swing.JFormattedTextField contoursIlluminatedLineWidthLowValueField; private javax.swing.JToggleButton contoursIlluminatedLockedToggleButton; private javax.swing.JSlider contoursIlluminatedLowestLineWidthSlider; private javax.swing.JFormattedTextField contoursIntervalTextBox; private javax.swing.JLabel contoursMinDistanceLabel; private javax.swing.JSlider contoursMinDistanceSlider; private javax.swing.JLabel contoursMinDistanceValueLabel; private javax.swing.JSlider contoursMinLineWidthSlider; private javax.swing.JLabel contoursMinLineWidthValueLabel; private javax.swing.JPanel contoursPanel; private javax.swing.JPanel contoursSettingsPanel; private javax.swing.JSlider contoursShadowHighestLineWidthSlider; private javax.swing.JFormattedTextField contoursShadowLineWidthHighValueField; private javax.swing.JFormattedTextField contoursShadowLineWidthLowValueField; private javax.swing.JSlider contoursShadowLowestLineWidthSlider; private edu.oregonstate.cartography.gui.ColorButton contoursShadowedColorButton; private javax.swing.JToggleButton contoursShadowedLockedToggleButton; private javax.swing.JSlider contoursTransitionSlider; private javax.swing.JRadioButton gaussRadioButton; private javax.swing.JLabel generalizationDetaiIsLabel; private javax.swing.JSlider generalizationDetailSlider; private javax.swing.JLabel generalizationInfoLabel; private javax.swing.JSpinner generalizationMaxLevelsSpinner; private javax.swing.JPanel generalizationPanel; private javax.swing.JSlider idwExponentSlider; private javax.swing.JRadioButton idwRadioButton; private javax.swing.JPanel illuminatedContoursPanel; private javax.swing.JPanel illuminationPanel; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel9; private javax.swing.JSlider localGridHighPassSlider; private javax.swing.JSlider localGridStandardDeviationFilterSizeSlider; private javax.swing.JPanel localHypsoPanel; private javax.swing.JPanel planObliquePanel; private javax.swing.JSlider planObliqueSlider; private edu.oregonstate.cartography.gui.ColorButton solidColorButton; private javax.swing.JPanel solidColorPanel; private javax.swing.JPanel spacingPanel; private javax.swing.JTabbedPane tabbedPane; private javax.swing.JLabel verticalExaggerationLabel; private javax.swing.JPanel verticalExaggerationPanel; private javax.swing.JSlider verticalExaggerationSlider; private javax.swing.JComboBox visualizationComboBox; private javax.swing.JPanel visualizationPanel; private javax.swing.JSlider zenithSlider; // End of variables declaration//GEN-END:variables }