+ // Cache.log.debug("Handling Mouse over "+mm.getVorbaID()+"
+ // bound to "+jvobj+" at "+mm.getPosition());
+ // position is character position in aligned sequence
+ ssm.mouseOverVamsasSequence((SequenceI) jvobj,
+ mm.getPosition(), me);
+ }
+ }
+ if (message instanceof uk.ac.vamsas.client.picking.SelectionMessage)
+ {
+ // we only care about AlignmentSequence selections
+ SelectionMessage sm = (SelectionMessage) message;
+ sm.validate();
+ System.err.println("Received\n" + sm.getRawMessage());
+ Object[] jvobjs = sm.getVorbaIDs() == null ? null
+ : new Object[sm.getVorbaIDs().length];
+ if (jvobjs == null)
+ {
+ // TODO: rationalise : can only clear a selection over a
+ // referred to object
+ ssm.sendSelection(null, null, null, me);
+ return;
+ }
+ Class type = null;
+ boolean send = true;
+ for (int o = 0; o < jvobjs.length; o++)
+ {
+ jvobjs[o] = vobj2jv.get(sm.getVorbaIDs()[o]);
+ if (jvobjs[o] == null)
+ {
+ // can't cope with selections for unmapped objects
+ continue;
+ }
+ if (type == null)
+ {
+ type = jvobjs[o].getClass();
+ }
+ ;
+ if (type != jvobjs[o].getClass())
+ {
+ send = false;
+ // discard - can't cope with selections over mixed objects
+ // continue;
+ }
+ }
+ SequenceGroup jselection = null;
+ ColumnSelection colsel = null;
+ if (type == jalview.datamodel.Alignment.class)
+ {
+ if (jvobjs.length == 1)
+ {
+ // TODO if (sm.isNone())// send a message to select the
+ // specified columns over the
+ // given
+ // alignment
+
+ send = true;
+ }
+ }
+ if (type == jalview.datamodel.Sequence.class)
+ {
+
+ SequenceI seq;
+ boolean aligned = ((jalview.datamodel.Sequence) jvobjs[0])
+ .getDatasetSequence() != null;
+ int maxWidth = 0;
+ if (aligned)
+ {
+ jselection = new SequenceGroup();
+ jselection.addSequence(
+ seq = (jalview.datamodel.Sequence) jvobjs[0],
+ false);
+ maxWidth = seq.getLength();
+ }
+ for (int c = 1; aligned && jvobjs.length > 1
+ && c < jvobjs.length; c++)
+ {
+ if (((jalview.datamodel.Sequence) jvobjs[c])
+ .getDatasetSequence() == null)
+ {
+ aligned = false;
+ continue;
+ }
+ else
+ {
+ jselection.addSequence(
+ seq = (jalview.datamodel.Sequence) jvobjs[c],
+ false);
+ if (maxWidth < seq.getLength())
+ {
+ maxWidth = seq.getLength();
+ }
+
+ }
+ }
+ if (!aligned)
+ {
+ jselection = null;
+ // if cardinality is greater than one then verify all
+ // sequences are alignment sequences.
+ if (jvobjs.length == 1)
+ {
+ // find all instances of this dataset sequence in the
+ // displayed alignments containing the associated range and
+ // select them.
+ }
+ }
+ else
+ {
+ jselection.setStartRes(0);
+ jselection.setEndRes(maxWidth);
+ // locate the alignment containing the given sequences and
+ // select the associated ranges on them.
+ if (sm.getRanges() != null)
+ {
+ int[] prange = uk.ac.vamsas.objects.utils.Range
+ .getBounds(sm.getRanges());
+ jselection.setStartRes(prange[0] - 1);
+ jselection.setEndRes(prange[1] - 1);
+ prange = uk.ac.vamsas.objects.utils.Range
+ .getIntervals(sm.getRanges());
+ colsel = new ColumnSelection();
+ for (int p = 0; p < prange.length; p += 2)
+ {
+ int d = (prange[p] <= prange[p + 1]) ? 1 : -1;
+ // try to join up adjacent columns to make a larger
+ // selection
+ // lower and upper bounds
+ int l = (d < 0) ? 1 : 0;
+ int u = (d > 0) ? 1 : 0;
+
+ if (jselection.getStartRes() > 0
+ && prange[p + l] == jselection.getStartRes())
+ {
+ jselection.setStartRes(prange[p + l] - 1);
+ }
+ if (jselection.getEndRes() <= maxWidth && prange[p
+ + u] == (jselection.getEndRes() + 2))
+ {
+ jselection.setEndRes(prange[p + u] - 1);
+ }
+ // mark all the columns in the range.
+ for (int sr = prange[p], er = prange[p + 1], de = er
+ + d; sr != de; sr += d)
+ {
+ colsel.addElement(sr - 1);
+ }
+ }
+ }
+ send = true;
+ }
+ }
+ if (send)
+ {
+ ssm.sendSelection(jselection, colsel, null, me);
+ }
+ // discard message.
+ for (int c = 0; c < jvobjs.length; c++)
+ {
+ jvobjs[c] = null;