/*
* Copyright (C) 2010 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.colormanip;
import org.esa.snap.core.datamodel.ColorPaletteDef;
import org.esa.snap.core.datamodel.ImageInfo;
import org.esa.snap.core.datamodel.ProductNodeEvent;
import org.esa.snap.core.datamodel.RasterDataNode;
import org.esa.snap.ui.color.ColorTableCellEditor;
import org.esa.snap.ui.color.ColorTableCellRenderer;
import javax.swing.AbstractButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import java.awt.Color;
import java.awt.Component;
class Continuous1BandTabularForm implements ColorManipulationChildForm {
private static final String[] COLUMN_NAMES = new String[]{"Colour", "Value"};
private static final Class<?>[] COLUMN_TYPES = new Class<?>[]{Color.class, Double.class};
private final ColorManipulationForm parentForm;
private ImageInfoTableModel tableModel;
private JScrollPane contentPanel;
private final MoreOptionsForm moreOptionsForm;
private TableModelListener tableModelListener;
private final DiscreteCheckBox discreteCheckBox;
public Continuous1BandTabularForm(final ColorManipulationForm parentForm) {
this.parentForm = parentForm;
tableModel = new ImageInfoTableModel();
tableModelListener = e -> {
tableModel.removeTableModelListener(tableModelListener);
parentForm.applyChanges();
tableModel.addTableModelListener(tableModelListener);
};
moreOptionsForm = new MoreOptionsForm(this, parentForm.getFormModel().canUseHistogramMatching());
discreteCheckBox = new DiscreteCheckBox(parentForm);
moreOptionsForm.addRow(discreteCheckBox);
parentForm.getFormModel().modifyMoreOptionsForm(moreOptionsForm);
final JTable table = new JTable(tableModel);
table.setDefaultRenderer(Color.class, new ColorTableCellRenderer());
table.setDefaultEditor(Color.class, new ColorTableCellEditor());
table.getTableHeader().setReorderingAllowed(false);
table.getColumnModel().getColumn(0).setPreferredWidth(140);
table.getColumnModel().getColumn(1).setPreferredWidth(140);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
final JScrollPane tableScrollPane = new JScrollPane(table);
tableScrollPane.getViewport().setPreferredSize(table.getPreferredSize());
contentPanel = tableScrollPane;
}
@Override
public ColorManipulationForm getParentForm() {
return parentForm;
}
@Override
public void handleFormShown(FormModel formModel) {
updateFormModel(formModel);
tableModel.addTableModelListener(tableModelListener);
}
@Override
public void handleFormHidden(FormModel formModel) {
tableModel.removeTableModelListener(tableModelListener);
}
@Override
public void updateFormModel(FormModel formModel) {
tableModel.fireTableDataChanged();
discreteCheckBox.setDiscreteColorsMode(parentForm.getFormModel().getModifiedImageInfo().getColorPaletteDef().isDiscrete());
}
@Override
public void resetFormModel(FormModel formModel) {
tableModel.fireTableDataChanged();
}
@Override
public void handleRasterPropertyChange(ProductNodeEvent event, RasterDataNode raster) {
}
@Override
public Component getContentPanel() {
return contentPanel;
}
@Override
public AbstractButton[] getToolButtons() {
return new AbstractButton[0];
}
@Override
public MoreOptionsForm getMoreOptionsForm() {
return moreOptionsForm;
}
@Override
public RasterDataNode[] getRasters() {
return parentForm.getFormModel().getRasters();
}
private class ImageInfoTableModel extends AbstractTableModel {
private ImageInfoTableModel() {
}
public ImageInfo getImageInfo() {
return parentForm.getFormModel().getModifiedImageInfo();
}
@Override
public String getColumnName(int columnIndex) {
return COLUMN_NAMES[columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return COLUMN_TYPES[columnIndex];
}
public int getColumnCount() {
return COLUMN_NAMES.length;
}
@Override
public int getRowCount() {
if (getImageInfo() == null) {
return 0;
}
return getImageInfo().getColorPaletteDef().getNumPoints();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
final ColorPaletteDef.Point point = getImageInfo().getColorPaletteDef().getPointAt(rowIndex);
if (columnIndex == 0) {
final Color color = point.getColor();
return color.equals(ImageInfo.NO_COLOR) ? null : color;
} else if (columnIndex == 1) {
return point.getSample();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
final ColorPaletteDef.Point point = getImageInfo().getColorPaletteDef().getPointAt(rowIndex);
if (columnIndex == 0) {
final Color color = (Color) aValue;
point.setColor(color == null ? ImageInfo.NO_COLOR : color);
fireTableCellUpdated(rowIndex, columnIndex);
} else if (columnIndex == 1) {
point.setSample((Double) aValue);
fireTableCellUpdated(rowIndex, columnIndex);
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 0 || columnIndex == 1;
}
}
}