Merge branch 'develop' into task/JAL-3796_notarization
authorJalview Development Admin <jalview-dev-owner@jalview.org>
Fri, 5 Mar 2021 17:18:14 +0000 (17:18 +0000)
committerJalview Development Admin <jalview-dev-owner@jalview.org>
Fri, 5 Mar 2021 17:18:14 +0000 (17:18 +0000)
33 files changed:
build.gradle
src/jalview/bin/Cache.java
src/jalview/ext/rbvi/chimera/ChimeraXCommands.java
src/jalview/gui/Desktop.java
src/jalview/gui/JalviewChimeraXBindingModel.java
src/jalview/gui/SeqCanvas.java
src/jalview/gui/SeqPanel.java
src/jalview/jbgui/GPreferences.java
src/jalview/util/ChannelProperties.java
test/jalview/ext/rbvi/chimera/ChimeraXCommandsTest.java
test/jalview/gui/SeqPanelTest.java
utils/channels/default/resources/channel.props
utils/channels/develop/resources/channel.props
utils/channels/jalviewjs/resources/channel.props
utils/channels/release/images/jalview_dmg_DS_Store
utils/channels/release/resources/channel.props
utils/channels/test-release/images/jalview_test-release_dmg_DS_Store
utils/channels/test-release/resources/channel.props
utils/install4j/DS_Store [deleted file]
utils/install4j/DS_Store-DEVELOP [deleted file]
utils/install4j/DS_Store-NON-RELEASE [deleted file]
utils/install4j/DS_Store-TEST-RELEASE [deleted file]
utils/install4j/DS_Store_no_link [deleted file]
utils/install4j/Uninstall Old Jalview.app/Contents/Info.plist [deleted file]
utils/install4j/Uninstall Old Jalview.app/Contents/MacOS/applet [deleted file]
utils/install4j/Uninstall Old Jalview.app/Contents/PkgInfo [deleted file]
utils/install4j/Uninstall Old Jalview.app/Contents/Resources/Scripts/main.scpt [deleted file]
utils/install4j/Uninstall Old Jalview.app/Contents/Resources/applet.icns [deleted file]
utils/install4j/Uninstall Old Jalview.app/Contents/Resources/applet.rsrc [deleted file]
utils/install4j/Uninstall Old Jalview.app/Contents/Resources/description.rtfd/TXT.rtf [deleted file]
utils/install4j/Uninstall Old Jalview.app/Contents/_CodeSignature/CodeResources [deleted file]
utils/install4j/Uninstall Old Jalview.scpt [deleted file]
utils/install4j/install4j8_template.install4j

index e030ec8..e2a5605 100644 (file)
@@ -1837,12 +1837,6 @@ task copyInstall4jTemplate {
       }
     }
 
-    // remove the "Uninstall Old Jalview (optional)" symlink from DMG for non-release DS_Stores
-    if (! (CHANNEL == "RELEASE" || CHANNEL == "TEST-RELEASE" ) ) {
-      def symlink = install4jConfigXml.'**'.topLevelFiles.symlink.find { sl -> sl.'@name' == "Uninstall Old Jalview (optional).app" }
-      symlink.parent().remove(symlink)
-    }
-
     // write install4j file
     install4jConfFile.text = XmlUtil.serialize(install4jConfigXml)
   }
