Merge branch 'patch/JAL-4298_synchronize_consoledoc' into bug/JAL-4298_java_console_c...
authorBen Soares <b.soares@dundee.ac.uk>
Thu, 19 Oct 2023 20:06:00 +0000 (21:06 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Thu, 19 Oct 2023 20:06:00 +0000 (21:06 +0100)
119 files changed:
build.gradle
examples/groovy/ComputePeptideVariants.groovy
examples/groovy/JvLoadTester.groovy
examples/groovy/PIDmatrix.groovy
examples/groovy/alignLoadedFile.groovy
examples/groovy/annotationForSelectedSequence.groovy
examples/groovy/parseproperties.groovy
examples/groovy/printtitle.groovy
examples/groovy/removeFeaturesByGroup.groovy
examples/groovy/selectColumnsByFeatureAndGroup.groovy
examples/groovy/sitesForSelectedColumns.groovy
examples/groovy/stripUniprotPrefixes.groovy
examples/groovy/visibleFeaturesCounter.groovy
getdown/lib/FJVL_VERSION
getdown/lib/JVL_VERSION
getdown/lib/getdown-core.jar
getdown/lib/getdown-launcher-local.jar
getdown/lib/getdown-launcher.jar
getdown/src/getdown/ant/pom.xml
getdown/src/getdown/core/pom.xml
getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Application.java
getdown/src/getdown/launcher/pom.xml
getdown/src/getdown/mvn_cmd
getdown/src/getdown/pom.xml
help/help/html/features/clarguments-reference.html
j11lib/getdown-core.jar
j11lib/groovy-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-all-2.4.21-indy.jar [deleted file]
j11lib/groovy-ant-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-astbuilder-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-cli-commons-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-cli-picocli-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-console-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-contracts-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-datetime-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-dateutil-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-docgenerator-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-ginq-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-groovydoc-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-groovysh-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-jmx-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-json-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-jsr223-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-macro-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-macro-library-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-nio-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-servlet-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-sql-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-swing-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-templates-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-test-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-test-junit5-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-testng-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-toml-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-typecheckers-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-xml-4.0.15.jar [new file with mode: 0644]
j11lib/groovy-yaml-4.0.15.jar [new file with mode: 0644]
j11lib/javaparser-core-3.25.5.jar [new file with mode: 0644]
j8lib/getdown-core.jar
j8lib/groovy-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-all-2.4.21-indy.jar [deleted file]
j8lib/groovy-ant-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-astbuilder-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-cli-commons-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-cli-picocli-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-console-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-contracts-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-datetime-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-dateutil-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-docgenerator-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-ginq-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-groovydoc-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-groovysh-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-jmx-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-json-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-jsr223-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-macro-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-macro-library-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-nio-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-servlet-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-sql-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-swing-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-templates-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-test-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-test-junit5-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-testng-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-toml-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-typecheckers-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-xml-4.0.15.jar [new file with mode: 0644]
j8lib/groovy-yaml-4.0.15.jar [new file with mode: 0644]
j8lib/javaparser-core-3.25.5.jar [new file with mode: 0644]
src/jalview/bin/Cache.java
src/jalview/bin/Commands.java
src/jalview/bin/Console.java
src/jalview/bin/Jalview.java
src/jalview/bin/argparser/Arg.java
src/jalview/bin/argparser/ArgParser.java
src/jalview/bin/argparser/BootstrapArgs.java
src/jalview/bin/groovy/JalviewObject.java [new file with mode: 0644]
src/jalview/bin/groovy/JalviewObjectI.java [new file with mode: 0644]
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/Console.java
src/jalview/gui/Desktop.java
src/jalview/gui/JvOptionPane.java
src/jalview/gui/QuitHandler.java
src/jalview/gui/SplashScreen.java
src/jalview/gui/WsJobParameters.java
src/jalview/io/DataSourceType.java
src/jalview/io/FileLoader.java
src/jalview/io/VamsasAppDatastore.java
src/jalview/project/Jalview2XML.java
src/jalview/workers/AlignmentAnnotationFactory.java
test/jalview/bin/CommandsTest.java
test/jalview/bin/CommandsTest2.java
test/jalview/gui/DesktopTests.java
test/jalview/io/CrossRef2xmlTests.java
test/jalview/project/Jalview2xmlTests.java
test/jalview/renderer/seqfeatures/FeatureRendererTest.java

index 8ac2757..0a7fe70 100644 (file)
@@ -52,7 +52,7 @@ plugins {
   id 'application'
   id 'eclipse'
   id "com.diffplug.gradle.spotless" version "3.28.0"
-  id 'com.github.johnrengelman.shadow' version '4.0.3'
+  id 'com.github.johnrengelman.shadow' version '7.1.2'
   id 'com.install4j.gradle' version '10.0.3'
   id 'com.dorongold.task-tree' version '2.1.1' // only needed to display task dependency tree with  gradle task1 [task2 ...] taskTree
   id 'com.palantir.git-version' version '0.13.0' apply false
@@ -2154,12 +2154,33 @@ shadowJar {
   if (buildDist) {
     dependsOn makeDist
   }
-  from ("${jalviewDir}/${libDistDir}") {
-    include("*.jar")
-  }
-  manifest {
-    attributes "Implementation-Version": JALVIEW_VERSION,
-    "Application-Name": applicationName
+
+  def jarFiles = fileTree(dir: "${jalviewDir}/${libDistDir}", include: "*.jar", exclude: "regex.jar").getFiles()
+  def groovyJars = jarFiles.findAll {it1 -> file(it1).getName().startsWith("groovy-swing")}
+  def otherJars = jarFiles.findAll {it2 -> !file(it2).getName().startsWith("groovy-swing")}
+  from groovyJars
+  from otherJars
+
+  // we need to include the groovy-swing Include-Package for it to run in the shadowJar
+  doFirst {
+    def jarFileManifests = []
+    groovyJars.each { jarFile ->
+      def mf = zipTree(jarFile).getFiles().find { it.getName().equals("MANIFEST.MF") }
+      if (mf != null) {
+        jarFileManifests += mf
+      }
+    }
+
+    manifest {
+      attributes "Implementation-Version": JALVIEW_VERSION, "Application-Name": applicationName
+      from (jarFileManifests) {
+        eachEntry { details ->
+          if (!details.key.equals("Import-Package")) {
+            details.exclude()
+          }
+        }
+      }
+    }
   }
 
   duplicatesStrategy "INCLUDE"
index 6caa69c..e5ece51 100644 (file)
@@ -1,6 +1,6 @@
 import jalview.datamodel.SequenceFeature
 import jalview.gui.Desktop
-def af = jalview.bin.Jalview.currentAlignFrame
+def af = Jalview.getCurrentAlignFrame()
 def av = af.viewport
 def fr = Desktop.getAlignFrameFor(av.codingComplement).getFeatureRenderer()
 def counts = 0
@@ -29,4 +29,4 @@ for (seq in av.alignment.sequences)
 }
 af.getFeatureRenderer().featuresAdded()
 af.alignPanel.paintAlignment(true, true)
-println "Added " + countm + " missense and " + counts + " synonymous variants"
\ No newline at end of file
+println "Added " + countm + " missense and " + counts + " synonymous variants"
index d844d62..cc92e40 100644 (file)
@@ -21,7 +21,7 @@
 import jalview.gui.*;
 import jalview.io.*;
 
-def class JvLoadTest {
+class JvLoadTest {
     FileLoader fl = null;
     def String safename = null;
     JvLoadTest(String sname) { 
@@ -155,4 +155,4 @@ def JvLoadTest newJvLoadTest(String tempFile) {
        System.gc();
        jalview.gui.Desktop.instance.desktop.showMemoryUsage(true);
        return new JvLoadTest(tempFile)
-}
\ No newline at end of file
+}
index b97abcc..76b9de7 100644 (file)
@@ -56,7 +56,7 @@ printSimilarityMatrix(true,true,SimilarityParams.Jalview)
 
 void printSimilarityMatrix(boolean selview=false, boolean includeids=true, SimilarityParams pidMethod) {
 
-  def currentAlignFrame = jalview.bin.Jalview.getCurrentAlignFrame()
+  def currentAlignFrame = Jalview.getCurrentAlignFrame()
 
   jalview.gui.AlignViewport av = currentAlignFrame.getCurrentView()
 
@@ -96,4 +96,4 @@ void printSimilarityMatrix(boolean selview=false, boolean includeids=true, Simil
 
     print "\n"
   }
-}
\ No newline at end of file
+}
index 764fdae..df68e2b 100644 (file)
@@ -20,6 +20,7 @@
  */
 // run an alignment on the current alignFrame
 import jalview.ws.jws2.*;
+import jalview.ws.jws2.jabaws2.Jws2Instance;
 import jalview.datamodel.*;
 
 // First get the JABA service discoverer and see if there are any services.
@@ -33,7 +34,7 @@ if (!disc.isRunning() && !disc.hasServices())
   disc.run();
 }
 
-for (jalview.ws.jws2.Jws2Discoverer.Jws2Instance service: disc.getServices()) {
+for (jalview.ws.jws2.jabaws2.Jws2Instance service: disc.getServices()) {
 
 if (service.serviceType.indexOf("uscle")>-1) {
   // now - go through the services if any, and find a Muscle service
index abfad35..7cb3082 100644 (file)
@@ -31,7 +31,7 @@ import java.awt.datatransfer.StringSelection
 import static java.awt.Toolkit.*
 
 
-def curviewport = Jalview.getAlignFrames()[Jalview.getAlignFrames().length-1].getViewport();
+def curviewport = Jalview.getCurrentAlignFrame().getViewport();
 
 // TSV output by default.
 // change "\t" to "," to output CSV file
index 879bd49..322d5e2 100644 (file)
@@ -1,19 +1,19 @@
 /*
  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
  * Copyright (C) $$Year-Rel$$ The Jalview Authors
- * 
+ *
  * This file is part of Jalview.
- * 
+ *
  * Jalview is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License 
+ * 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 
+ *
+ * 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 Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
@@ -26,7 +26,7 @@ import jalview.gui.AlignViewport;
 def af = Jalview.getAlignFrames();
 def al = af[0].viewport.alignment;
 ParseProperties pp = new ParseProperties(al);
-pp.getScoresFromDescription("Score", "ScanPS Raw Score", "([-0-9.+]+)");
+pp.getScoresFromDescription("Score", "ScanPS Raw Score", "([-0-9.+]+)", true);
 def sqs = al.getSequenceAt(0);
 def annots = sqs.getAnnotation();
 
index b3387ea..a048d65 100644 (file)
@@ -1,35 +1,35 @@
 /*
  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
  * Copyright (C) $$Year-Rel$$ The Jalview Authors
- * 
+ *
  * This file is part of Jalview.
- * 
+ *
  * Jalview is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License 
+ * 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 
+ *
+ * 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 Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 // do something groovy in jalview
 println "Hello World.\n"
-println "First sequence is " + currentAlFrame.viewport.alignment.getSequenceAt(0).getDisplayId(true)
+println "First sequence is " + Jalview.getCurrentAlignFrame().viewport.alignment.getSequenceAt(0).getDisplayId(true)
 
 def alf = Jalview.getAlignFrames()
 for (ala in alf)
 {
-       // ala is an jalview.gui.AlignFrame object 
+       // ala is an jalview.gui.AlignFrame object
        println ala.getTitle()
        // get the parent jalview.datamodel.Alignment from the alignment viewport
        def alignment = ala.viewport.alignment
        // get the first sequence from the jalview.datamodel.Alignment object
-       def seq = alignment.getSequenceAt(0) 
+       def seq = alignment.getSequenceAt(0)
 }
 Jalview.quit()
index 341e06f..c947a5b 100644 (file)
@@ -46,6 +46,7 @@ for (ala in af)
                        }
                }
        }
+       ala.repaint();
 }
        
 
index b8edaa7..aaa3405 100644 (file)
@@ -23,7 +23,7 @@ import jalview.datamodel.*;
 import jalview.gui.AlignFrame;
 import jalview.gui.AlignViewport;
 import java.util.BitSet;
-import javax.swing.JOptionPane;
+import jalview.gui.JvOptionPane;
 import groovy.swing.SwingBuilder;
 def toselect = getFeatureInput(); // change this to select the desired feature type
 
@@ -81,7 +81,7 @@ for (ala in Jalview.getAlignFrames()) {
         cs.addElement(i);
         }
       ala.viewport.setColumnSelection(cs);
-      ala.alignPanel.paintAlignment(true);
+      ala.alignPanel.paintAlignment(true, true);
       ala.statusBar.setText("Marked "+bs.cardinality()+" columns containing features of type "+toselect)
       } else {
         ala.statusBar.setText("No features of type "+toselect+" found.");
@@ -96,4 +96,4 @@ String getFeatureInput(){
                    null, 'Select columns by feature by type','Enter type of feature', JvOptionPane.OK_OPTION)
 
         return response
-    }
\ No newline at end of file
+    }
index 8165373..f775f18 100644 (file)
@@ -29,7 +29,7 @@
 import java.awt.datatransfer.StringSelection
 import static java.awt.Toolkit.*
 
-def curviewport = Jalview.getAlignFrames()[Jalview.getAlignFrames().length-1].getViewport()
+def curviewport = Jalview.getCurrentAlignFrame().getViewport()
 
 def debug = false
 
index 71b3a9f..2792604 100644 (file)
@@ -29,7 +29,7 @@ def af = Jalview.getAlignFrames();
 
 for (ala in af)
 {
-       def al = ala.viewport.alignment;
+       def al = ala.getViewport().getAlignment();
        if (al!=null)
        {
                SequenceI[] seqs = al.getSequencesArray();
@@ -48,4 +48,4 @@ for (ala in af)
                }
        }
 }
-       
\ No newline at end of file
+       
index b3180f8..510f600 100644 (file)
@@ -1,38 +1,37 @@
 /*
  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
  * Copyright (C) $$Year-Rel$$ The Jalview Authors
- * 
+ *
  * This file is part of Jalview.
- * 
+ *
  * Jalview is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License 
+ * 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 
+ *
+ * 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 Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
-import jalview.bin.Jalview
 import jalview.workers.FeatureSetCounterI
 import jalview.workers.AlignmentAnnotationFactory
 
 /*
  * Demonstration of FeatureSetCounterI
- * compute annotation tracks counting number of displayed 
+ * compute annotation tracks counting number of displayed
  * features of each type in each column
  */
 
 /*
  * discover features on the current view
  */
-def featuresDisp=Jalview.currentAlignFrame.currentView.featuresDisplayed
+
+def featuresDisp=Jalview.getCurrentAlignFrame().currentView.featuresDisplayed
 if (featuresDisp == null) {
     print 'Need at least one feature visible on alignment'
 }
@@ -40,12 +39,12 @@ def visibleFeatures=featuresDisp.visibleFeatures.toList()
 assert 'java.util.ArrayList' == visibleFeatures.class.name
 
 /*
- * A closure that returns an array of features present 
+ * A closure that returns an array of features present
  * for each feature type in visibleFeatures
- * Argument 'features' will be a list of SequenceFeature 
+ * Argument 'features' will be a list of SequenceFeature
  */
-def getCounts = 
-    { features -> 
+def getCounts =
+    { features ->
         int[] obs = new int[visibleFeatures.size]
         for (sf in features)
         {
@@ -56,9 +55,9 @@ def getCounts =
              * or sf.getValue(attributeName) for GFF 'column 9' properties
              */
             int pos = 0
-            for (type in visibleFeatures) 
+            for (type in visibleFeatures)
             {
-              if (type.equals(sf.type)) 
+              if (type.equals(sf.type))
               {
                   obs[pos]++
               }
@@ -67,19 +66,19 @@ def getCounts =
         }
         obs
 }
-  
+
 /*
  * Define something that counts each visible feature type
  */
 def columnSetCounter =
     [
-     getNames: { visibleFeatures as String[] }, 
+     getNames: { visibleFeatures as String[] },
      getDescriptions:  { visibleFeatures as String[] },
      getMinColour: { [0, 255, 255] as int[] }, // cyan
      getMaxColour: { [0, 0, 255] as int[] }, // blue
-     count: 
-         { res, feats -> 
-             getCounts.call(feats) 
+     count:
+         { res, feats ->
+             getCounts.call(feats)
          }
      ] as FeatureSetCounterI
 
index 25d39f4..2d83e61 100644 (file)
@@ -1 +1 @@
-1.8.3-1.3.0_FJVL
+1.8.3-1.3.1_FJVL
index 12110b2..7d618e2 100644 (file)
@@ -1 +1 @@
-1.8.3-1.3.0_JVL
+1.8.3-1.3.1_JVL
index fb8f1bc..3fc97b5 100644 (file)
Binary files a/getdown/lib/getdown-core.jar and b/getdown/lib/getdown-core.jar differ
index c74dcc5..6ba0a6d 100644 (file)
Binary files a/getdown/lib/getdown-launcher-local.jar and b/getdown/lib/getdown-launcher-local.jar differ
index e1f1726..7c75a34 100644 (file)
Binary files a/getdown/lib/getdown-launcher.jar and b/getdown/lib/getdown-launcher.jar differ
index d8bb7e9..4c91f74 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>com.threerings.getdown</groupId>
     <artifactId>getdown</artifactId>
-    <version>1.8.3-1.3.0_FJVL</version>
+    <version>1.8.3-1.3.1_FJVL</version>
   </parent>
 
   <artifactId>getdown-ant</artifactId>
index 6126686..2e43522 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>com.threerings.getdown</groupId>
     <artifactId>getdown</artifactId>
-    <version>1.8.3-1.3.0_FJVL</version>
+    <version>1.8.3-1.3.1_FJVL</version>
   </parent>
 
   <artifactId>getdown-core</artifactId>
index 9d9fe14..435ebbd 100644 (file)
@@ -1137,7 +1137,6 @@ public class Application
                 String query = jalviewUri.getQuery();
                 
                 _appargs.clear();
-                _appargs.add("-open");
                 if (host != null && host.length() > 0) {
                   URL newUrl = new URL(
                           (https?"https":"http")
@@ -1253,8 +1252,6 @@ public class Application
           }
           if (ext != null && LOCATOR_FILE_EXTENSION.equals(ext.toLowerCase(Locale.ROOT))) {
             // this file extension should have been dealt with in Getdown class
-          } else {
-            _appargs.add(0, "-open");
           }
         }
 
index 4374899..c6b9ff3 100644 (file)
@@ -4,7 +4,7 @@
   <parent>
     <groupId>com.threerings.getdown</groupId>
     <artifactId>getdown</artifactId>
-    <version>1.8.3-1.3.0_FJVL</version>
+    <version>1.8.3-1.3.1_FJVL</version>
   </parent>
 
   <artifactId>getdown-launcher</artifactId>
index ba092a7..10942f8 100755 (executable)
@@ -3,7 +3,7 @@
 if [ x$JVLVERSION != x ]; then
   export VERSION=$JVLVERSION
 else
-  export VERSION=1.8.3-1.3.0_JVL
+  export VERSION=1.8.3-1.3.1_JVL
 fi
 
 if [ x${VERSION%_JVL} = x$VERSION ]; then
index 51e9514..cf32333 100644 (file)
@@ -10,7 +10,7 @@
   <groupId>com.threerings.getdown</groupId>
   <artifactId>getdown</artifactId>
   <packaging>pom</packaging>
-  <version>1.8.3-1.3.0_FJVL</version>
+  <version>1.8.3-1.3.1_FJVL</version>
 
   <name>getdown</name>
   <description>An application installer and updater.</description>
index b2e29e9..b1588e5 100644 (file)
     </tr>
 
     <tr valign="top">
+    <td><code>&#8209;&#8209;javaconsole / &#8209;&#8209;nojavaconsole</code></td>
+    <td>Show (/ or don't show) the Java Console.  Using one of these overrides any saved Preference.</td>
+    </tr>
+
+    <tr valign="top">
     <td><code>&#8209;&#8209;questionnaire / &#8209;&#8209;noquestionnaire</code></td>
     <td>Show (/ or don't show) the questionnaire if one is available.</td>
     </tr>
index fb8f1bc..3fc97b5 100644 (file)
Binary files a/j11lib/getdown-core.jar and b/j11lib/getdown-core.jar differ
diff --git a/j11lib/groovy-4.0.15.jar b/j11lib/groovy-4.0.15.jar
new file mode 100644 (file)
index 0000000..8423d99
Binary files /dev/null and b/j11lib/groovy-4.0.15.jar differ
diff --git a/j11lib/groovy-all-2.4.21-indy.jar b/j11lib/groovy-all-2.4.21-indy.jar
deleted file mode 100644 (file)
index 15ee98d..0000000
Binary files a/j11lib/groovy-all-2.4.21-indy.jar and /dev/null differ
diff --git a/j11lib/groovy-ant-4.0.15.jar b/j11lib/groovy-ant-4.0.15.jar
new file mode 100644 (file)
index 0000000..b6a39ac
Binary files /dev/null and b/j11lib/groovy-ant-4.0.15.jar differ
diff --git a/j11lib/groovy-astbuilder-4.0.15.jar b/j11lib/groovy-astbuilder-4.0.15.jar
new file mode 100644 (file)
index 0000000..f341fac
Binary files /dev/null and b/j11lib/groovy-astbuilder-4.0.15.jar differ
diff --git a/j11lib/groovy-cli-commons-4.0.15.jar b/j11lib/groovy-cli-commons-4.0.15.jar
new file mode 100644 (file)
index 0000000..b482258
Binary files /dev/null and b/j11lib/groovy-cli-commons-4.0.15.jar differ
diff --git a/j11lib/groovy-cli-picocli-4.0.15.jar b/j11lib/groovy-cli-picocli-4.0.15.jar
new file mode 100644 (file)
index 0000000..3223ba9
Binary files /dev/null and b/j11lib/groovy-cli-picocli-4.0.15.jar differ
diff --git a/j11lib/groovy-console-4.0.15.jar b/j11lib/groovy-console-4.0.15.jar
new file mode 100644 (file)
index 0000000..04a402a
Binary files /dev/null and b/j11lib/groovy-console-4.0.15.jar differ
diff --git a/j11lib/groovy-contracts-4.0.15.jar b/j11lib/groovy-contracts-4.0.15.jar
new file mode 100644 (file)
index 0000000..6825657
Binary files /dev/null and b/j11lib/groovy-contracts-4.0.15.jar differ
diff --git a/j11lib/groovy-datetime-4.0.15.jar b/j11lib/groovy-datetime-4.0.15.jar
new file mode 100644 (file)
index 0000000..312575a
Binary files /dev/null and b/j11lib/groovy-datetime-4.0.15.jar differ
diff --git a/j11lib/groovy-dateutil-4.0.15.jar b/j11lib/groovy-dateutil-4.0.15.jar
new file mode 100644 (file)
index 0000000..5893f97
Binary files /dev/null and b/j11lib/groovy-dateutil-4.0.15.jar differ
diff --git a/j11lib/groovy-docgenerator-4.0.15.jar b/j11lib/groovy-docgenerator-4.0.15.jar
new file mode 100644 (file)
index 0000000..bf76564
Binary files /dev/null and b/j11lib/groovy-docgenerator-4.0.15.jar differ
diff --git a/j11lib/groovy-ginq-4.0.15.jar b/j11lib/groovy-ginq-4.0.15.jar
new file mode 100644 (file)
index 0000000..46f561e
Binary files /dev/null and b/j11lib/groovy-ginq-4.0.15.jar differ
diff --git a/j11lib/groovy-groovydoc-4.0.15.jar b/j11lib/groovy-groovydoc-4.0.15.jar
new file mode 100644 (file)
index 0000000..b818919
Binary files /dev/null and b/j11lib/groovy-groovydoc-4.0.15.jar differ
diff --git a/j11lib/groovy-groovysh-4.0.15.jar b/j11lib/groovy-groovysh-4.0.15.jar
new file mode 100644 (file)
index 0000000..253eff6
Binary files /dev/null and b/j11lib/groovy-groovysh-4.0.15.jar differ
diff --git a/j11lib/groovy-jmx-4.0.15.jar b/j11lib/groovy-jmx-4.0.15.jar
new file mode 100644 (file)
index 0000000..8667ac4
Binary files /dev/null and b/j11lib/groovy-jmx-4.0.15.jar differ
diff --git a/j11lib/groovy-json-4.0.15.jar b/j11lib/groovy-json-4.0.15.jar
new file mode 100644 (file)
index 0000000..76b486a
Binary files /dev/null and b/j11lib/groovy-json-4.0.15.jar differ
diff --git a/j11lib/groovy-jsr223-4.0.15.jar b/j11lib/groovy-jsr223-4.0.15.jar
new file mode 100644 (file)
index 0000000..5ae9f69
Binary files /dev/null and b/j11lib/groovy-jsr223-4.0.15.jar differ
diff --git a/j11lib/groovy-macro-4.0.15.jar b/j11lib/groovy-macro-4.0.15.jar
new file mode 100644 (file)
index 0000000..e5f7abb
Binary files /dev/null and b/j11lib/groovy-macro-4.0.15.jar differ
diff --git a/j11lib/groovy-macro-library-4.0.15.jar b/j11lib/groovy-macro-library-4.0.15.jar
new file mode 100644 (file)
index 0000000..92c208f
Binary files /dev/null and b/j11lib/groovy-macro-library-4.0.15.jar differ
diff --git a/j11lib/groovy-nio-4.0.15.jar b/j11lib/groovy-nio-4.0.15.jar
new file mode 100644 (file)
index 0000000..e6e2ad8
Binary files /dev/null and b/j11lib/groovy-nio-4.0.15.jar differ
diff --git a/j11lib/groovy-servlet-4.0.15.jar b/j11lib/groovy-servlet-4.0.15.jar
new file mode 100644 (file)
index 0000000..711a1e2
Binary files /dev/null and b/j11lib/groovy-servlet-4.0.15.jar differ
diff --git a/j11lib/groovy-sql-4.0.15.jar b/j11lib/groovy-sql-4.0.15.jar
new file mode 100644 (file)
index 0000000..058db44
Binary files /dev/null and b/j11lib/groovy-sql-4.0.15.jar differ
diff --git a/j11lib/groovy-swing-4.0.15.jar b/j11lib/groovy-swing-4.0.15.jar
new file mode 100644 (file)
index 0000000..848d074
Binary files /dev/null and b/j11lib/groovy-swing-4.0.15.jar differ
diff --git a/j11lib/groovy-templates-4.0.15.jar b/j11lib/groovy-templates-4.0.15.jar
new file mode 100644 (file)
index 0000000..3cd0245
Binary files /dev/null and b/j11lib/groovy-templates-4.0.15.jar differ
diff --git a/j11lib/groovy-test-4.0.15.jar b/j11lib/groovy-test-4.0.15.jar
new file mode 100644 (file)
index 0000000..e600dc7
Binary files /dev/null and b/j11lib/groovy-test-4.0.15.jar differ
diff --git a/j11lib/groovy-test-junit5-4.0.15.jar b/j11lib/groovy-test-junit5-4.0.15.jar
new file mode 100644 (file)
index 0000000..abcc69a
Binary files /dev/null and b/j11lib/groovy-test-junit5-4.0.15.jar differ
diff --git a/j11lib/groovy-testng-4.0.15.jar b/j11lib/groovy-testng-4.0.15.jar
new file mode 100644 (file)
index 0000000..60c1b58
Binary files /dev/null and b/j11lib/groovy-testng-4.0.15.jar differ
diff --git a/j11lib/groovy-toml-4.0.15.jar b/j11lib/groovy-toml-4.0.15.jar
new file mode 100644 (file)
index 0000000..ad49634
Binary files /dev/null and b/j11lib/groovy-toml-4.0.15.jar differ
diff --git a/j11lib/groovy-typecheckers-4.0.15.jar b/j11lib/groovy-typecheckers-4.0.15.jar
new file mode 100644 (file)
index 0000000..dc113c3
Binary files /dev/null and b/j11lib/groovy-typecheckers-4.0.15.jar differ
diff --git a/j11lib/groovy-xml-4.0.15.jar b/j11lib/groovy-xml-4.0.15.jar
new file mode 100644 (file)
index 0000000..21aeea0
Binary files /dev/null and b/j11lib/groovy-xml-4.0.15.jar differ
diff --git a/j11lib/groovy-yaml-4.0.15.jar b/j11lib/groovy-yaml-4.0.15.jar
new file mode 100644 (file)
index 0000000..207d47d
Binary files /dev/null and b/j11lib/groovy-yaml-4.0.15.jar differ
diff --git a/j11lib/javaparser-core-3.25.5.jar b/j11lib/javaparser-core-3.25.5.jar
new file mode 100644 (file)
index 0000000..92eed53
Binary files /dev/null and b/j11lib/javaparser-core-3.25.5.jar differ
index fb8f1bc..3fc97b5 100644 (file)
Binary files a/j8lib/getdown-core.jar and b/j8lib/getdown-core.jar differ
diff --git a/j8lib/groovy-4.0.15.jar b/j8lib/groovy-4.0.15.jar
new file mode 100644 (file)
index 0000000..8423d99
Binary files /dev/null and b/j8lib/groovy-4.0.15.jar differ
diff --git a/j8lib/groovy-all-2.4.21-indy.jar b/j8lib/groovy-all-2.4.21-indy.jar
deleted file mode 100644 (file)
index 15ee98d..0000000
Binary files a/j8lib/groovy-all-2.4.21-indy.jar and /dev/null differ
diff --git a/j8lib/groovy-ant-4.0.15.jar b/j8lib/groovy-ant-4.0.15.jar
new file mode 100644 (file)
index 0000000..b6a39ac
Binary files /dev/null and b/j8lib/groovy-ant-4.0.15.jar differ
diff --git a/j8lib/groovy-astbuilder-4.0.15.jar b/j8lib/groovy-astbuilder-4.0.15.jar
new file mode 100644 (file)
index 0000000..f341fac
Binary files /dev/null and b/j8lib/groovy-astbuilder-4.0.15.jar differ
diff --git a/j8lib/groovy-cli-commons-4.0.15.jar b/j8lib/groovy-cli-commons-4.0.15.jar
new file mode 100644 (file)
index 0000000..b482258
Binary files /dev/null and b/j8lib/groovy-cli-commons-4.0.15.jar differ
diff --git a/j8lib/groovy-cli-picocli-4.0.15.jar b/j8lib/groovy-cli-picocli-4.0.15.jar
new file mode 100644 (file)
index 0000000..3223ba9
Binary files /dev/null and b/j8lib/groovy-cli-picocli-4.0.15.jar differ
diff --git a/j8lib/groovy-console-4.0.15.jar b/j8lib/groovy-console-4.0.15.jar
new file mode 100644 (file)
index 0000000..04a402a
Binary files /dev/null and b/j8lib/groovy-console-4.0.15.jar differ
diff --git a/j8lib/groovy-contracts-4.0.15.jar b/j8lib/groovy-contracts-4.0.15.jar
new file mode 100644 (file)
index 0000000..6825657
Binary files /dev/null and b/j8lib/groovy-contracts-4.0.15.jar differ
diff --git a/j8lib/groovy-datetime-4.0.15.jar b/j8lib/groovy-datetime-4.0.15.jar
new file mode 100644 (file)
index 0000000..312575a
Binary files /dev/null and b/j8lib/groovy-datetime-4.0.15.jar differ
diff --git a/j8lib/groovy-dateutil-4.0.15.jar b/j8lib/groovy-dateutil-4.0.15.jar
new file mode 100644 (file)
index 0000000..5893f97
Binary files /dev/null and b/j8lib/groovy-dateutil-4.0.15.jar differ
diff --git a/j8lib/groovy-docgenerator-4.0.15.jar b/j8lib/groovy-docgenerator-4.0.15.jar
new file mode 100644 (file)
index 0000000..bf76564
Binary files /dev/null and b/j8lib/groovy-docgenerator-4.0.15.jar differ
diff --git a/j8lib/groovy-ginq-4.0.15.jar b/j8lib/groovy-ginq-4.0.15.jar
new file mode 100644 (file)
index 0000000..46f561e
Binary files /dev/null and b/j8lib/groovy-ginq-4.0.15.jar differ
diff --git a/j8lib/groovy-groovydoc-4.0.15.jar b/j8lib/groovy-groovydoc-4.0.15.jar
new file mode 100644 (file)
index 0000000..b818919
Binary files /dev/null and b/j8lib/groovy-groovydoc-4.0.15.jar differ
diff --git a/j8lib/groovy-groovysh-4.0.15.jar b/j8lib/groovy-groovysh-4.0.15.jar
new file mode 100644 (file)
index 0000000..253eff6
Binary files /dev/null and b/j8lib/groovy-groovysh-4.0.15.jar differ
diff --git a/j8lib/groovy-jmx-4.0.15.jar b/j8lib/groovy-jmx-4.0.15.jar
new file mode 100644 (file)
index 0000000..8667ac4
Binary files /dev/null and b/j8lib/groovy-jmx-4.0.15.jar differ
diff --git a/j8lib/groovy-json-4.0.15.jar b/j8lib/groovy-json-4.0.15.jar
new file mode 100644 (file)
index 0000000..76b486a
Binary files /dev/null and b/j8lib/groovy-json-4.0.15.jar differ
diff --git a/j8lib/groovy-jsr223-4.0.15.jar b/j8lib/groovy-jsr223-4.0.15.jar
new file mode 100644 (file)
index 0000000..5ae9f69
Binary files /dev/null and b/j8lib/groovy-jsr223-4.0.15.jar differ
diff --git a/j8lib/groovy-macro-4.0.15.jar b/j8lib/groovy-macro-4.0.15.jar
new file mode 100644 (file)
index 0000000..e5f7abb
Binary files /dev/null and b/j8lib/groovy-macro-4.0.15.jar differ
diff --git a/j8lib/groovy-macro-library-4.0.15.jar b/j8lib/groovy-macro-library-4.0.15.jar
new file mode 100644 (file)
index 0000000..92c208f
Binary files /dev/null and b/j8lib/groovy-macro-library-4.0.15.jar differ
diff --git a/j8lib/groovy-nio-4.0.15.jar b/j8lib/groovy-nio-4.0.15.jar
new file mode 100644 (file)
index 0000000..e6e2ad8
Binary files /dev/null and b/j8lib/groovy-nio-4.0.15.jar differ
diff --git a/j8lib/groovy-servlet-4.0.15.jar b/j8lib/groovy-servlet-4.0.15.jar
new file mode 100644 (file)
index 0000000..711a1e2
Binary files /dev/null and b/j8lib/groovy-servlet-4.0.15.jar differ
diff --git a/j8lib/groovy-sql-4.0.15.jar b/j8lib/groovy-sql-4.0.15.jar
new file mode 100644 (file)
index 0000000..058db44
Binary files /dev/null and b/j8lib/groovy-sql-4.0.15.jar differ
diff --git a/j8lib/groovy-swing-4.0.15.jar b/j8lib/groovy-swing-4.0.15.jar
new file mode 100644 (file)
index 0000000..848d074
Binary files /dev/null and b/j8lib/groovy-swing-4.0.15.jar differ
diff --git a/j8lib/groovy-templates-4.0.15.jar b/j8lib/groovy-templates-4.0.15.jar
new file mode 100644 (file)
index 0000000..3cd0245
Binary files /dev/null and b/j8lib/groovy-templates-4.0.15.jar differ
diff --git a/j8lib/groovy-test-4.0.15.jar b/j8lib/groovy-test-4.0.15.jar
new file mode 100644 (file)
index 0000000..e600dc7
Binary files /dev/null and b/j8lib/groovy-test-4.0.15.jar differ
diff --git a/j8lib/groovy-test-junit5-4.0.15.jar b/j8lib/groovy-test-junit5-4.0.15.jar
new file mode 100644 (file)
index 0000000..abcc69a
Binary files /dev/null and b/j8lib/groovy-test-junit5-4.0.15.jar differ
diff --git a/j8lib/groovy-testng-4.0.15.jar b/j8lib/groovy-testng-4.0.15.jar
new file mode 100644 (file)
index 0000000..60c1b58
Binary files /dev/null and b/j8lib/groovy-testng-4.0.15.jar differ
diff --git a/j8lib/groovy-toml-4.0.15.jar b/j8lib/groovy-toml-4.0.15.jar
new file mode 100644 (file)
index 0000000..ad49634
Binary files /dev/null and b/j8lib/groovy-toml-4.0.15.jar differ
diff --git a/j8lib/groovy-typecheckers-4.0.15.jar b/j8lib/groovy-typecheckers-4.0.15.jar
new file mode 100644 (file)
index 0000000..dc113c3
Binary files /dev/null and b/j8lib/groovy-typecheckers-4.0.15.jar differ
diff --git a/j8lib/groovy-xml-4.0.15.jar b/j8lib/groovy-xml-4.0.15.jar
new file mode 100644 (file)
index 0000000..21aeea0
Binary files /dev/null and b/j8lib/groovy-xml-4.0.15.jar differ
diff --git a/j8lib/groovy-yaml-4.0.15.jar b/j8lib/groovy-yaml-4.0.15.jar
new file mode 100644 (file)
index 0000000..207d47d
Binary files /dev/null and b/j8lib/groovy-yaml-4.0.15.jar differ
diff --git a/j8lib/javaparser-core-3.25.5.jar b/j8lib/javaparser-core-3.25.5.jar
new file mode 100644 (file)
index 0000000..92eed53
Binary files /dev/null and b/j8lib/javaparser-core-3.25.5.jar differ
index 1abb171..483b1fc 100755 (executable)
@@ -54,6 +54,8 @@ import javax.swing.LookAndFeel;
 import javax.swing.UIManager;
 
 import jalview.analytics.Plausible;
+import jalview.bin.argparser.Arg;
+import jalview.bin.argparser.ArgParser;
 import jalview.datamodel.PDBEntry;
 import jalview.gui.Preferences;
 import jalview.gui.UserDefinedColours;
@@ -1663,27 +1665,36 @@ public class Cache
     }
     if (file == null || !file.exists())
     {
+      if (file != null)
+      {
+        jalview.bin.Console
+                .errPrintln("Could not load bootstrap preferences file '"
+                        + file.getPath() + "'");
+      }
       String channelPrefsFilename = ChannelProperties
               .getProperty("preferences.filename");
       String propertiesFilename = System.getProperty("user.home")
               + File.separatorChar + channelPrefsFilename;
+      jalview.bin.Console.errPrintln(
+              "Using default properties file '" + propertiesFilename + "'");
       file = new File(propertiesFilename);
     }
     if (file == null || !file.exists())
+
     {
       String releasePrefsFilename = fallbackPropertiesFile;
       String releasePropertiesFilename = System.getProperty("user.home")
               + File.separatorChar + releasePrefsFilename;
+      jalview.bin.Console.errPrintln("Falling back to properties file '"
+              + releasePropertiesFilename + "'");
       file = new File(releasePropertiesFilename);
     }
 
-    if (filename == null)
-      return null;
     if (!file.exists())
     {
       jalview.bin.Console
               .errPrintln("Could not load bootstrap preferences file '"
-                      + filename + "'");
+                      + file.getPath() + "'");
       return null;
     }
 
@@ -1723,4 +1734,10 @@ public class Cache
   {
     return key == null ? null : sessionProperties.get(key);
   }
+
+  public static boolean getArgCacheDefault(Arg a, String pref, boolean def)
+  {
+    ArgParser ap = Jalview.getInstance().getArgParser();
+    return ap.isSet(a) ? ap.getBoolean(a) : getDefault(pref, def);
+  }
 }
index 5d3b50d..3006f1f 100644 (file)
@@ -775,10 +775,11 @@ public class Commands
                   // RESTORE SESSION AFTER EXPORT IF NEED BE
                   if (sessionToRestore != null)
                   {
-                    Console.debug("Restoring session from "
-                            + sessionToRestore);
-                    
-                    sview.getBinding().restoreSession(sessionToRestore.getAbsolutePath());
+                    Console.debug(
+                            "Restoring session from " + sessionToRestore);
+
+                    sview.getBinding().restoreSession(
+                            sessionToRestore.getAbsolutePath());
 
                   }
                 } catch (ImageOutputException ioexec)
@@ -789,11 +790,14 @@ public class Commands
                   continue;
                 } finally
                 {
-                  try {
+                  try
+                  {
                     this.colourAlignFrame(af, originalColourScheme);
                   } catch (Exception t)
                   {
-                    addError("Unexpected error when restoring colourscheme to alignment after temporary change for export.",t);
+                    addError(
+                            "Unexpected error when restoring colourscheme to alignment after temporary change for export.",
+                            t);
                   }
                 }
               }
@@ -838,21 +842,30 @@ public class Commands
     ArgValuesMap avm = argParser.getLinkedArgs(id);
     AlignFrame af = afMap.get(id);
 
+    if (avm != null && !avm.containsArg(Arg.GROOVY))
+    {
+      // nothing to do
+      return;
+    }
+
     if (af == null)
     {
-      addWarn("Did not have an alignment window for id=" + id);
+      addWarn("Groovy script does not have an alignment window.  Proceeding with caution!");
       return;
     }
 
     if (avm.containsArg(Arg.GROOVY))
     {
-      String groovyscript = avm.getValue(Arg.GROOVY);
-      if (groovyscript != null)
+      for (ArgValue groovyAv : avm.getArgValueList(Arg.GROOVY))
       {
-        // Execute the groovy script after we've done all the rendering stuff
-        // and before any images or figures are generated.
-        Console.info("Executing script " + groovyscript);
-        Jalview.getInstance().executeGroovyScript(groovyscript, af);
+        String groovyscript = groovyAv.getValue();
+        if (groovyscript != null)
+        {
+          // Execute the groovy script after we've done all the rendering stuff
+          // and before any images or figures are generated.
+          Console.info("Executing script " + groovyscript);
+          Jalview.getInstance().executeGroovyScript(groovyscript, af);
+        }
       }
     }
   }
@@ -862,9 +875,16 @@ public class Commands
     ArgValuesMap avm = argParser.getLinkedArgs(id);
     AlignFrame af = afMap.get(id);
 
+    if (avm != null && !avm.containsArg(Arg.IMAGE))
+    {
+      // nothing to do
+      return true;
+    }
+
     if (af == null)
     {
-      addWarn("Did not have an alignment window for id=" + id);
+      addWarn("Do not have an alignment window to create image from (id="
+              + id + ").  Not proceeding.");
       return false;
     }
 
@@ -991,9 +1011,16 @@ public class Commands
     ArgValuesMap avm = argParser.getLinkedArgs(id);
     AlignFrame af = afMap.get(id);
 
+    if (avm != null && !avm.containsArg(Arg.OUTPUT))
+    {
+      // nothing to do
+      return true;
+    }
+
     if (af == null)
     {
-      addWarn("Did not have an alignment window for id=" + id);
+      addWarn("Do not have an alignment window (id=" + id
+              + ").  Not proceeding.");
       return false;
     }
 
index 1b230ec..1bb8162 100644 (file)
 package jalview.bin;
 
 import java.io.PrintStream;
-import java.util.Locale;
 
 import jalview.log.JLogger;
-import jalview.log.JLoggerI;
 import jalview.log.JLoggerI.LogLevel;
 import jalview.log.JLoggerLog4j;
 import jalview.util.ChannelProperties;
@@ -241,7 +239,7 @@ public class Console
     {
       JLogger.LogLevel logLevel = JLogger.LogLevel.INFO;
 
-      if (JLogger.isLevel(providedLogLevel))
+      if (providedLogLevel != null && JLogger.isLevel(providedLogLevel))
       {
         logLevel = Console.getLogLevel(providedLogLevel);
       }
@@ -292,19 +290,23 @@ public class Console
 
   public static void setLogLevel(String logLevelString)
   {
-    for (LogLevel logLevel : JLoggerI.LogLevel.values())
+    LogLevel l = null;
+    try
+    {
+      l = LogLevel.valueOf(logLevelString);
+    } catch (IllegalArgumentException | NullPointerException e1)
+    {
+      Console.debug("Invalid log level '" + logLevelString + "'");
+      return;
+    }
+    if (l != null)
     {
-      if (logLevel.toString().toLowerCase(Locale.ROOT)
-              .equals(logLevelString.toLowerCase(Locale.ROOT)))
+      log.setLevel(l);
+      if (!Platform.isJS())
       {
-        log.setLevel(logLevel);
-        if (!Platform.isJS())
-        {
-          Log4j.init(logLevel);
-        }
-        JLoggerLog4j.getLogger("org.apache.axis", logLevel);
-        break;
+        Log4j.init(l);
       }
+      JLoggerLog4j.getLogger("org.apache.axis", l);
     }
   }
 
index b7d15e5..f24eb09 100755 (executable)
@@ -73,6 +73,8 @@ import jalview.bin.argparser.Arg.Opt;
 import jalview.bin.argparser.Arg.Type;
 import jalview.bin.argparser.ArgParser;
 import jalview.bin.argparser.BootstrapArgs;
+import jalview.bin.groovy.JalviewObject;
+import jalview.bin.groovy.JalviewObjectI;
 import jalview.ext.so.SequenceOntology;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
@@ -118,7 +120,7 @@ import jalview.ws.jws2.Jws2Discoverer;
  * @author $author$
  * @version $Revision$
  */
-public class Jalview
+public class Jalview implements JalviewObjectI
 {
   static
   {
@@ -138,7 +140,7 @@ public class Jalview
 
   protected Commands cmds;
 
-  public static AlignFrame currentAlignFrame;
+  public AlignFrame currentAlignFrame = null;
 
   private ArgParser argparser = null;
 
@@ -447,7 +449,7 @@ public class Jalview
       }
       else if (bootstrapArgs.contains(Arg.DEBUG))
       {
-        logLevel = "DEBUG";
+        logLevel = bootstrapArgs.getBoolean(Arg.DEBUG) ? "DEBUG" : "INFO";
       }
       if (logLevel == null && !(bootstrapProperties == null))
       {
@@ -642,14 +644,12 @@ public class Jalview
     try
     {
       Console.initLogger();
-    } catch (
-
-    NoClassDefFoundError error)
+    } catch (NoClassDefFoundError error)
     {
       error.printStackTrace();
       String message = "\nEssential logging libraries not found."
               + "\nUse: java -classpath \"$PATH_TO_LIB$/*:$PATH_TO_CLASSES$\" jalview.bin.Jalview";
-      Jalview.exit(message, ExitCode.OK);
+      Jalview.exit(message, ExitCode.NO_LOGGING);
     }
     desktop = null;
 
@@ -1633,8 +1633,7 @@ public class Jalview
     PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop,
             "USAGESTATS",
             MessageManager.getString("prompt.analytics_title"),
-            MessageManager.getString("prompt.analytics"),
-            new Runnable()
+            MessageManager.getString("prompt.analytics"), new Runnable()
             {
               @Override
               public void run()
@@ -1752,12 +1751,11 @@ public class Jalview
     }
     try
     {
+      JalviewObjectI j = new JalviewObject(this);
       Map<String, java.lang.Object> vbinding = new HashMap<>();
-      vbinding.put("Jalview", this);
-      if (af != null)
-      {
-        vbinding.put("currentAlFrame", af);
-      }
+      vbinding.put("Jalview", j);
+      vbinding.put("currentAlFrame",
+              af != null ? af : getCurrentAlignFrame());
       Binding gbinding = new Binding(vbinding);
       GroovyScriptEngine gse = new GroovyScriptEngine(new URL[] { sfile });
       gse.run(sfile.toString(), gbinding);
@@ -1773,7 +1771,6 @@ public class Jalview
               .errPrintln("Exception Whilst trying to execute file " + sfile
                       + " as a groovy script.");
       e.printStackTrace(System.err);
-
     }
   }
 
@@ -1787,30 +1784,32 @@ public class Jalview
     return false;
   }
 
+  @Override
   public AlignFrame[] getAlignFrames()
   {
     return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() }
-            : Desktop.getAlignFrames();
-
+            : Desktop.getDesktopAlignFrames();
   }
 
   /**
    * jalview.bin.Jalview.quit() will just run the non-GUI shutdownHook and exit
    */
+  @Override
   public void quit()
   {
     // System.exit will run the shutdownHook first
     Jalview.exit("Quitting now. Bye!", ExitCode.OK);
   }
 
-  public static AlignFrame getCurrentAlignFrame()
+  @Override
+  public AlignFrame getCurrentAlignFrame()
   {
-    return Jalview.currentAlignFrame;
+    return currentAlignFrame;
   }
 
-  public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
+  public void setCurrentAlignFrame(AlignFrame af)
   {
-    Jalview.currentAlignFrame = currentAlignFrame;
+    this.currentAlignFrame = af;
   }
 
   public Commands getCommands()
@@ -1862,7 +1861,7 @@ public class Jalview
     // only add new ones to the end of the list (to preserve ordinal values)
     OK, FILE_NOT_FOUND, FILE_NOT_READABLE, NO_FILES, INVALID_FORMAT,
     INVALID_ARGUMENT, INVALID_VALUE, MIXED_CLI_ARGUMENTS,
-    ERROR_RUNNING_COMMANDS;
+    ERROR_RUNNING_COMMANDS, NO_LOGGING, GROOVY_ERROR;
   }
 
   /******************************
@@ -2041,8 +2040,8 @@ public class Jalview
               j.getArgParser().getMixedExamples());
       String quit = MessageManager.getString("action.quit");
 
-      Desktop.instance.nonBlockingDialog(title, warning, quit,
-              JvOptionPane.WARNING_MESSAGE, false, true);
+      Desktop.instance.nonBlockingDialog(title, warning, null, quit,
+              JvOptionPane.WARNING_MESSAGE, false, false, true, 30000);
 
       Jalview.exit(
               "Exiting due to mixed old and new command line arguments.",
@@ -2066,8 +2065,8 @@ public class Jalview
       {
         String cont = MessageManager.getString("label.continue");
 
-        Desktop.instance.nonBlockingDialog(32, 2, title, warning, url, cont,
-                JvOptionPane.WARNING_MESSAGE, false, true, true);
+        Desktop.instance.nonBlockingDialog(title, warning, url, cont,
+                JvOptionPane.WARNING_MESSAGE, false, true, true, 30000);
       }
     }
     if (j.getCommands() != null && j.getCommands().getErrors().size() > 0)
@@ -2087,7 +2086,7 @@ public class Jalview
                 Math.max(message.length(), Math.min(60, shortest)),
                 Math.min(errors.size(), 20), title, message,
                 j.getCommands().errorsToString(), ok,
-                JvOptionPane.WARNING_MESSAGE, true, false, true);
+                JvOptionPane.WARNING_MESSAGE, true, false, true, -1);
       }
     }
   }
index 2a3a4a1..93156ac 100644 (file)
@@ -44,6 +44,8 @@ public enum Arg
   QUESTIONNAIRE(Type.CONFIG,
           "Show (or don't show) the questionnaire if one is available.",
           true, Opt.BOOLEAN, Opt.BOOTSTRAP),
+  JAVACONSOLE(Type.CONFIG, "Show (or don't show) the Java Console.", false,
+          Opt.BOOLEAN, Opt.BOOTSTRAP),
   NOUSAGESTATS(Type.CONFIG, "Don't send initial launch usage stats.",
           Opt.UNARY, Opt.BOOTSTRAP),
   NOSTARTUPFILE(Type.CONFIG, "Don't show the default startup file.",
index 1b8e6ad..155f69e 100644 (file)
@@ -318,9 +318,13 @@ public class ArgParser
     }
 
     if (bsa != null)
+    {
       this.bootstrapArgs = bsa;
+    }
     else
+    {
       this.bootstrapArgs = BootstrapArgs.getBootstrapArgs(args);
+    }
     parse(args, initsubstitutions, allowPrivate);
   }
 
index d32a5b2..5c21d03 100644 (file)
@@ -214,6 +214,13 @@ public class BootstrapArgs
         }
       }
     }
+
+    // if in an argfile, remove it from the hashset so it can be re-used in
+    // another argfile
+    if (inArgFile != null)
+    {
+      argFiles.remove(inArgFile);
+    }
   }
 
   public boolean contains(Arg a)
diff --git a/src/jalview/bin/groovy/JalviewObject.java b/src/jalview/bin/groovy/JalviewObject.java
new file mode 100644 (file)
index 0000000..e271c3c
--- /dev/null
@@ -0,0 +1,42 @@
+package jalview.bin.groovy;
+
+import jalview.bin.Jalview.ExitCode;
+import jalview.gui.AlignFrame;
+
+public class JalviewObject implements JalviewObjectI
+{
+  private JalviewObjectI object = null;
+
+  public JalviewObject(JalviewObjectI j)
+  {
+    this.object = j;
+  }
+
+  @Override
+  public AlignFrame[] getAlignFrames()
+  {
+    return object == null ? null : object.getAlignFrames();
+  }
+
+  @Override
+  public AlignFrame getCurrentAlignFrame()
+  {
+    return object == null ? null : object.getCurrentAlignFrame();
+  }
+
+  @Override
+  public void quit()
+  {
+    if (object != null)
+    {
+      object.quit();
+    }
+    else
+    {
+      jalview.bin.Jalview.exit(
+              "Groovy console quit without Jalview object.",
+              ExitCode.GROOVY_ERROR);
+    }
+  }
+
+}
diff --git a/src/jalview/bin/groovy/JalviewObjectI.java b/src/jalview/bin/groovy/JalviewObjectI.java
new file mode 100644 (file)
index 0000000..775ab2a
--- /dev/null
@@ -0,0 +1,14 @@
+package jalview.bin.groovy;
+
+import jalview.gui.AlignFrame;
+
+public interface JalviewObjectI
+{
+  public AlignFrame[] getAlignFrames();
+
+  public AlignFrame getCurrentAlignFrame();
+
+  public static AlignFrame currentAlFrame = null;
+
+  public void quit();
+}
index f3cb012..ae14539 100644 (file)
@@ -503,7 +503,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       @Override
       public void focusGained(FocusEvent e)
       {
-        Jalview.setCurrentAlignFrame(AlignFrame.this);
+        Jalview.getInstance().setCurrentAlignFrame(AlignFrame.this);
       }
     });
 
@@ -5963,8 +5963,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   protected void runGroovy_actionPerformed()
   {
-    Jalview.setCurrentAlignFrame(this);
-    groovy.ui.Console console = Desktop.getGroovyConsole();
+    Jalview.getInstance().setCurrentAlignFrame(this);
+    groovy.console.ui.Console console = Desktop.getGroovyConsole();
     if (console != null)
     {
       try
index ef9e575..a8bc815 100644 (file)
@@ -997,7 +997,7 @@ public class AlignViewport extends AlignmentViewport
    */
   protected boolean noReferencesTo(AlignedCodonFrame acf)
   {
-    AlignFrame[] frames = Desktop.getAlignFrames();
+    AlignFrame[] frames = Desktop.getDesktopAlignFrames();
     if (frames == null)
     {
       return true;
index 9fe7195..7e8cbc6 100644 (file)
@@ -53,6 +53,7 @@ import javax.swing.JTextArea;
 import javax.swing.border.Border;
 import javax.swing.text.DefaultCaret;
 
+import jalview.bin.Cache;
 import jalview.log.JLoggerI.LogLevel;
 import jalview.log.JLoggerLog4j;
 import jalview.log.JalviewAppender;
@@ -106,7 +107,7 @@ public class Console extends WindowAdapter
 
   private JComboBox<LogLevel> logLevelCombo = new JComboBox<LogLevel>();
 
-  protected LogLevel startingLogLevel = LogLevel.INFO;
+  protected LogLevel startingLogLevel = null;
 
   public Console()
   {
@@ -147,6 +148,7 @@ public class Console extends WindowAdapter
     scrollPane.setBorder(noBorder);
     textArea.addMouseListener(new MouseAdapter()
     {
+      @Override
       public void mouseClicked(MouseEvent e)
       {
         if (e.getButton() == MouseEvent.BUTTON1)
@@ -172,6 +174,7 @@ public class Console extends WindowAdapter
             MessageManager.getString("label.copy_to_clipboard"));
     copyToClipboardButton.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         copyConsoleTextToClipboard();
@@ -183,12 +186,14 @@ public class Console extends WindowAdapter
 
       private Color fg = textArea.getForeground();
 
+      @Override
       public void mousePressed(MouseEvent e)
       {
         textArea.setBackground(textArea.getSelectionColor());
         textArea.setForeground(textArea.getSelectedTextColor());
       }
 
+      @Override
       public void mouseReleased(MouseEvent e)
       {
         textArea.setBackground(bg);
@@ -212,11 +217,35 @@ public class Console extends WindowAdapter
     // logLevelCombo.addItem(LogLevel.ERROR);
     // logLevelCombo.addItem(LogLevel.OFF);
     // set startingLogLevel
-    startingLogLevel = jalview.bin.Console.log == null ? LogLevel.INFO
-            : jalview.bin.Console.log.getLevel();
+    if (jalview.bin.Console.log == null)
+    {
+      try
+      {
+        startingLogLevel = LogLevel
+                .valueOf(Cache.getDefault(Cache.JALVIEWLOGLEVEL, null));
+      } catch (IllegalArgumentException e1)
+      {
+        jalview.bin.Console.debug(
+                "Invalid value for preference " + Cache.JALVIEWLOGLEVEL);
+      } catch (NullPointerException e2)
+      {
+        // no value in preferences
+      } finally
+      {
+        if (startingLogLevel == null)
+        {
+          startingLogLevel = LogLevel.INFO;
+        }
+      }
+    }
+    else
+    {
+      startingLogLevel = jalview.bin.Console.log.getLevel();
+    }
     setChosenLogLevelCombo();
     logLevelCombo.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         if (jalview.bin.Console.log != null)
@@ -313,7 +342,7 @@ public class Console extends WindowAdapter
         boolean added = false;
         for (int i = 0; i < logLevelCombo.getItemCount(); i++)
         {
-          LogLevel l = (LogLevel) logLevelCombo.getItemAt(i);
+          LogLevel l = logLevelCombo.getItemAt(i);
           if (l.compareTo(setLogLevel) >= 0)
           {
             logLevelCombo.insertItemAt(setLogLevel, i);
@@ -475,36 +504,32 @@ public class Console extends WindowAdapter
    */
   public Console(Desktop desktop)
   {
-    this(desktop, true);
-  }
-
-  /**
-   * attach a console to the desktop - the desktop will open it if requested.
-   * 
-   * @param desktop
-   * @param showjconsole
-   *          - if true, then redirect stdout immediately
-   */
-  public Console(Desktop desktop, boolean showjconsole)
-  {
     parent = desktop;
     // window name - get x,y,width, height possibly scaled
-    Rectangle bounds = desktop.getLastKnownDimensions("JAVA_CONSOLE_");
-    if (bounds == null)
+    Rectangle bounds = parent == null ? null
+            : parent.getLastKnownDimensions("JAVA_CONSOLE_");
+    if (bounds != null)
+    {
+      frame = initFrame(
+              ChannelProperties.getProperty("app_name") + " Java Console",
+              bounds.width, bounds.height, bounds.x, bounds.y);
+    }
+    else if (parent != null && parent.getWidth() > 0
+            && parent.getHeight() > 0)
     {
       frame = initFrame(
               ChannelProperties.getProperty("app_name") + " Java Console",
-              desktop.getWidth() / 2, desktop.getHeight() / 4,
-              desktop.getX(), desktop.getY());
+              parent.getWidth() / 2, parent.getHeight() / 4, parent.getX(),
+              parent.getY());
     }
     else
     {
       frame = initFrame(
               ChannelProperties.getProperty("app_name") + " Java Console",
-              bounds.width, bounds.height, bounds.x, bounds.y);
+              MIN_WIDTH, MIN_HEIGHT, 10, 10);
     }
     frame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT));
-    // desktop.add(frame);
+    // parent.add(frame);
     initConsole(false);
     LogLevel level = (LogLevel) logLevelCombo.getSelectedItem();
     if (!Platform.isJS())
@@ -537,6 +562,7 @@ public class Console extends WindowAdapter
         pin.close();
       } catch (Exception e)
       {
+        jalview.bin.Console.debug("pin.close() error", e);
       }
       try
       {
@@ -544,12 +570,14 @@ public class Console extends WindowAdapter
         pin2.close();
       } catch (Exception e)
       {
+        jalview.bin.Console.debug("pin2.close() error", e);
       }
       try
       {
         textAppender.join(10);
       } catch (Exception e)
       {
+        jalview.bin.Console.debug("textAppender.join(10) error", e);
       }
     }
     /*
@@ -609,13 +637,14 @@ public class Console extends WindowAdapter
         {
           try
           {
-            this.wait(100);
+            this.wait(100); // ##### implicated BLOCKED
             if (pin.available() == 0)
             {
               trimBuffer(false);
             }
           } catch (InterruptedException ie)
           {
+            jalview.bin.Console.debug("pin.available() error", ie);
           }
         }
 
@@ -641,13 +670,14 @@ public class Console extends WindowAdapter
         {
           try
           {
-            this.wait(100);
+            this.wait(100); // ##### implicated BLOCKED
             if (pin2.available() == 0)
             {
               trimBuffer(false);
             }
           } catch (InterruptedException ie)
           {
+            jalview.bin.Console.debug("pin.available() error", ie);
           }
         }
         while (pin2.available() != 0)
@@ -692,7 +722,7 @@ public class Console extends WindowAdapter
                 trimBuffer(false);
               }
             }
-            
+
           }
           if (displayPipe.length() == 0)
           {
@@ -705,6 +735,7 @@ public class Console extends WindowAdapter
               }
             } catch (InterruptedException e)
             {
+              jalview.bin.Console.debug("displayPipe.length() error", e);
             }
           }
         }
@@ -715,7 +746,7 @@ public class Console extends WindowAdapter
             this.wait(100);
           } catch (InterruptedException e)
           {
-
+            jalview.bin.Console.debug("this.wait(100) error", e);
           }
         }
         if (quit)
@@ -742,6 +773,7 @@ public class Console extends WindowAdapter
         this.wait(1000);
       } catch (InterruptedException ie)
       {
+        jalview.bin.Console.debug("this.wait(1000) error", ie);
       }
       throw new NullPointerException(
               MessageManager.getString("exception.application_test_npe"));
@@ -785,7 +817,7 @@ public class Console extends WindowAdapter
                 + "\nTruncated...\n";
       } catch (Exception e)
       {
-        e.printStackTrace();
+        jalview.bin.Console.warn("textArea Exception", e);
       }
     }
     // trim the buffer
@@ -809,7 +841,7 @@ public class Console extends WindowAdapter
           }
         } catch (Exception e)
         {
-          e.printStackTrace();
+          jalview.bin.Console.warn("textArea Exception", e);
         }
         // lines = textArea.getLineCount();
       }
index e785431..b1f9000 100644 (file)
@@ -113,6 +113,9 @@ import jalview.api.structures.JalviewStructureDisplayI;
 import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.bin.Jalview.ExitCode;
+import jalview.bin.argparser.Arg;
+import jalview.bin.groovy.JalviewObject;
+import jalview.bin.groovy.JalviewObjectI;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.Sequence;
@@ -157,7 +160,7 @@ import jalview.ws.utils.UrlDownloadClient;
  */
 public class Desktop extends jalview.jbgui.GDesktop
         implements DropTargetListener, ClipboardOwner, IProgressIndicator,
-        jalview.api.StructureSelectionManagerProvider
+        jalview.api.StructureSelectionManagerProvider, JalviewObjectI
 {
   private static final String CITATION;
   static
@@ -498,7 +501,28 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     boolean selmemusage = Cache.getDefault("SHOW_MEMUSAGE", false);
 
-    boolean showjconsole = Cache.getDefault("SHOW_JAVA_CONSOLE", false);
+    boolean showjconsole = Cache.getArgCacheDefault(Arg.JAVACONSOLE,
+            "SHOW_JAVA_CONSOLE", false);
+
+    // start dialogue queue for single dialogues
+    startDialogQueue();
+
+    if (!Platform.isJS())
+    /**
+     * Java only
+     * 
+     * @j2sIgnore
+     */
+    {
+      Desktop.instance.acquireDialogQueue();
+
+      jconsole = new Console(this);
+      jconsole.setHeader(Cache.getVersionDetailsForConsole());
+      showConsole(showjconsole);
+
+      Desktop.instance.releaseDialogQueue();
+    }
+
     desktop = new MyDesktopPane(selmemusage);
 
     showMemusage.setSelected(selmemusage);
@@ -545,9 +569,6 @@ public class Desktop extends jalview.jbgui.GDesktop
       setBounds(xPos, yPos, 900, 650);
     }
 
-    // start dialogue queue for single dialogues
-    startDialogQueue();
-
     if (!Platform.isJS())
     /**
      * Java only
@@ -555,10 +576,6 @@ public class Desktop extends jalview.jbgui.GDesktop
      * @j2sIgnore
      */
     {
-      jconsole = new Console(this, showjconsole);
-      jconsole.setHeader(Cache.getVersionDetailsForConsole());
-      showConsole(showjconsole);
-
       showNews.setVisible(false);
 
       experimentalFeatures.setSelected(showExperimental());
@@ -787,17 +804,17 @@ public class Desktop extends jalview.jbgui.GDesktop
         iw = (int) (iw * sw);
         iy = (int) (iy * sh);
         ih = (int) (ih * sh);
-        while (ix >= screenSize.width)
+        if (ix >= screenSize.width)
         {
           jalview.bin.Console.debug(
                   "Window geometry location recall error: shifting horizontal to within screenbounds.");
-          ix -= screenSize.width;
+          ix = ix % screenSize.width;
         }
-        while (iy >= screenSize.height)
+        if (iy >= screenSize.height)
         {
           jalview.bin.Console.debug(
                   "Window geometry location recall error: shifting vertical to within screenbounds.");
-          iy -= screenSize.height;
+          iy = iy % screenSize.height;
         }
         jalview.bin.Console.debug(
                 "Got last known dimensions for " + windowName + ": x:" + ix
@@ -1041,7 +1058,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         {
           if (itf instanceof AlignFrame)
           {
-            Jalview.setCurrentAlignFrame((AlignFrame) itf);
+            Jalview.getInstance().setCurrentAlignFrame((AlignFrame) itf);
           }
           itf.requestFocus();
         }
@@ -1664,7 +1681,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       {
       }
     }
-    Jalview.setCurrentAlignFrame(null);
+    Jalview.getInstance().setCurrentAlignFrame(null);
     jalview.bin.Console.info("ALL CLOSED");
 
     /*
@@ -2123,7 +2140,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       return null;
     }
     List<AlignmentPanel> aps = new ArrayList<>();
-    AlignFrame[] frames = getAlignFrames();
+    AlignFrame[] frames = Desktop.getDesktopAlignFrames();
     if (frames == null)
     {
       return null;
@@ -2160,7 +2177,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     List<AlignmentViewport> viewp = new ArrayList<>();
     if (desktop != null)
     {
-      AlignFrame[] frames = Desktop.getAlignFrames();
+      AlignFrame[] frames = Desktop.getDesktopAlignFrames();
 
       for (AlignFrame afr : frames)
       {
@@ -2521,12 +2538,12 @@ public class Desktop extends jalview.jbgui.GDesktop
    * 
    * @return an array of AlignFrame, or null if none found
    */
-  public static AlignFrame[] getAlignFrames()
+  @Override
+  public AlignFrame[] getAlignFrames()
   {
-    if (Jalview.isHeadlessMode())
+    if (desktop == null)
     {
-      // Desktop.desktop is null in headless mode
-      return new AlignFrame[] { Jalview.currentAlignFrame };
+      return null;
     }
 
     JInternalFrame[] frames = Desktop.desktop.getAllFrames();
@@ -2568,6 +2585,25 @@ public class Desktop extends jalview.jbgui.GDesktop
   }
 
   /**
+   * static version
+   */
+  public static AlignFrame[] getDesktopAlignFrames()
+  {
+    if (Jalview.isHeadlessMode())
+    {
+      // Desktop.desktop is null in headless mode
+      return Jalview.getInstance().getAlignFrames();
+    }
+
+    if (instance != null && desktop != null)
+    {
+      return instance.getAlignFrames();
+    }
+
+    return null;
+  }
+
+  /**
    * Returns an array of any AppJmol frames in the Desktop (or null if none).
    * 
    * @return
@@ -2609,7 +2645,7 @@ public class Desktop extends jalview.jbgui.GDesktop
       openGroovyConsole();
     } catch (Exception ex)
     {
-      jalview.bin.Console.error("Groovy Shell Creation failed.", ex);
+      jalview.bin.Console.error("Groovy Console creation failed.", ex);
       JvOptionPane.showInternalMessageDialog(Desktop.desktop,
 
               MessageManager.getString("label.couldnt_create_groovy_shell"),
@@ -2625,8 +2661,10 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     if (groovyConsole == null)
     {
-      groovyConsole = new groovy.ui.Console();
-      groovyConsole.setVariable("Jalview", this);
+      JalviewObjectI j = new JalviewObject(this);
+      groovyConsole = new groovy.console.ui.Console();
+      groovyConsole.setVariable("Jalview", j);
+      groovyConsole.setVariable("currentAlFrame", getCurrentAlignFrame());
       groovyConsole.run();
 
       /*
@@ -2699,7 +2737,7 @@ public class Desktop extends jalview.jbgui.GDesktop
      */
     groovyShell.setEnabled(!enabled);
 
-    AlignFrame[] alignFrames = getAlignFrames();
+    AlignFrame[] alignFrames = getDesktopAlignFrames();
     if (alignFrames != null)
     {
       for (AlignFrame af : alignFrames)
@@ -3108,7 +3146,7 @@ public class Desktop extends jalview.jbgui.GDesktop
    */
   private Semaphore block = new Semaphore(0);
 
-  private static groovy.ui.Console groovyConsole;
+  private static groovy.console.ui.Console groovyConsole;
 
   /**
    * add another dialog thread to the queue
@@ -3370,7 +3408,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     myTopFrame.setDisplayedView(myTopFrame.alignPanel);
   }
 
-  public static groovy.ui.Console getGroovyConsole()
+  public static groovy.console.ui.Console getGroovyConsole()
   {
     return groovyConsole;
   }
@@ -3747,13 +3785,21 @@ public class Desktop extends jalview.jbgui.GDesktop
   public void nonBlockingDialog(String title, String message, String button,
           int type, boolean scrollable, boolean modal)
   {
-    nonBlockingDialog(32, 2, title, message, null, button, type, scrollable,
-            false, modal);
+    nonBlockingDialog(title, message, null, button, type, scrollable, false,
+            modal, -1);
+  }
+
+  public void nonBlockingDialog(String title, String message,
+          String boxtext, String button, int type, boolean scrollable,
+          boolean html, boolean modal, int timeout)
+  {
+    nonBlockingDialog(32, 2, title, message, boxtext, button, type,
+            scrollable, html, modal, timeout);
   }
 
   public void nonBlockingDialog(int width, int height, String title,
           String message, String boxtext, String button, int type,
-          boolean scrollable, boolean html, boolean modal)
+          boolean scrollable, boolean html, boolean modal, int timeout)
   {
     if (type < 0)
     {
@@ -3815,9 +3861,16 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     jvp.setResponseHandler(JOptionPane.YES_OPTION, () -> {
     });
+    jvp.setTimeout(timeout);
+    JButton jb = new JButton(button);
     jvp.showDialogOnTopAsync(this, jp, title, JOptionPane.YES_OPTION, type,
             null, new Object[]
-            { button }, button, modal, null, false);
+            { button }, button, modal, new JButton[] { jb }, false);
   }
 
+  @Override
+  public AlignFrame getCurrentAlignFrame()
+  {
+    return Jalview.getInstance().getCurrentAlignFrame();
+  }
 }
index 3f5de0a..7a5daf7 100644 (file)
@@ -88,6 +88,13 @@ public class JvOptionPane extends JOptionPane
 
   private Map<Object, Runnable> callbacks = new HashMap<>();
 
+  private int timeout = -1;
+
+  public void setTimeout(int i)
+  {
+    timeout = i;
+  }
+
   /*
    * JalviewJS reports user choice in the dialog as the selected option (text);
    * this list allows conversion to index (int)
@@ -851,6 +858,42 @@ public class JvOptionPane extends JOptionPane
                   "Supplied buttons array not the same length as supplied options array.");
           break NOTNULL;
         }
+
+        // run through buttons for initialValue first so we can set (and start)
+        // a final timeoutThreadF to include (and interrupt) in the button
+        // actions
+        Thread timeoutThread = null;
+        for (int i = 0; i < options.length; i++)
+        {
+          Object o = options[i];
+          JButton jb = buttons[i];
+          if (o.equals(initialValue))
+          {
+            if (timeout > 0 && jb != null && jb instanceof JButton)
+            {
+              // after timeout ms click the default button
+              timeoutThread = new Thread(() -> {
+                try
+                {
+                  Thread.sleep(timeout);
+                } catch (InterruptedException e)
+                {
+                  Console.debug(
+                          "Dialog timeout interrupted.  Probably a button pressed.");
+                }
+                jb.doClick();
+              });
+            }
+            initialValueButton = jb;
+            break;
+          }
+        }
+        final Thread timeoutThreadF = timeoutThread;
+        if (timeoutThreadF != null)
+        {
+          timeoutThreadF.start();
+        }
+
         int[] buttonActions = { JOptionPane.YES_OPTION,
             JOptionPane.NO_OPTION, JOptionPane.CANCEL_OPTION };
         for (int i = 0; i < options.length; i++)
@@ -860,9 +903,6 @@ public class JvOptionPane extends JOptionPane
                   "Setting button " + i + " to '" + o.toString() + "'");
           JButton jb = buttons[i];
 
-          if (o.equals(initialValue))
-            initialValueButton = jb;
-
           int buttonAction = buttonActions[i];
           Runnable action = callbacks.get(buttonAction);
           jb.setText((String) o);
@@ -871,6 +911,10 @@ public class JvOptionPane extends JOptionPane
             @Override
             public void actionPerformed(ActionEvent e)
             {
+              if (timeoutThreadF != null)
+              {
+                timeoutThreadF.interrupt();
+              }
 
               Object obj = e.getSource();
               if (obj == null || !(obj instanceof Component))
@@ -1290,6 +1334,7 @@ public class JvOptionPane extends JOptionPane
 
     // A better hack which works is to create a new JFrame parent with
     // setAlwaysOnTop(true)
+    boolean parentOnTop = dialogParent.isAlwaysOnTop();
     dialogParent.setAlwaysOnTop(true);
     parentComponent = dialogParent;
 
@@ -1297,6 +1342,8 @@ public class JvOptionPane extends JOptionPane
             JOPTIONPANE_MESSAGETYPE, icon, options, initialValue, modal,
             buttons);
 
+    dialogParent.setAlwaysOnTop(parentOnTop);
+
     if (dispose)
     {
       dialogParent.setAlwaysOnTop(false);
index ad7684e..6020135 100644 (file)
@@ -294,7 +294,7 @@ public class QuitHandler
       return QResponse.QUIT;
 
     int size = 0;
-    AlignFrame[] afArray = Desktop.getAlignFrames();
+    AlignFrame[] afArray = Desktop.getDesktopAlignFrames();
     if (!(afArray == null || afArray.length == 0))
     {
       for (int i = 0; i < afArray.length; i++)
index 52c1d18..1060d8a 100755 (executable)
@@ -342,7 +342,7 @@ public class SplashScreen extends JPanel
     try
     {
 
-      iframe.setClosed(true);
+      iframe.setClosed(true); // ##### implicated BLOCKED
     } catch (Exception ex)
     {
     }
index 196eb32..d8259f9 100644 (file)
@@ -1325,7 +1325,7 @@ public class WsJobParameters extends JPanel implements ItemListener,
    */
   protected void updateWebServiceMenus()
   {
-    for (AlignFrame alignFrame : Desktop.getAlignFrames())
+    for (AlignFrame alignFrame : Desktop.getDesktopAlignFrames())
     {
       alignFrame.BuildWebServiceMenu();
     }
index 6d00a7d..c983dfe 100644 (file)
@@ -28,4 +28,9 @@ public enum DataSourceType
   {
     return this != FILE;
   }
+
+  public boolean isUrl()
+  {
+    return this == URL || this == RELATIVE_URL;
+  }
 }
index dc7adac..b16c37f 100755 (executable)
@@ -361,8 +361,9 @@ public class FileLoader implements Runnable
           // We read the data anyway - it might make sense.
         }
         // BH 2018 switch to File object here instead of filename
-        alignFrame = new Jalview2XML(raiseGUI && !Jalview.isBatchMode()).loadJalviewAlign(
-                selectedFile == null ? file : selectedFile);
+        alignFrame = new Jalview2XML(raiseGUI && !Jalview.isBatchMode())
+                .loadJalviewAlign(
+                        selectedFile == null ? file : selectedFile);
       }
       else
       {
@@ -563,7 +564,8 @@ public class FileLoader implements Runnable
 
     } catch (Exception er)
     {
-      jalview.bin.Console.errPrintln("Exception whilst opening file '" + file);
+      jalview.bin.Console
+              .errPrintln("Exception whilst opening file '" + file);
       er.printStackTrace();
       if (raiseGUI && !Jalview.isBatchMode())
       {
@@ -603,7 +605,8 @@ public class FileLoader implements Runnable
           }
         });
       }
-      jalview.bin.Console.errPrintln("Out of memory loading file " + file + "!!");
+      jalview.bin.Console
+              .errPrintln("Out of memory loading file " + file + "!!");
 
     }
     loadtime += System.currentTimeMillis();
@@ -684,10 +687,18 @@ public class FileLoader implements Runnable
     AlignViewport avp = af.getViewport();
     if (avp == null)
       return;
-    avp.setSavedUpToDate(!protocol.isDynamic(),
-            QuitHandler.Message.UNSAVED_ALIGNMENTS);
+    boolean upToDate = !protocol.isDynamic();
+    if (protocol.isUrl() && !Cache
+            .getDefault(PROMPT_SAVE_UNCHANGED_URL_ALIGNMENTS, true))
+    {
+      upToDate = true;
+    }
+    avp.setSavedUpToDate(upToDate,
+            upToDate ? null : QuitHandler.Message.UNSAVED_ALIGNMENTS);
   }
 
+  public static final String PROMPT_SAVE_UNCHANGED_URL_ALIGNMENTS = "PROMPT_SAVE_UNCHANGED_URL_ALIGNMENTS";
+
   public static boolean getUseDefaultFileFormat()
   {
     return useDefaultFileFormat;
index c3776d3..46b75c8 100644 (file)
@@ -151,7 +151,7 @@ public class VamsasAppDatastore
   private void buildSkipList()
   {
     skipList = new Hashtable();
-    AlignFrame[] al = Desktop.getAlignFrames();
+    AlignFrame[] al = Desktop.getDesktopAlignFrames();
     for (int f = 0; al != null && f < al.length; f++)
     {
       skipList.put(al[f].getViewport().getSequenceSetId(), al[f]);
index af3b2c8..cc20fce 100644 (file)
@@ -631,7 +631,7 @@ public class Jalview2XML
    */
   public void saveState(JarOutputStream jout)
   {
-    AlignFrame[] frames = Desktop.getAlignFrames();
+    AlignFrame[] frames = Desktop.getDesktopAlignFrames();
 
     setStateSavedUpToDate(true);
 
@@ -6919,7 +6919,7 @@ public class Jalview2XML
     if (stateSavedUpToDate()) // nothing happened since last project save
       return true;
 
-    AlignFrame[] frames = Desktop.getAlignFrames();
+    AlignFrame[] frames = Desktop.getDesktopAlignFrames();
     if (frames != null)
     {
       for (int i = 0; i < frames.length; i++)
index c4e4b04..8b5240c 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.workers;
 
+import java.awt.Color;
+
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.bin.Jalview;
@@ -27,8 +29,6 @@ import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
 import jalview.gui.AlignFrame;
 
-import java.awt.Color;
-
 /**
  * Factory class with methods which allow clients (including external scripts
  * such as Groovy) to 'register and forget' an alignment annotation calculator.
@@ -52,7 +52,7 @@ public class AlignmentAnnotationFactory
    */
   public static void newCalculator(FeatureSetCounterI counter)
   {
-    AlignmentViewPanel currentAlignFrame = Jalview
+    AlignmentViewPanel currentAlignFrame = Jalview.getInstance()
             .getCurrentAlignFrame().alignPanel;
     if (currentAlignFrame == null)
     {
@@ -74,7 +74,8 @@ public class AlignmentAnnotationFactory
   {
     // TODO need an interface for AlignFrame by which to access
     // its AlignViewportI and AlignmentViewPanel
-    AlignFrame currentAlignFrame = Jalview.getCurrentAlignFrame();
+    AlignFrame currentAlignFrame = Jalview.getInstance()
+            .getCurrentAlignFrame();
     if (currentAlignFrame != null)
     {
       new AnnotationWorker(currentAlignFrame.getViewport(),
index ecec67d..de6185c 100644 (file)
@@ -111,13 +111,13 @@ public class CommandsTest
       Assert.assertEquals(cmds.argsWereParsed(), cmdArgs,
               "Overall command parse and operation is false");
 
-      Assert.assertEquals(Desktop.getAlignFrames().length, numFrames,
+      Assert.assertEquals(Desktop.getDesktopAlignFrames().length, numFrames,
               "Wrong number of AlignFrames");
 
       if (sequences != null)
       {
         Set<String> openedSequenceNames = new HashSet<>();
-        AlignFrame[] afs = Desktop.getAlignFrames();
+        AlignFrame[] afs = Desktop.getDesktopAlignFrames();
         for (AlignFrame af : afs)
         {
           openedSequenceNames.addAll(
@@ -325,7 +325,7 @@ public class CommandsTest
 
   public static boolean lookForSequenceName(String sequenceName)
   {
-    AlignFrame[] afs = Desktop.getAlignFrames();
+    AlignFrame[] afs = Desktop.getDesktopAlignFrames();
     for (AlignFrame af : afs)
     {
       for (String name : af.getViewport().getAlignment().getSequenceNames())
index ae14c1a..a78ca5a 100644 (file)
@@ -79,7 +79,7 @@ public class CommandsTest2
     }
     ;
 
-    AlignFrame[] afs = Desktop.getAlignFrames();
+    AlignFrame[] afs = Desktop.getDesktopAlignFrames();
     Assert.assertNotNull(afs);
     Assert.assertTrue(afs.length > 0);
 
index 5bf3507..f8fdb63 100644 (file)
@@ -135,7 +135,7 @@ public class DesktopTests
     {
       Assert.fail("Unexpected exception " + x);
     }
-    AlignFrame[] alfs = Desktop.getAlignFrames();
+    AlignFrame[] alfs = Desktop.getDesktopAlignFrames();
     Assert.assertEquals("Expect just 2 alignment frames", 2, alfs.length);
     // internal paste should yield a new alignment window with shared dataset
     AlignmentI dataset = internalSource.getViewport().getAlignment()
index c46477a..34cc17f 100644 (file)
@@ -186,7 +186,7 @@ public class CrossRef2xmlTests extends Jalview2xmlBase
         SequenceFetcher sf = new SequenceFetcher(Desktop.instance,
                 forSource, forAccession);
         sf.run();
-        AlignFrame[] afs = Desktop.getAlignFrames();
+        AlignFrame[] afs = Desktop.getDesktopAlignFrames();
         if (afs.length == 0)
         {
           failedDBRetr.add("Didn't retrieve " + first);
index c9532cc..aa4be3d 100644 (file)
@@ -287,12 +287,12 @@ public class Jalview2xmlTests extends Jalview2xmlBase
   @Test(groups = { "Functional" })
   public void gatherViewsHere() throws Exception
   {
-    int origCount = Desktop.getAlignFrames() == null ? 0
-            : Desktop.getAlignFrames().length;
+    int origCount = Desktop.getDesktopAlignFrames() == null ? 0
+            : Desktop.getDesktopAlignFrames().length;
     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
             "examples/exampleFile_2_7.jar", DataSourceType.FILE);
     assertNotNull(af, "Didn't read in the example file correctly.");
-    assertTrue(Desktop.getAlignFrames().length == 1 + origCount,
+    assertTrue(Desktop.getDesktopAlignFrames().length == 1 + origCount,
             "Didn't gather the views in the example file.");
 
   }
@@ -430,7 +430,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase
 
     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
             "examples/exampleFile_2_7.jar", DataSourceType.FILE);
-    Assert.assertEquals(Desktop.getAlignFrames().length, 1);
+    Assert.assertEquals(Desktop.getDesktopAlignFrames().length, 1);
     String afid = af.getViewport().getSequenceSetId();
 
     // check FileLoader returned a reference to the one alignFrame that is
@@ -440,8 +440,8 @@ public class Jalview2xmlTests extends Jalview2xmlBase
 
     Desktop.explodeViews(af);
 
-    int oldviews = Desktop.getAlignFrames().length;
-    Assert.assertEquals(Desktop.getAlignFrames().length,
+    int oldviews = Desktop.getDesktopAlignFrames().length;
+    Assert.assertEquals(Desktop.getDesktopAlignFrames().length,
             Desktop.getAlignmentPanels(afid).length);
     File tfile = File.createTempFile("testStoreAndRecoverExpanded", ".jvp");
     try
@@ -455,14 +455,14 @@ public class Jalview2xmlTests extends Jalview2xmlBase
       Assert.fail("Didn't save the expanded view state", e);
     }
     Desktop.instance.closeAll_actionPerformed(null);
-    if (Desktop.getAlignFrames() != null)
+    if (Desktop.getDesktopAlignFrames() != null)
     {
-      Assert.assertEquals(Desktop.getAlignFrames().length, 0);
+      Assert.assertEquals(Desktop.getDesktopAlignFrames().length, 0);
     }
     af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
             DataSourceType.FILE);
     Assert.assertNotNull(af);
-    Assert.assertEquals(Desktop.getAlignFrames().length,
+    Assert.assertEquals(Desktop.getDesktopAlignFrames().length,
             Desktop.getAlignmentPanels(
                     af.getViewport().getSequenceSetId()).length);
     Assert.assertEquals(Desktop
@@ -519,9 +519,9 @@ public class Jalview2xmlTests extends Jalview2xmlBase
       Assert.fail("Didn't save the expanded view state", e);
     }
     Desktop.instance.closeAll_actionPerformed(null);
-    if (Desktop.getAlignFrames() != null)
+    if (Desktop.getDesktopAlignFrames() != null)
     {
-      Assert.assertEquals(Desktop.getAlignFrames().length, 0);
+      Assert.assertEquals(Desktop.getDesktopAlignFrames().length, 0);
     }
 
     af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
@@ -698,9 +698,9 @@ public class Jalview2xmlTests extends Jalview2xmlBase
       Assert.fail("Didn't save the expanded view state", e);
     }
     Desktop.instance.closeAll_actionPerformed(null);
-    if (Desktop.getAlignFrames() != null)
+    if (Desktop.getDesktopAlignFrames() != null)
     {
-      Assert.assertEquals(Desktop.getAlignFrames().length, 0);
+      Assert.assertEquals(Desktop.getDesktopAlignFrames().length, 0);
     }
 
     af = new FileLoader().LoadFileWaitTillLoaded(tfile.getAbsolutePath(),
@@ -792,9 +792,9 @@ public class Jalview2xmlTests extends Jalview2xmlBase
       Assert.fail("Didn't save the state", e);
     }
     Desktop.instance.closeAll_actionPerformed(null);
-    if (Desktop.getAlignFrames() != null)
+    if (Desktop.getDesktopAlignFrames() != null)
     {
-      Assert.assertEquals(Desktop.getAlignFrames().length, 0);
+      Assert.assertEquals(Desktop.getDesktopAlignFrames().length, 0);
     }
 
     AlignFrame restoredFrame = new FileLoader().LoadFileWaitTillLoaded(
@@ -1217,7 +1217,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase
     assertNotNull(af);
 
     AlignmentI ds = null;
-    for (AlignFrame alignFrame : Desktop.getAlignFrames())
+    for (AlignFrame alignFrame : Desktop.getDesktopAlignFrames())
     {
       if (ds == null)
       {
index 53f98c3..0472317 100644 (file)
@@ -638,7 +638,7 @@ public class FeatureRendererTest
     /*
      * find the complement frames (ugly)
      */
-    AlignFrame[] frames = Desktop.getAlignFrames();
+    AlignFrame[] frames = Desktop.getDesktopAlignFrames();
     assertEquals(frames.length, 2);
     AlignViewport av1 = frames[0].getViewport();
     AlignViewport av2 = frames[1].getViewport();