Merge branch 'master' of git@git.labs.intellij.net:idea/community
authorKirill Kalishev <kirill.kalishev@jetbrains.com>
Mon, 26 Apr 2010 12:47:28 +0000 (16:47 +0400)
committerKirill Kalishev <kirill.kalishev@jetbrains.com>
Mon, 26 Apr 2010 12:47:28 +0000 (16:47 +0400)
java/java-impl/src/com/intellij/psi/impl/PsiClassImplUtil.java
platform/lang-api/src/com/intellij/psi/impl/ElementBase.java
platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/AbstractPsiBasedNode.java
platform/platform-api/src/com/intellij/openapi/util/Iconable.java
platform/platform-api/src/com/intellij/util/IconUtil.java

index 4381d526f87b371e0300d16362dae8df05d08819..096f1efe87098466c124e23fd2fae4eaca7e6324 100644 (file)
@@ -324,7 +324,7 @@ public class PsiClassImplUtil {
   };
 
   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);
index bcd37512ea388c0756b360d5e3b2f9c49b24b2ac..facc3a9d86d530de519afc26891a0450118ef818 100644 (file)
@@ -20,7 +20,6 @@ import com.intellij.navigation.ItemPresentation;
 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;
@@ -50,7 +49,9 @@ public abstract class ElementBase extends UserDataHolderBase implements Iconable
     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;
@@ -66,7 +67,7 @@ public abstract class ElementBase extends UserDataHolderBase implements Iconable
 
   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();
index 9ab797c6c03f39e3d0fc9c6fd4378f40414b70e0..d0e09863941bd975a08517d439f7574f97e1e523 100644 (file)
@@ -31,7 +31,6 @@ import com.intellij.openapi.module.Module;
 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;
@@ -154,7 +153,7 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
       decorator.decorate(this, data);
     }
 
-    value.putUserData(Iconable.LAST_COMPUTED_ICON, data.getIcon(false));
+    Iconable.LastComputedIcon.put(value, data.getIcon(false), flags);
   }
 
   protected int getIconableFlags() {
index dd4979986f1644a0f676f96d07242971cb572876..d2630fc95833926a5974d0c8a7d1195f6d0131fc 100644 (file)
  */
 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;
@@ -25,6 +29,27 @@ public interface Iconable {
 
   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
index d5a9441a91babc52787eeb9eb50e372d252ec759..ca34f48f5dba429d48beaae00d3c64a928dae5f6 100644 (file)
@@ -23,7 +23,6 @@ import com.intellij.openapi.project.DumbService;
 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;
@@ -86,7 +85,7 @@ public class IconUtil {
   }
 
   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) {
@@ -112,7 +111,7 @@ public class IconUtil {
           icon = new LayeredIcon(icon, Icons.LOCKED_ICON);
         }
         
-        file.putUserData(Iconable.LAST_COMPUTED_ICON, icon);
+        Iconable.LastComputedIcon.put(file, icon, flags);
 
         return icon;
       }