3 import jalview.api.JalviewApp;
4 import jalview.api.StructureSelectionManagerProvider;
5 import jalview.datamodel.Alignment;
6 import jalview.datamodel.AlignmentI;
7 import jalview.datamodel.AlignmentOrder;
8 import jalview.datamodel.ColumnSelection;
9 import jalview.datamodel.HiddenColumns;
10 import jalview.datamodel.PDBEntry;
11 import jalview.datamodel.Sequence;
12 import jalview.datamodel.SequenceGroup;
13 import jalview.datamodel.SequenceI;
14 import jalview.gui.AlignFrame;
15 import jalview.gui.AlignViewport;
16 import jalview.gui.Desktop;
17 import jalview.io.AnnotationFile;
18 import jalview.io.AppletFormatAdapter;
19 import jalview.io.DataSourceType;
20 import jalview.io.FeaturesFile;
21 import jalview.io.FileFormat;
22 import jalview.io.FileFormatI;
23 import jalview.io.FileFormats;
24 import jalview.io.IdentifyFile;
25 import jalview.io.JPredFile;
26 import jalview.io.JnetAnnotationMaker;
27 import jalview.io.NewickFile;
28 import jalview.structure.SelectionSource;
29 import jalview.structure.StructureSelectionManager;
30 import jalview.util.HttpUtils;
31 import jalview.util.MessageManager;
33 import java.awt.EventQueue;
34 import java.io.IOException;
36 import java.util.ArrayList;
37 import java.util.List;
38 import java.util.StringTokenizer;
39 import java.util.Vector;
42 * A class to load parameters for either JalviewLite or Jalview
47 public class JalviewAppLoader
50 private JalviewApp app; // Jalview or JalviewJS or JalviewLite
52 private boolean debug;
54 String separator = "\u00AC"; // JalviewLite note: the default used to
55 // be '|', but many sequence IDS include
58 public String getSeparator()
63 public void setSeparator(String separator)
65 this.separator = separator;
68 public JalviewAppLoader(boolean debug)
73 public void load(JalviewApp app)
78 String sep = app.getParameter("separator");
87 throw new Error(MessageManager
88 .getString("error.invalid_separator_parameter"));
102 * Load PDBFiles if any specified by parameter(s). Returns true if loaded,
108 protected boolean loadPdbFiles()
110 boolean result = false;
112 * <param name="alignpdbfiles" value="false/true"/> Undocumented for 2.6 -
116 boolean doAlign = app.getDefaultParameter("alignpdbfiles", false);
117 app.setAlignPdbStructures(doAlign);
119 * <param name="PDBfile" value="1gaq.txt PDB|1GAQ|1GAQ|A PDB|1GAQ|1GAQ|B
122 * <param name="PDBfile2" value="1gaq.txt A=SEQA B=SEQB C=SEQB">
124 * <param name="PDBfile3" value="1q0o Q45135_9MICO">
127 // Accumulate pdbs here if they are heading for the same view (if
128 // alignPdbStructures is true)
129 Vector<Object[]> pdbs = new Vector<>();
130 // create a lazy matcher if we're asked to
131 jalview.analysis.SequenceIdMatcher matcher = (app
132 .getDefaultParameter("relaxedidmatch", false))
133 ? new jalview.analysis.SequenceIdMatcher(
134 app.getViewport().getAlignment()
135 .getSequencesArray())
138 int pdbFileCount = 0;
142 if (pdbFileCount > 0)
144 param = app.getParameter("PDBFILE" + pdbFileCount);
148 param = app.getParameter("PDBFILE");
153 PDBEntry pdb = new PDBEntry();
156 SequenceI[] seqs = null;
157 String[] chains = null;
159 StringTokenizer st = new StringTokenizer(param, " ");
161 if (st.countTokens() < 2)
163 String sequence = app.getParameter("PDBSEQ");
164 if (sequence != null)
166 seqs = new SequenceI[] { matcher == null
167 ? (Sequence) app.getViewport().getAlignment()
169 : matcher.findIdMatch(sequence) };
175 param = st.nextToken();
176 List<SequenceI> tmp = new ArrayList<>();
177 List<String> tmp2 = new ArrayList<>();
179 while (st.hasMoreTokens())
181 seqstring = st.nextToken();
182 StringTokenizer st2 = new StringTokenizer(seqstring, "=");
183 if (st2.countTokens() > 1)
186 tmp2.add(st2.nextToken());
187 seqstring = st2.nextToken();
189 tmp.add(matcher == null
190 ? (Sequence) app.getViewport().getAlignment()
192 : matcher.findIdMatch(seqstring));
195 seqs = tmp.toArray(new SequenceI[tmp.size()]);
196 if (tmp2.size() == tmp.size())
198 chains = tmp2.toArray(new String[tmp2.size()]);
203 DataSourceType protocol = resolveFileProtocol(app, ret);
204 // TODO check JAL-357 for files in a jar (CLASSLOADER)
209 for (int i = 0; i < seqs.length; i++)
213 ((Sequence) seqs[i]).addPDBId(pdb);
214 StructureSelectionManager
215 .getStructureSelectionManager(
216 (StructureSelectionManagerProvider) app)
217 .registerPDBEntry(pdb);
223 // this may not really be a problem but we give a warning
226 "Warning: Possible input parsing error: Null sequence for attachment of PDB (sequence "
234 pdbs.addElement(new Object[] { pdb, seqs, chains, protocol });
238 app.newStructureView(pdb, seqs, chains, protocol);
244 } while (param != null || pdbFileCount < 10);
247 SequenceI[][] seqs = new SequenceI[pdbs.size()][];
248 PDBEntry[] pdb = new PDBEntry[pdbs.size()];
249 String[][] chains = new String[pdbs.size()][];
250 String[] protocols = new String[pdbs.size()];
251 for (int pdbsi = 0, pdbsiSize = pdbs
252 .size(); pdbsi < pdbsiSize; pdbsi++)
254 Object[] o = pdbs.elementAt(pdbsi);
255 pdb[pdbsi] = (PDBEntry) o[0];
256 seqs[pdbsi] = (SequenceI[]) o[1];
257 chains[pdbsi] = (String[]) o[2];
258 protocols[pdbsi] = (String) o[3];
260 app.alignedStructureView(pdb, seqs, chains, protocols);
267 * Load in a Jnetfile if specified by parameter. Returns true if loaded, else
273 protected boolean loadJnetFile()
275 boolean result = false;
276 String param = app.getParameter("jnetfile");
279 // jnet became jpred around 2016
280 param = app.getParameter("jpredfile");
287 DataSourceType protocol = resolveFileProtocol(app, ret);
288 JPredFile predictions = new JPredFile(ret[0], protocol);
289 JnetAnnotationMaker.add_annotation(predictions,
290 app.getViewport().getAlignment(), 0, false);
291 // false == do not add sequence profile from concise output
292 app.getViewport().getAlignment().setupJPredAlignment();
293 app.updateForAnnotations();
295 } catch (Exception ex)
297 ex.printStackTrace();
304 * Load annotations if specified by parameter. Returns true if loaded, else
310 protected boolean loadAnnotations()
312 boolean result = false;
313 String param = app.getParameter("annotations");
317 DataSourceType protocol = resolveFileProtocol(app, ret);
319 if (new AnnotationFile().annotateAlignmentView(app.getViewport(),
322 app.updateForAnnotations();
328 .println("Annotations were not added from annotation file '"
336 * Load features file and view settings as specified by parameters. Returns
337 * true if features were loaded, else false.
342 protected boolean loadFeatures()
344 boolean result = false;
345 // ///////////////////////////
346 // modify display of features
347 // we do this before any features have been loaded, ensuring any hidden
348 // groups are hidden when features first displayed
350 // hide specific groups
352 String param = app.getParameter("hidefeaturegroups");
355 app.setFeatureGroupState(separatorListToArray(param, separator),
357 // app.setFeatureGroupStateOn(newAlignFrame, param, false);
359 // show specific groups
360 param = app.getParameter("showfeaturegroups");
363 app.setFeatureGroupState(separatorListToArray(param, separator),
365 // app.setFeatureGroupStateOn(newAlignFrame, param, true);
367 // and now load features
368 param = app.getParameter("features");
372 DataSourceType protocol = resolveFileProtocol(app, ret);
374 result = app.parseFeaturesFile(ret[0], protocol);
377 param = app.getParameter("showFeatureSettings");
378 if (param != null && param.equalsIgnoreCase("true"))
380 app.newFeatureSettings();
386 * Load a score file if specified by parameter. Returns true if file was
387 * loaded, else false.
391 protected boolean loadScoreFile()
393 boolean result = false;
394 String sScoreFile = app.getParameter("scoreFile");
395 if (sScoreFile != null && !"".equals(sScoreFile))
402 "Attempting to load T-COFFEE score file from the scoreFile parameter");
404 result = app.loadScoreFile(sScoreFile);
408 "Failed to parse T-COFFEE parameter as a valid score file ('"
409 + sScoreFile + "')");
411 } catch (Exception e)
413 System.err.printf("Cannot read score file: '%s'. Cause: %s \n",
414 sScoreFile, e.getMessage());
420 String[] ret = new String[1];
423 * Load a tree for the alignment if specified by parameter. Returns true if a
424 * tree was loaded, else false.
429 protected boolean loadTree()
431 boolean result = false;
432 String treeFile = app.getParameter("tree");
433 if (treeFile == null)
435 treeFile = app.getParameter("treeFile");
438 if (treeFile != null)
443 NewickFile fin = new NewickFile(treeFile,
444 resolveFileProtocol(app, ret));
447 if (fin.getTree() != null)
449 app.loadTree(fin, ret[0]);
453 System.out.println("Successfully imported tree.");
461 "Tree parameter did not resolve to a valid tree.");
464 } catch (Exception ex)
466 ex.printStackTrace();
473 * form a complete URL given a path to a resource and a reference location on
477 * - an absolute path on the same server as localref or a document
478 * located relative to localref
480 * - a URL on the same server as url
481 * @return a complete URL for the resource located by url
483 public static String resolveUrlForLocalOrAbsolute(String targetPath,
486 String resolvedPath = "";
487 if (targetPath.startsWith("/"))
489 String codebase = localref.toString();
490 String localfile = localref.getFile();
491 resolvedPath = codebase.substring(0,
492 codebase.length() - localfile.length()) + targetPath;
497 * get URL path and strip off any trailing file e.g.
498 * www.jalview.org/examples/index.html#applets?a=b is trimmed to
499 * www.jalview.org/examples/
501 String urlPath = localref.toString();
502 String directoryPath = urlPath;
503 int lastSeparator = directoryPath.lastIndexOf("/");
504 if (lastSeparator > 0)
506 directoryPath = directoryPath.substring(0, lastSeparator + 1);
509 if (targetPath.startsWith("/"))
512 * construct absolute URL to a file on the server - this is not allowed?
514 // String localfile = localref.getFile();
515 // resolvedPath = urlPath.substring(0,
516 // urlPath.length() - localfile.length())
518 resolvedPath = directoryPath + targetPath.substring(1);
522 resolvedPath = directoryPath + targetPath;
526 // System.err.println(
527 // "resolveUrlForLocalOrAbsolute returning " + resolvedPath);
533 * parse the string into a list
537 * @return elements separated by separator
539 public static String[] separatorListToArray(String list, String separator)
541 // TODO use StringUtils version (slightly different...)
542 int seplen = separator.length();
543 if (list == null || list.equals("") || list.equals(separator))
547 Vector<String> jv = new Vector<>();
549 while ((pos = list.indexOf(separator, cp)) > cp)
551 jv.addElement(list.substring(cp, pos));
554 if (cp < list.length())
556 String c = list.substring(cp);
557 if (!c.equals(separator))
564 String[] v = new String[jv.size()];
565 for (int i = 0; i < v.length; i++)
567 v[i] = jv.elementAt(i);
569 jv.removeAllElements();
572 // System.err.println("Array from '" + separator
573 // + "' separated List:\n" + v.length);
574 // for (int i = 0; i < v.length; i++)
576 // System.err.println("item " + i + " '" + v[i] + "'");
583 // System.err.println(
584 // "Empty Array from '" + separator + "' separated List");
589 public static DataSourceType resolveFileProtocol(JalviewApp app,
592 String path = retPath[0];
596 if (path.startsWith("PASTE"))
598 retPath[0] = path.substring(5);
599 return DataSourceType.PASTE;
605 if (path.indexOf("://") >= 0)
607 return DataSourceType.URL;
611 * try relative to document root
613 URL documentBase = app.getDocumentBase();
614 String withDocBase = resolveUrlForLocalOrAbsolute(path, documentBase);
615 if (HttpUtils.isValidUrl(withDocBase))
619 // System.err.println("Prepended document base '" + documentBase
620 // + "' to make: '" + withDocBase + "'");
622 retPath[0] = withDocBase;
623 return DataSourceType.URL;
627 * try relative to codebase (if different to document base)
629 URL codeBase = app.getCodeBase();
630 String withCodeBase = resolveUrlForLocalOrAbsolute(path, codeBase);
631 if (!withCodeBase.equals(withDocBase)
632 && HttpUtils.isValidUrl(withCodeBase))
636 // System.err.println("Prepended codebase '" + codeBase
637 // + "' to make: '" + withCodeBase + "'");
639 retPath[0] = withCodeBase;
640 return DataSourceType.URL;
644 * try locating by classloader; try this last so files in the directory
645 * are resolved using document base
647 if (inArchive(app.getClass(), path))
649 return DataSourceType.CLASSLOADER;
655 * Discovers whether the given file is in the Applet Archive
661 private static boolean inArchive(Class<?> c, String f)
663 // This might throw a security exception in certain browsers
664 // Netscape Communicator for instance.
667 boolean rtn = (c.getResourceAsStream("/" + f) != null);
670 // System.err.println("Resource '" + f + "' was "
671 // + (rtn ? "" : "not ") + "located by classloader.");
674 } catch (Exception ex)
676 System.out.println("Exception checking resources: " + f + " " + ex);
681 public void callInitCallback()
683 String initjscallback = app.getParameter("oninit");
684 if (initjscallback == null)
688 initjscallback = initjscallback.trim();
689 if (initjscallback.length() > 0)
696 * read sequence1...sequenceN as a raw alignment
701 public String getPastedSequence(JalviewApp jalviewApp)
703 StringBuffer data = new StringBuffer("PASTE");
706 while ((file = app.getParameter("sequence" + i)) != null)
708 data.append(file.toString() + "\n");
711 if (data.length() > 5)
713 file = data.toString();
719 * concatenate the list with separator
723 * @return concatenated string
725 public static String arrayToSeparatorList(String[] list, String separator)
727 // TODO use StringUtils version
728 StringBuffer v = new StringBuffer();
729 if (list != null && list.length > 0)
731 for (int i = 0, iSize = list.length; i < iSize; i++)
745 // .println("Returning '" + separator + "' separated List:\n");
746 // System.err.println(v);
752 // System.err.println(
753 // "Returning empty '" + separator + "' separated List\n");
755 return "" + separator;
758 public String arrayToSeparatorList(String[] array)
760 return arrayToSeparatorList(array, separator);
763 public String getSelectedSequencesFrom(AlignFrame alf, String sep)
765 StringBuffer result = new StringBuffer("");
766 if (sep == null || sep.length() == 0)
768 sep = separator; // "+0x00AC;
770 AlignViewport v = alf.getViewport();
771 if (v.getSelectionGroup() != null)
773 SequenceI[] seqs = v.getSelectionGroup()
774 .getSequencesInOrder(v.getAlignment());
776 for (int i = 0; i < seqs.length; i++)
778 result.append(seqs[i].getName());
783 return result.toString();
786 public void setFeatureGroupStateOn(final AlignFrame alf,
787 final String groups, boolean state)
789 java.awt.EventQueue.invokeLater(new Runnable()
794 alf.setFeatureGroupState(
795 separatorListToArray(groups, separator), state);
800 public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean visible)
802 return arrayToSeparatorList(
803 alf.getFeatureGroupsOfState(visible));
806 public void scrollViewToIn(final AlignFrame alf, final String topRow,
807 final String leftHandColumn)
809 java.awt.EventQueue.invokeLater(new Runnable()
816 alf.scrollTo(Integer.valueOf(topRow).intValue(),
817 Integer.valueOf(leftHandColumn).intValue());
819 } catch (Exception ex)
821 System.err.println("Couldn't parse integer arguments (topRow='"
822 + topRow + "' and leftHandColumn='" + leftHandColumn
824 ex.printStackTrace();
830 public void scrollViewToRowIn(final AlignFrame alf, final String topRow)
833 java.awt.EventQueue.invokeLater(new Runnable()
840 alf.scrollToRow(Integer.valueOf(topRow).intValue());
842 } catch (Exception ex)
844 System.err.println("Couldn't parse integer arguments (topRow='"
846 ex.printStackTrace();
853 public void scrollViewToColumnIn(final AlignFrame alf,
854 final String leftHandColumn)
856 java.awt.EventQueue.invokeLater(new Runnable()
866 Integer.valueOf(leftHandColumn).intValue());
868 } catch (Exception ex)
871 "Couldn't parse integer arguments (leftHandColumn='"
872 + leftHandColumn + "')");
873 ex.printStackTrace();
880 public boolean addPdbFile(AlignFrame alf, String sequenceId,
881 String pdbEntryString, String pdbFile)
883 AlignFrame alFrame = alf;
884 SequenceI toaddpdb = alFrame.getViewport().getAlignment()
885 .findName(sequenceId);
886 boolean needtoadd = false;
887 if (toaddpdb != null)
889 Vector<PDBEntry> pdbe = toaddpdb.getAllPDBEntries();
890 PDBEntry pdbentry = null;
891 if (pdbe != null && pdbe.size() > 0)
893 for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
895 pdbentry = pdbe.elementAt(pe);
896 if (!pdbentry.getId().equals(pdbEntryString)
897 && !pdbentry.getFile().equals(pdbFile))
907 if (pdbentry == null)
909 pdbentry = new PDBEntry();
910 pdbentry.setId(pdbEntryString);
911 pdbentry.setFile(pdbFile);
912 needtoadd = true; // add this new entry to sequence.
914 // resolve data source
915 // TODO: this code should be a refactored to an io package
916 DataSourceType protocol = AppletFormatAdapter.resolveProtocol(pdbFile,
918 if (protocol == null)
924 pdbentry.setProperty("protocol", protocol);
925 toaddpdb.addPDBId(pdbentry);
926 alFrame.alignPanel.getStructureSelectionManager()
927 .registerPDBEntry(pdbentry);
933 public AlignFrame loadAlignment(String text, int width, int height,
936 AlignmentI al = null;
940 FileFormatI format = new IdentifyFile().identify(text,
941 DataSourceType.PASTE);
942 al = new AppletFormatAdapter().readFile(text, DataSourceType.PASTE,
944 if (al.getHeight() > 0)
946 return new AlignFrame(al, width, height, title);
948 } catch (IOException ex)
950 ex.printStackTrace();
955 public String getFeatureGroupsOn(AlignFrame alf)
957 return arrayToSeparatorList(
958 alf.getFeatureGroups());
961 public void highlightIn(final AlignFrame alf, final String sequenceId,
962 final String position, final String alignedPosition)
964 // TODO: could try to highlight in all alignments if alf==null
965 jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
966 alf.getViewport().getAlignment()
967 .getSequencesArray());
968 final SequenceI sq = matcher.findIdMatch(sequenceId);
974 apos = Integer.valueOf(position).intValue();
976 } catch (NumberFormatException ex)
980 final int pos = apos;
981 // use vamsas listener to broadcast to all listeners in scope
982 if (alignedPosition != null && (alignedPosition.trim().length() == 0
983 || alignedPosition.toLowerCase().indexOf("false") > -1))
985 java.awt.EventQueue.invokeLater(new Runnable()
990 StructureSelectionManager
991 .getStructureSelectionManager(Desktop.getInstance())
992 .mouseOverVamsasSequence(sq, sq.findIndex(pos), null);
998 java.awt.EventQueue.invokeLater(new Runnable()
1003 StructureSelectionManager
1004 .getStructureSelectionManager(Desktop.getInstance())
1005 .mouseOverVamsasSequence(sq, pos, null);
1012 public void selectIn(final AlignFrame alf, String sequenceIds,
1013 String columns, String sep)
1015 if (sep == null || sep.length() == 0)
1023 System.err.println("Selecting region using separator string '"
1028 String[] ids = JalviewAppLoader.separatorListToArray(sequenceIds, sep);
1029 String[] cols = JalviewAppLoader.separatorListToArray(columns, sep);
1030 final SequenceGroup sel = new SequenceGroup();
1031 final ColumnSelection csel = new ColumnSelection();
1032 AlignmentI al = alf.getViewport().getAlignment();
1033 jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
1034 alf.getViewport().getAlignment()
1035 .getSequencesArray());
1036 int start = 0, end = al.getWidth(), alw = al.getWidth();
1037 boolean seqsfound = true;
1038 if (ids != null && ids.length > 0)
1041 for (int i = 0; i < ids.length; i++)
1043 if (ids[i].trim().length() == 0)
1047 SequenceI sq = matcher.findIdMatch(ids[i]);
1051 sel.addSequence(sq, false);
1055 boolean inseqpos = false;
1056 if (cols != null && cols.length > 0)
1058 boolean seset = false;
1059 for (int i = 0; i < cols.length; i++)
1061 String cl = cols[i].trim();
1062 if (cl.length() == 0)
1067 if ((p = cl.indexOf("-")) > -1)
1069 int from = -1, to = -1;
1072 from = Integer.valueOf(cl.substring(0, p)).intValue();
1074 } catch (NumberFormatException ex)
1077 "ERROR: Couldn't parse first integer in range element column selection string '"
1078 + cl + "' - format is 'from-to'");
1083 to = Integer.valueOf(cl.substring(p + 1)).intValue();
1085 } catch (NumberFormatException ex)
1088 "ERROR: Couldn't parse second integer in range element column selection string '"
1089 + cl + "' - format is 'from-to'");
1092 if (from >= 0 && to >= 0)
1109 // comment to prevent range extension
1119 for (int r = from; r <= to; r++)
1121 if (r >= 0 && r < alw)
1128 System.err.println("Range '" + cl + "' deparsed as [" + from
1134 System.err.println("ERROR: Invalid Range '" + cl
1135 + "' deparsed as [" + from + "," + to + "]");
1143 r = Integer.valueOf(cl).intValue();
1145 } catch (NumberFormatException ex)
1147 if (cl.toLowerCase().equals("sequence"))
1149 // we are in the dataset sequence's coordinate frame.
1155 "ERROR: Couldn't parse integer from point selection element of column selection string '"
1160 if (r >= 0 && r <= alw)
1170 // comment to prevent range extension
1183 System.err.println("Point selection '" + cl
1184 + "' deparsed as [" + r + "]");
1189 System.err.println("ERROR: Invalid Point selection '" + cl
1190 + "' deparsed as [" + r + "]");
1197 // we only propagate the selection when it was the null selection, or the
1198 // given sequences were found in the alignment.
1199 if (inseqpos && sel.getSize() > 0)
1201 // assume first sequence provides reference frame ?
1202 SequenceI rs = sel.getSequenceAt(0);
1203 start = rs.findIndex(start);
1204 end = rs.findIndex(end);
1205 List<Integer> cs = new ArrayList<>(csel.getSelected());
1207 for (Integer selectedCol : cs)
1209 csel.addElement(rs.findIndex(selectedCol));
1212 sel.setStartRes(start);
1214 EventQueue.invokeLater(new Runnable()
1219 alf.select(sel, csel, alf
1220 .getCurrentView().getAlignment().getHiddenColumns());
1226 public String getAlignmentOrderFrom(AlignFrame alf, String sep)
1228 AlignmentI alorder = alf.getViewport().getAlignment();
1229 String[] order = new String[alorder.getHeight()];
1230 for (int i = 0; i < order.length; i++)
1232 order[i] = alorder.getSequenceAt(i).getName();
1234 return arrayToSeparatorList(order, sep);
1237 public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,
1238 String format, String suffix)
1242 AlignViewport vp = alf.getViewport();
1243 FileFormatI theFormat = FileFormats.getInstance().forName(format);
1244 boolean seqlimits = (suffix == null
1245 || suffix.equalsIgnoreCase("true"));
1246 if (vp.getSelectionGroup() != null)
1248 // JBPNote: getSelectionAsNewSequence behaviour has changed - this
1249 // method now returns a full copy of sequence data
1250 // TODO consider using getSequenceSelection instead here
1251 String reply = new AppletFormatAdapter().formatSequences(theFormat,
1252 new Alignment(vp.getSelectionAsNewSequence()),
1256 } catch (IllegalArgumentException ex)
1258 ex.printStackTrace();
1259 return "Error retrieving alignment, possibly invalid format specifier: "
1265 public String orderAlignmentBy(AlignFrame alf, String order,
1266 String undoName, String sep)
1268 if (sep == null || sep.length() == 0)
1272 String[] ids = JalviewAppLoader.separatorListToArray(order, sep);
1273 SequenceI[] sqs = null;
1274 if (ids != null && ids.length > 0)
1276 jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
1277 alf.getViewport().getAlignment()
1278 .getSequencesArray());
1280 sqs = new SequenceI[ids.length];
1281 for (int i = 0; i < ids.length; i++)
1283 if (ids[i].trim().length() == 0)
1287 SequenceI sq = matcher.findIdMatch(ids[i]);
1295 SequenceI[] sqq = new SequenceI[s];
1296 System.arraycopy(sqs, 0, sqq, 0, s);
1309 final AlignmentOrder aorder = new AlignmentOrder(sqs);
1311 if (undoName != null && undoName.trim().length() == 0)
1315 final String _undoName = undoName;
1316 // TODO: deal with synchronization here: cannot raise any events until after
1317 // this has returned.
1318 return alf.sortBy(aorder, _undoName) ? "true" : "";
1321 public String getAlignmentFrom(AlignFrame alf, String format,
1326 boolean seqlimits = (suffix == null
1327 || suffix.equalsIgnoreCase("true"));
1329 FileFormatI theFormat = FileFormats.getInstance().forName(format);
1330 String reply = new AppletFormatAdapter().formatSequences(theFormat,
1331 alf.getViewport().getAlignment(), seqlimits);
1333 } catch (IllegalArgumentException ex)
1335 ex.printStackTrace();
1336 return "Error retrieving alignment, possibly invalid format specifier: "
1341 public void loadAnnotationFrom(AlignFrame alf, String annotation)
1343 if (new AnnotationFile().annotateAlignmentView(
1344 alf.getViewport(), annotation,
1345 DataSourceType.PASTE))
1347 alf.alignPanel.fontChanged();
1348 alf.alignPanel.setScrollValues(0, 0);
1352 alf.parseFeaturesFile(annotation,
1353 DataSourceType.PASTE);
1357 public boolean loadFeaturesFrom(AlignFrame alf, String features,
1358 boolean autoenabledisplay)
1360 boolean ret = alf.parseFeaturesFile(features,
1361 DataSourceType.PASTE);
1366 if (autoenabledisplay)
1368 alf.getViewport().setShowSequenceFeatures(true);
1369 // this next was for a checkbox in JalviewLite
1370 // ((AlignFrame) alf).getViewport().sequenceFeatures.setState(true);
1375 public String getFeaturesFrom(AlignFrame alf, String format)
1377 AlignFrame f = (alf);
1380 FeaturesFile formatter = new FeaturesFile();
1381 if (format.equalsIgnoreCase("Jalview"))
1383 features = formatter.printJalviewFormat(
1384 f.getViewport().getAlignment().getSequencesArray(),
1385 f.alignPanel.getFeatureRenderer(), true);
1389 features = formatter.printGffFormat(
1390 f.getViewport().getAlignment().getSequencesArray(),
1391 f.alignPanel.getFeatureRenderer(), true);
1394 if (features == null)
1402 public String getAnnotationFrom(AlignFrame alf)
1405 String annotation = new AnnotationFile()
1406 .printAnnotationsForView(f.getViewport());
1410 // public AlignFrame newViewFrom(AlignFrame alf, String name)
1412 // return (AlignFrame) alf.newView(name, true);
1415 public String[] separatorListToArray(String list)
1417 return separatorListToArray(list, separator);
1420 public Object[] getSelectionForListener(AlignFrame currentFrame,
1421 SequenceGroup seqsel, ColumnSelection colsel,
1422 HiddenColumns hidden, SelectionSource source, Object alignFrame)
1424 // System.err.println("Testing selection event relay to
1425 // jsfunction:"+_listener);
1427 AlignFrame src = (AlignFrame) alignFrame;
1430 if (source instanceof AlignViewport
1431 && currentFrame.getViewport() == source)
1433 // should be valid if it just generated an event!
1438 String[] seqs = new String[] {};
1439 String[] cols = new String[] {};
1440 int strt = 0, end = (src == null) ? -1
1441 : src.alignPanel.av.getAlignment().getWidth();
1442 if (seqsel != null && seqsel.getSize() > 0)
1444 seqs = new String[seqsel.getSize()];
1445 for (int i = 0; i < seqs.length; i++)
1447 seqs[i] = seqsel.getSequenceAt(i).getName();
1449 if (strt < seqsel.getStartRes())
1451 strt = seqsel.getStartRes();
1453 if (end == -1 || end > seqsel.getEndRes())
1455 end = seqsel.getEndRes();
1458 if (colsel != null && !colsel.isEmpty())
1462 end = colsel.getMax() + 1;
1464 cols = new String[colsel.getSelected().size()];
1465 for (int i = 0; i < cols.length; i++)
1467 cols[i] = "" + (1 + colsel.getSelected().get(i).intValue());
1472 if (seqsel != null && seqsel.getSize() > 0)
1474 // send a valid range, otherwise we send the empty selection
1475 cols = new String[2];
1476 cols[0] = "" + (1 + strt) + "-" + (1 + end);
1479 return new Object[] { src, setid, arrayToSeparatorList(seqs),
1480 arrayToSeparatorList(cols) };