+ // /////////////////////////////////////////\r
+ // The following public methods maybe called\r
+ // externally, eg via javascript in HTML page\r
+ /**\r
+ * @return String list of selected sequence IDs, each terminated by the\r
+ * 'boolean not' character (""+0x00AC) or (¬)\r
+ */\r
+ public String getSelectedSequences()\r
+ {\r
+ return getSelectedSequencesFrom(getDefaultTargetFrame());\r
+ }\r
+\r
+ /**\r
+ * @param sep\r
+ * separator string or null for default\r
+ * @return String list of selected sequence IDs, each terminated by given\r
+ * separator string\r
+ */\r
+ public String getSelectedSequences(String sep)\r
+ {\r
+ return getSelectedSequencesFrom(getDefaultTargetFrame(), sep);\r
+ }\r
+\r
+ /**\r
+ * @param alf\r
+ * alignframe containing selection\r
+ * @return String list of selected sequence IDs, each terminated by current\r
+ * default separator sequence\r
+ * \r
+ */\r
+ public String getSelectedSequencesFrom(AlignFrame alf)\r
+ {\r
+ return getSelectedSequencesFrom(alf, separator); // ""+0x00AC);\r
+ }\r
+\r
+ /**\r
+ * get list of selected sequence IDs separated by given separator\r
+ * \r
+ * @param alf\r
+ * window containing selection\r
+ * @param sep\r
+ * separator string to use - default is 'boolean not'\r
+ * @return String list of selected sequence IDs, each terminated by the given\r
+ * separator\r
+ */\r
+ public String getSelectedSequencesFrom(AlignFrame alf, String sep)\r
+ {\r
+ StringBuffer result = new StringBuffer("");\r
+ if (sep == null || sep.length() == 0)\r
+ {\r
+ sep = separator; // "+0x00AC;\r
+ }\r
+ if (alf.viewport.getSelectionGroup() != null)\r
+ {\r
+ SequenceI[] seqs = alf.viewport.getSelectionGroup()\r
+ .getSequencesInOrder(alf.viewport.getAlignment());\r
+\r
+ for (int i = 0; i < seqs.length; i++)\r
+ {\r
+ result.append(seqs[i].getName());\r
+ result.append(sep);\r
+ }\r
+ }\r
+\r
+ return result.toString();\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @param sequenceId\r
+ * id of sequence to highlight\r
+ * @param position\r
+ * integer position [ tobe implemented or range ] on sequence\r
+ * @param alignedPosition\r
+ * true/false/empty string - indicate if position is an alignment\r
+ * column or unaligned sequence position\r
+ */\r
+ public void highlight(String sequenceId, String position,\r
+ String alignedPosition)\r
+ {\r
+ highlightIn(getDefaultTargetFrame(), sequenceId, position,\r
+ alignedPosition);\r
+ }\r
+\r
+ /**\r
+ * \r
+ * @param sequenceId\r
+ * id of sequence to highlight\r
+ * @param position\r
+ * integer position [ tobe implemented or range ] on sequence\r
+ * @param alignedPosition\r
+ * false, blank or something else - indicate if position is an\r
+ * alignment column or unaligned sequence position\r
+ */\r
+ public void highlightIn(AlignFrame alf, String sequenceId,\r
+ String position, String alignedPosition)\r
+ {\r
+ // TODO: could try to highlight in all alignments if alf==null\r
+ jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(\r
+ alf.viewport.getAlignment().getSequencesArray());\r
+ SequenceI sq = matcher.findIdMatch(sequenceId);\r
+ if (sq != null)\r
+ {\r
+ int pos, apos = -1;\r
+ try\r
+ {\r
+ apos = new Integer(position).intValue();\r
+ apos--;\r
+ } catch (NumberFormatException ex)\r
+ {\r
+ return;\r
+ }\r
+ // use vamsas listener to broadcast to all listeners in scope\r
+ if (alignedPosition != null\r
+ && (alignedPosition.trim().length() == 0 || alignedPosition\r
+ .toLowerCase().indexOf("false") > -1))\r
+ {\r
+ StructureSelectionManager.getStructureSelectionManager(this)\r
+ .mouseOverVamsasSequence(sq, sq.findIndex(apos), null);\r
+ }\r
+ else\r
+ {\r
+ StructureSelectionManager.getStructureSelectionManager(this)\r
+ .mouseOverVamsasSequence(sq, apos, null);\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ /**\r
+ * select regions of the currrent alignment frame\r
+ * \r
+ * @param sequenceIds\r
+ * String separated list of sequence ids or empty string\r
+ * @param columns\r
+ * String separated list { column range or column, ..} or empty\r
+ * string\r
+ */\r
+ public void select(String sequenceIds, String columns)\r
+ {\r
+ selectIn(getDefaultTargetFrame(), sequenceIds, columns, separator);\r
+ }\r
+\r
+ /**\r
+ * select regions of the currrent alignment frame\r
+ * \r
+ * @param toselect\r
+ * String separated list { column range, seq1...seqn sequence ids }\r
+ * @param sep\r
+ * separator between toselect fields\r
+ */\r
+ public void select(String sequenceIds, String columns, String sep)\r
+ {\r
+ selectIn(getDefaultTargetFrame(), sequenceIds, columns, sep);\r
+ }\r
+\r
+ /**\r
+ * select regions of the given alignment frame\r
+ * \r
+ * @param alf\r
+ * @param toselect\r
+ * String separated list { column range, seq1...seqn sequence ids }\r
+ * @param sep\r
+ * separator between toselect fields\r
+ */\r
+ public void selectIn(AlignFrame alf, String sequenceIds, String columns)\r
+ {\r
+ selectIn(alf, sequenceIds, columns, separator);\r
+ }\r
+\r
+ /**\r
+ * select regions of the given alignment frame\r
+ * \r
+ * @param alf\r
+ * @param toselect\r
+ * String separated list { column range, seq1...seqn sequence ids }\r
+ * @param sep\r
+ * separator between toselect fields\r
+ */\r
+ public void selectIn(AlignFrame alf, String sequenceIds, String columns,\r
+ String sep)\r
+ {\r
+ if (sep == null || sep.length() == 0)\r
+ {\r
+ sep = separator;\r
+ }\r
+ else\r
+ {\r
+ if (debug)\r
+ {\r
+ System.err.println("Selecting region using separator string '"\r
+ + separator + "'");\r
+ }\r
+ }\r
+ // deparse fields\r
+ String[] ids = separatorListToArray(sequenceIds, sep);\r
+ String[] cols = separatorListToArray(columns, sep);\r
+ SequenceGroup sel = new SequenceGroup();\r
+ ColumnSelection csel = new ColumnSelection();\r
+ AlignmentI al = alf.viewport.getAlignment();\r
+ jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(\r
+ alf.viewport.getAlignment().getSequencesArray());\r
+ int start = 0, end = al.getWidth(), alw = al.getWidth();\r
+ boolean seqsfound = true;\r
+ if (ids != null && ids.length > 0)\r
+ {\r
+ seqsfound = false;\r
+ for (int i = 0; i < ids.length; i++)\r
+ {\r
+ if (ids[i].trim().length() == 0)\r
+ {\r
+ continue;\r
+ }\r
+ SequenceI sq = matcher.findIdMatch(ids[i]);\r
+ if (sq != null)\r
+ {\r
+ seqsfound = true;\r
+ sel.addSequence(sq, false);\r
+ }\r
+ }\r
+ }\r
+ boolean inseqpos = false;\r
+ if (cols != null && cols.length > 0)\r
+ {\r
+ boolean seset = false;\r
+ for (int i = 0; i < cols.length; i++)\r
+ {\r
+ String cl = cols[i].trim();\r
+ if (cl.length() == 0)\r
+ {\r
+ continue;\r
+ }\r
+ int p;\r
+ if ((p = cl.indexOf("-")) > -1)\r
+ {\r
+ int from = -1, to = -1;\r
+ try\r
+ {\r
+ from = new Integer(cl.substring(0, p)).intValue();\r
+ from--;\r
+ } catch (NumberFormatException ex)\r
+ {\r
+ System.err\r
+ .println("ERROR: Couldn't parse first integer in range element column selection string '"\r
+ + cl + "' - format is 'from-to'");\r
+ return;\r
+ }\r
+ try\r
+ {\r
+ to = new Integer(cl.substring(p + 1)).intValue();\r
+ to--;\r
+ } catch (NumberFormatException ex)\r
+ {\r
+ System.err\r
+ .println("ERROR: Couldn't parse second integer in range element column selection string '"\r
+ + cl + "' - format is 'from-to'");\r
+ return;\r
+ }\r
+ if (from >= 0 && to >= 0)\r
+ {\r
+ // valid range\r
+ if (from < to)\r
+ {\r
+ int t = to;\r
+ to = from;\r
+ to = t;\r
+ }\r
+ if (!seset)\r
+ {\r
+ start = from;\r
+ end = to;\r
+ seset = true;\r
+ }\r
+ else\r
+ {\r
+ // comment to prevent range extension\r
+ if (start > from)\r
+ {\r
+ start = from;\r
+ }\r
+ if (end < to)\r
+ {\r
+ end = to;\r
+ }\r
+ }\r
+ for (int r = from; r <= to; r++)\r
+ {\r
+ if (r >= 0 && r < alw)\r
+ {\r
+ csel.addElement(r);\r
+ }\r
+ }\r
+ if (debug)\r
+ {\r
+ System.err.println("Range '" + cl + "' deparsed as [" + from\r
+ + "," + to + "]");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ System.err.println("ERROR: Invalid Range '" + cl\r
+ + "' deparsed as [" + from + "," + to + "]");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ int r = -1;\r
+ try\r
+ {\r
+ r = new Integer(cl).intValue();\r
+ r--;\r
+ } catch (NumberFormatException ex)\r
+ {\r
+ if (cl.toLowerCase().equals("sequence"))\r
+ {\r
+ // we are in the dataset sequence's coordinate frame.\r
+ inseqpos = true;\r
+ }\r
+ else\r
+ {\r
+ System.err\r
+ .println("ERROR: Couldn't parse integer from point selection element of column selection string '"\r
+ + cl + "'");\r
+ return;\r
+ }\r
+ }\r
+ if (r >= 0 && r <= alw)\r
+ {\r
+ if (!seset)\r
+ {\r
+ start = r;\r
+ end = r;\r
+ seset = true;\r
+ }\r
+ else\r
+ {\r
+ // comment to prevent range extension\r
+ if (start > r)\r
+ {\r
+ start = r;\r
+ }\r
+ if (end < r)\r
+ {\r
+ end = r;\r
+ }\r
+ }\r
+ csel.addElement(r);\r
+ if (debug)\r
+ {\r
+ System.err.println("Point selection '" + cl\r
+ + "' deparsed as [" + r + "]");\r
+ }\r
+ }\r
+ else\r
+ {\r
+ System.err.println("ERROR: Invalid Point selection '" + cl\r
+ + "' deparsed as [" + r + "]");\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if (seqsfound)\r
+ {\r
+ // we only propagate the selection when it was the null selection, or the\r
+ // given sequences were found in the alignment.\r
+ if (inseqpos && sel.getSize() > 0)\r
+ {\r
+ // assume first sequence provides reference frame ?\r
+ SequenceI rs = sel.getSequenceAt(0);\r
+ start = rs.findIndex(start);\r
+ end = rs.findIndex(end);\r
+ if (csel != null)\r
+ {\r
+ Vector cs = csel.getSelected();\r
+ csel.clear();\r
+ for (int csi = 0, csiS = cs.size(); csi < csiS; csi++)\r
+ {\r
+ csel.addElement(rs.findIndex(((Integer) cs.elementAt(csi))\r
+ .intValue()));\r
+ }\r
+ }\r
+ }\r
+ sel.setStartRes(start);\r
+ sel.setEndRes(end);\r
+ alf.select(sel, csel);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * get sequences selected in current alignFrame and return their alignment in\r
+ * format 'format' either with or without suffix\r
+ * \r
+ * @param alf\r
+ * - where selection is\r
+ * @param format\r
+ * - format of alignment file\r
+ * @param suffix\r
+ * - "true" to append /start-end string to each sequence ID\r
+ * @return selected sequences as flat file or empty string if there was no\r
+ * current selection\r
+ */\r
+ public String getSelectedSequencesAsAlignment(String format, String suffix)\r
+ {\r
+ return getSelectedSequencesAsAlignmentFrom(getDefaultTargetFrame(),\r
+ format, suffix);\r
+ }\r
+\r
+ /**\r
+ * get sequences selected in alf and return their alignment in format 'format'\r
+ * either with or without suffix\r
+ * \r
+ * @param alf\r
+ * - where selection is\r
+ * @param format\r
+ * - format of alignment file\r
+ * @param suffix\r
+ * - "true" to append /start-end string to each sequence ID\r
+ * @return selected sequences as flat file or empty string if there was no\r
+ * current selection\r
+ */\r
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,\r
+ String format, String suffix)\r
+ {\r
+ try\r
+ {\r
+ boolean seqlimits = suffix.equalsIgnoreCase("true");\r
+ if (alf.viewport.getSelectionGroup() != null)\r
+ {\r
+ String reply = new AppletFormatAdapter().formatSequences(format,\r
+ new Alignment(alf.viewport.getSelectionAsNewSequence()),\r
+ seqlimits);\r
+ return reply;\r
+ }\r
+ } catch (Exception ex)\r
+ {\r
+ ex.printStackTrace();\r
+ return "Error retrieving alignment in " + format + " format. ";\r
+ }\r
+ return "";\r
+ }\r
+\r
+ public String getAlignmentOrder()\r
+ {\r
+ return getAlignmentOrderFrom(getDefaultTargetFrame());\r
+ }\r
+\r
+ public String getAlignmentOrderFrom(AlignFrame alf)\r
+ {\r
+ return getAlignmentOrderFrom(alf, separator);\r
+ }\r
+\r
+ public String getAlignmentOrderFrom(AlignFrame alf, String sep)\r
+ {\r
+ AlignmentI alorder = alf.getAlignViewport().getAlignment();\r
+ String[] order = new String[alorder.getHeight()];\r
+ for (int i = 0; i < order.length; i++)\r
+ {\r
+ order[i] = alorder.getSequenceAt(i).getName();\r
+ }\r
+ return arrayToSeparatorList(order);\r
+ }\r
+\r
+ public String orderBy(String order, String undoName)\r
+ {\r
+ return orderBy(order, undoName, separator);\r
+ }\r
+\r
+ public String orderBy(String order, String undoName, String sep)\r
+ {\r
+ return orderAlignmentBy(getDefaultTargetFrame(), order, undoName, sep);\r
+ }\r
+\r
+ public String orderAlignmentBy(AlignFrame alf, String order,\r
+ String undoName, String sep)\r
+ {\r
+ String[] ids = separatorListToArray(order, sep);\r
+ SequenceI[] sqs = null;\r
+ if (ids != null && ids.length > 0)\r
+ {\r
+ jalview.analysis.SequenceIdMatcher matcher = new jalview.analysis.SequenceIdMatcher(\r
+ alf.viewport.getAlignment().getSequencesArray());\r
+ int s = 0;\r
+ sqs = new SequenceI[ids.length];\r
+ for (int i = 0; i < ids.length; i++)\r
+ {\r
+ if (ids[i].trim().length() == 0)\r
+ {\r
+ continue;\r
+ }\r
+ SequenceI sq = matcher.findIdMatch(ids[i]);\r
+ if (sq != null)\r
+ {\r
+ sqs[s++] = sq;\r
+ }\r
+ }\r
+ if (s > 0)\r
+ {\r
+ SequenceI[] sqq = new SequenceI[s];\r
+ System.arraycopy(sqs, 0, sqq, 0, s);\r
+ sqs = sqq;\r
+ }\r
+ else\r
+ {\r
+ sqs = null;\r
+ }\r
+ }\r
+ if (sqs == null)\r
+ {\r
+ return "";\r
+ }\r
+ ;\r
+ AlignmentOrder aorder = new AlignmentOrder(sqs);\r
+\r
+ if (undoName != null && undoName.trim().length() == 0)\r
+ {\r
+ undoName = null;\r
+ }\r
+\r
+ return alf.sortBy(aorder, undoName) ? "true" : "";\r
+ }\r