@@ -1976,7 +1970,8 @@ spotless {
 task sourceDist(type: Tar) {
   group "distribution"
   description "Create a source .tar.gz file for distribution"
-  
+
+  dependsOn createBuildProperties
   dependsOn convertMdFiles
 
   def VERSION_UNDERSCORES = JALVIEW_VERSION.replaceAll("\\.", "_")
@@ -2064,6 +2059,15 @@ task sourceDist(type: Tar) {
 //    exclude(EXCLUDE_FILES)
 //    exclude(PROCESS_FILES)
 //  }
+
+  from(file(buildProperties).getParent()) {
+    include(file(buildProperties).getName())
+    rename(file(buildProperties).getName(), "build_properties")
+    filter({ line ->
+      line.replaceAll("^INSTALLATION=.*\$","INSTALLATION=Source Release"+" git-commit\\\\:"+gitHash+" ["+gitBranch+"]")
+    })
+  }
+
 }
 
 
index 4a83b35..353f449 100755 (executable)
@@ -376,10 +376,18 @@ public class Cache
   public static void loadProperties(String propsFile)
   {
     propertiesFile = propsFile;
+    String releasePropertiesFile = null;
+    boolean defaultProperties = false;
     if (propsFile == null && !propsAreReadOnly)
     {
+      String channelPrefsFilename = ChannelProperties
+              .getProperty("preferences.filename");
+      String releasePrefsFilename = ".jalview_properties";
       propertiesFile = System.getProperty("user.home") + File.separatorChar
-              + ".jalview_properties";
+              + channelPrefsFilename;
+      releasePropertiesFile = System.getProperty("user.home")
+              + File.separatorChar + releasePrefsFilename;
+      defaultProperties = true;
     }
     else
     {
@@ -399,20 +407,29 @@ public class Cache
         InputStream fis;
         try
         {
+          // props file provided as URL
           fis = new URL(propertiesFile).openStream();
           System.out.println(
                   "Loading jalview properties from : " + propertiesFile);
           System.out.println(
                   "Disabling Jalview writing to user's local properties file.");
           propsAreReadOnly = true;
-
         } catch (Exception ex)
         {
           fis = null;
         }
         if (fis == null)
         {
-          fis = new FileInputStream(propertiesFile);
+          String readPropertiesFile = propertiesFile;
+          // if we're using the usual properties file and the channel properties
+          // file doesn't exist, read .jalview_properties
+          // (but we'll still save to the channel properties file).
+          if (defaultProperties && (!new File(propertiesFile).exists())
+                  && (new File(releasePropertiesFile).exists()))
+          {
+            readPropertiesFile = releasePropertiesFile;
+          }
+          fis = new FileInputStream(readPropertiesFile);
         }
         applicationProperties.clear();
         applicationProperties.load(fis);
index 314e6db..ad04fc9 100644 (file)
@@ -28,7 +28,6 @@ import java.util.List;
 import jalview.structure.AtomSpecModel;
 import jalview.structure.StructureCommand;
 import jalview.structure.StructureCommandI;
-import jalview.util.ColorUtils;
 
 /**
  * Routines for generating ChimeraX commands for Jalview/ChimeraX binding
@@ -250,7 +249,7 @@ public class ChimeraXCommands extends ChimeraCommands
   public List<StructureCommandI> startNotifications(String uri)
   {
     List<StructureCommandI> cmds = new ArrayList<>();
-    cmds.add(new StructureCommand("info notify start models prefix ModelChanged jalview url " + uri));
+    cmds.add(new StructureCommand("info notify start models jalview prefix ModelChanged url " + uri));
     cmds.add(new StructureCommand("info notify start selection jalview prefix SelectionChanged url " + uri));
     return cmds;
   }
index abe1fad..195a313 100644 (file)
@@ -54,8 +54,10 @@ import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
@@ -394,24 +396,61 @@ public class Desktop extends jalview.jbgui.GDesktop
     doConfigureStructurePrefs();
     setTitle(ChannelProperties.getProperty("app_name") + " "
             + Cache.getProperty("VERSION"));
-    /*
-    if (!Platform.isAMac())
-    {
-      // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
-    }
-    else
+
+    /**
+     * Set taskbar "grouped windows" name for linux desktops (works in GNOME and KDE).
+     * This uses sun.awt.X11.XToolkit.awtAppClassName which is not officially documented or
+     * guaranteed to exist, so we access it via reflection.
+     * There appear to be unfathomable criteria about what this string can contain, and it if doesn't
+     * meet those criteria then "java" (KDE) or "jalview-bin-Jalview" (GNOME) is used.
+     * "Jalview", "Jalview Develop" and "Jalview Test" seem okay, but "Jalview non-release" does not.
+     * The reflection access may generate a warning:
+     * WARNING: An illegal reflective access operation has occurred
+     * WARNING: Illegal reflective access by jalview.gui.Desktop () to field sun.awt.X11.XToolkit.awtAppClassName
+     * which I don't think can be avoided.
+     */
+    if (Platform.isLinux())
     {
-     this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+      try
+      {
+        Toolkit xToolkit = Toolkit.getDefaultToolkit();
+        Field[] declaredFields = xToolkit.getClass().getDeclaredFields();
+        Field awtAppClassNameField = null;
+
+        if (Arrays.stream(declaredFields).anyMatch(f -> f.getName().equals("awtAppClassName")))
+        {
+          awtAppClassNameField = xToolkit.getClass()
+                  .getDeclaredField("awtAppClassName");
+        }
+
+        String title = ChannelProperties.getProperty("app_name");
+        if (awtAppClassNameField != null)
+        {
+          awtAppClassNameField.setAccessible(true);
+          awtAppClassNameField.set(xToolkit, title);
+        }
+        else
+        {
+          Cache.log.debug("XToolkit: awtAppClassName not found");
+        }
+      } catch (Exception e)
+      {
+        Cache.debug("Error setting awtAppClassName");
+        Cache.trace(Cache.getStackTraceString(e));
+      }
     }
-    */
 
+    /**
+     * APQHandlers sets handlers for About, Preferences and Quit actions peculiar to macOS's application menu.
+     * APQHandlers will check to see if a handler is supported before setting it.
+     */
     try
     {
       APQHandlers.setAPQHandlers(this);
     } catch (Throwable t)
     {
-      System.out.println("Error setting APQHandlers: " + t.toString());
-      // t.printStackTrace();
+      Cache.warn("Error setting APQHandlers: " + t.toString());
+      Cache.trace(Cache.getStackTraceString(t));
     }
     setIconImages(ChannelProperties.getIconList());
 
index 5b7a928..cfd44c7 100644 (file)
@@ -42,7 +42,7 @@ public class JalviewChimeraXBindingModel extends JalviewChimeraBindingModel
     int modelNumber = chimeraMaps.size() + 1;
     String command = "setattr #" + modelNumber + " models name "
             + pe.getId();
-    executeCommand(new StructureCommand(command), false);
+   executeCommand(new StructureCommand(command), false);
     modelsToMap.add(new ChimeraModel(pe.getId(), ModelType.PDB_MODEL,
             modelNumber, 0));
   }
@@ -93,6 +93,7 @@ public class JalviewChimeraXBindingModel extends JalviewChimeraBindingModel
    * @param atomSpec
    * @return
    */
+  @Override
   protected AtomSpec parseAtomSpec(String atomSpec)
   {
     return AtomSpec.fromChimeraXAtomspec(atomSpec);
index b27208a..a9b9d4d 100755 (executable)
@@ -456,7 +456,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
 
       if (av.getWrapAlignment())
       {
-        drawWrappedPanel(gg, width, height, ranges.getStartRes());
+        drawWrappedPanel(gg, getWidth(), getHeight(), ranges.getStartRes());
       }
       else
       {
index 4ffefba..163ae25 100644 (file)
@@ -275,6 +275,9 @@ public class SeqPanel extends JPanel
   /**
    * Computes the column and sequence row (and possibly annotation row when in
    * wrapped mode) for the given mouse position
+   * <p>
+   * Mouse position is not set if in wrapped mode with the cursor either between
+   * sequences, or over the left or right vertical scale.
    * 
    * @param evt
    * @return
@@ -342,6 +345,9 @@ public class SeqPanel extends JPanel
   /**
    * Returns the aligned sequence position (base 0) at the mouse position, or
    * the closest visible one
+   * <p>
+   * Returns -1 if in wrapped mode with the mouse over either left or right
+   * vertical scale.
    * 
    * @param evt
    * @return
index 5af94e4..1a4a44b 100755 (executable)
@@ -1799,6 +1799,14 @@ public class GPreferences extends JPanel
     String choice = null;
     JFileChooser chooser = new JFileChooser();
 
+    // Enable appBundleIsTraversable in macOS FileChooser to allow selecting
+    // hidden executables within .app dirs
+    if (Platform.isMac())
+    {
+      chooser.putClientProperty("JFileChooser.appBundleIsTraversable",
+              true);
+    }
+
     // chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(
             MessageManager.getString("label.open_local_file"));
index ede528f..109eaa5 100644 (file)
@@ -55,6 +55,7 @@ public class ChannelProperties
     defaultProps.put("uod_banner.32", "/default_images/UoD_banner-32.png");
     defaultProps.put("default_appbase",
             "https://www.jalview.org/getdown/release/1.8");
+    defaultProps.put("preferences.filename", ".jalview_properties");
 
     // load channel_properties
     Properties tryChannelProps = new Properties();
@@ -63,12 +64,11 @@ public class ChannelProperties
     if (channelPropsURL == null)
     {
       // complete failure of channel_properties, set all properties to defaults
-      System.err
-              .println("Failed to find '" + CHANNEL_PROPERTIES_FILENAME
-                      + "' file at '"
-                      + (channelPropsURL == null ? "null"
-                              : channelPropsURL.toString())
-                      + "'. Using class defaultProps.");
+      System.err.println("Failed to find '" + CHANNEL_PROPERTIES_FILENAME
+              + "' file at '"
+              + (channelPropsURL == null ? "null"
+                      : channelPropsURL.toString())
+              + "'. Using class defaultProps.");
       tryChannelProps = defaultProps;
     }
     else
index f677cab..439401a 100644 (file)
@@ -342,7 +342,7 @@ public class ChimeraXCommandsTest
   {
     List<StructureCommandI> cmds = testee.startNotifications("to here");
     assertEquals(cmds.size(), 2);
-    assertEquals(cmds.get(0), new StructureCommand("info notify start models prefix ModelChanged jalview url to here"));
+    assertEquals(cmds.get(0), new StructureCommand("info notify start models jalview prefix ModelChanged url to here"));
     assertEquals(cmds.get(1), new StructureCommand("info notify start selection jalview prefix SelectionChanged url to here"));
   }
 
index a03819d..b0fc116 100644 (file)
@@ -24,6 +24,17 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
+import java.awt.EventQueue;
+import java.awt.FontMetrics;
+import java.awt.event.MouseEvent;
+import java.lang.reflect.InvocationTargetException;
+
+import javax.swing.JLabel;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
 import jalview.api.AlignViewportI;
 import jalview.bin.Cache;
 import jalview.bin.Jalview;
@@ -33,6 +44,8 @@ import jalview.commands.EditCommand.Edit;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 import jalview.gui.SeqPanel.MousePos;
@@ -40,17 +53,6 @@ import jalview.io.DataSourceType;
 import jalview.io.FileLoader;
 import jalview.util.MessageManager;
 import jalview.viewmodel.ViewportRanges;
-
-import java.awt.EventQueue;
-import java.awt.event.MouseEvent;
-import java.lang.reflect.InvocationTargetException;
-
-import javax.swing.JLabel;
-
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
 import junit.extensions.PA;
 
 public class SeqPanelTest
@@ -635,6 +637,7 @@ public class SeqPanelTest
   {
     Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS", "false");
     Cache.applicationProperties.setProperty("WRAP_ALIGNMENT", "true");
+    Cache.applicationProperties.setProperty("FONT_SIZE", "10");
     AlignFrame alignFrame = new FileLoader().LoadFileWaitTillLoaded(
             "examples/uniref50.fa", DataSourceType.FILE);
     AlignViewportI av = alignFrame.getViewport();
@@ -902,4 +905,157 @@ public class SeqPanelTest
       e.printStackTrace();
     }
   }
+  @Test(groups = "Functional")
+  public void testFindMousePosition_wrapped_scales_longSequence()
+  {
+    Cache.applicationProperties.setProperty("SHOW_ANNOTATIONS", "false");
+    Cache.applicationProperties.setProperty("WRAP_ALIGNMENT", "true");
+    Cache.applicationProperties.setProperty("FONT_SIZE", "14");
+    Cache.applicationProperties.setProperty("FONT_NAME", "SansSerif");
+    Cache.applicationProperties.setProperty("FONT_STYLE", "0");
+    // sequence of 50 bases, doubled 10 times, = 51200 bases
+    String dna = "ATGGCCATTGGGCCCAAATTTCCCAAAGGGTTTCCCTGAGGTCAGTCAGA";
+    for (int i = 0 ; i < 10 ; i++)
+    {
+      dna += dna;
+    }
+    assertEquals(dna.length(), 51200);
+    AlignFrame alignFrame = new FileLoader()
+            .LoadFileWaitTillLoaded(dna, DataSourceType.PASTE);
+    SeqPanel testee = alignFrame.alignPanel.getSeqPanel();
+    AlignViewport av = alignFrame.getViewport();
+    av.setScaleAboveWrapped(true);
+    av.setScaleLeftWrapped(true);
+    av.setScaleRightWrapped(true);
+    alignFrame.alignPanel.updateLayout();
+
+    try
+    {
+      Thread.sleep(200);
+    } catch (InterruptedException e)
+    {
+    }
+  
+    final int charHeight = av.getCharHeight();
+    final int charWidth = av.getCharWidth();
+    assertEquals(charHeight, 17);
+    assertEquals(charWidth, 12);
+    
+    FontMetrics fm = testee.getFontMetrics(av.getFont());
+    int labelWidth = fm.stringWidth("00000") + charWidth;
+    assertEquals(labelWidth, 57); // 5 x 9 + charWidth
+    assertEquals(testee.seqCanvas.getLabelWidthWest(), labelWidth);
+
+    int x = 0;
+    int y = 0;
+  
+    /*
+     * mouse at top left of wrapped panel; there is a gap of 2 * charHeight
+     * above the alignment
+     */
+    MouseEvent evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y,
+            0, 0, 0, false, 0);
+    MousePos pos = testee.findMousePosition(evt);
+    assertEquals(pos.column, -1); // over scale left, not an alignment column
+    assertEquals(pos.seqIndex, -1); // above sequences
+    assertEquals(pos.annotationIndex, -1);
+
+    /*
+     * cursor over scale above first sequence
+     */
+    y += charHeight;
+    x = labelWidth;
+    evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y, 0, 0, 0,
+            false, 0);
+    pos = testee.findMousePosition(evt);
+    assertEquals(pos.seqIndex, -1);
+    assertEquals(pos.column, 0);
+    assertEquals(pos.annotationIndex, -1);
+    
+    /*
+     * cursor over scale left of first sequence
+     */
+    y += charHeight;
+    x = 0;
+    evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y, 0, 0, 0,
+            false, 0);
+    pos = testee.findMousePosition(evt);
+    assertEquals(pos.seqIndex, 0);
+    assertEquals(pos.column, -1);
+    assertEquals(pos.annotationIndex, -1);
+  
+    /*
+     * cursor over start of first sequence
+     */
+    x = labelWidth;
+    evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y, 0, 0, 0,
+            false, 0);
+    pos = testee.findMousePosition(evt);
+    assertEquals(pos.seqIndex, 0);
+    assertEquals(pos.column, 0);
+    assertEquals(pos.annotationIndex, -1);
+  
+    /*
+     * move one character right, to bottom pixel of same row
+     */
+    x += charWidth;
+    y += charHeight - 1;
+    evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y, 0, 0, 0,
+            false, 0);
+    pos = testee.findMousePosition(evt);
+    assertEquals(pos.seqIndex, 0);
+    assertEquals(pos.column, 1);
+    
+    /*
+     * move down one pixel - now in the no man's land between rows
+     */
+    y += 1;
+    evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y, 0, 0, 0,
+            false, 0);
+    pos = testee.findMousePosition(evt);
+    assertEquals(pos.seqIndex, -1);
+    assertEquals(pos.column, 1);
+    
+    /*
+     * move down two char heights less one pixel - still in the no man's land
+     * (scale above + spacer line)
+     */
+    y += (2 * charHeight - 1);
+    evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y, 0, 0, 0,
+            false, 0);
+    pos = testee.findMousePosition(evt);
+    assertEquals(pos.seqIndex, -1);
+    assertEquals(pos.column, 1);
+    
+    /*
+     * move down one more pixel - now on the next row of the sequence
+     */
+    y += 1;
+    evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y, 0, 0, 0,
+            false, 0);
+    pos = testee.findMousePosition(evt);
+    assertEquals(pos.seqIndex, 0);
+    assertEquals(pos.column, 1 + av.getWrappedWidth());
+    
+    /*
+     * scroll to near the end of the sequence
+     */
+    SearchResultsI sr = new SearchResults();
+    int scrollTo = dna.length() - 1000;
+    sr.addResult(av.getAlignment().getSequenceAt(0), scrollTo, scrollTo); 
+    alignFrame.alignPanel.scrollToPosition(sr);
+    
+    /*
+     * place the mouse on the first column of the 6th sequence, and
+     * verify that (computed) findMousePosition matches (actual) ViewportRanges
+     */
+    x = labelWidth;
+    y = 17 * charHeight; // 17 = 6 times two header rows and 5 sequence rows
+    evt = new MouseEvent(testee, MouseEvent.MOUSE_MOVED, 0L, 0, x, y, 0, 0, 0,
+            false, 0);
+    pos = testee.findMousePosition(evt);
+    assertEquals(pos.seqIndex, 0);
+    int expected = av.getRanges().getStartRes() + 5 * av.getWrappedWidth();
+    assertEquals(pos.column, expected);
+  }
 }
