7b3ecd67ca476deed90484da75093bf1d70b9c18
[idea/community.git] / platform / platform-api / src / com / intellij / notification / Notification.java
1 /*
2  * Copyright 2000-2013 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 com.intellij.openapi.util.text.StringUtil;
24 import com.intellij.reference.SoftReference;
25 import org.jetbrains.annotations.NotNull;
26 import org.jetbrains.annotations.Nullable;
27
28 import javax.swing.*;
29 import java.lang.ref.WeakReference;
30
31 /**
32  * @author spleaner
33  */
34 public class Notification {
35   private static final Logger LOG = Logger.getInstance("#com.intellij.notification.Notification");
36
37   private final String myGroupId;
38   private final String myContent;
39   private final NotificationType myType;
40   private final NotificationListener myListener;
41   private final String myTitle;
42   private boolean myExpired;
43   private Runnable myWhenExpired;
44   private Boolean myImportant;
45   private WeakReference<Balloon> myBalloonRef;
46
47   public Notification(@NotNull final String groupDisplayId, @NotNull final String title, @NotNull final String content, @NotNull final NotificationType type) {
48     this(groupDisplayId, title, content, type, null);
49   }
50
51   /**
52    * @param groupDisplayId this should be a human-readable, capitalized string like "Facet Detector".
53    *                       It will appear in "Notifications" configurable.
54    * @param title notification title
55    * @param content notification content
56    * @param type notification type
57    * @param listener notification lifecycle listener
58    */
59   public Notification(@NotNull final String groupDisplayId, @NotNull final String title, @NotNull final String content, @NotNull final NotificationType type, @Nullable NotificationListener listener) {
60     myGroupId = groupDisplayId;
61     myTitle = title;
62     myContent = content;
63     myType = type;
64     myListener = listener;
65
66     LOG.assertTrue(!StringUtil.isEmptyOrSpaces(myContent), "Notification should have content, groupId: " + myGroupId);
67   }
68
69   @SuppressWarnings("MethodMayBeStatic")
70   @Nullable
71   public Icon getIcon() {
72     return null;
73   }
74
75   @NotNull
76   public String getGroupId() {
77     return myGroupId;
78   }
79
80   @NotNull
81   public String getTitle() {
82     return myTitle;
83   }
84
85   @NotNull
86   public String getContent() {
87     return myContent;
88   }
89
90   @Nullable
91   public NotificationListener getListener() {
92     return myListener;
93   }
94
95   @NotNull
96   public NotificationType getType() {
97     return myType;
98   }
99
100   public boolean isExpired() {
101     return myExpired;
102   }
103
104   public void expire() {
105     NotificationsManager.getNotificationsManager().expire(this);
106     hideBalloon();
107     myExpired = true;
108
109     Runnable whenExpired = myWhenExpired;
110     if (whenExpired != null) whenExpired.run();
111   }
112
113   public Notification whenExpired(@Nullable Runnable whenExpired) {
114     myWhenExpired = whenExpired;
115     return this;
116   }
117
118   public void hideBalloon() {
119     if (myBalloonRef != null) {
120       final Balloon balloon = myBalloonRef.get();
121       if (balloon != null) {
122         balloon.hide();
123       }
124       myBalloonRef = null;
125     }
126   }
127
128   public void setBalloon(@NotNull final Balloon balloon) {
129     hideBalloon();
130     myBalloonRef = new WeakReference<Balloon>(balloon);
131     balloon.addListener(new JBPopupAdapter() {
132       @Override
133       public void onClosed(LightweightWindowEvent event) {
134         if (SoftReference.dereference(myBalloonRef) == balloon) {
135           myBalloonRef = null;
136         }
137       }
138     });
139   }
140
141   @Nullable
142   public Balloon getBalloon() {
143     return SoftReference.dereference(myBalloonRef);
144   }
145
146   public void notify(@Nullable Project project) {
147     Notifications.Bus.notify(this, project);
148   }
149
150   public Notification setImportant(boolean important) {
151     myImportant = important;
152     return this;
153   }
154
155   public boolean isImportant() {
156     if (myImportant != null) {
157       return myImportant;
158     }
159
160     return getListener() != null;
161   }
162 }