Cache for real

This commit is contained in:
Maxim Shafirov
2011-09-09 17:49:25 +04:00
parent 89bc46a040
commit 617a720dc6
2 changed files with 27 additions and 29 deletions
@@ -47,7 +47,7 @@ public class DeferredIconImpl<T> implements DeferredIcon {
private boolean myNeedReadAction;
private boolean myDone;
private IconDisposer<T> myDisposer;
private IconListener<T> myEvalListener;
public DeferredIconImpl(Icon baseIcon, T param, Function<T, Icon> evaluator) {
this(baseIcon, param, true, evaluator);
@@ -109,14 +109,15 @@ public class DeferredIconImpl<T> implements DeferredIcon {
JobUtil.submitToJobThread(Job.DEFAULT_PRIORITY, new Runnable() {
public void run() {
int oldWidth = myDelegateIcon.getIconWidth();
myDelegateIcon = evaluate();
final Icon result = evaluate();
myDelegateIcon = result;
final boolean shouldRevalidate = Registry.is("ide.tree.deferredicon.invalidates.cache") && myDelegateIcon.getIconWidth() != oldWidth;
//noinspection SSBasedInspection
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setDone();
setDone(result);
Component actualTarget = target.get();
if (SwingUtilities.getWindowAncestor(actualTarget) == null) {
@@ -157,9 +158,9 @@ public class DeferredIconImpl<T> implements DeferredIcon {
}
}
private void setDone() {
if (myDisposer != null) {
myDisposer.dispose(myParam);
private void setDone(Icon result) {
if (myEvalListener != null) {
myEvalListener.evalDone(myParam, result);
}
myDone = true;
@@ -271,15 +272,13 @@ public class DeferredIconImpl<T> implements DeferredIcon {
}
public DeferredIconImpl setDisposer(IconDisposer<T> disposer) {
myDisposer = disposer;
public DeferredIconImpl setDoneListener(IconListener<T> disposer) {
myEvalListener = disposer;
return this;
}
public interface IconDisposer<T> {
void dispose(T key);
public interface IconListener<T> {
void evalDone(T key, Icon result);
}
}
@@ -19,20 +19,16 @@
*/
package com.intellij.ui;
import com.intellij.ProjectTopics;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.impl.ProjectLifecycleListener;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
import com.intellij.openapi.project.DumbService;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.util.Function;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class IconDeferrerImpl extends IconDeferrer {
@@ -41,17 +37,20 @@ public class IconDeferrerImpl extends IconDeferrer {
public IconDeferrerImpl(MessageBus bus) {
final MessageBusConnection connection = bus.connect();
connection.subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener() {
public void before(final List<? extends VFileEvent> events) {
}
public void after(final List<? extends VFileEvent> events) {
connection.subscribe(ProjectTopics.MODIFICATION_TRACKER, new PsiModificationTracker.Listener() {
@Override
public void modificationCountChanged() {
clear();
}
});
connection.subscribe(ProjectLifecycleListener.TOPIC, new ProjectLifecycleListener.Adapter() {
connection.subscribe(DumbService.DUMB_MODE, new DumbService.DumbModeListener() {
@Override
public void afterProjectClosed(@NotNull Project project) {
public void enteredDumbMode() {
}
@Override
public void exitDumbMode() {
clear();
}
});
@@ -71,11 +70,11 @@ public class IconDeferrerImpl extends IconDeferrer {
synchronized (LOCK) {
Icon result = myIconsCache.get(param);
if (result == null) {
result = new DeferredIconImpl<T>(base, param, f).setDisposer(new DeferredIconImpl.IconDisposer<T>() {
result = new DeferredIconImpl<T>(base, param, f).setDoneListener(new DeferredIconImpl.IconListener<T>() {
@Override
public void dispose(T key) {
public void evalDone(T key, Icon r) {
synchronized (LOCK) {
myIconsCache.remove(key);
myIconsCache.put(key, r);
}
}
});