index 4e6d27a..3e7e153 100644 (file)
@@ -16,3 +16,4 @@ uod_banner.28=/images/UoD_banner-28.png
 uod_banner.30=/images/UoD_banner-30.png
 uod_banner.32=/images/UoD_banner-32.png
 default_appbase=https://www.jalview.org/getdown/release/1.8
+preferences.filename=.jalview_properties
index fa848de..8af68fa 100644 (file)
@@ -16,3 +16,4 @@ uod_banner.28=/images/UoD_banner-28.png
 uod_banner.30=/images/UoD_banner-30.png
 uod_banner.32=/images/UoD_banner-32.png
 default_appbase=https://www.jalview.org/getdown/develop/11
+preferences.filename=.jalview_develop_properties
index 02e117d..8195dc8 100644 (file)
@@ -16,3 +16,4 @@ uod_banner.28=/images/UoD_banner-28.png
 uod_banner.30=/images/UoD_banner-30.png
 uod_banner.32=/images/UoD_banner-32.png
 default_appbase=https://www.jalview.org/getdown/release/1.8
+preferences.filename=.jalview_properties
index 75cd04d..8af46f4 100644 (file)
Binary files a/utils/channels/release/images/jalview_dmg_DS_Store and b/utils/channels/release/images/jalview_dmg_DS_Store differ
index d19b281..abdfd3f 100644 (file)
@@ -16,3 +16,4 @@ uod_banner.28=/images/UoD_banner-28.png
 uod_banner.30=/images/UoD_banner-30.png
 uod_banner.32=/images/UoD_banner-32.png
 default_appbase=https://www.jalview.org/getdown/release/1.8
