001: /*
002: * GNetWatch
003: * Copyright 2006, 2007 Alexandre Fenyo
004: * gnetwatch@fenyo.net
005: *
006: * This file is part of GNetWatch.
007: *
008: * GNetWatch is free software; you can redistribute it and/or modify
009: * it under the terms of the GNU General Public License as published by
010: * the Free Software Foundation; either version 2 of the License, or
011: * (at your option) any later version.
012: *
013: * GNetWatch is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016: * GNU General Public License for more details.
017: *
018: * You should have received a copy of the GNU General Public License
019: * along with GNetWatch; if not, write to the Free Software
020: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
021: */
022:
023: package net.fenyo.gnetwatch.GUI;
024:
025: import java.io.*;
026: import java.lang.reflect.*;
027:
028: import javax.swing.*;
029: import java.awt.*;
030: import java.util.*;
031:
032: import net.fenyo.gnetwatch.*;
033: import net.fenyo.gnetwatch.activities.*;
034:
035: import org.apache.commons.logging.Log;
036: import org.apache.commons.logging.LogFactory;
037:
038: /**
039: * This class creates JFrame instances outside of SWT, to allow use of Java2D API.
040: * @author Alexandre Fenyo
041: * @version $Id: AwtGUI.java,v 1.12 2007/03/03 00:38:19 fenyo Exp $
042: */
043:
044: public class AwtGUI implements Runnable {
045: private static Log log = LogFactory.getLog(AwtGUI.class);
046:
047: private final Config config;
048:
049: private Thread repaint_thread;
050: private java.util.List<JFrame> frame_list = new ArrayList<JFrame>();
051:
052: /**
053: * Constructor.
054: * @param config configuration.
055: */
056: // GUI thread
057: public AwtGUI(final Config config) {
058: this .config = config;
059: }
060:
061: /**
062: * Removes an AWT frame.
063: * @param frame frame to remove.
064: * @return void.
065: */
066: // GUI thread
067: public void dropFrame(final JFrame frame) {
068: synchronized (frame_list) {
069: frame_list.remove(frame);
070: }
071: frame.dispose();
072: }
073:
074: /**
075: * Creates a thread that will repaint each frame regularly.
076: * @param none.
077: * @return void.
078: */
079: // GUI thread
080: public void createAwtGUI() {
081: JFrame.setDefaultLookAndFeelDecorated(false);
082: createRepaintThread();
083: }
084:
085: /**
086: * Creates a thread that will repaint each frame regularly.
087: * @param none.
088: * @return void.
089: */
090: // GUI thread
091: private void createRepaintThread() {
092: repaint_thread = new Thread(this , "Repaint Thread");
093: repaint_thread.start();
094: }
095:
096: /**
097: * Adds a component to a frame and displays the frame.
098: * This method must be run from the AWT thread.
099: * @param frame frame.
100: * @param component component to add.
101: */
102: // AWT thread
103: private void _createFrame(final JFrame frame,
104: final BasicComponent component) {
105: frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
106: frame.getContentPane().add(component);
107:
108: //Display the window.
109: frame.pack();
110: frame.setVisible(true);
111: frame.toFront();
112: }
113:
114: /**
115: * Adds a component to a frame and displays the frame.
116: * This method can be run from any thread, and particularly the SWT thread.
117: * @param frame frame.
118: * @param component component to add.
119: */
120: // GUI thread
121: public JFrame createFrame(final String name,
122: final BasicComponent component)
123: throws InterruptedException, InvocationTargetException {
124: final JFrame frame = new JFrame(name);
125: frame.addWindowListener(component);
126: javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
127: public void run() {
128: _createFrame(frame, component);
129: }
130: });
131: synchronized (frame_list) {
132: frame_list.add(frame);
133: }
134: return frame;
135: }
136:
137: /**
138: * Refreshes the frames regularly.
139: * @param none.
140: * @return void.
141: */
142: // repaint thread
143: public void run() {
144: while (!config.isEnd())
145: try {
146: Thread.sleep(20);
147: synchronized (frame_list) {
148: for (final Frame frame : frame_list)
149: frame.repaint();
150: }
151: } catch (final InterruptedException ex) {
152: // this thread is interrupted when the application is terminated
153: }
154: }
155:
156: /**
157: * Terminates the repaint thread and closes any frame.
158: * @param none.
159: * @return void.
160: * @throws InterruptedException exception.
161: */
162: // main thread
163: public void end() throws InterruptedException {
164: // terminate the repaint thread
165: repaint_thread.interrupt();
166: repaint_thread.join();
167:
168: synchronized (frame_list) {
169: for (final Frame frame : frame_list)
170: frame.dispose();
171: }
172: }
173: }
|