/* Ticker Ver 1.51 by Toh Lik Khoong Vertical Scroller developed using MSDK 4.0 Last revised 01/03/2001 Please contact me at lktoh@navsurf.com for any comments or suggestions The source code is strictly for educational purposes and cannot be modified or used without the express permission of the author Visit http://navsurf.com for the latest version and other useful applets */ /* sample applet for ticker */ import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.net.*; import java.io.*; import java.awt.image.ImageObserver; public class ticker extends Applet implements Runnable{ // global parameters private Thread m_thread; private Image m_imgBuffer = null; private int y_pos = 0; // scroller private int cur_news = 0; // current news item private int cur_pos = 0; // mouse cursor position private boolean pause = false; // pause private boolean m_over = false; // mouse over private Vector news = new Vector(); // contains the text to display private Vector urls = new Vector(); // contains the corresponding URL // default parameters private int size = 10; private Font ft = new Font("TimesRoman",Font.PLAIN,size); private FontMetrics fm; private String filename = "news.txt"; private String target = "_blank"; private int height; private int xmargin = 10; private int ymargin = 0; private Color[] fontcolor = new Color[2]; private Color bgcolor = new Color(0); private Color rectcolor; private int speed = 100; private int spacing = 20; private Image bgimage = null; public void init(){ // retrieval of applet parameters String param; param = getParameter("size"); if (param != null) size = Integer.parseInt(param); param = getParameter("font"); if (param != null) ft = parseFont(param, ", "); param = getParameter("target"); if (param != null) target = param; param = getParameter("xmargin"); if (param != null) xmargin = Integer.parseInt(param); param = getParameter("ymargin"); if (param != null) ymargin = Integer.parseInt(param); param = getParameter("bgcolor"); if (param != null) bgcolor = new Color(Integer.parseInt(param,16)); param = getParameter("rectcolor"); if (param != null) rectcolor = new Color(Integer.parseInt(param,16)); else rectcolor = bgcolor; param = getParameter("fontcolor"); if (param != null) parseColor(param, ", ", fontcolor); param = getParameter("spacing"); if (param != null) spacing = Integer.parseInt(param); param = getParameter("filename"); if (param != null) filename = param; param = getParameter("speed"); if (param != null) speed = Integer.parseInt(param); param = getParameter("bgimage"); if (param != null){ bgimage = getImage(getDocumentBase(), param); // performs aynchronuous image loading correctly prepareImage(bgimage, this); } setFont(ft); fm = getFontMetrics(ft); height = fm.getAscent() + fm.getDescent(); // read the news file readFile(); } private Font parseFont(String text, String delimiter){ String font_name = "Arial"; int font_size = 12; int font_style = Font.PLAIN; StringTokenizer st = new StringTokenizer(text, delimiter); if (st.hasMoreTokens()){ font_name = st.nextToken(); if (st.hasMoreTokens()){ font_style = Integer.parseInt(st.nextToken()); if (st.hasMoreTokens()){ font_size = Integer.parseInt(st.nextToken()); } } } return (new Font(font_name, font_style, font_size)); } private void parseColor(String text, String delimiter, Color[] color){ color[0] = new Color(0); color[1] = new Color(255, 0, 0); StringTokenizer st = new StringTokenizer(text, delimiter); if (st.hasMoreTokens()){ color[0] = new Color(Integer.parseInt(st.nextToken(), 16)); if (st.hasMoreTokens()) color[1] = new Color(Integer.parseInt(st.nextToken(), 16)); } } public boolean mouseEnter(Event e, int x, int y){ stop(); m_over = true; cur_pos = e.y; repaint(); return true; } public boolean mouseExit(Event e, int x, int y){ start(); m_over = false; repaint(); return true; } public boolean mouseMove(Event e, int x, int y){ cur_pos = e.y; m_over = true; repaint(); return true; } public boolean mouseDown(Event e, int x, int y){ if (urls.elementAt(cur_news) instanceof URL){ URL myURL = (URL) urls.elementAt(cur_news); getAppletContext().showDocument(myURL,getParameter("target")); } return true; } // function to read file private void readFile() { String line; try{ URL url = new URL(getDocumentBase(), filename); try{ // read file BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); do{ line = in.readLine(); if (line != null){ try{ StringTokenizer st = new StringTokenizer(line, "|"); news.addElement(st.nextToken()); // get display text if (st.hasMoreTokens()){ // get url urls.addElement(new URL(getDocumentBase(), st.nextToken())); } else{ // no url, adding indicator urls.addElement("nourl"); } }catch (NoSuchElementException nsee){} // exception if carriage return at eof } }while (line != null); } catch (IOException e){ news.addElement("Could not open news feed file."); urls.addElement("nourl"); System.err.println("Could not open news feed file."); } }catch (MalformedURLException e){} } public void paint(Graphics g){ if (m_imgBuffer == null){ // double buffering m_imgBuffer = createImage(size().width, size().height); render(g); // display the ticker } g.drawImage(m_imgBuffer, 0, 0, null); } public void update(Graphics g){ render(g); paint(g); } // function that displays the ticker public void render(Graphics g) { // drawing of the background g = m_imgBuffer.getGraphics(); g.setColor(rectcolor); g.fillRect(0, 0, size().width, size().height); g.setColor(bgcolor); g.fillRect(xmargin, ymargin, size().width - 2 * xmargin, size().height - 2 * ymargin); if (bgimage != null){ g.drawImage(bgimage, 0, 0, this); } g.setColor(fontcolor[0]); // set clip area for the scrolling text g.setClip(xmargin, ymargin, size().width - 2 * xmargin, size().height - 2 * ymargin); boolean reset = false; // if true, reset the value of y_pos int y = 0; String s = ""; while (y + y_pos < size().height){ // calculate the position of the news item for (int i = 0; i < news.size(); i++){ if (m_over){ // mouse over the text int b1 = y_pos + ymargin; // top current news border int b2 = y_pos + ymargin; // bottom current news border // search for the current news to highlight while (b2 < size().height){ for (int j = 0; j < news.size(); j++){ b1 = b2; // set top border StringTokenizer st = new StringTokenizer((String) news.elementAt(j)," ",false); String t = ""; while (st.hasMoreTokens()){ s = ""; do{ if (!t.equals("")) s += t + " "; t = st.nextToken(); }while (fm.stringWidth(s + t) < size().width - 2 * xmargin - 5 && st.hasMoreTokens()); if (!st.hasMoreTokens() && fm.stringWidth(s + t) > size().width - 2 * xmargin - 5){ b2 += 2 * height; } else{ b2 += height; } } if (cur_pos > b1 && cur_pos < b2){ // look for current news cur_news = j; } b2 += spacing; // calculate bottom border } } // highlight item if (i == cur_news && (urls.elementAt(i) instanceof URL)) g.setColor(fontcolor[1]); else g.setColor(fontcolor[0]); } // pause the ticker when new item appears if (y_pos + y == 0){ pause = true; } // display the text String t = ""; StringTokenizer st = new StringTokenizer((String) news.elementAt(i)," ",false); while (st.hasMoreTokens()){ s = ""; do{ if (!t.equals("")) s += t + " "; t = st.nextToken(); }while (fm.stringWidth(s + t) < size().width - 2 * xmargin - 5 && st.hasMoreTokens()); y += height; if (st.hasMoreTokens()){ if (y + y_pos > 0 && y + y_pos < size().height) g.drawString(s, xmargin + 2, y + y_pos + ymargin); } else{ // special treatment for last line (no more tokens left) if (fm.stringWidth(s + t) > size().width - 2 * xmargin - 5){ // not enough space, draw on different lines if (y + y_pos > 0 && y + y_pos < size().height) g.drawString(s, xmargin + 2, y + y_pos + ymargin); y += height; if (y + y_pos > 0 && y + y_pos < size().height) g.drawString(t, xmargin + 2, y + y_pos + ymargin); } else{ // if not, draw on same line if (y + y_pos > 0 && y + y_pos < size().height) g.drawString(s + t, xmargin + 2, y + y_pos + ymargin); } } } y += spacing; } if (y + y_pos < 0) reset = true; } if (reset) y_pos = 0; // reset the scroller position } // performs aynchronuous image loading correctly public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height){ if ((infoflags & ImageObserver.ALLBITS) != 0){ repaint(); return false; } return true; } public void start(){ m_thread = new Thread(this); m_thread.start(); } public void stop(){ if (m_thread != null){ m_thread.stop(); m_thread = null; } //m_thread = null; } public void run(){ try{ while(true){ if (pause){ // pause when new item appears m_thread.sleep(4000); pause = false; } m_thread.sleep(speed); if (!m_over) y_pos--; // scroll the ticker repaint(); } } catch (InterruptedException e){} } }