+preferences.filename=.jalview_properties
index 1603317..570778e 100644 (file)
Binary files a/utils/channels/test-release/images/jalview_test-release_dmg_DS_Store and b/utils/channels/test-release/images/jalview_test-release_dmg_DS_Store differ
index 3ef86d3..0ab4f86 100644 (file)
@@ -16,3 +16,4 @@ uod_banner.28=/images/UoD_banner-28.png
 uod_banner.30=/images/UoD_banner-30.png
 uod_banner.32=/images/UoD_banner-32.png
 default_appbase=https://www.jalview.org/getdown/release/1.8
+preferences.filename=.jalview_properties
diff --git a/utils/install4j/DS_Store b/utils/install4j/DS_Store
deleted file mode 100644 (file)
index cada68d..0000000
Binary files a/utils/install4j/DS_Store and /dev/null differ
diff --git a/utils/install4j/DS_Store-DEVELOP b/utils/install4j/DS_Store-DEVELOP
deleted file mode 100644 (file)
index a65165c..0000000
Binary files a/utils/install4j/DS_Store-DEVELOP and /dev/null differ
diff --git a/utils/install4j/DS_Store-NON-RELEASE b/utils/install4j/DS_Store-NON-RELEASE
deleted file mode 100644 (file)
index 0d67d11..0000000
Binary files a/utils/install4j/DS_Store-NON-RELEASE and /dev/null differ
diff --git a/utils/install4j/DS_Store-TEST-RELEASE b/utils/install4j/DS_Store-TEST-RELEASE
deleted file mode 100644 (file)
index 164c584..0000000
Binary files a/utils/install4j/DS_Store-TEST-RELEASE and /dev/null differ
diff --git a/utils/install4j/DS_Store_no_link b/utils/install4j/DS_Store_no_link
deleted file mode 100644 (file)
index afa9a35..0000000
Binary files a/utils/install4j/DS_Store_no_link and /dev/null differ
diff --git a/utils/install4j/Uninstall Old Jalview.app/Contents/Info.plist b/utils/install4j/Uninstall Old Jalview.app/Contents/Info.plist
deleted file mode 100644 (file)
index 649770d..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>CFBundleAllowMixedLocalizations</key>
-       <true/>
-       <key>CFBundleDevelopmentRegion</key>
-       <string>English</string>
-       <key>CFBundleExecutable</key>
-       <string>applet</string>
-       <key>CFBundleIconFile</key>
-       <string>applet</string>
-       <key>CFBundleIdentifier</key>
-       <string>com.apple.ScriptEditor.id.Uninstall-Old-Jalview</string>
-       <key>CFBundleInfoDictionaryVersion</key>
-       <string>6.0</string>
-       <key>CFBundleName</key>
-       <string>Uninstall Old Jalview</string>
-       <key>CFBundlePackageType</key>
-       <string>APPL</string>
-       <key>CFBundleShortVersionString</key>
-       <string>1.0</string>
-       <key>CFBundleSignature</key>
-       <string>aplt</string>
-       <key>LSMinimumSystemVersionByArchitecture</key>
-       <dict>
-               <key>x86_64</key>
-               <string>10.6</string>
-       </dict>
-       <key>LSRequiresCarbon</key>
-       <true/>
-       <key>NSAppleEventsUsageDescription</key>
-       <string>This script needs to control other applications to run.</string>
-       <key>NSAppleMusicUsageDescription</key>
-       <string>This script needs access to your music to run.</string>
-       <key>NSCalendarsUsageDescription</key>
-       <string>This script needs access to your calendars to run.</string>
-       <key>NSCameraUsageDescription</key>
-       <string>This script needs access to your camera to run.</string>
-       <key>NSContactsUsageDescription</key>
-       <string>This script needs access to your contacts to run.</string>
-       <key>NSHomeKitUsageDescription</key>
-       <string>This script needs access to your HomeKit Home to run.</string>
-       <key>NSMicrophoneUsageDescription</key>
-       <string>This script needs access to your microphone to run.</string>
-       <key>NSPhotoLibraryUsageDescription</key>
-       <string>This script needs access to your photos to run.</string>
-       <key>NSRemindersUsageDescription</key>
-       <string>This script needs access to your reminders to run.</string>
-       <key>NSSiriUsageDescription</key>
-       <string>This script needs access to Siri to run.</string>
-       <key>NSSystemAdministrationUsageDescription</key>
-       <string>This script needs access to administer this system to run.</string>
-       <key>WindowState</key>
-       <dict>
-               <key>bundleDividerCollapsed</key>
-               <true/>
-               <key>bundlePositionOfDivider</key>
-               <real>0.0</real>
-               <key>dividerCollapsed</key>
-               <true/>
-               <key>eventLogLevel</key>
-               <integer>2</integer>
-               <key>name</key>
-               <string>ScriptWindowState</string>
-               <key>positionOfDivider</key>
-               <real>421</real>
-               <key>savedFrame</key>
-               <string>272 342 1754 910 0 0 3360 1867 </string>
-               <key>selectedTab</key>
-               <string>result</string>
-       </dict>
-</dict>
-</plist>
diff --git a/utils/install4j/Uninstall Old Jalview.app/Contents/MacOS/applet b/utils/install4j/Uninstall Old Jalview.app/Contents/MacOS/applet
deleted file mode 100755 (executable)
index dd27e88..0000000
Binary files a/utils/install4j/Uninstall Old Jalview.app/Contents/MacOS/applet and /dev/null differ
diff --git a/utils/install4j/Uninstall Old Jalview.app/Contents/PkgInfo b/utils/install4j/Uninstall Old Jalview.app/Contents/PkgInfo
deleted file mode 100644 (file)
index 3253614..0000000
+++ /dev/null
@@ -1 +0,0 @@
-APPLaplt
\ No newline at end of file
diff --git a/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/Scripts/main.scpt b/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/Scripts/main.scpt
deleted file mode 100644 (file)
index 3147d89..0000000
Binary files a/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/Scripts/main.scpt and /dev/null differ
diff --git a/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/applet.icns b/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/applet.icns
deleted file mode 100644 (file)
index 67a2cbd..0000000
Binary files a/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/applet.icns and /dev/null differ
diff --git a/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/applet.rsrc b/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/applet.rsrc
deleted file mode 100644 (file)
index 8e05928..0000000
Binary files a/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/applet.rsrc and /dev/null differ
diff --git a/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/description.rtfd/TXT.rtf b/utils/install4j/Uninstall Old Jalview.app/Contents/Resources/description.rtfd/TXT.rtf
deleted file mode 100644 (file)
index 5f23fc5..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf500
-{\fonttbl}
-{\colortbl;\red255\green255\blue255;}
-{\*\expandedcolortbl;;}
-}
\ No newline at end of file
diff --git a/utils/install4j/Uninstall Old Jalview.app/Contents/_CodeSignature/CodeResources b/utils/install4j/Uninstall Old Jalview.app/Contents/_CodeSignature/CodeResources
deleted file mode 100644 (file)
index 04a1485..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>files</key>
-       <dict>
-               <key>Resources/Scripts/main.scpt</key>
-               <data>
-               KEuZnZPFR5wgwG/qEhXMd5yBoi4=
-               </data>
-               <key>Resources/applet.icns</key>
-               <data>
-               vIRz6m6+ZxDNfi4iTsXj5rdcZUA=
-               </data>
-               <key>Resources/applet.rsrc</key>
-               <data>
-               oLbJze+WI6mK9fT14HFV6EwFoEI=
-               </data>
-               <key>Resources/description.rtfd/TXT.rtf</key>
-               <data>
-               JdCHmFsejhMRQNi2CzUAg7xM/6Q=
-               </data>
-       </dict>
-       <key>files2</key>
-       <dict>
-               <key>Resources/Scripts/main.scpt</key>
-               <dict>
-                       <key>hash</key>
-                       <data>
-                       KEuZnZPFR5wgwG/qEhXMd5yBoi4=
-                       </data>
-                       <key>hash2</key>
-                       <data>
-                       Y+OMztx129elZ3oX0uhaiMMNU87xhkEPVzSuhF528t0=
-                       </data>
-               </dict>
-               <key>Resources/applet.icns</key>
-               <dict>
-                       <key>hash</key>
-                       <data>
-                       vIRz6m6+ZxDNfi4iTsXj5rdcZUA=
-                       </data>
-                       <key>hash2</key>
-                       <data>
-                       D7gig1wJlOzR/Iy+y6TESLN0j/cIpjThUyO1pj5fZEc=
-                       </data>
-               </dict>
-               <key>Resources/applet.rsrc</key>
-               <dict>
-                       <key>hash</key>
-                       <data>
-                       oLbJze+WI6mK9fT14HFV6EwFoEI=
-                       </data>
-                       <key>hash2</key>
-                       <data>
-                       6bi/D/GzKmLhXbbC8+OLEX9+44Au0XOyGRd+kfw6uzA=
-                       </data>
-               </dict>
-               <key>Resources/description.rtfd/TXT.rtf</key>
-               <dict>
-                       <key>hash</key>
-                       <data>
-                       JdCHmFsejhMRQNi2CzUAg7xM/6Q=
-                       </data>
-                       <key>hash2</key>
-                       <data>
-                       e8RCmynIiyJGwHTnWQowZeGP0OUnjjA6SQTvIzP7Hxs=
-                       </data>
-               </dict>
-       </dict>
-       <key>rules</key>
-       <dict>
-               <key>^Resources/</key>
-               <true/>
-               <key>^Resources/.*\.lproj/</key>
-               <dict>
-                       <key>optional</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>1000</real>
-               </dict>
-               <key>^Resources/.*\.lproj/locversion.plist$</key>
-               <dict>
-                       <key>omit</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>1100</real>
-               </dict>
-               <key>^Resources/Base\.lproj/</key>
-               <dict>
-                       <key>weight</key>
-                       <real>1010</real>
-               </dict>
-               <key>^version.plist$</key>
-               <true/>
-       </dict>
-       <key>rules2</key>
-       <dict>
-               <key>.*\.dSYM($|/)</key>
-               <dict>
-                       <key>weight</key>
-                       <real>11</real>
-               </dict>
-               <key>^(.*/)?\.DS_Store$</key>
-               <dict>
-                       <key>omit</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>2000</real>
-               </dict>
-               <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
-               <dict>
-                       <key>nested</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>10</real>
-               </dict>
-               <key>^.*</key>
-               <true/>
-               <key>^Info\.plist$</key>
-               <dict>
-                       <key>omit</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>20</real>
-               </dict>
-               <key>^PkgInfo$</key>
-               <dict>
-                       <key>omit</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>20</real>
-               </dict>
-               <key>^Resources/</key>
-               <dict>
-                       <key>weight</key>
-                       <real>20</real>
-               </dict>
-               <key>^Resources/.*\.lproj/</key>
-               <dict>
-                       <key>optional</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>1000</real>
-               </dict>
-               <key>^Resources/.*\.lproj/locversion.plist$</key>
-               <dict>
-                       <key>omit</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>1100</real>
-               </dict>
-               <key>^Resources/Base\.lproj/</key>
-               <dict>
-                       <key>weight</key>
-                       <real>1010</real>
-               </dict>
-               <key>^[^/]+$</key>
-               <dict>
-                       <key>nested</key>
-                       <true/>
-                       <key>weight</key>
-                       <real>10</real>
-               </dict>
-               <key>^embedded\.provisionprofile$</key>
-               <dict>
-                       <key>weight</key>
-                       <real>20</real>
-               </dict>
-               <key>^version\.plist$</key>
-               <dict>
-                       <key>weight</key>
-                       <real>20</real>
-               </dict>
-       </dict>
-</dict>
-</plist>
diff --git a/utils/install4j/Uninstall Old Jalview.scpt b/utils/install4j/Uninstall Old Jalview.scpt
deleted file mode 100644 (file)
index 3ab3516..0000000
Binary files a/utils/install4j/Uninstall Old Jalview.scpt and /dev/null differ
index 610dd3b..5b3b80d 100644 (file)
@@ -33,7 +33,7 @@
       <variable name="BUNDLE_ID" value="org.jalview.jalview-desktop" />
       <variable name="INTERNAL_ID" value="Jalview" />
       <variable name="WINDOWS_APPLICATION_ID" value="6595-2347-1923-0725" />
