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;
+ }
+ }
+ }));
}
}