//This file is part of SECONDO. //Copyright (C) 2004, University in Hagen, Department of Computer Science, //Database Systems for New Applications. //SECONDO is free software; you can redistribute it and/or modify //it under the terms of the GNU General Public License as published by //the Free Software Foundation; either version 2 of the License, or //(at your option) any later version. //SECONDO is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. //You should have received a copy of the GNU General Public License //along with SECONDO; if not, write to the Free Software //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA package viewer; import javax.swing.*; import java.awt.*; import java.awt.event.*; import sj.lang.*; // ListExpr and IntByReference is needed import gui.SecondoObject; import java.util.Vector; import gui.idmanager.*; import viewer.relsplit.*; import javax.swing.event.*; import tools.Reporter; public class RelSplit extends SecondoViewer{ public String getName(){return "RelSplitter";} public boolean addObject(SecondoObject o){ if (Relation.isRelation(o)) return addRelation(o); else{ SecondoObject Rel = makeRelation(o); if(Rel!=null){ return addRelation(Rel); } else return false; } } public void removeObject(SecondoObject o){ if(o==null) return; int index = getIndexOf(o.getID()); if(index>=0){ AllRelations.removeItemAt(index); if(AllRelations.getItemCount()==0){ CurrentRelation.setModel(dummy); } } } public void removeAll(){ AllRelations.removeAllItems(); CurrentRelation.setModel(dummy); } public boolean canDisplay(SecondoObject o){ return Relation.isRelation(o) || (makeRelation(o)!=null); } public boolean isDisplayed(SecondoObject o){ return getIndexOf(o.getID())>=0; } public boolean selectObject(SecondoObject O){ int index= getIndexOf(O.getID()); if(index >=0){ AllRelations.setSelectedIndex(index); return true; } IntByReference RI = new IntByReference(); IntByReference LI = new IntByReference(); if(searchID(O.getID(),RI,LI)){ AllRelations.setSelectedIndex(RI.value); CurrentRelation.setSelectedIndex(LI.value); return true; } else return false; } public MenuVector getMenuVector(){ return null;} /** returns the index of Relation with ID */ private int getIndexOf(ID aID){ int c = AllRelations.getItemCount(); int pos = -1; boolean found = false; for(int i=0; i ) the null is returned */ private SecondoObject makeRelation(SecondoObject SO){ ListExpr SOLE = SO.toListExpr(); if(SOLE.listLength()!=2) return null; ListExpr Type = SOLE.first(); ListExpr Value = SOLE.second(); if(!(Type.isAtom() && Type.atomType()==ListExpr.SYMBOL_ATOM)) return null; ListExpr TupleEntry = ListExpr.twoElemList(Type,Type); // we have not a name given ListExpr Tuple = ListExpr.twoElemList( ListExpr.symbolAtom("tuple"), ListExpr.oneElemList(TupleEntry)); ListExpr RelType = ListExpr.twoElemList( ListExpr.symbolAtom("rel"), (Tuple)); ListExpr Rel = ListExpr.twoElemList( RelType,ListExpr.oneElemList(ListExpr.oneElemList(Value))); SecondoObject R = new SecondoObject(SO.getID()); R.fromList(Rel); R.setName(SO.getName()); return R; } /** to Capture selection in the list */ public void addListSelectionListener(ListSelectionListener LSL){ CurrentRelation.addListSelectionListener(LSL); } /** returns the SecondoObject in the list * if no secondoobject is selected null is returned */ public SecondoObject getSelectedObject(){ int index = CurrentRelation.getSelectedIndex(); if (index<0) return null; else return ((RelationListModel) CurrentRelation.getModel()).getSecondoObjectAt(index); } /** returns the selected attribute */ public SecondoObject[] getSelectedAttribute(){ int index = CurrentRelation.getSelectedIndex(); if(index<0) return null; else return ((RelationListModel) CurrentRelation.getModel()).getAttributeAt(index); } /** returns the selected Tuple as SecondoObject array*/ public SecondoObject getSelectedTuple(){ int index = CurrentRelation.getSelectedIndex(); if(index<0) return null; else return ((RelationListModel) CurrentRelation.getModel()).getTupleOnPos(index); } /** returns all objects in this relation */ public SecondoObject[] getAllObjects(){ if(CurrentRelation.getModel() instanceof RelationListModel) return ((RelationListModel) CurrentRelation.getModel()).getAllObjects(); else return new SecondoObject[0]; } /** returns all tuples in this relation */ public SecondoObject[] getAllTuples(){ return ((RelationListModel) CurrentRelation.getModel()).getAllTuples(); } /** return the relation */ public SecondoObject getRelation(){ return ((RelationListModel) CurrentRelation.getModel()).getRelation(); } /** search in all lists for aID */ private boolean searchID(ID aID,IntByReference RelationIndex,IntByReference ListIndex){ int c = AllRelations.getItemCount(); boolean found = false; int tmpPos; for(int i=0; i=0){ found = true; RelationIndex.value = i; ListIndex.value = tmpPos; } } return found; } public RelSplit(){ setLayout(new BorderLayout()); AllRelations = new JComboBox(); CurrentRelation = new JList(); CurrentRelation.setFont(new Font("MonoSpaced",Font.PLAIN,12)); ScrollPane = new JScrollPane(); ScrollPane.setViewportView(CurrentRelation); SecondoObjectVector = new Vector(); add(AllRelations,BorderLayout.NORTH); add(ScrollPane,BorderLayout.CENTER); AllRelations.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent evt){ if (evt.getStateChange()==ItemEvent.SELECTED){ ListModel LM = (ListModel) evt.getItem(); CurrentRelation.setModel(LM); } } }); // add a Panel to Search Strings in the ListExpr JPanel SearchPanel = new JPanel(); //new GridLayout(1,3)); GoBtn = new JButton("go"); SearchText = new JTextField(6); JLabel SearchLabel = new JLabel("search:"); SearchPanel.add(SearchLabel); SearchPanel.add(SearchText); SearchPanel.add(GoBtn); add(SearchPanel,BorderLayout.SOUTH); GoBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evt){ search(); } }); } /** search the Text in the TextField and select the next line*/ private void search(){ String What = SearchText.getText(); if (What.trim().equals("")) Reporter.showError("no text to search"); else search(What); } /** select the next line containing S in the list */ private void search(String S){ if(CurrentRelation==null){ Reporter.showError("no relation"); return; } ListModel LM = CurrentRelation.getModel(); if(LM==null || !(LM instanceof RelationListModel)){ Reporter.showError("no relation"); return; } RelationListModel RLM= (RelationListModel) CurrentRelation.getModel(); int SelIndex = CurrentRelation.getSelectedIndex(); int Start = SelIndex<0?1:SelIndex+1; int next = RLM.find(S,false,Start); if(next<0) next = RLM.find(S,false,1); if(next<0) Reporter.showError("text not found"); else{ int H = ScrollPane.getSize().height; int FH = CurrentRelation.getFont().getSize(); int rows= H/((FH+4)*2); // the half of all visible rows if(nextRLM.getSize()) CurrentRelation.ensureIndexIsVisible(RLM.getSize()); else{ CurrentRelation.ensureIndexIsVisible(next-rows); CurrentRelation.ensureIndexIsVisible(next+rows); } CurrentRelation.setSelectedIndex(next); } } /** return the MinimumSize of this Component */ public Dimension getMinimumSize(){ return new Dimension(200,300); } public Dimension getPreferredSize(){ return getMinimumSize(); } public boolean addRelation(SecondoObject SO){ Relation R=new Relation(); if (!R.readFromSecondoObject(SO)){ Reporter.debug("Relation.readFromSecondoObject failed "); return false; } else{ try{ RelationListModel RLM = new RelationListModel(R); AllRelations.addItem(RLM); AllRelations.setSelectedIndex(AllRelations.getItemCount()-1); return true; } catch(Exception e){ Reporter.debug(e); return false; } } } public void addMouseListener(MouseListener ml){ CurrentRelation.addMouseListener(ml); } private JComboBox AllRelations; private JList CurrentRelation; private JScrollPane ScrollPane; private Vector SecondoObjectVector; private DefaultComboBoxModel dummy= new DefaultComboBoxModel(); // to show nothing private JTextField SearchText; private JButton GoBtn; }