From e8d0ba7249486fbdcc47c4fa73884c9be2211009 Mon Sep 17 00:00:00 2001
From: tcarver <tjc>
Date: Wed, 24 Jul 2013 16:46:11 +0100
Subject: [PATCH] interface for user defined qualifiers

---
 .../components/UserDefinedQualifiers.java     | 382 ++++++++++++++++++
 1 file changed, 382 insertions(+)
 create mode 100644 uk/ac/sanger/artemis/components/UserDefinedQualifiers.java

diff --git a/uk/ac/sanger/artemis/components/UserDefinedQualifiers.java b/uk/ac/sanger/artemis/components/UserDefinedQualifiers.java
new file mode 100644
index 000000000..7eb10930d
--- /dev/null
+++ b/uk/ac/sanger/artemis/components/UserDefinedQualifiers.java
@@ -0,0 +1,382 @@
+/* UserDefinedQualifier
+ * This file is part of Artemis
+ *
+ * Copyright(C) 2013  Genome Research Limited
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ */
+package uk.ac.sanger.artemis.components;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+
+import uk.ac.sanger.artemis.Options;
+import uk.ac.sanger.artemis.components.genebuilder.JExtendedComboBox;
+import uk.ac.sanger.artemis.editor.MultiLineToolTipUI;
+import uk.ac.sanger.artemis.io.Qualifier;
+import uk.ac.sanger.artemis.io.QualifierVector;
+import uk.ac.sanger.artemis.util.Document;
+import uk.ac.sanger.artemis.util.FileDocument;
+import uk.ac.sanger.artemis.util.StringVector;
+import uk.ac.sanger.artemis.util.URLDocument;
+
+class UserDefinedQualifier extends JPanel
+{
+  private static final long serialVersionUID = 1L;
+  private static org.apache.log4j.Logger logger4j = 
+      org.apache.log4j.Logger.getLogger(UserDefinedQualifier.class);
+  private QualifierVector qualifiers = new QualifierVector();
+  private Box qualifierBox = Box.createHorizontalBox();
+  private JButton addButton = new JButton("ADD");
+  private ActionListener addListener;
+  private QualifierTextArea qualifier_text_area;
+  
+  UserDefinedQualifier()
+  {
+    MultiLineToolTipUI.initialize();
+    read();
+    createComponentToAddCvTerm();
+  }
+
+  public void setQualifierTextArea(QualifierTextArea qualifier_text_area)
+  {
+    this.qualifier_text_area = qualifier_text_area;
+  }
+  
+  public JFrame getFrame()
+  {
+    return (JFrame) SwingUtilities.getWindowAncestor(this);
+  }
+
+  /**
+   * Add components to the panel for adding CvTerm's to
+   * the annotation.
+   */
+  private void createComponentToAddCvTerm()
+  {
+    setLayout(new GridBagLayout());
+    final GridBagConstraints c = new GridBagConstraints();
+
+    final JCheckBox ignoreCase = new JCheckBox("Ignore case",true);
+    final JComboBox nameCombo = new JComboBox(getQualiferNames());
+    final Dimension d  = new Dimension(500, nameCombo.getPreferredSize().height);
+    final Dimension d2 = new Dimension(300, nameCombo.getPreferredSize().height);
+    
+    int row = 0;
+    
+    c.gridx = 0;
+    c.gridy = row;
+    c.anchor = GridBagConstraints.EAST;
+    add(new JLabel("Name: "), c);
+    
+    c.gridx = 1;
+    c.weightx = 0.5d;
+    c.anchor = GridBagConstraints.WEST;
+    add(nameCombo, c);
+    c.weightx = 0.d;
+    
+    c.gridx = 2;
+    c.weightx = 0.5d;
+    add(Box.createHorizontalStrut(150), c);
+    
+    // keyword
+    final JTextField keyWord = new JTextField(45);
+    keyWord.setSelectionStart(0);
+    keyWord.setSelectionEnd(keyWord.getText().length());
+    keyWord.setSelectedTextColor(Color.blue);
+    keyWord.setMinimumSize(d2);
+    keyWord.addActionListener(new ActionListener(){
+      // carry out search when enter key is pressed
+      public void actionPerformed(ActionEvent event)
+      {
+        searchQualifiers(keyWord.getText(), nameCombo, ignoreCase.isSelected(), d);
+      }
+    });
+    c.gridy = ++row;
+    c.gridx = 0;
+    c.anchor = GridBagConstraints.EAST;
+    add(new JLabel("Keywords: "),c);
+    c.gridx = 1;
+    c.anchor = GridBagConstraints.WEST;
+    add(keyWord,c);
+
+    c.gridy = ++row;
+    add(ignoreCase,c);
+     
+    // search button
+    c.gridx = 0;
+    c.gridy = ++row;
+    c.anchor = GridBagConstraints.WEST;
+    final JButton search = new JButton("SEARCH");
+    search.addActionListener(new ActionListener(){
+      public void actionPerformed(ActionEvent arg0)
+      {
+        searchQualifiers(keyWord.getText(), nameCombo, ignoreCase.isSelected(), d);
+      }
+    });
+    add(search,c);
+    
+    c.gridx = 0;
+    c.gridy = ++row;
+    c.gridwidth = 3;
+    qualifierBox.add(Box.createVerticalStrut(25));
+    add(qualifierBox, c);
+
+    c.gridx = 0;
+    c.gridy = ++row;
+    c.gridwidth = 1;
+    add(addButton, c);
+    
+    c.gridx = 1;
+    final JButton closeButton = new JButton("CLOSE");
+    add(closeButton, c);
+    closeButton.addActionListener(new ActionListener(){
+      public void actionPerformed(ActionEvent arg0)
+      {
+        final JFrame topFrame = 
+            (JFrame) SwingUtilities.getWindowAncestor(UserDefinedQualifier.this);
+        topFrame.dispose();
+      }
+    });
+    
+    c.gridy = ++row;
+    add(Box.createVerticalStrut(15), c);
+  }
+
+
+  /**
+   * Search the qualifiers for the selected qualifier name and value.
+   */
+  private void searchQualifiers(final String keyWord, 
+                                final JComboBox nameCombo, 
+                                final boolean ignoreCase,
+                                final Dimension d)
+  {
+    final String qName = (String) nameCombo.getSelectedItem();
+    final StringVector values = qualifiers.getQualifierByName(qName).getValues();
+    
+    if(keyWord != null && !keyWord.trim().equals(""))
+    {
+      final String keyWordLC = keyWord.toLowerCase();
+      final StringVector tmp = values.copy();
+      for(String val: tmp)
+      {
+        if(ignoreCase)
+        {
+          if(val.toLowerCase().indexOf(keyWordLC) == -1)
+            values.remove(val);
+        }
+        else if(val.indexOf(keyWord) == -1)
+          values.remove(val);
+      }
+    }
+    
+    final JExtendedComboBox valuesList = new JExtendedComboBox(values, true);
+    valuesList.getEditor().getEditorComponent().addMouseListener(
+        new ComboMouseListener(valuesList));
+    
+    valuesList.setPreferredSize(d);
+    valuesList.setMaximumSize(d);
+    
+    if(valuesList.getSelectedItem() != null &&
+       valuesList.getSelectedItem().equals("") &&
+       valuesList.getItemCount() > 2)
+      valuesList.setSelectedIndex(1);
+    
+    qualifierBox.removeAll();
+    qualifierBox.add(valuesList);
+    
+    if(addListener != null)
+      addButton.removeActionListener(addListener);
+    addListener = new ActionListener(){
+      public void actionPerformed(ActionEvent arg0)
+      {
+        qualifier_text_area.append("/"+qName+"="+valuesList.getSelectedItem()+"\n");
+      }
+    }; 
+    addButton.addActionListener(addListener);
+
+    revalidate();
+  }
+  
+  /**
+   * Return a list of the qualifier names.
+   * @return
+   */
+  private Vector<String> getQualiferNames()
+  {
+    final Vector<String> names = new Vector<String>();
+    for(Qualifier q: qualifiers)
+      names.add(q.getName());
+    return names;
+  }
+  
+  private void read()
+  {
+    InputStream ins = 
+        this.getClass().getClassLoader().getResourceAsStream("etc/artemis.qualifiers");
+    try
+    {
+      if(ins != null)
+      {
+        loadQualifiers(ins);
+        ins.close();
+      }
+    }
+    catch (IOException e)
+    {
+      e.printStackTrace();
+    }
+    catch (NullPointerException e2) {}
+    
+    final String [] qualFiles = 
+    {
+      "artemis.qualifiers",
+      System.getProperty("user.home") + File.separator + ".artemis.qualifiers"
+    };
+    
+    for(String fileName: qualFiles)
+    {
+      final Document doc = new FileDocument(new File(fileName));
+      if(doc.readable()) 
+      {
+        try
+        {
+          ins = doc.getInputStream();
+          loadQualifiers(ins);
+          ins.close();
+        }
+        catch (IOException e)
+        {
+          e.printStackTrace();
+        }
+        logger4j.debug("Reading qualifiers from: "+fileName);
+      }
+    }
+  }
+  
+  /**
+   * Load the qualifiers from an input stream.
+   * @param ins
+   */
+  private void loadQualifiers(final InputStream ins)
+  {
+    final BufferedReader br = new BufferedReader(new InputStreamReader(ins));
+    try
+    {
+      String line;
+      while((line = br.readLine()) != null) 
+      {
+        int idx = line.indexOf("name:");
+        if(idx > -1)
+        {
+          String val = line.substring(idx+5).trim();
+          while((line = br.readLine()) != null &&  
+                (idx = line.indexOf("namespace:")) > -1)
+          {
+            String name = line.substring(idx+10).trim();
+            logger4j.debug(name + "=" +val);
+            qualifiers.addQualifierValues(new Qualifier(name, val));
+          }
+        }
+        else if((idx = line.indexOf("import:")) > -1)
+        {
+          // import OBO file from a URL
+          final URL url = new URL(line.substring(idx+7).trim());
+          final Document doc = new URLDocument(url);
+          loadQualifiers(doc.getInputStream());
+        }
+      }
+    }
+    catch (IOException e)
+    {
+      e.printStackTrace();
+    }
+  }
+  
+  class ComboMouseListener extends MouseAdapter 
+  {
+    private JComboBox cb;
+    ComboMouseListener(JComboBox cb)
+    {
+      this.cb = cb;
+    }
+    
+    public void mouseEntered(MouseEvent me) 
+    {
+      cb.setToolTipText(getWrappedStr((String) cb.getSelectedItem()));
+    }
+    
+    private String getWrappedStr(String s)
+    {
+      final StringBuilder buff = new StringBuilder();
+      final int lineLen = 60;
+      for(int k=0; k<s.length(); k+=lineLen)
+      {
+        int end = k + lineLen;
+        if(end > s.length())
+          end = s.length();
+        buff.append ( s.substring(k,end) ).append("\n");
+      }
+      return buff.toString();
+    }
+  }
+  
+  public static void main(String args[])
+  {
+    final javax.swing.plaf.FontUIResource font_ui_resource =
+        Options.getOptions().getFontUIResource();
+
+    final Enumeration<Object> keys = UIManager.getDefaults().keys();
+    while(keys.hasMoreElements()) 
+    {
+      Object key = keys.nextElement();
+      Object value = UIManager.get(key);
+      if(value instanceof javax.swing.plaf.FontUIResource) 
+        UIManager.put(key, font_ui_resource);
+    }
+
+    final JFrame f = new JFrame("User Defined Qualifiers");
+    f.getContentPane().add(new UserDefinedQualifier());
+    f.pack();
+    f.setVisible(true);
+  }
+}
\ No newline at end of file
-- 
GitLab