mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Cache for real
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user