TermTreePane.java

00001 /* 
00002 ** Author(s): Miguel Calejo
00003 ** Contact:   interprolog@declarativa.com, http://www.declarativa.com
00004 ** Copyright (C) Declarativa, Portugal, 2000-2002
00005 ** Use and distribution, without any warranties, under the terms of the 
00006 ** GNU Library General Public License, readable in http://www.fsf.org/copyleft/lgpl.html
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){ // repaint() needed !
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                                 //lists[level].clearSelection();
00090                                 //lists[level].revalidate();
00091                         }
00092                 }
00093                 
00094                 TermTreeModel findModel(int position){ // all JLists have a selection up to 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 }

Generated on Wed Jul 26 13:30:44 2006 for XSB by  doxygen 1.4.5