Log in Help
Print
Homereleasesgate-8.4-build5748-ALLpluginsWordNetsrcgateguiwordnet 〉 WordNetViewer.java
 
/*
 *  WordNetViewer.java
 *
 *  Copyright (c) 1995-2012, The University of Sheffield. See the file
 *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *  Rosen Marinov, 29/05/2002
 *
 */
package gate.gui.wordnet;

import gate.creole.AbstractVisualResource;
import gate.wordnet.LexicalRelation;
import gate.wordnet.Relation;
import gate.wordnet.SemanticRelation;
import gate.wordnet.Synset;
import gate.wordnet.Verb;
import gate.wordnet.VerbFrame;
import gate.wordnet.WordNet;
import gate.wordnet.WordNetException;
import gate.wordnet.WordSense;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;

public class WordNetViewer extends AbstractVisualResource
                           implements ActionListener{

  private static final long serialVersionUID = -3934904786556278822L;
  
  protected JLabel searchLabel = new JLabel();
  protected JTextField searchWordTextField = new JTextField();
  protected JButton searchButton = new JButton();
  protected JTextPane resultPane = new JTextPane();
  protected JLabel searchLabel2 = new JLabel();
  protected JButton nounButton = new JButton();
  protected JButton verbButton = new JButton();
  protected JButton adjectiveButton = new JButton();
  protected JButton adverbButton = new JButton();
  protected JScrollPane scrollPane = new JScrollPane();
  protected GridBagLayout gridBagLayout1 = new GridBagLayout();

  protected JPopupMenu nounPopup;
  protected JPopupMenu verbPopup;
  protected JPopupMenu adjectivePopup;
  protected JPopupMenu adverbPopup;

  private WordNet wnMain = null;

  private boolean sentenceFrames = false;
  public final static int SENTENCE_FRAMES = 33001;

  public WordNetViewer(){
     searchLabel.setText("Search Word:");
        this.setLayout(gridBagLayout1);
        searchButton.setText("Search");
        searchButton.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                searchButton_actionPerformed(e);
            }
        });
        searchWordTextField.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                searchWordTextField_actionPerformed(e);
            }
        });
        searchLabel2.setText("Searches for ... :");
        nounButton.setText("Noun");
        verbButton.setText("Verb");
        adjectiveButton.setText("Adjective");
        adverbButton.setText("Adverb");

        nounButton.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nounButton_actionPerformed(e);
            }
        });
        verbButton.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                verbButton_actionPerformed(e);
            }
        });
        adjectiveButton.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                adjectiveButton_actionPerformed(e);
            }
        });
        adverbButton.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                adverbButton_actionPerformed(e);
            }
        });
        nounButton.setEnabled(false);
        verbButton.setEnabled(false);
        adjectiveButton.setEnabled(false);
        adverbButton.setEnabled(false);

        resultPane.setEditable(false);
        scrollPane.getViewport().add(resultPane);

        this.add(searchLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
        this.add(searchWordTextField, new GridBagConstraints(1, 0, 5, 1, 1.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0));
        this.add(scrollPane, new GridBagConstraints(0, 2, 7, 1, 1.0, 1.0
            ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
        this.add(searchLabel2, new GridBagConstraints(0, 1, 2, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
        this.add(searchButton, new GridBagConstraints(6, 0, 1, 1, 0.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
        this.add(adjectiveButton, new GridBagConstraints(4, 1, 1, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
        this.add(verbButton, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
        this.add(nounButton, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
        this.add(adverbButton, new GridBagConstraints(5, 1, 1, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
  }

  private void searchButton_actionPerformed(ActionEvent e) {
    actionSearch();
  }

  private void searchWordTextField_actionPerformed(ActionEvent e) {
    actionSearch();
  }

  private void actionSearch(){
    String text = searchWordTextField.getText().trim();
    text = text.replace(' ','_');
    searchLabel2.setText("Searches for " + text + ":");

    nounButton.setEnabled(false);
    verbButton.setEnabled(false);
    adjectiveButton.setEnabled(false);
    adverbButton.setEnabled(false);

    nounPopup = new JPopupMenu();
    verbPopup = new JPopupMenu();
    adjectivePopup = new JPopupMenu();
    adverbPopup = new JPopupMenu();

    StringBuffer display = new StringBuffer("");

    addToResult(display, text, WordNet.POS_NOUN);
    addToResult(display, text, WordNet.POS_VERB);
    addToResult(display, text, WordNet.POS_ADJECTIVE);
    addToResult(display, text, WordNet.POS_ADVERB);

    resultPane.setText(display.toString());

  }

  private void addToResult(StringBuffer display,  String text, int wordType) {
    List<WordSense> senses = null;
    try {
      wnMain.cleanup();
      senses = wnMain.lookupWord(text, wordType);
    } catch (WordNetException wne) {
      wne.printStackTrace();
    }

    if ( senses!=null && senses.size()>0){

      String wordIdentifier = "";
      switch (wordType){
        case WordNet.POS_NOUN:
          wordIdentifier = "noun";
          nounButton.setEnabled(true);
          break;
        case WordNet.POS_VERB:
          wordIdentifier = "verb";
          verbButton.setEnabled(true);
          break;
        case WordNet.POS_ADJECTIVE:
          wordIdentifier = "adjective";
          adjectiveButton.setEnabled(true);
          break;
        case WordNet.POS_ADVERB:
          wordIdentifier = "adverb";
          adverbButton.setEnabled(true);
          break;
      }

      display.append("\n");
      display.append("The ");
      display.append(wordIdentifier);
      display.append(" ");
      display.append(text);
      display.append(" has ");
      display.append(senses.size());
      display.append(" senses:");
      display.append("\n\n");
      for (int i=0; i< senses.size(); i++) {
        WordSense currSense = senses.get(i);
        Synset currSynset = currSense.getSynset();
        addToPopupMenu(currSense, currSynset, wordType, senses);
        List<WordSense> words = currSynset.getWordSenses();
        String wordsString = getWords(words);

        display.append(" " + (i+1) + ". " + wordsString + " -- " + currSynset.getGloss());
        display.append("\n");
      }
    }
  }

  private void addToPopupMenu(WordSense wordSense, Synset synset, int wordType, List<WordSense> senses){
    List<SemanticRelation> semRelations = null;
    try {
      semRelations = synset.getSemanticRelations();
    } catch (Exception e){
      e.printStackTrace();
    }

    List<LexicalRelation> lexRelations = null;
    try {
      lexRelations = wordSense.getLexicalRelations();
    } catch (Exception e){
      e.printStackTrace();
    }

    for (int i=0; i<(semRelations.size()+lexRelations.size()); i++) {
      Relation relation;
      if (i<semRelations.size()){
        relation = semRelations.get(i);
      } else {
        relation = lexRelations.get(i-semRelations.size());
      }

      switch (wordType) {
        case WordNet.POS_NOUN:
          if (false == existInPopup(nounPopup, getLabel(relation)) ){
            nounPopup.add(new RelationItem(getLabel(relation), relation.getType(), senses));
          }
          break;
        case WordNet.POS_VERB:
          //commented because problem with WN API and Sentence Frames
          if (!sentenceFrames){
            verbPopup.add(new RelationItem("Sentence Frames", SENTENCE_FRAMES, senses));
            sentenceFrames = true;
          }
          if (false == existInPopup(verbPopup, getLabel(relation)) ){
            verbPopup.add(new RelationItem(getLabel(relation), relation.getType(), senses));
          }
          break;
        case WordNet.POS_ADJECTIVE:
          if (false == existInPopup(adjectivePopup, getLabel(relation)) ){
            adjectivePopup.add(new RelationItem(getLabel(relation), relation.getType(), senses));
          }
          break;
        case WordNet.POS_ADVERB:
          if (false == existInPopup(adverbPopup, getLabel(relation)) ){
            adverbPopup.add(new RelationItem(getLabel(relation), relation.getType(), senses));
          }
          break;
      }
    }
  }

  private boolean existInPopup(JPopupMenu menu, String name){
    boolean result = false;
    for (int i=0; i<menu.getComponents().length; i++){
      if ( menu.getComponents()[i].getName().equals(name)){
        result = true;
        break;
      }
    }
    return result;
  }

  void nounButton_actionPerformed(ActionEvent e) {
    nounPopup.show(nounButton, 0, nounButton.getHeight());
  }

  void verbButton_actionPerformed(ActionEvent e) {
    verbPopup.show(verbButton, 0, verbButton.getHeight());
  }

  void adjectiveButton_actionPerformed(ActionEvent e) {
    adjectivePopup.show(adjectiveButton, 0, adjectiveButton.getHeight());
  }

  void adverbButton_actionPerformed(ActionEvent e) {
    if (adverbPopup.getComponentCount()>0){
      adverbPopup.show(adverbButton, 0, adverbButton.getHeight());
    }
  }

  @Override
  public void actionPerformed(ActionEvent e){
    RelationItem ri = (RelationItem) e.getSource();
    switch (ri.getRelationType()){
      case Relation.REL_ANTONYM:
        relAntonymSeeAlso(ri.getSenses(), Relation.REL_ANTONYM,"=> ");
        break;
      case Relation.REL_ATTRIBUTE:
        relAtributeSimilarTo(ri.getSenses(), Relation.REL_ATTRIBUTE, "=> ");
        break;
      case Relation.REL_CAUSE:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_CAUSE, "=> ");
        break;
      case Relation.REL_DERIVED_FROM_ADJECTIVE:
        relAntonymSeeAlso(ri.getSenses(), Relation.REL_DERIVED_FROM_ADJECTIVE,"=> ");
        break;
      case Relation.REL_ENTAILMENT:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_ENTAILMENT, "=> ");
        break;
      case Relation.REL_HYPERNYM:
        relHypernym(ri.getSenses());
        break;
      case Relation.REL_HYPONYM:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_HYPONYM, "=> ");
        break;
      case Relation.REL_MEMBER_HOLONYM:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_MEMBER_HOLONYM,"MEMBER OF: ");
        break;
      case Relation.REL_MEMBER_MERONYM:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_MEMBER_MERONYM, "HAS MEMBER: ");
        break;
      case Relation.REL_PARTICIPLE_OF_VERB:
        relAntonymSeeAlso(ri.getSenses(), Relation.REL_PARTICIPLE_OF_VERB,"=> ");
        break;
      case Relation.REL_PART_HOLONYM:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_PART_HOLONYM, "PART OF: ");
        break;
      case Relation.REL_PART_MERONYM:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_PART_MERONYM, "HAS PART: ");
        break;
      case Relation.REL_PERTAINYM:
        break;
      case Relation.REL_SEE_ALSO:
        relAntonymSeeAlso(ri.getSenses(), Relation.REL_SEE_ALSO,"=> ");
        break;
      case Relation.REL_SIMILAR_TO:
        relAtributeSimilarTo(ri.getSenses(), Relation.REL_SIMILAR_TO, "=> ");
        break;
      case Relation.REL_SUBSTANCE_HOLONYM:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_SUBSTANCE_HOLONYM,
                             " SUBSTANCE OF: ");
        break;
      case Relation.REL_SUBSTANCE_MERONYM:
        relHoloMeroHypo(ri.getSenses(), Relation.REL_SUBSTANCE_MERONYM, "HAS SUBSTANCE: ");
        break;
      case Relation.REL_VERB_GROUP:
        relAtributeSimilarTo(ri.getSenses(), Relation.REL_VERB_GROUP, "=> ");
        break;
      case SENTENCE_FRAMES:
        sentenceFrames(ri.getSenses());
        break;
    }
  }

  private void relHypernym(List<WordSense> senses){
    StringBuffer display = new StringBuffer("");
    for (int i = 0; i<senses.size(); i++){
      //display.append(getDescription(Relation.REL_HYPERNYM));
      display.append("\n");
      display.append("Sense ");
      display.append(i+1);
      display.append("\n");

      WordSense currSense = senses.get(i);
      Synset currSynset = currSense.getSynset();
      recursiveHypernym(currSynset, display, "  =>");
    }

    resultPane.setText(display.toString());
  }

  private void recursiveHypernym(Synset synset, StringBuffer display, String prefix){
    List<WordSense> words = synset.getWordSenses();
    String wordsString = getWords(words);

    display.append(prefix);
    display.append(" ");
    display.append(wordsString);
    display.append(" -- ");
    display.append(synset.getGloss());
    display.append("\n");

    List<SemanticRelation>  hList = null;
    try {
      hList = synset.getSemanticRelations(Relation.REL_HYPERNYM);
    } catch (Exception e){
      e.printStackTrace();
    }
    if (hList!=null && hList.size()>0){
      SemanticRelation rel = hList.get(0);
      prefix = "    " + prefix;
      recursiveHypernym(rel.getTarget(), display, prefix);
    }
  }


  private void relHoloMeroHypo(List<WordSense> senses, int relationType,
                               String relRefString){
    StringBuffer display = new StringBuffer("");
    for (int i = 0; i<senses.size(); i++){
      WordSense currSense = senses.get(i);
      Synset currSynset = currSense.getSynset();
      try {
        if (currSynset.getSemanticRelations(relationType).size()>0){
          //display.append(getDescription(relationType));
          display.append("\n");
          display.append("Sense ");
          display.append(i+1);
          display.append("\n");
          recursiveHoloMeroHypo(currSynset, display, "  ", false,
                                relationType, relRefString);
        }
      } catch (Exception e){
        e.printStackTrace();
      }
    }

    resultPane.setText(display.toString());
  }

  private void recursiveHoloMeroHypo(Synset synset, StringBuffer display,
                                String prefix, boolean symbPrefix,
                                int relationType, String relRefString){

    List<WordSense> words = synset.getWordSenses();
    String wordsString = getWords(words);

    display.append(prefix);
    if (symbPrefix) {
      display.append(relRefString);
    }
    display.append(wordsString);
    display.append(" -- ");
    display.append(synset.getGloss());
    display.append("\n");

    List<SemanticRelation>  holoList = null;
    try {
      holoList = synset.getSemanticRelations(relationType);
    } catch (Exception e){
      e.printStackTrace();
    }
    if (holoList!=null && holoList.size()>0){
      for (int i = 0; i<holoList.size(); i++){
        SemanticRelation rel = holoList.get(i);
        prefix = "    " + prefix;
        recursiveHoloMeroHypo(rel.getTarget(), display, prefix, true,
                              relationType, relRefString);
        prefix = prefix.substring(4, prefix.length());
      }
    }
  }

  private void relAntonymSeeAlso(List<WordSense> senses,
                                 int relType, String relRefString){
    StringBuffer display = new StringBuffer("");
    boolean semantic_see_also = true;
    for (int i = 0; i<senses.size(); i++){
      WordSense currSense = senses.get(i);
      Synset currSynset = currSense.getSynset();
      try {
        List<LexicalRelation> antonyms = currSense.getLexicalRelations(relType);
        if (antonyms!=null && antonyms.size()>0){
          semantic_see_also = false;
          //display.append(getDescription(relType));
          display.append("\n");
          display.append("Sense ");
          display.append(i+1);
          display.append("\n  ");
          display.append(getWords(currSynset.getWordSenses()));
          display.append(" -- ");
          display.append(currSynset.getGloss());
          display.append("\n");
          for (int j=0; j<antonyms.size(); j++){
            LexicalRelation rel = antonyms.get(j);
            WordSense word = rel.getTarget();
            display.append("      ");
            display.append(relRefString);
            display.append(word.getWord().getLemma());
            display.append(" -- ");
            display.append(word.getSynset().getGloss());
            display.append("\n");
          }
          display.append("\n");
        }
      } catch (Exception e){
        e.printStackTrace();
      }
    }

    resultPane.setText(display.toString());
    if (semantic_see_also){
        relAtributeSimilarTo(senses, Relation.REL_SEE_ALSO,"=> ");
    }
  }

  private void relAtributeSimilarTo(List<WordSense> senses, int releationType,
                                     String relRefString){
    StringBuffer display = new StringBuffer("");
    for (int i = 0; i<senses.size(); i++){
      WordSense currSense = senses.get(i);
      Synset currSynset = currSense.getSynset();
      try {
        List<SemanticRelation> atributes = currSynset.getSemanticRelations(releationType);
        if (atributes!=null && atributes.size()>0){
          //display.append(getDescription(releationType));
          display.append("\n");
          display.append("Sense ");
          display.append(i+1);
          display.append("\n  ");
          display.append(getWords(currSynset.getWordSenses()));
          display.append(" -- ");
          display.append(currSynset.getGloss());
          display.append("\n");
          for (int j=0; j<atributes.size(); j++){
            SemanticRelation rel = atributes.get(j);
            Synset synset = rel.getTarget();
            display.append("     ");
            display.append(relRefString);
            display.append(getWords(synset.getWordSenses()));

            display.append(" -- ");
            display.append(synset.getGloss());
            display.append("\n");
          }
          display.append("\n");
        }
      } catch (Exception e){
        e.printStackTrace();
      }
    }

    resultPane.setText(display.toString());
  }


  private String getWords(List<WordSense> words){
    StringBuffer wordsString = new StringBuffer("");
    for (int j = 0; j<words.size(); j++){
      WordSense word = words.get(j);
      wordsString.append(word.getWord().getLemma().replace('_',' '));
      if (j<(words.size()-1)){
        wordsString.append(", ");
      }
    }
    return wordsString.toString();
  }

  private void sentenceFrames(List<WordSense> senses){
    StringBuffer display = new StringBuffer("");
    for (int i=0; i<senses.size(); i++) {
      WordSense currSense = senses.get(i);
      Synset currSynset = currSense.getSynset();
      Verb currVerb = (Verb) currSense;
      List<VerbFrame> frames = currVerb.getVerbFrames();

      display.append("\nSense ");
      display.append(i+1);
      display.append("\n  ");
      display.append(getWords(currSynset.getWordSenses()));
      display.append(" -- ");
      display.append(currSynset.getGloss());
      display.append("\n");

        for (int j=0; j<frames.size(); j++){
          display.append("        *> ");
          display.append(frames.get(j).getFrame());
          display.append("\n");
        }
    }
    resultPane.setText(display.toString());
  }


  public String getLabel(Relation r){

    String result = "";
    switch (r.getType()){
      case Relation.REL_ANTONYM:
        result = "Antonym";
        break;
      case Relation.REL_ATTRIBUTE:
        result = "Attribute";
        break;
      case Relation.REL_CAUSE:
        result = "Cause";
        break;
      case Relation.REL_DERIVED_FROM_ADJECTIVE:
        result = "Derived From Adjective";
        break;
      case Relation.REL_ENTAILMENT:
        result = "Entailment";
        break;
      case Relation.REL_HYPERNYM:
        result = "Hypernym";
        break;
      case Relation.REL_HYPONYM:
        result = "Hyponym";
        break;
      case Relation.REL_MEMBER_HOLONYM:
        result = "Member Holonym";
        break;
      case Relation.REL_MEMBER_MERONYM:
        result = "Member Meronym";
        break;
      case Relation.REL_PARTICIPLE_OF_VERB:
        result = "Participle Of Verb";
        break;
      case Relation.REL_PART_HOLONYM:
        result = "Holonym";
        break;
      case Relation.REL_PART_MERONYM:
        result = "Meronym";
        break;
      case Relation.REL_PERTAINYM:
        result = "Pertainym";
        break;
      case Relation.REL_SEE_ALSO:
        result = "See Also";
        break;
      case Relation.REL_SIMILAR_TO:
        result = "Similar To";
        break;
      case Relation.REL_SUBSTANCE_HOLONYM:
        result = "Substance Holonym";
        break;
      case Relation.REL_SUBSTANCE_MERONYM:
        result = "Substance Meronym";
        break;
      case Relation.REL_VERB_GROUP:
        result = "Verb Group";
        break;
    }
    return result;
  }

  public String getDescription(int rel){

    String result = "";
    switch (rel){
      case Relation.REL_ANTONYM:
        result = "Antonyms:";
        break;
      case Relation.REL_ATTRIBUTE:
        result = "Attributes:";
        break;
      case Relation.REL_CAUSE:
        result = "Cause:";
        break;
      case Relation.REL_DERIVED_FROM_ADJECTIVE:
        result = "Derived From Adjective:";
        break;
      case Relation.REL_ENTAILMENT:
        result = "Entailments:";
        break;
      case Relation.REL_HYPERNYM:
        result = "Hypernyms:";
        break;
      case Relation.REL_HYPONYM:
        result = "Hyponyms:";
        break;
      case Relation.REL_MEMBER_HOLONYM:
        result = "Member Holonyms:";
        break;
      case Relation.REL_MEMBER_MERONYM:
        result = "Member Meronyms:";
        break;
      case Relation.REL_PARTICIPLE_OF_VERB:
        result = "Participle Of Verb:";
        break;
      case Relation.REL_PART_HOLONYM:
        result = "Holonyms:";
        break;
      case Relation.REL_PART_MERONYM:
        result = "Meronyms:";
        break;
      case Relation.REL_PERTAINYM:
        result = "Pertainyms:";
        break;
      case Relation.REL_SEE_ALSO:
        result = "See Also:";
        break;
      case Relation.REL_SIMILAR_TO:
        result = "Similar To:";
        break;
      case Relation.REL_SUBSTANCE_HOLONYM:
        result = "Substance Holonyms:";
        break;
      case Relation.REL_SUBSTANCE_MERONYM:
        result = "Substance Meronyms:";
        break;
      case Relation.REL_VERB_GROUP:
        result = "Verb Group:";
        break;
    }
    return result;
  }


  /**
   * Called by the GUI when this viewer/editor has to initialise itself for a
   * specific object.
   * @param target the object (be it a {@link gate.Resource},
   * {@link gate.DataStore} or whatever) this viewer has to display
   */
  @Override
  public void setTarget(Object target){

    if (false == target instanceof WordNet) {
      throw new IllegalArgumentException();
    }

    this.wnMain = (WordNet)target;
  }

  private class RelationItem extends JMenuItem{

    private static final long serialVersionUID = -4096509078870160667L;
    
    int relType;
    List<WordSense> senses;

    public RelationItem(String name, int type, List<WordSense> sen) {
      super(name);
      this.addActionListener(WordNetViewer.this);
      relType = type;
      senses = sen;
      setName(name);
    }

    public int getRelationType() {
      return relType;
    }

    public List<WordSense> getSenses(){
      return senses;
    }
  }

}