+ return new int[]\r
+ { start, end - 1 };\r
+ }\r
+ }\r
+\r
+ /**\r
+ * delete any columns in alignmentAnnotation that are hidden (including\r
+ * sequence associated annotation).\r
+ * \r
+ * @param alignmentAnnotation\r
+ */\r
+ public void makeVisibleAnnotation(AlignmentAnnotation alignmentAnnotation)\r
+ {\r
+ makeVisibleAnnotation(-1, -1, alignmentAnnotation);\r
+ }\r
+\r
+ /**\r
+ * delete any columns in alignmentAnnotation that are hidden (including\r
+ * sequence associated annotation).\r
+ * \r
+ * @param start\r
+ * remove any annotation to the right of this column\r
+ * @param end\r
+ * remove any annotation to the left of this column\r
+ * @param alignmentAnnotation\r
+ * the annotation to operate on\r
+ */\r
+ public void makeVisibleAnnotation(int start, int end,\r
+ AlignmentAnnotation alignmentAnnotation)\r
+ {\r
+ if (alignmentAnnotation.annotations == null)\r
+ {\r
+ return;\r
+ }\r
+ if (start == end && end == -1)\r
+ {\r
+ start = 0;\r
+ end = alignmentAnnotation.annotations.length;\r
+ }\r
+ if (hiddenColumns != null && hiddenColumns.size() > 0)\r
+ {\r
+ // then mangle the alignmentAnnotation annotation array\r
+ Vector annels = new Vector();\r
+ Annotation[] els = null;\r
+ Vector regions = getHiddenColumns();\r
+ int blockStart = start, blockEnd = end;\r
+ int[] region;\r
+ int hideStart, hideEnd, w = 0;\r
+\r
+ for (int j = 0; j < regions.size(); j++)\r
+ {\r
+ region = (int[]) regions.elementAt(j);\r
+ hideStart = region[0];\r
+ hideEnd = region[1];\r
+\r
+ if (hideStart < start)\r
+ {\r
+ continue;\r
+ }\r
+\r
+ blockStart = Math.min(blockStart, hideEnd + 1);\r
+ blockEnd = Math.min(blockEnd, hideStart);\r
+\r
+ if (blockStart > blockEnd)\r
+ {\r
+ break;\r
+ }\r
+\r
+ annels.addElement(els = new Annotation[blockEnd - blockStart]);\r
+ System.arraycopy(alignmentAnnotation.annotations, blockStart, els,\r
+ 0, els.length);\r
+ w += els.length;\r
+ blockStart = hideEnd + 1;\r
+ blockEnd = end;\r
+ }\r
+\r
+ if (end > blockStart)\r
+ {\r
+ annels.addElement(els = new Annotation[end - blockStart + 1]);\r
+ if ((els.length + blockStart) <= alignmentAnnotation.annotations.length)\r
+ {\r
+ // copy just the visible segment of the annotation row\r
+ System.arraycopy(alignmentAnnotation.annotations, blockStart,\r
+ els, 0, els.length);\r
+ }\r
+ else\r
+ {\r
+ // copy to the end of the annotation row\r
+ System.arraycopy(alignmentAnnotation.annotations, blockStart,\r
+ els, 0,\r
+ (alignmentAnnotation.annotations.length - blockStart));\r
+ }\r
+ w += els.length;\r
+ }\r
+ if (w == 0)\r
+ return;\r
+ Enumeration e = annels.elements();\r
+ alignmentAnnotation.annotations = new Annotation[w];\r
+ w = 0;\r
+ while (e.hasMoreElements())\r
+ {\r
+ Annotation[] chnk = (Annotation[]) e.nextElement();\r
+ System.arraycopy(chnk, 0, alignmentAnnotation.annotations, w,\r
+ chnk.length);\r
+ w += chnk.length;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ alignmentAnnotation.restrict(start, end);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Invert the column selection from first to end-1. leaves hiddenColumns\r
+ * untouched (and unselected)\r
+ * \r
+ * @param first\r
+ * @param end\r
+ */\r
+ public void invertColumnSelection(int first, int width)\r
+ {\r
+ boolean hasHidden = hiddenColumns != null && hiddenColumns.size() > 0;\r
+ for (int i = first; i < width; i++)\r
+ {\r
+ if (contains(i))\r
+ {\r
+ removeElement(i);\r
+ }\r
+ else\r
+ {\r
+ if (!hasHidden || isVisible(i))\r
+ {\r
+ addElement(i);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * add in any unselected columns from the given column selection, excluding\r
+ * any that are hidden.\r
+ * \r
+ * @param colsel\r
+ */\r
+ public void addElementsFrom(ColumnSelection colsel)\r
+ {\r
+ if (colsel != null && colsel.size() > 0)\r
+ {\r
+ Enumeration e = colsel.getSelected().elements();\r
+ while (e.hasMoreElements())\r
+ {\r
+ Object eo = e.nextElement();\r
+ if (hiddenColumns != null && isVisible(((Integer) eo).intValue()))\r
+ {\r
+ if (!selected.contains(eo))\r
+ {\r
+ selected.addElement(eo);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * set the selected columns the given column selection, excluding any columns\r
+ * that are hidden.\r
+ * \r
+ * @param colsel\r
+ */\r
+ public void setElementsFrom(ColumnSelection colsel)\r
+ {\r
+ selected = new Vector();\r
+ if (colsel.selected != null && colsel.selected.size() > 0)\r
+ {\r
+ if (hiddenColumns != null && hiddenColumns.size() > 0)\r
+ {\r
+ // only select visible columns in this columns selection\r
+ selected = new Vector();\r
+ addElementsFrom(colsel);\r
+ }\r
+ else\r
+ {\r
+ // add everything regardless\r
+ Enumeration en = colsel.selected.elements();\r
+ while (en.hasMoreElements())\r
+ {\r
+ selected.addElement(en.nextElement());\r
+ }\r
+ }\r