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