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