Source code: org/bdgp/apps/dagedit/gui/SynonymEditorComponent.java
1 package org.bdgp.apps.dagedit.gui;
2
3 import java.awt.*;
4 import java.awt.event.*;
5 import java.util.*;
6 import javax.swing.*;
7 import javax.swing.border.*;
8 import org.bdgp.util.*;
9 import org.bdgp.swing.*;
10 import org.bdgp.swing.event.*;
11 import org.bdgp.apps.dagedit.datamodel.*;
12
13 public class SynonymEditorComponent extends JPanel implements GenericEditorComponent {
14
15 JTextField textField;
16 JLabel idField;
17 Object obj;
18 ListEditor editor;
19 DragList referenceList;
20 Controller controller;
21 JLabel referenceLabel;
22 JButton referenceButton;
23
24 Vector references = new Vector();
25
26 Border lineBorder = new LineBorder(Color.black);
27
28 DropListener dropListener = new DropAdapter() {
29 public boolean allowDrop(DragEvent e) {
30 if (e.getData() instanceof Vector) {
31 Vector v = (Vector) e.getData();
32 for(int i=0; i < v.size(); i++) {
33 if (!(v.elementAt(i) instanceof Dbxref))
34 return false;
35 }
36 return true;
37 } else if (e.getData() instanceof Object []) {
38 Object [] v = (Object []) e.getData();
39 for(int i=0; i < v.length; i++) {
40 if (!(v[i] instanceof Dbxref))
41 return false;
42 }
43 return true;
44 }
45 return false;
46 }
47
48 public void dragEnter(DragEvent e) {
49 referenceList.setBorder(lineBorder);
50 }
51
52 public void dragExit(DragEvent e) {
53 referenceList.setBorder(null);
54 }
55
56 public void drop(DragEvent e) {
57 referenceList.setBorder(null);
58 if (e.getData() instanceof Vector) {
59 Vector v = (Vector) e.getData();
60 for(int i=0; i < v.size(); i++) {
61 Dbxref s = (Dbxref) ((Dbxref) v.elementAt(i)).clone();
62 s.setType(Dbxref.SYNONYM);
63 if (!references.contains(s)) {
64 references.addElement(s);
65 referenceList.setListData(references);
66 }
67 }
68 } else if (e.getData() instanceof Object []) {
69 Object [] v = (Object []) e.getData();
70 for(int i=0; i < v.length; i++) {
71 Dbxref s = (Dbxref) ((Dbxref) v[i]).clone();
72 s.setType(Dbxref.SYNONYM);
73 if (!references.contains(s)) {
74 references.addElement(s);
75 referenceList.setListData(references);
76 }
77 }
78 }
79 }
80 };
81
82 public SynonymEditorComponent(Controller controller) {
83 this.controller = controller;
84 setFont(controller.getDefaultFont());
85 textField = new JTextField();
86 idField = new JLabel("<not displayed>");
87 referenceList = new DragList(controller.getDragController());
88 referenceLabel = new JLabel("DbXrefs");
89 referenceButton = new JButton("Edit");
90
91 referenceList.setPreferredSize(new Dimension(40,100));
92 referenceList.setMinimumSize(new Dimension(40,100));
93 referenceLabel.setFont(getFont());
94 referenceButton.setFont(getFont());
95 textField.setFont(getFont());
96 textField.setMaximumSize(new Dimension(Integer.MAX_VALUE, 16));
97
98 initGUI();
99 attachListeners();
100 }
101
102 public void showDbxrefEditor() {
103 JTextArea noDbxLabel = new JTextArea("Select a dbxref from the list "+
104 "to edit it, or press add to "+
105 "create a new dbxref");
106 noDbxLabel.setOpaque(false);
107 noDbxLabel.setFont(controller.getDefaultFont());
108 noDbxLabel.setDisabledTextColor(idField.getForeground());
109 noDbxLabel.setLineWrap(true);
110 noDbxLabel.setWrapStyleWord(true);
111 noDbxLabel.setEditable(false);
112 noDbxLabel.setEnabled(false);
113
114 final JDialog dialog =
115 new JDialog((Frame) null, "Edit synonym dbxrefs",
116 true);
117 dialog.setFont(controller.getDefaultFont());
118 final ListEditor editor = new
119 ListEditor(new DbxrefEditorComponent(controller,
120 Dbxref.SYNONYM),
121 noDbxLabel,
122 references,
123 false,
124 true,
125 true,
126 true,
127 false);
128 editor.setOpaque(false);
129 editor.setPreferredSize(new Dimension(300,200));
130 editor.setFont(controller.getDefaultFont());
131 editor.setDragController(controller.getDragController());
132 editor.setButtonColor(Preferences.defaultButtonColor());
133
134 JButton okButton = new JButton("Ok");
135 okButton.setFont(controller.getDefaultFont());
136 okButton.setBackground(Preferences.defaultButtonColor());
137
138 okButton.addActionListener(new ActionListener() {
139 public void actionPerformed(ActionEvent e) {
140 editor.commit();
141 dialog.setVisible(false);
142 }
143 });
144
145 Box buttonPanel = Box.createHorizontalBox();
146 buttonPanel.add(Box.createHorizontalGlue());
147 buttonPanel.add(okButton);
148 buttonPanel.add(Box.createHorizontalGlue());
149
150 JPanel panel = new JPanel();
151 panel.setLayout(new BorderLayout());
152 panel.add(editor, "North");
153 panel.add(buttonPanel, "South");
154 panel.setBackground(Preferences.defaultBackgroundColor());
155
156 dialog.setContentPane(panel);
157 dialog.pack();
158 dialog.show();
159
160 referenceList.setListData(references);
161 }
162
163 public void setMasterComponent(Component c) {
164 if (c instanceof ListEditor)
165 editor = (ListEditor) c;
166 }
167
168 public void initGUI() {
169 setLayout(new BorderLayout());
170
171 JPanel textPanel = new JPanel();
172 textPanel.setLayout(new BoxLayout(textPanel,
173 BoxLayout.Y_AXIS));
174 textPanel.setOpaque(false);
175
176 referenceButton.
177 setPreferredSize(new Dimension((int) referenceButton.
178 getPreferredSize().getWidth(),
179 referenceButton.getFont().
180 getSize()));
181 referenceButton.setBackground(Preferences.defaultButtonColor());
182
183 JPanel referenceBox = new JPanel();
184 referenceBox.setOpaque(false);
185 referenceBox.setLayout(new BoxLayout(referenceBox, BoxLayout.X_AXIS));
186 referenceBox.add(referenceLabel);
187 referenceBox.add(Box.createHorizontalGlue());
188 referenceBox.add(referenceButton);
189
190 JLabel textLabel = new JLabel("Synonym text");
191 textLabel.setFont(getFont());
192 textPanel.add(textLabel);
193 textPanel.add(textField);
194 textPanel.add(Box.createVerticalStrut(5));
195 textPanel.add(idField);
196 textPanel.add(Box.createVerticalStrut(5));
197 textPanel.add(referenceBox);
198
199 referenceBox.setAlignmentX(LEFT_ALIGNMENT);
200 idField.setAlignmentX(LEFT_ALIGNMENT);
201 textField.setAlignmentX(LEFT_ALIGNMENT);
202 textLabel.setAlignmentX(LEFT_ALIGNMENT);
203 textPanel.setAlignmentX(LEFT_ALIGNMENT);
204 referenceButton.setAlignmentX(LEFT_ALIGNMENT);
205 referenceList.setAlignmentX(LEFT_ALIGNMENT);
206 referenceLabel.setAlignmentX(LEFT_ALIGNMENT);
207
208 referenceList.setFont(getFont());
209
210 JScrollPane referencePane =
211 new JScrollPane(referenceList,
212 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
213 JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
214
215 add(textPanel, "North");
216 add(referencePane, "Center");
217 setOpaque(false);
218 }
219
220 protected void deleteSelectedReferences() {
221 Object [] selected = referenceList.getSelectedValues();
222 for(int i=0; i < selected.length; i++) {
223 references.removeElement(selected[i]);
224 }
225 referenceList.setListData(references);
226 }
227
228 public void attachListeners() {
229 textField.addActionListener(new ActionListener () {
230 public void actionPerformed(ActionEvent e) {
231 commit();
232 }
233 });
234 controller.getDragController().
235 registerDropTarget(new DropTarget(referenceList, dropListener));
236 referenceList.registerKeyboardAction(new ActionListener() {
237 public void actionPerformed(ActionEvent e) {
238 deleteSelectedReferences();
239 }
240 },
241 KeyStroke.
242 getKeyStroke(KeyEvent.VK_DELETE,
243 0),
244 WHEN_FOCUSED);
245 referenceButton.addActionListener(new ActionListener() {
246 public void actionPerformed(ActionEvent e) {
247 showDbxrefEditor();
248 }
249 });
250 }
251
252 public void commit() {
253 editor.doStore(obj);
254 editor.refresh();
255 }
256
257 public void store(Object in) {
258 Synonym syn = (Synonym) in;
259 syn.setText(textField.getText());
260 syn.setDbxrefs(references);
261 }
262 public Object createNewValue() {
263 return new Synonym("<new synonym>");
264 }
265
266 public void load(Object in) {
267 obj = in;
268 textField.setText(((Synonym) in).getText());
269 String id = ((Synonym) in).getID();
270 if (id != null && id.length() > 0)
271 idField.setText(id);
272 else
273 idField.setText("");
274 references = ((Synonym) in).getDbxrefs();
275
276 referenceList.setListData(references);
277 revalidate();
278 }
279 }