View Javadoc
1   package org.opentrafficsim.editor.render;
2   
3   import java.awt.Component;
4   import java.util.Optional;
5   import java.util.function.Supplier;
6   
7   import javax.swing.JLabel;
8   import javax.swing.JTable;
9   import javax.swing.UIManager;
10  import javax.swing.border.Border;
11  import javax.swing.border.EmptyBorder;
12  import javax.swing.border.LineBorder;
13  import javax.swing.table.TableCellRenderer;
14  
15  import org.opentrafficsim.editor.OtsEditor;
16  import org.opentrafficsim.editor.XsdTreeNode;
17  import org.opentrafficsim.editor.XsdTreeTableModel;
18  
19  import de.javagl.treetable.JTreeTable;
20  
21  /**
22   * Renderer for columns in the tree table.
23   * <p>
24   * Copyright (c) 2023-2026 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
25   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
26   * </p>
27   * @author Wouter Schakel
28   */
29  public class StringCellRenderer extends JLabel implements TableCellRenderer
30  {
31  
32      /** Serialization version UID. */
33      private static final long serialVersionUID = 20230218L;
34  
35      /** Tree table. */
36      private final JTreeTable treeTable;
37  
38      /**
39       * Constructor.
40       * @param treeTable tree table.
41       */
42      public StringCellRenderer(final JTreeTable treeTable)
43      {
44          this.treeTable = treeTable;
45          setOpaque(true);
46      }
47  
48      @Override
49      public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected,
50              final boolean hasFocus, final int row, final int column)
51      {
52          setFont(table.getFont());
53          int treeColumn = this.treeTable.convertColumnIndexToView(XsdTreeTableModel.TREE_COLUMN); // columns may be moved
54          int idColumn = this.treeTable.convertColumnIndexToView(XsdTreeTableModel.ID_COLUMN);
55          int valueColumn = this.treeTable.convertColumnIndexToView(XsdTreeTableModel.VALUE_COLUMN);
56          XsdTreeNode node = (XsdTreeNode) this.treeTable.getValueAt(row, treeColumn);
57          String val = value == null ? null : value.toString();
58          boolean defaultValue = false;
59          if (val == null)
60          {
61              Supplier<Optional<String>> def;
62              if (column == idColumn)
63              {
64                  val = node.getAttributeValueOrDefault("Id");
65                  def = () -> node.getDefaultAttributeValue(node.getAttributeIndexByName("Id"));
66              }
67              else if (column == valueColumn)
68              {
69                  val = node.getValue();
70                  def = () -> node.getDefaultValue();
71              }
72              else
73              {
74                  val = "";
75                  def = () -> Optional.empty();
76              }
77              if (val == null)
78              {
79                  Optional<String> defaultVal = def.get();
80                  val = defaultVal.orElse("");
81                  defaultValue = defaultVal.isPresent();
82              }
83          }
84          setText(val);
85          setForeground(defaultValue ? OtsEditor.getInactiveColor() : UIManager.getColor("Table.foreground"));
86          String message = node.isSelfValid() ? null : (column == idColumn ? node.reportInvalidId().orElse(null)
87                  : (column == valueColumn ? node.reportInvalidValue().orElse(null) : null));
88          if (this.treeTable.isCellEditable(row, column))
89          {
90              if (message != null)
91              {
92                  setToolTipText(OtsEditor.limitTooltip(message));
93                  setBackground(OtsEditor.getInvalidColor());
94              }
95              else
96              {
97                  setToolTipText(
98                          OtsEditor.limitTooltip(!val.isEmpty() && (column == idColumn || column == valueColumn) ? val : null));
99                  boolean expression =
100                         column == idColumn ? node.idIsExpression() : (column == valueColumn ? node.valueIsExpression() : false);
101                 if (expression)
102                 {
103                     setBackground(OtsEditor.getExpressionColor());
104                 }
105                 else
106                 {
107                     setBackground(isSelected ? UIManager.getColor("Table.selectionBackground")
108                             : UIManager.getColor("Table.background"));
109                 }
110             }
111         }
112         else
113         {
114             setToolTipText(null);
115             setBackground(
116                     isSelected ? UIManager.getColor("Table.selectionBackground") : UIManager.getColor("Table.background"));
117         }
118 
119         Border border;
120         if (this.treeTable.isCellEditable(row, column))
121         {
122             border = new LineBorder(UIManager.getColor("Table.gridColor"));
123         }
124         else
125         {
126             border = new EmptyBorder(0, 0, 0, 0);
127         }
128         setBorder(border);
129 
130         return this;
131     }
132 
133 }