Simplify file scanner listener handling
[jSite.git] / src / main / java / de / todesbaum / jsite / gui / FileScanner.java
index cfb0c23..1377604 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * jSite - FileScanner.java - Copyright © 2006–2012 David Roden
+ * jSite - FileScanner.java - Copyright © 2006–2014 David Roden
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,6 +29,7 @@ import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -52,7 +53,7 @@ public class FileScanner implements Runnable {
        private final static Logger logger = Logger.getLogger(FileScanner.class.getName());
 
        /** The list of listeners. */
-       private final List<FileScannerListener> fileScannerListeners = new ArrayList<FileScannerListener>();
+       private final FileScannerListener fileScannerListener;
 
        /** The project to scan. */
        private final Project project;
@@ -63,43 +64,32 @@ public class FileScanner implements Runnable {
        /** Wether there was an error. */
        private boolean error = false;
 
+       /** The name of the last file scanned. */
+       private String lastFilename;
+
        /**
         * Creates a new file scanner for the given project.
         *
         * @param project
         *            The project whose files to scan
         */
-       public FileScanner(Project project) {
+       public FileScanner(Project project, FileScannerListener fileScannerListener) {
                this.project = project;
+               this.fileScannerListener = Objects.requireNonNull(fileScannerListener);
        }
 
        /**
-        * Adds the given listener to the list of listeners.
+        * Returns the name of the last file scanned.
         *
-        * @param fileScannerListener
-        *            The listener to add
+        * @return The name of the last file scanned, or {@code null} if there was
+        *         no file scanned yet
         */
-       public void addFileScannerListener(FileScannerListener fileScannerListener) {
-               fileScannerListeners.add(fileScannerListener);
+       public String getLastFilename() {
+               return lastFilename;
        }
 
-       /**
-        * Removes the given listener from the list of listeners.
-        *
-        * @param fileScannerListener
-        *            The listener to remove
-        */
-       public void removeFileScannerListener(FileScannerListener fileScannerListener) {
-               fileScannerListeners.remove(fileScannerListener);
-       }
-
-       /**
-        * Notifies all listeners that the file scan finished.
-        */
-       protected void fireFileScannerFinished() {
-               for (FileScannerListener fileScannerListener : new ArrayList<FileScannerListener>(fileScannerListeners)) {
-                       fileScannerListener.fileScannerFinished(this);
-               }
+       public void startInBackground() {
+               new Thread(this).start();
        }
 
        /**
@@ -114,13 +104,14 @@ public class FileScanner implements Runnable {
        public void run() {
                files = new ArrayList<ScannedFile>();
                error = false;
+               lastFilename = null;
                try {
                        scanFiles(new File(project.getLocalPath()), files);
                        Collections.sort(files);
                } catch (IOException ioe1) {
                        error = true;
                }
-               fireFileScannerFinished();
+               fileScannerListener.fileScannerFinished(this);
        }
 
        /**
@@ -172,6 +163,7 @@ public class FileScanner implements Runnable {
                        String filename = project.shortenFilename(file).replace('\\', '/');
                        String hash = hashFile(project.getLocalPath(), filename);
                        fileList.add(new ScannedFile(filename, hash));
+                       lastFilename = filename;
                }
        }