package org.esa.snap.rcp.statistics;
import org.esa.snap.core.datamodel.RasterDataNode;
import org.esa.snap.ui.io.TableModelCsvEncoder;
import org.esa.snap.ui.tool.ToolButtonFactory;
import org.openide.windows.TopComponent;
import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Enumeration;
public class TableViewPagePanel extends PagePanel {
private JTable table;
private final Icon iconForSwitchToChartButton;
public TableViewPagePanel(TopComponent topComponent, String helpId, String titlePrefix, Icon iconForSwitchToChartButton) {
super(topComponent, helpId, titlePrefix);
this.iconForSwitchToChartButton = iconForSwitchToChartButton;
}
@Override
protected void initComponents() {
final AbstractButton switchToChartButton = ToolButtonFactory.createButton(iconForSwitchToChartButton, false);
switchToChartButton.setToolTipText("Switch to Chart View");
switchToChartButton.setName("switchToChartButton");
switchToChartButton.setEnabled(hasAlternativeView());
switchToChartButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showAlternativeView();
}
});
final JPanel buttonPanel = new JPanel(new BorderLayout());
buttonPanel.add(switchToChartButton, BorderLayout.NORTH);
buttonPanel.add(getHelpButton(), BorderLayout.SOUTH);
add(buttonPanel, BorderLayout.EAST);
table = new JTable();
table.removeEditor();
table.setGridColor(Color.LIGHT_GRAY.brighter());
table.addMouseListener(new PagePanel.PopupHandler());
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
final JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
}
@Override
protected void updateComponents() {
}
@Override
protected String getDataAsText() {
final StringWriter writer = new StringWriter();
try {
new TableModelCsvEncoder(table.getModel()).encodeCsv(writer);
writer.close();
} catch (IOException ignore) {
}
return writer.toString();
}
@Override
protected void showAlternativeView() {
super.showAlternativeView();
final PagePanel alternativeView = getAlternativeView();
alternativeView.handleLayerContentChanged();
final RasterDataNode raster = alternativeView.getRaster();
alternativeView.setRaster(null);
alternativeView.setRaster(raster);
alternativeView.handleNodeSelectionChanged();
}
void setModel(TableModel tableModel) {
table.setModel(tableModel);
if (table.getColumnCount() > 0) {
final JTableHeader tableHeader = table.getTableHeader();
final int margin = tableHeader.getColumnModel().getColumnMargin();
final TableCellRenderer renderer = tableHeader.getDefaultRenderer();
final Enumeration<TableColumn> columns = table.getColumnModel().getColumns();
while (columns.hasMoreElements()) {
TableColumn tableColumn = columns.nextElement();
final int width = getColumnMinWith(tableColumn, renderer, margin);
tableColumn.setMinWidth(width);
}
}
}
private int getColumnMinWith(TableColumn column, TableCellRenderer renderer, int margin) {
final Object headerValue = column.getHeaderValue();
final JLabel label = (JLabel) renderer.getTableCellRendererComponent(table, headerValue, false, false, 0, 0);
return label.getPreferredSize().width + margin;
}
}