From 3d9340d00b6f8bd1b5348c866478dea987156d1b Mon Sep 17 00:00:00 2001 From: Bing Yang Date: Tue, 22 Aug 2023 18:27:52 -0400 Subject: [PATCH 01/13] Add autoGrouping for spectrum view if SPEXONE --- .../esa/snap/rcp/spectrum/SpectrumTopComponent.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 3eb7913a75..cfad709336 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -171,6 +171,15 @@ private void setCurrentView(ProductSceneView view) { if (currentView != null) { currentView.addPropertyChangeListener(ProductSceneView.PROPERTY_NAME_SELECTED_PIN, pinSelectionChangeListener); setCurrentProduct(currentView.getProduct()); + if (currentProduct.getName().contains("SPEXONE")) { + currentProduct.setAutoGrouping("QC:QC_bitwise:QC_polsample_bitwise:QC_polsample:" + + "I_58_*:I_22_*:I_4_*:I_-22_*:I_-58_*:I_noise:I_noisefree:I_polsample:" + + "I_polsample_noise:I_noisefree_polsample:DOLP:DOLP_noise:DOLP_noisefree:" + + "Q_over_I:Q_over_I_noise:Q_over_I_noisefree:AOLP:AOLP_noisefree:" + + "U_over_I:U_over_I_noise:U_over_I_noisefree:scattering_angle:" + + "sensor_azimuth:sensor_zenith:solar_azimuth:solar_zenith:" + + "obs_per_view:view_time_offsets"); + } if (!rasterToSpectraMap.containsKey(currentView.getRaster())) { setUpSpectra(); } @@ -520,6 +529,9 @@ private void setUpSpectra() { List ungroupedBandsList = new ArrayList<>(); for (SpectrumBand availableSpectralBand : availableSpectralBands) { final String bandName = availableSpectralBand.getName(); + if (currentProduct.getName().contains("SPEXONE")) { + availableSpectralBand.setSelected(false); + } final int spectrumIndex = autoGrouping.indexOf(bandName); if (spectrumIndex != -1) { autoGroupingSpectra[spectrumIndex].addBand(availableSpectralBand); From 922a68536e14322450d7c98d0f5864d4ce810a13 Mon Sep 17 00:00:00 2001 From: Bing Yang Date: Tue, 19 Sep 2023 23:58:45 -0400 Subject: [PATCH 02/13] change autogrouping for spectrum view --- .../rcp/spectrum/SpectrumTopComponent.java | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index cfad709336..3bb3e7c468 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -21,6 +21,7 @@ import org.esa.snap.core.image.ImageManager; import org.esa.snap.core.util.ProductUtils; import org.esa.snap.core.util.StringUtils; +import org.esa.snap.core.util.math.Array; import org.esa.snap.rcp.SnapApp; import org.esa.snap.rcp.actions.help.HelpAction; import org.esa.snap.rcp.placemark.PlacemarkUtils; @@ -171,14 +172,60 @@ private void setCurrentView(ProductSceneView view) { if (currentView != null) { currentView.addPropertyChangeListener(ProductSceneView.PROPERTY_NAME_SELECTED_PIN, pinSelectionChangeListener); setCurrentProduct(currentView.getProduct()); - if (currentProduct.getName().contains("SPEXONE")) { - currentProduct.setAutoGrouping("QC:QC_bitwise:QC_polsample_bitwise:QC_polsample:" + - "I_58_*:I_22_*:I_4_*:I_-22_*:I_-58_*:I_noise:I_noisefree:I_polsample:" + + if (currentProduct.getName().contains("SPEX")) { + List view_Angles = new ArrayList(); + for (int i = 0; i < currentProduct.getNumBands(); i++ ) { + int viewAngle = (int) currentProduct.getBandAt(i).getAngularValue(); + if (!view_Angles.contains(viewAngle)) { + view_Angles.add(viewAngle); + if (view_Angles.size() == 5) { + break; + } + } + } + String autoGroupingStr = "QC:QC_bitwise:QC_polsample_bitwise:QC_polsample:"; + if (view_Angles != null) { + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "I_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "DOLP_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "AOLP_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "i_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "alop_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "dolp_" + view_Angles.get(i) + "_*:"; + } + } + autoGroupingStr += "I:I_noise:I_noisefree:I_polsample:" + "I_polsample_noise:I_noisefree_polsample:DOLP:DOLP_noise:DOLP_noisefree:" + - "Q_over_I:Q_over_I_noise:Q_over_I_noisefree:AOLP:AOLP_noisefree:" + + "Q_over_I:Q_over_I_noise:Q_over_I_noisefree:AOLP:AOLP_noise:AOLP_noisefree:" + "U_over_I:U_over_I_noise:U_over_I_noisefree:scattering_angle:" + "sensor_azimuth:sensor_zenith:solar_azimuth:solar_zenith:" + - "obs_per_view:view_time_offsets"); + "obs_per_view:view_time_offsets"; + currentProduct.setAutoGrouping(autoGroupingStr); +// currentProduct.setAutoGrouping("I:I_58_*:I_22_*:I_4_*:I_-22_*:I_-58_*:" + +// "AOLP:AOLP_58_*:AOLP_22_*:AOLP_4_*:AOLP_-22_*:AOLP_-58_*:" + +// "DOLP:DOLP_58_*:DOLP_22_*:DOLP_4_*:DOLP_-22_*:DOLP_-58_*:" + +// "QC:QC_58_*:QC_22_*:QC_4_*:QC_-22_*:QC_-58_*:" + +// "I_57_*:I_50_*:I_20_*:I_0_*:I_-20_*:I_-57_*:I_-50*:" + +// "AOLP_57_*:AOLP_50:AOLP_20_*:AOLP_0_*:AOLP_-20_*:AOLP_-57_*:AOLP_-50" + +// "DOLP_57_*:DOLP_20_*:DOLP_0_*:DOLP_-20_*:DOLP_-57_*:" + +// "QC_57_*:QC_20_*:QC_0_*:QC_-22_*:QC_-57_*:" + +// "QC_bitwise:QC_polsample_bitwise:QC_polsample:" + +// "I_noise:I_noisefree:I_polsample:I_polsample_noise:I_noisefree_polsample:" + +// "DOLP_noise:DOLP_noisefree:AOLP_noise:AOLP_noisefree:" + +// "Q_over_I:Q_over_I_noise:Q_over_I_noisefree:" + +// "U_over_I:U_over_I_noise:U_over_I_noisefree:scattering_angle:" + +// "sensor_azimuth:sensor_zenith:solar_azimuth:solar_zenith:" + +// "obs_per_view:view_time_offsets"); } if (!rasterToSpectraMap.containsKey(currentView.getRaster())) { setUpSpectra(); @@ -529,7 +576,7 @@ private void setUpSpectra() { List ungroupedBandsList = new ArrayList<>(); for (SpectrumBand availableSpectralBand : availableSpectralBands) { final String bandName = availableSpectralBand.getName(); - if (currentProduct.getName().contains("SPEXONE")) { + if (currentProduct.getName().contains("SPEX")) { availableSpectralBand.setSelected(false); } final int spectrumIndex = autoGrouping.indexOf(bandName); From a2aa10f3f4c95af55501cf355c1f3b1c07f3a063 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Mon, 26 Feb 2024 19:24:27 -0500 Subject: [PATCH 03/13] Fixed issue where Spectrum View Tool exceeded array size --- .../java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 3bb3e7c468..80f38f135f 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -184,7 +184,7 @@ private void setCurrentView(ProductSceneView view) { } } String autoGroupingStr = "QC:QC_bitwise:QC_polsample_bitwise:QC_polsample:"; - if (view_Angles != null) { + if (view_Angles != null && view_Angles.size() == 5) { for (int i = 0; i < 5; i ++) { autoGroupingStr += "I_" + view_Angles.get(i) + "_*:"; } From f9a9fe94ab886ba5aa316ba762d0f67204c9801e Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Mon, 26 Feb 2024 23:54:12 -0500 Subject: [PATCH 04/13] Removed fix to Spectrum View tool --- .../java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 80f38f135f..3bb3e7c468 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -184,7 +184,7 @@ private void setCurrentView(ProductSceneView view) { } } String autoGroupingStr = "QC:QC_bitwise:QC_polsample_bitwise:QC_polsample:"; - if (view_Angles != null && view_Angles.size() == 5) { + if (view_Angles != null) { for (int i = 0; i < 5; i ++) { autoGroupingStr += "I_" + view_Angles.get(i) + "_*:"; } From 2fde31b038622160a90e92f3b6a05089e3d4fb34 Mon Sep 17 00:00:00 2001 From: Bing Yang Date: Thu, 29 Feb 2024 11:00:56 -0500 Subject: [PATCH 05/13] spectrum view works with the real SPEXOne L1C files --- .../rcp/spectrum/SpectrumTopComponent.java | 72 +++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 3bb3e7c468..a8e6de8052 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -198,18 +198,82 @@ private void setCurrentView(ProductSceneView view) { autoGroupingStr += "i_" + view_Angles.get(i) + "_*:"; } for (int i = 0; i < 5; i ++) { - autoGroupingStr += "alop_" + view_Angles.get(i) + "_*:"; + autoGroupingStr += "i_stdev_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "i_polsample_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "i_polsample_stdev_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "aolp_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "aolp_stdev_" + view_Angles.get(i) + "_*:"; } for (int i = 0; i < 5; i ++) { autoGroupingStr += "dolp_" + view_Angles.get(i) + "_*:"; } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "dolp_stdev_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "q_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "q_stdev_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "u_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "u_stdev_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "q_over_i_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "q_over_i_stdev_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "u_over_i_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "u_over_i_stdev_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "qc_" + view_Angles.get(i); + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "qc_polsample_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "i_noisefree_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "i_noisefree_polsample_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "dolp_noisefree_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "q_over_i_noisefree_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "aolp_noisefree_" + view_Angles.get(i) + "_*:"; + } + for (int i = 0; i < 5; i ++) { + autoGroupingStr += "u_over_i_noisefree_" + view_Angles.get(i) + "_*:"; + } } autoGroupingStr += "I:I_noise:I_noisefree:I_polsample:" + "I_polsample_noise:I_noisefree_polsample:DOLP:DOLP_noise:DOLP_noisefree:" + "Q_over_I:Q_over_I_noise:Q_over_I_noisefree:AOLP:AOLP_noise:AOLP_noisefree:" + - "U_over_I:U_over_I_noise:U_over_I_noisefree:scattering_angle:" + - "sensor_azimuth:sensor_zenith:solar_azimuth:solar_zenith:" + - "obs_per_view:view_time_offsets"; + "U_over_I:U_over_I_noise:U_over_I_noisefree:scattering_angle:rotation_angle:" + + "sensor_azimuth:sensor_azimuth_angle:sensor_zenith:sensor_zenith_angle:" + + "solar_azimuth:solar_azimuth_angle:solar_zenith:solar_zenith_angle:" + + "obs_per_view:view_time_offsets:number_of_observations"; currentProduct.setAutoGrouping(autoGroupingStr); // currentProduct.setAutoGrouping("I:I_58_*:I_22_*:I_4_*:I_-22_*:I_-58_*:" + // "AOLP:AOLP_58_*:AOLP_22_*:AOLP_4_*:AOLP_-22_*:AOLP_-58_*:" + From cddfe00667f7dcd9ded73bb6a4fdf33ecdc2c95b Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Fri, 15 Mar 2024 14:17:19 -0400 Subject: [PATCH 06/13] Spectrum View: set persistence to never and turned off default of always tracking the mouse. This caused great memory issues for files, including files opened in later SeaDAS sessions --- .../org/esa/snap/rcp/spectrum/SpectrumTopComponent.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index a8e6de8052..f2e0b2e498 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -75,7 +75,10 @@ import java.util.List; import java.util.*; -@TopComponent.Description(preferredID = "SpectrumTopComponent", iconBase = "org/esa/snap/rcp/icons/Spectrum.gif") +@TopComponent.Description(preferredID = "SpectrumTopComponent", + iconBase = "org/esa/snap/rcp/icons/Spectrum.gif", + persistenceType = TopComponent.PERSISTENCE_NEVER +) @TopComponent.Registration(mode = "Spectrum", openAtStartup = false, position = 80) @ActionID(category = "Window", id = "org.esa.snap.rcp.statistics.SpectrumTopComponent") @ActionReferences({ @@ -440,7 +443,7 @@ public void pointDeselected() { UIUtils.loadImageIcon("icons/CursorSpectrum24.gif"), true); showSpectrumForCursorButton.addActionListener(e -> recreateChart()); showSpectrumForCursorButton.setName("showSpectrumForCursorButton"); - showSpectrumForCursorButton.setSelected(true); + showSpectrumForCursorButton.setSelected(false); showSpectrumForCursorButton.setToolTipText("Show spectrum at cursor position."); showSpectraForSelectedPinsButton = ToolButtonFactory.createButton( From c703f669be2cd7604c310d7edc1b55057094cfa8 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Thu, 28 Mar 2024 22:27:51 -0400 Subject: [PATCH 07/13] Spectrum View: added progress monitor to avoid freeze issue --- .../rcp/spectrum/SpectrumTopComponent.java | 94 ++++++++++++++++--- 1 file changed, 83 insertions(+), 11 deletions(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index f2e0b2e498..070b214f04 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -17,6 +17,7 @@ import com.bc.ceres.glayer.support.ImageLayer; import com.bc.ceres.glevel.MultiLevelModel; +import com.bc.ceres.swing.progress.ProgressMonitorSwingWorker; import org.esa.snap.core.datamodel.*; import org.esa.snap.core.image.ImageManager; import org.esa.snap.core.util.ProductUtils; @@ -346,7 +347,7 @@ void setPrepareForUpdateMessage() { void updateData(int pixelX, int pixelY, int level, boolean pixelPosInRasterBounds) { chartHandler.setPosition(pixelX, pixelY, level, pixelPosInRasterBounds); - chartHandler.updateData(); + chartHandler.updateData(null); } void updateChart(boolean adjustAxes) { @@ -591,12 +592,51 @@ private boolean isShowingSpectraForAllPins() { } private void recreateChart() { - chartHandler.updateData(); + ProgressMonitorSwingWorker pmSwingWorker = new ProgressMonitorSwingWorker(SnapApp.getDefault().getMainFrame(), + "Collecting Spectral Data") { + + @Override + protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Exception { + + pm.beginTask("Collecting spectral data: this can take several minutes on larger files", 3); + + + try { + chartHandler.updateData(pm); + if (pm.isCanceled()) { + showSpectraForAllPinsButton.setSelected(false); + showSpectrumForCursorButton.setSelected(false); + showSpectraForSelectedPinsButton.setSelected(false); + componentClosed(); + chartHandler.setEmptyPlot(); + chartHandler.removeCursorSpectraFromDataset(); + pm.done(); + } + pm.worked(1); chartHandler.updateChart(); + pm.worked(1); chartPanel.repaint(); + pm.worked(1); updateUIState(); + } finally { + if (pm.isCanceled()) { + showSpectraForAllPinsButton.setSelected(false); + showSpectrumForCursorButton.setSelected(false); + showSpectraForSelectedPinsButton.setSelected(false); + componentClosed(); + chartHandler.setEmptyPlot(); + chartHandler.removeCursorSpectraFromDataset(); + } + pm.done(); + } + return null; + } + }; + + pmSwingWorker.executeWithBlocking(); } + Placemark[] getDisplayedPins() { if (isShowingSpectraForSelectedPins() && currentView != null) { return currentView.getSelectedPins(); @@ -828,9 +868,9 @@ private void updateChart() { chart.getXYPlot().clearAnnotations(); } - private void updateData() { + private void updateData(com.bc.ceres.core.ProgressMonitor pm) { List spectra = getSelectedSpectra(); - chartUpdater.updateData(chart, spectra); + chartUpdater.updateData(chart, spectra, pm); } private void setEmptyPlot() { @@ -919,11 +959,14 @@ private void setPosition(int pixelX, int pixelY, int level, boolean pixelPosInRa modelP = i2m.transform(new Point2D.Double(pixelX + 0.5, pixelY + 0.5), new Point2D.Double()); } - private void updateData(JFreeChart chart, List spectra) { + private void updateData(JFreeChart chart, List spectra, com.bc.ceres.core.ProgressMonitor pm) { dataset = new XYSeriesCollection(); if (rasterLevel >= 0) { - fillDatasetWithPinSeries(spectra, dataset, chart); - fillDatasetWithCursorSeries(spectra, dataset, chart); + fillDatasetWithPinSeries(spectra, dataset, chart, pm); + if (pm.isCanceled()) { + return; + } + fillDatasetWithCursorSeries(spectra, dataset, chart, pm); } } @@ -991,7 +1034,7 @@ private Range getNewPlotBounds(Range bounds) { bounds.getUpperBound() + delta); } - private void fillDatasetWithCursorSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart) { + private void fillDatasetWithCursorSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm) { showsValidCursorSpectra = false; if (modelP == null) { return; @@ -1002,6 +1045,9 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe final Band[] spectralBands = spectrum.getSelectedBands(); if (!currentProduct.isMultiSize()) { for (Band spectralBand : spectralBands) { + if (pm.isCanceled()) { + return; + } final float wavelength = spectralBand.getSpectralWavelength(); if (pixelPosInRasterBounds && isPixelValid(spectralBand, rasterPixelX, rasterPixelY, rasterLevel)) { addToSeries(spectralBand, rasterPixelX, rasterPixelY, rasterLevel, series, wavelength); @@ -1010,6 +1056,9 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe } } else { for (Band spectralBand : spectralBands) { + if (pm.isCanceled()) { + return; + } final float wavelength = spectralBand.getSpectralWavelength(); final AffineTransform i2m = spectralBand.getImageToModelTransform(); if (i2m.equals(currentView.getRaster().getImageToModelTransform())) { @@ -1033,7 +1082,13 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe } } } + if (pm.isCanceled()) { + return; + } updateRenderer(dataset.getSeriesCount(), Color.BLACK, spectrum, chart); + if (pm.isCanceled()) { + return; + } dataset.addSeries(series); } } @@ -1052,18 +1107,24 @@ private boolean coordinatesAreInRasterBounds(RasterDataNode raster, int x, int y return x >= 0 && y >= 0 && x < levelImage.getWidth() && y < levelImage.getHeight(); } - private void fillDatasetWithPinSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart) { + private void fillDatasetWithPinSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm) { Placemark[] pins = getDisplayedPins(); for (Placemark pin : pins) { - List pinSeries = createXYSeriesFromPin(pin, dataset.getSeriesCount(), spectra, chart); + List pinSeries = createXYSeriesFromPin(pin, dataset.getSeriesCount(), spectra, chart, pm); + if (pm.isCanceled()) { + return; + } pinSeries.forEach(dataset::addSeries); } } - private List createXYSeriesFromPin(Placemark pin, int seriesIndex, List spectra, JFreeChart chart) { + private List createXYSeriesFromPin(Placemark pin, int seriesIndex, List spectra, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm) { List pinSeries = new ArrayList<>(); Color pinColor = PlacemarkUtils.getPlacemarkColor(pin, currentView); for (DisplayableSpectrum spectrum : spectra) { + if (pm.isCanceled()) { + return null; + } XYSeries series = new XYSeries(spectrum.getName() + "_" + pin.getLabel()); final Band[] spectralBands = spectrum.getSelectedBands(); Map bandToEnergy; @@ -1074,6 +1135,9 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis pinToEnergies.put(pin, bandToEnergy); } for (Band spectralBand : spectralBands) { + if (pm.isCanceled()) { + return null; + } double energy; if (bandToEnergy.containsKey(spectralBand)) { energy = bandToEnergy.get(spectralBand); @@ -1085,8 +1149,16 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis if (energy != spectralBand.getGeophysicalNoDataValue()) { series.add(wavelength, energy); } + + } + + if (pm.isCanceled()) { + return null; } updateRenderer(seriesIndex++, pinColor, spectrum, chart); + if (pm.isCanceled()) { + return null; + } pinSeries.add(series); } return pinSeries; From 48a40598e704584af0ecfbdbf3e0f2887d15252c Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Sat, 30 Mar 2024 15:46:38 -0400 Subject: [PATCH 08/13] Spectrum View: added progress monitor and fixed issues such that subsequent views and files are not automatically processed with these tools. --- .../rcp/spectrum/SpectrumTopComponent.java | 353 +++++++++++++++--- 1 file changed, 300 insertions(+), 53 deletions(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 070b214f04..074ec56f97 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -112,6 +112,7 @@ public class SpectrumTopComponent extends ToolTopComponent { private AbstractButton showGridButton; private boolean tipShown; + private boolean spectrumViewToolIsOpen; private ProductSceneView currentView; private Product currentProduct; private ChartPanel chartPanel; @@ -123,6 +124,10 @@ public class SpectrumTopComponent extends ToolTopComponent { private boolean isUserInducedAutomaticAdjustmentChosen; public SpectrumTopComponent() { + System.out.println("Spectrum View Tool is Open"); + spectrumViewToolIsOpen = false; + + tipShown = true; productNodeHandler = new ProductNodeHandler(); pinSelectionChangeListener = new PinSelectionChangeListener(); rasterToSpectraMap = new HashMap<>(); @@ -295,10 +300,19 @@ private void setCurrentView(ProductSceneView view) { // "sensor_azimuth:sensor_zenith:solar_azimuth:solar_zenith:" + // "obs_per_view:view_time_offsets"); } + + // todo New 10:02pm Friday night + boolean showProgressMonitor = false; + if (getAllSpectra() == null && getAllSpectra().length == 0) { + showProgressMonitor = true; + } + if (!rasterToSpectraMap.containsKey(currentView.getRaster())) { + showProgressMonitor = true; setUpSpectra(); } - recreateChart(); + + recreateChart(showProgressMonitor); } updateUIState(); @@ -345,11 +359,20 @@ void setPrepareForUpdateMessage() { chartHandler.setCollectingSpectralInformationMessage(); } + void updateData(int pixelX, int pixelY, int level, boolean pixelPosInRasterBounds) { + updateData(pixelX, pixelY, level, pixelPosInRasterBounds, null,0); + } + + void updateData(int pixelX, int pixelY, int level, boolean pixelPosInRasterBounds, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { chartHandler.setPosition(pixelX, pixelY, level, pixelPosInRasterBounds); - chartHandler.updateData(null); + chartHandler.updateData(pm, totalWorkPlanned); } + + + + void updateChart(boolean adjustAxes) { chartHandler.setAutomaticRangeAdjustments(adjustAxes); updateChart(); @@ -436,13 +459,33 @@ public void pointDeselected() { filterButton.setName("filterButton"); filterButton.setEnabled(false); filterButton.addActionListener(e -> { + + final ProductSceneView selectedProductSceneView = getSelectedProductSceneView(); + if (selectedProductSceneView != null) { + selectedProductSceneView.addPixelPositionListener(pixelPositionListener); + setCurrentView(selectedProductSceneView); + } + + updateChart(true); + + System.out.println("Listening to filterButton"); + selectSpectralBands(); recreateChart(); }); showSpectrumForCursorButton = ToolButtonFactory.createButton( UIUtils.loadImageIcon("icons/CursorSpectrum24.gif"), true); - showSpectrumForCursorButton.addActionListener(e -> recreateChart()); + showSpectrumForCursorButton.addActionListener(e -> { + if (showSpectrumForCursorButton.isSelected()) { + System.out.println("Listening to showSpectrumForCursorButton - true"); + runProgressMonitorForCursor(); +// recreateChart(true); + } else { + System.out.println("Listening to showSpectrumForCursorButton - false"); + recreateChart(); + } + }); showSpectrumForCursorButton.setName("showSpectrumForCursorButton"); showSpectrumForCursorButton.setSelected(false); showSpectrumForCursorButton.setToolTipText("Show spectrum at cursor position."); @@ -455,7 +498,13 @@ public void pointDeselected() { } else if (!isShowingSpectraForSelectedPins()) { plotMarker.setInvisible(); } - recreateChart(); + if (showSpectraForSelectedPinsButton.isSelected()) { + System.out.println("Listening to showSpectraForSelectedPinsButton - true"); + recreateChart(true); + } else { + System.out.println("Listening to showSpectraForSelectedPinsButton -false"); + recreateChart(); + } }); showSpectraForSelectedPinsButton.setName("showSpectraForSelectedPinsButton"); showSpectraForSelectedPinsButton.setToolTipText("Show spectra for selected pins."); @@ -468,7 +517,13 @@ public void pointDeselected() { } else if (!isShowingSpectraForAllPins()) { plotMarker.setInvisible(); } - recreateChart(); + if (showSpectraForAllPinsButton.isSelected()) { + System.out.println("Listening to showSpectraForAllPinsButton - true"); + recreateChart(true); + } else { + System.out.println("Listening to showSpectraForAllPinsButton - false"); + recreateChart(); + } }); showSpectraForAllPinsButton.setName("showSpectraForAllPinsButton"); showSpectraForAllPinsButton.setToolTipText("Show spectra for all pins."); @@ -497,6 +552,7 @@ public void pointDeselected() { gbc.gridy = 0; buttonPane.add(filterButton, gbc); gbc.gridy++; + // todo Removed cursor button due to freeze bugs buttonPane.add(showSpectrumForCursorButton, gbc); gbc.gridy++; buttonPane.add(showSpectraForSelectedPinsButton, gbc); @@ -591,49 +647,131 @@ private boolean isShowingSpectraForAllPins() { return showSpectraForAllPinsButton.isSelected(); } - private void recreateChart() { + private void recreateChart() { + System.out.println("INSIDE: recreateChart()"); + + recreateChart(false); + } + + + + + private void runProgressMonitorForCursor() { + System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 1"); + ProgressMonitorSwingWorker pmSwingWorker = new ProgressMonitorSwingWorker(SnapApp.getDefault().getMainFrame(), "Collecting Spectral Data") { @Override protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Exception { - pm.beginTask("Collecting spectral data: this can take several minutes on larger files", 3); - + int totalWorkPlanned = 100; + pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlanned); try { - chartHandler.updateData(pm); - if (pm.isCanceled()) { - showSpectraForAllPinsButton.setSelected(false); - showSpectrumForCursorButton.setSelected(false); - showSpectraForSelectedPinsButton.setSelected(false); - componentClosed(); - chartHandler.setEmptyPlot(); - chartHandler.removeCursorSpectraFromDataset(); + System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 2"); + + updateData(0, 0, 0, true, pm, (totalWorkPlanned - 10)); + chartHandler.setEmptyPlot(); + + if (pm != null && pm.isCanceled()) { pm.done(); + return null; } - pm.worked(1); - chartHandler.updateChart(); - pm.worked(1); - chartPanel.repaint(); - pm.worked(1); - updateUIState(); + + chartPanel.repaint(); + + updateUIState(); + System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 3"); + } finally { - if (pm.isCanceled()) { - showSpectraForAllPinsButton.setSelected(false); - showSpectrumForCursorButton.setSelected(false); - showSpectraForSelectedPinsButton.setSelected(false); - componentClosed(); - chartHandler.setEmptyPlot(); - chartHandler.removeCursorSpectraFromDataset(); + System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS Finally"); + + if (pm != null && pm.isCanceled()) { + return null; } pm.done(); - } + } + + System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS END"); + return null; } }; pmSwingWorker.executeWithBlocking(); + System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS END2"); + + } + + + private void recreateChart(boolean showProgress) { + System.out.println("INSIDE: recreateChart(boolean showProgress)"); + System.out.println("SnapApp.getDefault().getInstanceName() = " + SnapApp.getDefault().getInstanceName() ); + + if (showProgress) { + System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 1"); + + ProgressMonitorSwingWorker pmSwingWorker = new ProgressMonitorSwingWorker(SnapApp.getDefault().getMainFrame(), + "Collecting Spectral Data") { + + @Override + protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Exception { + + int totalWorkPlanned = 100; + pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlanned); + + + try { + System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 2"); + + chartHandler.updateData(pm,(totalWorkPlanned - 10)); + if (pm != null && pm.isCanceled()) { + pm.done(); + return null; + } + + chartHandler.updateChart(); + + updateChart(true); + if (pm != null) { + pm.worked(1); + } + chartPanel.repaint(); + if (pm != null) { + pm.worked(1); + } + updateUIState(); + System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 3"); + + } finally { + System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS Finally"); + + if (pm != null && pm.isCanceled()) { + return null; + } + pm.done(); + } + + System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS END"); + + return null; + } + }; + + pmSwingWorker.executeWithBlocking(); + System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS END2"); + + + } else { + System.out.println("INSIDE: recreateChart(boolean showProgress) - NO PROGRESS"); + + chartHandler.updateData(); + chartHandler.updateChart(); + chartPanel.repaint(); + updateUIState(); + System.out.println("INSIDE: recreateChart(boolean showProgress) - NO PROGRESS END"); + } } @@ -749,30 +887,71 @@ void removeCursorSpectraFromDataset() { @Override protected void productSceneViewSelected(ProductSceneView view) { - view.addPixelPositionListener(pixelPositionListener); - setCurrentView(view); + if (spectrumViewToolIsOpen) { + /// todo 10:35pm Friday + showSpectraForAllPinsButton.setSelected(false); + showSpectrumForCursorButton.setSelected(false); + showSpectraForSelectedPinsButton.setSelected(false); + + System.out.println("Listening: productSceneViewSelected"); + view.addPixelPositionListener(pixelPositionListener); + setCurrentView(view); + updateChart(true); + + } } @Override protected void productSceneViewDeselected(ProductSceneView view) { - view.removePixelPositionListener(pixelPositionListener); - setCurrentView(null); + if (spectrumViewToolIsOpen) { + /// todo 10:35pm Friday + showSpectraForAllPinsButton.setSelected(false); + showSpectrumForCursorButton.setSelected(false); + showSpectraForSelectedPinsButton.setSelected(false); + + System.out.println("Listening: productSceneViewDeselected"); + view.removePixelPositionListener(pixelPositionListener); + setCurrentView(null); + chartHandler.setEmptyPlot(); + } } @Override protected void componentOpened() { + System.out.println("Listening: componentOpened"); + spectrumViewToolIsOpen = true; + + /// todo 10:35pm Friday + showSpectraForAllPinsButton.setSelected(false); + showSpectrumForCursorButton.setSelected(false); + showSpectraForSelectedPinsButton.setSelected(false); + final ProductSceneView selectedProductSceneView = getSelectedProductSceneView(); if (selectedProductSceneView != null) { + + selectedProductSceneView.addPixelPositionListener(pixelPositionListener); setCurrentView(selectedProductSceneView); + updateChart(true); } } @Override protected void componentClosed() { + System.out.println("Listening: componentClosed"); + spectrumViewToolIsOpen = false; + + showSpectraForAllPinsButton.setSelected(false); + showSpectrumForCursorButton.setSelected(false); + showSpectraForSelectedPinsButton.setSelected(false); + if (currentView != null) { currentView.removePixelPositionListener(pixelPositionListener); + setCurrentView(null); } + + chartHandler.setEmptyPlot(); + removeCursorSpectraFromDataset(); } public boolean showsValidCursorSpectra() { @@ -868,11 +1047,17 @@ private void updateChart() { chart.getXYPlot().clearAnnotations(); } - private void updateData(com.bc.ceres.core.ProgressMonitor pm) { + + private void updateData() { + updateData(null, 0); + } + private void updateData(com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { List spectra = getSelectedSpectra(); - chartUpdater.updateData(chart, spectra, pm); + chartUpdater.updateData(chart, spectra, pm, totalWorkPlanned); } + + private void setEmptyPlot() { chart.getXYPlot().setDataset(null); if (getCurrentProduct() == null) { @@ -959,14 +1144,23 @@ private void setPosition(int pixelX, int pixelY, int level, boolean pixelPosInRa modelP = i2m.transform(new Point2D.Double(pixelX + 0.5, pixelY + 0.5), new Point2D.Double()); } - private void updateData(JFreeChart chart, List spectra, com.bc.ceres.core.ProgressMonitor pm) { + private void updateData(JFreeChart chart, List spectra, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { dataset = new XYSeriesCollection(); if (rasterLevel >= 0) { - fillDatasetWithPinSeries(spectra, dataset, chart, pm); - if (pm.isCanceled()) { + + if (getDisplayedPins().length > 0 && isShowingCursorSpectrum()) { + totalWorkPlanned = totalWorkPlanned/2; + } + + System.out.println("totalWorkPlanned=" + totalWorkPlanned); + + fillDatasetWithPinSeries(spectra, dataset, chart, pm, totalWorkPlanned); + System.out.println("Finish fillDatasetWithPinSeries"); + + if (pm != null && pm.isCanceled()) { return; } - fillDatasetWithCursorSeries(spectra, dataset, chart, pm); + fillDatasetWithCursorSeries(spectra, dataset, chart, pm, totalWorkPlanned); } } @@ -1034,18 +1228,28 @@ private Range getNewPlotBounds(Range bounds) { bounds.getUpperBound() + delta); } - private void fillDatasetWithCursorSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm) { + private void fillDatasetWithCursorSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { showsValidCursorSpectra = false; if (modelP == null) { return; } if (isShowingCursorSpectrum() && currentView != null) { + int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned / spectra.size()); + int workDone = 0; + for (DisplayableSpectrum spectrum : spectra) { XYSeries series = new XYSeries(spectrum.getName()); final Band[] spectralBands = spectrum.getSelectedBands(); + + int numBands = spectralBands.length; + double incrementLengthNumBands = (totalWorkPlannedPerSpectra > 0) ? numBands / totalWorkPlannedPerSpectra : numBands; + double nextIncrementFinishedBandCount = incrementLengthNumBands; + int bandCount = 0; + if (!currentProduct.isMultiSize()) { + for (Band spectralBand : spectralBands) { - if (pm.isCanceled()) { + if (pm != null && pm.isCanceled()) { return; } final float wavelength = spectralBand.getSpectralWavelength(); @@ -1053,10 +1257,19 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe addToSeries(spectralBand, rasterPixelX, rasterPixelY, rasterLevel, series, wavelength); showsValidCursorSpectra = true; } + + bandCount++; + if (workDone < totalWorkPlanned && bandCount > nextIncrementFinishedBandCount) { + if (totalWorkPlanned != 0) { + if (pm != null) {pm.worked(1);} + } + nextIncrementFinishedBandCount += incrementLengthNumBands; + workDone++; + } } } else { for (Band spectralBand : spectralBands) { - if (pm.isCanceled()) { + if (pm != null && pm.isCanceled()) { return; } final float wavelength = spectralBand.getSpectralWavelength(); @@ -1080,13 +1293,22 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe showsValidCursorSpectra = true; } } + + bandCount++; + if (workDone < totalWorkPlanned && bandCount > nextIncrementFinishedBandCount) { + if (totalWorkPlanned != 0) { + if (pm != null) {pm.worked(1);} + } + nextIncrementFinishedBandCount += incrementLengthNumBands; + workDone++; + } } } - if (pm.isCanceled()) { + if (pm != null && pm.isCanceled()) { return; } updateRenderer(dataset.getSeriesCount(), Color.BLACK, spectrum, chart); - if (pm.isCanceled()) { + if (pm != null && pm.isCanceled()) { return; } dataset.addSeries(series); @@ -1107,22 +1329,32 @@ private boolean coordinatesAreInRasterBounds(RasterDataNode raster, int x, int y return x >= 0 && y >= 0 && x < levelImage.getWidth() && y < levelImage.getHeight(); } - private void fillDatasetWithPinSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm) { + private void fillDatasetWithPinSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { Placemark[] pins = getDisplayedPins(); + + totalWorkPlanned = (int) Math.floor(1.0 * totalWorkPlanned / pins.length); + System.out.println("Number of pins =" + pins.length); + System.out.println("(For each pin) totalWorkPlanned=" + totalWorkPlanned); + for (Placemark pin : pins) { - List pinSeries = createXYSeriesFromPin(pin, dataset.getSeriesCount(), spectra, chart, pm); - if (pm.isCanceled()) { + List pinSeries = createXYSeriesFromPin(pin, dataset.getSeriesCount(), spectra, chart, pm, totalWorkPlanned); + if (pm != null && pm.isCanceled()) { return; } pinSeries.forEach(dataset::addSeries); } } - private List createXYSeriesFromPin(Placemark pin, int seriesIndex, List spectra, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm) { + private List createXYSeriesFromPin(Placemark pin, int seriesIndex, List spectra, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { List pinSeries = new ArrayList<>(); Color pinColor = PlacemarkUtils.getPlacemarkColor(pin, currentView); + + int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned / spectra.size()); + int workDone = 0; + System.out.println("totalWorkPlannedPerSpectra=" + totalWorkPlannedPerSpectra); + for (DisplayableSpectrum spectrum : spectra) { - if (pm.isCanceled()) { + if (pm != null && pm.isCanceled()) { return null; } XYSeries series = new XYSeries(spectrum.getName() + "_" + pin.getLabel()); @@ -1134,8 +1366,15 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis bandToEnergy = new HashMap<>(); pinToEnergies.put(pin, bandToEnergy); } + + int numBands = spectralBands.length; + double incrementLengthNumBands = (totalWorkPlannedPerSpectra > 0) ? numBands / totalWorkPlannedPerSpectra : numBands; + System.out.println("incrementLengthNumBands=" + incrementLengthNumBands); + double nextIncrementFinishedBandCount = incrementLengthNumBands; + int bandCount = 0; + for (Band spectralBand : spectralBands) { - if (pm.isCanceled()) { + if (pm != null && pm.isCanceled()) { return null; } double energy; @@ -1150,13 +1389,21 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis series.add(wavelength, energy); } + bandCount++; + if (workDone < totalWorkPlanned && bandCount > nextIncrementFinishedBandCount) { + if (totalWorkPlanned != 0) { + if (pm != null) {pm.worked(1);} + } + nextIncrementFinishedBandCount += incrementLengthNumBands; + workDone++; + } } - if (pm.isCanceled()) { + if (pm != null && pm.isCanceled()) { return null; } updateRenderer(seriesIndex++, pinColor, spectrum, chart); - if (pm.isCanceled()) { + if (pm != null && pm.isCanceled()) { return null; } pinSeries.add(series); From e03b105b8c67a8c9b9a7771a05aa5ab39ec80ea9 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Thu, 4 Apr 2024 07:38:25 -0400 Subject: [PATCH 09/13] Spectrum View: added preferences and plot range setting fields. Slight modifications to help with cancel commands. Also commented out debug messages --- .../general/SpectrumViewController.java | 515 ++++++++++++++++++ .../rcp/spectrum/SpectrumTopComponent.java | 484 +++++++++++++--- 2 files changed, 931 insertions(+), 68 deletions(-) create mode 100644 snap-rcp/src/main/java/org/esa/snap/rcp/preferences/general/SpectrumViewController.java diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/preferences/general/SpectrumViewController.java b/snap-rcp/src/main/java/org/esa/snap/rcp/preferences/general/SpectrumViewController.java new file mode 100644 index 0000000000..dd75666ad5 --- /dev/null +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/preferences/general/SpectrumViewController.java @@ -0,0 +1,515 @@ +/* + * Copyright (C) 2011 Brockmann Consult GmbH (info@brockmann-consult.de) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) + * any later version. + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see http://www.gnu.org/licenses/ + */ + +package org.esa.snap.rcp.preferences.general; + +import com.bc.ceres.binding.Property; +import com.bc.ceres.binding.PropertyDescriptor; +import com.bc.ceres.binding.PropertySet; +import com.bc.ceres.binding.ValidationException; +import com.bc.ceres.swing.TableLayout; +import com.bc.ceres.swing.binding.BindingContext; +import com.bc.ceres.swing.binding.Enablement; +import com.bc.ceres.swing.binding.PropertyEditorRegistry; +import com.bc.ceres.swing.binding.PropertyPane; +import org.checkerframework.checker.units.qual.C; +import org.esa.snap.core.util.PropertyMap; +import org.esa.snap.core.util.StringUtils; +import org.esa.snap.rcp.SnapApp; +import org.esa.snap.rcp.preferences.DefaultConfigController; +import org.esa.snap.rcp.preferences.Preference; +import org.esa.snap.rcp.statistics.StatisticsTopComponent; +import org.netbeans.spi.options.OptionsPanelController; +import org.openide.util.HelpCtx; + +import javax.swing.*; +import java.awt.*; + +/** + * Panel handling general preferences for Spectrum View. + * + * @author Daniel Knowles (NASA) + */ +@org.openide.util.NbBundle.Messages({ + "Options_DisplayName_SpectrumView=" + "Spectrum View", + "Options_Keywords_SpectrumView=Spectrum View, general" +}) +@OptionsPanelController.SubRegistration(location = "GeneralPreferences", + displayName = "#Options_DisplayName_SpectrumView", + keywords = "#Options_Keywords_SpectrumView", + keywordsCategory = "Spectrum, spectral", + id = "spectrumViewController", + position = 10) + + +public final class SpectrumViewController extends DefaultConfigController { + + + Property restoreDefaults; + + boolean propertyValueChangeEventsEnabled = true; + + private static final String PROPERTY_ROOT_KEY = "spectrum.view"; + + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_KEY = PROPERTY_ROOT_KEY + ".xaxis.set.bounds"; + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_LABEL = "Set Bounds X-Axis"; + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_TOOLTIP = "Sets bounds of x-axis (uses X-Axis Min and X-Axis Max)"; + public static boolean PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_DEFAULT = false; + + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_KEY = PROPERTY_ROOT_KEY + ".xaxis.min"; + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_LABEL = "X-Axis Min"; + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_TOOLTIP = "Sets minimum bound of x-axis (blank entry uses auto-bounding to data)"; + public static String PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_DEFAULT = ""; + + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_KEY = PROPERTY_ROOT_KEY + ".xaxis.max"; + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_LABEL = "X-Axis Max"; + public static final String PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_TOOLTIP = "Sets maximum bound of x-axis (blank entry uses auto-bounding to data)"; + public static String PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_DEFAULT = ""; + + + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_KEY = PROPERTY_ROOT_KEY + ".yaxis.set.bounds"; + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_LABEL = "Set Bounds Y-Axis"; + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_TOOLTIP = "Sets bounds of y-axis (uses Y-Axis Min and Y-Axis Max)"; + public static boolean PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_DEFAULT = false; + + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_KEY = PROPERTY_ROOT_KEY + ".yaxis.min"; + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_LABEL = "Y-Axis Min"; + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_TOOLTIP = "Sets minimum bound of x-axis (blank entry uses auto-bounding to data)"; + public static String PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_DEFAULT = ""; + + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_KEY = PROPERTY_ROOT_KEY + ".yaxis.max"; + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_LABEL = "Y-Axis Max"; + public static final String PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_TOOLTIP = "Sets maximum bound of x-axis (blank entry uses auto-bounding to data)"; + public static String PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_DEFAULT = ""; + + public static final String PROPERTY_SPECTRUM_VIEW_TITLE_KEY = PROPERTY_ROOT_KEY + ".plot.title"; + public static final String PROPERTY_SPECTRUM_VIEW_TITLE_LABEL = "Plot Title"; + public static final String PROPERTY_SPECTRUM_VIEW_TITLE_TOOLTIP = "Sets title of plot"; + public static String PROPERTY_SPECTRUM_VIEW_TITLE_DEFAULT = "Spectrum Plot"; + + +// public static final String PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_KEY = PROPERTY_ROOT_KEY + ".foreground.color"; +// public static final String PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_LABEL = "Foreground Color"; +// public static final String PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_TOOLTIP = "Sets foreground color of the plot"; + public static Color PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_DEFAULT = Color.BLACK; + + public static final String PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_KEY = PROPERTY_ROOT_KEY + "plot.background.color"; + public static final String PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_LABEL = "Plot Background Color"; + public static final String PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_TOOLTIP = "Sets background color of the plot"; + public static Color PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_DEFAULT = Color.WHITE; + +// public static final String PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_KEY = PROPERTY_ROOT_KEY + ".margin.background.color"; +// public static final String PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_LABEL = "Margin Background Color"; +// public static final String PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_TOOLTIP = "Sets background color of the margin"; + public static Color PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_DEFAULT = Color.WHITE; + +// public static final String PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_KEY = PROPERTY_ROOT_KEY + ".legend.background.color"; +// public static final String PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_LABEL = "Legend Background Color"; +// public static final String PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_TOOLTIP = "Sets background color of the legend"; + public static Color PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_DEFAULT = Color.WHITE; + + + public static final String PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_KEY = PROPERTY_ROOT_KEY + ".gridlines.color"; + public static final String PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_LABEL = "Plot Gridlines Color"; + public static final String PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_TOOLTIP = "Sets color of the plot gridlines"; + public static Color PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_DEFAULT = Color.LIGHT_GRAY; + + public static final String PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_KEY = PROPERTY_ROOT_KEY + ".gridlines.show"; + public static final String PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_LABEL = "Show Gridlines"; + public static final String PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_TOOLTIP = "show plot gridlines"; + public static boolean PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_DEFAULT = true; + + // Restore to defaults + + + private static final String PROPERTY_RESTORE_KEY_SUFFIX = PROPERTY_ROOT_KEY + ".restore.defaults"; + + public static final String PROPERTY_RESTORE_SECTION_KEY = PROPERTY_RESTORE_KEY_SUFFIX + ".section"; + public static final String PROPERTY_RESTORE_SECTION_LABEL = "Restore"; + public static final String PROPERTY_RESTORE_SECTION_TOOLTIP = "Restores preferences to the package defaults"; + + public static final String PROPERTY_RESTORE_DEFAULTS_NAME = PROPERTY_RESTORE_KEY_SUFFIX + ".apply"; + public static final String PROPERTY_RESTORE_DEFAULTS_LABEL = "Restore Defaults (Spectrum View Preferences)"; + public static final String PROPERTY_RESTORE_DEFAULTS_TOOLTIP = "Restore all RGB Image preferences to the original default"; + public static final boolean PROPERTY_RESTORE_DEFAULTS_DEFAULT = false; + + + + + protected PropertySet createPropertySet() { + return createPropertySet(new GeneralLayerBean()); + } + + + @Override + public HelpCtx getHelpCtx() { + return new HelpCtx("colorManipulationPreferences"); + } + + @Override + protected JPanel createPanel(BindingContext context) { + + + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_KEY, PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_DEFAULT); + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_KEY, PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_DEFAULT); + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_KEY, PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_DEFAULT); + + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_KEY, PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_DEFAULT); + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_KEY, PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_DEFAULT); + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_KEY, PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_DEFAULT); + + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_TITLE_KEY, PROPERTY_SPECTRUM_VIEW_TITLE_DEFAULT); + +// initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_DEFAULT); + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_DEFAULT); +// initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_DEFAULT); +// initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_DEFAULT); + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_DEFAULT); + initPropertyDefaults(context, PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_KEY, PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_DEFAULT); + + + restoreDefaults = initPropertyDefaults(context, PROPERTY_RESTORE_DEFAULTS_NAME, PROPERTY_RESTORE_DEFAULTS_DEFAULT); + + + + + // + // Create UI + // + + TableLayout tableLayout = new TableLayout(2); + tableLayout.setTableAnchor(TableLayout.Anchor.NORTHWEST); + tableLayout.setTablePadding(new Insets(4, 10, 0, 0)); + tableLayout.setTableFill(TableLayout.Fill.BOTH); + tableLayout.setColumnWeightX(1, 1.0); + + JPanel pageUI = new JPanel(tableLayout); + + PropertyEditorRegistry registry = PropertyEditorRegistry.getInstance(); + + PropertySet propertyContainer = context.getPropertySet(); + Property[] properties = propertyContainer.getProperties(); + + int currRow = 0; + for (Property property : properties) { + PropertyDescriptor descriptor = property.getDescriptor(); + PropertyPane.addComponent(currRow, tableLayout, pageUI, context, registry, descriptor); + currRow++; + } + + pageUI.add(tableLayout.createVerticalSpacer()); + + JPanel parent = new JPanel(new BorderLayout()); + parent.add(pageUI, BorderLayout.CENTER); + parent.add(Box.createHorizontalStrut(50), BorderLayout.EAST); + return parent; + } + + + + @Override + protected void configure(BindingContext context) { + + // Handle resetDefaults events - set all other components to defaults + restoreDefaults.addPropertyChangeListener(evt -> { + handleRestoreDefaults(context); + }); + + + + // Add listeners to all components in order to uncheck restoreDefaults checkbox accordingly + + PropertySet propertyContainer = context.getPropertySet(); + Property[] properties = propertyContainer.getProperties(); + + for (Property property : properties) { + if (property != restoreDefaults) { + property.addPropertyChangeListener(evt -> { + handlePreferencesPropertyValueChange(context); + }); + } + } + } + + + + + + + /** + * Test all properties to determine whether the current value is the default value + * + * @param context + * @return + * @author Daniel Knowles + */ + private boolean isDefaults(BindingContext context) { + + PropertySet propertyContainer = context.getPropertySet(); + Property[] properties = propertyContainer.getProperties(); + + for (Property property : properties) { + if (property != restoreDefaults && property.getDescriptor().getDefaultValue() != null) + if (!property.getValue().equals(property.getDescriptor().getDefaultValue())) { + return false; + } + } + + return true; + } + + + /** + * Handles the restore defaults action + * + * @param context + * @author Daniel Knowles + */ + private void handleRestoreDefaults(BindingContext context) { + if (propertyValueChangeEventsEnabled) { + propertyValueChangeEventsEnabled = false; + try { + if (restoreDefaults.getValue()) { + + PropertySet propertyContainer = context.getPropertySet(); + Property[] properties = propertyContainer.getProperties(); + + for (Property property : properties) { + if (property != restoreDefaults && property.getDescriptor().getDefaultValue() != null) + property.setValue(property.getDescriptor().getDefaultValue()); + } + } + } catch (ValidationException e) { + e.printStackTrace(); + } + propertyValueChangeEventsEnabled = true; + + context.setComponentsEnabled(PROPERTY_RESTORE_DEFAULTS_NAME, false); + } + } + + + + + + + + /** + * Set restoreDefault component because a property has changed + * @param context + * @author Daniel Knowles + */ + private void handlePreferencesPropertyValueChange(BindingContext context) { + if (propertyValueChangeEventsEnabled) { + propertyValueChangeEventsEnabled = false; + try { + restoreDefaults.setValue(isDefaults(context)); + context.setComponentsEnabled(PROPERTY_RESTORE_DEFAULTS_NAME, !isDefaults(context)); + } catch (ValidationException e) { + e.printStackTrace(); + } + propertyValueChangeEventsEnabled = true; + } + } + + + /** + * Initialize the property descriptor default value + * + * @param context + * @param propertyName + * @param propertyDefault + * @return + * @author Daniel Knowles + */ + private Property initPropertyDefaults(BindingContext context, String propertyName, Object propertyDefault) { + + Property property = context.getPropertySet().getProperty(propertyName); + + property.getDescriptor().setDefaultValue(propertyDefault); + + return property; + } + + + + + + + + + + + @SuppressWarnings("UnusedDeclaration") + static class GeneralLayerBean { + + @Preference(label = PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_LABEL, + key = PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_KEY, + description = PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_TOOLTIP) + boolean spectrumViewXaxisSetBoundsDefault = PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_DEFAULT; + + @Preference(label = PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_LABEL, + key = PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_KEY, + description = PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_TOOLTIP) + String spectrumViewXaxisMinDefault = PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_DEFAULT; + + @Preference(label = PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_LABEL, + key = PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_KEY, + description = PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_TOOLTIP) + String spectrumViewXaxisMaxDefault = PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_DEFAULT; + + @Preference(label = PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_LABEL, + key = PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_KEY, + description = PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_TOOLTIP) + boolean spectrumViewYaxisSetBoundsDefault = PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_DEFAULT; + + @Preference(label = PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_LABEL, + key = PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_KEY, + description = PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_TOOLTIP) + String spectrumViewYaxisMinDefault = PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_DEFAULT; + + @Preference(label = PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_LABEL, + key = PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_KEY, + description = PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_TOOLTIP) + String spectrumViewYaxisMaxDefault = PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_DEFAULT; + + @Preference(label = PROPERTY_SPECTRUM_VIEW_TITLE_LABEL, + key = PROPERTY_SPECTRUM_VIEW_TITLE_KEY, + description = PROPERTY_SPECTRUM_VIEW_TITLE_TOOLTIP) + String spectrumViewTitleDefault = PROPERTY_SPECTRUM_VIEW_TITLE_DEFAULT; + + +// @Preference(label = PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_LABEL, +// key = PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_KEY, +// description = PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_TOOLTIP) +// Color spectrumViewForegroundColorDefault = PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_DEFAULT; + + @Preference(label = PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_LABEL, + key = PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_KEY, + description = PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_TOOLTIP) + Color spectrumViewBackgroundColorDefault = PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_DEFAULT; + +// @Preference(label = PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_LABEL, +// key = PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_KEY, +// description = PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_TOOLTIP) +// Color spectrumViewMarginBackgroundColorDefault = PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_DEFAULT; +// +// @Preference(label = PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_LABEL, +// key = PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_KEY, +// description = PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_TOOLTIP) +// Color spectrumViewLegendBackgroundColorDefault = PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_DEFAULT; + + @Preference(label = PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_LABEL, + key = PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_KEY, + description = PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_TOOLTIP) + Color spectrumViewGridlineColorDefault = PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_DEFAULT; + + + @Preference(label = PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_LABEL, + key = PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_KEY, + description = PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_TOOLTIP) + boolean spectrumViewGridlineShowDefault = PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_DEFAULT; + + + + + + // Restore Defaults + + @Preference(label = PROPERTY_RESTORE_SECTION_LABEL, + key = PROPERTY_RESTORE_SECTION_KEY, + description = PROPERTY_RESTORE_SECTION_TOOLTIP) + boolean restoreDefaultsSection = true; + + @Preference(label = PROPERTY_RESTORE_DEFAULTS_LABEL, + key = PROPERTY_RESTORE_DEFAULTS_NAME, + description = PROPERTY_RESTORE_DEFAULTS_TOOLTIP) + boolean restoreDefaults = PROPERTY_RESTORE_DEFAULTS_DEFAULT; + } + + + + public static boolean getPreferenceXaxisSetBounds() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyBool(PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_KEY, PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_DEFAULT); + } + + public static String getPreferenceXaxisMin() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyString(PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_KEY, PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_DEFAULT); + } + + public static String getPreferenceXaxisMax() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyString(PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_KEY, PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_DEFAULT); + } + + + public static boolean getPreferenceYaxisSetBounds() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyBool(PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_KEY, PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_DEFAULT); + } + + public static String getPreferenceYaxisMin() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyString(PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_KEY, PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_DEFAULT); + } + + public static String getPreferenceYaxisMax() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyString(PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_KEY, PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_DEFAULT); + } + + + public static String getPreferenceTitle() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyString(PROPERTY_SPECTRUM_VIEW_TITLE_KEY, PROPERTY_SPECTRUM_VIEW_TITLE_DEFAULT); + } + + + +// public static Color getPreferenceForegroundColor() { +// final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); +// return preferences.getPropertyColor(PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_DEFAULT); +// } + + public static Color getPreferenceBackgroundColor() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyColor(PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_BACKGROUND_COLOR_DEFAULT); + } + +// public static Color getPreferenceMarginBackgroundColor() { +// final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); +// return preferences.getPropertyColor(PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_DEFAULT); +// } +// +// public static Color getPreferenceLegendBackgroundColor() { +// final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); +// return preferences.getPropertyColor(PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_DEFAULT); +// } + + + + public static Color getPreferenceGridlinesColor() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyColor(PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_KEY, PROPERTY_SPECTRUM_VIEW_GRIDLINE_COLOR_DEFAULT); + } + + public static boolean getPreferenceGridlinesShow() { + final PropertyMap preferences = SnapApp.getDefault().getAppContext().getPreferences(); + return preferences.getPropertyBool(PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_KEY, PROPERTY_SPECTRUM_VIEW_GRIDLINE_SHOW_DEFAULT); + } +} diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 074ec56f97..02c200793b 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -26,6 +26,7 @@ import org.esa.snap.rcp.SnapApp; import org.esa.snap.rcp.actions.help.HelpAction; import org.esa.snap.rcp.placemark.PlacemarkUtils; +import org.esa.snap.rcp.preferences.general.SpectrumViewController; import org.esa.snap.rcp.statistics.XYPlotMarker; import org.esa.snap.rcp.util.Dialogs; import org.esa.snap.rcp.windows.ToolTopComponent; @@ -111,8 +112,29 @@ public class SpectrumTopComponent extends ToolTopComponent { private AbstractButton showSpectraForAllPinsButton; private AbstractButton showGridButton; + private JCheckBox rangeXCheckBox; + private JTextField rangeXLowerTextField; + private JLabel rangeXLowerLabel; + private JTextField rangeXUpperTextField; + private JLabel rangeXUpperLabel; + + private JCheckBox rangeYCheckBox; + private JTextField rangeYLowerTextField; + private JLabel rangeYLowerLabel; + private JTextField rangeYUpperTextField; + private JLabel rangeYUpperLabel; + + private boolean useRangeX; + private double rangeXLower; + private double rangeXUpper; + + private boolean useRangeY; + private double rangeYLower; + private double rangeYUpper; + private boolean tipShown; private boolean spectrumViewToolIsOpen; + private boolean loadingPreferences; private ProductSceneView currentView; private Product currentProduct; private ChartPanel chartPanel; @@ -124,7 +146,7 @@ public class SpectrumTopComponent extends ToolTopComponent { private boolean isUserInducedAutomaticAdjustmentChosen; public SpectrumTopComponent() { - System.out.println("Spectrum View Tool is Open"); + // System.out.println("Spectrum View Tool is Open"); spectrumViewToolIsOpen = false; tipShown = true; @@ -283,6 +305,7 @@ private void setCurrentView(ProductSceneView view) { "sensor_azimuth:sensor_azimuth_angle:sensor_zenith:sensor_zenith_angle:" + "solar_azimuth:solar_azimuth_angle:solar_zenith:solar_zenith_angle:" + "obs_per_view:view_time_offsets:number_of_observations"; + currentProduct.setAutoGrouping(autoGroupingStr); // currentProduct.setAutoGrouping("I:I_58_*:I_22_*:I_4_*:I_-22_*:I_-58_*:" + // "AOLP:AOLP_58_*:AOLP_22_*:AOLP_4_*:AOLP_-22_*:AOLP_-58_*:" + @@ -301,7 +324,6 @@ private void setCurrentView(ProductSceneView view) { // "obs_per_view:view_time_offsets"); } - // todo New 10:02pm Friday night boolean showProgressMonitor = false; if (getAllSpectra() == null && getAllSpectra().length == 0) { showProgressMonitor = true; @@ -374,14 +396,18 @@ void updateData(int pixelX, int pixelY, int level, boolean pixelPosInRasterBound void updateChart(boolean adjustAxes) { +// if (!loadingPreferences) { chartHandler.setAutomaticRangeAdjustments(adjustAxes); updateChart(); +// } } void updateChart() { +// if (!loadingPreferences) { maybeShowTip(); chartHandler.updateChart(); chartPanel.repaint(); +// } } private void maybeShowTip() { @@ -441,8 +467,96 @@ private void initUI() { rangeAxisAdjustmentIsFrozen = false; chart.getXYPlot().getDomainAxis().setAutoRange(false); domainAxisAdjustmentIsFrozen = false; + + + + + rangeXCheckBox = new JCheckBox(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_LABEL); + + rangeXLowerLabel = new JLabel(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_LABEL); + rangeXLowerTextField = new JTextField("1234567890"); + rangeXLowerTextField.setMinimumSize(rangeXLowerTextField.getPreferredSize()); + rangeXLowerTextField.setPreferredSize(rangeXLowerTextField.getPreferredSize()); + + rangeXUpperLabel = new JLabel(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_LABEL); + rangeXUpperTextField = new JTextField("1234567890"); + rangeXUpperTextField.setMinimumSize(rangeXUpperTextField.getPreferredSize()); + rangeXUpperTextField.setPreferredSize(rangeXUpperTextField.getPreferredSize()); + rangeXUpperTextField.setText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_DEFAULT); + + + + rangeYCheckBox = new JCheckBox(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_LABEL); + + rangeYLowerLabel = new JLabel(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_LABEL); + rangeYLowerTextField = new JTextField("1234567890"); + rangeYLowerTextField.setMinimumSize(rangeYLowerTextField.getPreferredSize()); + rangeYLowerTextField.setPreferredSize(rangeYLowerTextField.getPreferredSize()); + + rangeYUpperLabel = new JLabel(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_LABEL); + rangeYUpperTextField = new JTextField("1234567890"); + rangeYUpperTextField.setMinimumSize(rangeYUpperTextField.getPreferredSize()); + rangeYUpperTextField.setPreferredSize(rangeYUpperTextField.getPreferredSize()); + rangeYUpperTextField.setText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_DEFAULT); + + + rangeXLowerTextField.addActionListener(e -> { + if (!loadingPreferences) { + updateChart(false); + } + }); + rangeXUpperTextField.addActionListener(e -> { + if (!loadingPreferences) { + updateChart(false); + } + }); + + rangeYLowerTextField.addActionListener(e -> { + if (!loadingPreferences) { + updateChart(false); + } + }); + rangeYUpperTextField.addActionListener(e -> { + if (!loadingPreferences) { + updateChart(false); + } + }); + + + rangeXCheckBox.addActionListener(e -> { + rangeXLowerLabel.setEnabled(rangeXCheckBox.isSelected()); + rangeXLowerTextField.setEnabled(rangeXCheckBox.isSelected()); + rangeXUpperLabel.setEnabled(rangeXCheckBox.isSelected()); + rangeXUpperTextField.setEnabled(rangeXCheckBox.isSelected()); + if (!loadingPreferences) { + if (rangeXCheckBox.isSelected()) { + updateChart(false); + } else { + updateChart(true); + } + } + }); + + rangeYCheckBox.addActionListener(e -> { + rangeYLowerLabel.setEnabled(rangeYCheckBox.isSelected()); + rangeYLowerTextField.setEnabled(rangeYCheckBox.isSelected()); + rangeYUpperLabel.setEnabled(rangeYCheckBox.isSelected()); + rangeYUpperTextField.setEnabled(rangeYCheckBox.isSelected()); + if (!loadingPreferences) { + if (rangeYCheckBox.isSelected()) { + updateChart(false); + } else { + updateChart(true); + } + } + }); + + + chartPanel = new ChartPanel(chart); chartHandler = new ChartHandler(chart); + + final XYPlotMarker plotMarker = new XYPlotMarker(chartPanel, new XYPlotMarker.Listener() { @Override public void pointSelected(XYDataset xyDataset, int seriesIndex, Point2D dataPoint) { @@ -468,7 +582,7 @@ public void pointDeselected() { updateChart(true); - System.out.println("Listening to filterButton"); + // System.out.println("Listening to filterButton"); selectSpectralBands(); recreateChart(); @@ -478,11 +592,10 @@ public void pointDeselected() { UIUtils.loadImageIcon("icons/CursorSpectrum24.gif"), true); showSpectrumForCursorButton.addActionListener(e -> { if (showSpectrumForCursorButton.isSelected()) { - System.out.println("Listening to showSpectrumForCursorButton - true"); + // System.out.println("Listening to showSpectrumForCursorButton - true"); runProgressMonitorForCursor(); -// recreateChart(true); } else { - System.out.println("Listening to showSpectrumForCursorButton - false"); + // System.out.println("Listening to showSpectrumForCursorButton - false"); recreateChart(); } }); @@ -499,14 +612,15 @@ public void pointDeselected() { plotMarker.setInvisible(); } if (showSpectraForSelectedPinsButton.isSelected()) { - System.out.println("Listening to showSpectraForSelectedPinsButton - true"); + // System.out.println("Listening to showSpectraForSelectedPinsButton - true"); recreateChart(true); } else { - System.out.println("Listening to showSpectraForSelectedPinsButton -false"); + // System.out.println("Listening to showSpectraForSelectedPinsButton -false"); recreateChart(); } }); showSpectraForSelectedPinsButton.setName("showSpectraForSelectedPinsButton"); + showSpectraForSelectedPinsButton.setSelected(false); showSpectraForSelectedPinsButton.setToolTipText("Show spectra for selected pins."); showSpectraForAllPinsButton = ToolButtonFactory.createButton(UIUtils.loadImageIcon("icons/PinSpectra24.gif"), @@ -518,21 +632,34 @@ public void pointDeselected() { plotMarker.setInvisible(); } if (showSpectraForAllPinsButton.isSelected()) { - System.out.println("Listening to showSpectraForAllPinsButton - true"); + // System.out.println("Listening to showSpectraForAllPinsButton - true"); recreateChart(true); } else { - System.out.println("Listening to showSpectraForAllPinsButton - false"); + // System.out.println("Listening to showSpectraForAllPinsButton - false"); recreateChart(); } }); showSpectraForAllPinsButton.setName("showSpectraForAllPinsButton"); + showSpectraForAllPinsButton.setSelected(false); showSpectraForAllPinsButton.setToolTipText("Show spectra for all pins."); showGridButton = ToolButtonFactory.createButton(UIUtils.loadImageIcon("icons/SpectrumGrid24.gif"), true); - showGridButton.addActionListener(e -> chartHandler.setGridVisible(showGridButton.isSelected())); + + showGridButton.addActionListener(e -> { + if (!loadingPreferences) { + chartHandler.setGridVisible(showGridButton.isSelected()); + } + }); showGridButton.setName("showGridButton"); showGridButton.setToolTipText("Show diagram grid."); + + + + + + + AbstractButton exportSpectraButton = ToolButtonFactory.createButton(UIUtils.loadImageIcon("icons/Export24.gif"), false); exportSpectraButton.addActionListener(new SpectraExportAction(this)); @@ -543,16 +670,19 @@ public void pointDeselected() { helpButton.setName("helpButton"); helpButton.setToolTipText("Help."); + loadPreferences(); + final JPanel buttonPane = GridBagUtils.createPanel(); final GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.CENTER; + gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.NONE; gbc.insets.top = 2; gbc.gridy = 0; + gbc.gridwidth = 2; buttonPane.add(filterButton, gbc); gbc.gridy++; - // todo Removed cursor button due to freeze bugs + buttonPane.add(showSpectrumForCursorButton, gbc); gbc.gridy++; buttonPane.add(showSpectraForSelectedPinsButton, gbc); @@ -560,19 +690,57 @@ public void pointDeselected() { buttonPane.add(showSpectraForAllPinsButton, gbc); gbc.gridy++; buttonPane.add(showGridButton, gbc); + + gbc.gridy++; - buttonPane.add(exportSpectraButton, gbc); + gbc.gridwidth = 2; + buttonPane.add(rangeXCheckBox, gbc); + + gbc.gridy++; + gbc.gridx=0; + gbc.gridwidth = 1; + buttonPane.add(rangeXLowerLabel, gbc); + gbc.gridx=1; + buttonPane.add(rangeXLowerTextField, gbc); + gbc.gridy++; + gbc.gridx=0; + buttonPane.add(rangeXUpperLabel, gbc); + gbc.gridx=1; + buttonPane.add(rangeXUpperTextField, gbc); + + gbc.gridy++; + gbc.gridx=0; + gbc.gridwidth = 2; + buttonPane.add(rangeYCheckBox, gbc); + + gbc.gridy++; + gbc.gridx=0; + gbc.gridwidth = 1; + buttonPane.add(rangeYLowerLabel, gbc); + gbc.gridx=1; + buttonPane.add(rangeYLowerTextField, gbc); + gbc.gridy++; + gbc.gridx=0; + buttonPane.add(rangeYUpperLabel, gbc); + gbc.gridx=1; + buttonPane.add(rangeYUpperTextField, gbc); + + + gbc.gridwidth = 2; + gbc.gridy++; + gbc.gridx=0; + buttonPane.add(exportSpectraButton, gbc); gbc.gridy++; gbc.insets.bottom = 0; gbc.fill = GridBagConstraints.VERTICAL; gbc.weighty = 1.0; gbc.gridwidth = 2; buttonPane.add(new JLabel(" "), gbc); // filler + gbc.gridy++; gbc.fill = GridBagConstraints.NONE; gbc.weighty = 0.0; - gbc.gridy = 10; - gbc.anchor = GridBagConstraints.EAST; + gbc.anchor = GridBagConstraints.SOUTHEAST; buttonPane.add(helpButton, gbc); chartPanel.setPreferredSize(new Dimension(300, 200)); @@ -625,6 +793,73 @@ public void productRemoved(ProductManager.Event event) { updateUIState(); } + private void loadPreferences() { + loadingPreferences = true; + + try { + chartHandler.chart.setTitle(SpectrumViewController.getPreferenceTitle()); + + rangeYCheckBox.setSelected(SpectrumViewController.getPreferenceYaxisSetBounds()); + rangeYLowerTextField.setText(SpectrumViewController.getPreferenceYaxisMin()); + rangeYUpperTextField.setText(SpectrumViewController.getPreferenceYaxisMax()); + + rangeXCheckBox.setSelected(SpectrumViewController.getPreferenceXaxisSetBounds()); + rangeXLowerTextField.setText(SpectrumViewController.getPreferenceXaxisMin()); + rangeXUpperTextField.setText(SpectrumViewController.getPreferenceXaxisMax()); + + + + Color gridlinesColor = SpectrumViewController.getPreferenceGridlinesColor(); + chartHandler.chart.getXYPlot().setDomainGridlinePaint(gridlinesColor); + chartHandler.chart.getXYPlot().setRangeGridlinePaint(gridlinesColor); + chartHandler.chart.getXYPlot().setDomainMinorGridlinePaint(gridlinesColor); + chartHandler.chart.getXYPlot().setRangeMinorGridlinePaint(gridlinesColor); + + + Color plotBackgroundColor = SpectrumViewController.getPreferenceBackgroundColor(); + chartHandler.chart.getPlot().setBackgroundPaint(plotBackgroundColor); + chartHandler.chart.getXYPlot().setBackgroundPaint(plotBackgroundColor); + + + Color foregroundColor = SpectrumViewController.PROPERTY_SPECTRUM_VIEW_FOREGROUND_COLOR_DEFAULT; + + chartHandler.chart.getXYPlot().getRangeAxis().setTickMarkPaint(foregroundColor); + chartHandler.chart.getXYPlot().getRangeAxis().setAxisLinePaint(foregroundColor); + chartHandler.chart.getXYPlot().getDomainAxis().setTickMarkPaint(foregroundColor); + chartHandler.chart.getXYPlot().getDomainAxis().setAxisLinePaint(foregroundColor); + chartHandler.chart.getTitle().setPaint(foregroundColor); + chartHandler.chart.getXYPlot().getDomainAxis().setLabelPaint(foregroundColor); + chartHandler.chart.getXYPlot().getRangeAxis().setLabelPaint(foregroundColor); + chartHandler.chart.getXYPlot().getDomainAxis().setTickLabelPaint(foregroundColor); + chartHandler.chart.getXYPlot().getRangeAxis().setTickLabelPaint(foregroundColor); + + + + Color marginBackgroundColor = SpectrumViewController.PROPERTY_SPECTRUM_VIEW_MARGIN_BACKGROUND_COLOR_DEFAULT; + chartHandler.chart.setBackgroundPaint(marginBackgroundColor); + + Color legendBackgroundColor = SpectrumViewController.PROPERTY_SPECTRUM_VIEW_LEGEND_BACKGROUND_COLOR_DEFAULT; + chartHandler.chart.getLegend().setBackgroundPaint(legendBackgroundColor); + + + chartHandler.setGridVisible(SpectrumViewController.getPreferenceGridlinesShow()); + showGridButton.setSelected(SpectrumViewController.getPreferenceGridlinesShow()); + + rangeXLowerLabel.setEnabled(rangeXCheckBox.isSelected()); + rangeXLowerTextField.setEnabled(rangeXCheckBox.isSelected()); + rangeXUpperLabel.setEnabled(rangeXCheckBox.isSelected()); + rangeXUpperTextField.setEnabled(rangeXCheckBox.isSelected()); + rangeYLowerLabel.setEnabled(rangeYCheckBox.isSelected()); + rangeYLowerTextField.setEnabled(rangeYCheckBox.isSelected()); + rangeYUpperLabel.setEnabled(rangeYCheckBox.isSelected()); + rangeYUpperTextField.setEnabled(rangeYCheckBox.isSelected()); + } catch (Exception e) { + } + loadingPreferences = false; + + + } + private void selectSpectralBands() { final RasterDataNode currentRaster = currentView.getRaster(); final DisplayableSpectrum[] allSpectra = rasterToSpectraMap.get(currentRaster); @@ -648,7 +883,7 @@ private boolean isShowingSpectraForAllPins() { } private void recreateChart() { - System.out.println("INSIDE: recreateChart()"); + // System.out.println("INSIDE: recreateChart()"); recreateChart(false); } @@ -657,7 +892,7 @@ private void recreateChart() { private void runProgressMonitorForCursor() { - System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 1"); + // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 1"); ProgressMonitorSwingWorker pmSwingWorker = new ProgressMonitorSwingWorker(SnapApp.getDefault().getMainFrame(), "Collecting Spectral Data") { @@ -669,12 +904,13 @@ protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Excep pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlanned); try { - System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 2"); + // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 2"); updateData(0, 0, 0, true, pm, (totalWorkPlanned - 10)); chartHandler.setEmptyPlot(); if (pm != null && pm.isCanceled()) { + cancelActions(); pm.done(); return null; } @@ -682,35 +918,36 @@ protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Excep chartPanel.repaint(); updateUIState(); - System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 3"); + // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 3"); } finally { - System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS Finally"); + // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS Finally"); if (pm != null && pm.isCanceled()) { + cancelActions(); return null; } pm.done(); } - System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS END"); + // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS END"); return null; } }; pmSwingWorker.executeWithBlocking(); - System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS END2"); + // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS END2"); } private void recreateChart(boolean showProgress) { - System.out.println("INSIDE: recreateChart(boolean showProgress)"); - System.out.println("SnapApp.getDefault().getInstanceName() = " + SnapApp.getDefault().getInstanceName() ); + // System.out.println("INSIDE: recreateChart(boolean showProgress)"); + // System.out.println("SnapApp.getDefault().getInstanceName() = " + SnapApp.getDefault().getInstanceName() ); if (showProgress) { - System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 1"); + // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 1"); ProgressMonitorSwingWorker pmSwingWorker = new ProgressMonitorSwingWorker(SnapApp.getDefault().getMainFrame(), "Collecting Spectral Data") { @@ -723,10 +960,11 @@ protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Excep try { - System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 2"); + // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 2"); chartHandler.updateData(pm,(totalWorkPlanned - 10)); if (pm != null && pm.isCanceled()) { + cancelActions(); pm.done(); return null; } @@ -742,35 +980,36 @@ protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Excep pm.worked(1); } updateUIState(); - System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 3"); + // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 3"); } finally { - System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS Finally"); + // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS Finally"); if (pm != null && pm.isCanceled()) { + cancelActions(); return null; } pm.done(); } - System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS END"); + // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS END"); return null; } }; pmSwingWorker.executeWithBlocking(); - System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS END2"); + // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS END2"); } else { - System.out.println("INSIDE: recreateChart(boolean showProgress) - NO PROGRESS"); + // System.out.println("INSIDE: recreateChart(boolean showProgress) - NO PROGRESS"); chartHandler.updateData(); chartHandler.updateChart(); chartPanel.repaint(); updateUIState(); - System.out.println("INSIDE: recreateChart(boolean showProgress) - NO PROGRESS END"); + // System.out.println("INSIDE: recreateChart(boolean showProgress) - NO PROGRESS END"); } } @@ -885,15 +1124,27 @@ void removeCursorSpectraFromDataset() { chartHandler.removeCursorSpectraFromDataset(); } + + protected void cancelActions() { + showSpectraForAllPinsButton.setSelected(false); + showSpectrumForCursorButton.setSelected(false); + showSpectraForSelectedPinsButton.setSelected(false); + + chartHandler.setEmptyPlot(); + removeCursorSpectraFromDataset(); + updateUIState(); + } + @Override protected void productSceneViewSelected(ProductSceneView view) { if (spectrumViewToolIsOpen) { - /// todo 10:35pm Friday showSpectraForAllPinsButton.setSelected(false); showSpectrumForCursorButton.setSelected(false); showSpectraForSelectedPinsButton.setSelected(false); + loadingPreferences = false; + - System.out.println("Listening: productSceneViewSelected"); + // System.out.println("Listening: productSceneViewSelected"); view.addPixelPositionListener(pixelPositionListener); setCurrentView(view); updateChart(true); @@ -901,15 +1152,17 @@ protected void productSceneViewSelected(ProductSceneView view) { } } + @Override protected void productSceneViewDeselected(ProductSceneView view) { if (spectrumViewToolIsOpen) { - /// todo 10:35pm Friday showSpectraForAllPinsButton.setSelected(false); showSpectrumForCursorButton.setSelected(false); showSpectraForSelectedPinsButton.setSelected(false); + loadingPreferences = false; + - System.out.println("Listening: productSceneViewDeselected"); + // System.out.println("Listening: productSceneViewDeselected"); view.removePixelPositionListener(pixelPositionListener); setCurrentView(null); chartHandler.setEmptyPlot(); @@ -918,10 +1171,10 @@ protected void productSceneViewDeselected(ProductSceneView view) { @Override protected void componentOpened() { - System.out.println("Listening: componentOpened"); + loadingPreferences = false; + // System.out.println("Listening: componentOpened"); spectrumViewToolIsOpen = true; - /// todo 10:35pm Friday showSpectraForAllPinsButton.setSelected(false); showSpectrumForCursorButton.setSelected(false); showSpectraForSelectedPinsButton.setSelected(false); @@ -932,14 +1185,20 @@ protected void componentOpened() { selectedProductSceneView.addPixelPositionListener(pixelPositionListener); setCurrentView(selectedProductSceneView); - updateChart(true); +// loadPreferences(); +// updateChart(true); } + + loadPreferences(); + updateChart(true); } @Override protected void componentClosed() { - System.out.println("Listening: componentClosed"); + // System.out.println("Listening: componentClosed"); spectrumViewToolIsOpen = false; + loadingPreferences = false; + showSpectraForAllPinsButton.setSelected(false); showSpectrumForCursorButton.setSelected(false); @@ -982,40 +1241,119 @@ private ChartHandler(JFreeChart chart) { private void setAutomaticRangeAdjustments(boolean userInducesAutomaticAdjustment) { final XYPlot plot = chart.getXYPlot(); boolean adjustmentHasChanged = false; - if (userInducesAutomaticAdjustment) { - if (!isUserInducedAutomaticAdjustmentChosen) { - isUserInducedAutomaticAdjustmentChosen = true; - if (!isAutomaticDomainAdjustmentSet()) { - plot.getDomainAxis().setAutoRange(true); - domainAxisAdjustmentIsFrozen = false; - adjustmentHasChanged = true; + + // todo this block gets overridden due to presence of min/max fields, keep it until it is decided whether code is still useful +// if (userInducesAutomaticAdjustment) { +// if (!isUserInducedAutomaticAdjustmentChosen) { +// isUserInducedAutomaticAdjustmentChosen = true; +// if (!isAutomaticDomainAdjustmentSet()) { +// plot.getDomainAxis().setAutoRange(true); +// domainAxisAdjustmentIsFrozen = false; +// adjustmentHasChanged = true; +// } +// if (!isAutomaticRangeAdjustmentSet()) { +// plot.getRangeAxis().setAutoRange(true); +// rangeAxisAdjustmentIsFrozen = false; +// adjustmentHasChanged = true; +// } +// } +// } else { +// if (isUserInducedAutomaticAdjustmentChosen) { +// isUserInducedAutomaticAdjustmentChosen = false; +// if (isAutomaticDomainAdjustmentSet()) { +// plot.getDomainAxis().setAutoRange(false); +// domainAxisAdjustmentIsFrozen = false; +// adjustmentHasChanged = true; +// } +// if (isAutomaticRangeAdjustmentSet()) { +// plot.getRangeAxis().setAutoRange(false); +// rangeAxisAdjustmentIsFrozen = false; +// adjustmentHasChanged = true; +// } +// } +// } + + + //todo this block overrides previous block + + domainAxisAdjustmentIsFrozen = false; + rangeAxisAdjustmentIsFrozen = false; + + if (rangeXCheckBox.isSelected()) { + try { + boolean validLower = false; + boolean validUpper = false; + if (rangeXLowerTextField.getText() != null && rangeXLowerTextField.getText().trim().length() > 0) { + rangeXLower = Double.parseDouble(rangeXLowerTextField.getText()); + validLower = true; } - if (!isAutomaticRangeAdjustmentSet()) { - plot.getRangeAxis().setAutoRange(true); - rangeAxisAdjustmentIsFrozen = false; - adjustmentHasChanged = true; + + if (rangeXUpperTextField.getText() != null && rangeXUpperTextField.getText().trim().length() > 0) { + rangeXUpper = Double.parseDouble(rangeXUpperTextField.getText()); + validUpper = true; } + + if (validLower && validUpper) { + plot.getDomainAxis().setRange(rangeXLower, rangeXUpper); + } else { + plot.getDomainAxis().setAutoRange(true); + if (validLower) { + plot.getDomainAxis().setLowerBound(rangeXLower); + } + if (validUpper) { + plot.getDomainAxis().setUpperBound(rangeXUpper); + } + } + adjustmentHasChanged = true; + } catch (Exception e) { } } else { - if (isUserInducedAutomaticAdjustmentChosen) { - isUserInducedAutomaticAdjustmentChosen = false; - if (isAutomaticDomainAdjustmentSet()) { - plot.getDomainAxis().setAutoRange(false); - domainAxisAdjustmentIsFrozen = false; - adjustmentHasChanged = true; + plot.getDomainAxis().setAutoRange(true); + adjustmentHasChanged = true; + } + + + + if (rangeYCheckBox.isSelected()) { + try { + boolean validLower = false; + boolean validUpper = false; + if (rangeYLowerTextField.getText() != null && rangeYLowerTextField.getText().trim().length() > 0) { + rangeYLower = Double.parseDouble(rangeYLowerTextField.getText()); + validLower = true; } - if (isAutomaticRangeAdjustmentSet()) { - plot.getRangeAxis().setAutoRange(false); - rangeAxisAdjustmentIsFrozen = false; - adjustmentHasChanged = true; + + if (rangeYUpperTextField.getText() != null && rangeYUpperTextField.getText().trim().length() > 0) { + rangeYUpper = Double.parseDouble(rangeYUpperTextField.getText()); + validUpper = true; } + + if (validLower && validUpper) { + plot.getRangeAxis().setRange(rangeYLower, rangeYUpper); + } else { + plot.getRangeAxis().setAutoRange(true); + if (validLower) { + plot.getRangeAxis().setLowerBound(rangeYLower); + } + if (validUpper) { + plot.getRangeAxis().setUpperBound(rangeYUpper); + } + } + adjustmentHasChanged = true; + } catch (Exception e) { } + } else { + plot.getRangeAxis().setAutoRange(true); + adjustmentHasChanged = true; } + if (adjustmentHasChanged) { chartUpdater.invalidatePlotBounds(); } } + + private boolean isAutomaticDomainAdjustmentSet() { return chart.getXYPlot().getDomainAxis().isAutoRange(); } @@ -1152,12 +1490,13 @@ private void updateData(JFreeChart chart, List spectra, com totalWorkPlanned = totalWorkPlanned/2; } - System.out.println("totalWorkPlanned=" + totalWorkPlanned); + // System.out.println("totalWorkPlanned=" + totalWorkPlanned); fillDatasetWithPinSeries(spectra, dataset, chart, pm, totalWorkPlanned); - System.out.println("Finish fillDatasetWithPinSeries"); + // System.out.println("Finish fillDatasetWithPinSeries"); if (pm != null && pm.isCanceled()) { + cancelActions(); return; } fillDatasetWithCursorSeries(spectra, dataset, chart, pm, totalWorkPlanned); @@ -1250,6 +1589,7 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe for (Band spectralBand : spectralBands) { if (pm != null && pm.isCanceled()) { + cancelActions(); return; } final float wavelength = spectralBand.getSpectralWavelength(); @@ -1270,6 +1610,7 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe } else { for (Band spectralBand : spectralBands) { if (pm != null && pm.isCanceled()) { + cancelActions(); return; } final float wavelength = spectralBand.getSpectralWavelength(); @@ -1305,10 +1646,12 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe } } if (pm != null && pm.isCanceled()) { + cancelActions(); return; } updateRenderer(dataset.getSeriesCount(), Color.BLACK, spectrum, chart); if (pm != null && pm.isCanceled()) { + cancelActions(); return; } dataset.addSeries(series); @@ -1333,12 +1676,13 @@ private void fillDatasetWithPinSeries(List spectra, XYSerie Placemark[] pins = getDisplayedPins(); totalWorkPlanned = (int) Math.floor(1.0 * totalWorkPlanned / pins.length); - System.out.println("Number of pins =" + pins.length); - System.out.println("(For each pin) totalWorkPlanned=" + totalWorkPlanned); + // System.out.println("Number of pins =" + pins.length); + // System.out.println("(For each pin) totalWorkPlanned=" + totalWorkPlanned); for (Placemark pin : pins) { List pinSeries = createXYSeriesFromPin(pin, dataset.getSeriesCount(), spectra, chart, pm, totalWorkPlanned); if (pm != null && pm.isCanceled()) { + cancelActions(); return; } pinSeries.forEach(dataset::addSeries); @@ -1351,10 +1695,11 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned / spectra.size()); int workDone = 0; - System.out.println("totalWorkPlannedPerSpectra=" + totalWorkPlannedPerSpectra); + // System.out.println("totalWorkPlannedPerSpectra=" + totalWorkPlannedPerSpectra); for (DisplayableSpectrum spectrum : spectra) { if (pm != null && pm.isCanceled()) { + cancelActions(); return null; } XYSeries series = new XYSeries(spectrum.getName() + "_" + pin.getLabel()); @@ -1369,12 +1714,13 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis int numBands = spectralBands.length; double incrementLengthNumBands = (totalWorkPlannedPerSpectra > 0) ? numBands / totalWorkPlannedPerSpectra : numBands; - System.out.println("incrementLengthNumBands=" + incrementLengthNumBands); + // System.out.println("incrementLengthNumBands=" + incrementLengthNumBands); double nextIncrementFinishedBandCount = incrementLengthNumBands; int bandCount = 0; for (Band spectralBand : spectralBands) { if (pm != null && pm.isCanceled()) { + cancelActions(); return null; } double energy; @@ -1400,10 +1746,12 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis } if (pm != null && pm.isCanceled()) { + cancelActions(); return null; } updateRenderer(seriesIndex++, pinColor, spectrum, chart); if (pm != null && pm.isCanceled()) { + cancelActions(); return null; } pinSeries.add(series); From c8567fec6c04db5dfb85fdcd57c3b970ea2e964f Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Thu, 4 Apr 2024 10:05:43 -0400 Subject: [PATCH 10/13] Spectrum View: added tooltips and updated help page --- .../help/docs/desktop/SpectrumWindow.html | 25 +++++++++++++++++++ .../rcp/spectrum/SpectrumTopComponent.java | 10 ++++++++ 2 files changed, 35 insertions(+) diff --git a/snap-help/src/main/resources/org/esa/snap/snap/help/docs/desktop/SpectrumWindow.html b/snap-help/src/main/resources/org/esa/snap/snap/help/docs/desktop/SpectrumWindow.html index 48c973744d..ade49bfb24 100644 --- a/snap-help/src/main/resources/org/esa/snap/snap/help/docs/desktop/SpectrumWindow.html +++ b/snap-help/src/main/resources/org/esa/snap/snap/help/docs/desktop/SpectrumWindow.html @@ -147,6 +147,31 @@

Context Menu

+ +
+

Plot Range Fields

+
+
+‣ Set Bounds X-Axis:
+        Sets bounds of x-axis (uses X-Axis Min and X-Axis Max)
+
+‣ X-Axis Min:
+        Sets minimum bound of x-axis (blank entry uses auto-bounding to data)
+
+‣ X-Axis Max:
+        Sets maximum bound of x-axis (blank entry uses auto-bounding to data)
+
+‣ Set Bounds Y-Axis:
+        Sets bounds of y-axis (uses Y-Axis Min and Y-Axis Max)
+
+‣ Y-Axis Min:
+        Sets minimum bound of y-axis (blank entry uses auto-bounding to data)
+
+‣ Y-Axis Max:
+        Sets maximum bound of y-axis (blank entry uses auto-bounding to data)
+
+
+
\ No newline at end of file diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 02c200793b..61ce2761e3 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -472,14 +472,19 @@ private void initUI() { rangeXCheckBox = new JCheckBox(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_LABEL); + rangeXCheckBox.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_SET_BOUNDS_TOOLTIP); rangeXLowerLabel = new JLabel(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_LABEL); rangeXLowerTextField = new JTextField("1234567890"); + rangeXLowerLabel.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_TOOLTIP); + rangeXLowerTextField.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MIN_TOOLTIP); rangeXLowerTextField.setMinimumSize(rangeXLowerTextField.getPreferredSize()); rangeXLowerTextField.setPreferredSize(rangeXLowerTextField.getPreferredSize()); rangeXUpperLabel = new JLabel(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_LABEL); rangeXUpperTextField = new JTextField("1234567890"); + rangeXUpperLabel.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_TOOLTIP); + rangeXUpperTextField.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_TOOLTIP); rangeXUpperTextField.setMinimumSize(rangeXUpperTextField.getPreferredSize()); rangeXUpperTextField.setPreferredSize(rangeXUpperTextField.getPreferredSize()); rangeXUpperTextField.setText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_XAXIS_MAX_DEFAULT); @@ -487,14 +492,19 @@ private void initUI() { rangeYCheckBox = new JCheckBox(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_LABEL); + rangeYCheckBox.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_SET_BOUNDS_TOOLTIP); rangeYLowerLabel = new JLabel(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_LABEL); rangeYLowerTextField = new JTextField("1234567890"); + rangeYLowerLabel.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_TOOLTIP); + rangeYLowerTextField.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MIN_TOOLTIP); rangeYLowerTextField.setMinimumSize(rangeYLowerTextField.getPreferredSize()); rangeYLowerTextField.setPreferredSize(rangeYLowerTextField.getPreferredSize()); rangeYUpperLabel = new JLabel(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_LABEL); rangeYUpperTextField = new JTextField("1234567890"); + rangeYUpperLabel.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_TOOLTIP); + rangeYUpperTextField.setToolTipText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_TOOLTIP); rangeYUpperTextField.setMinimumSize(rangeYUpperTextField.getPreferredSize()); rangeYUpperTextField.setPreferredSize(rangeYUpperTextField.getPreferredSize()); rangeYUpperTextField.setText(SpectrumViewController.PROPERTY_SPECTRUM_VIEW_YAXIS_MAX_DEFAULT); From 84dcb21f98f9d70e59e3299b8bc447d4105a1aca Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Thu, 18 Apr 2024 11:56:51 -0400 Subject: [PATCH 11/13] Merging SNAP 11: applying their SpectrumTopComponent.java changes --- .../rcp/spectrum/SpectrumTopComponent.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 61ce2761e3..46363aae83 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -30,10 +30,7 @@ import org.esa.snap.rcp.statistics.XYPlotMarker; import org.esa.snap.rcp.util.Dialogs; import org.esa.snap.rcp.windows.ToolTopComponent; -import org.esa.snap.ui.GridBagUtils; -import org.esa.snap.ui.ModalDialog; -import org.esa.snap.ui.PixelPositionListener; -import org.esa.snap.ui.UIUtils; +import org.esa.snap.ui.*; import org.esa.snap.ui.product.ProductSceneView; import org.esa.snap.ui.product.spectrum.*; import org.esa.snap.ui.tool.ToolButtonFactory; @@ -171,8 +168,10 @@ static DisplayableSpectrum[] createSpectraFromUngroupedBands(SpectrumBand[] ungr displayableSpectrumList.get(knownUnits.indexOf(unit)).addBand(ungroupedBand); } else { knownUnits.add(unit); - final DisplayableSpectrum spectrum = new DisplayableSpectrum("Bands measured in " + unit, symbolIndex++); - spectrum.setLineStyle(SpectrumStrokeProvider.getStroke(strokeIndex++)); + final DisplayableSpectrum spectrum = new DisplayableSpectrum("Bands measured in " + unit, symbolIndex); + symbolIndex++; + spectrum.setLineStyle(SpectrumStrokeProvider.getStroke(strokeIndex)); + strokeIndex++; spectrum.addBand(ungroupedBand); displayableSpectrumList.add(spectrum); } @@ -364,9 +363,9 @@ private void setCurrentProduct(Product product) { private void updateUIState() { boolean hasView = currentView != null; - boolean hasProduct = getCurrentProduct() != null; + boolean hasProduct = currentProduct != null; boolean hasSelectedPins = hasView && currentView.getSelectedPins().length > 0; - boolean hasPins = hasProduct && getCurrentProduct().getPinGroup().getNodeCount() > 0; + boolean hasPins = hasProduct && currentProduct.getPinGroup().getNodeCount() > 0; filterButton.setEnabled(hasProduct); showSpectrumForCursorButton.setEnabled(hasView); showSpectraForSelectedPinsButton.setEnabled(hasSelectedPins); @@ -874,7 +873,7 @@ private void selectSpectralBands() { final RasterDataNode currentRaster = currentView.getRaster(); final DisplayableSpectrum[] allSpectra = rasterToSpectraMap.get(currentRaster); final SpectrumChooser spectrumChooser = new SpectrumChooser(SwingUtilities.getWindowAncestor(this), allSpectra); - if (spectrumChooser.show() == ModalDialog.ID_OK) { + if (spectrumChooser.show() == AbstractDialog.ID_OK) { final DisplayableSpectrum[] spectra = spectrumChooser.getSpectra(); rasterToSpectraMap.put(currentRaster, spectra); } @@ -1027,8 +1026,8 @@ protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Excep Placemark[] getDisplayedPins() { if (isShowingSpectraForSelectedPins() && currentView != null) { return currentView.getSelectedPins(); - } else if (isShowingSpectraForAllPins() && getCurrentProduct() != null) { - ProductNodeGroup pinGroup = getCurrentProduct().getPinGroup(); + } else if (isShowingSpectraForAllPins() && currentProduct != null) { + ProductNodeGroup pinGroup = currentProduct.getPinGroup(); return pinGroup.toArray(new Placemark[pinGroup.getNodeCount()]); } else { return new Placemark[0]; @@ -1065,7 +1064,8 @@ private void setUpSpectra() { DisplayableSpectrum spectrum = new DisplayableSpectrum(spectrumName, symbolIndex); spectrum.setSelected(i == selectedSpectrumIndex); spectrum.setLineStyle(SpectrumStrokeProvider.getStroke(i)); - autoGroupingSpectra[i++] = spectrum; + autoGroupingSpectra[i] = spectrum; + i++; } List ungroupedBandsList = new ArrayList<>(); for (SpectrumBand availableSpectralBand : availableSpectralBands) { @@ -1227,6 +1227,9 @@ public boolean showsValidCursorSpectra() { return chartHandler.showsValidCursorSpectra(); } + Map> getPinToEnergies() { + return chartHandler.getPinToEnergies(); + } private class ChartHandler { private static final String MESSAGE_NO_SPECTRAL_BANDS = "No spectral bands available"; /*I18N*/ @@ -1454,6 +1457,9 @@ public void removeCursorSpectraFromDataset() { public void setCollectingSpectralInformationMessage() { setPlotMessage(MESSAGE_COLLECTING_SPECTRAL_INFORMATION); } + public Map> getPinToEnergies() { + return chartUpdater.getPinToEnergies(); + } } private class ChartUpdater { @@ -1535,7 +1541,8 @@ private void setPlotUnit(List spectra, XYPlot plot) { unitToBeDisplayed = spectra.get(0).getUnit(); int i = 1; while (i < spectra.size() && !unitToBeDisplayed.equals(DisplayableSpectrum.MIXED_UNITS)) { - DisplayableSpectrum displayableSpectrum = spectra.get(i++); + DisplayableSpectrum displayableSpectrum = spectra.get(i); + i++; if (displayableSpectrum.hasSelectedBands() && !unitToBeDisplayed.equals(displayableSpectrum.getUnit())) { unitToBeDisplayed = DisplayableSpectrum.MIXED_UNITS; } @@ -1759,7 +1766,8 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis cancelActions(); return null; } - updateRenderer(seriesIndex++, pinColor, spectrum, chart); + updateRenderer(seriesIndex, pinColor, spectrum, chart); + seriesIndex++; if (pm != null && pm.isCanceled()) { cancelActions(); return null; @@ -1862,6 +1870,9 @@ private int getLevel(MultiLevelModel multiLevelModel) { return ImageLayer.getLevel(multiLevelModel, currentView.getViewport()); } + Map> getPinToEnergies() { + return pinToEnergies; + } } private class SpectrumLegendItemSource implements LegendItemSource { @@ -1920,14 +1931,14 @@ public void nodeChanged(final ProductNodeEvent event) { chartHasChanged = true; } } else if (event.getSourceNode() instanceof Placemark) { - if (event.getPropertyName().equals("geoPos") || event.getPropertyName().equals("pixelPos")) { + if ("geoPos".equals(event.getPropertyName()) || "pixelPos".equals(event.getPropertyName())) { chartHandler.removePinInformation((Placemark) event.getSourceNode()); } if (isShowingPinSpectra()) { chartHasChanged = true; } } else if (event.getSourceNode() instanceof Product) { - if (event.getPropertyName().equals("autoGrouping")) { + if ("autoGrouping".equals(event.getPropertyName())) { setUpSpectra(); chartHasChanged = true; } From 9880695f6dce2729952bc57dfd9f91d874164115 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Tue, 24 Sep 2024 20:08:35 -0400 Subject: [PATCH 12/13] Spectrum View: mods to try to improve progress monitor --- .../snap/rcp/spectrum/SpectrumTopComponent.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index 46363aae83..e403869e07 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -142,6 +142,8 @@ public class SpectrumTopComponent extends ToolTopComponent { private boolean isCodeInducedAxisChange; private boolean isUserInducedAutomaticAdjustmentChosen; + private int workDone = 0; + public SpectrumTopComponent() { // System.out.println("Spectrum View Tool is Open"); spectrumViewToolIsOpen = false; @@ -605,7 +607,7 @@ public void pointDeselected() { runProgressMonitorForCursor(); } else { // System.out.println("Listening to showSpectrumForCursorButton - false"); - recreateChart(); +// recreateChart(); } }); showSpectrumForCursorButton.setName("showSpectrumForCursorButton"); @@ -904,18 +906,19 @@ private void runProgressMonitorForCursor() { // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 1"); ProgressMonitorSwingWorker pmSwingWorker = new ProgressMonitorSwingWorker(SnapApp.getDefault().getMainFrame(), - "Collecting Spectral Data") { + "Collecting Spectral Data for cursor") { @Override protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Exception { int totalWorkPlanned = 100; + workDone = 0; pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlanned); try { // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 2"); - updateData(0, 0, 0, true, pm, (totalWorkPlanned - 10)); + updateData(0, 0, 0, true, pm, (totalWorkPlanned - 20)); chartHandler.setEmptyPlot(); if (pm != null && pm.isCanceled()) { @@ -965,13 +968,14 @@ private void recreateChart(boolean showProgress) { protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Exception { int totalWorkPlanned = 100; + workDone = 0; pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlanned); try { // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 2"); - chartHandler.updateData(pm,(totalWorkPlanned - 10)); + chartHandler.updateData(pm,(totalWorkPlanned - 20)); if (pm != null && pm.isCanceled()) { cancelActions(); pm.done(); @@ -1235,7 +1239,7 @@ private class ChartHandler { private static final String MESSAGE_NO_SPECTRAL_BANDS = "No spectral bands available"; /*I18N*/ private static final String MESSAGE_NO_PRODUCT_SELECTED = "No product selected"; private static final String MESSAGE_NO_SPECTRA_SELECTED = "No spectra selected"; - private static final String MESSAGE_COLLECTING_SPECTRAL_INFORMATION = "Collecting spectral information..."; + private static final String MESSAGE_COLLECTING_SPECTRAL_INFORMATION = "Collecting data (possible memory limitations)..."; private final JFreeChart chart; private final ChartUpdater chartUpdater; @@ -1591,7 +1595,6 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe } if (isShowingCursorSpectrum() && currentView != null) { int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned / spectra.size()); - int workDone = 0; for (DisplayableSpectrum spectrum : spectra) { XYSeries series = new XYSeries(spectrum.getName()); @@ -1711,7 +1714,6 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis Color pinColor = PlacemarkUtils.getPlacemarkColor(pin, currentView); int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned / spectra.size()); - int workDone = 0; // System.out.println("totalWorkPlannedPerSpectra=" + totalWorkPlannedPerSpectra); for (DisplayableSpectrum spectrum : spectra) { From e81652a25f2be75fa688e36e597728654be14964 Mon Sep 17 00:00:00 2001 From: Daniel Knowles Date: Wed, 25 Sep 2024 14:41:51 -0400 Subject: [PATCH 13/13] Spectrum View: revisions to improve progress monitor --- .../rcp/spectrum/SpectrumTopComponent.java | 140 +++++++++++++----- .../product/spectrum/DisplayableSpectrum.java | 4 +- .../ui/product/spectrum/SpectrumChooser.java | 9 +- 3 files changed, 112 insertions(+), 41 deletions(-) diff --git a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java index e403869e07..906f2fb717 100644 --- a/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java +++ b/snap-rcp/src/main/java/org/esa/snap/rcp/spectrum/SpectrumTopComponent.java @@ -22,7 +22,6 @@ import org.esa.snap.core.image.ImageManager; import org.esa.snap.core.util.ProductUtils; import org.esa.snap.core.util.StringUtils; -import org.esa.snap.core.util.math.Array; import org.esa.snap.rcp.SnapApp; import org.esa.snap.rcp.actions.help.HelpAction; import org.esa.snap.rcp.placemark.PlacemarkUtils; @@ -142,7 +141,8 @@ public class SpectrumTopComponent extends ToolTopComponent { private boolean isCodeInducedAxisChange; private boolean isUserInducedAutomaticAdjustmentChosen; - private int workDone = 0; + private int workDoneMaster = 0; + private int totalWorkPlannedMaster = 100; public SpectrumTopComponent() { // System.out.println("Spectrum View Tool is Open"); @@ -607,7 +607,7 @@ public void pointDeselected() { runProgressMonitorForCursor(); } else { // System.out.println("Listening to showSpectrumForCursorButton - false"); -// recreateChart(); + recreateChart(); } }); showSpectrumForCursorButton.setName("showSpectrumForCursorButton"); @@ -911,14 +911,14 @@ private void runProgressMonitorForCursor() { @Override protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Exception { - int totalWorkPlanned = 100; - workDone = 0; - pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlanned); + totalWorkPlannedMaster = 100; + workDoneMaster = 0; + pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlannedMaster); try { // System.out.println("INSIDE: runProgressMonitorForCursor - PROGRESS 2"); - updateData(0, 0, 0, true, pm, (totalWorkPlanned - 20)); + updateData(0, 0, 0, true, pm, (totalWorkPlannedMaster - 10)); chartHandler.setEmptyPlot(); if (pm != null && pm.isCanceled()) { @@ -967,30 +967,38 @@ private void recreateChart(boolean showProgress) { @Override protected Void doInBackground(com.bc.ceres.core.ProgressMonitor pm) throws Exception { - int totalWorkPlanned = 100; - workDone = 0; - pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlanned); + totalWorkPlannedMaster = 100; + workDoneMaster = 0; + pm.beginTask("Collecting spectral data: this can take several minutes on larger files", totalWorkPlannedMaster); try { - // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 2"); +// System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 2"); - chartHandler.updateData(pm,(totalWorkPlanned - 20)); + chartHandler.updateData(pm,(totalWorkPlannedMaster - 10)); if (pm != null && pm.isCanceled()) { cancelActions(); pm.done(); return null; } +// System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 3"); + chartHandler.updateChart(); updateChart(true); if (pm != null) { - pm.worked(1); + if (workDoneMaster > totalWorkPlannedMaster) { + pm.worked(1); + } } +// System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 4"); + chartPanel.repaint(); if (pm != null) { - pm.worked(1); + if (workDoneMaster > totalWorkPlannedMaster) { + pm.worked(1); + } } updateUIState(); // System.out.println("INSIDE: recreateChart(boolean showProgress) - PROGRESS 3"); @@ -1063,10 +1071,19 @@ private void setUpSpectra() { spectrumNameBuilder.append("_").append(autoGroupingNamePart); } } + final String spectrumName = spectrumNameBuilder.toString(); int symbolIndex = SpectrumShapeProvider.getValidIndex(i, false); DisplayableSpectrum spectrum = new DisplayableSpectrum(spectrumName, symbolIndex); - spectrum.setSelected(i == selectedSpectrumIndex); + if (spectrumName != null) { + final ProductSceneView view = SnapApp.getDefault().getSelectedProductSceneView(); + if (view != null && view.getRaster().getName().startsWith(spectrumName)) { + spectrum.setSelected(i == selectedSpectrumIndex); + } else { + spectrum.setSelected(false); + } + } + spectrum.setLineStyle(SpectrumStrokeProvider.getStroke(i)); autoGroupingSpectra[i] = spectrum; i++; @@ -1507,10 +1524,10 @@ private void updateData(JFreeChart chart, List spectra, com if (rasterLevel >= 0) { if (getDisplayedPins().length > 0 && isShowingCursorSpectrum()) { - totalWorkPlanned = totalWorkPlanned/2; + totalWorkPlanned = (int) Math.floor(1.0 * totalWorkPlanned / 2.0); } - // System.out.println("totalWorkPlanned=" + totalWorkPlanned); + System.out.println("totalWorkPlanned=" + totalWorkPlanned); fillDatasetWithPinSeries(spectra, dataset, chart, pm, totalWorkPlanned); // System.out.println("Finish fillDatasetWithPinSeries"); @@ -1588,13 +1605,15 @@ private Range getNewPlotBounds(Range bounds) { bounds.getUpperBound() + delta); } - private void fillDatasetWithCursorSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { + private void fillDatasetWithCursorSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned2) { showsValidCursorSpectra = false; if (modelP == null) { return; } + + int workDone2 = 0; if (isShowingCursorSpectrum() && currentView != null) { - int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned / spectra.size()); + int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned2 / spectra.size()); for (DisplayableSpectrum spectrum : spectra) { XYSeries series = new XYSeries(spectrum.getName()); @@ -1619,12 +1638,19 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe } bandCount++; - if (workDone < totalWorkPlanned && bandCount > nextIncrementFinishedBandCount) { - if (totalWorkPlanned != 0) { - if (pm != null) {pm.worked(1);} + if (bandCount > nextIncrementFinishedBandCount) { + System.out.println("workDoneMaster=" + workDoneMaster + " totalWorkPlannedMaster=" + totalWorkPlannedMaster); + System.out.println("workDone2=" + workDone2 + " totalWorkPlanned2=" + totalWorkPlanned2); + + if (workDoneMaster < totalWorkPlannedMaster && workDone2 < totalWorkPlanned2) { + if (totalWorkPlanned2 != 0) { + if (pm != null) {pm.worked(1);} + } + workDoneMaster++; + workDone2++; } + nextIncrementFinishedBandCount += incrementLengthNumBands; - workDone++; } } } else { @@ -1656,13 +1682,22 @@ private void fillDatasetWithCursorSeries(List spectra, XYSe } bandCount++; - if (workDone < totalWorkPlanned && bandCount > nextIncrementFinishedBandCount) { - if (totalWorkPlanned != 0) { - if (pm != null) {pm.worked(1);} + + if (bandCount > nextIncrementFinishedBandCount) { + System.out.println("workDoneMaster=" + workDoneMaster + " totalWorkPlannedMaster=" + totalWorkPlannedMaster); + System.out.println("workDone2=" + workDone2 + " totalWorkPlanned2=" + totalWorkPlanned2); + + if (workDoneMaster < totalWorkPlannedMaster && workDone2 < totalWorkPlanned2) { + if (totalWorkPlanned2 != 0) { + if (pm != null) {pm.worked(1);} + } + workDoneMaster++; + workDone2++; } + nextIncrementFinishedBandCount += incrementLengthNumBands; - workDone++; } + } } if (pm != null && pm.isCanceled()) { @@ -1692,29 +1727,40 @@ private boolean coordinatesAreInRasterBounds(RasterDataNode raster, int x, int y return x >= 0 && y >= 0 && x < levelImage.getWidth() && y < levelImage.getHeight(); } - private void fillDatasetWithPinSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { + private void fillDatasetWithPinSeries(List spectra, XYSeriesCollection dataset, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned2) { Placemark[] pins = getDisplayedPins(); - totalWorkPlanned = (int) Math.floor(1.0 * totalWorkPlanned / pins.length); - // System.out.println("Number of pins =" + pins.length); - // System.out.println("(For each pin) totalWorkPlanned=" + totalWorkPlanned); + // it seems like most of the work is done on first pin so setting this to false for now + boolean splitWorkAcrossPins = false; + if (splitWorkAcrossPins) { + totalWorkPlanned2 = (int) Math.floor(1.0 * totalWorkPlanned2 / pins.length); + } + +// System.out.println("Number of pins =" + pins.length); +// System.out.println("(For each pin) totalWorkPlanned=" + totalWorkPlanned2); for (Placemark pin : pins) { - List pinSeries = createXYSeriesFromPin(pin, dataset.getSeriesCount(), spectra, chart, pm, totalWorkPlanned); +// System.out.println("Processing a pin"); + List pinSeries = createXYSeriesFromPin(pin, dataset.getSeriesCount(), spectra, chart, pm, totalWorkPlanned2); if (pm != null && pm.isCanceled()) { cancelActions(); return; } +// System.out.println("Processing a pin (PART 2)"); + pinSeries.forEach(dataset::addSeries); } } - private List createXYSeriesFromPin(Placemark pin, int seriesIndex, List spectra, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned) { + private List createXYSeriesFromPin(Placemark pin, int seriesIndex, List spectra, JFreeChart chart, com.bc.ceres.core.ProgressMonitor pm, int totalWorkPlanned2) { List pinSeries = new ArrayList<>(); Color pinColor = PlacemarkUtils.getPlacemarkColor(pin, currentView); - int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned / spectra.size()); - // System.out.println("totalWorkPlannedPerSpectra=" + totalWorkPlannedPerSpectra); + int workDone2 = 0; + + int totalWorkPlannedPerSpectra = (int) Math.floor(1.0 * totalWorkPlanned2 / spectra.size()); +// System.out.println("spectra.size()=" + spectra.size()); +// System.out.println("totalWorkPlannedPerSpectra=" + totalWorkPlannedPerSpectra); for (DisplayableSpectrum spectrum : spectra) { if (pm != null && pm.isCanceled()) { @@ -1755,26 +1801,42 @@ private List createXYSeriesFromPin(Placemark pin, int seriesIndex, Lis } bandCount++; - if (workDone < totalWorkPlanned && bandCount > nextIncrementFinishedBandCount) { - if (totalWorkPlanned != 0) { - if (pm != null) {pm.worked(1);} + + if (bandCount > nextIncrementFinishedBandCount) { +// System.out.println("workDoneMaster=" + workDoneMaster + " totalWorkPlannedMaster=" + totalWorkPlannedMaster); +// System.out.println("workDone2=" + workDone2 + " totalWorkPlanned2=" + totalWorkPlanned2); + + if (workDoneMaster < totalWorkPlannedMaster && workDone2 < totalWorkPlanned2) { + if (totalWorkPlanned2 != 0) { + if (pm != null) {pm.worked(1);} + } + workDoneMaster++; + workDone2++; } + nextIncrementFinishedBandCount += incrementLengthNumBands; - workDone++; } + } if (pm != null && pm.isCanceled()) { cancelActions(); return null; } + +// System.out.println("test1"); + updateRenderer(seriesIndex, pinColor, spectrum, chart); seriesIndex++; if (pm != null && pm.isCanceled()) { cancelActions(); return null; } +// System.out.println("test2"); + pinSeries.add(series); +// System.out.println("test3"); + } return pinSeries; } diff --git a/snap-ui/src/main/java/org/esa/snap/ui/product/spectrum/DisplayableSpectrum.java b/snap-ui/src/main/java/org/esa/snap/ui/product/spectrum/DisplayableSpectrum.java index f35adeac15..d766a00d05 100644 --- a/snap-ui/src/main/java/org/esa/snap/ui/product/spectrum/DisplayableSpectrum.java +++ b/snap-ui/src/main/java/org/esa/snap/ui/product/spectrum/DisplayableSpectrum.java @@ -2,6 +2,7 @@ import com.bc.ceres.core.Assert; import org.esa.snap.core.datamodel.Band; +import org.esa.snap.ui.product.ProductSceneView; import java.awt.Shape; import java.awt.Stroke; @@ -42,9 +43,10 @@ public DisplayableSpectrum(String spectrumName, SpectrumBand[] spectralBands, in public void addBand(SpectrumBand band) { Assert.notNull(band); bands.add(band); + /* if(band.isSelected()) { setSelected(true); - } + }*/ updateUnit(); } diff --git a/snap-ui/src/main/java/org/esa/snap/ui/product/spectrum/SpectrumChooser.java b/snap-ui/src/main/java/org/esa/snap/ui/product/spectrum/SpectrumChooser.java index b01cf09c75..d077b6a9d7 100644 --- a/snap-ui/src/main/java/org/esa/snap/ui/product/spectrum/SpectrumChooser.java +++ b/snap-ui/src/main/java/org/esa/snap/ui/product/spectrum/SpectrumChooser.java @@ -163,7 +163,7 @@ private void addSpectrumComponentsToSpectraPanel(int index) { final ImageIcon shapeIcon = SpectrumShapeProvider.getShapeIcon(spectrum.getSymbolIndex()); spectraPanel.add(collapseButton); final TristateCheckBox tristateCheckBox = new TristateCheckBox(); - tristateCheckBox.setState(selectionAdmin.getState(index)); + tristateCheckBox.setState(isSelected(spectrum)); tristateCheckBox.addActionListener(new TristateCheckboxListener(index)); tristateCheckBoxes[index] = tristateCheckBox; spectraPanel.add(tristateCheckBox); @@ -211,6 +211,13 @@ private void addSpectrumComponentsToSpectraPanel(int index) { spectraPanel.add(shapeSizeComboBox); } + private static int isSelected(DisplayableSpectrum spectrum) { + if (spectrum.isSelected()) { + return TristateCheckBox.STATE_SELECTED; + } + return TristateCheckBox.STATE_UNSELECTED; + } + private void toggleCollapsed(int index) { final boolean isCollapsed = !collapsed[index]; collapsed[index] = isCollapsed;