+ try
+ {
+ final IPickManager pm = vclient.getPickManager();
+ final StructureSelectionManager ssm = StructureSelectionManager
+ .getStructureSelectionManager(Desktop.getInstance());
+ final VamsasApplication me = this;
+ pm.registerMessageHandler(new IMessageHandler()
+ {
+ String last = null;
+
+ @Override
+ public void handleMessage(Message message)
+ {
+ if (vobj2jv == null)
+ {
+ // we are not in a session yet.
+ return;
+ }
+ if (message instanceof MouseOverMessage)
+ {
+ MouseOverMessage mm = (MouseOverMessage) message;
+ String mstring = mm.getVorbaID() + " " + mm.getPosition();
+ if (last != null && mstring.equals(last))
+ {
+ return;
+ }
+ // if (Cache.log.isDebugEnabled())
+ // {
+ // Cache.log.debug("Received MouseOverMessage "+mm.getVorbaID()+"
+ // "+mm.getPosition());
+ // }
+ Object jvobj = vobj2jv.get(mm.getVorbaID());
+ if (jvobj != null && jvobj instanceof SequenceI)
+ {
+ last = mstring;
+ // 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;
+ }
+ ;
+ jvobjs = null;
+ return;
+ }
+ }
+ });
+ picker = new VamsasListener()
+ {
+ SequenceI last = null;
+
+ int i = -1;
+
+ @Override
+ public void mouseOverSequence(SequenceI seq, int index,
+ VamsasSource source)
+ {
+ if (jv2vobj == null)
+ {
+ return;
+ }
+ if (seq != last || i != index)
+ {
+ VorbaId v = (VorbaId) jv2vobj.get(seq);
+ if (v != null)
+ {
+ // this should really be a trace message.
+ // Cache.log.debug("Mouse over " + v.getId() + " bound to "
+ // + seq + " at " + index);
+ last = seq;
+ i = index;
+ MouseOverMessage message = new MouseOverMessage(v.getId(),
+ index);
+ pm.sendMessage(message);
+ }
+ }
+ }
+ };
+ selecter = new SelectionListener()
+ {
+
+ @Override
+ public void selection(SequenceGroup seqsel,
+ ColumnSelection colsel, HiddenColumns hidden,
+ SelectionSource source)
+ {
+ if (vobj2jv == null)
+ {
+ Cache.log.warn(
+ "Selection listener still active for dead session.");
+ // not in a session.
+ return;
+ }
+ if (source != me)
+ {
+ AlignmentI visal = null;
+ if (source instanceof AlignViewport)
+ {
+ visal = ((AlignmentViewport) source).getAlignment();
+ }
+ SelectionMessage sm = null;
+ if ((seqsel == null || seqsel.getSize() == 0)
+ && (colsel == null || colsel.getSelected() == null
+ || colsel.getSelected().size() == 0))
+ {
+ if (source instanceof AlignViewport)
+ {
+ // the empty selection.
+ sm = new SelectionMessage("jalview",
+ new String[]
+ { ((AlignmentViewport) source)
+ .getSequenceSetId() },
+ null, true);
+ }
+ else
+ {
+ // the empty selection.
+ sm = new SelectionMessage("jalview", null, null, true);
+ }
+ }
+ else
+ {
+ String[] vobj = new String[seqsel.getSize()];
+ int o = 0;
+ for (SequenceI sel : seqsel.getSequences(null))
+ {
+ VorbaId v = (VorbaId) jv2vobj.get(sel);
+ if (v != null)
+ {
+ vobj[o++] = v.toString();
+ }
+ }
+ if (o < vobj.length)
+ {
+ String t[] = vobj;
+ vobj = new String[o];
+ System.arraycopy(t, 0, vobj, 0, o);
+ t = null;
+ }
+ Input range = null;
+ if (seqsel != null && colsel != null)
+ {
+ // deparse the colsel into positions on the vamsas alignment
+ // sequences
+ range = new Input();
+ if (colsel.getSelected() != null
+ && colsel.getSelected().size() > 0
+ && visal != null
+ && seqsel.getSize() == visal.getHeight())
+ {
+ // gather selected columns outwith the sequence positions
+ // too
+ for (Integer ival : colsel.getSelected())
+ {
+ Pos p = new Pos();
+ p.setI(ival.intValue() + 1);
+ range.addPos(p);
+ }
+ }
+ else
+ {
+ Iterator<int[]> intervals = hidden
+ .getVisContigsIterator(seqsel.getStartRes(),
+ seqsel.getEndRes() + 1, false);
+ while (intervals.hasNext())
+ {
+ int[] region = intervals.next();
+ Seg s = new Seg();
+ s.setStart(region[0] + 1); // vamsas indices begin at 1,
+ // not zero.
+ s.setEnd(region[1] + 1);
+ s.setInclusive(true);
+ range.addSeg(s);
+ }
+ }
+ }
+ if (vobj.length > 0)
+ {
+ sm = new SelectionMessage("jalview", vobj, range);
+ }
+ else
+ {
+ sm = null;
+ }
+ }
+ if (sm != null)
+ {
+ sm.validate(); // debug
+ Cache.log.debug("Selection Message\n" + sm.getRawMessage());
+ pm.sendMessage(sm);
+ }
+ }
+ }
+
+ };
+ ssm.addStructureViewerListener(picker); // better method here
+ ssm.addSelectionListener(selecter);
+ } catch (Exception e)
+ {
+ Cache.log.error("Failed to init Vamsas Picking", e);
+ }
+ }
+ }
+
+ public String getCurrentSession()
+ {
+ if (vclient != null)
+ {
+ return (vclient.getSessionUrn());