JAL-4061 JAL-4062 button in Find dialog to copy highlighted regions to clipboard
[jalview.git] / src / jalview / gui / Finder.java
index df56986..6dacbd8 100755 (executable)
@@ -28,6 +28,7 @@ import java.awt.event.KeyEvent;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
@@ -252,6 +253,37 @@ public class Finder extends GFinder
     new FeatureEditor(ap, seqs, features, true).showDialog();
   }
 
+  @Override
+  protected void copyToClipboard_actionPerformed()
+  {
+    if (searchResults.isEmpty())
+    {
+      return; // shouldn't happen
+    }
+    List<SequenceI> seqs = new ArrayList<>();
+
+    String searchString = searchBox.getUserInput();
+    String desc = "Search Results";
+
+    /*
+     * assemble dataset sequences, and template new sequence features,
+     * for the amend features dialog
+     */
+    for (SearchResultMatchI match : searchResults.getResults())
+    {
+      SequenceI seq = match.getSequence();
+      while (seq.getDatasetSequence() != null)
+      {
+        seq = seq.getDatasetSequence();
+      }
+      seqs.add(seq.getSubSequence(seq.findIndex(match.getStart()),
+              seq.findIndex(match.getEnd()) + 1));
+    }
+    Desktop.jalviewClipboard = new Object[] {
+        seqs.toArray(new SequenceI[0]), ap.av.getAlignment().getDataset(),
+        ap.av.getAlignment().getHiddenColumns() };
+  }
+
   /**
    * Search the alignment for the next or all matches. If 'all matches', a
    * dialog is shown with the number of sequence ids and subsequences matched.
@@ -261,6 +293,7 @@ public class Finder extends GFinder
   void doSearch(boolean doFindAll)
   {
     createFeatures.setEnabled(false);
+    copyToClipboard.setEnabled(false);
 
     String searchString = searchBox.getUserInput();
 
@@ -284,16 +317,17 @@ public class Finder extends GFinder
 
     boolean isCaseSensitive = caseSensitive.isSelected();
     boolean doSearchDescription = searchDescription.isSelected();
+    boolean doSearchfeatures = searchFeatures.isSelected();
     boolean skipHidden = ignoreHidden.isSelected();
     if (doFindAll)
     {
       finder.findAll(searchString, isCaseSensitive, doSearchDescription,
-              skipHidden);
+              doSearchfeatures, skipHidden);
     }
     else
     {
       finder.findNext(searchString, isCaseSensitive, doSearchDescription,
-              skipHidden);
+              doSearchfeatures, skipHidden);
     }
 
     searchResults = finder.getSearchResults();
@@ -307,6 +341,7 @@ public class Finder extends GFinder
     else
     {
       createFeatures.setEnabled(true);
+      copyToClipboard.setEnabled(true);
     }
 
     searchBox.updateCache();
@@ -334,9 +369,8 @@ public class Finder extends GFinder
         {
           if (idMatch.size() > 0 && searchResults.getCount() > 0)
           {
-            message.append(" ").append(
-                    MessageManager.getString("label.and").toLowerCase())
-                    .append(" ");
+            message.append(" ").append(MessageManager.getString("label.and")
+                    .toLowerCase(Locale.ROOT)).append(" ");
           }
           message.append(MessageManager.formatMessage(
                   "label.subsequence_matches_found",