*/\r
package jalview.datamodel;\r
\r
+import jalview.util.ShiftList;\r
+\r
import java.util.*;\r
\r
/**\r
Vector hiddenColumns;\r
\r
/**\r
- * DOCUMENT ME!\r
+ * Add a column to the selection\r
*\r
- * @param col DOCUMENT ME!\r
+ * @param col index of column\r
*/\r
public void addElement(int col)\r
{\r
- if (!selected.contains(new Integer(col)))\r
+ Integer column = new Integer(col);\r
+ if (!selected.contains(column))\r
{\r
- selected.addElement(new Integer(col));\r
+ selected.addElement(column);\r
}\r
}\r
\r
/**\r
- * DOCUMENT ME!\r
+ * clears column selection\r
*/\r
public void clear()\r
{\r
}\r
\r
/**\r
- * DOCUMENT ME!\r
+ * removes col from selection\r
*\r
- * @param col DOCUMENT ME!\r
+ * @param col index of column to be removed\r
*/\r
public void removeElement(int col)\r
{\r
}\r
}\r
\r
+ /**\r
+ * removes a range of columns from the selection\r
+ * @param start int - first column in range to be removed\r
+ * @param end int - last col\r
+ */\r
public void removeElements(int start, int end)\r
{\r
Integer colInt;\r
}\r
}\r
}\r
-\r
+ /**\r
+ *\r
+ * @return Vector containing selected columns as Integers\r
+ */\r
public Vector getSelected()\r
{\r
return selected;\r
}\r
\r
/**\r
- * DOCUMENT ME!\r
*\r
- * @param col DOCUMENT ME!\r
+ * @param col index to search for in column selection\r
*\r
- * @return DOCUMENT ME!\r
+ * @return true if Integer(col) is in selection.\r
*/\r
public boolean contains(int col)\r
{\r
\r
\r
/**\r
- * DOCUMENT ME!\r
+ * propagate shift in alignment columns to column selection\r
*\r
- * @param start DOCUMENT ME!\r
- * @param change DOCUMENT ME!\r
+ * @param start beginning of edit\r
+ * @param change shift in edit (-ve or +ve number of columns)\r
*/\r
public void compensateForEdit(int start, int change)\r
{\r
}\r
}\r
}\r
-\r
+ public ShiftList compensateForEdits(ShiftList shiftrecord) {\r
+ if (shiftrecord!=null) {\r
+ Vector shifts = shiftrecord.shifts;\r
+ if (shifts!=null && shifts.size()>0) {\r
+ for (int i=0,j=shifts.size(); i<j; i++) {\r
+ int[] sh = (int[]) shifts.elementAt(i);\r
+ compensateForEdit(sh[0], sh[1]);\r
+ }\r
+ }\r
+ return shiftrecord.getInverse();\r
+ }\r
+ return null;\r
+ }\r
/**\r
* This Method is used to return all the HiddenColumn regions\r
* less than the given index.\r
{\r
return hiddenColumns;\r
}\r
-\r
+ /**\r
+ * Return absolute column index for a visible column index\r
+ * @param column int column index in alignment view\r
+ * @return alignment column index for column\r
+ */\r
public int adjustForHiddenColumns(int column)\r
{\r
int result = column;\r
\r
}\r
\r
+ public void hideSelectedColumns()\r
+ {\r
+ while (size() > 0)\r
+ {\r
+ int column = ( (Integer) getSelected().firstElement()).intValue();\r
+ hideColumns(column);\r
+ }\r
\r
+ }\r
\r
- public void hideColumns(int res)\r
+ public void hideColumns(int start, int end)\r
{\r
if(hiddenColumns==null)\r
hiddenColumns = new Vector();\r
\r
- // First find out range of columns to hide\r
- int min = res, max = res+1;\r
- while( contains(min) )\r
- { removeElement(min); min --; }\r
-\r
- while( contains(max) )\r
- { removeElement(max); max ++; }\r
-\r
- min++; max--;\r
-\r
boolean added = false;\r
- for(int i=0; i<hiddenColumns.size(); i++)\r
+ boolean overlap = false;\r
+\r
+ for (int i = 0; i < hiddenColumns.size(); i++)\r
{\r
- int [] region = (int[])hiddenColumns.elementAt(i);\r
- if( max < region[0])\r
+ int[] region = (int[]) hiddenColumns.elementAt(i);\r
+ if ( start<=region[1] && end>=region[0])\r
{\r
- hiddenColumns.insertElementAt(new int[]{min, max}, i);\r
+ hiddenColumns.removeElementAt(i);\r
+ overlap = true;\r
+ break;\r
+ }\r
+ else if (end < region[0] && start < region[0])\r
+ {\r
+ hiddenColumns.insertElementAt(new int[]\r
+ {start, end}, i);\r
added = true;\r
break;\r
}\r
}\r
\r
- if(!added)\r
- hiddenColumns.addElement(new int[]{min, max});\r
+ if(overlap)\r
+ {\r
+ hideColumns(start, end);\r
+ }\r
+ else if (!added)\r
+ hiddenColumns.addElement(new int[] {start, end});\r
+\r
+ }\r
+\r
+ /**\r
+ * This method will find a range of selected columns\r
+ * around the column specified\r
+ * @param res int\r
+ */\r
+ public void hideColumns(int col)\r
+ {\r
+ // First find out range of columns to hide\r
+ int min = col, max = col+1;\r
+ while( contains(min) )\r
+ { removeElement(min); min --; }\r
+\r
+ while( contains(max) )\r
+ { removeElement(max); max ++; }\r
+\r
+ min++; max--;\r
\r
+ hideColumns(min, max);\r
}\r
\r
public void revealAllHiddenColumns()\r
for (int i = 0; i < hiddenColumns.size(); i++)\r
{\r
int[] region = (int[]) hiddenColumns.elementAt(i);\r
- for (int j = region[0]; j < region[1]; j++)\r
+ for (int j = region[0]; j < region[1]+1; j++)\r
{\r
addElement(j);\r
}\r
int [] region = (int[])hiddenColumns.elementAt(i);\r
if( res == region[0])\r
{\r
- for (int j = region[0]; j < region[1]; j++)\r
+ for (int j = region[0]; j < region[1]+1; j++)\r
{\r
addElement(j);\r
}\r
break;\r
}\r
}\r
+ if(hiddenColumns.size()==0)\r
+ hiddenColumns = null;\r
}\r
\r
public boolean isVisible(int column)\r
}\r
return true;\r
}\r
+ /**\r
+ * Copy constructor\r
+ * @param copy\r
+ */\r
+ public ColumnSelection(ColumnSelection copy) {\r
+ if (copy!=null) {\r
+ if (copy.selected!=null) {\r
+ selected = new Vector();\r
+ for (int i=0,j=copy.selected.size(); i<j; i++) {\r
+ selected.setElementAt(((Integer) copy.selected.elementAt(i)), i);\r
+ }\r
+ }\r
+ if (copy.hiddenColumns!=null) {\r
+ hiddenColumns=new Vector();\r
+ for (int i=0,j=copy.hiddenColumns.size(); i<j; i++) {\r
+ int[] rh,cp;\r
+ rh = (int[])copy.hiddenColumns.elementAt(i);\r
+ if (rh!=null) {\r
+ cp = new int[rh.length];\r
+ System.arraycopy(rh, 0, cp, 0, rh.length);\r
+ hiddenColumns.setElementAt(cp, i);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
\r
+ /**\r
+ * ColumnSelection\r
+ */\r
+ public ColumnSelection()\r
+ {\r
+ }\r
}\r