From cca59534ea7c3550143a958a0d8e4b79c8c17346 Mon Sep 17 00:00:00 2001
From: tcarver <tjc>
Date: Mon, 12 Aug 2013 14:08:21 +0100
Subject: [PATCH] add user qualifier to selected features options

---
 .../artemis/components/FeatureEdit.java       |  1 +
 .../components/UserDefinedQualifiers.java     | 95 +++++++++++++++----
 2 files changed, 79 insertions(+), 17 deletions(-)

diff --git a/uk/ac/sanger/artemis/components/FeatureEdit.java b/uk/ac/sanger/artemis/components/FeatureEdit.java
index 613999b3b..fc55c7084 100644
--- a/uk/ac/sanger/artemis/components/FeatureEdit.java
+++ b/uk/ac/sanger/artemis/components/FeatureEdit.java
@@ -802,6 +802,7 @@ public class FeatureEdit extends JPanel
         userDefinedQualifierFrame.setLocation(p);
 
         userDefinedQualifierFrame.setQualifierTextArea(qualifier_text_area);
+        userDefinedQualifierFrame.setSelection(selection);
         userDefinedQualifierFrame.setVisible(true);
       }
     });
diff --git a/uk/ac/sanger/artemis/components/UserDefinedQualifiers.java b/uk/ac/sanger/artemis/components/UserDefinedQualifiers.java
index 6f0b1e6d5..9b069ff70 100644
--- a/uk/ac/sanger/artemis/components/UserDefinedQualifiers.java
+++ b/uk/ac/sanger/artemis/components/UserDefinedQualifiers.java
@@ -62,15 +62,19 @@ import javax.swing.event.MenuEvent;
 import javax.swing.event.MenuListener;
 import javax.swing.filechooser.FileFilter;
 
+import uk.ac.sanger.artemis.FeatureVector;
 import uk.ac.sanger.artemis.Options;
+import uk.ac.sanger.artemis.Selection;
 import uk.ac.sanger.artemis.components.genebuilder.JExtendedComboBox;
 import uk.ac.sanger.artemis.components.genebuilder.cv.DatePanel;
 import uk.ac.sanger.artemis.editor.MultiLineToolTipUI;
+import uk.ac.sanger.artemis.io.EntryInformationException;
 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.LinePushBackReader;
+import uk.ac.sanger.artemis.util.ReadOnlyException;
 import uk.ac.sanger.artemis.util.StringVector;
 import uk.ac.sanger.artemis.util.URLDocument;
 
@@ -95,6 +99,7 @@ class UserDefinedQualifier extends JFrame
   
   /* text area in the feature editor to add qualifiers to */
   private QualifierTextArea qualifier_text_area;
+  private Selection selection;
   private JPanel mainPanel;
   
   /* line pattern for tag=value */
@@ -200,10 +205,11 @@ class UserDefinedQualifier extends JFrame
     final GridBagConstraints c = new GridBagConstraints();
 
     final JCheckBox ignoreCase = new JCheckBox("Ignore case",true);
-    final JComboBox nameCombo = new JComboBox(getQualiferNames());
+    final Vector<String> names = getQualiferNames();
+    final JComboBox nameCombo = new JComboBox(names);   
     final JButton addButton = new JButton("ADD");
-    //final JScrollPane jspNames = new JScrollPane(nameCombo);
-
+    final JCheckBox addToAllSelected = new JCheckBox("add to all selected features", false);
+    final JTextField keyWord = new JTextField(45);
     final Dimension d  = new Dimension(500, ignoreCase.getPreferredSize().height);
     final Dimension d2 = new Dimension(300, ignoreCase.getPreferredSize().height);
     
@@ -211,17 +217,30 @@ class UserDefinedQualifier extends JFrame
     c.gridx = 0;
     c.gridy = row;
     c.anchor = GridBagConstraints.EAST;
-    mainPanel.add(new JLabel("Name: "), c);
     
-    c.gridx = 1;
-    c.anchor = GridBagConstraints.WEST;
-    mainPanel.add(nameCombo, c);
-
+    if(names.size() < 1)
+    {
+      c.gridwidth = 2;
+      mainPanel.add(new JLabel("Import a list of qualifiers from the File menu."), c);
+      c.gridwidth = 1;
+      ignoreCase.setEnabled(false);
+      nameCombo.setEnabled(false);
+      addButton.setEnabled(false);
+      addToAllSelected.setEnabled(false);
+      keyWord.setEnabled(false);
+    }
+    else
+    {
+      mainPanel.add(new JLabel("Name: "), c);
+      c.gridx = 1;
+      c.anchor = GridBagConstraints.WEST;
+      mainPanel.add(nameCombo, c);
+    }
+    
     c.gridx = 2;
     mainPanel.add(Box.createHorizontalStrut(150), c);
     
     // keyword
