/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2011 Dmitry Barashev
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.sourceforge.ganttproject.gui;
import java.awt.GridLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.util.Collection;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import net.sourceforge.ganttproject.action.ShowChannelAction;
import net.sourceforge.ganttproject.gui.NotificationComponent.AnimationView;
public class NotificationManagerImpl implements NotificationManager {
private AnimationView myAnimationView;
private NotificationChannel myFirstChannel;
public NotificationManagerImpl(AnimationView animationView) {
myAnimationView = animationView;
}
@Override
public void showNotification(final NotificationChannel channel) {
if (channel.getItems().isEmpty() && channel.getDefaultNotification() == null) {
return;
}
if (!myAnimationView.isReady()) {
if (myFirstChannel == null) {
myFirstChannel = channel;
}
return;
}
if (myAnimationView.isVisible()) {
return;
}
NotificationComponent nc = new NotificationComponent(channel, myAnimationView);
channel.setVisible(true);
nc.processItems();
myAnimationView.setComponent(nc.getComponent(), channel.getButton(), new Runnable() {
@Override
public void run() {
channel.getButton().setBackground(channel.getNormalColor());
channel.setVisible(false);
}
});
}
public void showPending() {
if (myFirstChannel != null) {
showNotification(myFirstChannel);
}
}
JComponent getChannelButtons() {
final JPanel result = new JPanel(new GridLayout(1, 2, 3, 0));
TestGanttRolloverButton rssButton = new TestGanttRolloverButton(
new ShowChannelAction(this, NotificationChannel.RSS));
NotificationChannel.RSS.setButton(rssButton);
result.add(rssButton);
TestGanttRolloverButton warningButton = new TestGanttRolloverButton(new ShowChannelAction(this, NotificationChannel.WARNING));
result.add(warningButton);
NotificationChannel.WARNING.setButton(warningButton);
TestGanttRolloverButton errorButton = new TestGanttRolloverButton(new ShowChannelAction(this,
NotificationChannel.ERROR));
NotificationChannel.ERROR.setButton(errorButton);
result.add(errorButton);
result.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
}
@Override
public void componentResized(ComponentEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showPending();
}
});
result.removeComponentListener(this);
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentHidden(ComponentEvent e) {
}
});
return result;
}
@Override
public void addNotifications(final NotificationChannel channel, Collection<NotificationItem> items) {
channel.addNotifications(items);
if (!channel.isVisible()) {
boolean hasVisibleChannel = false;
for (NotificationChannel ch : NotificationChannel.values()) {
hasVisibleChannel |= ch.isVisible();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
channel.saveNormalColor();
channel.getButton().setBackground(channel.getColor());
}
});
if (!hasVisibleChannel) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showNotification(channel);
}
});
}
}
}
@Override
public void hideNotification() {
myAnimationView.close();
}
@Override
public AnimationView setAnimationView(AnimationView view) {
AnimationView oldView = myAnimationView;
myAnimationView = view;
return oldView;
}
}