You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2010/10/21 22:05:08 UTC

svn commit: r1026124 - in /pivot/trunk: core/src/org/apache/pivot/util/concurrent/Task.java wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSkin.java

Author: gbrown
Date: Thu Oct 21 20:05:08 2010
New Revision: 1026124

URL: http://svn.apache.org/viewvc?rev=1026124&view=rev
Log:
Resolve PIVOT-657.

Modified:
    pivot/trunk/core/src/org/apache/pivot/util/concurrent/Task.java
    pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSkin.java

Modified: pivot/trunk/core/src/org/apache/pivot/util/concurrent/Task.java
URL: http://svn.apache.org/viewvc/pivot/trunk/core/src/org/apache/pivot/util/concurrent/Task.java?rev=1026124&r1=1026123&r2=1026124&view=diff
==============================================================================
--- pivot/trunk/core/src/org/apache/pivot/util/concurrent/Task.java (original)
+++ pivot/trunk/core/src/org/apache/pivot/util/concurrent/Task.java Thu Oct 21 20:05:08 2010
@@ -237,10 +237,6 @@ public abstract class Task<V> {
      * throw a {@link AbortException}.
      */
     public synchronized void abort() {
-        if (taskListener == null) {
-            throw new IllegalStateException("Task is not currently pending.");
-        }
-
         abort = true;
     }
 }

Modified: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSkin.java?rev=1026124&r1=1026123&r2=1026124&view=diff
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSkin.java (original)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSkin.java Thu Oct 21 20:05:08 2010
@@ -34,7 +34,10 @@ import org.apache.pivot.collections.Sequ
 import org.apache.pivot.serialization.SerializationException;
 import org.apache.pivot.text.FileSizeFormat;
 import org.apache.pivot.util.Filter;
+import org.apache.pivot.util.concurrent.Task;
 import org.apache.pivot.util.concurrent.TaskExecutionException;
+import org.apache.pivot.util.concurrent.TaskListener;
+import org.apache.pivot.wtk.ApplicationContext;
 import org.apache.pivot.wtk.BoxPane;
 import org.apache.pivot.wtk.Button;
 import org.apache.pivot.wtk.ButtonPressListener;
@@ -63,6 +66,7 @@ import org.apache.pivot.wtk.Span;
 import org.apache.pivot.wtk.TableView;
 import org.apache.pivot.wtk.TableViewSelectionListener;
 import org.apache.pivot.wtk.TableViewSortListener;
+import org.apache.pivot.wtk.TaskAdapter;
 import org.apache.pivot.wtk.TextInput;
 import org.apache.pivot.wtk.TextInputContentListener;
 import org.apache.pivot.wtk.VerticalAlignment;
@@ -538,6 +542,59 @@ public class TerraFileBrowserSkin extend
         }
     }
 
+    private class RefreshFileListTask extends Task<Void> {
+        @Override
+        public Void execute() {
+            FileBrowser fileBrowser = (FileBrowser)getComponent();
+            File rootDirectory = fileBrowser.getRootDirectory();
+            File[] files = rootDirectory.listFiles(HIDDEN_FILE_FILTER);
+
+            String text = searchTextInput.getText().trim();
+            IncludeFileFilter includeFileFilter = new IncludeFileFilter(text.length() == 0 ? null : text,
+                hideDisabledFiles ? fileBrowser.getDisabledFileFilter() : null);
+
+            TableView.SortDictionary sort = fileTableView.getSort();
+
+            final FileComparator fileComparator;
+            if (sort.isEmpty()) {
+                fileComparator = null;
+            } else {
+                Dictionary.Pair<String, SortDirection> pair = fileTableView.getSort().get(0);
+                fileComparator = new FileComparator(pair.key, pair.value);
+            }
+
+            for (int i = 0; i < files.length && !abort; i++) {
+                final File file = files[i];
+
+                if (includeFileFilter.include(file)) {
+                    ApplicationContext.queueCallback(new Runnable() {
+                        @Override
+                        @SuppressWarnings("unchecked")
+                        public void run() {
+                            if (!abort) {
+                                ArrayList<File> fileTableData = (ArrayList<File>)fileTableView.getTableData();
+
+                                int index;
+                                if (fileComparator == null) {
+                                    index = fileTableData.getLength();
+                                } else {
+                                    index = ArrayList.binarySearch(fileTableData, file, fileComparator);
+                                    if (index < 0) {
+                                        index = -(index + 1);
+                                    }
+                                }
+
+                                fileTableData.insert(file, index);
+                            }
+                        }
+                    });
+                }
+            }
+
+            return null;
+        }
+    }
+
     private Component content = null;
 
     @BXML private ListButton driveListButton = null;
@@ -550,10 +607,13 @@ public class TerraFileBrowserSkin extend
     @BXML private ScrollPane fileScrollPane = null;
     @BXML private TableView fileTableView = null;
 
