[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[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.ContainerUtil;
19 import com.intellij.util.containers.IntObjectMap;
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
31   Key<Integer> ICON_FLAG_IGNORE_MASK = new Key<>("ICON_FLAG_IGNORE_MASK");
32
33   @MagicConstant(flags = {ICON_FLAG_VISIBILITY, ICON_FLAG_READ_STATUS})
34   @interface IconFlags {}
35
36   Icon getIcon(@IconFlags int flags);
37
38   class LastComputedIcon {
39     private static final Key<IntObjectMap<Icon>> LAST_COMPUTED_ICON = Key.create("lastComputedIcon");
40
41     @Nullable
42     public static Icon get(@NotNull UserDataHolder holder, int flags) {
43       IntObjectMap<Icon> map = holder.getUserData(LAST_COMPUTED_ICON);
44       return map == null ? null : map.get(flags);
45     }
46
47     public static void put(@NotNull UserDataHolder holder, Icon icon, int flags) {
48       IntObjectMap<Icon> map = holder.getUserData(LAST_COMPUTED_ICON);
49       if (icon == null) {
50         if (map != null) {
51           map.remove(flags);
52         }
53       }
54       else {
55         if (map == null) {
56           map = ((UserDataHolderEx)holder).putUserDataIfAbsent(LAST_COMPUTED_ICON, ContainerUtil.createConcurrentIntObjectMap());
57         }
58         map.put(flags, icon);
59       }
60     }
61   }
62 }