-      <variable name="MACOS_DMG_DS_STORE" value="DS_Store" />
+      <variable name="MACOS_DMG_DS_STORE" value="jalview_dmg_DS_Store" />
       <variable name="MACOS_DMG_BG_IMAGE" />
       <variable name="INSTALLER_NAME" value="Jalview Installer" />
       <variable name="INSTALL4J_UTILS_DIR" value="utils/install4j" />
       <fileset name="Mac OS X JRE" id="880" />
       <fileset name="Windows JRE" id="882" />
       <fileset name="Jalview application" id="1873" />
-      <fileset name="MacOS Old Jalview Uninstaller" id="2105" />
     </filesets>
     <roots>
       <root id="735" fileset="734" />
       <root id="881" fileset="880" />
       <root id="883" fileset="882" />
       <root id="1874" fileset="1873" />
-      <root id="2106" fileset="2105" />
     </roots>
     <mountPoints>
       <mountPoint id="454" />
       <mountPoint id="884" root="881" />
       <mountPoint id="885" root="883" />
       <mountPoint id="1875" root="1874" />
-      <mountPoint id="2107" root="2106" />
     </mountPoints>
     <entries>
       <dirEntry mountPoint="454" file="${compiler:JALVIEW_DIR}/${compiler:GETDOWN_FILES_DIR}/${compiler:JAVA_VERSION}" uninstallMode="2" overrideOverwriteMode="true" overrideUninstallMode="true" subDirectory="files" />
       <dirEntry mountPoint="884" file="${compiler:MACOS_JAVA_VM_DIR}" fileMode="755" overrideFileMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="${compiler:JRE_DIR}" />
       <dirEntry mountPoint="885" file="${compiler:WINDOWS_JAVA_VM_DIR}" fileMode="755" overrideFileMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="${compiler:JRE_DIR}" />
       <dirEntry mountPoint="1875" file="${compiler:JALVIEW_DIR}/${compiler:GETDOWN_WEBSITE_DIR}/${compiler:JAVA_VERSION}/${compiler:GETDOWN_DIST_DIR}" overwriteMode="1" uninstallMode="2" overrideFileMode="true" overrideOverwriteMode="true" overrideUninstallMode="true" entryMode="subdir" subDirectory="${compiler:GETDOWN_DIST_DIR}" overrideDirMode="true" />
