IDEA-80382 Notifications: when balloon is shown in Event Log and after clicking...
[idea/community.git] / platform / platform-api / src / com / intellij / notification / Notification.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.notification;
17
18 import com.intellij.openapi.diagnostic.Logger;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.ui.popup.Balloon;
21 import com.intellij.openapi.ui.popup.JBPopupAdapter;
22 import com.intellij.openapi.ui.popup.LightweightWindowEvent;
23 import org.jetbrains.annotations.NotNull;
24 import org.jetbrains.annotations.Nullable;
25
26 import javax.swing.*;
27 import java.lang.ref.WeakReference;
28
29 /**
30  * @author spleaner
31  */
32 public class Notification {
33   private static final Logger LOG = Logger.getInstance("#com.intellij.notification.Notification");
34
35   private final String myGroupId;
36   private final String myContent;
37   private final NotificationType myType;
38   private final NotificationListener myListener;
39   private final String myTitle;
40   private boolean myExpired;
41   private WeakReference<Balloon> myBalloonRef;
42
43   public Notification(@NotNull final String groupDisplayId, @NotNull final String title, @NotNull final String content, @NotNull final NotificationType type) {
44     this(groupDisplayId, title, content, type, null);
45   }
46
47   /**
48    * @param groupDisplayId this should be a human-readable, capitalized string like "Facet Detector".
49    *                       It will appear in "Notifications" configurable.
50    * @param title notification title
51    * @param content notification content
52    * @param type notification type
53    * @param listener notification lifecycle listener
54    */
55   public Notification(@NotNull final String groupDisplayId, @NotNull final String title, @NotNull final String content, @NotNull final NotificationType type, @Nullable NotificationListener listener) {
56     myGroupId = groupDisplayId;
57     myTitle = title;
58     myContent = content;
59     myType = type;
60     myListener = listener;
61
62     LOG.assertTrue(myContent.trim().length() > 0, "Notification should have content, groupId: " + myGroupId);
63   }
64
65   @SuppressWarnings("MethodMayBeStatic")
66   @Nullable
67   public Icon getIcon() {
68     return null;
69   }
70
71   @NotNull
72   public String getGroupId() {
73     return myGroupId;
74   }
75
76   @NotNull
77   public String getTitle() {
78     return myTitle;
79   }
80
81   @NotNull
82   public String getContent() {
83     return myContent;
84   }
85
86   @Nullable
87   public NotificationListener getListener() {
88     return myListener;
89   }
90
91   @NotNull
92   public NotificationType getType() {
93     return myType;
94   }
95
96   public boolean isExpired() {
97     return myExpired;
98   }
99
100   public void expire() {
101     NotificationsManager.getNotificationsManager().expire(this);
102     hideBalloon();
103     myExpired = true;
104   }
105
106   public void hideBalloon() {
107     if (myBalloonRef != null) {
108       final Balloon balloon = myBalloonRef.get();
109       if (balloon != null) {
110         balloon.hide();
111       }
112       myBalloonRef = null;
113     }
114   }
115
116   public void setBalloon(@NotNull final Balloon balloon) {
117     hideBalloon();
118     myBalloonRef = new WeakReference<Balloon>(balloon);
119     balloon.addListener(new JBPopupAdapter() {
120       @Override
121       public void onClosed(LightweightWindowEvent event) {
122         WeakReference<Balloon> ref = myBalloonRef;
123         if (ref != null && ref.get() == balloon) {
124           myBalloonRef = null;
125         }
126       }
127     });
128   }
129
130   @Nullable
131   public Balloon getBalloon() {
132     return myBalloonRef == null ? null : myBalloonRef.get();
133   }
134
135   public void notify(@Nullable Project project) {
136     Notifications.Bus.notify(this, project);
137   }
138
139   public boolean isImportant() {
140     return getListener() != null;
141   }
142 }