You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by rw...@apache.org on 2013/11/07 06:33:15 UTC

svn commit: r1539528 - in /pivot/trunk: wtk-terra/src/org/apache/pivot/wtk/skin/terra/ wtk/src/org/apache/pivot/wtk/

Author: rwhitcomb
Date: Thu Nov  7 05:33:15 2013
New Revision: 1539528

URL: http://svn.apache.org/r1539528
Log:
PIVOT-864:  Fix the Home button so that the home location can be set for remote
systems (instead of the default local Home location).  Extend this to all the
listeners also.

Modified:
    pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSheetSkin.java
    pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowser.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserListener.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheet.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheetListener.java

Modified: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSheetSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSheetSkin.java?rev=1539528&r1=1539527&r2=1539528&view=diff
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSheetSkin.java (original)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSheetSkin.java Thu Nov  7 05:33:15 2013
@@ -112,13 +112,20 @@ public class TerraVFSBrowserSheetSkin ex
 
         bxmlSerializer.bind(this, TerraVFSBrowserSheetSkin.class);
 
-        // set the same rootDirectory to fileBrowser
+        // set the same rootDirectory as the component
         try {
             fileBrowser.setRootDirectory(fileBrowserSheet.getRootDirectory());
         } catch (FileSystemException fse) {
             throw new RuntimeException(fse);
         }
 
