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/05/24 23:22:40 UTC

svn commit: r1486223 [2/3] - in /pivot/trunk: ./ core/src/org/apache/pivot/io/ tests/src/org/apache/pivot/tests/ wtk-terra/src/org/apache/pivot/wtk/skin/terra/ wtk/lib/ wtk/src/org/apache/pivot/wtk/ wtk/src/org/apache/pivot/wtk/skin/

Added: 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=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.java (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.java Fri May 24 21:22:39 2013
@@ -0,0 +1,1346 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pivot.wtk.skin.terra;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.io.IOException;
+import java.io.Serializable;
+import java.text.DateFormat;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+
+import org.apache.commons.vfs2.FileFilter;
+import org.apache.commons.vfs2.FileName;
+import org.apache.commons.vfs2.FileObject;
+import org.apache.commons.vfs2.FileSelectInfo;
+import org.apache.commons.vfs2.FileSelector;
+import org.apache.commons.vfs2.FileSystemException;
+import org.apache.commons.vfs2.FileSystemManager;
+import org.apache.commons.vfs2.FileType;
+import org.apache.pivot.beans.BXML;
+import org.apache.pivot.beans.BXMLSerializer;
+import org.apache.pivot.collections.ArrayList;
+import org.apache.pivot.collections.Dictionary;
+import org.apache.pivot.collections.List;
+import org.apache.pivot.collections.Sequence;
+import org.apache.pivot.serialization.SerializationException;
+import org.apache.pivot.text.FileSizeFormat;
+import org.apache.pivot.util.Filter;
+import org.apache.pivot.util.concurrent.AbortException;
+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.ActivityIndicator;
+import org.apache.pivot.wtk.BoxPane;
+import org.apache.pivot.wtk.Button;
+import org.apache.pivot.wtk.ButtonPressListener;
+import org.apache.pivot.wtk.Component;
+import org.apache.pivot.wtk.ComponentKeyListener;
+import org.apache.pivot.wtk.ComponentMouseButtonListener;
+import org.apache.pivot.wtk.Container;
+import org.apache.pivot.wtk.Dimensions;
+import org.apache.pivot.wtk.VFSBrowser;
+import org.apache.pivot.wtk.FocusTraversalDirection;
+import org.apache.pivot.wtk.GridPane;
+import org.apache.pivot.wtk.HorizontalAlignment;
+import org.apache.pivot.wtk.ImageView;
+import org.apache.pivot.wtk.Insets;
+import org.apache.pivot.wtk.Keyboard;
+import org.apache.pivot.wtk.Keyboard.KeyCode;
+import org.apache.pivot.wtk.Label;
+import org.apache.pivot.wtk.ListButton;
+import org.apache.pivot.wtk.ListButtonSelectionListener;
+import org.apache.pivot.wtk.ListView;
+import org.apache.pivot.wtk.Mouse;
+import org.apache.pivot.wtk.Platform;
+import org.apache.pivot.wtk.Point;
+import org.apache.pivot.wtk.PushButton;
+import org.apache.pivot.wtk.ScrollPane;
+import org.apache.pivot.wtk.SortDirection;
+import org.apache.pivot.wtk.Span;
+import org.apache.pivot.wtk.StackPane;
+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;
+import org.apache.pivot.wtk.media.Image;
+import org.apache.pivot.wtk.skin.VFSBrowserSkin;
+
+/**
+ * Terra Commons VFS browser skin.
+ */
+public class TerraVFSBrowserSkin extends VFSBrowserSkin {
+
+    public static final String HOME_DIRECTORY = System.getProperty("user.home");
+
+    /**
+     * Abstract renderer for displaying file system contents.
+     */
+    public static abstract class FileRenderer extends BoxPane {
+        protected ImageView imageView = new ImageView();
+        protected Label label = new Label();
+
+        public static final int ICON_WIDTH = 16;
+        public static final int ICON_HEIGHT = 16;
+
+        public static final Image FOLDER_IMAGE;
+        public static final Image HOME_FOLDER_IMAGE;
+        public static final Image FILE_IMAGE;
+
+        static {
+            try {
+                FOLDER_IMAGE = Image.load(FileRenderer.class.getResource("folder.png"));
+                HOME_FOLDER_IMAGE = Image.load(FileRenderer.class.getResource("folder_home.png"));
+                FILE_IMAGE = Image.load(FileRenderer.class.getResource("page_white.png"));
+            } catch (TaskExecutionException exception) {
+                throw new RuntimeException(exception);
+            }
+        }
+
+        public FileRenderer() {
+            getStyles().put("verticalAlignment", VerticalAlignment.CENTER);
+
+            add(imageView);
+            add(label);
+
+            imageView.setPreferredSize(ICON_WIDTH, ICON_HEIGHT);
+            imageView.getStyles().put("backgroundColor", null);
+        }
+
+        @Override
+        public void setSize(int width, int height) {
+            super.setSize(width, height);
+
+            // Since this component doesn't have a parent, it won't be validated
+            // via layout; ensure that it is valid here
+            validate();
+        }
+
+        /**
+         * Obtains the icon to display for a given file.
+         *
+         * @param file
+         */
+        public static Image getIcon(FileObject file) {
+            Image icon;
+            if (file.getName().getType() == FileType.FOLDER) {
+                icon = file.getName().getPath().equals(HOME_DIRECTORY) ? HOME_FOLDER_IMAGE : FOLDER_IMAGE;
+            } else {
+                icon = FILE_IMAGE;
+            }
+
+            return icon;
+        }
+    }
+
+    /**
+     * List button file renderer.
+     */
+    public static class ListButtonFileRenderer extends FileRenderer implements Button.DataRenderer {
+        public ListButtonFileRenderer() {
+            getStyles().put("horizontalAlignment", HorizontalAlignment.LEFT);
+        }
+
+        @Override
+        public void render(Object data, Button button, boolean highlight) {
+            if (data != null) {
+                FileObject file = (FileObject)data;
+
+                // Update the image view
+                imageView.setImage(getIcon(file));
+                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");
+                }
+
+                label.setText(text);
+            }
+        }
+
+        @Override
+        public String toString(Object item) {
+            FileObject file = (FileObject)item;
+            String text = file.getName().getBaseName();
+            if (text.length() == 0) {
+                text = System.getProperty("file.separator");
+            }
+
+            return text;
+        }
+    }
+
+    /**
+     * List view file renderer.
+     */
+    public static class ListViewFileRenderer extends FileRenderer implements ListView.ItemRenderer {
+        public ListViewFileRenderer() {
+            getStyles().put("horizontalAlignment", HorizontalAlignment.LEFT);
+            getStyles().put("padding", new Insets(2, 3, 2, 3));
+        }
+
+        @Override
+        public void render(Object item, int index, ListView listView, boolean selected,
+            boolean checked, boolean highlighted, boolean disabled) {
+            label.getStyles().put("font", listView.getStyles().get("font"));
+
+            Object color = null;
+            if (listView.isEnabled() && !disabled) {
+                if (selected) {
+                    if (listView.isFocused()) {
+                        color = listView.getStyles().get("selectionColor");
+                    } else {
+                        color = listView.getStyles().get("inactiveSelectionColor");
+                    }
+                } else {
+                    color = listView.getStyles().get("color");
+                }
+            } else {
+                color = listView.getStyles().get("disabledColor");
+            }
+
+            label.getStyles().put("color", color);
+
+            if (item != null) {
+                FileObject file = (FileObject)item;
+
+                // Update the image view
+                imageView.setImage(getIcon(file));
+                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().getPath();
+                if (text.length() == 0) {
+                    text = FileName.ROOT_PATH;
+                }
+
+                label.setText(text);
+            }
+        }
+
+        @Override
+        public String toString(Object item) {
+            FileObject file = (FileObject)item;
+            // TODO: should this be the full path or the base name?
+            String text = file.getName().getPath();
+            if (text.length() == 0) {
+                text = FileName.ROOT_PATH;
+            }
+
+            return text;
+        }
+    }
+
+    /**
+     * Table view file renderer.
+     */
+    public static class TableViewFileRenderer extends FileRenderer
+        implements TableView.CellRenderer {
+        public static final String NAME_KEY = "name";
+        public static final String SIZE_KEY = "size";
+        public static final String LAST_MODIFIED_KEY = "lastModified";
+
+        public TableViewFileRenderer() {
+            getStyles().put("horizontalAlignment", HorizontalAlignment.CENTER);
+            getStyles().put("padding", new Insets(2));
+        }
+
+        @Override
+        public void render(Object row, int rowIndex, int columnIndex,
+            TableView tableView, String columnName,
+            boolean selected, boolean highlighted, boolean disabled) {
+            if (row != null) {
+                FileObject file = (FileObject)row;
+
+                String text = null;
+                Image icon = null;
+
+                try {
+                    if (columnName.equals(NAME_KEY)) {
+                        text = file.getName().getBaseName();
+                        icon = getIcon(file);
+                        getStyles().put("horizontalAlignment", HorizontalAlignment.LEFT);
+                    } else if (columnName.equals(SIZE_KEY)) {
+                        if (file.getType() == FileType.FOLDER) {
+                            text = "";
+                        } else {
+                            long length = file.getContent().getSize();
+                            text = FileSizeFormat.getInstance().format(length);
+                        }
+                        getStyles().put("horizontalAlignment", HorizontalAlignment.RIGHT);
+                    } else if (columnName.equals(LAST_MODIFIED_KEY)) {
+                        long lastModified = file.getContent().getLastModifiedTime();
+                        Date lastModifiedDate = new Date(lastModified);
+                        text = DATE_FORMAT.format(lastModifiedDate);
+                        getStyles().put("horizontalAlignment", HorizontalAlignment.RIGHT);
+                    } else {
+                        System.err.println("Unexpected column name in " + getClass().getName()
+                            + ": " + columnName);
+                    }
+                } catch (FileSystemException fse) {
+                    // TODO: should we display an exception error here?
+                    throw new RuntimeException(fse);
+                }
+
+                label.setText(text);
+                imageView.setImage(icon);
+            }
+
+            Font font = (Font)tableView.getStyles().get("font");
+            label.getStyles().put("font", font);
+
+            Color color;
+            if (tableView.isEnabled() && !disabled) {
+                if (selected) {
+                    if (tableView.isFocused()) {
+                        color = (Color)tableView.getStyles().get("selectionColor");
+                    } else {
+                        color = (Color)tableView.getStyles().get("inactiveSelectionColor");
+                    }
+                } else {
+                    color = (Color)tableView.getStyles().get("color");
+                }
+            } else {
+                color = (Color)tableView.getStyles().get("disabledColor");
+            }
+
+            label.getStyles().put("color", color);
+        }
+
+        @Override
+        public String toString(Object row, String columnName) {
+            String string;
+
+            FileObject file = (FileObject)row;
+            try {
+                if (columnName.equals(NAME_KEY)) {
+                    string = file.getName().getBaseName();
+                } else if (columnName.equals(SIZE_KEY)) {
+                    if (file.getType() == FileType.FOLDER) {
+                        string = "";
+                    } else {
+                        long length = file.getContent().getSize();
+                        string = FileSizeFormat.getInstance().format(length);
+                    }
+                } else if (columnName.equals(LAST_MODIFIED_KEY)) {
+                    long lastModified = file.getContent().getLastModifiedTime();
+                    Date lastModifiedDate = new Date(lastModified);
+                    string = DATE_FORMAT.format(lastModifiedDate);
+                } else {
+                    System.err.println("Unexpected column name in " + getClass().getName()
+                        + ": " + columnName);
+                    string = null;
+                }
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+
+            return string;
+        }
+    }
+
+    /**
+     * Abstract base class for drive renderers.
+     */
+    public static abstract class DriveRenderer extends BoxPane {
+        protected ImageView imageView = new ImageView();
+        protected Label label = new Label();
+
+        public static final int ICON_WIDTH = 16;
+        public static final int ICON_HEIGHT = 16;
+
+        public static final Image DRIVE_IMAGE;
+
+        static {
+            try {
+                DRIVE_IMAGE = Image.load(FileRenderer.class.getResource("drive.png"));
+            } catch (TaskExecutionException exception) {
+                throw new RuntimeException(exception);
+            }
+        }
+
+        public DriveRenderer() {
+            getStyles().put("verticalAlignment", VerticalAlignment.CENTER);
+
+            add(imageView);
+            add(label);
+
+            imageView.setPreferredSize(ICON_WIDTH, ICON_HEIGHT);
+            imageView.getStyles().put("backgroundColor", null);
+        }
+
+        @Override
+        public void setSize(int width, int height) {
+            super.setSize(width, height);
+
+            // Since this component doesn't have a parent, it won't be validated
+            // via layout; ensure that it is valid here
+            validate();
+        }
+    }
+
+    /**
+     * List button drive renderer.
+     */
+    public static class ListButtonDriveRenderer extends DriveRenderer
+        implements Button.DataRenderer {
+        public ListButtonDriveRenderer() {
+            getStyles().put("horizontalAlignment", HorizontalAlignment.LEFT);
+        }
+
+        @Override
+        public void render(Object data, Button button, boolean highlight) {
+            if (data != null) {
+                FileObject file = (FileObject)data;
+
+                // Update the image view
+                imageView.setImage(DRIVE_IMAGE);
+                imageView.getStyles().put("opacity", button.isEnabled() ? 1.0f : 0.5f);
+
+                // Update the label
+                label.setText(file.toString());
+            }
+        }
+
+        @Override
+        public String toString(Object data) {
+            return null;
+        }
+    }
+
+    /**
+     * List view drive renderer.
+     */
+    public static class ListViewDriveRenderer extends DriveRenderer
+        implements ListView.ItemRenderer {
+        public ListViewDriveRenderer() {
+            getStyles().put("horizontalAlignment", HorizontalAlignment.LEFT);
+            getStyles().put("padding", new Insets(2, 3, 2, 3));
+        }
+
+        @Override
+        public void render(Object item, int index, ListView listView, boolean selected,
+            boolean checked, boolean highlighted, boolean disabled) {
+            label.getStyles().put("font", listView.getStyles().get("font"));
+
+            Object color = null;
+            if (listView.isEnabled() && !disabled) {
+                if (selected) {
+                    if (listView.isFocused()) {
+                        color = listView.getStyles().get("selectionColor");
+                    } else {
+                        color = listView.getStyles().get("inactiveSelectionColor");
+                    }
+                } else {
+                    color = listView.getStyles().get("color");
+                }
+            } else {
+                color = listView.getStyles().get("disabledColor");
+            }
+
+            label.getStyles().put("color", color);
+
+            if (item != null) {
+                FileObject file = (FileObject)item;
+
+                // Update the image view
+                imageView.setImage(DRIVE_IMAGE);
+                imageView.getStyles().put("opacity",
+                    (listView.isEnabled() && !disabled) ? 1.0f : 0.5f);
+
+                // Update the label
+                label.setText(file.toString());
+            }
+        }
+
+        @Override
+        public String toString(Object item) {
+            return null;
+        }
+    }
+
+    public static abstract class FileComparator implements Comparator<FileObject>, Serializable {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public abstract int compare(FileObject f1, FileObject f2);
+    }
+
+    public static class FileNameAscendingComparator extends FileComparator {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public int compare(FileObject f1, FileObject f2) {
+            boolean file1IsDirectory = f1.getName().getType() == FileType.FOLDER;
+            boolean file2IsDirectory = f2.getName().getType() == FileType.FOLDER;
+
+            int result;
+            if (file1IsDirectory && !file2IsDirectory) {
+                result = -1;
+            } else if (!file1IsDirectory && file2IsDirectory) {
+                result = 1;
+            } else {
+                // Do the compare according to the rules of the file system
+                result = f1.compareTo(f2);
+            }
+            return result;
+        }
+    }
+
+    public static class FileNameDescendingComparator extends FileComparator {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public int compare(FileObject f1, FileObject f2) {
+            boolean file1IsDirectory = f1.getName().getType() == FileType.FOLDER;
+            boolean file2IsDirectory = f2.getName().getType() == FileType.FOLDER;
+
+            int result;
+            if (file1IsDirectory && !file2IsDirectory) {
+                result = -1;
+            } else if (!file1IsDirectory && file2IsDirectory) {
+                result = 1;
+            } else {
+                // Do the compare according to the rules of the file system
+                result = f2.compareTo(f1);
+            }
+            return result;
+        }
+    }
+
+    public static class FileSizeAscendingComparator extends FileComparator {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public int compare(FileObject f1, FileObject f2) {
+            try {
+                boolean file1IsDirectory = f1.getType() == FileType.FOLDER;
+                boolean file2IsDirectory = f2.getType() == FileType.FOLDER;
+                long size1 = file1IsDirectory ? 0L : f1.getContent().getSize();
+                long size2 = file2IsDirectory ? 0L : f2.getContent().getSize();
+                return Long.signum(size1 - size2);
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+        }
+    }
+
+    public static class FileSizeDescendingComparator extends FileComparator {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public int compare(FileObject f1, FileObject f2) {
+            try {
+                boolean file1IsDirectory = f1.getType() == FileType.FOLDER;
+                boolean file2IsDirectory = f2.getType() == FileType.FOLDER;
+                long size1 = file1IsDirectory ? 0L : f1.getContent().getSize();
+                long size2 = file2IsDirectory ? 0L : f2.getContent().getSize();
+                return Long.signum(size2 - size1);
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+        }
+    }
+
+    public static class FileDateAscendingComparator extends FileComparator {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public int compare(FileObject f1, FileObject f2) {
+            try {
+                return Long.signum(f1.getContent().getLastModifiedTime() - f2.getContent().getLastModifiedTime());
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+        }
+    }
+
+    public static class FileDateDescendingComparator extends FileComparator {
+        private static final long serialVersionUID = 1L;
+        @Override
+        public int compare(FileObject f1, FileObject f2) {
+            try {
+                return Long.signum(f2.getContent().getLastModifiedTime() - f1.getContent().getLastModifiedTime());
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+        }
+    }
+
+    /**
+     * FileObject comparator.
+     */
+    public static FileComparator getFileComparator(String columnName, SortDirection sortDirection) {
+        if (columnName.equals("name")) {
+            return sortDirection == SortDirection.ASCENDING ?
+                    new FileNameAscendingComparator() :
+                    new FileNameDescendingComparator();
+        }
+        else if (columnName.equals("size")) {
+            return sortDirection == SortDirection.ASCENDING ?
+                    new FileSizeAscendingComparator() :
+                    new FileSizeDescendingComparator();
+        }
+        else if (columnName.equals("lastModified")) {
+            return sortDirection == SortDirection.ASCENDING ?
+                    new FileDateAscendingComparator() :
+                    new FileDateDescendingComparator();
+        }
+        else {
+            throw new IllegalArgumentException();
+        }
+    }
+
+    /**
+     * Include file filter.
+     */
+    public static class IncludeFileFilter implements Filter<FileObject> {
+        private String match;
+
+        public IncludeFileFilter() {
+            this(null);
+        }
+
+        public IncludeFileFilter(String match) {
+            this.match = (match == null ? null : match.toLowerCase());
+        }
+
+        @Override
+        public boolean include(FileObject file) {
+            boolean include = true;
+
+            if (match != null) {
+                String name = file.getName().getBaseName();
+                name = name.toLowerCase();
+
+                if (match.startsWith("*")) {
+                    if (match.length() == 1) {
+                        include = true;
+                    } else {
+                        include = name.contains(match.substring(1));
+                    }
+                } else {
+                    include = name.startsWith(match);
+                }
+            }
+
+            return include;
+        }
+    }
+
+    public static class FullFileSelector implements FileSelector {
+        private Filter<FileObject> includeFileFilter;
+        private Filter<FileObject> excludeFileFilter;
+
+        public FullFileSelector(Filter<FileObject> includeFileFilter, Filter<FileObject> excludeFileFilter) {
+            this.includeFileFilter = includeFileFilter;
+            this.excludeFileFilter = excludeFileFilter;
+        }
+
+        @Override
+        public boolean includeFile(FileSelectInfo fileInfo) {
+            boolean include = HIDDEN_FILE_FILTER.accept(fileInfo);
+            if (include
+                && includeFileFilter != null) {
+                include = includeFileFilter.include(fileInfo.getFile());
+            }
+            if (include
+                && excludeFileFilter != null) {
+                include = !excludeFileFilter.include(fileInfo.getFile());
+            }
+            // Don't include the base folder itself
+            if (include
+                && fileInfo.getFile() == fileInfo.getBaseFolder()) {
+                include = false;
+            }
+            return include;
+        }
+
+        @Override
+        public boolean traverseDescendents(FileSelectInfo fileInfo) {
+            // Only traverse the first-level descendents
+            return fileInfo.getDepth() == 0;
+        }
+    }
+
+    private class RefreshFileListTask extends Task<ArrayList<FileObject>> {
+        private Filter<FileObject> includeFileFilter;
+        private Filter<FileObject> excludeFileFilter;
+        private FileComparator fileComparator;
+
+        public RefreshFileListTask(Filter<FileObject> includeFileFilter,
+                Filter<FileObject> excludeFileFilter,
+                FileComparator fileComparator) {
+            this.includeFileFilter = includeFileFilter;
+            this.excludeFileFilter = excludeFileFilter;
+            this.fileComparator = fileComparator;
+        }
+
+        @Override
+        public ArrayList<FileObject> execute() {
+            VFSBrowser fileBrowser = (VFSBrowser)getComponent();
+
+            FileObject rootDirectory = fileBrowser.getRootDirectory();
+            if (abort) {
+                throw new AbortException();
+            }
+
+            try {
+                FileObject[] files = rootDirectory.findFiles(new FullFileSelector(includeFileFilter, excludeFileFilter));
+                if (abort) {
+                    throw new AbortException();
+                }
+
+                Arrays.sort(files, fileComparator);
+
+                return new ArrayList<FileObject>(files, 0, files.length);
+
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+        }
+    }
+
+    private Component content = null;
+
+    @BXML private ListButton driveListButton = null;
+    @BXML private ListButton pathListButton = null;
+    @BXML private PushButton goUpButton = null;
+    @BXML private PushButton newFolderButton = null;
+    @BXML private PushButton goHomeButton = null;
+    @BXML private TextInput searchTextInput = null;
+
+    @BXML private StackPane fileStackPane = null;
+    @BXML private ScrollPane fileScrollPane = null;
+    @BXML private TableView fileTableView = null;
+
+    private ActivityIndicator indicator = null;
+    private GridPane activityGrid = null;
+
+    private boolean keyboardFolderTraversalEnabled = true;
+    private boolean hideDisabledFiles = false;
+
+    private boolean updatingSelection = false;
+    private boolean refreshRoots = true;
+
+    private RefreshFileListTask refreshFileListTask = null;
+
+    private static final FileFilter HIDDEN_FILE_FILTER = new FileFilter() {
+        @Override
+        public boolean accept(FileSelectInfo fileInfo) {
+            try {
+                return !fileInfo.getFile().isHidden();
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+        }
+    };
+
+    private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(
+        DateFormat.SHORT, DateFormat.SHORT);
+
+
+    @Override
+    public void install(Component component) {
+        super.install(component);
+        final VFSBrowser fileBrowser = (VFSBrowser)component;
+        BXMLSerializer bxmlSerializer = new BXMLSerializer();
+        try {
+            content = (Component)bxmlSerializer.readObject(TerraVFSBrowserSkin.class,
+                "terra_vfs_browser_skin.bxml", true);
+        } catch (IOException exception) {
+            throw new RuntimeException(exception);
+        } catch (SerializationException exception) {
+            throw new RuntimeException(exception);
+        }
+        fileBrowser.add(content);
+
+        bxmlSerializer.bind(this, TerraVFSBrowserSkin.class);
+
+        driveListButton.getListButtonSelectionListeners().add(new ListButtonSelectionListener.Adapter() {
+            @Override
+            public void selectedItemChanged(ListButton listButton, Object previousSelectedItem) {
+                if (previousSelectedItem != null) {
+                    FileObject drive = (FileObject)listButton.getSelectedItem();
+                    try {
+                        if(drive.isReadable()) {
+                            fileBrowser.setRootDirectory(drive);
+                        } else {
+                            refreshRoots = true;
+                            listButton.setSelectedItem(previousSelectedItem);
+                        }
+                    } catch (FileSystemException fse) {
+                        throw new RuntimeException(fse);
+                    }
+                }
+            }
+        });
+
+        pathListButton.getListButtonSelectionListeners().add(new ListButtonSelectionListener.Adapter() {
+            @Override
+            public void selectedItemChanged(ListButton listButton, Object previousSelectedItem) {
+                FileObject ancestorDirectory = (FileObject)listButton.getSelectedItem();
+
+                if (ancestorDirectory != null) {
+                    try {
+                        fileBrowser.setRootDirectory(ancestorDirectory);
+                    } catch (FileSystemException fse) {
+                        throw new RuntimeException(fse);
+                    }
+                }
+            }
+        });
+
+        goUpButton.getButtonPressListeners().add(new ButtonPressListener() {
+            @Override
+            public void buttonPressed(Button button) {
+                try {
+                    FileObject rootDirectory = fileBrowser.getRootDirectory();
+                    FileObject parentDirectory = rootDirectory.getParent();
+                    fileBrowser.setRootDirectory(parentDirectory);
+                } catch (FileSystemException fse) {
+                    throw new RuntimeException(fse);
+                }
+            }
+        });
+
+        newFolderButton.getButtonPressListeners().add(new ButtonPressListener() {
+            @Override
+            public void buttonPressed(Button button) {
+                // TODO
+            }
+        });
+
+        goHomeButton.getButtonPressListeners().add(new ButtonPressListener() {
+            @Override
+            public void buttonPressed(Button button) {
+                try {
+                    fileBrowser.setRootDirectory(HOME_DIRECTORY);
+                } catch (FileSystemException fse) {
+                    throw new RuntimeException(fse);
+                }
+            }
+        });
+
+        /**
+         * {@link KeyCode#DOWN DOWN} Transfer focus to the file list and select
+         * the first item.<br>
+         * {@link KeyCode#ESCAPE ESCAPE} Clear the search field.
+         */
+        searchTextInput.getComponentKeyListeners().add(new ComponentKeyListener.Adapter() {
+            @Override
+            public boolean keyPressed(Component componentArgument, int keyCode, Keyboard.KeyLocation keyLocation) {
+                boolean consumed = super.keyPressed(componentArgument, keyCode, keyLocation);
+
+                if (keyCode == Keyboard.KeyCode.ESCAPE) {
+                    searchTextInput.setText("");
+                    consumed = true;
+                } else if (keyCode == Keyboard.KeyCode.DOWN) {
+                    if (fileTableView.getTableData().getLength() > 0) {
+                        fileTableView.setSelectedIndex(0);
+                        fileTableView.requestFocus();
+                    }
+                }
+
+                return consumed;
+            }
+        });
+
+        searchTextInput.getTextInputContentListeners().add(new TextInputContentListener.Adapter() {
+            @Override
+            public void textChanged(TextInput textInput) {
+                refreshFileList();
+            }
+        });
+
+        fileTableView.getTableViewSelectionListeners().add(new TableViewSelectionListener() {
+            @Override
+            @SuppressWarnings("unchecked")
+            public void selectedRangeAdded(TableView tableView, int rangeStart, int rangeEnd) {
+                if (!updatingSelection) {
+                    updatingSelection = true;
+
+                    try {
+                        for (int i = rangeStart; i <= rangeEnd; i++) {
+                            List<FileObject> files = (List<FileObject>)fileTableView.getTableData();
+                            FileObject file = files.get(i);
+                            fileBrowser.addSelectedFile(file);
+                        }
+                    } catch (FileSystemException fse) {
+                        throw new RuntimeException(fse);
+                    }
+
+                    updatingSelection = false;
+                }
+            }
+
+            @Override
+            @SuppressWarnings("unchecked")
+            public void selectedRangeRemoved(TableView tableView, int rangeStart, int rangeEnd) {
+                if (!updatingSelection) {
+                    updatingSelection = true;
+
+                    for (int i = rangeStart; i <= rangeEnd; i++) {
+                        List<FileObject> files = (List<FileObject>)fileTableView.getTableData();
+                        FileObject file = files.get(i);
+                        fileBrowser.removeSelectedFile(file);
+                    }
+
+                    updatingSelection = false;
+                }
+            }
+
+            @Override
+            @SuppressWarnings("unchecked")
+            public void selectedRangesChanged(TableView tableView, Sequence<Span> previousSelectedRanges) {
+                if (!updatingSelection && previousSelectedRanges != null) {
+                    updatingSelection = true;
+
+                    Sequence<FileObject> files = (Sequence<FileObject>)tableView.getSelectedRows();
+                    for (int i = 0, n = files.getLength(); i < n; i++) {
+                        FileObject file = files.get(i);
+                        files.update(i, file);
+                    }
+
+                    try {
+                        fileBrowser.setSelectedFiles(files);
+                    } catch (FileSystemException fse) {
+                        throw new RuntimeException(fse);
+                    }
+
+                    updatingSelection = false;
+                }
+            }
+
+            @Override
+            public void selectedRowChanged(TableView tableView, Object previousSelectedRow) {
+                // No-op
+            }
+        });
+
+        fileTableView.getTableViewSortListeners().add(new TableViewSortListener.Adapter() {
+            @Override
+            @SuppressWarnings("unchecked")
+            public void sortChanged(TableView tableView) {
+                TableView.SortDictionary sort = fileTableView.getSort();
+
+                if (!sort.isEmpty()) {
+                    Dictionary.Pair<String, SortDirection> pair = fileTableView.getSort().get(0);
+                    List<FileObject> files = (List<FileObject>)fileTableView.getTableData();
+                    files.setComparator(getFileComparator(pair.key, pair.value));
+                }
+            }
+        });
+
+        fileTableView.getComponentMouseButtonListeners().add(new ComponentMouseButtonListener.Adapter() {
+            private int index = -1;
+
+            @Override
+            public boolean mouseClick(Component componentArgument, Mouse.Button button, int x, int y, int count) {
+                boolean consumed = super.mouseClick(componentArgument, button, x, y, count);
+
+                if (count == 1) {
+                    index = fileTableView.getRowAt(y);
+                } else if (count == 2) {
+                    int indexLocal = fileTableView.getRowAt(y);
+                    if (indexLocal != -1
+                        && indexLocal == this.index
+                        && fileTableView.isRowSelected(indexLocal)) {
+                        FileObject file = (FileObject)fileTableView.getTableData().get(indexLocal);
+
+                        try {
+                            if (file.getName().getType() == FileType.FOLDER) {
+                                fileBrowser.setRootDirectory(file);
+                                consumed = true;
+                            }
+                        } catch (FileSystemException fse) {
+                            throw new RuntimeException(fse);
+                        }
+                    }
+                }
+
+                return consumed;
+            }
+        });
+
+        fileBrowser.setFocusTraversalPolicy(new IndexFocusTraversalPolicy() {
+            @Override
+            public Component getNextComponent(Container container, Component componentArgument,
+                FocusTraversalDirection direction) {
+                Component nextComponent;
+                if (componentArgument == null) {
+                    nextComponent = fileTableView;
+                } else {
+                    nextComponent = super.getNextComponent(container, componentArgument, direction);
+                }
+
+                return nextComponent;
+            }
+        });
+
+        fileTableView.setSort(TableViewFileRenderer.NAME_KEY, SortDirection.ASCENDING);
+        rootDirectoryChanged(fileBrowser, null);
+        selectedFilesChanged(fileBrowser, null);
+    }
+
+    @Override
+    public int getPreferredWidth(int height) {
+        return content.getPreferredWidth(height);
+    }
+
+    @Override
+    public int getPreferredHeight(int width) {
+        return content.getPreferredHeight(width);
+    }
+
+    @Override
+    public Dimensions getPreferredSize() {
+        return content.getPreferredSize();
+    }
+
+    @Override
+    public void layout() {
+        int width = getWidth();
+        int height = getHeight();
+
+        content.setLocation(0, 0);
+        content.setSize(width, height);
+    }
+
+    @Override
+    public FileObject getFileAt(int x, int y) {
+        FileObject file = null;
+
+        VFSBrowser fileBrowser = (VFSBrowser)getComponent();
+        Component component = fileBrowser.getDescendantAt(x, y);
+        if (component == fileTableView) {
+            Point location = fileTableView.mapPointFromAncestor(fileBrowser, x, y);
+
+            int index = fileTableView.getRowAt(location.y);
+            if (index != -1) {
+                file = (FileObject)fileTableView.getTableData().get(index);
+            }
+        }
+
+        return file;
+    }
+
+    public boolean isKeyboardFolderTraversalEnabled() {
+        return keyboardFolderTraversalEnabled;
+    }
+
+    public void setKeyboardFolderTraversalEnabled(boolean keyboardFolderTraversalEnabled) {
+        this.keyboardFolderTraversalEnabled = keyboardFolderTraversalEnabled;
+    }
+
+    public boolean isHideDisabledFiles() {
+        return hideDisabledFiles;
+    }
+
+    public void setHideDisabledFiles(boolean hideDisabledFiles) {
+        this.hideDisabledFiles = hideDisabledFiles;
+        refreshFileList();
+    }
+
+    /**
+     * {@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.
+     */
+    @Override
+    public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
+        boolean consumed = super.keyPressed(component, keyCode, keyLocation);
+
+        VFSBrowser fileBrowser = (VFSBrowser)getComponent();
+
+        if (keyCode == Keyboard.KeyCode.ENTER
+            && keyboardFolderTraversalEnabled) {
+            Sequence<FileObject> selectedFiles = fileBrowser.getSelectedFiles();
+
+            if (selectedFiles.getLength() == 1) {
+                FileObject selectedFile = selectedFiles.get(0);
+                try {
+                    if (selectedFile.getName().getType() == FileType.FOLDER) {
+                        fileBrowser.setRootDirectory(selectedFile);
+                        consumed = true;
+                    }
+                } catch (FileSystemException fse) {
+                    throw new RuntimeException(fse);
+                }
+            }
+        } else if (keyCode == Keyboard.KeyCode.DELETE
+            || keyCode == Keyboard.KeyCode.BACKSPACE) {
+            FileObject rootDirectory = fileBrowser.getRootDirectory();
+            try {
+                FileObject parentDirectory = rootDirectory.getParent();
+                if (parentDirectory != null) {
+                    fileBrowser.setRootDirectory(parentDirectory);
+                    consumed = true;
+                }
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }
+        } else if (keyCode == Keyboard.KeyCode.F5) {
+            refreshFileList();
+            consumed = true;
+        }
+
+        return consumed;
+    }
+
+    /**
+     * CommandModifier + {@link KeyCode#F F} Transfers focus to the search
+     * TextInput.
+     *
+     * @see Platform#getCommandModifier()
+     */
+    @Override
+    public boolean keyReleased(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
+        boolean consumed = super.keyReleased(component, keyCode, keyLocation);
+
+        Keyboard.Modifier commandModifier = Platform.getCommandModifier();
+        if (keyCode == Keyboard.KeyCode.F
+            && Keyboard.isPressed(commandModifier)) {
+            searchTextInput.requestFocus();
+            consumed = true;
+        }
+
+        return consumed;
+    }
+
+    @Override
+    public void managerChanged(VFSBrowser fileBrowser, FileSystemManager previousManager) {
+        // TODO: Is there anything to do here?  Surely, but what?
+    }
+
+    @Override
+    public void rootDirectoryChanged(VFSBrowser fileBrowser, FileObject previousRootDirectory) {
+        ArrayList<FileObject> path = new ArrayList<FileObject>();
+
+        FileSystemManager manager = fileBrowser.getManager();
+        FileObject rootDirectory = fileBrowser.getRootDirectory();
+
+        try {
+            FileObject ancestorDirectory = rootDirectory.getParent();
+            while (ancestorDirectory != null) {
+                path.add(ancestorDirectory);
+                ancestorDirectory = ancestorDirectory.getParent();
+            }
+        } catch (FileSystemException fse) {
+            throw new RuntimeException(fse);
+        }
+
+        @SuppressWarnings("unchecked")
+        ArrayList<FileObject> drives = (ArrayList<FileObject>) driveListButton.getListData();
+        if(refreshRoots) {
+            // TODO: this is ugly -- need to do much better at managing drive list with VFS
+            // There is an open question on the Dev list about adding "getFileRoots()" to the VFS API.
+/*            try {
+                FileObject[] roots = new FileObject[1];
+                roots[0] = manager.resolveFile(manager.getBaseFile().getName().getRoot().getPath());
+                drives = new ArrayList<FileObject>();
+                for (int i = 0; i < roots.length; i++) {
+                    FileObject root = roots[i];
+                    if (root.exists()) {
+                        drives.add(root);
+                    }
+                }
+                driveListButton.setListData(drives);
+            } catch (FileSystemException fse) {
+                throw new RuntimeException(fse);
+            }   */
+            refreshRoots = false;
+        }
+
+        driveListButton.setVisible(drives.getLength() > 1);
+
+        FileObject drive;
+        if (path.getLength() == 0) {
+            drive = rootDirectory;
+        } else {
+            drive = path.get(path.getLength() - 1);
+        }
+
+        driveListButton.setSelectedItem(drive);
+
+        pathListButton.setListData(path);
+        pathListButton.setButtonData(rootDirectory);
+        pathListButton.setEnabled(rootDirectory.getName().getDepth() > 0);
+
+        goUpButton.setEnabled(pathListButton.isEnabled());
+
+        goHomeButton.setEnabled(!rootDirectory.getName().getPath().equals(HOME_DIRECTORY));
+
+        fileScrollPane.setScrollTop(0);
+        fileScrollPane.setScrollLeft(0);
+
+        searchTextInput.setText("");
+
+        fileTableView.requestFocus();
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void selectedFileAdded(VFSBrowser fileBrowser, FileObject file) {
+        if (!updatingSelection) {
+            List<FileObject> files = (List<FileObject>)fileTableView.getTableData();
+            int index = files.indexOf(file);
+            if (index != -1) {
+                updatingSelection = true;
+                fileTableView.addSelectedIndex(index);
+                updatingSelection = false;
+            }
+        }
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void selectedFileRemoved(VFSBrowser fileBrowser, FileObject file) {
+        if (!updatingSelection) {
+            List<FileObject> files = (List<FileObject>)fileTableView.getTableData();
+            int index = files.indexOf(file);
+            if (index != -1) {
+                updatingSelection = true;
+                fileTableView.removeSelectedIndex(index);
+                updatingSelection = false;
+            }
+        }
+    }
+
+    @Override
+    public void selectedFilesChanged(VFSBrowser fileBrowser, Sequence<FileObject> previousSelectedFiles) {
+        updateSelectedFiles(fileBrowser);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void updateSelectedFiles(VFSBrowser fileBrowser) {
+        if (!updatingSelection) {
+            Sequence<FileObject> selectedFiles = fileBrowser.getSelectedFiles();
+
+            ArrayList<Span> selectedRanges = new ArrayList<Span>();
+            for (int i = 0, n = selectedFiles.getLength(); i < n; i++) {
+                FileObject selectedFile = selectedFiles.get(i);
+
+                List<FileObject> files = (List<FileObject>)fileTableView.getTableData();
+                int index = files.indexOf(selectedFile);
+                if (index != -1) {
+                    selectedRanges.add(new Span(index, index));
+                }
+            }
+
+            updatingSelection = true;
+            fileTableView.setSelectedRanges(selectedRanges);
+            updatingSelection = false;
+        }
+    }
+
+    @Override
+    public void multiSelectChanged(VFSBrowser fileBrowser) {
+        fileTableView.setSelectMode(fileBrowser.isMultiSelect() ? TableView.SelectMode.MULTI :
+            TableView.SelectMode.SINGLE);
+    }
+
+    @Override
+    public void disabledFileFilterChanged(VFSBrowser fileBrowser, Filter<FileObject> previousDisabledFileFilter) {
+        fileTableView.setDisabledRowFilter(fileBrowser.getDisabledFileFilter());
+        refreshFileList();
+    }
+
+    private void refreshFileList() {
+        // Cancel any outstanding task
+        if (refreshFileListTask != null) {
+            refreshFileListTask.abort();
+
+            if (indicator != null) {
+                indicator.setActive(false);
+                fileStackPane.remove(fileStackPane.getLength() - 1, 1);
+            }
+        }
+
+        if (indicator == null) {
+            indicator = new ActivityIndicator();
+            activityGrid = new GridPane(5);
+            GridPane.Row row1 = new GridPane.Row();
+            GridPane.Row row2 = new GridPane.Row();
+            GridPane.Row row3 = new GridPane.Row();
+            for (int i = 0; i < 5; i++) {
+                row1.add(new GridPane.Filler());
+                if (i == 2)
+                    row2.add(indicator);
+                else
+                    row2.add(new GridPane.Filler());
+                row3.add(new GridPane.Filler());
+            }
+            activityGrid.getRows().add(row1);
+            activityGrid.getRows().add(row2);
+            activityGrid.getRows().add(row3);
+        }
+        fileStackPane.add(activityGrid);
+        indicator.setActive(true);
+
+        fileTableView.setTableData(new ArrayList<FileObject>());
+
+        String text = searchTextInput.getText().trim();
+        Filter<FileObject> disabledFileFilter = hideDisabledFiles ? ((VFSBrowser) getComponent()).getDisabledFileFilter() : null;
+        Filter<FileObject> includeFileFilter = text.length() != 0 ? new IncludeFileFilter(text) : 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 = getFileComparator(pair.key, pair.value);
+        }
+
+        refreshFileListTask = new RefreshFileListTask(includeFileFilter, disabledFileFilter, fileComparator);
+        refreshFileListTask.execute(new TaskAdapter<ArrayList<FileObject>>(new TaskListener<ArrayList<FileObject>>() {
+            @SuppressWarnings("unchecked")
+            @Override
+            public void taskExecuted(Task<ArrayList<FileObject>> task) {
+                if (task == refreshFileListTask) {
+                    indicator.setActive(false);
+                    fileStackPane.remove(fileStackPane.getLength() - 1, 1);
+
+                    ArrayList<FileObject> fileList = task.getResult();
+                    fileTableView.setTableData(fileList);
+
+                    updateSelectedFiles((VFSBrowser) getComponent());
+
+                    refreshFileListTask = null;
+                }
+            }
+
+            @Override
+            public void executeFailed(Task<ArrayList<FileObject>> task) {
+                if (task == refreshFileListTask) {
+                    indicator.setActive(false);
+                    fileStackPane.remove(fileStackPane.getLength() - 1, 1);
+
+                    refreshFileListTask = null;
+                }
+            }
+        }));
+    }
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "Select drive",
+    goTo: "Go to a folder",
+    goUp: "Go up a folder",
+    newFolder: "Create new folder",
+    goHome: "Go to home folder",
+    search: "search",
+    searchFor: "Search for files",
+    fileName: "File",
+    size: "Size",
+    lastModified: "Modified"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_cs.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_cs.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_cs.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_cs.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "Vybrat jednotku",
+    goTo: "Přejít do složky",
+    goUp: "O úroveň výš",
+    newFolder: "Vytvořit novou složku",
+    goHome: "Domovská složka",
+    search: "hledat",
+    searchFor: "Hledat soubor",
+    fileName: "Soubor",
+    size: "Velikost",
+    lastModified: "Změněno"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_de.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_de.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_de.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_de.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "Laufwerk auswählen",
+    goTo: "Ordner auswählen",
+    goUp: "Eine Ebene nach oben",
+    newFolder: "Neuen Ordner erstellen",
+    goHome: "Eigene Dateien anzeigen",
+    search: "suchen",
+    searchFor: "Suche nach Dateien",
+    fileName: "Datei",
+    size: "Größe",
+    lastModified: "Geändert am"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_es.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_es.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_es.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_es.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "Selecionar unidad",
+    goTo: "Ir a la carpeta",
+    goUp: "Subir una carpeta",
+    newFolder: "Crear nueva carpeta",
+    goHome: "Ir a la carpeta personal",
+    search: "buscar",
+    searchFor: "Buscar archivos",
+    fileName: "Archivo",
+    size: "Tamaño",
+    lastModified: "Última modificación"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_fr.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_fr.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_fr.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_fr.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "Sélectionner lecteur",
+    goTo: "Aller au dossier",
+    goUp: "Remonter un dossier",
+    newFolder: "Créer nouveau dossier",
+    goHome: "Dossier d'accueil",
+    search: "rechercher",
+    searchFor: "Rechercher des fichiers",
+    fileName: "Fichier",
+    size: "Taille",
+    lastModified: "Modifié le"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_it.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_it.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_it.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_it.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "Selezionare un disco",
+    goTo: "Vai a cartella",
+    goUp: "Sali di una cartella",
+    newFolder: "Crea nuova cartella",
+    goHome: "Vai a cartella Home",
+    search: "cerca",
+    searchFor: "Ricerca files",
+    fileName: "File",
+    size: "Dimensione",
+    lastModified: "Modificato"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_pl.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_pl.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_pl.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_pl.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "Wybierz dysk",
+    goTo: "Idz do folderu",
+    goUp: "Idz poziom wyøej",
+    newFolder: "StwÛrz nowy folder",
+    goHome: "Idz do folderu domowego",
+    search: "szukaj",
+    searchFor: "Szukaj plikÛw",
+    fileName: "Plik",
+    size: "WielkoúÊ",
+    lastModified: "Zmodyfikowano"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_ru.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_ru.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_ru.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_ru.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "Выбрать диск",
+    goTo: "Перейти в папку",
+    goUp: "Перейти в папку уровнем выше",
+    newFolder: "Создать новую папку",
+    goHome: "Перейти в домашнюю папку",
+    search: "поиск",
+    searchFor: "Искать файлы",
+    fileName: "Файл",
+    size: "Размер",
+    lastModified: "Изменён"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_zh.json
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_zh.json?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_zh.json (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraVFSBrowserSkin_zh.json Fri May 24 21:22:39 2013
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{   selectDrive: "选择驱动器",
+    goTo: "去到一个文件夹",
+    goUp: "去上一个文件夹",
+    newFolder: "创建新的文件夹",
+    goHome: "到主文件夹",
+    search: "搜索",
+    searchFor: "搜索文件",
+    fileName: "文件",
+    size: "大小",
+    lastModified: "改动的"
+}

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/terra_vfs_browser_sheet_skin.bxml
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/terra_vfs_browser_sheet_skin.bxml?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/terra_vfs_browser_sheet_skin.bxml (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/terra_vfs_browser_sheet_skin.bxml Fri May 24 21:22:39 2013
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you under the Apache License,
+Version 2.0 (the "License"); you may not use this file except in
+compliance with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<Border styles="{padding:10}"
+    xmlns:bxml="http://pivot.apache.org/bxml"
+    xmlns="org.apache.pivot.wtk">
+    <TablePane bxml:id="tablePane" styles="{verticalSpacing:8}">
+        <columns>
+            <TablePane.Column width="1*"/>
+        </columns>
+
+        <TablePane.Row height="-1">
+            <Form>
+                <Form.Section>
+                    <BoxPane bxml:id="saveAsBoxPane" orientation="vertical" styles="{fill:true}">
+                        <BoxPane styles="{verticalAlignment:'center'}">
+                            <Label text="%saveAs"/>
+                            <TextInput bxml:id="saveAsTextInput" textSize="32"/>
+                        </BoxPane>
+                        <Separator styles="{padding:2}"/>
+                    </BoxPane>
+                </Form.Section>
+            </Form>
+        </TablePane.Row>
+
+        <TablePane.Row height="1*">
+            <VFSBrowser bxml:id="fileBrowser"
+                preferredWidth="480" preferredHeight="240"/>
+        </TablePane.Row>
+
+        <TablePane.Row height="-1">
+            <BoxPane styles="{horizontalAlignment:'right', verticalAlignment:'center'}">
+                <PushButton bxml:id="okButton" buttonData="%ok"
+                    styleName="org.apache.pivot.wtk.skin.terra.commandButton"/>
+                <PushButton bxml:id="cancelButton" buttonData="%cancel"
+                    styleName="org.apache.pivot.wtk.skin.terra.commandButton"/>
+            </BoxPane>
+        </TablePane.Row>
+    </TablePane>
+</Border>

Added: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/terra_vfs_browser_skin.bxml
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/terra_vfs_browser_skin.bxml?rev=1486223&view=auto
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/terra_vfs_browser_skin.bxml (added)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/terra_vfs_browser_skin.bxml Fri May 24 21:22:39 2013
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you under the Apache License,
+Version 2.0 (the "License"); you may not use this file except in
+compliance with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<TablePane styles="{verticalSpacing:6}"
+    xmlns:bxml="http://pivot.apache.org/bxml"
+    xmlns:content="org.apache.pivot.wtk.content"
+    xmlns:terra="org.apache.pivot.wtk.skin.terra"
+    xmlns="org.apache.pivot.wtk">
+    <columns>
+        <TablePane.Column width="1*"/>
+    </columns>
+
+    <TablePane.Row height="-1">
+        <TablePane styles="{horizontalSpacing:2}">
+            <columns>
+                <TablePane.Column width="-1"/>
+                <TablePane.Column width="2*"/>
+                <TablePane.Column width="-1"/>
+                <TablePane.Column width="1*"/>
+                <TablePane.Column width="3*"/>
+            </columns>
+
+            <TablePane.Row>
+                <ListButton bxml:id="driveListButton" tooltipText="%selectDrive">
+                    <dataRenderer>
+                        <terra:TerraVFSBrowserSkin.ListButtonDriveRenderer/>
+                    </dataRenderer>
+                    <itemRenderer>
+                        <terra:TerraVFSBrowserSkin.ListViewDriveRenderer/>
+                    </itemRenderer>
+                </ListButton>
+
+                <ListButton bxml:id="pathListButton" tooltipText="%goTo">
+                    <dataRenderer>
+                        <terra:TerraVFSBrowserSkin.ListButtonFileRenderer/>
+                    </dataRenderer>
+                    <itemRenderer>
+                        <terra:TerraVFSBrowserSkin.ListViewFileRenderer/>
+                    </itemRenderer>
+                </ListButton>
+
+                <BoxPane styles="{verticalAlignment:'center', spacing:0}">
+                    <PushButton bxml:id="goUpButton" styles="{toolbar:true}" tooltipText="%goUp">
+                        <content:ButtonData icon="@folder_up.png"/>
+                    </PushButton>
+                    <PushButton bxml:id="newFolderButton" styles="{toolbar:true}" tooltipText="%newFolder"
+                        visible="false">
+                        <content:ButtonData icon="@folder_add.png"/>
+                    </PushButton>
+                    <PushButton bxml:id="goHomeButton" styles="{toolbar:true}" tooltipText="%goHome">
+                        <content:ButtonData icon="@house.png"/>
+                    </PushButton>
+                </BoxPane>
+
+                <TablePane.Filler/>
+
+                <BoxPane orientation="vertical"
+                    styles="{horizontalAlignment:'right', verticalAlignment:'center', fill:true}">
+                    <BoxPane orientation="vertical" styles="{verticalAlignment:'center', fill:true}">
+                        <TextInput bxml:id="searchTextInput" prompt="%search" tooltipText="%searchFor"/>
+                    </BoxPane>
+                </BoxPane>
+            </TablePane.Row>
+        </TablePane>
+    </TablePane.Row>
+
+    <TablePane.Row height="1*">
+        <Border styles="{color:10}">
+            <StackPane bxml:id="fileStackPane">
+                <ScrollPane bxml:id="fileScrollPane"
+                    horizontalScrollBarPolicy="fill" verticalScrollBarPolicy="fill_to_capacity">
+                    <TableView bxml:id="fileTableView"
+                        styles="{showHorizontalGridLines:false, showVerticalGridLines:false}">
+                        <columns>
+                            <TableView.Column name="name" width="3*" headerData="%fileName">
+                                <cellRenderer>
+                                    <terra:TerraVFSBrowserSkin.TableViewFileRenderer/>
+                                </cellRenderer>
+                            </TableView.Column>
+                            <TableView.Column name="size" width="1*" headerData="%size">
+                                <cellRenderer>
+                                    <terra:TerraVFSBrowserSkin.TableViewFileRenderer/>
+                                </cellRenderer>
+                            </TableView.Column>
+                            <TableView.Column name="lastModified" width="2*" headerData="%lastModified">
+                                <cellRenderer>
+                                    <terra:TerraVFSBrowserSkin.TableViewFileRenderer/>
+                                </cellRenderer>
+                            </TableView.Column>
+                        </columns>
+                    </TableView>
+
+                    <columnHeader>
+                        <TableViewHeader tableView="$fileTableView" sortMode="single_column"/>
+                    </columnHeader>
+                </ScrollPane>
+            </StackPane>
+        </Border>
+    </TablePane.Row>
+</TablePane>

Added: pivot/trunk/wtk/lib/commons-compress-1.5.jar
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/lib/commons-compress-1.5.jar?rev=1486223&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pivot/trunk/wtk/lib/commons-compress-1.5.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: pivot/trunk/wtk/lib/commons-logging-1.1.3.jar
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/lib/commons-logging-1.1.3.jar?rev=1486223&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pivot/trunk/wtk/lib/commons-logging-1.1.3.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: pivot/trunk/wtk/lib/commons-net-3.2.jar
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/lib/commons-net-3.2.jar?rev=1486223&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pivot/trunk/wtk/lib/commons-net-3.2.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: pivot/trunk/wtk/lib/commons-vfs2-2.1-SNAPSHOT.jar
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/lib/commons-vfs2-2.1-SNAPSHOT.jar?rev=1486223&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pivot/trunk/wtk/lib/commons-vfs2-2.1-SNAPSHOT.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: pivot/trunk/wtk/lib/httpclient-4.0.2.jar
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/lib/httpclient-4.0.2.jar?rev=1486223&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pivot/trunk/wtk/lib/httpclient-4.0.2.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: pivot/trunk/wtk/lib/jackrabbit-webdav-1.6.5.jar
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/lib/jackrabbit-webdav-1.6.5.jar?rev=1486223&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pivot/trunk/wtk/lib/jackrabbit-webdav-1.6.5.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: pivot/trunk/wtk/lib/jsch-0.1.49.jar
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/lib/jsch-0.1.49.jar?rev=1486223&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pivot/trunk/wtk/lib/jsch-0.1.49.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream