-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJXploreFile.java
More file actions
343 lines (303 loc) · 9.3 KB
/
JXploreFile.java
File metadata and controls
343 lines (303 loc) · 9.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
package nl.hz.ict.ding0033.jxplorer;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import javax.swing.Icon;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
/**
* Dit is de klasse die een JXplorefile representeerd die verschillende aspecten
* van de files beheert. Daarnaast implementeerd deze klasse de TreeNode die helpt met
* het realiseren van de JTree
*
* ik heb ervoor gekozen om de volgende klassen te importeren:
*
* @author Mark Dingemanse
* @version 0,1 Concept
*/
public class JXploreFile implements TreeNode {
// maakt een veld aan van het type file dat een file bezit
private File file;
// Maakt een veld aan dat een array van JXploreFile objecten bevat en een cache representeerd
private JXploreFile[] foldersCache;
/**
* met deze constructor wordt een JXplorefile object aangemaakt met deze
* constructor wordt ook een root folder gegenereerd. Dit steld een default
* start voor
*/
public JXploreFile() {
this.file = FileSystemView.getFileSystemView().getRoots()[0];
}
/**
*
* met deze constructor wordt een JXplorefile object aangemaakt
*
* @param name steld een string voor met de naam van de te initialiseren file
*/
public JXploreFile(String name) {
file = new File(name);
}
/**
* met deze constructor wordt een JXplorefile object aangemaakt
*
* @param file steld een file voor die wordt meegegeven voor een nieuw JXplorefile
*/
public JXploreFile(File file) {
this.file = file;
}
// getter voor het file verld
public File getFile(){
return file;
}
private void initChilderen() {
foldersCache = getAllItems(false);
}
// een getter voor het name field van file
public String getName() {
return FileSystemView.getFileSystemView().getSystemDisplayName(file);
}
// een getter voor het path field van file
public String getPath() {
return file.getAbsolutePath();
}
// een getter voor een de date die bij een file hoort
public Date getDate() {
return new Date(file.lastModified());
}
// een check om te kijken of de file een Folder is of niet
public boolean isFolder() {
return !file.isFile();
}
// Met deze methode wordt de cache volledig gecleared
public void clearCache() {
if (foldersCache != null) {
for (JXploreFile file : foldersCache) {
file.clearCache();
file = null;
}
foldersCache = null;
}
}
// met deze getter word de extension van de file vastgesteld op een OS
// onafhankelijke manier
public String getExtension(String filename) {
String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}
// met deze getter wordt de filesize in mb gereturned
public Long getFileSize() {
Long filekb = file.length();
filekb = filekb / 1024;
return filekb;
}
// met deze methode wordt een icon gereturned
public Icon getIcon() {
return FileSystemView.getFileSystemView().getSystemIcon(this.file);
}
/*
* Deze methode heb ik gemaakt, omdat de methoden getSubFiles() en
* getSubFolders() beiden een array met JXploreFile-objecten moesten
* aanmaken. Dit is een voorbeeld van Cohesion of Methods en juist
* hergebruik van code.
*/
private JXploreFile[] makeFiles(File[] input) {
JXploreFile[] output = new JXploreFile[input.length];
for (int index = 0; index < input.length; index++) {
output[index] = new JXploreFile(input[index]);
}
return output;
}
// met deze methode word een array geturned met subfiles
public JXploreFile[] getSubFiles() {
return getAllItems(true);
}
// deze methode returned de folderscache dat een JXploreFile array bevat
public JXploreFile[] getSubFolders() {
if (foldersCache == null && !file.isFile()) {
initChilderen();
}
return foldersCache;
}
// deze methode handelt de situaties af rondom het getten van de files. Wanneer er true is dat wordt er een JXplroFile array
// teruggeven met alle files er nog tussen. Wanneer het false zou zijn dan worden de files eruitgefilterd en blijven de
// directories over. Wanneer er null meegegeven zou worden wordt er een leeg JXploreFile array meegegeven
private JXploreFile[] getAllItems(boolean filesNeeded) {
if (filesNeeded == false) {
// S T A P 1 : Initialiseer de array met alle files en folders
JXploreFile[] childFilesAndFolders = getSubFiles();
// S T A P 2 : Creeer een ArrayList waar zometeen alleen de
// directories
// in komen
ArrayList<JXploreFile> directoryList = new ArrayList<JXploreFile>();
// S T A P 3 : Itereer over alle files, en...
for (JXploreFile iterationFile : childFilesAndFolders) {
if (iterationFile.isFolder()) {
// Als een file een directory is, voeg hem toe aan de
// arraylist
directoryList.add(iterationFile);
}
}
// S T A P 4 : Maak van de ArrayList een array, die geretourneerd
// worden.
return directoryList.toArray(new JXploreFile[directoryList.size()]);
}
if (filesNeeded == true) {
return makeFiles(FileSystemView.getFileSystemView().getFiles(file,
false));
} else {
return new JXploreFile[0];
}
}
// met deze methode worden de subfolders geturned wanneer ze voldoen aan de
// eis van dat
// het een directory is
/*
* ========================================================================
* De volgende methoden zijn methoden die nodig zijn voor het implementeren
* van de TreeNode interface.
* ========================================================================
*/
/*
* Dit is de moeilijkste. Enumeration is een interface waarvan de werking
* overeenkomt met een Iterator (zie de lessen Programmeren 1). We moeten
* dus een object retourneren die een implementatie is van deze interface
* (zie
* http://docs.oracle.com/javase/7/docs/api/java/util/Enumeration.html). Een
* elegante (en met de minste code) oplossing is om een anonymous inner
* class te gebruiken.
*
* @see javax.swing.tree.TreeNode#children()
*/
@Override
public Enumeration<?> children() {
/*
* Een enumeration is een klasse die een beetje lijkt op een Iterator.
* Ik definieer hier een anonymous inner class.
*/
return new Enumeration<JXploreFile>() {
// bepaalt de locatie van de enumeration in de array van folders.
int index = 0;
@Override
public boolean hasMoreElements() {
return index < getSubFolders().length;
}
@Override
public JXploreFile nextElement() {
return getSubFolders()[index++];
}
};
}
/*
* Children zijn bij ons sub files. Alleen een folder/directory “staat
* children toe”.
*
* @see javax.swing.tree.TreeNode#getAllowsChildren()
*/
@Override
public boolean getAllowsChildren() {
return !this.isFile();
}
public boolean isFile() {
return file.isFile();
}
/*
* (non-Javadoc)
*
* @see javax.swing.tree.TreeNode#getChildAt(int)
*/
@Override
public TreeNode getChildAt(int childIndex) {
return getSubFolders()[childIndex];
}
/*
* (non-Javadoc)
*
* @see javax.swing.tree.TreeNode#getChildCount()
*/
@Override
public int getChildCount() {
return getSubFolders().length;
}
/*
* Gebruik ook hier de array met subfolders. Loop door de array, totdat je
* het juiste child hebt gevonden en retourneer de index van dat child in de
* array.
*
* @see javax.swing.tree.TreeNode#getIndex(javax.swing.tree.TreeNode)
*/
@Override
public int getIndex(TreeNode node) {
JXploreFile[] folders = getSubFolders();
for (int n = 0; n < folders.length; n++)
if (folders[n].equals(node))
return n;
// Niet gevonden
return -1;
}
/*
* (non-Javadoc)
*
* @see javax.swing.tree.TreeNode#getParent()
*/
@Override
public TreeNode getParent() {
if (file.getParentFile() == null)
return null;
return new JXploreFile(file.getParentFile());
}
/*
* (non-Javadoc)
*
* @see javax.swing.tree.TreeNode#isLeaf()
*/
@Override
public boolean isLeaf() {
if (getAllItems(false).length == 0) {
return true;
}
return false;
}
/*
* ========================================================================
* De volgende methode is een helper methode die eigenlijk bedoeld is voor
* een goede werking van de TreeView. Je kunt mbv een TreePath namelijk
* ervoor zorgen dat een specifiek element in de tree kan worden
* geselecteerd.
* ========================================================================
*/
/**
* Retourneert een TreePath object die het pad voorstelt vanaf dit object
* tot aan de root van de Tree.
*
* @return
*/
public TreePath getTreePath() {
if (file.getParentFile() == null)
return new TreePath(this);
else
return (new JXploreFile(file.getParentFile())).getTreePath()
.pathByAddingChild(this);
}
/*
* ========================================================================
* De volgende methoden overriden het standaardgedrag van Object.
* ========================================================================
*/
@Override
public String toString() {
return "JXploreFile: " + file.toString();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof JXploreFile) {
JXploreFile jxf = (JXploreFile) obj;
return file.equals(jxf.file);
}
// als niet instanceof JxploreFile...
return false;
}
}