+        // set the same homeDirectory as the component
+        try {
+            fileBrowser.setHomeDirectory(fileBrowserSheet.getHomeDirectory());
+        } catch (FileSystemException fse) {
+            throw new RuntimeException(fse);
+        }
+
         saveAsTextInput.getTextInputContentListeners().add(new TextInputContentListener.Adapter() {
             @Override
             public void textChanged(TextInput textInput) {
@@ -146,6 +153,19 @@ public class TerraVFSBrowserSheetSkin ex
             }
 
             @Override
+            public void homeDirectoryChanged(VFSBrowser fileBrowserArgument,
+                FileObject previousHomeDirectory) {
+                updatingSelection = true;
+
+                try {
+                    fileBrowserSheet.setHomeDirectory(fileBrowserArgument.getHomeDirectory());
+                } catch (FileSystemException fse) {
+                    throw new RuntimeException(fse);
+                }
+                updatingSelection = false;
+            }
+
+            @Override
             public void selectedFileAdded(VFSBrowser fileBrowserArgument, FileObject file) {
                 if (file.getName().getType() == FileType.FOLDER) {
                     selectedDirectoryCount++;
@@ -239,6 +259,7 @@ public class TerraVFSBrowserSheetSkin ex
         fileBrowserSheet.getFileBrowserSheetListeners().add(this);
 
         modeChanged(fileBrowserSheet, null);
+        homeDirectoryChanged(fileBrowserSheet, null);
         rootDirectoryChanged(fileBrowserSheet, null);
         selectedFilesChanged(fileBrowserSheet, null);
     }
@@ -452,6 +473,18 @@ public class TerraVFSBrowserSheetSkin ex
     }
 
     @Override
+    public void homeDirectoryChanged(VFSBrowserSheet fileBrowserSheet,
+        FileObject previousHomeDirectory) {
+        if (!updatingSelection) {
+            try {
+                fileBrowser.setHomeDirectory(fileBrowserSheet.getHomeDirectory());
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+        }
+    }
+
+    @Override
     public void selectedFilesChanged(VFSBrowserSheet fileBrowserSheet,
         Sequence<FileObject> previousSelectedFiles) {
         if (!updatingSelection) {

Modified: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.java?rev=1539528&r1=1539527&r2=1539528&view=diff
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.java (original)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.java Thu Nov  7 05:33:15 2013
@@ -90,8 +90,6 @@ import org.apache.pivot.wtk.skin.VFSBrow
  */
 public class TerraVFSBrowserSkin extends VFSBrowserSkin {
 
-    public static final String HOME_DIRECTORY = System.getProperty("user.home");
-
     /**
      * Abstract renderer for displaying file system contents.
      */
@@ -135,19 +133,23 @@ public class TerraVFSBrowserSkin extends
             validate();
         }
 
+        private static VFSBrowser getBrowser(Component component) {
+            Component parent = component;
+            while (!(parent instanceof VFSBrowser)) {
+                parent = parent.getParent();
+            }
+            return (VFSBrowser)parent;
+        }
+
         /**
          * Obtains the icon to display for a given file.
          *
          * @param file
          */
-        public static Image getIcon(FileObject file) {
+        public static Image getIcon(FileObject file, Component component) {
             Image icon;
             if (file.getName().getType() == FileType.FOLDER) {
-                // TODO: should this check be the full URI? What about remote
-                // file systems?
-                // seems like it should be the original home directory, and not
-                // the local file system home
-                icon = file.getName().getPath().equals(HOME_DIRECTORY) ? HOME_FOLDER_IMAGE
+                icon = file.equals(getBrowser(component).getHomeDirectory()) ? HOME_FOLDER_IMAGE
                     : FOLDER_IMAGE;
             } else {
                 icon = FILE_IMAGE;
@@ -171,13 +173,13 @@ public class TerraVFSBrowserSkin extends
                 FileObject file = (FileObject) data;
 
                 // Update the image view
-                imageView.setImage(getIcon(file));
+                imageView.setImage(getIcon(file, button));
                 imageView.getStyles().put("opacity", button.isEnabled() ? 1.0f : 0.5f);
 
                 // Update the label
                 String text = file.getName().getBaseName();
                 if (text.length() == 0) {
-                    text = System.getProperty("file.separator");
+                    text = FileName.ROOT_PATH;
                 }
 
                 label.setText(text);
@@ -189,7 +191,7 @@ public class TerraVFSBrowserSkin extends
             FileObject file = (FileObject) item;
             String text = file.getName().getBaseName();
             if (text.length() == 0) {
-                text = System.getProperty("file.separator");
+                text = FileName.ROOT_PATH;
             }
 
             return text;
@@ -231,12 +233,11 @@ public class TerraVFSBrowserSkin extends
                 FileObject file = (FileObject) item;
 
                 // Update the image view
-                imageView.setImage(getIcon(file));
+                imageView.setImage(getIcon(file, listView));
                 imageView.getStyles().put("opacity",
                     (listView.isEnabled() && !disabled) ? 1.0f : 0.5f);
 
                 // Update the label
-                // TODO: should this be the full path or the base name?
                 String text = file.getName().getBaseName();
                 if (text.length() == 0) {
                     text = FileName.ROOT_PATH;
@@ -286,7 +287,7 @@ public class TerraVFSBrowserSkin extends
                     FileType type = file.getType();
                     if (columnName.equals(NAME_KEY)) {
                         text = file.getName().getBaseName();
-                        icon = getIcon(file);
+                        icon = getIcon(file, tableView);
                         getStyles().put("horizontalAlignment", HorizontalAlignment.LEFT);
                     } else if (columnName.equals(SIZE_KEY)) {
                         if (type == FileType.FOLDER || type == FileType.IMAGINARY) {
@@ -784,6 +785,8 @@ public class TerraVFSBrowserSkin extends
 
     private RefreshFileListTask refreshFileListTask = null;
 
+    private FileObject homeDirectory = null;
+
     private static final FileFilter HIDDEN_FILE_FILTER = new FileFilter() {
         @Override
         public boolean accept(FileSelectInfo fileInfo) {
@@ -815,6 +818,8 @@ public class TerraVFSBrowserSkin extends
 
         bxmlSerializer.bind(this, TerraVFSBrowserSkin.class);
 
+        homeDirectory = fileBrowser.getHomeDirectory();
+
         driveListButton.getListButtonSelectionListeners().add(
             new ListButtonSelectionListener.Adapter() {
                 @Override
@@ -875,9 +880,7 @@ public class TerraVFSBrowserSkin extends
             @Override
             public void buttonPressed(Button button) {
                 try {
-                    // TODO: should this be the remote file system's home and
-                    // not the local home?
-                    fileBrowser.setRootDirectory(HOME_DIRECTORY);
+                    fileBrowser.setRootDirectory(fileBrowser.getHomeDirectory());
                 } catch (FileSystemException fse) {
                     throw new RuntimeException(fse);
                 }
@@ -1232,7 +1235,7 @@ public class TerraVFSBrowserSkin extends
 
         goUpButton.setEnabled(pathListButton.isEnabled());
 
-        goHomeButton.setEnabled(!rootDirectory.getName().getPath().equals(HOME_DIRECTORY));
+        goHomeButton.setEnabled(!rootDirectory.equals(homeDirectory));
 
         fileScrollPane.setScrollTop(0);
         fileScrollPane.setScrollLeft(0);
@@ -1243,6 +1246,14 @@ public class TerraVFSBrowserSkin extends
     }
 
     @Override
+    public void homeDirectoryChanged(VFSBrowser fileBrowser, FileObject previousHomeDirectory) {
+        this.homeDirectory = fileBrowser.getHomeDirectory();
+        goHomeButton.setEnabled(!fileBrowser.getRootDirectory().equals(homeDirectory));
+        // Refresh the list in order to redo the icons correctly
+        refreshFileList();
+    }
+
+    @Override
     public void selectedFileAdded(VFSBrowser fileBrowser, FileObject file) {
         if (!updatingSelection) {
             @SuppressWarnings("unchecked")

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowser.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowser.java?rev=1539528&r1=1539527&r2=1539528&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowser.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowser.java Thu Nov  7 05:33:15 2013
@@ -64,6 +64,13 @@ public class VFSBrowser extends Containe
         }
 
         @Override
+        public void homeDirectoryChanged(VFSBrowser fileBrowser, FileObject previousHomeDirectory) {
+            for (VFSBrowserListener listener : this) {
+                listener.homeDirectoryChanged(fileBrowser, previousHomeDirectory);
+            }
+        }
+
+        @Override
         public void selectedFileAdded(VFSBrowser fileBrowser, FileObject file) {
             for (VFSBrowserListener listener : this) {
                 listener.selectedFileAdded(fileBrowser, file);
@@ -104,6 +111,7 @@ public class VFSBrowser extends Containe
     private FileSystemManager manager;
     private FileName baseFileName;
     private FileObject rootDirectory;
+    private FileObject homeDirectory;
     private FileObjectList selectedFiles = new FileObjectList();
     private boolean multiSelect = false;
     private Filter<FileObject> disabledFileFilter = null;
@@ -111,11 +119,11 @@ public class VFSBrowser extends Containe
     private FileBrowserListenerList fileBrowserListeners = new FileBrowserListenerList();
 
     /**
-     * Creates a new VFSBrowser <p> Note that this version set by default mode
-     * to open.
+     * Creates a new VFSBrowser <p> Note that this version sets, by default,
+     * the mode to open.
      */
     public VFSBrowser() throws FileSystemException {
-        this(null, USER_HOME);
+        this(null, USER_HOME, null);
     }
 
     /**
@@ -125,26 +133,12 @@ public class VFSBrowser extends Containe
      *
      * @param manager The virtual file system we're going to manage.
      * @param rootFolder The root folder full name.
+     * @param homeFolder The default home folder full name.
      */
-    public VFSBrowser(FileSystemManager manager, URI rootFolder) throws FileSystemException {
-        if (rootFolder == null) {
-            throw new IllegalArgumentException();
-        }
-
-        if (manager == null) {
-            this.manager = VFS.getManager();
-        } else {
-            this.manager = manager;
-        }
-        FileObject baseFile = this.manager.getBaseFile();
-        if (baseFile != null) {
-            baseFileName = baseFile.getName();
-        }
-        rootDirectory = this.manager.resolveFile(rootFolder);
-        if (rootDirectory.getType() != FileType.FOLDER) {
-            throw new IllegalArgumentException();
-        }
-        installSkin(VFSBrowser.class);
+    public VFSBrowser(FileSystemManager manager, URI rootFolder, URI homeFolder) throws FileSystemException {
+        this(manager,
+            rootFolder == null ? null : rootFolder.toString(),
+            homeFolder == null ? null : homeFolder.toString());
     }
 
     /**
@@ -153,25 +147,20 @@ public class VFSBrowser extends Containe
      *
      * @param manager The virtual file system we're going to manage.
      * @param rootFolder The root folder full name.
+     * @param homeFolder The home folder full name.
      */
-    public VFSBrowser(FileSystemManager manager, String rootFolder) throws FileSystemException {
+    public VFSBrowser(FileSystemManager manager, String rootFolder, String homeFolder) throws FileSystemException {
         if (rootFolder == null) {
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Root folder is null.");
         }
 
-        if (manager == null) {
-            this.manager = VFS.getManager();
-        } else {
-            this.manager = manager;
-        }
-        FileObject baseFile = this.manager.getBaseFile();
-        if (baseFile != null) {
-            baseFileName = baseFile.getName();
-        }
-        rootDirectory = this.manager.resolveFile(rootFolder);
-        if (rootDirectory.getType() != FileType.FOLDER) {
-            throw new IllegalArgumentException();
-        }
+        // Note: these methods all could trigger events, but since we're
+        // in the constructor and the skin isn't set yet, there will not
+        // be any listeners registered yet
+        setManager(manager);
+        setRootDirectory(rootFolder);
+        setHomeDirectory(homeFolder == null ? USER_HOME.toString() : homeFolder);
+
         installSkin(VFSBrowser.class);
     }
 
@@ -184,6 +173,24 @@ public class VFSBrowser extends Containe
         return manager;
     }
 
+    public void setManager(FileSystemManager manager) throws FileSystemException {
+        FileSystemManager previousManager = this.manager;
+
+        if (manager == null) {
+            this.manager = VFS.getManager();
+        } else {
+            this.manager = manager;
+        }
+        FileObject baseFile = this.manager.getBaseFile();
+        if (baseFile != null) {
+            baseFileName = baseFile.getName();
+        }
+
+        if (previousManager != null && previousManager != this.manager) {
+            fileBrowserListeners.managerChanged(this, previousManager);
+        }
+    }
+
     /**
      * Returns the current root directory.
      *
@@ -209,8 +216,17 @@ public class VFSBrowser extends Containe
      * @param rootDirectory
      */
     public void setRootDirectory(FileObject rootDirectory) throws FileSystemException {
-        if (rootDirectory == null || rootDirectory.getType() != FileType.FOLDER) {
-            throw new IllegalArgumentException();
+        if (rootDirectory == null) {
+            throw new IllegalArgumentException("Root directory is null.");
+        }
+
+        // Give some grace to set the root folder to an actual file and
+        // have it work (by using the parent folder instead)
+        if (rootDirectory.getType() != FileType.FOLDER) {
+            rootDirectory = rootDirectory.getParent();
+            if (rootDirectory == null || rootDirectory.getType() != FileType.FOLDER) {
+                throw new IllegalArgumentException("Root file is not a directory.");
+            }
         }
 
         if (rootDirectory.exists()) {
@@ -227,6 +243,53 @@ public class VFSBrowser extends Containe
     }
 
     /**
+     * Returns the current home directory.
+     */
+    public FileObject getHomeDirectory() {
+        return homeDirectory;
+    }
+
+    /**
+     * Sets the home directory from a string.
+     *
+     * @param homeDirectory
+     */
+    public void setHomeDirectory(String homeDirectory) throws FileSystemException {
+        setHomeDirectory(manager.resolveFile(homeDirectory));
+    }
+
+    /**
+     * Sets the home directory.
+     *
+     * @param homeDirectory
+     */
+    public void setHomeDirectory(FileObject homeDirectory) throws FileSystemException {
+        if (homeDirectory == null) {
+            throw new IllegalArgumentException("Home directory is null.");
+        }
+
+        // Give some grace to set the home folder to an actual file and
+        // have it work (by using the parent folder instead)
+        if (homeDirectory.getType() != FileType.FOLDER) {
+            homeDirectory = homeDirectory.getParent();
+            if (homeDirectory == null || homeDirectory.getType() != FileType.FOLDER) {
+                throw new IllegalArgumentException("Home file is not a directory.");
+            }
+        }
+
+        if (homeDirectory.exists()) {
+            FileObject previousHomeDirectory = this.homeDirectory;
+
+            if (!homeDirectory.equals(previousHomeDirectory)) {
+                this.homeDirectory = homeDirectory;
+                fileBrowserListeners.homeDirectoryChanged(this, previousHomeDirectory);
+            }
+        } else {
+            setHomeDirectory(homeDirectory.getParent());
+        }
+    }
+
+    /**
      * Adds a file to the file selection.
      *
      * @param file

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserListener.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserListener.java?rev=1539528&r1=1539527&r2=1539528&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserListener.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserListener.java Thu Nov  7 05:33:15 2013
@@ -40,6 +40,11 @@ public interface VFSBrowserListener {
         }
 
         @Override
+        public void homeDirectoryChanged(VFSBrowser fileBrowser, FileObject previousHomeDirectory) {
+            // empty block
+        }
+
+        @Override
         public void selectedFileAdded(VFSBrowser fileBrowser, FileObject file) {
             // empty block
         }
@@ -85,6 +90,14 @@ public interface VFSBrowserListener {
     public void rootDirectoryChanged(VFSBrowser fileBrowser, FileObject previousRootDirectory);
 
     /**
+     * Called when a file browser's home directory has changed.
+     *
+     * @param fileBrowser
+     * @param previousHomeDirectory
+     */
+    public void homeDirectoryChanged(VFSBrowser fileBrowser, FileObject previousHomeDirectory);
+
+    /**
      * Called when a file has been added to a file browser's selection.
      *
      * @param fileBrowser

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheet.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheet.java?rev=1539528&r1=1539527&r2=1539528&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheet.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheet.java Thu Nov  7 05:33:15 2013
@@ -70,6 +70,14 @@ public class VFSBrowserSheet extends She
         }
 
         @Override
+        public void homeDirectoryChanged(VFSBrowserSheet fileBrowserSheet,
+            FileObject previousHomeDirectory) {
+            for (VFSBrowserSheetListener listener : this) {
+                listener.homeDirectoryChanged(fileBrowserSheet, previousHomeDirectory);
+            }
+        }
+
+        @Override
         public void selectedFilesChanged(VFSBrowserSheet fileBrowserSheet,
             Sequence<FileObject> previousSelectedFiles) {
             for (VFSBrowserSheetListener listener : this) {
@@ -90,6 +98,7 @@ public class VFSBrowserSheet extends She
     private FileSystemManager manager;
     private FileName baseFileName;
     private FileObject rootDirectory;
+    private FileObject homeDirectory;
     private FileObjectList selectedFiles = new FileObjectList();
     private Filter<FileObject> disabledFileFilter = null;
 
@@ -138,6 +147,31 @@ public class VFSBrowserSheet extends She
      */
     public VFSBrowserSheet(FileSystemManager manager, Mode mode, String rootFolder)
         throws FileSystemException {
+        this(manager, mode, rootFolder, null);
+    }
+
+    /**
+     * Creates a new VFSBrowserSheet
+     * <p>
+     * Note that this version of the constructor must be used when a custom home folder has to be set.
+     *
+     * @param manager
+     * The VFS FileSystemManager that we will be browsing.  If <tt>null</tt> the default (local) will
+     * be used.
+     *
+     * @param mode
+     * The mode for opening the sheet.
+     * @see Mode
+     *
+     * @param rootFolder
+     * The root folder full name.
+     *
+     * @param homeFolder
+     * The default for the "home" folder (full name).
+     */
+    public VFSBrowserSheet(FileSystemManager manager, Mode mode, String rootFolder, String homeFolder)
+            throws FileSystemException
+    {
         if (mode == null) {
             throw new IllegalArgumentException("Mode is null.");
         }
@@ -146,11 +180,14 @@ public class VFSBrowserSheet extends She
             throw new IllegalArgumentException("Root folder is null.");
         }
 
-        setManager(manager);
-
         this.mode = mode;
 
-        setRootFolder(rootFolder);
+        // Note: these three methods all could trigger events, but since we're
+        // in the constructor and the skin isn't set yet, there will not be any
+        // listeners registered yet
+        setManager(manager);
+        setRootDirectory(rootFolder);
+        setHomeDirectory(homeFolder == null ? USER_HOME : homeFolder);
 
         installSkin(VFSBrowserSheet.class);
     }
@@ -202,31 +239,13 @@ public class VFSBrowserSheet extends She
         return rootDirectory;
     }
 
-    // set the root folder but without firing events
-    public void setRootFolder(String rootFolder) throws FileSystemException {
-        if (rootFolder == null) {
-            throw new IllegalArgumentException("Root folder is null.");
-        }
-
-        // Give some grace to set the root folder to an actual file and
-        // have it work (by using the parent folder instead)
-        rootDirectory = manager.resolveFile(rootFolder);
-        if (rootDirectory.getType() != FileType.FOLDER) {
-            rootDirectory = rootDirectory.getParent();
-            if (rootDirectory == null || rootDirectory.getType() != FileType.FOLDER) {
-                throw new IllegalArgumentException("Root file is not a directory.");
-            }
-        }
-
-    }
-
     public void setRootDirectory(String rootDirectory) throws FileSystemException {
         setRootDirectory(manager.resolveFile(rootDirectory));
     }
 
     public void setRootDirectory(FileObject rootDirectory) throws FileSystemException {
         if (rootDirectory == null) {
-            throw new IllegalArgumentException("Root file is null.");
+            throw new IllegalArgumentException("Root directory is null.");
         }
 
         // Give some grace to set the root folder to an actual file and
@@ -251,6 +270,44 @@ public class VFSBrowserSheet extends She
         }
     }
 
+    public FileObject getHomeDirectory() {
+        return homeDirectory;
+    }
+
+    public void setHomeDirectory(String homeDirectory)
+            throws FileSystemException
+    {
+        setHomeDirectory(manager.resolveFile(homeDirectory));
+    }
+
+    public void setHomeDirectory(FileObject homeDirectory)
+            throws FileSystemException
+    {
+        if (homeDirectory == null) {
+            throw new IllegalArgumentException("Home file is null.");
+        }
+
+        // Give some grace to set the home folder to an actual file and
+        // have it work (by using the parent folder instead)
+        if (homeDirectory.getType() != FileType.FOLDER) {
+            homeDirectory = homeDirectory.getParent();
+            if (homeDirectory == null || homeDirectory.getType() != FileType.FOLDER) {
+                throw new IllegalArgumentException("Root file is not a directory.");
+            }
+        }
+
+        if (homeDirectory.exists()) {
+            FileObject previousHomeDirectory = this.homeDirectory;
+
+            if (!homeDirectory.equals(previousHomeDirectory)) {
+                this.homeDirectory = homeDirectory;
+                fileBrowserSheetListeners.homeDirectoryChanged(this, previousHomeDirectory);
+            }
+        } else {
+            setHomeDirectory(homeDirectory.getParent());
+        }
+    }
+
     /**
      * When in single-select mode, returns the currently selected file.
      *

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheetListener.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheetListener.java?rev=1539528&r1=1539527&r2=1539528&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheetListener.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/VFSBrowserSheetListener.java Thu Nov  7 05:33:15 2013
@@ -47,6 +47,12 @@ public interface VFSBrowserSheetListener
         }
 
         @Override
+        public void homeDirectoryChanged(VFSBrowserSheet fileBrowserSheet,
+            FileObject previousHomeDirectory) {
+            // empty block
+        }
+
+        @Override
         public void selectedFilesChanged(VFSBrowserSheet fileBrowserSheet,
             Sequence<FileObject> previousSelectedFiles) {
             // empty block
@@ -86,6 +92,16 @@ public interface VFSBrowserSheetListener
         FileObject previousRootDirectory);
 
     /**
+     * Called when a file browser sheet's home directory has changed.
+     * <p> Usually this would only be when you browse to another file system.
+     *
+     * @param fileBrowserSheet
+     * @param previousHomeDirectory
+     */
+    public void homeDirectoryChanged(VFSBrowserSheet fileBrowserSheet,
+        FileObject previousHomeDirectory);
+
+    /**
      * Called when a file browser sheet's selection state has been reset.
      *
      * @param fileBrowserSheet