package org.esa.snap.ui.product.spectrum; import com.jidesoft.swing.TristateCheckBox; import java.util.ArrayList; import java.util.List; class SpectrumSelectionAdmin { private List<List<Boolean>> bandSelectionStates; private List<Integer> numbersOfSelectedBands; private List<Integer> currentStates; SpectrumSelectionAdmin() { bandSelectionStates = new ArrayList<List<Boolean>>(); numbersOfSelectedBands = new ArrayList<Integer>(); currentStates = new ArrayList<Integer>(); } void evaluateSpectrumSelections(DisplayableSpectrum spectrum) { List<Boolean> selected = new ArrayList<Boolean>(); int numberOfSelectedBands = 0; for (int i = 0; i < spectrum.getSpectralBands().length; i++) { final boolean bandSelected = spectrum.isBandSelected(i); selected.add(bandSelected); if (bandSelected) { numberOfSelectedBands++; } } bandSelectionStates.add(selected); numbersOfSelectedBands.add(numberOfSelectedBands); currentStates.add(-1); evaluateState(bandSelectionStates.size() - 1); } boolean isBandSelected(int row, int i) { if (currentStates.get(row) == TristateCheckBox.STATE_MIXED) { return bandSelectionStates.get(row).get(i); } else return currentStates.get(row) == TristateCheckBox.STATE_SELECTED; } private void evaluateState(int index) { final Integer numberOfBands = numbersOfSelectedBands.get(index); if (numberOfBands == 0) { currentStates.set(index, TristateCheckBox.STATE_UNSELECTED); } else if (numberOfBands == bandSelectionStates.get(index).size()) { currentStates.set(index, TristateCheckBox.STATE_SELECTED); } else { currentStates.set(index, TristateCheckBox.STATE_MIXED); } } int getState(int index) { return currentStates.get(index); } boolean isSpectrumSelected(int row) { return currentStates.get(row) != TristateCheckBox.STATE_UNSELECTED; } void setBandSelected(int row, int bandRow, boolean selected) { if (isBandSelected(row, bandRow) != selected) { updateBandSelections(row, bandRow, selected); updateNumberOfSelectedBands(selected, row); evaluateState(row); } } private void updateBandSelections(int row, int bandRow, boolean selected) { bandSelectionStates.get(row).set(bandRow, selected); if (currentStates.get(row) != TristateCheckBox.STATE_MIXED) { for (int i = 0; i < bandSelectionStates.get(row).size(); i++) { if (i != bandRow) { bandSelectionStates.get(row).set(i, !selected); } } } } void updateSpectrumSelectionState(int row, int newState) { if (newState == TristateCheckBox.STATE_MIXED) { if (numbersOfSelectedBands.get(row) == bandSelectionStates.get(row).size() || numbersOfSelectedBands.get(row) == 0) { newState = TristateCheckBox.STATE_UNSELECTED; } } currentStates.set(row, newState); } private void updateNumberOfSelectedBands(Boolean selected, int row) { if (currentStates.get(row) == TristateCheckBox.STATE_MIXED) { if (selected) { numbersOfSelectedBands.set(row, numbersOfSelectedBands.get(row) + 1); } else { numbersOfSelectedBands.set(row, numbersOfSelectedBands.get(row) - 1); } } else { if (selected) { numbersOfSelectedBands.set(row, 1); } else { numbersOfSelectedBands.set(row, bandSelectionStates.get(row).size() - 1); } } } }