import java.util.Iterator;
+import jalview.datamodel.ColumnSelection;
import jalview.datamodel.ContactListI;
-
+import jalview.datamodel.HiddenColumns;
+import jalview.renderer.ContactGeometry.contactInterval;
+
+/**
+ * encapsulate logic for mapping between positions in a ContactList and their
+ * rendered representation in a given number of pixels.
+ *
+ * @author jprocter
+ *
+ */
public class ContactGeometry
{
+
+ final ContactListI contacts;
+
final int pixels_step;
final double contacts_per_pixel;
final int graphHeight;
- public ContactGeometry(ContactListI contacts, int graphHeight)
+ public ContactGeometry(final ContactListI contacts, int graphHeight)
{
+ this.contacts=contacts;
this.graphHeight = graphHeight;
contact_height = contacts.getContactHeight();
// fractional number of contacts covering each pixel
public final int pStart;
public final int pEnd;
+
+ }
+ /**
+ *
+ * @param columnSelection
+ * @param ci
+ * @param visibleOnly - when true, only test intersection of visible columns given matrix range
+ * @return true if the range on the matrix specified by ci intersects with selected columns in the ContactListI's reference frame.
+ */
+
+ boolean intersects(contactInterval ci,ColumnSelection columnSelection, HiddenColumns hiddenColumns, boolean visibleOnly) {
+ boolean rowsel = false;
+ final int[] mappedRange = contacts.getMappedPositionsFor(ci.cStart, ci.cEnd);
+ if (mappedRange==null)
+ {
+ return false;
+ }
+ boolean containsHidden=false;
+ if (visibleOnly && hiddenColumns!=null && hiddenColumns.hasHiddenColumns())
+ {
+ // TODO: turn into function on hiddenColumns and create test !!
+ Iterator<int[]> viscont = hiddenColumns
+ .getVisContigsIterator(mappedRange[0], mappedRange[1], false);
+ containsHidden = !viscont.hasNext();
+ if (!containsHidden)
+ {
+ for (int[] interval=viscont.next();viscont.hasNext();
+ rowsel |= columnSelection.intersects(interval[0],interval[1]))
+ ;
+ }
+ }
+ else
+ {
+ // if containsHidden is true mappedRange is not visible
+ if (containsHidden)
+ {
+ rowsel = columnSelection.intersects(mappedRange[0], mappedRange[1]);
+ }
+ }
+ return rowsel;
+
}
/**