/*
* BallonDispalyManager.java
*
* Created on 2009-04-07, 22:53:26
*/
package app.navigps.gui.svgComponents.DisplayObjects;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.LinkedList;
import javax.swing.Timer;
import javax.xml.crypto.Data;
import net.java.balloontip.BalloonTip;
/**
*
* @author Grzegorz (wara) Warywoda
*/
public final class BallonDispalyManager {
public static final String ONLY_ONE_BALLON = "only.one";
public static final String MANY_BALLONS = "many.one";
private String mode = ONLY_ONE_BALLON;
private LinkedList <ToolTipInvoker> queue = new LinkedList <ToolTipInvoker>();
private static BallonDispalyManager instance = new BallonDispalyManager();
public synchronized static void showBallon(BalloonTip ballon,int initialDelay, int showDelay){
instance.addToQueue(new ToolTipInvoker(ballon, initialDelay, showDelay));
}
private void addToQueue(ToolTipInvoker ballon){
if(!queue.contains(ballon)){
queue.push(ballon);
addedBallonToQueue();
}
}
private void addedBallonToQueue(){
if(mode.equals(ONLY_ONE_BALLON)){
queue.getFirst().start();
if(queue.size()>1)
queue.getLast().dipatchToolTip();
}else if(mode.equals(MANY_BALLONS)){
queue.pop().start();
}
// System.out.println("**ADDED ** QUEUE SIZE: "+queue.size()+" in mode: "+getMode());
}
private void removeBallonFromQueue(ToolTipInvoker invoker){
boolean isRemoved = queue.remove(invoker);
//System.out.println("is removed "+invoker.hashCode()+" : "+isRemoved);
//System.out.println("**REMOVED ** QUEUE SIZE: "+queue.size());
}
public int getQueueSize(){
return queue.size();
}
public static String getDisplayMode(){
return instance.getMode();
}
public static void setDisplayMode(String aMode){
instance.setMode(aMode);
}
/**
* @return the mode
*/
public String getMode() {
return mode;
}
/**
* @param aMode the mode to set
*/
public void setMode(String aMode) {
mode = aMode;
}
private static class ToolTipInvoker{
private final BalloonTip balloonTip;
private Timer initialTimer;
private Timer showTimer;
private final int hash;
/**
* Constructor
* @param balloonTip
* @param initialDelay in milliseconds, how long should you hover over the attached component before showing the tooltip
* @param showDelay in milliseconds, how long should the tooltip stay visible
*/
public ToolTipInvoker(final BalloonTip balloonTip, int initialDelay, int showDelay) {
super();
this.balloonTip = balloonTip;
initialTimer = new Timer(initialDelay, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println("\n\t"+new Date()+" [start] Is visible "+balloonTip.isVisible());
balloonTip.setVisible(true);
showTimer.start();
}
});
initialTimer.setRepeats(false);
showTimer = new Timer(showDelay, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println("\n\t"+new Date()+" [stop] Is visible "+balloonTip.isVisible());
balloonTip.setVisible(false);
removeFromQueue();
}
});
showTimer.setRepeats(false);
hash = createHashCode();
}
public void dipatchToolTip(){
if(initialTimer.isRunning()){
initialTimer.stop();
}
if(showTimer.isRunning()){
showTimer.stop();
}
if(balloonTip.isShowing()){
boolean animator = balloonTip.isAnimatorEnabled();
if(animator){
balloonTip.setAnimatorEnabled(!animator);
balloonTip.setVisible(false);
balloonTip.setAnimatorEnabled(animator);
}else{
balloonTip.setVisible(false);
}
}
removeFromQueue();
}
private void removeFromQueue(){
instance.removeBallonFromQueue(ToolTipInvoker.this);
}
public void start(){
//System.out.println("Start showing tooltip ;}");
initialTimer.start();
}
@Override
public boolean equals(Object obj) {
if(obj instanceof ToolTipInvoker){
return this.hash == obj.hashCode();
}
return false;
}
private int createHashCode(){
return (this.balloonTip != null ? this.balloonTip.hashCode() : 0);
}
@Override
public int hashCode() {
return hash;
}
}
}