/* * Copyright (C) 2014 by Array Systems Computing Inc. http://www.array.ca * * 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.productlibrary.rcp.toolviews.model.dataprovider; import org.esa.snap.core.datamodel.MetadataElement; import org.esa.snap.core.datamodel.ProductData; import org.esa.snap.core.util.SystemUtils; import org.esa.snap.engine_utilities.datamodel.AbstractMetadata; import org.esa.snap.engine_utilities.db.ProductEntry; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.FontMetrics; import java.io.File; import java.text.DateFormat; import java.text.DecimalFormat; import java.util.Comparator; /** * Description of ProductPropertiesProvider */ public class PropertiesProvider implements DataProvider { private final DecimalFormat df = new DecimalFormat("#.##"); private final DateFormat dateFormat = ProductData.UTC.createDateFormat("dd-MMM-yyyy"); private static final String[] propertyLabels = new String[]{ "Name:", "Type:", "Acquired:", "File Format:" }; private final Comparator productPropertiesComparator; private TableColumn propertiesColumn; private final boolean minimalView; public PropertiesProvider(boolean minimalView) { this.minimalView = minimalView; this.productPropertiesComparator = new ProductPropertiesComparator(); } public Comparator getComparator() { return productPropertiesComparator; } public void cleanUp(final ProductEntry entry) { } public TableColumn getTableColumn() { if (propertiesColumn == null) { try { propertiesColumn = new TableColumn(); propertiesColumn.setResizable(true); propertiesColumn.setPreferredWidth(250); propertiesColumn.setHeaderValue("Product Properties"); propertiesColumn.setCellRenderer(new ProductPropertiesRenderer()); } catch (Throwable e) { SystemUtils.LOG.severe("PropertiesProvider: " + e.getMessage()); } } return propertiesColumn; } private class ProductPropertiesRenderer extends JTable implements TableCellRenderer { private final int ROW_HEIGHT = minimalView ? 34 : 68; private final JPanel centeringPanel = new JPanel(new BorderLayout()); private final Font valueFont, boldFont; public ProductPropertiesRenderer() { final DefaultTableModel dataModel = new DefaultTableModel(); dataModel.setColumnCount(1); setRowHeight(14); dataModel.setRowCount(propertyLabels.length); setModel(dataModel); valueFont = getFont().deriveFont(Font.PLAIN, 12); boldFont = valueFont.deriveFont(Font.BOLD); getColumnModel().getColumn(0).setCellRenderer(new PropertyValueCellRenderer(valueFont, boldFont)); //this.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); getTableHeader().setVisible(false); setShowHorizontalLines(false); setShowVerticalLines(false); } public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) { try { String[] values = null; String toolTip = ""; if (value instanceof ProductEntry) { final ProductEntry entry = (ProductEntry) value; final String pixelSpacing = df.format(entry.getRangeSpacing()) + " x " + df.format(entry.getAzimuthSpacing()) + " m"; final File file = entry.getFile(); final String fileSize = "(" + (entry.getFileSize() / (1024 * 1024)) + " MB)"; final String dateString = dateFormat.format(entry.getFirstLineTime().getAsDate()); String polStr = ""; final MetadataElement absRoot = entry.getMetadata(); if (absRoot != null) { final String pol1 = absRoot.getAttributeString(AbstractMetadata.mds1_tx_rx_polar); final String pol2 = absRoot.getAttributeString(AbstractMetadata.mds2_tx_rx_polar); final String pol3 = absRoot.getAttributeString(AbstractMetadata.mds3_tx_rx_polar); final String pol4 = absRoot.getAttributeString(AbstractMetadata.mds4_tx_rx_polar); polStr = pol1; if(!pol2.equals(AbstractMetadata.NO_METADATA_STRING)) polStr += ' ' + pol2; if(!pol3.equals(AbstractMetadata.NO_METADATA_STRING)) polStr += ' ' + pol3; if(!pol4.equals(AbstractMetadata.NO_METADATA_STRING)) polStr += ' ' + pol4; } if(minimalView) { values = new String[]{ entry.getName(), entry.getMission() + " " + entry.getProductType() + " " + entry.getPass() + " " + polStr +" " + dateString + " " + pixelSpacing, }; } else { values = new String[]{ entry.getName(), entry.getMission() + " " + entry.getProductType() + " " + entry.getPass() + " " + polStr, dateString + " " + pixelSpacing, entry.getFileFormat() + " " + fileSize }; } for (int i = 0; i < values.length; i++) { setValueAt(values[i], i, 0); } toolTip = file.getAbsolutePath(); } else if (value == null) { for (int i = 0; i < propertyLabels.length; i++) { setValueAt(null, i, 0); } } final Color backgroundColor; final Color foregroundColor; if (isSelected) { backgroundColor = table.getSelectionBackground(); foregroundColor = table.getSelectionForeground(); } else { backgroundColor = table.getBackground(); foregroundColor = table.getForeground(); } setForeground(foregroundColor); setBackground(backgroundColor); centeringPanel.setForeground(foregroundColor); centeringPanel.setBackground(backgroundColor); centeringPanel.setBorder(BorderFactory.createLineBorder(backgroundColor, 3)); centeringPanel.add(this, BorderLayout.CENTER); centeringPanel.setToolTipText(toolTip); adjustCellSize(table, row, column, values); } catch (Throwable e) { SystemUtils.LOG.severe("ProductPropertiesRenderer: " + e.getMessage()); } return centeringPanel; } private void adjustCellSize(JTable table, int row, int column, String[] values) { setRowHeight(table, row, ROW_HEIGHT); final int labelsLength = getMaxStringLength(propertyLabels, getFontMetrics(getFont())); int valuesLength = 50; if (values != null) { valuesLength = Math.min(200, getMaxStringLength(values, getFontMetrics(valueFont))); } int preferredWidth = labelsLength + valuesLength; final TableColumn valueColumn = table.getColumnModel().getColumn(column); final int valueColWidth = Math.max(valueColumn.getWidth(), preferredWidth); increasePreferredColumnWidth(valueColumn, valueColWidth); } private void increasePreferredColumnWidth(TableColumn column, int length) { if (column.getPreferredWidth() < length) { column.setPreferredWidth(length); } } private void setRowHeight(final JTable table, final int row, final int rowHeight) { final int currentRowHeight = table.getRowHeight(row); if (currentRowHeight < rowHeight) { table.setRowHeight(rowHeight); } } private int getMaxStringLength(final String[] strings, final FontMetrics fontMetrics) { int maxWidth = Integer.MIN_VALUE; for (String string : strings) { if (string == null) continue; final int width = SwingUtilities.computeStringWidth(fontMetrics, string); maxWidth = Math.max(width, maxWidth); } return maxWidth; } private class PropertyValueCellRenderer extends DefaultTableCellRenderer { private final Font font, boldFont; public PropertyValueCellRenderer(final Font font, final Font boldFont) { this.font = font; this.boldFont = boldFont; } @Override public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) { try { final JLabel jLabel = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (jLabel != null) { jLabel.setHorizontalAlignment(JLabel.LEFT); if (row == 0 && column == 0) jLabel.setFont(boldFont); else jLabel.setFont(font); return jLabel; } } catch (Throwable e) { SystemUtils.LOG.severe("PropertyValueCellRenderer: " + e.getMessage()); } return null; } } } private static class ProductPropertiesComparator implements Comparator { public int compare(final Object o1, final Object o2) { if (o1 == o2) { return 0; } if (o1 == null) { return -1; } else if (o2 == null) { return 1; } final ProductEntry s1 = (ProductEntry) o1; final ProductEntry s2 = (ProductEntry) o2; return s1.getName().compareTo(s2.getName()); } } }