+
+ /**
+ * Starts a thread that waits for the external viewer program process to
+ * finish, so that we can then close the associated resources. This avoids
+ * leaving orphaned viewer panels in Jalview if the user closes the external
+ * viewer.
+ *
+ * @param p
+ */
+ protected void startExternalViewerMonitor(Process p)
+ {
+ externalViewerMonitor = new Thread(new Runnable()
+ {
+
+ @Override
+ public void run()
+ {
+ try
+ {
+ p.waitFor();
+ JalviewStructureDisplayI display = getViewer();
+ if (display != null)
+ {
+ display.closeViewer(false);
+ }
+ } catch (InterruptedException e)
+ {
+ // exit thread if Chimera Viewer is closed in Jalview
+ }
+ }
+ });
+ externalViewerMonitor.start();
+ }
+
+ /**
+ * If supported by the external structure viewer, sends it commands to notify
+ * model or selection changes to the specified URL (where Jalview has started
+ * a listener)
+ *
+ * @param uri
+ */
+ protected void startListening(String uri)
+ {
+ List<StructureCommandI> commands = getCommandGenerator()
+ .startNotifications(uri);
+ if (commands != null)
+ {
+ executeCommands(commands, false, null);
+ }
+ }
+
+ /**
+ * If supported by the external structure viewer, sends it commands to stop
+ * notifying model or selection changes
+ */
+ protected void stopListening()
+ {
+ List<StructureCommandI> commands = getCommandGenerator()
+ .stopNotifications();
+ if (commands != null)
+ {
+ executeCommands(commands, false, null);
+ }
+ }
+
+ /**
+ * If supported by the structure viewer, queries it for all residue attributes
+ * with the given attribute name, and creates features on corresponding
+ * residues of the alignment. Returns the number of features added.
+ *
+ * @param attName
+ * @param alignmentPanel
+ * @return
+ */
+ public int copyStructureAttributesToFeatures(String attName,
+ AlignmentPanel alignmentPanel)
+ {
+ StructureCommandI cmd = getCommandGenerator()
+ .getResidueAttributes(attName);
+ if (cmd == null)
+ {
+ return 0;
+ }
+ List<String> residueAttributes = executeCommand(cmd, true);
+
+ int featuresAdded = createFeaturesForAttributes(attName,
+ residueAttributes);
+ if (featuresAdded > 0)
+ {
+ alignmentPanel.getFeatureRenderer().featuresAdded();
+ }
+ return featuresAdded;
+ }
+
+ /**
+ * Parses {@code residueAttributes} and creates sequence features on any
+ * mapped alignment residues. Returns the number of features created.
+ * <p>
+ * {@code residueAttributes} is the reply from the structure viewer to a
+ * command to list any residue attributes for the given attribute name. Syntax
+ * and parsing of this is viewer-specific.
+ *
+ * @param attName
+ * @param residueAttributes
+ * @return
+ */
+ protected int createFeaturesForAttributes(String attName,
+ List<String> residueAttributes)
+ {
+ return 0;
+ }