-      <dirEntry mountPoint="2107" file="Uninstall Old Jalview.app" fileMode="755" overrideFileMode="true" entryMode="subdir" subDirectory="Uninstall Old Jalview.app" overrideDirMode="true" />
     </entries>
     <components>
       <component name="jalview_getdown" id="1031">
           <entry filesetId="1873" />
         </include>
       </component>
-      <component name="macos_old_jalview_uninstaller" id="2110">
-        <include>
-          <entry filesetId="2105" />
-        </include>
-      </component>
     </components>
   </files>
   <launchers>
@@ -1159,7 +1150,6 @@ return console.askYesNo(message, true);
         <component id="1156" />
         <component id="1276" />
         <component id="1881" />
-        <component id="2110" />
       </excludedComponents>
       <exclude>
         <entry defaultFileset="true" />
@@ -1187,7 +1177,6 @@ return console.askYesNo(message, true);
         <file name=".DS_Store" file="${compiler:JALVIEW_DIR}/${compiler:MACOS_DMG_DS_STORE}" />
         <file name="${compiler:JALVIEW_APPLICATION_NAME}.app/Contents/Resources/Jalview-File.icns" file="${compiler:JALVIEW_DIR}/${compiler:INSTALL4J_UTILS_DIR}/Jalview-File.icns" />
         <file name="${compiler:JALVIEW_APPLICATION_NAME}.app/Contents/Resources/Jalview-Launch.icns" file="${compiler:JALVIEW_DIR}/${compiler:INSTALL4J_UTILS_DIR}/Jalview-Launch.icns" />
