7999f682d6eded1b9b6faea87c0e3086ed0c38d0
[idea/community.git] / java / idea-ui / src / com / intellij / ide / util / newProjectWizard / FrameworkSupportNodeBase.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.newProjectWizard;
3
4 import com.intellij.diagnostic.PluginException;
5 import com.intellij.framework.FrameworkOrGroup;
6 import com.intellij.openapi.diagnostic.Logger;
7 import com.intellij.ui.CheckedTreeNode;
8 import com.intellij.util.ui.EmptyIcon;
9 import org.jetbrains.annotations.NotNull;
10 import org.jetbrains.annotations.Nullable;
11
12 import javax.swing.*;
13 import java.util.Collections;
14 import java.util.Comparator;
15 import java.util.List;
16
17 public abstract class FrameworkSupportNodeBase<T extends FrameworkOrGroup> extends CheckedTreeNode {
18   private static final Logger LOG = Logger.getInstance(FrameworkSupportNodeBase.class);
19   private final FrameworkSupportNodeBase myParentNode;
20
21   public FrameworkSupportNodeBase(T userObject, final FrameworkSupportNodeBase parentNode) {
22     super(userObject);
23     setChecked(false);
24     myParentNode = parentNode;
25     if (parentNode != null) {
26       parentNode.add(this);
27     }
28   }
29
30   @Override
31   public T getUserObject() {
32     return (T)super.getUserObject();
33   }
34
35   public static void sortByName(@Nullable List<? extends FrameworkSupportNodeBase> nodes, @Nullable final Comparator<? super FrameworkSupportNodeBase> comparator) {
36     if (nodes == null) return;
37
38     nodes.sort((o1, o2) -> {
39       if (comparator != null) {
40         int compare = comparator.compare(o1, o2);
41         if (compare != 0) return compare;
42       }
43       if (o1 instanceof FrameworkGroupNode && !(o2 instanceof FrameworkGroupNode)) return -1;
44       if (o2 instanceof FrameworkGroupNode && !(o1 instanceof FrameworkGroupNode)) return 1;
45       if (o1.getChildCount() < o2.getChildCount()) return 1;
46       if (o1.getChildCount() > o2.getChildCount()) return -1;
47       return o1.getTitle().compareToIgnoreCase(o2.getTitle());
48     });
49     for (FrameworkSupportNodeBase<?> node : nodes) {
50       @SuppressWarnings({"unchecked", "rawtypes"})
51       List<FrameworkSupportNodeBase<?>> children = (List)node.children;
52       sortByName(children, null);
53     }
54   }
55
56   @NotNull
57   protected final String getTitle() {
58     return getUserObject().getPresentableName();
59   }
60
61   @NotNull
62   public final Icon getIcon() {
63     Icon icon = getUserObject().getIcon();
64     //noinspection ConstantConditions
65     if (icon == null) {
66       Class<?> aClass = getUserObject().getClass();
67       PluginException.logPluginError(LOG, "FrameworkOrGroup::getIcon returns null for " + aClass, null, aClass);
68       return EmptyIcon.ICON_16;
69     }
70     return icon;
71   }
72
73   @NotNull
74   public final String getId() {
75     return getUserObject().getId();
76   }
77
78   @SuppressWarnings({"unchecked", "RedundantCast", "rawtypes"})
79   @NotNull
80   public List<FrameworkSupportNodeBase> getChildren() {
81     return children != null ? (List)children : Collections.emptyList();
82   }
83
84   public FrameworkSupportNodeBase getParentNode() {
85     return myParentNode;
86   }
87 }