Lines 48-53
Link Here
|
48 |
import java.lang.ref.WeakReference; |
48 |
import java.lang.ref.WeakReference; |
49 |
import java.util.HashMap; |
49 |
import java.util.HashMap; |
50 |
|
50 |
|
|
|
51 |
import java.util.LinkedHashSet; |
52 |
import java.util.LinkedList; |
53 |
import java.util.List; |
54 |
import java.util.Set; |
51 |
import org.openide.filesystems.FileChangeListener; |
55 |
import org.openide.filesystems.FileChangeListener; |
52 |
import org.openide.filesystems.FileAttributeEvent; |
56 |
import org.openide.filesystems.FileAttributeEvent; |
53 |
import org.openide.filesystems.FileEvent; |
57 |
import org.openide.filesystems.FileEvent; |
Lines 112-123
Link Here
|
112 |
f2H.remove(path); |
116 |
f2H.remove(path); |
113 |
} |
117 |
} |
114 |
} |
118 |
} |
|
|
119 |
|
120 |
public void notifyChange(File f) { |
121 |
Set<Holder> fireTo = new LinkedHashSet<Holder>(); |
122 |
synchronized (holders) { |
123 |
for (Map.Entry<FileChangeSupportListener, Map<File, Holder>> e : holders.entrySet()) { |
124 |
Holder h = e.getValue().get(f); |
125 |
if (h != null) { |
126 |
fireTo.add(h); |
127 |
} |
128 |
h = e.getValue().get(f.getParentFile()); |
129 |
if (h != null) { |
130 |
fireTo.add(h); |
131 |
} |
132 |
} |
133 |
} |
134 |
if (fireTo.isEmpty()) { |
135 |
return; |
136 |
} |
137 |
long now = System.currentTimeMillis(); |
138 |
for (Holder holder : fireTo) { |
139 |
holder.last = now; |
140 |
} |
141 |
FileObject who = FileUtil.toFileObject(f); |
142 |
for (Holder holder : fireTo) { |
143 |
holder.toNotify = true; |
144 |
} |
145 |
if (who != null) { |
146 |
who.refresh(true); |
147 |
} |
148 |
for (Holder holder : fireTo) { |
149 |
if (holder.toNotify) { |
150 |
holder.someChange(System.currentTimeMillis(), null, who); |
151 |
} |
152 |
} |
153 |
} |
115 |
|
154 |
|
116 |
private static final class Holder extends WeakReference<FileChangeSupportListener> implements FileChangeListener, Runnable { |
155 |
private static final class Holder extends WeakReference<FileChangeSupportListener> implements FileChangeListener, Runnable { |
117 |
|
156 |
|
118 |
private final File path; |
157 |
private final File path; |
119 |
private FileObject current; |
158 |
private FileObject current; |
120 |
private File currentF; |
159 |
private File currentF; |
|
|
160 |
private long last; |
161 |
boolean toNotify; |
121 |
|
162 |
|
122 |
public Holder(FileChangeSupportListener listener, File path) { |
163 |
public Holder(FileChangeSupportListener listener, File path) { |
123 |
super(listener, Utilities.activeReferenceQueue()); |
164 |
super(listener, Utilities.activeReferenceQueue()); |
Lines 158-164
Link Here
|
158 |
} |
199 |
} |
159 |
} |
200 |
} |
160 |
|
201 |
|
161 |
private void someChange(FileObject modified) { |
202 |
private void someChange(long time, FileEvent orig, FileObject modified) { |
|
|
203 |
if (orig != null && orig.getTime() < last) { |
204 |
return; |
205 |
} |
206 |
last = time; |
207 |
toNotify = false; |
208 |
|
162 |
FileChangeSupportListener listener; |
209 |
FileChangeSupportListener listener; |
163 |
FileObject oldCurrent, nueCurrent; |
210 |
FileObject oldCurrent, nueCurrent; |
164 |
File oldCurrentF, nueCurrentF; |
211 |
File oldCurrentF, nueCurrentF; |
Lines 177-215
Link Here
|
177 |
nueCurrentF = currentF; |
224 |
nueCurrentF = currentF; |
178 |
} |
225 |
} |
179 |
if (modified != null && modified == nueCurrent) { |
226 |
if (modified != null && modified == nueCurrent) { |
180 |
FileChangeSupportEvent event = new FileChangeSupportEvent(DEFAULT, FileChangeSupportEvent.EVENT_MODIFIED, path); |
227 |
FileChangeSupportEvent event = new FileChangeSupportEvent(orig, DEFAULT, FileChangeSupportEvent.EVENT_MODIFIED, path); |
181 |
listener.fileModified(event); |
228 |
listener.fileModified(event); |
182 |
} else { |
229 |
} else { |
183 |
boolean oldWasCorrect = path.equals(oldCurrentF); |
230 |
boolean oldWasCorrect = path.equals(oldCurrentF); |
184 |
boolean nueIsCorrect = path.equals(nueCurrentF); |
231 |
boolean nueIsCorrect = path.equals(nueCurrentF); |
185 |
if (oldWasCorrect && !nueIsCorrect) { |
232 |
if (oldWasCorrect && !nueIsCorrect) { |
186 |
FileChangeSupportEvent event = new FileChangeSupportEvent(DEFAULT, FileChangeSupportEvent.EVENT_DELETED, path); |
233 |
FileChangeSupportEvent event = new FileChangeSupportEvent(orig, DEFAULT, FileChangeSupportEvent.EVENT_DELETED, path); |
187 |
listener.fileDeleted(event); |
234 |
listener.fileDeleted(event); |
188 |
} else if (nueIsCorrect && !oldWasCorrect) { |
235 |
} else if (nueIsCorrect && !oldWasCorrect) { |
189 |
FileChangeSupportEvent event = new FileChangeSupportEvent(DEFAULT, FileChangeSupportEvent.EVENT_CREATED, path); |
236 |
FileChangeSupportEvent event = new FileChangeSupportEvent(orig, DEFAULT, FileChangeSupportEvent.EVENT_CREATED, path); |
190 |
listener.fileCreated(event); |
237 |
listener.fileCreated(event); |
191 |
} |
238 |
} |
192 |
} |
239 |
} |
193 |
} |
240 |
} |
194 |
|
241 |
|
195 |
public void fileChanged(FileEvent fe) { |
242 |
public void fileChanged(FileEvent fe) { |
196 |
someChange(fe.getFile()); |
243 |
someChange(0, fe, fe.getFile()); |
197 |
} |
244 |
} |
198 |
|
245 |
|
199 |
public void fileDeleted(FileEvent fe) { |
246 |
public void fileDeleted(FileEvent fe) { |
200 |
someChange(null); |
247 |
someChange(0, fe, null); |
201 |
} |
248 |
} |
202 |
|
249 |
|
203 |
public void fileDataCreated(FileEvent fe) { |
250 |
public void fileDataCreated(FileEvent fe) { |
204 |
someChange(null); |
251 |
someChange(0, fe, null); |
205 |
} |
252 |
} |
206 |
|
253 |
|
207 |
public void fileFolderCreated(FileEvent fe) { |
254 |
public void fileFolderCreated(FileEvent fe) { |
208 |
someChange(null); |
255 |
someChange(0, fe, null); |
209 |
} |
256 |
} |
210 |
|
257 |
|
211 |
public void fileRenamed(FileRenameEvent fe) { |
258 |
public void fileRenamed(FileRenameEvent fe) { |
212 |
someChange(null); |
259 |
someChange(0, fe, null); |
213 |
} |
260 |
} |
214 |
|
261 |
|
215 |
public void fileAttributeChanged(FileAttributeEvent fe) { |
262 |
public void fileAttributeChanged(FileAttributeEvent fe) { |