package org.esa.snap.ui.product.spectrum; import com.bc.ceres.core.Assert; import org.esa.snap.core.datamodel.Band; import java.awt.Shape; import java.awt.Stroke; import java.util.ArrayList; import java.util.List; public class DisplayableSpectrum implements Spectrum { public final static String NO_UNIT = ""; public final static String MIXED_UNITS = "mixed units"; public final static String DEFAULT_SPECTRUM_NAME = "Bands"; public final static String REMAINING_BANDS_NAME = "Other"; private List<SpectrumBand> bands; private String name; private Stroke lineStyle; private int symbolIndex; private int symbolSize; private boolean isSelected; private String unit; public DisplayableSpectrum(String spectrumName, int symbolIndex) { this(spectrumName, new SpectrumBand[]{}, symbolIndex); } public DisplayableSpectrum(String spectrumName, SpectrumBand[] spectralBands, int symbolIndex) { this.name = spectrumName; bands = new ArrayList<SpectrumBand>(spectralBands.length); this.symbolIndex = symbolIndex; symbolSize = SpectrumShapeProvider.DEFAULT_SCALE_GRADE; unit = NO_UNIT; for (SpectrumBand spectralBand : spectralBands) { addBand(spectralBand); } setSelected(true); } public void addBand(SpectrumBand band) { Assert.notNull(band); bands.add(band); if(band.isSelected()) { setSelected(true); } updateUnit(); } public Shape getScaledShape() { return SpectrumShapeProvider.getScaledShape(getSymbolIndex(), getSymbolSize()); } public boolean isDefaultOrRemainingBandsSpectrum() { return isRemainingBandsSpectrum() || name.equals(DEFAULT_SPECTRUM_NAME); } public boolean isRemainingBandsSpectrum() { return name.equals(REMAINING_BANDS_NAME); } public boolean hasBands() { return !bands.isEmpty(); } public boolean hasSelectedBands() { for (SpectrumBand band : bands) { if (band.isSelected()) { return true; } } return false; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Band[] getSpectralBands() { Band[] spectralBands = new Band[bands.size()]; for (int i = 0; i < bands.size(); i++) { spectralBands[i] = bands.get(i).getOriginalBand(); } return spectralBands; } public Band[] getSelectedBands() { List<Band> selectedBands = new ArrayList<Band>(); for (SpectrumBand band : bands) { if (band.isSelected()) { selectedBands.add(band.getOriginalBand()); } } return selectedBands.toArray(new Band[selectedBands.size()]); } public void setBandSelected(int index, boolean selected) { bands.get(index).setSelected(selected); } public boolean isBandSelected(int index) { return bands.get(index).isSelected(); } public Stroke getLineStyle() { if (isRemainingBandsSpectrum()) { return SpectrumStrokeProvider.EMPTY_STROKE; } return lineStyle; } public void setLineStyle(Stroke lineStyle) { this.lineStyle = lineStyle; } public void setSelected(boolean selected) { isSelected = selected; } public boolean isSelected() { return isSelected; } public String getUnit() { return unit; } public int getSymbolSize() { return symbolSize; } public void setSymbolSize(int symbolSize) { this.symbolSize = symbolSize; } public int getSymbolIndex() { return symbolIndex; } public void setSymbolIndex(int symbolIndex) { this.symbolIndex = symbolIndex; } public void updateUnit() { if (bands.size() > 0) { unit = getUnit(bands.get(0)); } if (bands.size() > 1) { for (int i = 1; i < bands.size(); i++) { if (!unit.equals(getUnit(bands.get(i)))) { unit = MIXED_UNITS; return; } } } } private String getUnit(SpectrumBand band) { String bandUnit = band.getUnit(); if(bandUnit == null) { bandUnit = ""; } return bandUnit; } public void remove(int j) { bands.remove(j); } }