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