1   /*
2    *  Copyright (c) 1998-2001, The University of Sheffield.
3    *
4    *  This file is part of GATE (see http://gate.ac.uk/), and is free
5    *  software, licenced under the GNU Library General Public License,
6    *  Version 2, June 1991 (in the distribution as file licence.html,
7    *  and also available at http://gate.ac.uk/gate/licence.html).
8    *
9    *  Valentin Tablan 12/07/2001
10   *
11   *  $Id: CorpusEditor.java,v 1.12 2001/12/03 14:04:04 kalina Exp $
12   *
13   */
14  package gate.gui;
15  
16  import gate.creole.AbstractVisualResource;
17  import gate.*;
18  import gate.util.*;
19  
20  
21  import java.awt.*;
22  import java.awt.event.*;
23  import javax.swing.*;
24  import javax.swing.event.*;
25  import java.util.*;
26  import gate.event.*;
27  
28  /**
29   * A simple viewer/editor for corpora. It will allow the visualisation of the
30   * list of documents inside a corpus along withe their features.
31   * It will also allow addition and removal of documents.
32   */
33  public class CorpusEditor extends AbstractVisualResource implements CorpusListener {
34  
35    public Resource init(){
36      initLocalData();
37      initGuiComponents();
38      initListeners();
39      return this;
40    }
41  
42  
43    protected void initLocalData(){
44      docListModel = new DefaultListModel();
45    }
46  
47    protected void initGuiComponents(){
48      setLayout(new BorderLayout());
49  
50      documentsList = new JList(docListModel);
51      documentsList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
52      listRenderer = new DocumentListCellRenderer();
53      documentsList.setCellRenderer(listRenderer);
54      JScrollPane listScroll = new JScrollPane(documentsList);
55  
56  //    featuresEditor = new FeaturesEditor();
57  //    JScrollPane fEdScroll = new JScrollPane(featuresEditor);
58  //
59  //    JSplitPane mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
60  //                                          listScroll, fEdScroll);
61  //    mainSplit.setDividerLocation(0.30);
62  //    add(mainSplit, BorderLayout.CENTER);
63  
64      add(listScroll, BorderLayout.CENTER);
65  
66      toolbar = new JToolBar();
67      toolbar.setFloatable(false);
68      toolbar.add(new NewDocumentAction());
69      toolbar.add(new RemoveDocumentsAction());
70  
71      add(toolbar, BorderLayout.NORTH);
72    }
73  
74    protected void initListeners(){
75  /*
76  //kalina: I commented it, because we want the corpus viewer to show only the
77  //document names and not add the documents to memory
78      documentsList.addListSelectionListener(new ListSelectionListener(){
79        public void valueChanged(ListSelectionEvent e){
80          featuresEditor.setTarget(
81            (docListModel.isEmpty() || documentsList.getSelectedIndex() == -1) ?
82            null : docListModel.get(documentsList.getSelectedIndex())
83          );
84        }
85      });
86  */
87      documentsList.addMouseListener(new MouseAdapter() {
88        public void mouseClicked(MouseEvent e) {
89          if(SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2){
90            int row = documentsList.locationToIndex(e.getPoint());
91            if(row != -1){
92              Document doc = (Document) corpus.get(row);
93            }
94          }
95        }
96  
97        public void mousePressed(MouseEvent e) {
98        }
99  
100       public void mouseReleased(MouseEvent e) {
101       }
102 
103       public void mouseEntered(MouseEvent e) {
104       }
105 
106       public void mouseExited(MouseEvent e) {
107       }
108     });
109   }
110 
111   public void setTarget(Object target){
112     if(!(target instanceof Corpus)){
113       throw new IllegalArgumentException(
114         "The GATE corpus editor can only be used with a GATE corpus!\n" +
115         target.getClass().toString() + " is not a GATE corpus!");
116     }
117     this.corpus = (Corpus)target;
118     corpus.addCorpusListener(this);
119 
120     docListModel.clear();
121     java.util.List docNamesList = corpus.getDocumentNames();
122     Iterator namesIter = docNamesList.iterator();
123     while(namesIter.hasNext()){
124       String docName = (String) namesIter.next();
125       docListModel.addElement(docName);
126     }
127 
128     if(!docListModel.isEmpty())
129       SwingUtilities.invokeLater(new Runnable(){
130         public void run(){
131           documentsList.setSelectedIndex(0);
132         }
133       });
134   }
135 
136   public void documentAdded(final CorpusEvent e) {
137     SwingUtilities.invokeLater(new Runnable(){
138       public void run(){
139         //a new document has been added to the corpus
140         Document doc = e.getDocument();
141         docListModel.addElement(doc.getName());
142       }
143     });
144   }
145 
146   public void documentRemoved(final CorpusEvent e) {
147     SwingUtilities.invokeLater(new Runnable(){
148       public void run(){
149         docListModel.removeElementAt(e.getDocumentIndex());
150       }
151     });
152   }
153 
154 
155   class DocumentListCellRenderer extends DefaultListCellRenderer{
156     public Component getListCellRendererComponent(JList list,
157                                               Object value,
158                                               int index,
159                                               boolean isSelected,
160                                               boolean cellHasFocus){
161       //prepare the renderer
162       String docName = (String)value;
163       super.getListCellRendererComponent(list, docName, index,
164                                          isSelected, cellHasFocus);
165       setIcon(MainFrame.getIcon("lr.gif"));
166       return this;
167     }
168   }
169 
170 
171   class NewDocumentAction extends AbstractAction{
172     public NewDocumentAction(){
173       super("Add document", MainFrame.getIcon("add.gif"));
174       putValue(SHORT_DESCRIPTION, "Add a new document to this corpus");
175     }
176 
177     public void actionPerformed(ActionEvent e){
178       try{
179         //get all the documents loaded in the system
180         java.util.List loadedDocuments = Gate.getCreoleRegister().
181                                getAllInstances("gate.Document");
182         if(loadedDocuments == null || loadedDocuments.isEmpty()){
183           JOptionPane.showMessageDialog(
184               CorpusEditor.this,
185               "There are no documents available in the system!\n" +
186               "Please load some and try again!" ,
187               "Gate", JOptionPane.ERROR_MESSAGE);
188           return;
189         }
190 
191         Vector docNames = new Vector(loadedDocuments.size());
192         for (int i = 0; i< loadedDocuments.size(); i++) {
193           docNames.add(((Document)loadedDocuments.get(i)).getName());
194         }
195         JList docList = new JList(docNames);
196         docList.setCellRenderer(listRenderer);
197 
198         JOptionPane dialog = new JOptionPane(new JScrollPane(docList),
199                                              JOptionPane.QUESTION_MESSAGE,
200                                              JOptionPane.OK_CANCEL_OPTION);
201         dialog.createDialog(CorpusEditor.this,
202                             "Add document(s) to corpus").show();
203 
204         if(((Integer)dialog.getValue()).intValue() == dialog.OK_OPTION){
205           int[] selection = docList.getSelectedIndices();
206           for (int i = 0; i< selection.length ; i++) {
207             corpus.add(loadedDocuments.get(selection[i]));
208           }
209         }
210       }catch(GateException ge){
211         //gate.Document is not registered in creole.xml....what is!?
212         throw new GateRuntimeException(
213           "gate.Document is not registered in the creole register!\n" +
214           "Something must be terribly wrong...take a vacation!");
215       }
216     }
217   }//class NewDocumentAction extends AbstractAction
218 
219   class RemoveDocumentsAction extends AbstractAction{
220     public RemoveDocumentsAction(){
221       super("Rmove documents", MainFrame.getIcon("remove.gif"));
222       putValue(SHORT_DESCRIPTION, "Removes selected documents from this corpus");
223     }
224 
225     public void actionPerformed(ActionEvent e){
226       int[] selectedIndexes = documentsList.getSelectedIndices();
227       for(int i = selectedIndexes.length-1; i >= 0; i--){
228         corpus.remove(selectedIndexes[i]);
229       }
230       documentsList.clearSelection();
231     }
232   }//class RemoveDocumentsAction extends AbstractAction
233 
234 
235   JList documentsList;
236   DocumentListCellRenderer listRenderer;
237   FeaturesEditor featuresEditor;
238   JToolBar toolbar;
239   Corpus corpus;
240   DefaultListModel docListModel;
241 }
242