*/
public class ColumnSelection
{
+ /*
+ * list of selected columns (not ordered)
+ */
Vector<Integer> selected = new Vector<Integer>();
- // Vector of int [] {startCol, endCol}
+ /*
+ * list of hidden column [start, end] ranges; the list is maintained in
+ * ascending start column order
+ */
Vector<int[]> hiddenColumns;
/**
}
/**
- *
- * @return Vector containing selected columns as Integers
+ * Returns a list of selected columns. The list contains no duplicates but is
+ * not necessarily ordered.
*/
- public Vector<Integer> getSelected()
+ public List<Integer> getSelected()
{
return selected;
}
}
/**
- * Column number at position i in selection
- *
- * @param i
- * index into selected columns
- *
- * @return column number in alignment
- */
- public int columnAt(int i)
- {
- return selected.elementAt(i).intValue();
- }
-
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
+ * Answers true if no columns are selected, else false
*/
- public int size()
+ public boolean isEmpty()
{
- return selected.size();
+ return selected == null || selected.isEmpty();
}
/**
{
int max = -1;
- for (int i = 0; i < selected.size(); i++)
+ for (int sel : getSelected())
{
- if (columnAt(i) > max)
+ if (sel > max)
{
- max = columnAt(i);
+ max = sel;
}
}
{
int min = 1000000000;
- for (int i = 0; i < selected.size(); i++)
+ for (int sel : getSelected())
{
- if (columnAt(i) < min)
+ if (sel < min)
{
- min = columnAt(i);
+ min = sel;
}
}
public List<int[]> compensateForEdit(int start, int change)
{
List<int[]> deletedHiddenColumns = null;
- for (int i = 0; i < size(); i++)
+ for (int i = 0; i < selected.size(); i++)
{
- int temp = columnAt(i);
+ int temp = selected.get(i);
if (temp >= start)
{
*/
private void compensateForDelEdits(int start, int change)
{
- for (int i = 0; i < size(); i++)
+ for (int i = 0; i < selected.size(); i++)
{
- int temp = columnAt(i);
+ int temp = selected.get(i);
if (temp >= start)
{
- // if this ever changes to List.set(), swap parameter order!!
+ // if this ever changes to List.set(), must swap parameter order!!!
selected.setElementAt(new Integer(temp - change), i);
}
}
public void hideSelectedColumns()
{
- while (size() > 0)
+ while (!selected.isEmpty())
{
- int column = getSelected().firstElement().intValue();
+ int column = selected.get(0).intValue();
hideColumns(column);
}
}
+ /**
+ * Adds the specified column range to the hidden columns
+ *
+ * @param start
+ * @param end
+ */
public void hideColumns(int start, int end)
{
if (hiddenColumns == null)
hiddenColumns = new Vector<int[]>();
}
- boolean added = false;
- boolean overlap = false;
-
+ /*
+ * traverse existing hidden ranges and insert / amend / append as
+ * appropriate
+ */
for (int i = 0; i < hiddenColumns.size(); i++)
{
int[] region = hiddenColumns.elementAt(i);
- if (start <= region[1] && end >= region[0])
+
+ if (end < region[0] - 1)
{
- hiddenColumns.removeElementAt(i);
- overlap = true;
- break;
+ /*
+ * insert discontiguous preceding range
+ */
+ hiddenColumns.insertElementAt(new int[] { start, end }, i);
+ return;
}
- else if (end < region[0] && start < region[0])
+
+ if (end <= region[1])
{
- hiddenColumns.insertElementAt(new int[] { start, end }, i);
- added = true;
- break;
+ /*
+ * new range overlaps existing, or is contiguous preceding it - adjust
+ * start column
+ */
+ region[0] = Math.min(region[0], start);
+ return;
}
- }
- if (overlap)
- {
- hideColumns(start, end);
- }
- else if (!added)
- {
- hiddenColumns.addElement(new int[] { start, end });
+ if (start <= region[1] + 1)
+ {
+ /*
+ * new range overlaps existing, or is contiguous following it - adjust
+ * start and end columns
+ */
+ region[0] = Math.min(region[0], start);
+ region[1] = Math.max(region[1], end);
+ return;
+ }
}
+ /*
+ * remaining case is that the new range follows everything else
+ */
+ hiddenColumns.addElement(new int[] { start, end });
}
/**
- * This method will find a range of selected columns around the column
- * specified
+ * Hides the specified column and any adjacent selected columns
*
* @param res
* int
*/
public void hideColumns(int col)
{
- // First find out range of columns to hide
- int min = col, max = col + 1;
+ /*
+ * deselect column (whether selected or not!)
+ */
+ removeElement(col);
+
+ /*
+ * find adjacent selected columns
+ */
+ int min = col - 1, max = col + 1;
while (contains(min))
{
removeElement(min);
max++;
}
+ /*
+ * min, max are now the closest unselected columns
+ */
min++;
max--;
if (min > max)
hideColumns(min, max);
}
+ /**
+ * Unhides, and adds to the selection list, all hidden columns
+ */
public void revealAllHiddenColumns()
{
if (hiddenColumns != null)
hiddenColumns = null;
}
- public void revealHiddenColumns(int res)
+ /**
+ * Reveals, and marks as selected, the hidden column range with the given
+ * start column
+ *
+ * @param start
+ */
+ public void revealHiddenColumns(int start)
{
for (int i = 0; i < hiddenColumns.size(); i++)
{
int[] region = hiddenColumns.elementAt(i);
- if (res == region[0])
+ if (start == region[0])
{
for (int j = region[0]; j < region[1] + 1; j++)
{
{
if (hiddenColumns != null)
{
- for (int i = 0; i < hiddenColumns.size(); i++)
+ for (int[] region : hiddenColumns)
{
- int[] region = hiddenColumns.elementAt(i);
if (column >= region[0] && column <= region[1])
{
return false;
*/
public void addElementsFrom(ColumnSelection colsel)
{
- if (colsel != null && colsel.size() > 0)
+ if (colsel != null && !colsel.isEmpty())
{
for (Integer col : colsel.getSelected())
{