-        <symlink name="Uninstall Old Jalview (optional).app" target="${compiler:JALVIEW_APPLICATION_NAME}.app/Contents/Resources/app/Uninstall Old Jalview.app" />
       </topLevelFiles>
     </macosArchive>
     <unixInstaller name="Linux x64 Shell Installer" id="1595" mediaFileName="${compiler:UNIX_APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-linux_x64-java_${compiler:JAVA_INTEGER_VERSION}" installDir="${compiler:UNIX_APPLICATION_FOLDER}" customInstallBaseDir="~/opt/">
@@ -1196,7 +1185,6 @@ return console.askYesNo(message, true);
         <component id="1156" />
         <component id="1276" />
         <component id="1881" />
-        <component id="2110" />
       </excludedComponents>
       <exclude>
         <entry defaultFileset="true" />
@@ -1213,7 +1201,6 @@ return console.askYesNo(message, true);
         <component id="1156" />
         <component id="1276" />
         <component id="1881" />
-        <component id="2110" />
       </excludedComponents>
       <exclude>
         <entry defaultFileset="true" />
@@ -1230,7 +1217,6 @@ return console.askYesNo(message, true);
         <component id="1156" />
         <component id="1276" />
         <component id="1881" />
-        <component id="2110" />
       </excludedComponents>
       <exclude>
         <entry defaultFileset="true" />