-    final JTextField keyWord = new JTextField(45);
     keyWord.setSelectionStart(0);
     keyWord.setSelectionEnd(keyWord.getText().length());
     keyWord.setSelectedTextColor(Color.blue);
@@ -231,7 +250,7 @@ class UserDefinedQualifier extends JFrame
       public void actionPerformed(ActionEvent event)
       {
         searchQualifiers(keyWord.getText(), nameCombo, 
-            ignoreCase.isSelected(), addButton, d);
+            ignoreCase.isSelected(), addButton, addToAllSelected, d);
       }
     });
     c.gridy = ++row;
@@ -254,7 +273,7 @@ class UserDefinedQualifier extends JFrame
       public void actionPerformed(ActionEvent arg0)
       {
         searchQualifiers(keyWord.getText(), nameCombo, 
-            ignoreCase.isSelected(), addButton, d);
+            ignoreCase.isSelected(), addButton, addToAllSelected, d);
       }
     });
     mainPanel.add(search,c);
@@ -268,8 +287,8 @@ class UserDefinedQualifier extends JFrame
     c.gridx = 0;
     c.gridy = ++row;
     c.gridwidth = 1;
-    mainPanel.add(addButton, c);
-    
+    mainPanel.add(addButton, c);  
+
     c.gridx = 1;
     final JButton closeButton = new JButton("CLOSE");
     mainPanel.add(closeButton, c);
@@ -280,6 +299,11 @@ class UserDefinedQualifier extends JFrame
       }
     });
     
+    c.gridx = 0;
+    c.gridy = ++row;
+    c.gridwidth = 2;
+    mainPanel.add(addToAllSelected,c);
+    
     c.gridy = ++row;
     mainPanel.add(Box.createVerticalStrut(15), c);
   }
@@ -319,6 +343,7 @@ class UserDefinedQualifier extends JFrame
                                 final JComboBox nameCombo, 
                                 final boolean ignoreCase,
                                 final JButton addButton,
+                                final JCheckBox addToAllSelected,
                                 final Dimension d)
   {
     final String qName = (String) nameCombo.getSelectedItem();
@@ -361,8 +386,38 @@ class UserDefinedQualifier extends JFrame
           qval = "/GO=aspect=C;"+qval+";date="+DatePanel.getDate();
         else
           qval = "/"+qName+"="+qval;
-
-        qualifier_text_area.append(qval+"\n");
+        
+        if(addToAllSelected.isSelected())
+        {
+          final FeatureVector features = selection.getAllFeatures();
+          if(!Options.isBlackBeltMode() && features.size() > 1)
+          {
+            int status = JOptionPane.showConfirmDialog(UserDefinedQualifier.this, 
+              "Add "+qName+" to "+features.size()+" selected features?",
+              "Add Qualifier To Selected Features", 
+              JOptionPane.OK_CANCEL_OPTION);
+            if(status == JOptionPane.CANCEL_OPTION)
+              return;
+          }
+          final int idx = qval.indexOf("=");
+          final Qualifier q = new Qualifier(qval.substring(1, idx), qval.substring( idx+1 ));
+          
+          try
+          {
+            for(int i=0; i<features.size(); i++)
+              features.elementAt(i).addQualifierValues(q);
+          }
+          catch (ReadOnlyException e)
+          {
+            e.printStackTrace();
+          }
+          catch (EntryInformationException e)
+          {
+            e.printStackTrace();
+          }
+        }
+        else
+          qualifier_text_area.append(qval+"\n");
       }
     }; 
     addButton.addActionListener(addListener);
@@ -565,7 +620,7 @@ class UserDefinedQualifier extends JFrame
     
     createComponentToAddCvTerm();
     mainPanel.revalidate();
-    
+    mainPanel.repaint();
     //if(autoImport.isSelected())
     writeQualifierList(fc.getSelectedFile().getAbsolutePath());
   }
@@ -587,6 +642,7 @@ class UserDefinedQualifier extends JFrame
       createObo(new URLDocument(new URL(urlStr)));
       createComponentToAddCvTerm();
       mainPanel.revalidate();
+      mainPanel.repaint();
       
       writeQualifierList(urlStr);
     }
@@ -739,11 +795,16 @@ class UserDefinedQualifier extends JFrame
     }
   }
   
-  protected void setQualifierTextArea(QualifierTextArea qualifier_text_area)
+  protected void setQualifierTextArea(final QualifierTextArea qualifier_text_area)
   {
     this.qualifier_text_area = qualifier_text_area;
   }
   
+  protected void setSelection(final Selection selection)
+  {
+    this.selection = selection;
+  }
+  
   private class ComboMouseListener extends MouseAdapter 
   {
     private JComboBox cb;
-- 
GitLab