Source code: org/bdgp/apps/dagedit/gui/DEEditorFrame.java
1 package org.bdgp.apps.dagedit.gui;
2
3 import javax.swing.*;
4 import javax.swing.undo.*;
5 import javax.swing.event.*;
6 import javax.swing.tree.*;
7 import javax.swing.border.*;
8 import java.awt.*;
9 import java.awt.event.*;
10 import java.util.*;
11
12 import org.bdgp.apps.dagedit.datamodel.*;
13 import org.bdgp.apps.dagedit.dataadapter.*;
14 import org.bdgp.apps.dagedit.gui.event.*;
15 import org.bdgp.apps.dagedit.*;
16 import java.awt.datatransfer.*;
17
18 import org.bdgp.swing.*;
19 import org.bdgp.swing.widget.*;
20 import org.bdgp.io.*;
21 import org.bdgp.util.*;
22
23 import java.io.*;
24
25 public class DEEditorFrame extends JFrame {
26
27 ListEditor listEditor;
28 Vector dags;
29 FindPanel findPanel;
30 JMenuBar menubar;
31
32 TermModel model;
33
34 JMenu pluginMenu;
35 JMenu changeMenu;
36
37 JMenu filterMenu;
38
39 JMenuItem undoItem;
40 JMenuItem redoItem;
41
42 JMenuItem exportClipboardToFileItem;
43 JMenuItem exportClipboardToTerminalItem;
44
45 JMenuItem deleteItem;
46 JMenuItem splitItem;
47 JMenuItem mergeItem;
48 JMenuItem addItem;
49
50 JMenuItem newItem;
51 JMenuItem loadItem;
52 JMenuItem saveItem;
53 JMenuItem saveAsItem;
54 JMenuItem configureItem;
55 JMenuItem importItem;
56 JMenuItem importAndTrimItem;
57 JMenuItem exportItem;
58 JMenuItem exitItem;
59
60 XMLLayoutPanel mainPanel;
61 DisabledPane disabledPane = new DisabledPane();
62
63 Vector launchingPlugins = new Vector();
64
65 DETermReloadListener dagReloadListener = new DETermReloadListener () {
66 public void reload(DETermReloadEvent e) {
67 reloadDAGs();
68 }
69 };
70
71 protected class DisabledPane extends JComponent {
72 public DisabledPane() {
73 setVisible(false);
74 setOpaque(false);
75 addMouseListener(new MouseAdapter() {});
76 }
77 /*
78 Color color = new Color(0,0,0,100);
79
80 public DisabledPane() {
81 setVisible(false);
82 addMouseListener(new MouseAdapter() {});
83 }
84
85 public void paint(Graphics g) {
86 g.setColor(color);
87 g.fillRect(0,0,getWidth(), getHeight());
88 }
89 */
90
91 public void paintImmediately() {
92 paintImmediately(new Rectangle(0,0,getWidth(), getHeight()));
93 }
94 };
95
96 protected ListSelectionListener listSelectionListener =
97 new ListSelectionListener() {
98 public void valueChanged(ListSelectionEvent e) {
99 Object o = listEditor.getSelectedItem();
100 Term term = (Term) o;
101 controller.fireSubSelect(new DESubSelectEvent(this,
102 term));
103 }
104 };
105
106
107 ComponentNameResolver resolver = new ComponentNameResolver() {
108 public Component resolveName(String id, Properties props) {
109 if (id.equals("DAG")) {
110 String str = props.getProperty("autoscroll");
111
112 boolean primary = (str == null ? false :
113 str.equals("true"));
114 return new
115 JScrollPane(buildEditorPanel(primary),
116 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
117 JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
118 } else if (id.equals("FIND"))
119 return findPanel;
120 else if (id.equals("TEXTEDIT"))
121 return listEditor;
122 else if (id.startsWith("plugin:")) {
123 String pluginname = id.substring("plugin:".length());
124 try {
125 // This method can leave invisible plugins
126 // active if they are not named in the new layout
127 // FIX THIS!
128 Class pluginClass = controller.getExtensionLoader().
129 loadClass(pluginname);
130 MultiProperties plugin_props = new MultiProperties();
131 plugin_props.load(new FileInputStream(controller.
132 getHistoryFilePath()));
133 plugin_props = plugin_props.
134 getProperties(pluginClass.getName());
135 final DEPlugin plugin = (DEPlugin)
136 pluginClass.newInstance();
137 plugin.setIsEmbedded(true);
138 plugin.setBorder(new TitledBorder(plugin.getName()));
139 plugin.setBackground(Preferences.
140 defaultBackgroundColor());
141 plugin.setController(controller);
142 plugin.init(plugin_props);
143 controller.firePluginActivate(new
144 DEPluginEvent(DEEditorFrame.this,
145 plugin));
146 return plugin;
147 } catch (Exception e) {
148 e.printStackTrace();
149 return new JButton(id);
150 }
151 } else
152 return new JButton(id);
153 }
154
155 public void startParseNotify() {
156 }
157
158 public void endParseNotify() {
159 }
160 };
161
162 XMLLayout xmllayout;
163
164 protected Controller controller;
165
166 private int [][] dimensionInfo = { {620,460,160},
167 {760,560,300},
168 {960,700,400}};
169
170 Box leftPluginBox;
171 Box rightPluginBox;
172 Box northPluginBox;
173 Box southPluginBox;
174
175 private class WindowCloser extends WindowAdapter {
176 public void windowClosing(WindowEvent e) {
177 dispose();
178 }
179
180 public void windowClosed(WindowEvent e) {
181 exit();
182 }
183 }
184
185 protected void reloadDAGs() {
186 Vector paths = new Vector();
187 for(int i=0; i < dags.size(); i++) {
188 DETermPanel dag = (DETermPanel) dags.get(i);
189 paths.add(dag.getExpandedPaths());
190 }
191 model.reload();
192 for(int i=0; i < dags.size(); i++) {
193 DETermPanel dag = (DETermPanel) dags.get(i);
194 TreePath [] pathArr = (TreePath []) paths.get(i);
195 dag.restorePaths(pathArr);
196 }
197 }
198
199 public void exit() {
200 Vector plugins = (Vector) controller.getActivePlugins().clone();
201 for(int i=0; i < plugins.size(); i++) {
202 DEPlugin plugin = (DEPlugin) plugins.elementAt(i);
203 plugin.writeProperties();
204 plugin.cleanup();
205 controller.firePluginDeactivate(new DEPluginEvent(this, plugin));
206 }
207 System.exit(0);
208 }
209
210 public Controller getController() {
211 return controller;
212 }
213
214 protected void exportClipboardToTerminal() {
215 Transferable trans = Toolkit.getDefaultToolkit().getSystemClipboard().
216 getContents(null);
217 try {
218 String data = (String) trans.
219 getTransferData(DataFlavor.stringFlavor);
220 System.out.println("************* Cliboard Contents *************");
221 System.out.println(data);
222 System.out.println("*********** End Cliboard Contents ***********");
223 } catch (Exception e) {
224 }
225 }
226
227 protected void exportClipboardToFile() {
228 Transferable trans = Toolkit.getDefaultToolkit().getSystemClipboard().
229 getContents(null);
230 try {
231 String data = (String) trans.
232 getTransferData(DataFlavor.stringFlavor);
233 JFileChooser chooser = new JFileChooser();
234 if (chooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
235 File file = chooser.getSelectedFile();
236 if (file.exists() &&
237 JOptionPane.showConfirmDialog(this,
238 "Overwrite file "+file,
239 "Overwrite file?",
240 JOptionPane.YES_NO_OPTION) !=
241 JOptionPane.YES_OPTION)
242 return;
243
244 PrintWriter writer = new PrintWriter(new FileWriter(file));
245 writer.println(data);
246 writer.close();
247 }
248 } catch (Exception e) {
249 JOptionPane.showMessageDialog(this,
250 "Could not save file because of "+
251 "exception "+e.getMessage());
252 }
253 }
254
255 protected DETermPanel buildEditorPanel(boolean primary) {
256 DETermPanel dag = new DETermPanel(controller, true);
257 dag.setModel(model);
258 dag.setScrollOnSelection(primary);
259 dag.setScrollsOnExpand(primary);
260 dags.add(dag);
261 return dag;
262 }
263
264 public void disable() {
265 disabledPane.setVisible(true);
266 disabledPane.paintImmediately();
267 }
268
269 public void enable() {
270 disabledPane.setVisible(false);
271 disabledPane.paintImmediately();
272 }
273
274 public DEEditorFrame() {
275 super("DAG-Edit version "+DAGEditor.getVersion());
276 controller = new Controller();
277 model = new TermModel(controller);
278 controller.addListener(dagReloadListener);
279 dags = new Vector();
280 setGlassPane(disabledPane);
281 disabledPane.setCursor(new Cursor(Cursor.WAIT_CURSOR));
282 setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
283 addWindowListener(new WindowCloser());
284 controller.
285 setHistory(new DEEditHistory(new Term("<placeholdernode>")));
286
287 setContentPane(controller.getDragPanel());
288
289 setBackground(Preferences.defaultBackgroundColor());
290
291 try {
292 DESplashScreen splash = new DESplashScreen();
293 splash.setSize(400,400);
294 SwingUtil.center(splash);
295 splash.start();
296
297 setCursor(controller.getDefaultCursor());
298
299 Font font = controller.getDefaultFont();
300 setFont(font);
301
302
303 menubar = new JMenuBar();
304 menubar.add(buildFileMenu());
305 menubar.add(buildEditMenu());
306 pluginMenu = buildPluginMenu();
307 filterMenu = buildFilterMenu();
308 menubar.add(pluginMenu);
309 menubar.add(filterMenu);
310 setJMenuBar(menubar);
311
312 DETermEditor editor = new DETermEditor(controller);
313 editor.setFont(font);
314
315 northPluginBox = new Box(BoxLayout.Y_AXIS);
316 southPluginBox = new Box(BoxLayout.Y_AXIS);
317 leftPluginBox = new Box(BoxLayout.X_AXIS);
318 rightPluginBox = new Box(BoxLayout.X_AXIS);
319
320 JTextArea noSelectionLabel =
321 new JTextArea("Select a term from the list "+
322 "to view/edit the term data.");
323 noSelectionLabel.setOpaque(false);
324 noSelectionLabel.setFont(controller.getDefaultFont());
325 noSelectionLabel.setDisabledTextColor(Color.black);
326 noSelectionLabel.setLineWrap(true);
327 noSelectionLabel.setWrapStyleWord(true);
328 noSelectionLabel.setEditable(false);
329 noSelectionLabel.setEnabled(false);
330 noSelectionLabel.setMaximumSize(new Dimension(300,300));
331 JPanel noSelectionPanel = new JPanel();
332 noSelectionPanel.setLayout(new BoxLayout(noSelectionPanel,
333 BoxLayout.Y_AXIS));
334 noSelectionPanel.setBackground(Preferences.defaultBackgroundColor());
335 noSelectionPanel.add(Box.createVerticalGlue());
336 noSelectionPanel.add(noSelectionLabel);
337 noSelectionPanel.add(Box.createVerticalGlue());
338 listEditor = new ListEditor(editor,
339 noSelectionPanel,
340 new Vector(0),
341 true, true,
342 false, false,
343 true);
344 listEditor.addListSelectionListener(listSelectionListener);
345 listEditor.getList().
346 setCellRenderer(new DECellRenderer(controller));
347
348 listEditor.setButtonColor(Preferences.defaultButtonColor());
349 editor.setListEditor(listEditor);
350 listEditor.setFont(font);
351
352 findPanel = new FindPanel(controller);
353
354 mainPanel = new XMLLayoutPanel(resolver,
355 XMLLayout.getLayout("<panel/>"));
356 try {
357 xmllayout = XMLLayout.getLayout(controller.getXMLLayout());
358 } catch (Exception e) {
359 System.err.println("Warning: could not use xml gui layout "+
360 "specified in config file becase:\n"+
361 e.toString());
362 xmllayout = XMLLayout.getLayout(controller.defaultXMLString);
363 }
364 setXMLLayout(xmllayout);
365 createListeners();
366 initGUI();
367
368 newOntology();
369
370 splash.join();
371 splash.dispose();
372 if (controller.getAutosaveEnabled()) {
373 controller.startAutosaveThread();
374 }
375 } catch (Exception e) {
376 e.printStackTrace();
377 }
378 }
379
380 public void newOntology() {
381 if (controller.getHistory().isModified()) {
382 int proceed = JOptionPane.showConfirmDialog(this, "There are unsaved changes to this ontology. If you create a new ontology, your changes will be discarded. Are you sure you want to proceed?", "Unsaved changes", JOptionPane.YES_NO_OPTION);
383
384 if (proceed != JOptionPane.YES_OPTION)
385 return;
386 }
387 controller.setIDAdapter(controller.getDefaultIDAdapter());
388 controller.setLastAdapter(null);
389 controller.setLastAdapterProperties(null);
390
391 DEDataAdapterI idAdapter = controller.getIDAdapter();
392 Term root = new Term("<new ontology>");
393 root.setRoot(true);
394 try {
395 String [] ids = idAdapter.getIDs(root, root,
396 controller.getDefaultPrefix(),
397 controller.getMinID(),
398 controller.getMaxID(),
399 controller.getIDLength(),
400 1);
401 if (ids.length > 0)
402 root.setID(ids[0]);
403 } catch (Exception e) {
404 e.printStackTrace();
405 }
406 DEEditHistory history = new DEEditHistory(root);
407 TermRelationshipType trtIsa = new TermRelationshipType("ISA", "is a");
408 history.addRelationshipType(trtIsa);
409 history.addRelationshipType(new TermRelationshipType("PARTOF",
410 "part of"));
411 history.setDefaultRelationshipType(trtIsa);
412 setRoot(history);
413 }
414
415 public void load() {
416 if (controller.getHistory().isModified()) {
417 int proceed = JOptionPane.showConfirmDialog(this, "There are unsaved changes to this ontology. If you load this file, your changes will be discarded. Are you sure you want to proceed?", "Unsaved changes", JOptionPane.YES_NO_OPTION);
418 if (proceed != JOptionPane.YES_OPTION)
419 return;
420 }
421
422 DataAdapterChooser chooser = new DataAdapterChooser(
423 this,
424 controller.getAdapterRegistry(),
425 DEDataAdapterI.READ_TERMS,
426 "Load terms",
427 null,
428 false);
429 if (controller.getHistoryFilePath() != null)
430 chooser.setPropertiesFile(controller.getHistoryFilePath());
431 chooser.setFont(controller.getDefaultFont());
432 chooser.show();
433 if (!chooser.isFailure() && !chooser.isCancelled()) {
434 DEDataAdapterI lastAdapter = (DEDataAdapterI) chooser.
435 getDataAdapter();
436 controller.
437 setLastAdapter(lastAdapter);
438 controller.
439 setLastAdapterProperties(lastAdapter.getStateInformation());
440 if (controller.getAdapterRegistry().
441 adapterSupports(lastAdapter.getClass().getName(),
442 DEDataAdapterI.GET_ID))
443 controller.setIDAdapter(lastAdapter);
444 else
445 controller.setIDAdapter(null);
446 DEEditHistory history = (DEEditHistory) chooser.getOutput();
447 setRoot(history);
448 }
449 }
450
451 protected DETermPanel getPrimaryDAG() {
452 if (dags.size() < 1)
453 return null;
454 else
455 return (DETermPanel) dags.elementAt(0);
456
457 }
458
459 public void setRoot(DEEditHistory history) {
460 history.setIsActive(true);
461 model.setRootTerm(history.getRoot());
462 for(int i=0; i < dags.size(); i++) {
463 DETermPanel dag = (DETermPanel) dags.elementAt(i);
464 dag.setModel(model);
465 }
466 controller.
467 fireChangeRoot(new RootChangeEvent(this, history));
468 Vector selectem = new Vector();
469 selectem.addElement(new TermRelationship(history.getRoot(),
470 null,
471 null));
472 controller.fireTermSelect(new DETermSelectEvent(this, selectem));
473 repaint();
474 }
475
476 public void save() {
477 if (controller.getLastAdapterProperties() != null) {
478 try {
479 DEDataAdapterI lastAdapter = controller.getLastAdapter();
480 lastAdapter.
481 setStateInformation(controller.getLastAdapterProperties());
482 lastAdapter.
483 write(controller.getHistory());
484 controller.getHistory().flush();
485 } catch (Exception e) {
486 JOptionPane.
487 showMessageDialog(null,
488 "Save failed because of "+e.toString());
489 }
490 }
491 }
492
493 public void saveAs() {
494 DataAdapterChooser chooser = new DataAdapterChooser(
495 this,
496 controller.getAdapterRegistry(),
497 DEDataAdapterI.WRITE_TERMS,
498 "Save terms",
499 controller.getHistory(),
500 false);
501 if (controller.getHistoryFilePath() != null)
502 chooser.setPropertiesFile(controller.getHistoryFilePath());
503 chooser.setFont(controller.getDefaultFont());
504 chooser.show();
505
506 if (!chooser.isFailure() && !chooser.isCancelled()) {
507 DEDataAdapterI lastAdapter =
508 (DEDataAdapterI) chooser.getDataAdapter();
509 controller.setLastAdapter(lastAdapter);
510 controller.
511 setLastAdapterProperties(lastAdapter.getStateInformation());
512 DEEditHistory history = (DEEditHistory) chooser.getOutput();
513 setRoot(history);
514 }
515 }
516
517 public void importFile(boolean stripIDs) {
518 TreePath path = controller.getSelectedPaths()[0];
519 Term selectedTerm = ((TermRelationship) path.getLastPathComponent()).
520 getChild();
521
522 DataAdapterChooser chooser = new DataAdapterChooser(
523 this,
524 controller.getAdapterRegistry(),
525 DEDataAdapterI.IMPORT_TERMS,
526 "Import terms",
527 selectedTerm,
528 false);
529 if (controller.getHistoryFilePath() != null)
530 chooser.setPropertiesFile(controller.getHistoryFilePath());
531 chooser.setFont(controller.getDefaultFont());
532 chooser.show();
533
534 Vector operationList = new Vector();
535
536 if (!chooser.isFailure() && !chooser.isCancelled()) {
537 DEEdit edit = new DEEdit("Import data", controller);
538
539 Term term = ((DEEditHistory) chooser.getOutput()).getRoot();
540
541 // build a hastable of all imported terms
542 Hashtable h = term.getAllDescendantsHash(true);
543
544 // remove ids, if necessary
545 if (stripIDs) {
546 Enumeration e = h.elements();
547 String [] ids = null;
548 int index = 0;
549 while(e.hasMoreElements()) {
550 Term t = (Term) e.nextElement();
551 if (ids == null) {
552 try {
553 ids = controller.getIDAdapter().
554 getIDs(t.getRoot(),
555 t,
556 controller.getDefaultPrefix(),
557 controller.getMinID(),
558 controller.getMaxID(),
559 controller.getIDLength(),
560 h.size());
561 } catch (DataAdapterException ex) {
562 JOptionPane.showMessageDialog(null,
563 "Could not get new "+
564 "ids from data "+
565 "adapter because of "+
566 ex.toString());
567 }
568 }
569 t.setID(ids[index++]);
570 }
571 h = term.getAllDescendantsHash(true);
572 }
573
574 // build a hashtable of all pre-existing terms
575 Hashtable allterms = selectedTerm.getRoot().
576 getAllDescendantsHash(true);
577
578 // build a hashtable for recording children of imported terms
579 Hashtable childHash = new Hashtable();
580
581 Enumeration importEnum = h.keys();
582 while(importEnum.hasMoreElements()) {
583 String id = (String) importEnum.nextElement();
584 Term importedTerm = (Term) h.get(id);
585 Term originalTerm = (Term) allterms.get(id);
586 Vector childVector = (Vector) importedTerm.getChildren().clone();
587 childHash.put(id, childVector);
588 importedTerm.removeAllChildren();
589 importedTerm.removeAllParents();
590 }
591 Vector childVector = new Vector();
592 childVector.
593 addElement(new TermRelationship(term,
594 selectedTerm,
595 controller.
596 getDefaultRelationshipType()));
597 childHash.put(selectedTerm.getID(), childVector);
598 h.put(selectedTerm.getID(), selectedTerm);
599 Vector removeThese = new Vector();
600 while(childHash.size() > 0) {
601 importEnum = childHash.keys();
602 while(importEnum.hasMoreElements()) {
603 String id = (String) importEnum.nextElement();
604 Term importedTerm = (Term) h.get(id);
605 Term originalTerm = (Term) allterms.get(id);
606 if (originalTerm == null)
607 continue;
608 removeThese.addElement(id);
609
610 Vector children = (Vector) childHash.get(id);
611 for(int i=0; i < children.size(); i++) {
612 TermRelationship tr = (TermRelationship) children.
613 elementAt(i);
614 String childID = tr.getChild().getID();
615 TermRelationshipType trType = tr.getType();
616 Term child = (Term) allterms.get(childID);
617 boolean createdTerm = false;
618 if (child == null) {
619 child = (Term) h.get(childID);
620 allterms.put(childID, child);
621 createdTerm = true;
622 } else {
623 for(int j=0; j < importedTerm.
624 getDanglingParents().size();
625 j++) {
626 DanglingRelationship dp =
627 (DanglingRelationship)
628 importedTerm.getDanglingParents().
629 elementAt(j);
630 if (!child.getDanglingParents().contains(dp))
631 child.addDanglingParent(dp);
632 }
633 }
634 Vector rels = originalTerm.
635 getRelationshipsForChild(child);
636
637 boolean foundIt = false;
638 for(int j=0; j < rels.size(); j++) {
639 TermRelationship rel = (TermRelationship)
640 rels.elementAt(j);
641 if (rel.getType().equals(trType)) {
642 foundIt = true;
643 break;
644 }
645 }
646 if (!foundIt) {
647 StateEdit childEdit = new StateEdit(child);
648 StateEdit parentEdit = new StateEdit(originalTerm);
649 edit.addEdit(childEdit);
650 edit.addEdit(parentEdit);
651 HistoryItem item;
652 if (createdTerm) {
653 item = new TermAddHistoryItem(originalTerm,
654 child);
655 operationList.addElement(item);
656 Vector r_temp = new Vector();
657 r_temp.
658 addElement(new TermRelationship(child,
659 originalTerm,
660 controller.
661 getDefaultRelationshipType()));
662 item = new TermRelationshipHistoryItem(r_temp, trType);
663 operationList.addElement(item);
664 } else {
665 Vector copiedTerms = new Vector();
666 copiedTerms.addElement(new
667 TermRelationship(child,
668 null,
669 trType));
670 item = new TermCopyHistoryItem(originalTerm,
671 copiedTerms);
672 operationList.addElement(item);
673 }
674 if (!(!controller.allowCycles() &&
675 originalTerm.hasAncestor(child)))
676 originalTerm.addChild(child, trType);
677 else {
678 childEdit.end();
679 parentEdit.end();
680 edit.end();
681 edit.undo();
682 JOptionPane.
683 showMessageDialog(null,
684 "Import would have "+
685 "caused a cycle! "+
686 "Aborting...");
687 return;
688 }
689 childEdit.end();
690 parentEdit.end();
691 }
692 }
693 }
694 for(int i=0; i < removeThese.size(); i++) {
695 String id = (String) removeThese.elementAt(i);
696 childHash.remove(id);
697 }
698 removeThese.removeAllElements();
699 }
700
701
702 // now resolve dangling parents
703 allterms = selectedTerm.getRoot().
704 getAllDescendantsHash(true);
705 Enumeration e = allterms.elements();
706 while(e.hasMoreElements()) {
707 Term child = (Term) e.nextElement();
708 for(int i=0; i < term.getDanglingParents().size(); i++) {
709 DanglingRelationship dr = (DanglingRelationship)
710 child.getDanglingParents().elementAt(i);
711 Term parent = (Term) allterms.get(dr.getID());
712 if (parent != null) {
713 StateEdit childEdit = new StateEdit(child);
714 StateEdit parentEdit = new StateEdit(parent);
715 edit.addEdit(childEdit);
716 edit.addEdit(parentEdit);
717 HistoryItem item;
718
719 Vector copiedTerms = new Vector();
720 copiedTerms.addElement(child);
721 item = new TermCopyHistoryItem(parent,
722 copiedTerms);
723
724 operationList.addElement(item);
725 if (!(!controller.allowCycles() &&
726 parent.hasAncestor(child)))
727 parent.addChild(child, dr.getType());
728 else {
729 childEdit.end();
730 parentEdit.end();
731 edit.end();
732 edit.undo();
733 JOptionPane.
734 showMessageDialog(null,
735 "Import would have "+
736 "caused a cycle! "+
737 "Aborting...");
738 return;
739 }
740 childEdit.end();
741 parentEdit.end();
742 }
743 }
744 }
745
746
747 TermMacroHistoryItem historyItem =
748 new TermMacroHistoryItem("Import");
749 historyItem.setTarget(selectedTerm);
750 historyItem.setHistoryItems(operationList);
751 edit.setHistoryItem(historyItem);
752 edit.end();
753 controller.getUndoManager().addEdit(edit);
754 }
755 controller.fireReload(new DETermReloadEvent(this));
756 }
757
758
759 public void exportFile() {
760 Vector selection = controller.getSelectedTerms();
761 Term term = ((TermRelationship) selection.elementAt(0)).getChild();
762 DEEditHistory history = new DEEditHistory(term);
763 history.setRelationshipTypes(controller.getHistory().
764 getRelationshipTypes());
765 history.setDefaultRelationshipType(controller.getHistory().
766 getDefaultRelationshipType());
767 DataAdapterChooser chooser = new DataAdapterChooser(
768 this,
769 controller.getAdapterRegistry(),
770 DEDataAdapterI.EXPORT_TERMS,
771 "Export terms",
772 history,
773 false);
774 if (controller.getHistoryFilePath() != null)
775 chooser.setPropertiesFile(controller.getHistoryFilePath());
776 chooser.setFont(controller.getDefaultFont());
777 chooser.show();
778 }
779
780 private void drawNode(Term term, int depth) {
781 System.err.print("***");
782 for(int i=0; i < depth; i++)
783 System.err.print(" ");
784 System.err.println(term);
785 for(int i=0; i < term.getChildren().size(); i++) {
786 TermRelationship tr = (TermRelationship) term.getChildren().elementAt(i);
787 drawNode(tr.getChild(), depth+1);
788 }
789 }
790
791 public JMenu buildPluginMenu() {
792 JMenu pluginMenu = new JMenu("Plugins");
793 pluginMenu.setFont(controller.getDefaultFont());
794 pluginMenu.addMenuListener(new PluginMenuListener(this));
795 return pluginMenu;
796 }
797
798 public JMenu buildFilterMenu() {
799 JMenu filterMenu = new JMenu("Filters");
800 filterMenu.setFont(controller.getDefaultFont());
801 formatFilterMenu(filterMenu);
802 return filterMenu;
803 }
804
805 protected void formatFilterMenu(JMenu filterMenu) {
806 filterMenu.removeAll();
807 Vector types = controller.getHistory().getRelationshipTypes();
808 TypeFilter filter = (TypeFilter) controller.getTypeFilter();
809 for(int i=0; i < types.size(); i++) {
810 TermRelationshipType type = (TermRelationshipType) types.
811 elementAt(i);
812 JCheckBoxMenuItem item = new
813 JCheckBoxMenuItem("Show relationships of type "+
814 type.getDesc());
815 item.setSelected(filter.getTypes().contains(type));
816
817 item.setFont(controller.getDefaultFont());
818 item.addActionListener(
819 new RelationshipTypeListener(type,
820 item,
821 filter));
822 filterMenu.add(item);
823 }
824 }
825
826 protected class RelationshipTypeListener implements ActionListener {
827 protected TermRelationshipType type;
828 protected JCheckBoxMenuItem item;
829 protected TypeFilter filter;
830
831 public RelationshipTypeListener(TermRelationshipType type,
832 JCheckBoxMenuItem item,
833 TypeFilter filter) {
834 this.item = item;
835 this.type = type;
836 this.filter = filter;
837 }
838
839
840 public void actionPerformed(ActionEvent e) {
841 if (item.isSelected())
842 filter.addType(type);
843 else
844 filter.removeType(type);
845 controller.fireReload(new DETermReloadEvent(this));
846 }
847 }
848
849 protected void formatPluginMenu() {
850 pluginMenu.removeAll();
851 if (controller.getPlugins().size() == 0) {
852 JMenuItem item = new JMenuItem("no plugins installed");
853 item.setFont(controller.getDefaultFont());
854 item.setEnabled(false);
855 pluginMenu.add(item);
856 return;
857 }
858 for(int i=0; i < controller.getPlugins().size(); i++) {
859 final DEPlugin plugin =
860 (DEPlugin) controller.getPlugins().elementAt(i);
861 JMenuItem item = new JMenuItem(plugin.getName());
862 item.addActionListener(new ActionListener() {
863 public void actionPerformed(ActionEvent e) {
864 launchPlugin(plugin);
865 }
866 });
867 item.setFont(controller.getDefaultFont());
868 item.setEnabled(true);
869 for(int j=0; j < controller.getActivePlugins().size(); j++) {
870 DEPlugin liveplugin = (DEPlugin) controller.getActivePlugins().
871 elementAt(j);
872 if (plugin.getClass().equals(liveplugin.getClass())) {
873 item.setEnabled(false);
874 break;
875 }
876 }
877 pluginMenu.add(item);
878 }
879 }
880
881 protected void launchPlugin(DEPlugin plugin) {
882 launchPlugin(plugin.getClass());
883 }
884
885 protected synchronized void launchPlugin(Class pluginClassNonFinal) {
886 final Class pluginClass = pluginClassNonFinal;
887 try {
888 final DEPlugin plugin = (DEPlugin) pluginClass.newInstance();
889 controller.
890 firePluginActivate(new DEPluginEvent(this,
891 plugin));
892 Thread runMe = new Thread() {
893 public void run() {
894 try {
895 MultiProperties props = new MultiProperties();
896 props.load(new FileInputStream(controller.getHistoryFilePath()));
897 props = props.getProperties(pluginClass.getName());
898 final MultiProperties finalProps = props;
899
900 plugin.setController(controller);
901 plugin.init(finalProps);
902
903 final JDialog window = new JDialog(DEEditorFrame.
904 this,
905 plugin.
906 getName());
907 window.setContentPane(plugin);
908 window.addWindowListener(new WindowAdapter () {
909 public void windowClosing(WindowEvent e) {
910 plugin.writeProperties();
911 plugin.cleanup();
912 controller.firePluginDeactivate(
913 new DEPluginEvent(this,
914 plugin));
915 window.dispose();
916 }
917 });
918 setCursor(controller.getDefaultCursor());
919 Runnable showWindow = new Runnable() {
920 public void run() {
921 window.pack();
922 window.show();
923
924 launchingPlugins.
925 removeElement(plugin);
926 }
927 };
928 SwingUtilities.invokeLater(showWindow);
929 } catch (Throwable e) {
930 System.err.println("Could not load plugin!");
931 e.printStackTrace();
932 }
933 }
934 };
935 setCursor(controller.getWaitArrowCursor());
936 launchingPlugins.addElement(plugin);
937 runMe.start();
938 } catch (Throwable e) {
939 System.err.println("Could not load plugin!");
940 e.printStackTrace();
941 }
942 }
943
944 protected void configureAdapter() {
945 DataAdapterChooser chooser =
946 new DataAdapterChooser(this,
947 (VisualDataAdapter)
948 controller.getLastAdapter(),
949 DEDataAdapterI.CONFIGURE,
950 "Adapter properties",
951 null, false);
952 if (controller.getHistoryFilePath() != null)
953 chooser.setPropertiesFile(controller.getHistoryFilePath());
954 chooser.setFont(controller.getDefaultFont());
955 chooser.show();
956 if (!chooser.isFailure() && !chooser.isCancelled()) {
957 controller.
958 setLastAdapterProperties(controller.getLastAdapter().
959 getStateInformation());
960 controller.
961 fireAdapterConfig(new AdapterConfigEvent(this,
962 controller.getLastAdapter()));
963 }
964 }
965
966 public JMenu buildFileMenu() {
967 JMenu fileMenu = new JMenu("File");
968
969 newItem = new JMenuItem("New Ontology");
970 loadItem = new JMenuItem("Load Terms...");
971 saveItem = new JMenuItem("Save");
972 configureItem = new JMenuItem("Adapter Properties...");
973 saveAsItem = new JMenuItem("Save As...");
974 importItem = new JMenuItem("Import Terms...");
975 importAndTrimItem = new JMenuItem("Import Terms and Strip ids...");
976 exportItem = new JMenuItem("Export Terms...");
977 exitItem = new JMenuItem("Exit");
978
979 loadItem.setAccelerator(KeyStroke.getKeyStroke("control O"));
980 saveItem.setAccelerator(KeyStroke.getKeyStroke("control S"));
981
982 newItem.setFont(controller.getDefaultFont());
983 loadItem.setFont(controller.getDefaultFont());
984 saveItem.setFont(controller.getDefaultFont());
985 saveAsItem.setFont(controller.getDefaultFont());
986 configureItem.setFont(controller.getDefaultFont());
987 importItem.setFont(controller.getDefaultFont());
988 importAndTrimItem.setFont(controller.getDefaultFont());
989 exportItem.setFont(controller.getDefaultFont());
990 exitItem.setFont(controller.getDefaultFont());
991 fileMenu.setFont(controller.getDefaultFont());
992
993 fileMenu.add(newItem);
994 fileMenu.add(loadItem);
995 fileMenu.add(saveItem);
996 fileMenu.add(saveAsItem);
997 fileMenu.add(configureItem);
998 fileMenu.add(importItem);
999 fileMenu.add(importAndTrimItem);
1000 fileMenu.add(exportItem);
1001 fileMenu.addSeparator();
1002 fileMenu.add(exitItem);
1003
1004 newItem.addActionListener(
1005 new ActionListener() {
1006 public void actionPerformed(ActionEvent e) {
1007 newOntology();
1008 }
1009 }
1010 );
1011
1012 loadItem.addActionListener(
1013 new ActionListener() {
1014 public void actionPerformed(ActionEvent e) {
1015 load();
1016 }
1017 }
1018 );
1019
1020 saveItem.addActionListener(
1021 new ActionListener() {
1022 public void actionPerformed(ActionEvent e) {
1023 save();
1024 }
1025 }
1026 );
1027
1028 saveAsItem.addActionListener(
1029 new ActionListener() {
1030 public void actionPerformed(ActionEvent e) {
1031 saveAs();
1032 }
1033 }
1034 );
1035
1036 configureItem.addActionListener(
1037 new ActionListener() {
1038 public void actionPerformed(ActionEvent e) {
1039 configureAdapter();
1040 }
1041 });
1042
1043 importItem.addActionListener(
1044 new ActionListener() {
1045 public void actionPerformed(ActionEvent e) {
1046 importFile(false);
1047 }
1048 }
1049 );
1050
1051 importAndTrimItem.addActionListener(
1052 new ActionListener() {
1053 public void actionPerformed(ActionEvent e) {
1054 importFile(true);
1055 }
1056 }
1057 );
1058
1059 exportItem.addActionListener(
1060 new ActionListener() {
1061 public void actionPerformed(ActionEvent e) {
1062 exportFile();
1063 }
1064 }
1065 );
1066
1067 exitItem.addActionListener(
1068 new ActionListener() {
1069 public void actionPerformed(ActionEvent e) {
1070 exit();
1071 }
1072 }
1073 );
1074 fileMenu.addMenuListener(new FileMenuListener(this));
1075 return fileMenu;
1076 }
1077
1078 public void formatTypeChangeMenu() {
1079 changeMenu.removeAll();
1080 Vector types = controller.getHistory().getRelationshipTypes();
1081 for(int i=0; i < types.size(); i++) {
1082 final TermRelationshipType type = (TermRelationshipType) types.
1083 elementAt(i);
1084 JMenuItem item = new JMenuItem();
1085 Icon icon = controller.getIconForRelationshipType(type);
1086 String itemText = type.getDesc();
1087 if (icon != null)
1088 item.setIcon(icon);
1089 else
1090 itemText = "("+type.getName()+") "+type.getDesc();
1091 item.setText(itemText);
1092 item.setFont(controller.getDefaultFont());
1093
1094 item.addActionListener(new ActionListener() {
1095 public void actionPerformed(ActionEvent e) {
1096 getPrimaryDAG().changeRelationship(type);
1097 }
1098 });
1099 changeMenu.add(item);
1100 }
1101 }
1102
1103 public JMenu buildTypeChangeMenu() {
1104 JMenu changeMenu = new JMenu("Change relationship type to");
1105 return changeMenu;
1106 }
1107
1108 public JMenu buildEditMenu() {
1109 JMenu editMenu = new JMenu("Edit");
1110
1111 undoItem = new JMenuItem("Undo");
1112 redoItem = new JMenuItem("Redo");
1113 deleteItem = new JMenuItem("Delete");
1114 changeMenu = buildTypeChangeMenu();
1115 splitItem = new JMenuItem("Split");
1116 mergeItem = new JMenuItem("Merge");
1117 addItem = new JMenuItem("Add term");
1118
1119 JMenu exportClipboardItem =
1120 new JMenu("Export clipboard contents");
1121 exportClipboardToFileItem = new JMenuItem("to file");
1122 exportClipboardToTerminalItem = new JMenuItem("to terminal");
1123
1124
1125 undoItem.setAccelerator(KeyStroke.getKeyStroke("control Z"));
1126 redoItem.setAccelerator(KeyStroke.getKeyStroke("control Y"));
1127 addItem.setAccelerator(KeyStroke.getKeyStroke("control N"));
1128
1129 deleteItem.setAccelerator(KeyStroke.getKeyStroke("DELETE"));
1130
1131 redoItem.setFont(controller.getDefaultFont());
1132 undoItem.setFont(controller.getDefaultFont());
1133 deleteItem.setFont(controller.getDefaultFont());
1134 changeMenu.setFont(controller.getDefaultFont());
1135 splitItem.setFont(controller.getDefaultFont());
1136 mergeItem.setFont(controller.getDefaultFont());
1137 addItem.setFont(controller.getDefaultFont());
1138 editMenu.setFont(controller.getDefaultFont());
1139
1140 exportClipboardItem.setFont(controller.getDefaultFont());
1141 exportClipboardToFileItem.setFont(controller.getDefaultFont());
1142 exportClipboardToTerminalItem.setFont(controller.getDefaultFont());
1143
1144 exportClipboardItem.add(exportClipboardToFileItem);
1145 exportClipboardItem.add(exportClipboardToTerminalItem);
1146
1147 editMenu.add(undoItem);
1148 editMenu.add(redoItem);
1149 editMenu.addSeparator();
1150 editMenu.add(exportClipboardItem);
1151 editMenu.addSeparator();
1152 editMenu.add(deleteItem);
1153 editMenu.add(changeMenu);
1154 editMenu.add(splitItem);
1155 editMenu.add(mergeItem);
1156 editMenu.add(addItem);
1157
1158
1159 try {
1160
1161 exportClipboardToFileItem.addActionListener(new ActionListener() {
1162 public void actionPerformed(ActionEvent e) {
1163 exportClipboardToFile();
1164 }
1165 });
1166 exportClipboardToTerminalItem.addActionListener(new
1167 ActionListener() {
1168 public void actionPerformed(ActionEvent e) {
1169 exportClipboardToTerminal();
1170 }
1171 });
1172
1173 undoItem.addActionListener(new ActionListener() {
1174 public void actionPerformed(ActionEvent e) {
1175 undo();
1176 }
1177 });
1178
1179 redoItem.addActionListener(new ActionListener() {
1180 public void actionPerformed(ActionEvent e) {
1181 redo();
1182 }
1183 });
1184
1185 deleteItem.addActionListener(new ActionListener() {
1186 public void actionPerformed(ActionEvent e) {
1187 getPrimaryDAG().delete();
1188 }
1189 });
1190
1191 splitItem.addActionListener(new ActionListener() {
1192 public void actionPerformed(ActionEvent e) {
1193 getPrimaryDAG().split();
1194 }
1195 });
1196
1197 mergeItem.addActionListener(new ActionListener() {
1198 public void actionPerformed(ActionEvent e) {
1199 getPrimaryDAG().merge();
1200 }
1201 });
1202
1203 addItem.addActionListener(new ActionListener() {
1204 public void actionPerformed(ActionEvent e) {
1205 getPrimaryDAG().add();
1206 }
1207 });
1208 } catch (Exception e) {
1209 e.printStackTrace();
1210 }
1211
1212 editMenu.addMenuListener(new EditMenuListener(this));
1213 return editMenu;
1214 }
1215
1216 public void formatViewMenu() {
1217
1218 }
1219
1220 public void formatFileMenu() {
1221 saveItem.setEnabled(controller.getLastAdapter() != null &&
1222 controller.getLastAdapterProperties() != null &&
1223 controller.getHistory().isModified());
1224
1225 TreePath [] paths = controller.getSelectedPaths();
1226 importItem.setEnabled(paths.length == 1);
1227 importAndTrimItem.setEnabled(paths.length == 1);
1228 exportItem.setEnabled(paths.length == 1);
1229 configureItem.setEnabled(controller.getLastAdapter() != null &&
1230 controller.getLastAdapter() instanceof
1231 VisualDataAdapter &&
1232 controller.getAdapterRegistry().
1233 adapterSupports(controller.getLastAdapter().
1234 getClass().getName(),
1235 DEDataAdapterI.CONFIGURE));
1236 }
1237
1238 public void formatEditMenu() {
1239 UndoManager undodad = controller.getUndoManager();
1240
1241 formatTypeChangeMenu();
1242
1243 if (undodad.canUndo()) {
1244 undoItem.setText(undodad.getUndoPresentationName());
1245 undoItem.setEnabled(true);
1246 } else {
1247 undoItem.setText("Undo");
1248 undoItem.setEnabled(false);
1249 }
1250 if (undodad.canRedo()) {
1251 redoItem.setText(undodad.getRedoPresentationName());
1252 redoItem.setEnabled(true);
1253 } else {
1254 redoItem.setText("Redo");
1255 redoItem.setEnabled(false);
1256 }
1257 TreePath [] selection = controller.getSelectedPaths();
1258
1259 // come back here for menu creation
1260
1261 deleteItem.setEnabled(true);
1262
1263 mergeItem.setEnabled(selection != null && selection.length == 2);
1264 addItem.setEnabled(selection != null && selection.length == 1);
1265 if (selection != null && selection.length == 1) {
1266 Term term = ((TermRelationship) selection[0].
1267 getLastPathComponent()).getChild();
1268 splitItem.setEnabled(!term.equals(controller.getRoot()));
1269 }
1270 }
1271
1272 public void undo() {
1273 controller.getUndoManager().undo();
1274 listEditor.refresh();
1275 // dag.reload();
1276 repaint();
1277 }
1278
1279 public void redo() {
1280 controller.getUndoManager().redo();
1281 listEditor.refresh();
1282 // dag.reload();
1283 repaint();
1284 }
1285
1286 protected void createListeners() {
1287 controller.addListener(new DETermSelectListener() {
1288 public void selectTerms(DETermSelectEvent e) {
1289 handleSelection();
1290 }
1291 });
1292 controller.addListener(new DisableGUIListener() {
1293 public void disable(DisableGUIEvent e) {
1294 DEEditorFrame.this.disable();
1295 }
1296 public void enable(DisableGUIEvent e) {
1297 DEEditorFrame.this.enable();
1298 }
1299
1300 });
1301 controller.addListener(new ReconfigListener() {
1302 public void configReloaded(ReconfigEvent e) {
1303 setXMLLayout(controller.getXMLLayout());
1304 }
1305 });
1306 controller.addListener(new RootChangeListener() {
1307 public void changeRoot(RootChangeEvent e) {
1308 formatFilterMenu(filterMenu);
1309 }
1310 });
1311 controller.addListener(new AdapterConfigListener() {
1312 public void config(AdapterConfigEvent e) {
1313 formatFilterMenu(filterMenu);
1314 }
1315 });
1316
1317 }
1318
1319 protected void setXMLLayout(String layout) {
1320 try {
1321 setXMLLayout(XMLLayout.getLayout(layout));
1322 } catch (Exception e) {
1323