source: domaineditor/src/main/java/geniusweb/domaineditor/panels/BidEditorPanel.java@ 49

Last change on this file since 49 was 49, checked in by bart, 2 years ago

Domaineditor released.

File size: 4.7 KB
Line 
1package geniusweb.domaineditor.panels;
2
3import java.awt.BorderLayout;
4import java.awt.Component;
5import java.util.EventObject;
6import java.util.LinkedList;
7import java.util.List;
8
9import javax.swing.JPanel;
10import javax.swing.JScrollPane;
11import javax.swing.JTable;
12import javax.swing.ListSelectionModel;
13import javax.swing.event.CellEditorListener;
14import javax.swing.event.TableModelEvent;
15import javax.swing.event.TableModelListener;
16import javax.swing.table.TableCellEditor;
17import javax.swing.table.TableCellRenderer;
18import javax.swing.table.TableModel;
19
20import geniusweb.domaineditor.model.BidModel;
21import tudelft.utilities.mvc.model.MapModel;
22import tudelft.utilities.mvc.model.Model;
23import tudelft.utilities.mvc.model.SelectionModel;
24import tudelft.utilities.mvc.model.StringModel;
25import tudelft.utilities.mvc.panels.PanelFactory;
26
27/**
28 * Panel ot edit Bids. This is not a standard MapModelPanel because the issues
29 * and values are not directly editable; rather the user can only pick existing
30 * values.
31 *
32 */
33public class BidEditorPanel extends JPanel {
34
35 public BidEditorPanel(BidModel model) {
36 setLayout(new BorderLayout());
37 MyTableModel jtablemodel = new MyTableModel(model);
38 JTable table = new JTable(jtablemodel);
39 table.setDefaultRenderer(Object.class, new TableCellRenderer() {
40
41 @Override
42 public Component getTableCellRendererComponent(JTable table,
43 Object value, boolean isSelected, boolean hasFocus, int row,
44 int column) {
45 return (Component) value;
46 }
47 });
48 table.setDefaultEditor(Object.class, new TableCellEditor() {
49 private List<CellEditorListener> listeners = new LinkedList<>();
50
51 @Override
52 public Object getCellEditorValue() {
53 return null;
54 }
55
56 @Override
57 public boolean isCellEditable(EventObject anEvent) {
58 return true;
59 }
60
61 @Override
62 public boolean shouldSelectCell(EventObject anEvent) {
63 return true;
64 }
65
66 @Override
67 public boolean stopCellEditing() {
68 for (CellEditorListener l : listeners)
69 l.editingStopped(null);
70 return true;
71 }
72
73 @Override
74 public void cancelCellEditing() {
75 for (CellEditorListener l : listeners)
76 l.editingStopped(null);
77 }
78
79 @Override
80 public void addCellEditorListener(CellEditorListener l) {
81 listeners.add(l);
82 }
83
84 @Override
85 public void removeCellEditorListener(CellEditorListener l) {
86 listeners.remove(l);
87 }
88
89 @Override
90 public Component getTableCellEditorComponent(JTable table,
91 Object value, boolean isSelected, int row, int column) {
92 // only column 2 is editable so this must be a combo selector
93 return (Component) value;
94 }
95
96 });
97 table.setRowSelectionAllowed(true);
98 table.setCellSelectionEnabled(false);
99 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
100 table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
101 add(new JScrollPane(table), BorderLayout.CENTER);
102 }
103}
104
105/**
106 * The list is actually shown in a {@link JTable}. This maps our TableModel into
107 * something JTable can digest.
108 *
109 * @param <K> the key type
110 * @param <V> the value type
111 */
112class MyTableModel<K extends Model, V extends Model> implements TableModel {
113 private final PanelFactory panelfactory;
114
115 private final MapModel<StringModel, SelectionModel> issuevalues;
116 private List<TableModelListener> listeners = new LinkedList<>();
117
118 public MyTableModel(MapModel<StringModel, SelectionModel> issuevalues,
119 PanelFactory panelfactory) {
120 this.panelfactory = panelfactory;
121 this.issuevalues = issuevalues;
122 issuevalues.addListener((data) -> notifyListeners());
123 }
124
125 public MyTableModel(MapModel<StringModel, SelectionModel> issuevalues) {
126 this(issuevalues, new PanelFactory());
127 }
128
129 @Override
130 public int getRowCount() {
131 return issuevalues.getKeys().getSize();
132 }
133
134 @Override
135 public int getColumnCount() {
136 return 2;
137 }
138
139 @Override
140 public String getColumnName(int columnIndex) {
141 return columnIndex == 0 ? "issue" : "value";
142 }
143
144 @Override
145 public Class<?> getColumnClass(int columnIndex) {
146 return Component.class;
147 }
148
149 @Override
150 public boolean isCellEditable(int rowIndex, int columnIndex) {
151 return columnIndex == 1; // only values can be edited
152 }
153
154 @Override
155 public Object getValueAt(int rowIndex, int columnIndex) {
156 StringModel key = issuevalues.getKeys().get(rowIndex);
157 return panelfactory
158 .create(columnIndex == 0 ? key : issuevalues.getValue(key));
159 }
160
161 @Override
162 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
163 }
164
165 @Override
166 public void addTableModelListener(TableModelListener l) {
167 listeners.add(l);
168 }
169
170 @Override
171 public void removeTableModelListener(TableModelListener l) {
172 listeners.remove(l);
173
174 }
175
176 private void notifyListeners() {
177 for (TableModelListener l : listeners) {
178 l.tableChanged(new TableModelEvent(this));
179 }
180 }
181
182}
Note: See TracBrowser for help on using the repository browser.