package org.chartsy.chatsy.chat.ui;
import org.chartsy.chatsy.chat.ChatsyManager;
import javax.swing.Timer;
import javax.swing.JFrame;
import java.awt.Point;
import java.awt.Window;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ShakeWindow
{
public static final int SHAKE_DISTANCE = 10;
public static final double SHAKE_CYCLE = 50;
public static final int SHAKE_DURATION = 1000;
public static final int SHAKE_UPDATE = 5;
private Window window;
private Point naturalLocation;
private long startTime;
private Timer shakeTimer;
private final double TWO_PI = Math.PI * 2.0;
private boolean added = false;
public ShakeWindow(Window d)
{
window = d;
}
public void startShake()
{
if (window instanceof JFrame)
{
JFrame f = (JFrame)window;
f.setState(Frame.NORMAL);
f.setVisible(true);
}
ChatsyManager.getNativeManager().flashWindow(window);
naturalLocation = window.getLocation();
startTime = System.currentTimeMillis();
shakeTimer = new Timer(SHAKE_UPDATE, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
long elapsed = System.currentTimeMillis() - startTime;
double waveOffset = (elapsed % SHAKE_CYCLE) / SHAKE_CYCLE;
double angle = waveOffset * TWO_PI;
int shakenX = (int)((Math.sin(angle) * SHAKE_DISTANCE) + naturalLocation.x);
int shakenY;
if (added)
{
shakenY = naturalLocation.y - 10;
added = false;
}
else
{
shakenY = naturalLocation.y + 10;
added = true;
}
window.setLocation(shakenX, shakenY);
window.repaint();
if (elapsed >= SHAKE_DURATION)
stopShake();
}
});
shakeTimer.start();
}
public void stopShake()
{
shakeTimer.stop();
window.setLocation(naturalLocation);
window.repaint();
ChatsyManager.getNativeManager().stopFlashing(window);
}
}