package org.esa.snap.rcp.metadata; import org.netbeans.swing.outline.DefaultOutlineCellRenderer; import org.openide.awt.HtmlRenderer; import org.openide.nodes.Node.Property; import org.openide.util.Exceptions; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import java.awt.Color; import java.awt.Component; import java.lang.reflect.InvocationTargetException; /** * @author https://jnkjava.wordpress.com/2011/11/28/recipe-7-how-do-i-decorate-a-read-only-outlineview/ */ class MetadataOutlineCellRenderer extends DefaultOutlineCellRenderer { /** * Gray Color for the odd lines in the view. */ private static final Color VERY_LIGHT_GRAY = new Color(236, 236, 236); /** * Highlight the non editable cells making the foreground lighter. */ @Override @SuppressWarnings("unchecked") public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) { Component cell = null; Object valueToDisplay = value; if (value instanceof Property) { try { valueToDisplay = ((Property) value).getValue(); } catch (IllegalAccessException | InvocationTargetException ex) { Exceptions.printStackTrace(ex); } } if (valueToDisplay != null) { TableCellRenderer renderer = table.getDefaultRenderer(valueToDisplay.getClass()); if (renderer != null) { cell = renderer.getTableCellRendererComponent(table, valueToDisplay, isSelected, hasFocus, row, column); } } else { cell = super.getTableCellRendererComponent(table, valueToDisplay, isSelected, hasFocus, row, column); } if (cell != null) { if (cell instanceof HtmlRenderer.Renderer) { ((HtmlRenderer.Renderer) cell).setIndent(5); } else if (cell instanceof DefaultTableCellRenderer.UIResource) { ((UIResource) cell).setHorizontalAlignment(JLabel.LEFT); } Color foregroundColor = table.getForeground(); cell.setForeground(foregroundColor); cell.setBackground(row % 2 == 0 ? Color.WHITE : VERY_LIGHT_GRAY); if (isSelected) { cell.setBackground(table.getSelectionBackground()); } } return cell; } }