1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package com.mindtree.techworks.insight.gui.renderers;
25
26 import java.awt.Component;
27 import java.awt.Color;
28 import java.awt.Graphics;
29
30 import javax.swing.Icon;
31 import javax.swing.JLabel;
32 import javax.swing.JTable;
33 import javax.swing.table.TableCellRenderer;
34
35 import com.mindtree.techworks.insight.model.LogEventTableModel;
36 import com.mindtree.techworks.insight.model.ModelDataSorter;
37
38
39
40
41
42
43
44
45
46
47 public class SortableHeaderRenderer implements TableCellRenderer {
48
49
50
51
52 private TableCellRenderer tableCellRenderer;
53
54 public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) {
55 this.tableCellRenderer = tableCellRenderer;
56 }
57
58
59
60
61
62 public Component getTableCellRendererComponent(JTable table,
63 Object value,
64 boolean isSelected,
65 boolean hasFocus,
66 int row,
67 int column) {
68 Component component = tableCellRenderer.getTableCellRendererComponent(table,
69 value, isSelected, hasFocus, row, column);
70 if (component instanceof JLabel) {
71 JLabel label = (JLabel)component;
72 label.setHorizontalTextPosition(JLabel.LEFT);
73 int modelColumn = table.convertColumnIndexToModel(column);
74 label.setIcon(getHeaderRendererIcon(table, modelColumn, label.getFont().getSize()));
75 }
76 return component;
77 }
78
79
80
81
82
83 private Icon getHeaderRendererIcon(JTable table, int column, int size) {
84 LogEventTableModel tableModel = (LogEventTableModel)table.getModel();
85 int sortOrder = tableModel.getSortOrder(column);
86 return (sortOrder == ModelDataSorter.NOTSORTED ? null : new Arrow(sortOrder == ModelDataSorter.DESCENDING, size));
87 }
88
89
90
91
92
93 private static class Arrow implements Icon {
94 private boolean descending;
95 private int size;
96
97
98
99
100
101
102
103 public Arrow(boolean descending, int size) {
104 this.descending = descending;
105 this.size = size;
106 }
107
108
109
110
111
112 public void paintIcon(Component c, Graphics g, int x, int y) {
113 Color color = c == null ? Color.GRAY : c.getBackground();
114 int dx = (int)(size/2);
115 int dy = descending ? dx : -dx;
116
117 y = y + 5*size/6 + (descending ? -dy : 0);
118 int shift = descending ? 1 : -1;
119 g.translate(x, y);
120
121
122 g.setColor(color.darker());
123 g.drawLine(dx / 2, dy, 0, 0);
124 g.drawLine(dx / 2, dy + shift, 0, shift);
125
126
127 g.setColor(color.brighter());
128 g.drawLine(dx / 2, dy, dx, 0);
129 g.drawLine(dx / 2, dy + shift, dx, shift);
130
131
132 if (descending) {
133 g.setColor(color.darker().darker());
134 } else {
135 g.setColor(color.brighter().brighter());
136 }
137 g.drawLine(dx, 0, 0, 0);
138
139 g.setColor(color);
140 g.translate(-x, -y);
141 }
142
143
144
145
146
147 public int getIconWidth() {
148 return size;
149 }
150
151
152
153
154
155 public int getIconHeight() {
156 return size;
157 }
158
159 }
160
161 }