Animated Message Panel
/**
* Arsenal Real-Time Collaboration Server Project
* Copyright (C) 2003 Michael Burnside, Arsenal Project
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* *****************************************************************
* $Header: /cvs/coolcollaborator/prod/coolcollaborator/prod/util/src/com/arsenal/util/AnimatedMessagePanel.java,v 1.1.1.1 2006/01/12 04:54:02 mburnside Exp $
*
* File: $Workfile: AnimatedMessagePanel.java $
*
* Description:
*
* A special panel that can scroll text messages and resize itself
*
* @author michael@michaelburnside.com (arsenal-1)
* @author Michael Burnside
* @version %I%, %G%
* @since 1.0
*
*/
import javax.swing.*;
import javax.swing.border.*;
import javax.accessibility.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.Hashtable;
import java.util.TreeMap;
import java.util.Date;
import java.util.StringTokenizer;
import java.util.Enumeration;
import java.awt.font.*;
import java.awt.geom.*;
public class AnimatedMessagePanel extends JPanel implements Runnable {
private Graphics og = null;
private Image offscreen = null;
private int height = 230;
private int width = 575;
private int x = 0;
private int y = 0;
private Thread animator = null;
private Graphics g = null;
//private Graphics2D g2 = null;
private boolean started = false;
private String[] messageQue = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }; // size is 5
private Font font = new Font("Arial", Font.PLAIN, 11);
private boolean currentlyScrolling = false;
private void setCurrentlyScrolling(boolean currentlyScrolling) { this.currentlyScrolling = currentlyScrolling; }
private boolean isCurrentlyScrolling() { return currentlyScrolling; }
private String[] messageWaitingQue = { "", "", "", "", "", "", "", "", "", "", "", "", "", "" }; // also size 5, its for if a message arrives while we are currently scrolling
private static AnimatedMessagePanel instance = new AnimatedMessagePanel();
public static AnimatedMessagePanel getInstance() {
if (instance == null) {
instance = new AnimatedMessagePanel();
}
return instance;
}
public AnimatedMessagePanel() {
//init();
setWidthAndHeight();
}
public void init() {
offscreen = createImage(width, height);
og = offscreen.getGraphics();
//g2 = (Graphics2D)og;
}
public void setWidthAndHeight() {
setPreferredSize(new Dimension(width, height));
setMinimumSize(new Dimension(width, height));
setMaximumSize(new Dimension(width, height));
}
public void setWidthAndHeight(int width, int height) {
this.width = width;
this.height = height;
setWidthAndHeight();
}
public void update(Graphics g) {
if((offscreen != null) && (og != null))
paint(g);
}
public void paint(Graphics g) {
if((offscreen != null) && (og != null)) {
g.drawImage(offscreen, 0, 0, null);
}
}
public void run() {
boolean setup = true;
while(setup) {
try { animator.sleep(1000); } catch(Exception e) { }
if((offscreen != null) && (og != null)) {
paintBG();
printMessages();
repaint();
setup = false;
}
else {
offscreen = createImage(width, height);
if(offscreen != null) {
og = offscreen.getGraphics();
System.out.println("\n\nget og object: " + og);
printMessages();
}
}
//while(true) {
//just loop to check for resize of component
// try { animator.sleep(2000); } catch(Exception e) { }
// if(!currentlyScrolling) {
// repaint();
// }
//}
}
}
private void paintBG() {
og.setColor(Color.white);
og.fillRect(0, 0, getWidth(), getHeight());
//og.setColor(Color.black);
}
public void start() {
if(started) return;
animator = new Thread(this);
try { animator.sleep(1500); } catch(Exception e) { }
animator.start();
started = true;
}
public void alertNewMessage(String message) {
addToMessageQue(message);
}
public void printMessages() {
try {
Runnable runner = new Runnable () {
public void run () {
AnimatedMessagePanel.getInstance().setCurrentlyScrolling(true);
Graphics2D g2 = (Graphics2D)og;
int linecount = 1;
StringTokenizer st1 = new StringTokenizer(messageQue[0]);
String text1 = "";
String testtext1 = "";
String prodtext1 = "";
while(st1.hasMoreTokens()) {
text1 = st1.nextToken();
testtext1 += text1 + " ";
FontRenderContext frc1 = g2.getFontRenderContext();
TextLayout t11 = new TextLayout(testtext1, font, frc1);
int sw1 = (int) t11.getBounds().getWidth();
if(sw1 > (getWidth() - 40)) {
linecount++;
testtext1 = "";
prodtext1 = text1;
}
else prodtext1 += text1 + " ";
}
for (int k = -(15)*(linecount-1); k <= 15; k++) {
paintBG();
int y = k;
og.setColor(Color.black);
for(int j = 0; j < messageQue.length; j++) {
if(messageQue[j].length() != 0) {
StringTokenizer st = new StringTokenizer(messageQue[j]);
String text = "";
String testtext = "";
String prodtext = "";
while(st.hasMoreTokens()) {
text = st.nextToken();
testtext += text + " ";
FontRenderContext frc = g2.getFontRenderContext();
TextLayout t1 = new TextLayout(testtext, font, frc);
int sw = (int) t1.getBounds().getWidth();
if(sw > (getWidth() - 40)) {
og.drawString(prodtext, 10, y);
y += 12;
testtext = "";
prodtext = text;
}
else prodtext += text + " ";
}
og.drawString(prodtext, 10, y);
y += 18;
if(y > getHeight()) break;
}
}
repaint();
try { Thread.sleep(50); } catch(Exception de) { }
}
AnimatedMessagePanel.getInstance().setCurrentlyScrolling(false);
AnimatedMessagePanel.getInstance().checkForMessagesWaiting();
}
};
new Thread (runner, "printMessage.run").start ();
}
catch ( Exception e) { }
}
private void addToMessageQue(String message) {
if(isCurrentlyScrolling()) putMessageInWaitingQue(message);
else {
//first move all messages down one then add then new message to the top
for(int i = (messageQue.length - 2); i >= 0 ; i--)
messageQue[i+1] = messageQue[i];
messageQue[0] = message;
printMessages();
}
}
private void putMessageInWaitingQue(String message) {
for(int i = 0; i < messageWaitingQue.length; i++) {
if(messageWaitingQue[i].length() == 0) { //nothing there, so it's open
messageWaitingQue[i] = message;
break;
}
}
}
private boolean messageQueEmpty() {
return (messageWaitingQue[0].length() == 0);
}
private String getNextMessageInWaitingQue() {
String returnStr = messageWaitingQue[0];
adjustMessageWaitingQue();
return returnStr;
}
private void adjustMessageWaitingQue() {
for(int i = 0; i < (messageWaitingQue.length - 1); i++)
messageWaitingQue[i] = messageWaitingQue[i + 1];
messageWaitingQue[(messageWaitingQue.length - 1)] = "";
}
private void checkForMessagesWaiting() {
if(!messageQueEmpty()) {
addToMessageQue(getNextMessageInWaitingQue());
}
}
public void clearMessageQues() {
for(int i = 0; i < messageQue.length; i++) messageQue[i] = "";
for(int j = 0; j < messageWaitingQue.length; j++) messageWaitingQue[j] = "";
printMessages();
}
}
Related examples in the same category