</tr>
<tr valign="top">
- <td><code>‑‑title <em>"string""</em></code></td>
+ <td><code>‑‑title <em>"string"</em></code></td>
<td>Specifies the title for the open alignment window as <em>string</em>.</td>
<td></td>
<td align="center">✓</td>
<tr valign="top">
<td><code>‑‑colour <em>name</em></code></td>
- <td>Applies the colour scheme <em>name</em> to the open alignment window. Valid values for <em>name</em> are:
+ <td>Applies the colour scheme <em>name</em> to the open alignment window. Valid values for <em>name</em> include:
<br/>
<code>clustal</code>,
<br/>
<code>t-coffee-scores</code>,
<br/>
<code>sequence-id</code>.
+ <br/>
+ <br/>
+ Names of user defined schemes will also work, and jalview colour scheme specifications like:
+ <br/>
+ <code>‑‑colour "D,E=red; K,R,H=0022FF; C,c=yellow"</code>
<td></td>
<td align="center">✓</td>
</tr>
import jalview.io.HtmlSvgOutput;
import jalview.io.IdentifyFile;
import jalview.io.NewickFile;
+import jalview.io.exceptions.ImageOutputException;
+import jalview.schemes.ColourSchemeI;
+import jalview.schemes.ColourSchemeProperty;
import jalview.structure.StructureImportSettings.TFType;
import jalview.structure.StructureSelectionManager;
import jalview.util.FileUtils;
theseArgsWereParsed &= processLinked(id);
processGroovyScript(id);
boolean processLinkedOkay = theseArgsWereParsed;
+
+ // wait around until alignFrame isn't busy
+ AlignFrame af=afMap.get(id);
+ while (af!=null && af.getViewport().isCalcInProgress())
+ {
+ try {
+ Thread.sleep(25);
+ } catch (Exception q) {};
+ }
+
theseArgsWereParsed &= processImages(id);
if (processLinkedOkay)
theseArgsWereParsed &= processOutput(id);
// close ap
if (avm.getBoolean(Arg.CLOSE))
{
- AlignFrame af = afMap.get(id);
+ af = afMap.get(id);
if (af != null)
{
af.closeMenuItem_actionPerformed(true);
Arg.COLOUR, sv, null, "DEFAULT_COLOUR_PROT", "");
if ("" != colour)
{
- af.changeColour_actionPerformed(colour);
+ ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
+ af.getViewport(), af.getViewport().getAlignment(), colour);
+
+ if (cs==null && !"None".equals(colour))
+ {
+ Console.warn("Couldn't parse '"+colour+"' as a colourscheme.");
+ } else {
+ af.changeColour(cs);
+ }
Jalview.testoutput(argParser, Arg.COLOUR, "zappo", colour);
}
Cache.setProperty("EXPORT_EMBBED_BIOJSON", "false");
Console.info("Writing " + file);
-
+ try {
switch (type)
{
break;
case "biojs":
+ Console.debug("Creating BioJS MSA Viwer HTML file: " + fileName);
try
{
BioJsHTMLOutput.refreshVersionInfo(
}
BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
bjs.exportHTML(fileName);
- Console.debug("Creating BioJS MSA Viwer HTML file: " + fileName);
break;
case "eps":
- af.createEPS(file, name);
Console.debug("Creating EPS file: " + fileName);
+ af.createEPS(file, name);
break;
case "imagemap":
- af.createImageMap(file, name);
Console.debug("Creating ImageMap file: " + fileName);
+ af.createImageMap(file, name);
break;
default:
+ "' not known. Ignoring");
break;
}
+ } catch (Exception ioex) {
+ Console.warn("Unexpected error during export",ioex);
+ }
}
}
return true;
ex.printStackTrace(System.err);
}
}
- // TODO - load PDB structure(s) to alignment JAL-629
- // (associate with identical sequence in alignment, or a specified
- // sequence)
+
if (groovyscript != null)
{
// Execute the groovy script after we've done all the rendering stuff
}
}
- /*
- * testoutput for string values
+ /******************************
+ *
+ * TEST OUTPUT METHODS
+ *
+ ******************************/
+ /**
+ * method for reporting string values parsed/processed during tests
+ *
*/
protected static void testoutput(ArgParser ap, Arg a, String s1,
String s2)
testoutput(true, a, s1, s2);
}
+ /**
+ * method for reporting string values parsed/processed during tests
+ */
+
protected static void testoutput(BootstrapArgs bsa, Arg a, String s1,
String s2)
{
testoutput(true, a, s1, s2);
}
+ /**
+ * report value set for string values parsed/processed during tests
+ */
private static void testoutput(boolean yes, Arg a, String s1, String s2)
{
if (yes && ((s1 == null && s2 == null)
"Specifies the title for the open alignment window as string.",
Opt.STRING, Opt.LINKED),
COLOUR(Type.OPENING, "color", // being a bit soft on the Americans!
- "Applies the colour scheme to the open alignment window. Valid values are:\n"
+ "Applies the colour scheme to the open alignment window. Valid values include:\n"
+ "clustal,\n" + "blosum62,\n" + "pc-identity,\n"
+ "zappo,\n" + "taylor,\n" + "gecos-flower,\n"
+ "gecos-blossom,\n" + "gecos-sunset,\n"
+ "turn-propensity,\n" + "buried-index,\n"
+ "nucleotide,\n" + "nucleotide-ambiguity,\n"
+ "purine-pyrimidine,\n" + "rna-helices,\n"
- + "t-coffee-scores,\n" + "sequence-id.",
+ + "t-coffee-scores,\n" + "sequence-id.\n"
+ +"\n"
+ + "Names of user defined colourschemes will also work,\n"
+ +"and jalview colourscheme specifications like\n"
+ +"--colour=\"D,E=red; K,R,H=0022FF; C,c=yellow\"",
Opt.STRING, Opt.LINKED, Opt.ALLOWALL),
FEATURES(Type.OPENING, "Add a feature file or URL to the open alignment.",
Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.ALLOWSUBSTITUTIONS),
protected static final String NEGATESTRING = "no";
- // the default linked id prefix used for no id (not even square braces)
+ /**
+ * the default linked id prefix used for no id (ie when not even square braces
+ * are provided)
+ */
protected static final String DEFAULTLINKEDIDPREFIX = "JALVIEW:";
- // the linkedId string used to match all linkedIds seen so far
+ /**
+ * the linkedId string used to match all linkedIds seen so far
+ */
protected static final String MATCHALLLINKEDIDS = "*";
- // the linkedId string used to match all of the last --open'ed linkedIds
+ /**
+ * the linkedId string used to match all of the last --open'ed linkedIds
+ */
protected static final String MATCHOPENEDLINKEDIDS = "open*";
- // the counter added to the default linked id prefix
+ /**
+ * the counter added to the default linked id prefix
+ */
private int defaultLinkedIdCounter = 0;
- // the substitution string used to use the defaultLinkedIdCounter
+ /**
+ * the substitution string used to use the defaultLinkedIdCounter
+ */
private static final String DEFAULTLINKEDIDCOUNTER = "{}";
- // the counter added to the default linked id prefix. NOW using
- // linkedIdAutoCounter
- // private int openLinkedIdCounter = 0;
-
- // the linked id prefix used for --open files. NOW the same as DEFAULT
+ /**
+ * the linked id prefix used for --open files. NOW the same as DEFAULT
+ */
protected static final String OPENLINKEDIDPREFIX = DEFAULTLINKEDIDPREFIX;
- // the counter used for {n} substitutions
+ /**
+ * the counter used for {n} substitutions
+ */
private int linkedIdAutoCounter = 0;
- // the linked id substitution string used to increment the idCounter (and use
- // the incremented value)
+ /**
+ * the linked id substitution string used to increment the idCounter (and use
+ * the incremented value)
+ */
private static final String INCREMENTLINKEDIDAUTOCOUNTER = "{++n}";
- // the linked id substitution string used to use the idCounter
+ /**
+ * the linked id substitution string used to use the idCounter
+ */
private static final String LINKEDIDAUTOCOUNTER = "{n}";
- // the linked id substitution string used to use the filename extension of
- // --append
- // or --open
+ /**
+ * the linked id substitution string used to use the filename extension of
+ * --append or --open
+ */
private static final String LINKEDIDEXTENSION = "{extension}";
- // the linked id substitution string used to use the base filename of --append
- // or --open
+ /**
+ * the linked id substitution string used to use the base filename of --append
+ */
+ /** or --open */
private static final String LINKEDIDBASENAME = "{basename}";
- // the linked id substitution string used to use the dir path of --append
- // or --open
+ /**
+ * the linked id substitution string used to use the dir path of --append or
+ * --open
+ */
private static final String LINKEDIDDIRNAME = "{dirname}";
- // the current argfile
+ /**
+ * the current argfile
+ */
private String argFile = null;
- // the linked id substitution string used to use the dir path of the latest
- // --argfile name
+ /**
+ * the linked id substitution string used to use the dir path of the latest
+ */
+ /** --argfile name */
private static final String ARGFILEBASENAME = "{argfilebasename}";
- // the linked id substitution string used to use the dir path of the latest
- // --argfile name
+ /**
+ * the linked id substitution string used to use the dir path of the latest
+ * --argfile name
+ */
private static final String ARGFILEDIRNAME = "{argfiledirname}";
- // flag to say whether {n} subtitutions in output filenames should be made.
- // Turn on and off with --substitutions and --nosubstitutions
- // Start with it on
+ /**
+ * flag to say whether {n} subtitutions in output filenames should be made.
+ * Turn on and off with --substitutions and --nosubstitutions Start with it on
+ */
private boolean substitutions = true;
- // flag to say whether the default linkedId is the current default linked id
- // or ALL linkedIds
+ /**
+ * flag to say whether the default linkedId is the current default linked id
+ *
+ * or ALL linkedIds
+ */
private boolean allLinkedIds = false;
- // flag to say whether the default linkedId is the current default linked id
- // or OPENED linkedIds
+ /**
+ * flag to say whether the default linkedId is the current default linked id
+ * or OPENED linkedIds
+ */
private boolean openedLinkedIds = false;
- // flag to say whether the structure arguments should be applied to all
- // structures with this linked id
+ /**
+ * flag to say whether the structure arguments should be applied to all
+ * structures with this linked id
+ */
private boolean allStructures = false;
protected static final Map<String, Arg> argMap;
FIRST, BEFORE, AFTER
}
- // get from following Arg of type a or subval of same name (lowercase)
+ /**
+ * get from following Arg of type a or subval of same name (lowercase)
+ */
public static String getValueFromSubValOrArg(ArgValuesMap avm,
ArgValue av, Arg a, SubVals sv)
{
return getFromSubValArgOrPref(avm, av, a, sv, null, null, null);
}
- // get from following Arg of type a or subval key or preference pref or
- // default def
+ /**
+ * get from following Arg of type a or subval key or preference pref or
+ * default def
+ */
public static String getFromSubValArgOrPref(ArgValuesMap avm, ArgValue av,
Arg a, SubVals sv, String key, String pref, String def)
{
def);
}
- // get from following(AFTER), first occurence of (FIRST) or previous (BEFORE)
- // Arg of type a or subval key or preference pref or default def
+ /**
+ * get from following(AFTER), first occurence of (FIRST) or previous (BEFORE)
+ * Arg of type a or subval key or preference pref or default def
+ */
public static String getFromSubValArgOrPref(ArgValuesMap avm, Arg a,
Position pos, ArgValue av, SubVals sv, String key, String pref,
String def)
// the following methods look for the "*" linkedId and add the argvalue to all
// linkedId ArgValues if it does.
- // This version inserts the subvals sv into all created values
+ /**
+ * This version inserts the subvals sv into all created values
+ */
private void addValue(String linkedId, Type type, ArgValues avs,
SubVals sv, String v, int argIndex, boolean doSubs)
{
doSubs);
}
- /*
+ /**
* The following operations look for the "*" and "open*" linkedIds and add the
- * argvalue to all appropriate linkedId ArgValues if it does.
- * If subvals are supplied, they are inserted into all new set values.
+ * argvalue to all appropriate linkedId ArgValues if it does. If subvals are
+ * supplied, they are inserted into all new set values.
*
- * @param op The ArgParser.Op operation
- * @param linkedId The String linkedId from the ArgValuesMap
- * @param type The Arg.Type to attach to this ArgValue
- * @param avs The ArgValues for this linkedId
- * @param sv Use these SubVals on the ArgValue
- * @param merge Merge the SubVals with any existing on the value. False will replace unless sv is null
- * @param v The value of the ArgValue (may contain subvals).
- * @param b The boolean value of the ArgValue.
- * @param argIndex The argIndex for the ArgValue.
- * @param doSubs Whether to perform substitutions on the subvals and value.
+ * @param op
+ * The ArgParser.Op operation
+ * @param linkedId
+ * The String linkedId from the ArgValuesMap
+ * @param type
+ * The Arg.Type to attach to this ArgValue
+ * @param avs
+ * The ArgValues for this linkedId
+ * @param sv
+ * Use these SubVals on the ArgValue
+ * @param merge
+ * Merge the SubVals with any existing on the value. False will
+ * replace unless sv is null
+ * @param v
+ * The value of the ArgValue (may contain subvals).
+ * @param b
+ * The boolean value of the ArgValue.
+ * @param argIndex
+ * The argIndex for the ArgValue.
+ * @param doSubs
+ * Whether to perform substitutions on the subvals and value.
*/
private void argValueOperation(Op op, String linkedId, Type type,
ArgValues avs, SubVals sv, boolean merge, String v, boolean b,
jalview.bin.Console.debug(Cache.getStackTraceString(e));
}
}
+
+ /**
+ * closes the current instance window, disposes and forgets about it.
+ */
+ public static void closeDesktop()
+ {
+ if (Desktop.instance != null) {
+ Desktop.instance.closeAll_actionPerformed(null);
+ Desktop.instance.setVisible(false);
+ Desktop.instance.dispose();
+ Desktop.instance = null;
+ }
+ }
}
messageId);
} catch (Exception e)
{
- System.out.println(String.format("Error creating %s file: %s", type,
- e.toString()));
+ jalview.bin.Console.error(String.format("Error creating %s file: %s", type,
+ e.toString()),e);
setStatus(MessageManager.formatMessage("info.error_creating_file",
type), messageId);
}
import jalview.datamodel.AlignmentExportData;
import jalview.gui.AlignmentPanel;
import jalview.gui.IProgressIndicator;
+import jalview.io.exceptions.ImageOutputException;
import jalview.util.MessageManager;
public abstract class HTMLOutput implements Runnable
return generatedFile;
}
- public void exportHTML(String outputFile)
+ public void exportHTML(String outputFile) throws ImageOutputException
{
exportHTML(outputFile, null);
}
- public void exportHTML(String outputFile, String renderer)
+ public void exportHTML(String outputFile, String renderer) throws ImageOutputException
{
setProgressMessage(MessageManager.formatMessage(
"status.exporting_alignment_as_x_file", getDescription()));
}
// used to pass an option such as render to run
- public abstract void run(String string);
+ public abstract void run(String string) throws ImageOutputException;
}
\ No newline at end of file
--- /dev/null
+package jalview.io.exceptions;
+
+/**
+ * wrapper for passing error messages and exceptions back to UI when image io goes wrong
+ * @author jprocter
+ *
+ */
+public class ImageOutputException extends Exception
+{
+
+ public ImageOutputException()
+ {
+ }
+
+ public ImageOutputException(String message)
+ {
+ super(message);
+ }
+
+ public ImageOutputException(Throwable cause)
+ {
+ super(cause);
+ }
+
+ public ImageOutputException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ public ImageOutputException(String message, Throwable cause,
+ boolean enableSuppression, boolean writableStackTrace)
+ {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+
+}
@Override
public boolean isWorking()
{
+ boolean working=false;
synchronized (inProgress)
{
// System.err.println("isWorking "+hashCode());
- return inProgress.size() > 0;
+ working |= inProgress.size() > 0;
}
+ synchronized (updating)
+ {
+ for (List<AlignCalcWorkerI> workers : updating.values())
+ {
+ working |= workers.size() > 0;
+ }
+ }
+ return working;
}
@Override
@AfterMethod(alwaysRun = true)
public void tearDown()
{
- if (Desktop.instance != null)
- Desktop.instance.closeAll_actionPerformed(null);
+ Desktop.closeDesktop();
+ }
+
+ public static void callJalviewMain(String[] args) {
+ if (Jalview.getInstance()!=null) {
+ Jalview.getInstance().doMain(args);
+ } else {
+ Jalview.main(args);
+ }
}
/* --setprops is currently disabled so this test won't work
int numFrames, String[] sequences)
{
String[] args = (cmdLine + " --gui").split("\\s+");
- Jalview.main(args);
+ callJalviewMain(args);
Commands cmds = Jalview.getInstance().getCommands();
Assert.assertNotNull(cmds);
Assert.assertEquals(cmds.commandArgsProvided(), cmdArgs,
{
cleanupFiles(filenames);
String[] args = (cmdLine + " --gui").split("\\s+");
- Jalview.main(args);
+ callJalviewMain(args);
Commands cmds = Jalview.getInstance().getCommands();
Assert.assertNotNull(cmds);
File lastFile = null;
{
cleanupFiles(filenames);
String[] args = (cmdLine + " --gui").split("\\s+");
- Jalview.main(args);
+ callJalviewMain(args);
Commands cmds = Jalview.getInstance().getCommands();
Assert.assertNotNull(cmds);
File lastFile = null;
String[] nonfilenames)
{
String[] args = (cmdLine + " --gui").split("\\s+");
- Jalview.main(args);
+ callJalviewMain(args);
Commands cmds = Jalview.getInstance().getCommands();
Assert.assertNotNull(cmds);
for (String filename : filenames)
@AfterMethod(alwaysRun = true)
public void tearDown()
{
- if (Desktop.instance != null)
- Desktop.instance.closeAll_actionPerformed(null);
+ Desktop.closeDesktop();
}
@Test(
{
String[] args = cmdLine.split("\\s+");
- Jalview.main(args);
+ CommandsTest.callJalviewMain(args);
try
{
// sleep for slow build server to open annotations and viewer windows