001: /*=============================================================================
002: * Copyright Texas Instruments 2001, 2002. All Rights Reserved.
003: *
004: * This program is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU General Public License for more details.
013: *
014: * You should have received a copy of the GNU General Public License
015: * along with this program; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018:
019: package ti.chimera;
020:
021: import java.awt.*;
022:
023: /**
024: * A splash screen is a borderless window displayed at startup. It contains
025: * the specified splash screen image, plus the log text at the specified
026: * location.
027: *
028: * @author Rob Clark
029: * @version 0.1
030: */
031: public class SplashScreen extends Window implements Main.Logger {
032: private Image img;
033: private int imgWidth;
034: private int imgHeight;
035:
036: private int textX;
037: private int textY;
038:
039: private String logMessage = "";
040:
041: /**
042: * if not null, this indicates the size of the previously drawn log message,
043: * so we know what portion of the window needs to be repainted when the
044: * log message changes
045: */
046: private Rectangle logMessageRect;
047:
048: private Font font;
049: private FontMetrics fm;
050:
051: private Main main;
052:
053: /**
054: * Create a splash screen.
055: *
056: * @param url the name of the resource containing the splash image
057: * @param x the x-coordinate to draw text at
058: * @param y the y-coordinate to draw text at
059: */
060: public SplashScreen(Main main, java.net.URL url, int x, int y) {
061: super (new Frame());
062:
063: this .main = main;
064:
065: textX = x;
066: textY = y;
067:
068: Toolkit tk = Toolkit.getDefaultToolkit();
069: img = tk.createImage(url);
070:
071: font = new Font("SansSerif", Font.BOLD, 12);
072:
073: // wait for the image to be fully loaded:
074: MediaTracker mt = new MediaTracker(this );
075: mt.addImage(img, 0);
076: try {
077: mt.waitForAll();
078: } catch (InterruptedException e) {
079: // ignore
080: }
081: imgWidth = img.getWidth(this );
082: imgHeight = img.getHeight(this );
083:
084: // center splash screen:
085: Dimension d = tk.getScreenSize();
086: setBounds((d.width - imgWidth) / 2, (d.height - imgHeight) / 2,
087: imgWidth, imgHeight);
088: }
089:
090: /**
091: * Called to show or hide the splash screen. While the splash screen
092: * is visible, it is registered with <code>main</code> to receive log
093: * events.
094: *
095: * @param visible is the splash screen visible
096: */
097: public void setVisible(boolean visible) {
098: if (visible)
099: main.addLogger(this );
100: else
101: main.removeLogger(this );
102: super .setVisible(visible);
103: }
104:
105: /**
106: * Set the current log message that is super-imposed over the splash
107: * image.
108: *
109: * @param msg the message
110: */
111: public void log(String msg) {
112: logMessage = msg;
113: if (logMessageRect != null)
114: repaint(logMessageRect.x, logMessageRect.y,
115: logMessageRect.width, logMessageRect.height);
116: else
117: repaint();
118: }
119:
120: /**
121: * Paint the splash screen.
122: *
123: * @param g the graphics context
124: */
125: public void paint(Graphics g) {
126: g.drawImage(img, 0, 0, imgWidth, imgHeight, this );
127:
128: g.setColor(Color.white);
129: g.setFont(font);
130:
131: if (fm == null)
132: fm = g.getFontMetrics(font);
133:
134: if (logMessageRect == null) {
135: logMessageRect = fm.getStringBounds("", g).getBounds();
136: logMessageRect.x = textX;
137: logMessageRect.y = textY - fm.getAscent();
138: logMessageRect.width = imgWidth - textX;
139: }
140:
141: g.drawString(logMessage, textX, textY);
142: }
143:
144: /**
145: * No need to ever clearRect, so override this too.
146: */
147: public void update(Graphics g) {
148: paint(g);
149: }
150: }
151:
152: /*
153: * Local Variables:
154: * tab-width: 2
155: * indent-tabs-mode: nil
156: * mode: java
157: * c-indentation-style: java
158: * c-basic-offset: 2
159: * eval: (c-set-offset 'substatement-open '0)
160: * eval: (c-set-offset 'case-label '+)
161: * eval: (c-set-offset 'inclass '+)
162: * eval: (c-set-offset 'inline-open '0)
163: * End:
164: */
|