bug6698013.java revision 9330:8b1f1c2a400f
138494Sobrien/*
2174294Sobrien * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
338494Sobrien * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
438494Sobrien *
538494Sobrien * This code is free software; you can redistribute it and/or modify it
638494Sobrien * under the terms of the GNU General Public License version 2 only, as
738494Sobrien * published by the Free Software Foundation.
838494Sobrien *
938494Sobrien * This code is distributed in the hope that it will be useful, but WITHOUT
1038494Sobrien * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1138494Sobrien * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1238494Sobrien * version 2 for more details (a copy is included in the LICENSE file that
1338494Sobrien * accompanied this code).
1438494Sobrien *
1538494Sobrien * You should have received a copy of the GNU General Public License version
1638494Sobrien * 2 along with this work; if not, write to the Free Software Foundation,
1738494Sobrien * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1838494Sobrien *
1938494Sobrien * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2042629Sobrien * or visit www.oracle.com if you need additional information or have any
2138494Sobrien * questions.
2238494Sobrien */
2338494Sobrien
2438494Sobrien/* @test %W% %E%
2538494Sobrien   @bug 6698013
2638494Sobrien   @summary JFileChooser can no longer navigate non-local file systems.
2738494Sobrien   @author Pavel Porvatov
2838494Sobrien   @run applet/manual=done bug6698013.html
2938494Sobrien*/
3038494Sobrien
3138494Sobrienimport javax.swing.*;
3238494Sobrienimport javax.swing.filechooser.FileSystemView;
3338494Sobrienimport java.io.File;
3438494Sobrien
3538494Sobrienpublic class bug6698013 extends JApplet {
3638494Sobrien
3738494Sobrien    final static VirtualFile root = new VirtualFile("testdir", true);
3838494Sobrien
3938494Sobrien    final static VirtualFile rootFile = new VirtualFile("testdir/test.txt", false);
40174294Sobrien
4138494Sobrien    final static VirtualFile subdir = new VirtualFile("testdir/subdir", true);
4238494Sobrien
4338494Sobrien    final static VirtualFile subdirFile = new VirtualFile("testdir/subdir/subtest.txt", false);
4438494Sobrien
4538494Sobrien    public static void main(String[] args) {
4638494Sobrien        JFileChooser chooser = new JFileChooser(new VirtualFileSystemView());
4738494Sobrien        chooser.setCurrentDirectory(root);
4838494Sobrien        chooser.showSaveDialog(null);
4938494Sobrien    }
5038494Sobrien
5138494Sobrien    public void init() {
5238494Sobrien        JFileChooser chooser = new JFileChooser(new VirtualFileSystemView());
53174294Sobrien        chooser.setCurrentDirectory(root);
5438494Sobrien        chooser.showSaveDialog(null);
5538494Sobrien    }
5638494Sobrien}
5738494Sobrien
5838494Sobrienclass VirtualFileSystemView extends FileSystemView {
5938494Sobrien
6038494Sobrien    public boolean isRoot(File dir) {
6138494Sobrien        return bug6698013.root.equals(dir);
6238494Sobrien    }
6338494Sobrien
6438494Sobrien    public File createNewFolder(File dir) {
6538494Sobrien        return null;
66174294Sobrien    }
6738494Sobrien
6838494Sobrien    public File[] getRoots() {
6938494Sobrien        return new File[]{bug6698013.root};
7038494Sobrien    }
7138494Sobrien
7238494Sobrien    public boolean isDrive(File dir) {
7338494Sobrien        return false;
7438494Sobrien    }
7538494Sobrien
7638494Sobrien    public boolean isFloppyDrive(File dir) {
7738494Sobrien        return false;
7838494Sobrien    }
7938494Sobrien
8038494Sobrien    public File getParentDirectory(File dir) {
8138494Sobrien        if (dir == null) {
8238494Sobrien            return null;
8338494Sobrien        }
8438494Sobrien
8538494Sobrien        return new VirtualFile(dir.getPath(), true).getParentFile();
8638494Sobrien    }
8738494Sobrien
8838494Sobrien    public File[] getFiles(File dir, boolean hide_hidden) {
8938494Sobrien        if (dir.equals(bug6698013.root)) {
9038494Sobrien            return new File[]{bug6698013.rootFile, bug6698013.subdir};
9138494Sobrien        }
9238494Sobrien
9338494Sobrien        if (dir.equals(bug6698013.subdir)) {
9438494Sobrien            return new File[]{bug6698013.subdirFile};
9538494Sobrien        }
9638494Sobrien
9738494Sobrien        return null;
9838494Sobrien    }
9938494Sobrien
10038494Sobrien    public File getHomeDirectory() {
10138494Sobrien        return bug6698013.root;
10238494Sobrien    }
10338494Sobrien
10438494Sobrien    public File getDefaultDirectory() {
10538494Sobrien        return getHomeDirectory();
10638494Sobrien    }
10738494Sobrien
10838494Sobrien    public String getSystemDisplayName(File file) {
10938494Sobrien        return file.getName();
11038494Sobrien    }
11138494Sobrien
11238494Sobrien    public Boolean isTraversable(File file) {
11338494Sobrien        return Boolean.valueOf(file.isDirectory());
11438494Sobrien    }
11538494Sobrien}
11638494Sobrien
11738494Sobrien/**
11838494Sobrien * A Virtual File. Contains a path and a directory flag that
11938494Sobrien * represents the location of a virtual file to be contained in the
12038494Sobrien * Virtual FileSystemView.
12138494Sobrien */
12238494Sobrienclass VirtualFile extends File {
12338494Sobrien
12438494Sobrien    private static final long serialVersionUID = 0L;
12538494Sobrien
12638494Sobrien    private String path;
12738494Sobrien
12838494Sobrien    private boolean directory;
12938494Sobrien
13038494Sobrien    public VirtualFile(String path, boolean directory) {
13138494Sobrien        super(path);
13238494Sobrien        this.path = path;
13338494Sobrien        this.directory = directory;
13438494Sobrien    }
13538494Sobrien
13638494Sobrien    public File getParentFile() {
13738494Sobrien        int index = path.lastIndexOf('/');
13838494Sobrien
13938494Sobrien        if (index == -1) {
14038494Sobrien            return null;
14138494Sobrien        }
14238494Sobrien
14338494Sobrien        return new VirtualFile(path.substring(0, index), true);
14438494Sobrien    }
14538494Sobrien
14638494Sobrien    public File getCanonicalFile() {
14738494Sobrien        return this;
14838494Sobrien    }
14938494Sobrien
15038494Sobrien    public String getParent() {
15138494Sobrien        File parent_file = getParentFile();
15238494Sobrien
15338494Sobrien        return parent_file == null ? null : parent_file.getPath();
15438494Sobrien    }
15538494Sobrien
15638494Sobrien    public String getName() {
15738494Sobrien        int index = path.lastIndexOf('/');
158
159        return index == -1 ? path : path.substring(index + 1);
160    }
161
162    public String getPath() {
163        return path;
164    }
165
166    public String getAbsolutePath() {
167        return path;
168    }
169
170    public String getCanonicalPath() {
171        return path;
172    }
173
174    public String toString() {
175        return path;
176    }
177
178    public boolean equals(Object obj) {
179        return obj instanceof VirtualFile && path.equals(obj.toString());
180    }
181
182    public int hashCode() {
183        return path.hashCode();
184    }
185
186    public boolean canWrite() {
187        return true;
188    }
189
190    public boolean isDirectory() {
191        return directory;
192    }
193
194    public boolean exists() {
195        return true;
196    }
197}
198