X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FVamsasApplication.java;h=c094b1c362ffce4ffbe320cf23b771e5ee2bb7d1;hb=09d3b755d9b00f5c3acb44049aedd49361dc0690;hp=2879c2faa71d73fb47d42ed94589101a44b3e059;hpb=85c063b49c067bbb850941da79a796cbd5ef032f;p=jalview.git diff --git a/src/jalview/gui/VamsasApplication.java b/src/jalview/gui/VamsasApplication.java index 2879c2f..c094b1c 100644 --- a/src/jalview/gui/VamsasApplication.java +++ b/src/jalview/gui/VamsasApplication.java @@ -1,26 +1,29 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) - * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.HiddenColumns; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.io.VamsasAppDatastore; @@ -28,24 +31,24 @@ import jalview.structure.SelectionListener; import jalview.structure.SelectionSource; import jalview.structure.StructureSelectionManager; import jalview.structure.VamsasListener; +import jalview.structure.VamsasSource; +import jalview.util.MessageManager; +import jalview.viewmodel.AlignmentViewport; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; -import java.util.Enumeration; import java.util.Hashtable; import java.util.IdentityHashMap; import java.util.Iterator; import javax.swing.JInternalFrame; -import javax.swing.JOptionPane; import uk.ac.vamsas.client.ClientHandle; import uk.ac.vamsas.client.IClient; import uk.ac.vamsas.client.IClientDocument; import uk.ac.vamsas.client.InvalidSessionDocumentException; -import uk.ac.vamsas.client.NoDefaultSessionException; import uk.ac.vamsas.client.UserHandle; import uk.ac.vamsas.client.VorbaId; import uk.ac.vamsas.client.picking.IMessageHandler; @@ -62,7 +65,7 @@ import uk.ac.vamsas.objects.core.Seg; * @author jimp * */ -public class VamsasApplication implements SelectionSource +public class VamsasApplication implements SelectionSource, VamsasSource { IClient vclient = null; @@ -72,16 +75,19 @@ public class VamsasApplication implements SelectionSource Desktop jdesktop = null; // our jalview desktop reference + private boolean inInitialUpdate = true; + // Cache.preferences for vamsas client session arena // preferences for check for default session at startup. // user and organisation stuff. - public VamsasApplication(Desktop jdesktop, File sessionPath) + public VamsasApplication(Desktop jdesktop, File sessionPath, + String sessionName) { // JBPNote: // we should create a session URI from the sessionPath and pass it to // the clientFactory - but the vamsas api doesn't cope with that yet. this.jdesktop = jdesktop; - initClientSession(null, sessionPath); + initClientSession(null, sessionPath, sessionName); } private static uk.ac.vamsas.client.IClientFactory getClientFactory() @@ -133,7 +139,13 @@ public class VamsasApplication implements SelectionSource * null or a valid vamsas document file * @return false if no vamsas connection was made */ - private boolean initClientSession(String sess, File vamsasDocument) + private void initClientSession(String sess, File vamsasDocument) + { + initClientSession(sess, vamsasDocument, null); + } + + private boolean initClientSession(String sess, File vamsasDocument, + String newDocSessionName) { try { @@ -144,22 +156,30 @@ public class VamsasApplication implements SelectionSource { if (sess != null) { - throw new Error( - "Implementation Error - cannot import existing vamsas document into an existing session, Yet!"); + throw new Error(MessageManager.getString( + "error.implementation_error_cannot_import_vamsas_doc")); } try { - vclient = clientfactory.openAsNewSessionIClient(app, - vamsasDocument); + if (newDocSessionName != null) + { + vclient = clientfactory.openAsNewSessionIClient(app, + vamsasDocument, newDocSessionName); + } + else + { + vclient = clientfactory.openAsNewSessionIClient(app, + vamsasDocument); + } } catch (InvalidSessionDocumentException e) { - JOptionPane - .showInternalMessageDialog( - Desktop.desktop, + JvOptionPane.showInternalMessageDialog(Desktop.desktop, - "VAMSAS Document could not be opened as a new session - please choose another", - "VAMSAS Document Import Failed", - JOptionPane.ERROR_MESSAGE); + MessageManager.getString( + "label.vamsas_doc_couldnt_be_opened_as_new_session"), + MessageManager + .getString("label.vamsas_document_import_failed"), + JvOptionPane.ERROR_MESSAGE); } } @@ -181,8 +201,8 @@ public class VamsasApplication implements SelectionSource } catch (Exception e) { - jalview.bin.Cache.log - .error("Couldn't instantiate vamsas client !", e); + jalview.bin.Cache.log.error("Couldn't instantiate vamsas client !", + e); return false; } return true; @@ -205,16 +225,14 @@ public class VamsasApplication implements SelectionSource } } catch (Error e) { - Cache.log - .warn( - "Probable SERIOUS VAMSAS client incompatibility - carrying on regardless", - e); + Cache.log.warn( + "Probable SERIOUS VAMSAS client incompatibility - carrying on regardless", + e); } catch (Exception e) { - Cache.log - .warn( - "Probable VAMSAS client incompatibility - carrying on regardless", - e); + Cache.log.warn( + "Probable VAMSAS client incompatibility - carrying on regardless", + e); } } @@ -225,8 +243,8 @@ public class VamsasApplication implements SelectionSource */ private ClientHandle getJalviewHandle() { - return new ClientHandle("jalview.bin.Jalview", jalview.bin.Cache - .getProperty("VERSION")); + return new ClientHandle("jalview.bin.Jalview", + jalview.bin.Cache.getProperty("VERSION")); } /** @@ -246,15 +264,17 @@ public class VamsasApplication implements SelectionSource { if (!inSession()) { - throw new Error( - "Impementation error! Vamsas Operations when client not initialised and connected."); + throw new Error(MessageManager.getString( + "error.implementation_error_vamsas_operation_not_init")); } addDocumentUpdateHandler(); addStoreDocumentHandler(); startSession(); - Cache.log - .debug("Jalview loading the Vamsas Session for the first time."); + inInitialUpdate = true; + Cache.log.debug( + "Jalview loading the Vamsas Session for the first time."); dealWithDocumentUpdate(false); // we don't push an update out to the + inInitialUpdate = false; // document yet. Cache.log.debug("... finished update for the first time."); } @@ -286,10 +306,9 @@ public class VamsasApplication implements SelectionSource } } catch (Exception e) { - Cache.log - .warn( - "Exception whilst refreshing jalview windows after a vamsas document update.", - e); + Cache.log.warn( + "Exception whilst refreshing jalview windows after a vamsas document update.", + e); } } @@ -298,6 +317,7 @@ public class VamsasApplication implements SelectionSource Thread udthread = new Thread(new Runnable() { + @Override public void run() { Cache.log.info("Jalview updating to the Vamsas Session."); @@ -330,7 +350,10 @@ public class VamsasApplication implements SelectionSource public void end_session(boolean promptUser) { if (!inSession()) - throw new Error("Jalview not connected to Vamsas session."); + { + throw new Error(MessageManager + .getString("error.jalview_no_connected_vamsas_session")); + } Cache.log.info("Jalview disconnecting from the Vamsas Session."); try { @@ -344,8 +367,8 @@ public class VamsasApplication implements SelectionSource } else { - Cache.log - .warn("JV Client leaving a session that's its not joined yet."); + Cache.log.warn( + "JV Client leaving a session that's its not joined yet."); } joinedSession = false; vclient = null; @@ -420,9 +443,11 @@ public class VamsasApplication implements SelectionSource * bindings is made. * * @param doc + * @return number of views stored in document (updated and new views) */ - public void updateVamsasDocument(IClientDocument doc) + public int updateVamsasDocument(IClientDocument doc) { + int storedviews = 0; ensureJvVamsas(); errorsDuringUpdate = false; errorsDuringAppUpdate = false; @@ -434,7 +459,7 @@ public class VamsasApplication implements SelectionSource if (frames == null) { - return; + return 0; } Hashtable skipList = new Hashtable(); Hashtable viewset = new Hashtable(); @@ -457,11 +482,10 @@ public class VamsasApplication implements SelectionSource } catch (Exception e) { errorsDuringUpdate = true; - Cache.log.error("Exception synchronizing " - + af.getTitle() + Cache.log.error("Exception synchronizing " + af.getTitle() + " " - + (af.getViewport().viewName == null ? "" : " view " - + af.getViewport().viewName) + + (af.getViewport().getViewName() == null ? "" + : " view " + af.getViewport().getViewName()) + " to document.", e); stored = false; } @@ -471,6 +495,7 @@ public class VamsasApplication implements SelectionSource } else { + storedviews++; // could try to eliminate sequenceSetId from skiplist .. // (skipList.containsKey(af.getViewport().getSequenceSetId())) // remember sequenceSetId so we can skip all the other views on @@ -516,6 +541,7 @@ public class VamsasApplication implements SelectionSource errorsDuringAppUpdate = true; } vds.clearSkipList(); + return storedviews; } private Entry baseProvEntry() @@ -533,9 +559,11 @@ public class VamsasApplication implements SelectionSource * * @param fromJalview * true to update from jalview to the vamsas document + * @return total number of stored alignments in the document after the update */ - protected void dealWithDocumentUpdate(boolean fromJalview) + protected int dealWithDocumentUpdate(boolean fromJalview) { + int storedviews = 0; // called by update handler for document update. Cache.log.debug("Updating jalview from changed vamsas document."); disableGui(true); @@ -551,11 +579,11 @@ public class VamsasApplication implements SelectionSource } if (fromJalview) { - this.updateVamsasDocument(cdoc); + storedviews += updateVamsasDocument(cdoc); if (Cache.log.isDebugEnabled()) { - Cache.log - .debug("Time taken to update Vamsas Document from jalview\t= " + Cache.log.debug( + "Time taken to update Vamsas Document from jalview\t= " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); } @@ -572,8 +600,8 @@ public class VamsasApplication implements SelectionSource updateJalview(cdoc); if (Cache.log.isDebugEnabled()) { - Cache.log - .debug("Time taken to update Jalview from vamsas document Roots\t= " + Cache.log.debug( + "Time taken to update Jalview from vamsas document Roots\t= " + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); } @@ -593,10 +621,12 @@ public class VamsasApplication implements SelectionSource ee.printStackTrace(System.err); // recover object map backup, since its probably corrupted with references // to Vobjects that don't exist anymore. - this.recover_objectMappingBackup(); + recover_objectMappingBackup(); + storedviews = 0; } Cache.log.debug("Finished updating from document change."); disableGui(false); + return storedviews; } private void addDocumentUpdateHandler() @@ -604,6 +634,7 @@ public class VamsasApplication implements SelectionSource final VamsasApplication client = this; vclient.addDocumentUpdateHandler(new PropertyChangeListener() { + @Override public void propertyChange(PropertyChangeEvent evt) { Cache.log.debug("Dealing with document update event."); @@ -621,34 +652,34 @@ public class VamsasApplication implements SelectionSource uk.ac.vamsas.client.Events.DOCUMENT_REQUESTTOCLOSE, new PropertyChangeListener() { + @Override public void propertyChange(PropertyChangeEvent evt) { if (client.promptUser) { - Cache.log - .debug("Asking user if the vamsas session should be stored."); - int reply = JOptionPane - .showInternalConfirmDialog( - Desktop.desktop, - "The current VAMSAS session has unsaved data - do you want to save it ?", - "VAMSAS Session Shutdown", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - - if (reply == JOptionPane.YES_OPTION) + Cache.log.debug( + "Asking user if the vamsas session should be stored."); + int reply = JvOptionPane.showInternalConfirmDialog( + Desktop.desktop, + "The current VAMSAS session has unsaved data - do you want to save it ?", + "VAMSAS Session Shutdown", + JvOptionPane.YES_NO_OPTION, + JvOptionPane.QUESTION_MESSAGE); + + if (reply == JvOptionPane.YES_OPTION) { Cache.log.debug("Prompting for vamsas store filename."); Desktop.instance.vamsasSave_actionPerformed(null); Cache.log .debug("Finished attempt at storing document."); } - Cache.log - .debug("finished dealing with REQUESTTOCLOSE event."); + Cache.log.debug( + "finished dealing with REQUESTTOCLOSE event."); } else { - Cache.log - .debug("Ignoring store document request (promptUser==false)"); + Cache.log.debug( + "Ignoring store document request (promptUser==false)"); } } }); @@ -684,8 +715,14 @@ public class VamsasApplication implements SelectionSource { if (_backup_vobj2jv == null) { - throw new Error( - "IMPLEMENTATION ERROR: Cannot recover vamsas object mappings - no backup was made."); + if (inInitialUpdate) + { + // nothing to recover so just + return; + } + + throw new Error(MessageManager.getString( + "error.implementation_error_cannot_recover_vamsas_object_mappings")); } jv2vobj.clear(); Iterator el = _backup_jv2vobj.entrySet().iterator(); @@ -726,12 +763,13 @@ public class VamsasApplication implements SelectionSource { final IPickManager pm = vclient.getPickManager(); final StructureSelectionManager ssm = StructureSelectionManager - .getStructureSelectionManager(); - final SelectionSource me = this; + .getStructureSelectionManager(Desktop.instance); + final VamsasApplication me = this; pm.registerMessageHandler(new IMessageHandler() { String last = null; + @Override public void handleMessage(Message message) { if (vobj2jv == null) @@ -759,8 +797,8 @@ public class VamsasApplication implements SelectionSource // 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()); + ssm.mouseOverVamsasSequence((SequenceI) jvobj, + mm.getPosition(), me); } } if (message instanceof uk.ac.vamsas.client.picking.SelectionMessage) @@ -775,7 +813,7 @@ public class VamsasApplication implements SelectionSource { // TODO: rationalise : can only clear a selection over a // referred to object - ssm.sendSelection(null, null, me); + ssm.sendSelection(null, null, null, me); return; } Class type = null; @@ -786,7 +824,7 @@ public class VamsasApplication implements SelectionSource if (jvobjs[o] == null) { // can't cope with selections for unmapped objects - // continue; + continue; } if (type == null) { @@ -872,43 +910,29 @@ public class VamsasApplication implements SelectionSource { int[] prange = uk.ac.vamsas.objects.utils.Range .getBounds(sm.getRanges()); - boolean rangeset = false; - colsel = new ColumnSelection(); + 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; - if (!rangeset) + // 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()) { - if (jselection != null) - { - // set the bounds of the selected area using the first - // interval. - jselection.setStartRes(prange[p] - 1); - jselection.setEndRes(prange[p + 1] - 1); - rangeset = true; - } + jselection.setStartRes(prange[p + l] - 1); } - else + if (jselection.getEndRes() <= maxWidth && prange[p + + u] == (jselection.getEndRes() + 2)) { - // 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); - } + jselection.setEndRes(prange[p + u] - 1); } // mark all the columns in the range. for (int sr = prange[p], er = prange[p + 1], de = er @@ -923,7 +947,7 @@ public class VamsasApplication implements SelectionSource } if (send) { - ssm.sendSelection(jselection, colsel, me); + ssm.sendSelection(jselection, colsel, null, me); } // discard message. for (int c = 0; c < jvobjs.length; c++) @@ -942,10 +966,14 @@ public class VamsasApplication implements SelectionSource int i = -1; - public void mouseOver(SequenceI seq, int index) + @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); @@ -966,13 +994,15 @@ public class VamsasApplication implements SelectionSource selecter = new SelectionListener() { + @Override public void selection(SequenceGroup seqsel, - ColumnSelection colsel, SelectionSource source) + ColumnSelection colsel, HiddenColumns hidden, + SelectionSource source) { if (vobj2jv == null) { - Cache.log - .warn("Selection listener still active for dead session."); + Cache.log.warn( + "Selection listener still active for dead session."); // not in a session. return; } @@ -981,19 +1011,21 @@ public class VamsasApplication implements SelectionSource AlignmentI visal = null; if (source instanceof AlignViewport) { - visal = ((AlignViewport) source).getAlignment(); + visal = ((AlignmentViewport) source).getAlignment(); } SelectionMessage sm = null; if ((seqsel == null || seqsel.getSize() == 0) - && (colsel == null || colsel.getSelected() == null || colsel - .getSelected().size() == 0)) + && (colsel == null || colsel.getSelected() == null + || colsel.getSelected().size() == 0)) { if (source instanceof AlignViewport) { // the empty selection. - sm = new SelectionMessage("jalview", new String[] - { ((AlignViewport) source).getSequenceSetId() }, null, - true); + sm = new SelectionMessage("jalview", + new String[] + { ((AlignmentViewport) source) + .getSequenceSetId() }, + null, true); } else { @@ -1005,10 +1037,8 @@ public class VamsasApplication implements SelectionSource { String[] vobj = new String[seqsel.getSize()]; int o = 0; - Enumeration sels = seqsel.getSequences(null).elements(); - while (sels.hasMoreElements()) + for (SequenceI sel : seqsel.getSequences(null)) { - SequenceI sel = (SequenceI) sels.nextElement(); VorbaId v = (VorbaId) jv2vobj.get(sel); if (v != null) { @@ -1035,25 +1065,25 @@ public class VamsasApplication implements SelectionSource { // gather selected columns outwith the sequence positions // too - Enumeration cols = colsel.getSelected().elements(); - while (cols.hasMoreElements()) + for (Integer ival : colsel.getSelected()) { - int ival = ((Integer) cols.nextElement()).intValue(); Pos p = new Pos(); - p.setI(ival + 1); + p.setI(ival.intValue() + 1); range.addPos(p); } } else { - int[] intervals = colsel.getVisibleContigs(seqsel - .getStartRes(), seqsel.getEndRes() + 1); - for (int iv = 0; iv < intervals.length; iv += 2) + Iterator intervals = hidden + .getVisContigsIterator(seqsel.getStartRes(), + seqsel.getEndRes() + 1, false); + while (intervals.hasNext()) { + int[] region = intervals.next(); Seg s = new Seg(); - s.setStart(intervals[iv] + 1); // vamsas indices begin at - // 1, not zero. - s.setEnd(intervals[iv + 1] + 1); + s.setStart(region[0] + 1); // vamsas indices begin at 1, + // not zero. + s.setEnd(region[1] + 1); s.setInclusive(true); range.addSeg(s); }