Cleanup (formatting)
[idea/community.git] / platform / platform-api / src / com / intellij / notification / Notification.java
1 /*
2  * Copyright 2000-2014 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 String groupDisplayId, @NotNull String title, @NotNull String content, @NotNull 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 String groupDisplayId,
60                       @NotNull String title,
61                       @NotNull String content,
62                       @NotNull NotificationType type,
63                       @Nullable NotificationListener listener) {
64     myGroupId = groupDisplayId;
65     myTitle = title;
66     myContent = content;
67     myType = type;
68     myListener = listener;
69
70     LOG.assertTrue(!StringUtil.isEmptyOrSpaces(myContent), "Notification should have content, groupId: " + myGroupId);
71   }
72
73   @SuppressWarnings("MethodMayBeStatic")
74   @Nullable
75   public Icon getIcon() {
76     return null;
77   }
78
79   @NotNull
80   public String getGroupId() {
81     return myGroupId;
82   }
83
84   @NotNull
85   public String getTitle() {
86     return myTitle;
87   }
88
89   @NotNull
90   public String getContent() {
91     return myContent;
92   }
93
94   @Nullable
95   public NotificationListener getListener() {
96     return myListener;
97   }
98
99   @NotNull
100   public NotificationType getType() {
101     return myType;
102   }
103
104   public boolean isExpired() {
105     return myExpired;
106   }
107
108   public void expire() {
109     NotificationsManager.getNotificationsManager().expire(this);
110     hideBalloon();
111     myExpired = true;
112
113     Runnable whenExpired = myWhenExpired;
114     if (whenExpired != null) whenExpired.run();
115   }
116
117   public Notification whenExpired(@Nullable Runnable whenExpired) {
118     myWhenExpired = whenExpired;
119     return this;
120   }
121
122   public void hideBalloon() {
123     if (myBalloonRef != null) {
124       final Balloon balloon = myBalloonRef.get();
125       if (balloon != null) {
126         balloon.hide();
127       }
128       myBalloonRef = null;
129     }
130   }
131
132   public void setBalloon(@NotNull final Balloon balloon) {
133     hideBalloon();
134     myBalloonRef = new WeakReference<Balloon>(balloon);
135     balloon.addListener(new JBPopupAdapter() {
136       @Override
137       public void onClosed(LightweightWindowEvent event) {
138         if (SoftReference.dereference(myBalloonRef) == balloon) {
139           myBalloonRef = null;
140         }
141       }
142     });
143   }
144
145   @Nullable
146   public Balloon getBalloon() {
147     return SoftReference.dereference(myBalloonRef);
148   }
149
150   public void notify(@Nullable Project project) {
151     Notifications.Bus.notify(this, project);
152   }
153
154   public Notification setImportant(boolean important) {
155     myImportant = important;
156     return this;
157   }
158
159   public boolean isImportant() {
160     if (myImportant != null) {
161       return myImportant;
162     }
163
164     return getListener() != null;
165   }
166 }