IDEA-251172 Missing checkboxes in settings
[idea/community.git] / platform / editor-ui-api / src / com / intellij / ide / util / treeView / NodeDescriptor.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.ide.util.treeView;
3
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.util.NlsSafe;
6 import org.jetbrains.annotations.NotNull;
7 import org.jetbrains.annotations.Nullable;
8
9 import javax.swing.*;
10 import java.awt.*;
11 import java.util.Comparator;
12
13 public abstract class NodeDescriptor<E> {
14   public static final NodeDescriptor<?>[] EMPTY_ARRAY = new NodeDescriptor[0];
15   public static final int DEFAULT_WEIGHT = 30;
16
17   protected final Project myProject;
18   private final NodeDescriptor<?> myParentDescriptor;
19
20   protected @NlsSafe String myName;
21   @Nullable protected Icon myClosedIcon;
22
23   /**
24    * @deprecated Unused. Left for API compatibility.
25    */
26   @Deprecated
27   protected Icon myOpenIcon;
28   protected Color myColor;
29
30   private int myIndex = -1;
31
32   private long myChildrenSortingStamp = -1;
33   private long myUpdateCount;
34
35   private boolean myWasDeclaredAlwaysLeaf;
36
37   public NodeDescriptor(@Nullable Project project, @Nullable NodeDescriptor<?> parentDescriptor) {
38     myProject = project;
39     myParentDescriptor = parentDescriptor;
40   }
41
42   @Nullable
43   public NodeDescriptor<?> getParentDescriptor() {
44     return myParentDescriptor;
45   }
46
47   public int getIndex() {
48     return myIndex;
49   }
50
51   public void setIndex(int index) {
52     myIndex = index;
53   }
54
55   /**
56    * Make sure the descriptor is up to date with its content
57    *
58    * @return true if any descriptor's properties changed during the update
59    */
60   public abstract boolean update();
61
62   public abstract E getElement();
63
64   @Override
65   public @NlsSafe String toString() {
66     // NB!: this method may return null if node is not valid
67     // it contradicts the specification, but the fix breaks existing behaviour
68     // see com.intellij.ide.util.FileStructurePopup#getSpeedSearchText
69     return myName;
70   }
71
72   /**
73    * @deprecated Use {@link #getIcon()} instead
74    */
75   @Deprecated
76   public final Icon getOpenIcon() {
77     return getIcon();
78   }
79
80   /**
81    * @deprecated Use {@link #getIcon()} instead
82    */
83   @Deprecated
84   public final Icon getClosedIcon() {
85     return getIcon();
86   }
87
88   @Nullable
89   public final Icon getIcon() {
90     return myClosedIcon;
91   }
92
93   public final Color getColor() {
94     return myColor;
95   }
96
97   @Nullable
98   public final Project getProject() {
99     return myProject;
100   }
101
102   public boolean expandOnDoubleClick() {
103     return true;
104   }
105
106   public int getWeight() {
107     E element = getElement();
108     if (element instanceof WeighedItem) {
109       return ((WeighedItem) element).getWeight();
110     }
111     return DEFAULT_WEIGHT;
112   }
113
114   public final long getChildrenSortingStamp() {
115     return myChildrenSortingStamp;
116   }
117
118   public final void setChildrenSortingStamp(long stamp) {
119     myChildrenSortingStamp = stamp;
120   }
121
122   public final long getUpdateCount() {
123     return myUpdateCount;
124   }
125
126   public final void setUpdateCount(long updateCount) {
127     myUpdateCount = updateCount;
128   }
129
130   public boolean isWasDeclaredAlwaysLeaf() {
131     return myWasDeclaredAlwaysLeaf;
132   }
133
134   public void setWasDeclaredAlwaysLeaf(boolean leaf) {
135     myWasDeclaredAlwaysLeaf = leaf;
136   }
137
138   public void applyFrom(@NotNull NodeDescriptor<?> desc) {
139     setIcon(desc.getIcon());
140     myName = desc.myName;
141     myColor = desc.myColor;
142   }
143
144   public void setIcon(@Nullable Icon closedIcon) {
145     myClosedIcon = closedIcon;
146   }
147
148   public abstract static class NodeComparator<T extends NodeDescriptor<?>> implements Comparator<T> {
149     private long myStamp;
150
151     public final void setStamp(long stamp) {
152       myStamp = stamp;
153     }
154
155     public long getStamp() {
156       return myStamp;
157     }
158
159     public void incStamp() {
160       setStamp(getStamp() + 1);
161     }
162
163     public static final class Delegate<T extends NodeDescriptor<?>> extends NodeComparator<T> {
164       @NotNull
165       private NodeComparator<? super T> myDelegate;
166
167       public Delegate(@NotNull NodeComparator<? super T> delegate) {
168         myDelegate = delegate;
169       }
170
171       public void setDelegate(@NotNull NodeComparator<? super T> delegate) {
172         myDelegate = delegate;
173       }
174
175       @Override
176       public long getStamp() {
177         return myDelegate.getStamp();
178       }
179
180       @Override
181       public void incStamp() {
182         myDelegate.incStamp();
183       }
184
185       @Override
186       public int compare(T o1, T o2) {
187         return myDelegate.compare(o1, o2);
188       }
189     }
190   }
191 }