/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.notification.impl;
import com.intellij.notification.NotificationGroup;
import com.intellij.openapi.extensions.ExtensionPointName;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
/**
* @author Alexander Lobas
*/
public class NotificationParentGroup {
private static final ExtensionPointName<NotificationParentGroupBean> EP_NAME =
ExtensionPointName.create("com.intellij.notification.parentGroup");
private static final ExtensionPointName<NotificationGroupBean> EP_CHILD_NAME =
ExtensionPointName.create("com.intellij.notification.group");
private static Map<String, NotificationParentGroupBean> myParents;
private static Map<NotificationParentGroupBean, List<NotificationParentGroupBean>> myChildren;
private static Map<String, NotificationParentGroupBean> myGroupToParent;
private static Map<String, String> myReplaceTitles;
private static Map<String, String> myShortTitles;
private static void prepareInfo() {
if (myParents == null) {
myParents = new HashMap<String, NotificationParentGroupBean>();
NotificationParentGroupBean[] parents = EP_NAME.getExtensions();
for (NotificationParentGroupBean bean : parents) {
myParents.put(bean.id, bean);
}
myChildren = new HashMap<NotificationParentGroupBean, List<NotificationParentGroupBean>>();
for (NotificationParentGroupBean bean : parents) {
if (bean.parentId != null) {
NotificationParentGroupBean parent = myParents.get(bean.parentId);
if (parent != null) {
List<NotificationParentGroupBean> children = myChildren.get(parent);
if (children == null) {
myChildren.put(parent, children = new ArrayList<NotificationParentGroupBean>());
}
children.add(bean);
}
}
}
myGroupToParent = new HashMap<String, NotificationParentGroupBean>();
myReplaceTitles = new HashMap<String, String>();
myShortTitles = new HashMap<String, String>();
for (NotificationGroupBean bean : EP_CHILD_NAME.getExtensions()) {
NotificationParentGroupBean parent = myParents.get(bean.parentId);
if (parent != null) {
myGroupToParent.put(bean.groupId, parent);
if (bean.replaceTitle != null) {
myReplaceTitles.put(bean.groupId, bean.replaceTitle);
}
if (bean.shortTitle != null) {
myShortTitles.put(bean.groupId, bean.shortTitle);
}
}
}
}
}
@Nullable
public static String getReplaceTitle(@NotNull String groupId) {
prepareInfo();
return myReplaceTitles.get(groupId);
}
@Nullable
public static String getShortTitle(@NotNull String groupId) {
prepareInfo();
return myShortTitles.get(groupId);
}
@NotNull
public static List<NotificationParentGroupBean> getChildren(@NotNull NotificationParentGroupBean parent) {
prepareInfo();
List<NotificationParentGroupBean> children = myChildren.get(parent);
return children == null ? Collections.<NotificationParentGroupBean>emptyList() : children;
}
@NotNull
public static Collection<NotificationParentGroupBean> getParents() {
prepareInfo();
return Collections.unmodifiableCollection(myParents.values());
}
@Nullable
public static NotificationParentGroupBean findParent(@NotNull NotificationSettings setting) {
prepareInfo();
String groupId = setting.getGroupId();
NotificationGroup group = NotificationGroup.findRegisteredGroup(groupId);
NotificationParentGroupBean parent;
if (group == null) {
parent = myGroupToParent.get(groupId);
}
else {
String parentId = group.getParentId();
if (parentId == null) {
parent = myGroupToParent.get(group.getDisplayId());
if (parent != null) {
group.setParentId(parent.id);
}
}
else {
parent = myParents.get(parentId);
}
}
return parent;
}
}