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