00001
00002
00003
00004
00005
00006
00007
00008 package com.declarativa.interprolog.gui;
00009 import javax.swing.*;
00010 import javax.swing.event.*;
00011 import java.awt.*;
00012 import java.awt.event.*;
00013 public class TermTreePane extends JPanel{
00014 JList[] lists;
00015 TermTreeModel model;
00016 Object[] levelTitles;
00017 TermTreePane(TermTreeModel m, Object[] levelTitles){
00018 setLayout(new BorderLayout());
00019 if (m==null)
00020 throw new RuntimeException("Null model in TermTreeWindow");
00021 int nLevels = m.depth();
00022 if (nLevels<2)
00023 throw new RuntimeException("Bad model in TermTreeWindow:"+m);
00024 if (levelTitles==null) levelTitles = new String[0];
00025 this.levelTitles = levelTitles;
00026
00027 lists = new JList[nLevels];
00028 model=m;
00029 String[] dummy = {" "};
00030 for (int level=0; level<nLevels; level++){
00031 final JList list = new JList(dummy);
00032 lists[level] = list;
00033 if (level<nLevels-1) list.addListSelectionListener(new ListHandler(level));
00034 list.addMouseListener(new MouseAdapter() {
00035 public void mouseClicked(MouseEvent e) {
00036 if (e.getClickCount() == 2) {
00037 int index = list.locationToIndex(e.getPoint());
00038 TermListModel lm = (TermListModel)(list.getModel());
00039 if (index != -1) new TermModelWindow(lm.terms[index]);
00040 }
00041 };
00042 });
00043
00044 }
00045 lists[0].setModel(m.topList());
00046 if (nLevels>2){
00047 JSplitPane current = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true,
00048 paneForList(0), paneForList(1));
00049 current.setDividerLocation(0.5);
00050 for (int level=2;level<nLevels-1;level++){
00051 current = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, current, paneForList(level));
00052 current.setDividerLocation((float)level/(nLevels-1));
00053 }
00054 add("Center",current);
00055 }
00056 else add("Center",paneForList(0));
00057 }
00058
00059 JComponent paneForList(int L){
00060 JPanel temp = new JPanel(new BorderLayout());
00061 temp.add("Center",new JScrollPane(lists[L]));
00062 if (L>levelTitles.length-2)
00063 temp.add("North",new JLabel(" "));
00064 else
00065 temp.add("North",new JLabel(levelTitles[L+1].toString()));
00066 return temp;
00067 }
00068 class ListHandler implements ListSelectionListener{
00069 int position;
00070 ListHandler(int i){position=i;}
00071 public void valueChanged(ListSelectionEvent e){
00072 JList list = (JList)(e.getSource());
00073
00074 if (!e.getValueIsAdjusting() & list.getSelectedIndex()!=-1){
00075 lists[position+1].setModel(findModel(position).topList());
00076 clearRightLists();
00077 repaintRight();
00078 }
00079 }
00080
00081 void clearRightLists(){
00082 for(int level=position+2; level<lists.length; level++){
00083 lists[level].setListData(new Object[0]);
00084 }
00085 }
00086 void repaintRight(){
00087 for(int level=position+1; level<lists.length; level++){
00088 lists[level].repaint();
00089
00090
00091 }
00092 }
00093
00094 TermTreeModel findModel(int position){
00095 TermTreeModel temp = model.children[lists[0].getSelectedIndex()];
00096 for (int level=1; level<=position; level++){
00097 temp=temp.children[lists[level].getSelectedIndex()];
00098 }
00099 return temp;
00100 }
00101 }
00102 }