bug6698013.java revision 8729:0242fce0f717
1/*
2 * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/* @test %W% %E%
25   @bug 6698013
26   @summary JFileChooser can no longer navigate non-local file systems.
27   @author Pavel Porvatov
28   @run applet/manual=done bug6698013.html
29*/
30
31import javax.swing.*;
32import javax.swing.filechooser.FileSystemView;
33import java.io.File;
34
35public class bug6698013 extends JApplet {
36
37    final static VirtualFile root = new VirtualFile("testdir", true);
38
39    final static VirtualFile rootFile = new VirtualFile("testdir/test.txt", false);
40
41    final static VirtualFile subdir = new VirtualFile("testdir/subdir", true);
42
43    final static VirtualFile subdirFile = new VirtualFile("testdir/subdir/subtest.txt", false);
44
45    public static void main(String[] args) {
46        JFileChooser chooser = new JFileChooser(new VirtualFileSystemView());
47        chooser.setCurrentDirectory(root);
48        chooser.showSaveDialog(null);
49    }
50
51    public void init() {
52        JFileChooser chooser = new JFileChooser(new VirtualFileSystemView());
53        chooser.setCurrentDirectory(root);
54        chooser.showSaveDialog(null);
55    }
56}
57
58class VirtualFileSystemView extends FileSystemView {
59
60    public boolean isRoot(File dir) {
61        return bug6698013.root.equals(dir);
62    }
63
64    public File createNewFolder(File dir) {
65        return null;
66    }
67
68    public File[] getRoots() {
69        return new File[]{bug6698013.root};
70    }
71
72    public boolean isDrive(File dir) {
73        return false;
74    }
75
76    public boolean isFloppyDrive(File dir) {
77        return false;
78    }
79
80    public File getParentDirectory(File dir) {
81        if (dir == null) {
82            return null;
83        }
84
85        return new VirtualFile(dir.getPath(), true).getParentFile();
86    }
87
88    public File[] getFiles(File dir, boolean hide_hidden) {
89        if (dir.equals(bug6698013.root)) {
90            return new File[]{bug6698013.rootFile, bug6698013.subdir};
91        }
92
93        if (dir.equals(bug6698013.subdir)) {
94            return new File[]{bug6698013.subdirFile};
95        }
96
97        return null;
98    }
99
100    public File getHomeDirectory() {
101        return bug6698013.root;
102    }
103
104    public File getDefaultDirectory() {
105        return getHomeDirectory();
106    }
107
108    public String getSystemDisplayName(File file) {
109        return file.getName();
110    }
111
112    public Boolean isTraversable(File file) {
113        return Boolean.valueOf(file.isDirectory());
114    }
115}
116
117/**
118 * A Virtual File. Contains a path and a directory flag that
119 * represents the location of a virtual file to be contained in the
120 * Virtual FileSystemView.
121 */
122class VirtualFile extends File {
123
124    private static final long serialVersionUID = 0L;
125
126    private String path;
127
128    private boolean directory;
129
130    public VirtualFile(String path, boolean directory) {
131        super(path);
132        this.path = path;
133        this.directory = directory;
134    }
135
136    public File getParentFile() {
137        int index = path.lastIndexOf('/');
138
139        if (index == -1) {
140            return null;
141        }
142
143        return new VirtualFile(path.substring(0, index), true);
144    }
145
146    public File getCanonicalFile() {
147        return this;
148    }
149
150    public String getParent() {
151        File parent_file = getParentFile();
152
153        return parent_file == null ? null : parent_file.getPath();
154    }
155
156    public String getName() {
157        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