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
23
24
25
26
27
28
29 public class StringCellRenderer extends JLabel implements TableCellRenderer
30 {
31
32
33 private static final long serialVersionUID = 20230218L;
34
35
36 private final JTreeTable treeTable;
37
38
39
40
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);
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 }