025826e26645e49cac86d7fa111a60512d3867e5
[idea/community.git] / platform / core-api / src / com / intellij / openapi / util / Iconable.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.util;
17
18 import com.intellij.util.containers.ConcurrentIntObjectMap;
19 import com.intellij.util.containers.ContainerUtil;
20 import org.intellij.lang.annotations.MagicConstant;
21 import org.jetbrains.annotations.NotNull;
22 import org.jetbrains.annotations.Nullable;
23
24 import javax.swing.*;
25
26 public interface Iconable {
27   int ICON_FLAG_VISIBILITY = 0x0001;
28   int ICON_FLAG_READ_STATUS = 0x0002;
29   @Deprecated int ICON_FLAG_OPEN = 0x0004;
30   @Deprecated int ICON_FLAG_CLOSED = 0x0008;
31
32   @MagicConstant(flags = {ICON_FLAG_VISIBILITY, ICON_FLAG_READ_STATUS})
33   @interface IconFlags {}
34
35   Icon getIcon(@IconFlags int flags);
36
37   class LastComputedIcon {
38     private static final Key<ConcurrentIntObjectMap<Icon>> LAST_COMPUTED_ICON = Key.create("lastComputedIcon");
39
40     @Nullable
41     public static Icon get(@NotNull UserDataHolder holder, int flags) {
42       ConcurrentIntObjectMap<Icon> map = holder.getUserData(LAST_COMPUTED_ICON);
43       return map == null ? null : map.get(flags);
44     }
45
46     public static void put(@NotNull UserDataHolder holder, Icon icon, int flags) {
47       ConcurrentIntObjectMap<Icon> map = holder.getUserData(LAST_COMPUTED_ICON);
48       if (icon == null && map != null) {
49         map.remove(flags);
50       }
51       else {
52         if (map == null) {
53           map = ((UserDataHolderEx)holder).putUserDataIfAbsent(LAST_COMPUTED_ICON, ContainerUtil.<Icon>createConcurrentIntObjectMap());
54         }
55         map.put(flags, icon);
56       }
57     }
58   }
59 }