};
public static Icon getClassIcon(final int flags, final PsiClass aClass) {
- Icon base = aClass.getUserData(Iconable.LAST_COMPUTED_ICON);
+ Icon base = Iconable.LastComputedIcon.get(aClass, flags);
if (base == null) {
Icon symbolIcon = ElementPresentationUtil.getClassIconOfKind(aClass, ElementPresentationUtil.getBasicClassKind(aClass));
RowIcon baseIcon = ElementBase.createLayeredIcon(symbolIcon, 0);
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.util.Iconable;
-import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.progress.ProcessCanceledException;
if (!(this instanceof PsiElement)) return null;
try {
- return computeIcon(flags);
+ Icon icon = computeIcon(flags);
+ Iconable.LastComputedIcon.put(this, icon, flags);
+ return icon;
}
catch (ProcessCanceledException e) {
throw e;
private Icon computeIcon(final int flags) {
PsiElement psiElement = (PsiElement)this;
- Icon baseIcon = psiElement.getUserData(Iconable.LAST_COMPUTED_ICON);
+ Icon baseIcon = LastComputedIcon.get(psiElement, flags);
if (baseIcon == null) {
if (myBaseIcon == null) {
myBaseIcon = computeBaseIcon();
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Iconable;
-import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vfs.VirtualFile;
decorator.decorate(this, data);
}
- value.putUserData(Iconable.LAST_COMPUTED_ICON, data.getIcon(false));
+ Iconable.LastComputedIcon.put(value, data.getIcon(false), flags);
}
protected int getIconableFlags() {
*/
package com.intellij.openapi.util;
+import com.intellij.util.containers.HashMap;
+import org.jetbrains.annotations.Nullable;
+
import javax.swing.*;
+import java.util.Map;
public interface Iconable {
int ICON_FLAG_VISIBILITY = 0x0001;
Icon getIcon(int flags);
- Key<Icon> LAST_COMPUTED_ICON = Key.create("lastComputedIcon");
+
+ class LastComputedIcon {
+
+ private static Key<Map<Integer, Icon>> LAST_COMPUTED_ICON = Key.create("lastComputedIcon");
+
+ @Nullable
+ public static Icon get(UserDataHolder holder, int flags) {
+ Map<Integer, Icon> map = holder.getUserData(LAST_COMPUTED_ICON);
+ return map != null ? map.get(flags) : null;
+ }
+
+ public static void put(UserDataHolder holder, Icon icon, int flags) {
+ Map<Integer, Icon> map = holder.getUserData(LAST_COMPUTED_ICON);
+ if (map == null) {
+ map = new HashMap<Integer, Icon>();
+ holder.putUserData(LAST_COMPUTED_ICON, map);
+ }
+
+ map.put(flags, icon);
+ }
+ }
+
}
\ No newline at end of file
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.util.Iconable;
-import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.IconDeferrer;
import com.intellij.ui.RowIcon;
}
public static Icon getIcon(final VirtualFile file, final int flags, final Project project) {
- Icon lastIcon = file.getUserData(Iconable.LAST_COMPUTED_ICON);
+ Icon lastIcon = Iconable.LastComputedIcon.get(file, flags);
return IconDeferrer.getInstance().defer(lastIcon != null ? lastIcon : file.getIcon(), new FileIconKey(file, project, flags), new Function<FileIconKey, Icon>() {
public Icon fun(final FileIconKey key) {
icon = new LayeredIcon(icon, Icons.LOCKED_ICON);
}
- file.putUserData(Iconable.LAST_COMPUTED_ICON, icon);
+ Iconable.LastComputedIcon.put(file, icon, flags);
return icon;
}