+    private boolean keyboardFolderTraversalEnabled = true;
     private boolean hideDisabledFiles = false;
 
     private boolean updatingSelection = false;
 
+    private RefreshFileListTask refreshFileListTask = null;
+
     private static final FileFilter HIDDEN_FILE_FILTER = new FileFilter() {
         @Override
         public boolean accept(File file) {
@@ -711,8 +771,15 @@ public class TerraFileBrowserSkin extend
 
         fileTableView.getTableViewSortListeners().add(new TableViewSortListener.Adapter() {
             @Override
+            @SuppressWarnings("unchecked")
             public void sortChanged(TableView tableView) {
-                sortFileList();
+                TableView.SortDictionary sort = fileTableView.getSort();
+
+                if (!sort.isEmpty()) {
+                    Dictionary.Pair<String, SortDirection> pair = fileTableView.getSort().get(0);
+                    List<File> files = (List<File>)fileTableView.getTableData();
+                    files.setComparator(new FileComparator(pair.key, pair.value));
+                }
             }
         });
 
@@ -806,6 +873,14 @@ public class TerraFileBrowserSkin extend
         return file;
     }
 
+    public boolean isKeyboardFolderTraversalEnabled() {
+        return keyboardFolderTraversalEnabled;
+    }
+
+    public void setKeyboardFolderTraversalEnabled(boolean keyboardFolderTraversalEnabled) {
+        this.keyboardFolderTraversalEnabled = keyboardFolderTraversalEnabled;
+    }
+
     public boolean isHideDisabledFiles() {
         return hideDisabledFiles;
     }
@@ -816,7 +891,8 @@ public class TerraFileBrowserSkin extend
     }
 
     /**
-     * {@link KeyCode#ENTER ENTER} Change into the selected directory.<br>
+     * {@link KeyCode#ENTER ENTER} Change into the selected directory if
+     * {@link #keyboardFolderTraversalEnabled} is true.<br>
      * {@link KeyCode#DELETE DELETE} or {@link KeyCode#BACKSPACE BACKSPACE}
      * Change into the parent of the current directory.<br>
      * {@link KeyCode#F5 F5} Refresh the file list.
@@ -827,7 +903,8 @@ public class TerraFileBrowserSkin extend
 
         FileBrowser fileBrowser = (FileBrowser)getComponent();
 
-        if (keyCode == Keyboard.KeyCode.ENTER) {
+        if (keyCode == Keyboard.KeyCode.ENTER
+            && keyboardFolderTraversalEnabled) {
             Sequence<File> selectedFiles = fileBrowser.getSelectedFiles();
 
             if (selectedFiles.getLength() == 1) {
@@ -983,35 +1060,28 @@ public class TerraFileBrowserSkin extend
     }
 
     private void refreshFileList() {
-        FileBrowser fileBrowser = (FileBrowser)getComponent();
-        File rootDirectory = fileBrowser.getRootDirectory();
-        File[] files = rootDirectory.listFiles(HIDDEN_FILE_FILTER);
-
-        String text = searchTextInput.getText().trim();
-        IncludeFileFilter includeFileFilter = new IncludeFileFilter(text.length() == 0 ? null : text,
-            hideDisabledFiles ? fileBrowser.getDisabledFileFilter() : null);
-
-        ArrayList<File> filteredFiles = new ArrayList<File>();
-
-        for (int i = 0; i < files.length; i++) {
-            File file = files[i];
-            if (includeFileFilter.include(file)) {
-                filteredFiles.add(file);
-            }
+        // Cancel any outstanding task
+        if (refreshFileListTask != null) {
+            refreshFileListTask.abort();
         }
 
-        fileTableView.setTableData(filteredFiles);
-        sortFileList();
-    }
+        fileTableView.setTableData(new ArrayList<File>());
 
-    @SuppressWarnings("unchecked")
-    private void sortFileList() {
-        TableView.SortDictionary sort = fileTableView.getSort();
+        refreshFileListTask = new RefreshFileListTask();
+        refreshFileListTask.execute(new TaskAdapter<Void>(new TaskListener<Void>() {
+            @Override
+            public void taskExecuted(Task<Void> task) {
+                if (task == refreshFileListTask) {
+                    refreshFileListTask = null;
+                }
+            }
 
-        if (!sort.isEmpty()) {
-            Dictionary.Pair<String, SortDirection> pair = fileTableView.getSort().get(0);
-            List<File> files = (List<File>)fileTableView.getTableData();
-            files.setComparator(new FileComparator(pair.key, pair.value));
-        }
+            @Override
+            public void executeFailed(Task<Void> task) {
+                if (task == refreshFileListTask) {
+                    refreshFileListTask = null;
+                }
+            }
+        }));
     }
 }