1 /*
2  *
3  * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  *   - Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  *
12  *   - Redistributions in binary form must reproduce the above copyright
13  *     notice, this list of conditions and the following disclaimer in the
14  *     documentation and/or other materials provided with the distribution.
15  *
16  *   - Neither the name of Oracle nor the names of its
17  *     contributors may be used to endorse or promote products derived
18  *     from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 import javax.swing.*;
34 import javax.swing.filechooser.*;
35 
36 import java.io.File;
37 import java.util.Hashtable;
38 
39 /**
40  * A convenience implementation of the FileView interface that
41  * manages name, icon, traversable, and file type information.
42  *
43  * This this implemention will work well with file systems that use
44  * "dot" extensions to indicate file type. For example: "picture.gif"
45  * as a gif image.
46  *
47  * If the java.io.File ever contains some of this information, such as
48  * file type, icon, and hidden file inforation, this implementation may
49  * become obsolete. At minimum, it should be rewritten at that time to
50  * use any new type information provided by java.io.File
51  *
52  * Example:
53  *    JFileChooser chooser = new JFileChooser();
54  *    fileView = new ExampleFileView();
55  *    fileView.putIcon("jpg", new ImageIcon("images/jpgIcon.jpg"));
56  *    fileView.putIcon("gif", new ImageIcon("images/gifIcon.gif"));
57  *    chooser.setFileView(fileView);
58  *
59  * @author Jeff Dinkins
60  */
61 public class ExampleFileView extends FileView {
62     private Hashtable<String, Icon> icons = new Hashtable<>(5);
63     private Hashtable<File, String> fileDescriptions = new Hashtable<>(5);
64     private Hashtable<String, String> typeDescriptions = new Hashtable<>(5);
65 
66     /**
67      * The name of the file.  Do nothing special here. Let
68      * the system file view handle this.
69      * @see FileView#getName
70      */
getName(File f)71     public String getName(File f) {
72         return null;
73     }
74 
75     /**
76      * Adds a human readable description of the file.
77      */
putDescription(File f, String fileDescription)78     public void putDescription(File f, String fileDescription) {
79         fileDescriptions.put(f, fileDescription);
80     }
81 
82     /**
83      * A human readable description of the file.
84      *
85      * @see FileView#getDescription
86      */
getDescription(File f)87     public String getDescription(File f) {
88         return fileDescriptions.get(f);
89     };
90 
91     /**
92      * Adds a human readable type description for files. Based on "dot"
93      * extension strings, e.g: ".gif". Case is ignored.
94      */
putTypeDescription(String extension, String typeDescription)95     public void putTypeDescription(String extension, String typeDescription) {
96         typeDescriptions.put(extension, typeDescription);
97     }
98 
99     /**
100      * Adds a human readable type description for files of the type of
101      * the passed in file. Based on "dot" extension strings, e.g: ".gif".
102      * Case is ignored.
103      */
putTypeDescription(File f, String typeDescription)104     public void putTypeDescription(File f, String typeDescription) {
105         putTypeDescription(getExtension(f), typeDescription);
106     }
107 
108     /**
109      * A human readable description of the type of the file.
110      *
111      * @see FileView#getTypeDescription
112      */
getTypeDescription(File f)113     public String getTypeDescription(File f) {
114         return typeDescriptions.get(getExtension(f));
115     }
116 
117     /**
118      * Convenience method that returns the "dot" extension for the
119      * given file.
120      */
getExtension(File f)121     public String getExtension(File f) {
122         String name = f.getName();
123         if(name != null) {
124             int extensionIndex = name.lastIndexOf('.');
125             if(extensionIndex < 0) {
126                 return null;
127             }
128             return name.substring(extensionIndex+1).toLowerCase();
129         }
130         return null;
131     }
132 
133     /**
134      * Adds an icon based on the file type "dot" extension
135      * string, e.g: ".gif". Case is ignored.
136      */
putIcon(String extension, Icon icon)137     public void putIcon(String extension, Icon icon) {
138         icons.put(extension, icon);
139     }
140 
141     /**
142      * Icon that reperesents this file. Default implementation returns
143      * null. You might want to override this to return something more
144      * interesting.
145      *
146      * @see FileView#getIcon
147      */
getIcon(File f)148     public Icon getIcon(File f) {
149         Icon icon = null;
150         String extension = getExtension(f);
151         if(extension != null) {
152             icon = icons.get(extension);
153         }
154         return icon;
155     }
156 
157     /**
158      * Whether the directory is traversable or not. Generic implementation
159      * returns true for all directories and special folders.
160      *
161      * You might want to subtype ExampleFileView to do somethimg more interesting,
162      * such as recognize compound documents directories; in such a case you might
163      * return a special icon for the directory that makes it look like a regular
164      * document, and return false for isTraversable to not allow users to
165      * descend into the directory.
166      *
167      * @see FileView#isTraversable
168      */
isTraversable(File f)169     public Boolean isTraversable(File f) {
170         // if (some_reason) {
171         //    return Boolean.FALSE;
172         // }
173         return null;    // Use default from FileSystemView
174     };
175 
176 }
177