JAL-3436 save filePath from fileObject, tidy updateRecentlyOpened
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 17 Oct 2019 15:10:43 +0000 (16:10 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 17 Oct 2019 15:10:43 +0000 (16:10 +0100)
src/jalview/gui/AlignFrame.java
src/jalview/io/FileLoader.java

index 2ef31a2..2371be3 100644 (file)
@@ -1053,86 +1053,86 @@ public class AlignFrame extends GAlignFrame
   @Override
   public void reload_actionPerformed(ActionEvent e)
   {
-    System.out.println("AlignFrame.reload " + fileName);
-    if (fileName != null)
-    {
-      // TODO: JAL-1108 - ensure all associated frames are closed regardless of
-      // originating file's format
-      // TODO: work out how to recover feature settings for correct view(s) when
-      // file is reloaded.
-      if (FileFormat.Jalview.equals(currentFileFormat))
+    if (fileName == null)
+    {
+      return;
+    }
+    // TODO: JAL-1108 - ensure all associated frames are closed regardless of
+    // originating file's format
+    // TODO: work out how to recover feature settings for correct view(s) when
+    // file is reloaded.
+    if (FileFormat.Jalview.equals(currentFileFormat))
+    {
+      JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
+      for (int i = 0; i < frames.length; i++)
       {
-        JInternalFrame[] frames = Desktop.getDesktopPane().getAllFrames();
-        for (int i = 0; i < frames.length; i++)
+        if (frames[i] instanceof AlignFrame && frames[i] != this
+                && ((AlignFrame) frames[i]).fileName != null
+                && ((AlignFrame) frames[i]).fileName.equals(fileName))
         {
-          if (frames[i] instanceof AlignFrame && frames[i] != this
-                  && ((AlignFrame) frames[i]).fileName != null
-                  && ((AlignFrame) frames[i]).fileName.equals(fileName))
+          try
+          {
+            frames[i].setSelected(true);
+            Desktop.getInstance().closeAssociatedWindows();
+          } catch (java.beans.PropertyVetoException ex)
           {
-            try
-            {
-              frames[i].setSelected(true);
-              Desktop.getInstance().closeAssociatedWindows();
-            } catch (java.beans.PropertyVetoException ex)
-            {
-            }
           }
-
         }
-        Desktop.getInstance().closeAssociatedWindows();
 
-        FileLoader loader = new FileLoader();
-        DataSourceType protocol = fileName.startsWith("http:")
-                ? DataSourceType.URL
-                : DataSourceType.FILE;
-        loader.loadFile(viewport,
-                (fileObject == null ? fileName : fileObject), protocol,
-                currentFileFormat);
       }
-      else
-      {
-        Rectangle bounds = this.getBounds();
+      Desktop.getInstance().closeAssociatedWindows();
 
-        FileLoader loader = new FileLoader();
+      FileLoader loader = new FileLoader();
+      DataSourceType protocol = fileName.startsWith("http:")
+              ? DataSourceType.URL
+              : DataSourceType.FILE;
+      loader.loadFile(viewport,
+              (fileObject == null ? fileName : fileObject), protocol,
+              currentFileFormat);
+    }
+    else
+    {
+      Rectangle bounds = this.getBounds();
 
-        AlignFrame newframe = null;
+      FileLoader loader = new FileLoader();
 
-        if (fileObject == null)
-        {
+      AlignFrame newframe = null;
 
-          DataSourceType protocol = (fileName.startsWith("http:")
-                  ? DataSourceType.URL
-                  : DataSourceType.FILE);
-          newframe = loader.loadFileWaitTillLoaded(fileName, protocol,
-                  currentFileFormat);
-        }
-        else
-        {
-          newframe = loader.loadFileWaitTillLoaded(fileObject,
-                  DataSourceType.FILE, currentFileFormat);
-        }
+      if (fileObject == null)
+      {
 
-        newframe.setBounds(bounds);
-        if (featureSettings != null && featureSettings.isShowing())
+        DataSourceType protocol = (fileName.startsWith("http:")
+                ? DataSourceType.URL
+                : DataSourceType.FILE);
+        newframe = loader.loadFileWaitTillLoaded(fileName, protocol,
+                currentFileFormat);
+      }
+      else
+      {
+        newframe = loader.loadFileWaitTillLoaded(fileObject,
+                DataSourceType.FILE, currentFileFormat);
+      }
+
+      newframe.setBounds(bounds);
+      if (featureSettings != null && featureSettings.isShowing())
+      {
+        final Rectangle fspos = featureSettings.frame.getBounds();
+        // TODO: need a 'show feature settings' function that takes bounds -
+        // need to refactor Desktop.addFrame
+        newframe.featureSettings_actionPerformed(null);
+        final FeatureSettings nfs = newframe.featureSettings;
+        SwingUtilities.invokeLater(new Runnable()
         {
-          final Rectangle fspos = featureSettings.frame.getBounds();
-          // TODO: need a 'show feature settings' function that takes bounds -
-          // need to refactor Desktop.addFrame
-          newframe.featureSettings_actionPerformed(null);
-          final FeatureSettings nfs = newframe.featureSettings;
-          SwingUtilities.invokeLater(new Runnable()
+          @Override
+          public void run()
           {
-            @Override
-            public void run()
-            {
-              nfs.frame.setBounds(fspos);
-            }
-          });
-          this.featureSettings.close();
-          this.featureSettings = null;
-        }
-        this.closeMenuItem_actionPerformed(true);
+            nfs.frame.setBounds(fspos);
+          }
+        });
+        this.featureSettings.close();
+        this.featureSettings = null;
       }
+      this.closeMenuItem_actionPerformed(true);
     }
   }
 
index 1fa6957..684e59a 100755 (executable)
@@ -49,13 +49,27 @@ import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.util.StringTokenizer;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.swing.SwingUtilities;
 
 public class FileLoader implements Runnable
 {
+  private static final String DEFAULT_FILE_FORMAT_PROPERTY = "DEFAULT_FILE_FORMAT";
+
+  private static final String RECENT_URL_PROPERTY = "RECENT_URL";
+
+  private static final String RECENT_FILE_PROPERTY = "RECENT_FILE";
+
+  private static final String TAB = "\t";
+
+  /*
+   * maximum number of items in file/url history lists;
+   * pseudo-constant (not final) so amendable by Groovy if wanted
+   */
+  private static int MAX_HISTORY = 11;
+
   private File selectedFile;
 
   String file;
@@ -146,17 +160,6 @@ public class FileLoader implements Runnable
   }
 
   /**
-   * Load a (file, protocol) source of unknown type
-   * 
-   * @param file
-   * @param protocol
-   */
-  public void LoadFile(String file, DataSourceType protocol)
-  {
-    loadFile(file, protocol, null);
-  }
-
-  /**
    * Load alignment from (file, protocol) and wait till loaded
    * 
    * @param file
@@ -187,36 +190,23 @@ public class FileLoader implements Runnable
   /**
    * Load alignment from (file, protocol) of type format and wait till loaded
    * 
-   * @param file
+   * @param fileObject
    * @param sourceType
    * @param format
    * @return alignFrame constructed from file contents
+   * @throws NullPointerException
+   *           if {@code file} is null
    */
-  public AlignFrame loadFileWaitTillLoaded(File file,
+  public AlignFrame loadFileWaitTillLoaded(File fileObject,
           DataSourceType sourceType, FileFormatI format)
   {
-    setFileFields(null, file, null, sourceType, format);
+    setFileFields(null, fileObject, fileObject.getPath(), sourceType, format);
     return _loadFileWaitTillLoaded();
   }
 
   /**
-   * Load alignment from FileParse source of type format and wait till loaded
-   * 
-   * @param source
-   * @param format
-   * @return alignFrame constructed from file contents
-   */
-  public AlignFrame loadFileWaitTillLoaded(AlignmentFileReaderI source,
-          FileFormatI format)
-  {
-    setFileFields(source, null, source.getInFile(),
-            source.getDataSourceType(), format);
-    return _loadFileWaitTillLoaded();
-  }
-
-  /**
-   * runs the 'run' method (in this thread), then return the alignFrame that's
-   * (hopefully) been read
+   * Runs the 'run' method (in this thread), then returns the alignFrame that
+   * (hopefully) has been constructed
    * 
    * @return
    */
@@ -226,35 +216,45 @@ public class FileLoader implements Runnable
     return alignFrame;
   }
 
+  /**
+   * Updates the Jalview properties file to add the last file or URL read to the
+   * tab-separated list in property RECENT_FILE or RECENT_URL respectively. The
+   * property is created if it does not already exist. The new entry is added as
+   * the first item (without duplication). If the list exceeds some maximum
+   * length (currently 10 entries), the oldest (last) entry is dropped.
+   * <p>
+   * Files read from the temporary file directory are not added to the property.
+   * <p>
+   * Property DEFAULT_FILE_FORMAT (e.g. "Fasta" etc) is also set if currently
+   * reading from file.
+   */
   public void updateRecentlyOpened()
   {
-    Vector<String> recent = new Vector<>();
+    List<String> recent = new ArrayList<>();
     if (protocol == DataSourceType.PASTE)
     {
       // do nothing if the file was pasted in as text... there is no filename to
       // refer to it as.
       return;
     }
-    if (file != null
-            && file.indexOf(System.getProperty("java.io.tmpdir")) > -1)
+    if (file == null
+            || file.indexOf(System.getProperty("java.io.tmpdir")) > -1)
     {
       // ignore files loaded from the system's temporary directory
       return;
     }
-    String type = protocol == DataSourceType.FILE ? "RECENT_FILE"
-            : "RECENT_URL";
+    String type = protocol == DataSourceType.FILE ? RECENT_FILE_PROPERTY
+            : RECENT_URL_PROPERTY;
 
     String historyItems = Cache.getProperty(type);
 
-    StringTokenizer st;
-
     if (historyItems != null)
     {
-      st = new StringTokenizer(historyItems, "\t");
+      String[] tokens = historyItems.split("\\t");
 
-      while (st.hasMoreTokens())
+      for (String token : tokens)
       {
-        recent.addElement(st.nextToken().trim());
+        recent.add(token.trim());
       }
     }
 
@@ -263,18 +263,18 @@ public class FileLoader implements Runnable
       recent.remove(file);
     }
 
-    StringBuffer newHistory = new StringBuffer(file);
-    for (int i = 0; i < recent.size() && i < 10; i++)
+    StringBuilder newHistory = new StringBuilder(file);
+    for (int i = 0; i < recent.size() && i < MAX_HISTORY - 1; i++)
     {
-      newHistory.append("\t");
-      newHistory.append(recent.elementAt(i));
+      newHistory.append(TAB);
+      newHistory.append(recent.get(i));
     }
 
     Cache.setProperty(type, newHistory.toString());
 
     if (protocol == DataSourceType.FILE)
     {
-      Cache.setProperty("DEFAULT_FILE_FORMAT", format.getName());
+      Cache.setProperty(DEFAULT_FILE_FORMAT_PROPERTY, format.getName());
     }
   }