1
14
15 package gate.gui;
16
17 import java.awt.BorderLayout;
18 import java.awt.Dimension;
19 import java.awt.event.ActionEvent;
20 import java.awt.event.ActionListener;
21 import java.util.*;
22
23 import javax.swing.*;
24 import javax.swing.table.AbstractTableModel;
25
26 import gate.Factory;
27 import gate.FeatureMap;
28 import gate.creole.AbstractVisualResource;
29 import gate.swing.XJTable;
30 import gate.util.FeatureBearer;
31
32 public class FeaturesEditor extends AbstractVisualResource{
33
34 public FeaturesEditor() {
35 initLocalData();
36 initGuiComponents();
37 initListeners();
38 }
40 protected void initLocalData(){
41 features = Factory.newFeatureMap();
42 }
43
44 protected void initGuiComponents(){
45 this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
46 tableModel = new FeaturesTableModel();
47 table = new XJTable(tableModel);
48 table.setDefaultRenderer(String.class, new ObjectRenderer());
50 table.setDefaultRenderer(Object.class, new ObjectRenderer());
51
52 DefaultCellEditor editor = new DefaultCellEditor(new JTextField());
53 editor.setClickCountToStart(0);
54 table.setDefaultEditor(String.class, editor);
55 table.setDefaultEditor(Object.class, editor);
56
57 JScrollPane scroll = new JScrollPane(table);
58 this.add(scroll, BorderLayout.CENTER);
59 this.add(Box.createVerticalStrut(5));
60
61 Box box = Box.createHorizontalBox();
62 newFeatureField = new JTextField(10);
63 newFeatureField.setMaximumSize(new Dimension(Integer.MAX_VALUE,
64 newFeatureField.
65 getPreferredSize().height));
66
67 Box vBox = Box.createVerticalBox();
68 vBox.add(new JLabel("New feature name"));
69 vBox.add(newFeatureField);
70 box.add(vBox);
71 box.add(Box.createHorizontalStrut(5));
72
73 newValueField = new JTextField(10);
74 newValueField.setMaximumSize(new Dimension(Integer.MAX_VALUE,
75 newValueField.
76 getPreferredSize().height));
77
78 vBox = Box.createVerticalBox();
79 vBox.add(new JLabel("New feature value"));
80 vBox.add(newValueField);
81 box.add(vBox);
82 box.add(Box.createHorizontalStrut(5));
83
84 addNewBtn = new JButton("Add feature");
85 box.add(addNewBtn);
86 box.add(Box.createHorizontalStrut(5));
87
88 delBtn = new JButton("Delete");
89 box.add(delBtn);
90
91 this.add(box);
92 this.add(Box.createVerticalGlue());
93
94 }
96 protected void initListeners(){
97 addNewBtn.addActionListener(new ActionListener() {
98 public void actionPerformed(ActionEvent e) {
99 String name = newFeatureField.getText();
100 String value = newValueField.getText();
101 if(name != null){
102 features.put(name, value);
103 tableModel.fireTableDataChanged();
104 newFeatureField.setText("");
105 newValueField.setText("");
106 }
107 }
108 });
109
110 delBtn.addActionListener(new ActionListener() {
111 public void actionPerformed(ActionEvent e) {
112 String name = newFeatureField.getText();
113 String value = newValueField.getText();
114 if(name != null){
115 features.remove(name);
116 tableModel.fireTableDataChanged();
117 newFeatureField.setText("");
118 newValueField.setText("");
119 }
120 }
121 });
122 }
123
124 public void cleanup(){
125 super.cleanup();
126 features = null;
127 resource = null;
128 }
129
130 public void setFeatureBearer(FeatureBearer newResource) {
131 if(newResource == null){
132 resource = null;
133 features = null;
134 }else{
135 resource = newResource;
136 features = resource.getFeatures();
137 }
138 tableModel.fireTableDataChanged();
139 }
141 public void setTarget(Object target) {
142 if(target == null || target instanceof FeatureBearer){
143 setFeatureBearer((FeatureBearer)target);
144 }else{
145 throw new IllegalArgumentException(
146 "FeatureEditors can only be used with FeatureBearer!\n" +
147 target.getClass().toString() + " is not a FeatureBearer!");
148 }
149 }
151 public void setHandle(Handle handle){
152 }
154
155
156 public FeatureBearer getFeatureBearer() {
157 return resource;
158 }
159
160 XJTable table;
161 FeaturesTableModel tableModel;
162 private FeatureBearer resource;
163 FeatureMap features;
164 JTextField newFeatureField;
165 JTextField newValueField;
166
167 JButton addNewBtn;
168 JButton delBtn;
169
170 class FeaturesTableModel extends AbstractTableModel{
171 public int getColumnCount(){
172 return 2;
173 }
174
175 public int getRowCount(){
176 return features == null ? 0 : features.size();
177 }
178
179 public String getColumnName(int columnIndex){
180 switch(columnIndex){
181 case 0: return "Feature";
182 case 1: return "Value";
183 default: return "?";
184 }
185 }
187 public Class getColumnClass(int columnIndex){
188 switch(columnIndex){
189 case 0: return String.class;
190 case 1: return Object.class;
191 default: return Object.class;
192 }
193 }
194
195 public boolean isCellEditable(int rowIndex,
196 int columnIndex){
197 if(features == null) return false;
198 return rowIndex == features.size()
199 ||
200 ((!((String)table.getModel().getValueAt(rowIndex, 0)).
201 startsWith("gate."))
202 );
203 }
205 public Object getValueAt(int rowIndex,
206 int columnIndex){
207 if(features == null) return null;
208 List keys = new ArrayList(features.keySet());
209 Collections.sort(keys);
210 Object key = keys.get(rowIndex);
211 switch(columnIndex){
212 case 0:{
213 return key;
214 }
215 case 1:{
216 return features.get(key) == null ? "" : features.get(key).toString();
217 }
218 default:{
219 return null;
220 }
221 }
222 }
224 public void setValueAt(Object aValue,
225 int rowIndex,
226 int columnIndex){
227
228 if(columnIndex == 0) {
229 String oldName = (String)getValueAt(rowIndex, 0);
232 Object oldValue = features.remove(oldName);
233 if(aValue != null && !aValue.equals("")){
234 features.put(aValue, oldValue);
235 }
236 } else {
237 features.put(getValueAt(rowIndex, 0), aValue);
239 }
240 fireTableDataChanged();
241 }
243 }
261 }