From 617a720dc6e1eba3bc30bb4e91737f51009ea616 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 9 Sep 2011 17:48:17 +0400 Subject: [PATCH] Cache for real --- .../src/com/intellij/ui/DeferredIconImpl.java | 23 +++++++------ .../src/com/intellij/ui/IconDeferrerImpl.java | 33 +++++++++---------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java b/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java index 01cfef76fde2..b4c5c8515566 100644 --- a/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java @@ -47,7 +47,7 @@ public class DeferredIconImpl implements DeferredIcon { private boolean myNeedReadAction; private boolean myDone; - private IconDisposer myDisposer; + private IconListener myEvalListener; public DeferredIconImpl(Icon baseIcon, T param, Function evaluator) { this(baseIcon, param, true, evaluator); @@ -109,14 +109,15 @@ public class DeferredIconImpl 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 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 implements DeferredIcon { } - public DeferredIconImpl setDisposer(IconDisposer disposer) { - myDisposer = disposer; + public DeferredIconImpl setDoneListener(IconListener disposer) { + myEvalListener = disposer; return this; } - public interface IconDisposer { - - void dispose(T key); - + public interface IconListener { + void evalDone(T key, Icon result); } } diff --git a/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java b/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java index f157d521aa9c..7f6318c7196f 100644 --- a/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/IconDeferrerImpl.java @@ -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 events) { - } - - public void after(final List 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(base, param, f).setDisposer(new DeferredIconImpl.IconDisposer() { + result = new DeferredIconImpl(base, param, f).setDoneListener(new DeferredIconImpl.IconListener() { @Override - public void dispose(T key) { + public void evalDone(T key, Icon r) { synchronized (LOCK) { - myIconsCache.remove(key); + myIconsCache.put(key, r); } } });