Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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