+ JalviewApp app = new JalviewApp()
+ {
+
+ // TODO BH 2019
+ //
+ // These are methods that are in JalviewLite that various classes call
+ // but are not in JalviewLiteJsApi. Or, even if they are, other classes
+ // call
+ // them to JalviewLite directly. Some may not be necessary, but they have
+ // to
+ // be at least mentioned here, or the classes calling them should
+ // reference
+ // JalviewLite itself.
+
+ private boolean alignPDBStructures; // From JalviewLite; not implemented
+
+ private Hashtable<String, Hashtable<String, String[]>> jsmessages;
+
+ private Hashtable<String, int[]> jshashes;
+
+ @Override
+ public String getParameter(String name)
+ {
+ return aparser.getAppletValue(name, null);
+ }
+
+ @Override
+ public boolean getDefaultParameter(String name, boolean def)
+ {
+ String stn;
+ return ((stn = getParameter(name)) == null ? def
+ : "true".equalsIgnoreCase(stn));
+ }
+
+ /**
+ * Get the applet-like document base even though this is an application.
+ */
+ @Override
+ public URL getDocumentBase()
+ {
+ return Platform.getDocumentBase();
+ }
+
+ /**
+ * Get the applet-like code base even though this is an application.
+ */
+ @Override
+ public URL getCodeBase()
+ {
+ return Platform.getCodeBase();
+ }
+
+ @Override
+ public AlignViewportI getViewport()
+ {
+ return af.getViewport();
+ }
+
+ /**
+ * features
+ *
+ */
+ @Override
+ public boolean parseFeaturesFile(String filename,
+ DataSourceType protocol)
+ {
+ return af.parseFeaturesFile(filename, protocol);
+ }
+
+ /**
+ * scorefile
+ *
+ */
+ @Override
+ public boolean loadScoreFile(String sScoreFile) throws IOException
+ {
+ af.loadJalviewDataFile(sScoreFile, null, null, null);
+ return true;
+ }
+
+ /**
+ * annotations, jpredfile, jnetfile
+ *
+ */
+ @Override
+ public void updateForAnnotations()
+ {
+ af.updateForAnnotations();
+ }
+
+ @Override
+ public void loadTree(NewickFile fin, String treeFile)
+ throws IOException
+ {
+ // n/a -- already done by standard Jalview command line processing
+ }
+
+ @Override
+ public void setAlignPdbStructures(boolean defaultParameter)
+ {
+ alignPDBStructures = true;
+ }
+
+ @Override
+ public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
+ String[] chains, DataSourceType protocol)
+ {
+ StructureViewer.launchStructureViewer(af.alignPanel, pdb, seqs);
+ }
+
+ @Override
+ public void setFeatureGroupState(String[] groups, boolean state)
+ {
+ af.setFeatureGroupState(groups, state);
+ }
+
+ @Override
+ public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
+ String[][] chains, String[] protocols)
+ {
+ System.err.println(
+ "Jalview applet interface alignedStructureView not implemented");
+ }
+
+ @Override
+ public void newFeatureSettings()
+ {
+ System.err.println(
+ "Jalview applet interface newFeatureSettings not implemented");
+ }
+
+ private Vector<Runnable> jsExecQueue;
+
+ @Override
+ public Vector<Runnable> getJsExecQueue(JSFunctionExec exec)
+ {
+ jsFunctionExec = exec;
+ return (jsExecQueue == null ? (jsExecQueue = new Vector<>())
+ : jsExecQueue);
+ }
+
+ @Override
+ public AppletContext getAppletContext()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isJsfallbackEnabled()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public JSObject getJSObject()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public StructureSelectionManagerProvider getStructureSelectionManagerProvider()
+ {
+ // TODO Q: what exactly is this? BH
+ return null;
+ }
+
+ @Override
+ public void updateColoursFromMouseOver(Object source,
+ MouseOverStructureListener mouseOverStructureListener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Object[] getSelectionForListener(SequenceGroup seqsel,
+ ColumnSelection colsel, HiddenColumns hidden,
+ SelectionSource source, Object alignFrame)
+ {
+ return appLoader.getSelectionForListener(getCurrentAlignFrame(),
+ seqsel, colsel, hidden, source, alignFrame);
+ }
+
+ @Override
+ public String arrayToSeparatorList(String[] array)
+ {
+ return appLoader.arrayToSeparatorList(array);
+ }
+
+ @Override
+ public Hashtable<String, int[]> getJSHashes()
+ {
+ return (jshashes == null ? (jshashes = new Hashtable<>())
+ : jshashes);
+ }
+
+ @Override
+ public Hashtable<String, Hashtable<String, String[]>> getJSMessages()
+ {
+ return (jsmessages == null ? (jsmessages = new Hashtable<>())
+ : jsmessages);
+ }
+
+ @Override
+ public Object getFrameForSource(VamsasSource source)
+ {
+ if (source != null)
+ {
+ AlignFrame af;
+ if (source instanceof jalview.gui.AlignViewport
+ && source == (af = getCurrentAlignFrame()).getViewport())
+ {
+ // should be valid if it just generated an event!
+ return af;
+ }
+ // TODO: ensure that if '_af' is specified along with a handler
+ // function, then only events from that alignFrame are sent to that
+ // function
+ }
+ return null;
+ }
+
+ @Override
+ public FeatureRenderer getNewFeatureRenderer(AlignViewportI vp)
+ {
+ return new jalview.gui.FeatureRenderer((AlignmentPanel) vp);
+ }
+
+ };
+
+ appLoader = new JalviewAppLoader(true);
+ appLoader.load(app);
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences()
+ */
+ @Override
+ public String getSelectedSequences()
+ {
+ return getSelectedSequencesFrom(getCurrentAlignFrame());
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String)
+ */
+ @Override
+ public String getSelectedSequences(String sep)
+ {
+ return getSelectedSequencesFrom(getCurrentAlignFrame(), sep);
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+ * .AlignFrame)
+ */
+ @Override
+ public String getSelectedSequencesFrom(AlignFrameI alf)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return getSelectedSequencesFrom(alf, null);
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+ * .AlignFrame, java.lang.String)
+ */
+ @Override
+ public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.getSelectedSequencesFrom(alf, sep);
+ }
+
+ /**
+ *
+ * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
+ * .AlignFrame, java.lang.String)
+ */
+ @Override
+ public void highlight(String sequenceId, String position,
+ String alignedPosition)
+ {
+ highlightIn(null, sequenceId, position,
+ alignedPosition);
+ }
+
+ @Override
+ public void highlightIn(AlignFrameI alf, String sequenceId,
+ String position, String alignedPosition)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ appLoader.highlightIn(alf, sequenceId, position, alignedPosition);
+ }
+
+ @Override
+ public void select(String sequenceIds, String columns)
+ {
+ selectIn(getCurrentAlignFrame(), sequenceIds, columns, null);
+ }
+
+ @Override
+ public void select(String sequenceIds, String columns, String sep)
+ {
+ selectIn(null, sequenceIds, columns, sep);
+ }
+
+ @Override
+ public void selectIn(AlignFrameI alf, String sequenceIds, String columns)
+ {
+ selectIn(alf, sequenceIds, columns, null);
+ }
+
+ @Override
+ public void selectIn(AlignFrameI alf, String sequenceIds, String columns,
+ String sep)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ appLoader.selectIn(alf, sequenceIds, columns, sep);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignment(String format,
+ String suffix)
+ {
+ return getSelectedSequencesAsAlignmentFrom(null,
+ format, suffix);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+ String format, String sep)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format, sep);
+ }
+
+ @Override
+ public String getAlignmentOrder()
+ {
+ return getAlignmentFrom(getCurrentAlignFrame(), null);
+ }
+
+ @Override
+ public String getAlignmentOrderFrom(AlignFrameI alf)
+ {
+ return getAlignmentFrom(alf, null);
+ }
+
+ @Override
+ public String getAlignmentOrderFrom(AlignFrameI alf, String sep)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.getAlignmentOrderFrom(alf, sep);
+ }
+
+ @Override
+ public String orderBy(String order, String undoName)
+ {
+ return orderBy(order, undoName, null);
+ }
+
+ @Override
+ public String orderBy(String order, String undoName, String sep)
+ {
+ return orderAlignmentBy(getCurrentAlignFrame(), order, undoName, sep);
+ }
+
+ @Override
+ public String orderAlignmentBy(AlignFrameI alf, String order,
+ String undoName, String sep)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.orderAlignmentBy(alf, order, undoName, sep);
+ }
+
+ @Override
+ public String getAlignment(String format)
+ {
+ return getAlignmentFrom(null, format, null);
+ }
+
+ @Override
+ public String getAlignmentFrom(AlignFrameI alf, String format)
+ {
+ return getAlignmentFrom(alf, format, null);
+ }
+
+ @Override
+ public String getAlignment(String format, String suffix)
+ {
+ return getAlignmentFrom(getCurrentAlignFrame(), format, suffix);
+ }
+
+ @Override
+ public String getAlignmentFrom(AlignFrameI alf, String format,
+ String suffix)
+ {
+ return appLoader.getAlignmentFrom(alf, format, suffix);
+ }
+
+ @Override
+ public void loadAnnotation(String annotation)
+ {
+ loadAnnotationFrom(getCurrentAlignFrame(), annotation);
+ }
+
+ @Override
+ public void loadAnnotationFrom(AlignFrameI alf, String annotation)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ appLoader.loadAnnotationFrom(alf, annotation);
+ }
+
+ @Override
+ public void loadFeatures(String features, boolean autoenabledisplay)
+ {
+ loadFeaturesFrom(currentAlignFrame, features, autoenabledisplay);
+ }
+
+ @Override
+ public boolean loadFeaturesFrom(AlignFrameI alf, String features,
+ boolean autoenabledisplay)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.loadFeaturesFrom(alf, features, autoenabledisplay);
+ }
+
+ @Override
+ public String getFeatures(String format)
+ {
+ return getFeaturesFrom(null, format);
+ }
+
+ @Override
+ public String getFeaturesFrom(AlignFrameI alf, String format)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.getFeaturesFrom(alf, format);
+ }
+
+ @Override
+ public String getAnnotation()
+ {
+ return getAnnotationFrom(null);
+ }
+
+ @Override
+ public String getAnnotationFrom(AlignFrameI alf)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.getAnnotationFrom(alf);
+ }
+
+ @Override
+ public AlignFrameI newView()
+ {
+ return newViewFrom(null, null);
+ }
+
+ @Override
+ public AlignFrameI newView(String name)
+ {
+ return newViewFrom(null, name);
+ }
+
+ @Override
+ public AlignFrameI newViewFrom(AlignFrameI alf)
+ {
+ return newViewFrom(alf, null);
+ }
+
+ @Override
+ public AlignFrameI newViewFrom(AlignFrameI alf, String name)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.newViewFrom(alf, name);
+ }
+
+ @Override
+ public AlignFrameI loadAlignment(String text, String title)
+ {
+ return appLoader.loadAlignment(text, AlignFrame.DEFAULT_WIDTH,
+ AlignFrame.DEFAULT_HEIGHT, title);
+ }
+
+ @Override
+ public boolean addPdbFile(AlignFrameI alFrame, String sequenceId,
+ String pdbEntryString, String pdbFile)
+ {
+ if (alFrame == null)
+ {
+ alFrame = getCurrentAlignFrame();
+ }
+ return appLoader.addPdbFile(alFrame, sequenceId, pdbEntryString,
+ pdbFile);
+ }
+
+ @Override
+ public void scrollViewToIn(AlignFrameI alf, String topRow,
+ String leftHandColumn)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ appLoader.scrollViewToIn(alf, topRow, leftHandColumn);
+ }
+
+ @Override
+ public void scrollViewToRowIn(AlignFrameI alf, String topRow)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ appLoader.scrollViewToRowIn(alf, topRow);
+ }
+
+ @Override
+ public void scrollViewToColumnIn(AlignFrameI alf, String leftHandColumn)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ appLoader.scrollViewToColumnIn(alf, leftHandColumn);
+ }
+
+ @Override
+ public String getFeatureGroups()
+ {
+ return getFeatureGroupsOn(null);
+ }
+
+ @Override
+ public String getFeatureGroupsOn(AlignFrameI alf)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.getFeatureGroupsOn(alf);
+ }
+
+ @Override
+ public String getFeatureGroupsOfState(boolean visible)
+ {
+ return getFeatureGroupsOfStateOn(null, visible);
+ }
+
+ @Override
+ public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.getFeatureGroupsOfStateOn(alf, visible);
+ }
+
+ @Override
+ public void setFeatureGroupState(String groups, boolean state)
+ { // JalviewLite API
+ setFeatureGroupStateOn(null, groups, state);
+ }
+
+ @Override
+ public void setFeatureGroupStateOn(AlignFrameI alf, String groups,
+ boolean state)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ appLoader.setFeatureGroupStateOn(alf, groups, state);
+ }
+
+ @Override
+ public String getSeparator()
+ {
+ return appLoader.getSeparator();
+ }
+
+ @Override
+ public void setSeparator(String separator)
+ {
+ appLoader.setSeparator(separator);
+ }
+
+ @Override
+ public String getJsMessage(String messageclass, String viewId)
+ {
+ // see http://www.jalview.org/examples/jalviewLiteJs.html
+ return null;
+ }
+
+ /**
+ * Open a new Tree panel on the desktop statically. Params are standard (not
+ * set by Groovy). No dialog is opened.
+ *
+ * @param af
+ * @param treeType
+ * @param modelName
+ * @return null, or the string "label.you_need_at_least_n_sequences" if number
+ * of sequences selected is inappropriate
+ */
+ @Override
+ public Object openTreePanel(AlignFrame af, String treeType,
+ String modelName)
+ { // JalviewJS api
+ if (af == null)
+ {
+ af = getCurrentAlignFrame();
+ }
+ return CalculationChooser.openTreePanel(af, treeType, modelName, null);
+ }
+
+ /**
+ * public static method for JalviewJS API to open a PCAPanel without
+ * necessarily using a dialog.
+ *
+ * @param af
+ * @param modelName
+ * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
+ * if number of sequences selected is inappropriate
+ */
+ @Override
+ public Object openPcaPanel(AlignFrame af, String modelName)
+ {
+ if (af == null)
+ {
+ af = getCurrentAlignFrame();
+ }
+ return CalculationChooser.openPcaPanel(af, modelName, null);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignment(String format,
+ boolean suffix)
+ {
+ return getSelectedSequencesAsAlignmentFrom(null,
+ format, suffix);
+ }
+
+ @Override
+ public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
+ String format, boolean suffix)
+ {
+ if (alf == null)
+ {
+ alf = getCurrentAlignFrame();
+ }
+ return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format,
+ "" + suffix);
+ }
+
+ @Override
+ public String arrayToSeparatorList(String[] array)
+ {
+ return appLoader.arrayToSeparatorList(array);
+ }
+
+ @Override
+ public String[] separatorListToArray(String list)
+ {
+ return appLoader.separatorListToArray(list);
+ }
+
+ //// probably not needed in JalviewJS -- From when Jmol and Jalview did not
+ //// have a direct connection?
+
+ @Override
+ public void setMouseoverListener(String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setMouseoverListener(AlignFrameI af, String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setSelectionListener(String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setSelectionListener(AlignFrameI af, String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setStructureListener(String listener, String modelSet)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void removeJavascriptListener(AlignFrameI af, String listener)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void mouseOverStructure(String pdbResNum, String chain,
+ String pdbfile)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void showOverview()
+ {
+ currentAlignFrame.overviewMenuItem_actionPerformed(null);
+ }
+
+ public void notifyWorker(AlignCalcWorkerI worker, String status)
+ {
+ // System.out.println("Jalview worker " + worker.getClass().getSimpleName()
+ // + " " + status);
+ }
+
+ /**
+ * flag to allow selected Runnable and Thread processes to run synchronously
+ *
+ * JAL-3563
+ *
+ */
+ private static boolean isSynchronous = false;
+
+ /**
+ * Set Jalview to run selected processes synchronously in test and headless
+ * environments.
+ *
+ * JAL-3563
+ *
+ * @param b
+ * @author Bob Hanson
+ */
+ public static void setSynchronous(boolean b)
+ {
+ isSynchronous = b;
+ }
+
+ /**
+ * Allows optional synchronous running of a Runnable that would otherwise use
+ * SwingUtilities.invokeLater.
+ *
+ * JAL-3563
+ *
+ * @param t
+ * @author Bob Hanson
+ */
+ public static boolean isSynchronous()
+ {
+ return isSynchronous;
+ }
+
+ /**
+ * Allows optional synchronous running of a Runnable that would otherwise use
+ * SwingUtilities.invokeLater.
+ *
+ * JAL-3563
+ *
+ * @param t
+ * @author Bob Hanson
+ */
+ public static void execRunnable(Runnable r)
+ {
+ if (isSynchronous())
+ {
+ r.run();
+ }
+ else
+ {
+ SwingUtilities.invokeLater(r);
+ }
+ }
+
+ /**
+ * Allows optional synchronous running of a thread that would otherwise be run
+ * using start().
+ *
+ * JAL-3563
+ *
+ * @param t
+ * @author Bob Hanson
+ */
+ public static void execThread(Thread t)
+ {
+ if (isSynchronous())
+ {
+ t.run();
+ }
+ else
+ {
+ t.start();
+ }
+ }
+
+}
\ No newline at end of file