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)
810 java.awt.EventQueue.invokeLater(new Runnable()
817 alf.scrollTo(Integer.valueOf(topRow).intValue(),
818 Integer.valueOf(leftHandColumn).intValue());
820 } catch (Exception ex)
822 System.err.println("Couldn't parse integer arguments (topRow='"
823 + topRow + "' and leftHandColumn='" + leftHandColumn
825 ex.printStackTrace();
831 public void scrollViewToRowIn(final AlignFrame alf, final String topRow)
835 java.awt.EventQueue.invokeLater(new Runnable()
842 alf.scrollToRow(Integer.valueOf(topRow).intValue());
844 } catch (Exception ex)
846 System.err.println("Couldn't parse integer arguments (topRow='"
848 ex.printStackTrace();
855 public void scrollViewToColumnIn(final AlignFrame alf,
856 final String leftHandColumn)
859 java.awt.EventQueue.invokeLater(new Runnable()
868 .scrollToColumn(Integer.valueOf(leftHandColumn).intValue());
870 } catch (Exception ex)
873 "Couldn't parse integer arguments (leftHandColumn='"
874 + leftHandColumn + "')");
875 ex.printStackTrace();
882 public boolean addPdbFile(AlignFrame alf, String sequenceId,
883 String pdbEntryString, String pdbFile)
885 AlignFrame alFrame = alf;
886 SequenceI toaddpdb = alFrame.getViewport().getAlignment()
887 .findName(sequenceId);
888 boolean needtoadd = false;
889 if (toaddpdb != null)
891 Vector<PDBEntry> pdbe = toaddpdb.getAllPDBEntries();
892 PDBEntry pdbentry = null;
893 if (pdbe != null && pdbe.size() > 0)
895 for (int pe = 0, peSize = pdbe.size(); pe < peSize; pe++)
897 pdbentry = pdbe.elementAt(pe);
898 if (!pdbentry.getId().equals(pdbEntryString)
899 && !pdbentry.getFile().equals(pdbFile))
909 if (pdbentry == null)
911 pdbentry = new PDBEntry();
912 pdbentry.setId(pdbEntryString);
913 pdbentry.setFile(pdbFile);
914 needtoadd = true; // add this new entry to sequence.
916 // resolve data source
917 // TODO: this code should be a refactored to an io package
918 DataSourceType protocol = AppletFormatAdapter.resolveProtocol(pdbFile,
920 if (protocol == null)
926 pdbentry.setProperty("protocol", protocol);
927 toaddpdb.addPDBId(pdbentry);
928 alFrame.alignPanel.getStructureSelectionManager()
929 .registerPDBEntry(pdbentry);
935 public AlignFrame loadAlignment(String text, int width, int height,
938 AlignmentI al = null;
942 FileFormatI format = new IdentifyFile().identify(text,
943 DataSourceType.PASTE);
944 al = new AppletFormatAdapter().readFile(text, DataSourceType.PASTE,
946 if (al.getHeight() > 0)
948 return new AlignFrame(al, width, height, title);
950 } catch (IOException ex)
952 ex.printStackTrace();
957 public String getFeatureGroupsOn(AlignFrame alf)
959 return arrayToSeparatorList(
960 alf.getFeatureGroups());
963 public void highlightIn(final AlignFrame alf, final String sequenceId,
964 final String position, final String alignedPosition)
966 // TODO: could try to highlight in all alignments if alf==null
967 jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
968 alf.getViewport().getAlignment()
969 .getSequencesArray());
970 final SequenceI sq = matcher.findIdMatch(sequenceId);
976 apos = Integer.valueOf(position).intValue();
978 } catch (NumberFormatException ex)
982 final int pos = apos;
983 // use vamsas listener to broadcast to all listeners in scope
984 if (alignedPosition != null && (alignedPosition.trim().length() == 0
985 || alignedPosition.toLowerCase().indexOf("false") > -1))
987 java.awt.EventQueue.invokeLater(new Runnable()
992 StructureSelectionManager
993 .getStructureSelectionManager(Desktop.getInstance())
994 .mouseOverVamsasSequence(sq, sq.findIndex(pos), null);
1000 java.awt.EventQueue.invokeLater(new Runnable()
1005 StructureSelectionManager
1006 .getStructureSelectionManager(Desktop.getInstance())
1007 .mouseOverVamsasSequence(sq, pos, null);
1014 public void selectIn(final AlignFrame alf, String sequenceIds,
1015 String columns, String sep)
1017 if (sep == null || sep.length() == 0)
1025 System.err.println("Selecting region using separator string '"
1030 String[] ids = JalviewAppLoader.separatorListToArray(sequenceIds, sep);
1031 String[] cols = JalviewAppLoader.separatorListToArray(columns, sep);
1032 final SequenceGroup sel = new SequenceGroup();
1033 final ColumnSelection csel = new ColumnSelection();
1034 AlignmentI al = alf.getViewport().getAlignment();
1035 jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
1036 alf.getViewport().getAlignment()
1037 .getSequencesArray());
1038 int start = 0, end = al.getWidth(), alw = al.getWidth();
1039 boolean seqsfound = true;
1040 if (ids != null && ids.length > 0)
1043 for (int i = 0; i < ids.length; i++)
1045 if (ids[i].trim().length() == 0)
1049 SequenceI sq = matcher.findIdMatch(ids[i]);
1053 sel.addSequence(sq, false);
1057 boolean inseqpos = false;
1058 if (cols != null && cols.length > 0)
1060 boolean seset = false;
1061 for (int i = 0; i < cols.length; i++)
1063 String cl = cols[i].trim();
1064 if (cl.length() == 0)
1069 if ((p = cl.indexOf("-")) > -1)
1071 int from = -1, to = -1;
1074 from = Integer.valueOf(cl.substring(0, p)).intValue();
1076 } catch (NumberFormatException ex)
1079 "ERROR: Couldn't parse first integer in range element column selection string '"
1080 + cl + "' - format is 'from-to'");
1085 to = Integer.valueOf(cl.substring(p + 1)).intValue();
1087 } catch (NumberFormatException ex)
1090 "ERROR: Couldn't parse second integer in range element column selection string '"
1091 + cl + "' - format is 'from-to'");
1094 if (from >= 0 && to >= 0)
1111 // comment to prevent range extension
1121 for (int r = from; r <= to; r++)
1123 if (r >= 0 && r < alw)
1130 System.err.println("Range '" + cl + "' deparsed as [" + from
1136 System.err.println("ERROR: Invalid Range '" + cl
1137 + "' deparsed as [" + from + "," + to + "]");
1145 r = Integer.valueOf(cl).intValue();
1147 } catch (NumberFormatException ex)
1149 if (cl.toLowerCase().equals("sequence"))
1151 // we are in the dataset sequence's coordinate frame.
1157 "ERROR: Couldn't parse integer from point selection element of column selection string '"
1162 if (r >= 0 && r <= alw)
1172 // comment to prevent range extension
1185 System.err.println("Point selection '" + cl
1186 + "' deparsed as [" + r + "]");
1191 System.err.println("ERROR: Invalid Point selection '" + cl
1192 + "' deparsed as [" + r + "]");
1199 // we only propagate the selection when it was the null selection, or the
1200 // given sequences were found in the alignment.
1201 if (inseqpos && sel.getSize() > 0)
1203 // assume first sequence provides reference frame ?
1204 SequenceI rs = sel.getSequenceAt(0);
1205 start = rs.findIndex(start);
1206 end = rs.findIndex(end);
1207 List<Integer> cs = new ArrayList<>(csel.getSelected());
1209 for (Integer selectedCol : cs)
1211 csel.addElement(rs.findIndex(selectedCol));
1214 sel.setStartRes(start);
1216 EventQueue.invokeLater(new Runnable()
1221 alf.select(sel, csel, alf
1222 .getCurrentView().getAlignment().getHiddenColumns());
1228 public String getAlignmentOrderFrom(AlignFrame alf, String sep)
1230 AlignmentI alorder = alf.getViewport().getAlignment();
1231 String[] order = new String[alorder.getHeight()];
1232 for (int i = 0; i < order.length; i++)
1234 order[i] = alorder.getSequenceAt(i).getName();
1236 return arrayToSeparatorList(order, sep);
1239 public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,
1240 String format, String suffix)
1244 AlignViewport vp = alf.getViewport();
1245 FileFormatI theFormat = FileFormats.getInstance().forName(format);
1246 boolean seqlimits = (suffix == null
1247 || suffix.equalsIgnoreCase("true"));
1248 if (vp.getSelectionGroup() != null)
1250 // JBPNote: getSelectionAsNewSequence behaviour has changed - this
1251 // method now returns a full copy of sequence data
1252 // TODO consider using getSequenceSelection instead here
1253 String reply = new AppletFormatAdapter().formatSequences(theFormat,
1254 new Alignment(vp.getSelectionAsNewSequence()),
1258 } catch (IllegalArgumentException ex)
1260 ex.printStackTrace();
1261 return "Error retrieving alignment, possibly invalid format specifier: "
1267 public String orderAlignmentBy(AlignFrame alf, String order,
1268 String undoName, String sep)
1270 if (sep == null || sep.length() == 0)
1274 String[] ids = JalviewAppLoader.separatorListToArray(order, sep);
1275 SequenceI[] sqs = null;
1276 if (ids != null && ids.length > 0)
1278 jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(
1279 alf.getViewport().getAlignment()
1280 .getSequencesArray());
1282 sqs = new SequenceI[ids.length];
1283 for (int i = 0; i < ids.length; i++)
1285 if (ids[i].trim().length() == 0)
1289 SequenceI sq = matcher.findIdMatch(ids[i]);
1297 SequenceI[] sqq = new SequenceI[s];
1298 System.arraycopy(sqs, 0, sqq, 0, s);
1311 final AlignmentOrder aorder = new AlignmentOrder(sqs);
1313 if (undoName != null && undoName.trim().length() == 0)
1317 final String _undoName = undoName;
1318 // TODO: deal with synchronization here: cannot raise any events until after
1319 // this has returned.
1320 return alf.sortBy(aorder, _undoName) ? "true" : "";
1323 public String getAlignmentFrom(AlignFrame alf, String format,
1328 boolean seqlimits = (suffix == null
1329 || suffix.equalsIgnoreCase("true"));
1331 FileFormatI theFormat = FileFormats.getInstance().forName(format);
1332 String reply = new AppletFormatAdapter().formatSequences(theFormat,
1333 alf.getViewport().getAlignment(), seqlimits);
1335 } catch (IllegalArgumentException ex)
1337 ex.printStackTrace();
1338 return "Error retrieving alignment, possibly invalid format specifier: "
1343 public void loadAnnotationFrom(AlignFrame alf, String annotation)
1345 if (new AnnotationFile().annotateAlignmentView(
1346 alf.getViewport(), annotation,
1347 DataSourceType.PASTE))
1349 alf.alignPanel.fontChanged();
1350 alf.alignPanel.setScrollValues(0, 0);
1354 alf.parseFeaturesFile(annotation,
1355 DataSourceType.PASTE);
1359 public boolean loadFeaturesFrom(AlignFrame alf, String features,
1360 boolean autoenabledisplay)
1362 boolean ret = alf.parseFeaturesFile(features,
1363 DataSourceType.PASTE);
1368 if (autoenabledisplay)
1370 alf.getViewport().setShowSequenceFeatures(true);
1371 // this next was for a checkbox in JalviewLite
1372 // ((AlignFrame) alf).getViewport().sequenceFeatures.setState(true);
1378 * JavaScript interface to print the alignment frame
1382 * "jalview" or "gff" with or without ";includeComplement" or
1383 * ";includeNonpositional"; default with no ";" is
1384 * ";includeNonpositional"
1387 public String getFeaturesFrom(AlignFrame alf, String format)
1389 AlignFrame f = (alf);
1392 FeaturesFile formatter = new FeaturesFile();
1393 format = format.toLowerCase();
1394 if (format.indexOf(";") < 0)
1395 format += ";includenonpositional";
1396 boolean nonpos = format.indexOf(";includenonpositional") > 0;
1397 boolean compl = format.indexOf(";includecomplement") >= 0;
1398 if (format.startsWith("jalview"))
1400 features = formatter.printJalviewFormat(
1401 f.getViewport().getAlignment().getSequencesArray(),
1402 f.alignPanel.getFeatureRenderer(), nonpos, compl);
1406 features = formatter.printGffFormat(
1407 f.getViewport().getAlignment().getSequencesArray(),
1408 f.alignPanel.getFeatureRenderer(), nonpos, compl);
1411 if (features == null)
1419 public String getAnnotationFrom(AlignFrame alf)
1422 String annotation = new AnnotationFile()
1423 .printAnnotationsForView(f.getViewport());
1427 // public AlignFrame newViewFrom(AlignFrame alf, String name)
1429 // return (AlignFrame) alf.newView(name, true);
1432 public String[] separatorListToArray(String list)
1434 return separatorListToArray(list, separator);
1437 public Object[] getSelectionForListener(AlignFrame currentFrame,
1438 SequenceGroup seqsel, ColumnSelection colsel,
1439 HiddenColumns hidden, SelectionSource source, Object alignFrame)
1441 // System.err.println("Testing selection event relay to
1442 // jsfunction:"+_listener);
1444 AlignFrame src = (AlignFrame) alignFrame;
1447 if (source instanceof AlignViewport
1448 && currentFrame.getViewport() == source)
1450 // should be valid if it just generated an event!
1455 String[] seqs = new String[] {};
1456 String[] cols = new String[] {};
1457 int strt = 0, end = (src == null) ? -1
1458 : src.alignPanel.av.getAlignment().getWidth();
1459 if (seqsel != null && seqsel.getSize() > 0)
1461 seqs = new String[seqsel.getSize()];
1462 for (int i = 0; i < seqs.length; i++)
1464 seqs[i] = seqsel.getSequenceAt(i).getName();
1466 if (strt < seqsel.getStartRes())
1468 strt = seqsel.getStartRes();
1470 if (end == -1 || end > seqsel.getEndRes())
1472 end = seqsel.getEndRes();
1475 if (colsel != null && !colsel.isEmpty())
1479 end = colsel.getMax() + 1;
1481 cols = new String[colsel.getSelected().size()];
1482 for (int i = 0; i < cols.length; i++)
1484 cols[i] = "" + (1 + colsel.getSelected().get(i).intValue());
1489 if (seqsel != null && seqsel.getSize() > 0)
1491 // send a valid range, otherwise we send the empty selection
1492 cols = new String[2];
1493 cols[0] = "" + (1 + strt) + "-" + (1 + end);
1496 return new Object[] { src, setid, arrayToSeparatorList(seqs),
1497 arrayToSeparatorList(cols) };