1   /*
2    *  Copyright (c) 1998-2005, The University of Sheffield.
3    *
4    *  This file is part of GATE (see http://gate.ac.uk/), and is free
5    *  software, licenced under the GNU Library General Public License,
6    *  Version 2, June 1991 (in the distribution as file licence.html,
7    *  and also available at http://gate.ac.uk/gate/licence.html).
8    *
9    *  Valentin Tablan 23/01/2001
10   *
11   *  $Id: FeaturesEditor.java,v 1.17 2005/01/11 13:51:34 ian Exp $
12   *
13   */
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    }// FeaturesEditor()
39  
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.setIntercellSpacing(new Dimension(5,5));
49      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    }// protected void initGuiComponents()
95  
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   }// public void setFeatureBearer(FeatureBearer newResource)
140 
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   }//public void setResource(Resource resource)
150 
151   public void setHandle(Handle handle){
152     //NOP
153   }
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     }//public String getColumnName(int columnIndex)
186 
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     }// public boolean isCellEditable
204 
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     }// public Object getValueAt
223 
224     public void setValueAt(Object aValue,
225                        int rowIndex,
226                        int columnIndex){
227 
228       if(columnIndex == 0) {
229         //the name of the feature changed
230         //if the name is null or empty the feature will be deleted
231         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         //the value of a feature changed
238         features.put(getValueAt(rowIndex, 0), aValue);
239       }
240       fireTableDataChanged();
241     }// public void setValueAt
242 
243   }///class FeaturesTableModel extends DefaultTableModel
244 /*
245   class FeaturesTableRenderer extends DefaultTableCellRenderer{
246     public Component getTableCellRendererComponent(JTable table,
247                                                    Object value,
248                                                    boolean isSelected,
249                                                    boolean hasFocus,
250                                                    int row,
251                                                    int column){
252 
253       super.getTableCellRendererComponent(table, value, false, hasFocus,
254                                           row, column);
255       setEnabled(table.isCellEditable(row, column));
256       return this;
257     }
258 
259   }// class FeaturesTableRenderer
260 */
261 }// class FeaturesEditor