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