1.1 compatible
[jalview.git] / src / jalview / datamodel / ColumnSelection.java
index 1dafcf0..8c30d45 100644 (file)
@@ -18,6 +18,8 @@
  */\r
 package jalview.datamodel;\r
 \r
+import jalview.util.ShiftList;\r
+\r
 import java.util.*;\r
 \r
 /**\r
@@ -31,20 +33,21 @@ public class ColumnSelection
     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
@@ -52,9 +55,9 @@ public class ColumnSelection
     }\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
@@ -66,6 +69,11 @@ public class ColumnSelection
         }\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
@@ -78,18 +86,20 @@ public class ColumnSelection
         }\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
@@ -160,10 +170,10 @@ public class ColumnSelection
 \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
@@ -194,7 +204,19 @@ public class ColumnSelection
           }\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
@@ -205,7 +227,11 @@ public class ColumnSelection
     {\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
@@ -334,38 +360,69 @@ public class ColumnSelection
 \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
@@ -375,7 +432,7 @@ public class ColumnSelection
         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
@@ -392,7 +449,7 @@ public class ColumnSelection
         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
@@ -401,6 +458,8 @@ public class ColumnSelection
           break;\r
         }\r
       }\r
+      if(hiddenColumns.size()==0)\r
+        hiddenColumns = null;\r
     }\r
 \r
     public boolean isVisible(int column)\r
@@ -415,5 +474,37 @@ public class ColumnSelection
       }\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