1 /*
2 * Copyright 2006-2016 The JGUIraffe Team.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License")
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package net.sf.jguiraffe.examples.tutorial.model;
17
18 import java.io.File;
19 import java.util.Date;
20
21 /**
22 * <p>
23 * A simple data class representing a file (or sub directory) in a directory.
24 * </p>
25 * <p>
26 * Objects of this type are used by the model of the table control. Each
27 * instance represents one row in the table. An instance wraps a {@code File}
28 * object and provides bean-style get methods for it. (The API of {@code File}
29 * does not always conform to the Java Beans standard.)
30 * </p>
31 *
32 * @author Oliver Heger
33 * @version $Id: FileData.java 205 2012-01-29 18:29:57Z oheger $
34 */
35 public class FileData implements Comparable<FileData>
36 {
37 /** Stores the wrapped file. */
38 private final File file;
39
40 /** The icon to be displayed. */
41 private final Object icon;
42
43 /** The file name. */
44 private final String name;
45
46 /**
47 * Creates a new instance of {@code FileData} for the specified {@code File}
48 * object.
49 *
50 * @param f the {@code File}
51 * @param icon the icon for this {@code File}
52 */
53 public FileData(File f, Object icon)
54 {
55 file = f;
56 this.icon = icon;
57 name = f.getName();
58 }
59
60 /**
61 * Creates a new instance of {@code FileData} that does not represent a
62 * file. Objects of this type are used as placeholders if no real data is
63 * available, e.g. if data has to be loaded first.
64 *
65 * @param name the name to be displayed
66 * @param icon an icon
67 */
68 public FileData(String name, Object icon)
69 {
70 file = null;
71 this.icon = icon;
72 this.name = name;
73 }
74
75 /**
76 * Returns the associated {@code File} object. If this object represents a
77 * special entry which is not associated with a file, result is <b>null</b>.
78 *
79 * @return the associated {@code File} object
80 */
81 public File getFile()
82 {
83 return file;
84 }
85
86 /**
87 * Returns the icon of this file.
88 *
89 * @return the icon
90 */
91 public Object getIcon()
92 {
93 return icon;
94 }
95
96 /**
97 * Returns the name of this file.
98 *
99 * @return the file name
100 */
101 public String getName()
102 {
103 return name;
104 }
105
106 /**
107 * Returns the date this file was modified.
108 *
109 * @return the last modification date (can be <b>null</b>)
110 */
111 public Date getLastModified()
112 {
113 return (file != null) ? new Date(file.lastModified()) : null;
114 }
115
116 /**
117 * Returns the size of this file.
118 *
119 * @return the size
120 */
121 public long getSize()
122 {
123 return (file == null || !file.isFile()) ? 0L : file.length();
124 }
125
126 /**
127 * Compares this object with another one. Two instances of {@code FileData}
128 * are equal if they refer to the same file.
129 *
130 * @param obj the object to compare to
131 * @return a flag whether the objects are equal
132 */
133 @Override
134 public boolean equals(Object obj)
135 {
136 if (this == obj)
137 {
138 return true;
139 }
140 if (!(obj instanceof FileData))
141 {
142 return false;
143 }
144
145 FileData c = (FileData) obj;
146 return ((file == null) ? c.file == null : file.equals(c.file));
147 }
148
149 /**
150 * Returns a hash code for this object.
151 *
152 * @return a hash code
153 */
154 @Override
155 public int hashCode()
156 {
157 return (file == null) ? 17 : file.hashCode();
158 }
159
160 /**
161 * Returns a string representation for this object. This string contains the
162 * name and the file stored in this instance.
163 *
164 * @return a string for this object
165 */
166 @Override
167 public String toString()
168 {
169 StringBuilder buf = new StringBuilder();
170 buf.append("FileData [ name = ").append(name);
171 buf.append(", file = ").append(file);
172 buf.append(" ]");
173 return buf.toString();
174 }
175
176 /**
177 * A special {@code compareTo()} implementation. Files are sorted
178 * alphabetically by their names. Directories are sorted before plain files.
179 *
180 * @param o the other {@code FileData} object
181 * @return a value indicating the order of these objects
182 */
183 @Override
184 public int compareTo(FileData o)
185 {
186 if (file == null)
187 {
188 return (o.file == null) ? 0 : -1;
189 }
190 if (o.file == null)
191 {
192 return 1;
193 }
194
195 boolean dir1 = file.isDirectory();
196 boolean dir2 = o.file.isDirectory();
197 if (dir1 != dir2)
198 {
199 return dir1 ? -1 : 1;
200 }
201 return getName().compareTo(o.getName());
202 }
203 }