diff options
Diffstat (limited to 'projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util')
9 files changed, 1863 insertions, 2145 deletions
diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ClassGrabber.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ClassGrabber.java index 4412dbc..0e95d2d 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ClassGrabber.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ClassGrabber.java @@ -25,79 +25,67 @@ import java.io.InputStream; import java.util.Hashtable; /** - * ClassGrabber is a class loader used by WindowGrabber. - * It simply loads classes by filename and nothing more. - * It exists mainly because the java 1.1 class loading - * framework doesn't easily allow the creation of class - * loaders nor the loading of arbitrary classes. + * ClassGrabber is a class loader used by WindowGrabber. It simply loads classes + * by filename and nothing more. It exists mainly because the java 1.1 class + * loading framework doesn't easily allow the creation of class loaders nor the + * loading of arbitrary classes. * * @author michael@mpowers.net - * @version $Revision: 904 $ - * $Date: 2006-02-18 18:19:05 -0500 (Sat, 18 Feb 2006) $ + * @version $Revision: 904 $ $Date: 2006-02-18 18:19:05 -0500 (Sat, 18 Feb 2006) + * $ */ -public class ClassGrabber extends ClassLoader -{ +public class ClassGrabber extends ClassLoader { Hashtable classMap = new Hashtable(); - public ClassGrabber() - { + public ClassGrabber() { super(); } - protected Class loadClass(String name, boolean resolve) - throws ClassNotFoundException - { - Class c = (Class) classMap.get( name ); + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + Class c = (Class) classMap.get(name); - if ( c != null ) return c; + if (c != null) + return c; - try - { - c = findSystemClass( name ); - } - catch ( Exception exc1 ) - { + try { + c = findSystemClass(name); + } catch (Exception exc1) { // System.err.print( "findSystemClass: " + name + ": " ); // System.err.println( exc1 ); } - if ( c != null ) return c; + if (c != null) + return c; - try - { - c = findLoadedClass( name ); - } - catch ( Exception exc1 ) - { + try { + c = findLoadedClass(name); + } catch (Exception exc1) { // System.err.print( "findLoadedClass: " + name + ": " ); // System.err.println( exc1 ); } - - if ( c != null ) return c; - - try - { - InputStream input = new BufferedInputStream( new FileInputStream( name ) ); - ByteArrayOutputStream output = new ByteArrayOutputStream( 200 ); + + if (c != null) + return c; + + try { + InputStream input = new BufferedInputStream(new FileInputStream(name)); + ByteArrayOutputStream output = new ByteArrayOutputStream(200); int ch; - while ( ( ch = input.read() ) != -1 ) - { - output.write( ch ); + while ((ch = input.read()) != -1) { + output.write(ch); } byte[] data = output.toByteArray(); - c = defineClass( null, data, 0, data.length ); - } - catch ( Exception exc ) - { - System.err.print( "getResource: " + name + ": " ); - System.err.println( exc ); - c = null; + c = defineClass(null, data, 0, data.length); + } catch (Exception exc) { + System.err.print("getResource: " + name + ": "); + System.err.println(exc); + c = null; } - if ( c != null ) - { - classMap.put( name, c ); - if ( resolve ) resolveClass( c ); + if (c != null) { + classMap.put(name, c); + if (resolve) + resolveClass(c); } return c; @@ -105,22 +93,18 @@ public class ClassGrabber extends ClassLoader } /* - * $Log$ - * Revision 1.2 2006/02/18 23:19:05 cgruber - * Update imports and maven dependencies. + * $Log$ Revision 1.2 2006/02/18 23:19:05 cgruber Update imports and maven + * dependencies. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.2 2003/08/06 23:07:53 chochos - * general code cleanup (mostly, removing unused imports) + * Revision 1.2 2003/08/06 23:07:53 chochos general code cleanup (mostly, + * removing unused imports) * - * Revision 1.1.1.1 2000/12/21 15:51:18 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:51:18 mpowers Contributing wotonomy. * - * Revision 1.2 2000/12/20 16:25:45 michael - * Added log to all files. + * Revision 1.2 2000/12/20 16:25:45 michael Added log to all files. * * */ - diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ComponentHighlighter.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ComponentHighlighter.java index c63157d..08e6216 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ComponentHighlighter.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ComponentHighlighter.java @@ -36,125 +36,115 @@ import javax.swing.SwingUtilities; import javax.swing.Timer; /** -* Visually highlights a component with the specified image for a brief period. -* -* @author michael@mpowers.net -* @author $Author: cgruber $ -* @version $Revision: 904 $ -* $Date: 2006-02-18 18:19:05 -0500 (Sat, 18 Feb 2006) $ -*/ -public class ComponentHighlighter implements ActionListener -{ - // lots of state to track - JRootPane rootPane; - JComponent component; - Component oldGlassPane; - JLabel imageLabel; - Timer timer; - JPanel glassPane; - -/** -* Alternate "Fire-and-forget" constructor loads an image from a URL. -* @param aComponent A Component that will be highlighted. -* @param aURL A URL pointing to an image. -*/ - public ComponentHighlighter( JComponent aComponent, URL aURL ) - { - if ( aURL == null ) return; - init( aComponent, Toolkit.getDefaultToolkit().getImage( aURL ) ); - } - -/** -* "Fire-and-forget" constructor. -* @param aComponent A Component that will be highlighted. -* @param anImage An image, preferably an animated GIF with transparency, -* that will slide along the length of the component. -*/ - public ComponentHighlighter( JComponent aComponent, Image anImage ) - { - init( aComponent, anImage ); - } - - protected void init( JComponent aComponent, Image anImage ) - { - if ( ( aComponent == null ) || ( anImage == null ) ) return; - - component = aComponent; - rootPane = SwingUtilities.getRootPane( component ); - oldGlassPane = rootPane.getGlassPane(); + * Visually highlights a component with the specified image for a brief period. + * + * @author michael@mpowers.net + * @author $Author: cgruber $ + * @version $Revision: 904 $ $Date: 2006-02-18 18:19:05 -0500 (Sat, 18 Feb 2006) + * $ + */ +public class ComponentHighlighter implements ActionListener { + // lots of state to track + JRootPane rootPane; + JComponent component; + Component oldGlassPane; + JLabel imageLabel; + Timer timer; + JPanel glassPane; + + /** + * Alternate "Fire-and-forget" constructor loads an image from a URL. + * + * @param aComponent A Component that will be highlighted. + * @param aURL A URL pointing to an image. + */ + public ComponentHighlighter(JComponent aComponent, URL aURL) { + if (aURL == null) + return; + init(aComponent, Toolkit.getDefaultToolkit().getImage(aURL)); + } + + /** + * "Fire-and-forget" constructor. + * + * @param aComponent A Component that will be highlighted. + * @param anImage An image, preferably an animated GIF with transparency, + * that will slide along the length of the component. + */ + public ComponentHighlighter(JComponent aComponent, Image anImage) { + init(aComponent, anImage); + } + + protected void init(JComponent aComponent, Image anImage) { + if ((aComponent == null) || (anImage == null)) + return; + + component = aComponent; + rootPane = SwingUtilities.getRootPane(component); + oldGlassPane = rootPane.getGlassPane(); glassPane = new JPanel(); - rootPane.setGlassPane( glassPane ); - glassPane.setVisible( true ); - glassPane.setOpaque( false ); - glassPane.setLayout( null ); - - ImageIcon icon = new ImageIcon( anImage ); - - imageLabel = new JLabel(); - imageLabel.setIconTextGap( 0 ); - imageLabel.setIcon( icon ); - imageLabel.setSize( icon.getIconWidth(), icon.getIconHeight() ); - glassPane.add( imageLabel ); - - Rectangle bounds = component.getBounds(); - if ( component.getParent() instanceof Component ) - { - bounds = SwingUtilities.convertRectangle( (Container) component.getParent(), - bounds, rootPane.getContentPane() ); - } - imageLabel.setLocation( - bounds.x, bounds.y + bounds.height - imageLabel.getBounds().height ); - - glassPane.revalidate(); - glassPane.repaint(); - - component.transferFocus(); // halts a caret, if necessary - - timer = new Timer( 80, this ); - timer.setRepeats( true ); - timer.start(); - } - - public void actionPerformed( ActionEvent evt ) - { - Rectangle bounds = imageLabel.getBounds(); - Rectangle target = component.getBounds(); - if ( component.getParent() instanceof Component ) - { - target = SwingUtilities.convertRectangle( (Container) component.getParent(), - target, rootPane.getContentPane() ); - } - - if ( bounds.x + bounds.width > target.x + target.width ) - { // clean up and end - timer.stop(); - rootPane.setGlassPane( oldGlassPane ); - component.requestFocus(); - return; - } - - // else, slide to the right and continue - imageLabel.setLocation( - bounds.x + Math.max( bounds.width / 12, 1 ), bounds.y ); - imageLabel.repaint(); - } + rootPane.setGlassPane(glassPane); + glassPane.setVisible(true); + glassPane.setOpaque(false); + glassPane.setLayout(null); + + ImageIcon icon = new ImageIcon(anImage); + + imageLabel = new JLabel(); + imageLabel.setIconTextGap(0); + imageLabel.setIcon(icon); + imageLabel.setSize(icon.getIconWidth(), icon.getIconHeight()); + glassPane.add(imageLabel); + + Rectangle bounds = component.getBounds(); + if (component.getParent() instanceof Component) { + bounds = SwingUtilities.convertRectangle((Container) component.getParent(), bounds, + rootPane.getContentPane()); + } + imageLabel.setLocation(bounds.x, bounds.y + bounds.height - imageLabel.getBounds().height); + + glassPane.revalidate(); + glassPane.repaint(); + + component.transferFocus(); // halts a caret, if necessary + + timer = new Timer(80, this); + timer.setRepeats(true); + timer.start(); + } + + public void actionPerformed(ActionEvent evt) { + Rectangle bounds = imageLabel.getBounds(); + Rectangle target = component.getBounds(); + if (component.getParent() instanceof Component) { + target = SwingUtilities.convertRectangle((Container) component.getParent(), target, + rootPane.getContentPane()); + } + + if (bounds.x + bounds.width > target.x + target.width) { // clean up and end + timer.stop(); + rootPane.setGlassPane(oldGlassPane); + component.requestFocus(); + return; + } + + // else, slide to the right and continue + imageLabel.setLocation(bounds.x + Math.max(bounds.width / 12, 1), bounds.y); + imageLabel.repaint(); + } } /* - * $Log$ - * Revision 1.2 2006/02/18 23:19:05 cgruber - * Update imports and maven dependencies. + * $Log$ Revision 1.2 2006/02/18 23:19:05 cgruber Update imports and maven + * dependencies. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.1.1.1 2000/12/21 15:51:18 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:51:18 mpowers Contributing wotonomy. * - * Revision 1.2 2000/12/20 16:25:45 michael - * Added log to all files. + * Revision 1.2 2000/12/20 16:25:45 michael Added log to all files. * * */ - diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/GIFEncoder.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/GIFEncoder.java index 82fd897..9ff7496 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/GIFEncoder.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/GIFEncoder.java @@ -12,509 +12,445 @@ import java.io.IOException; import java.io.OutputStream; /** - * GIFEncoder is a class which takes an image and saves it to a stream - * using the GIF file format. A GIFEncoder is constructed with either - * an AWT Image (which must be fully loaded) or a set of RGB arrays. - * The image can be written out with a call to <CODE>write</CODE>.<br><br> + * GIFEncoder is a class which takes an image and saves it to a stream using the + * GIF file format. A GIFEncoder is constructed with either an AWT Image (which + * must be fully loaded) or a set of RGB arrays. The image can be written out + * with a call to <CODE>write</CODE>.<br> + * <br> * * Three caveats: * <UL> - * <LI>GIFEncoder will convert the image to indexed color upon - * construction, and this is not fast. + * <LI>GIFEncoder will convert the image to indexed color upon construction, and + * this is not fast. * - * <LI>The image cannot have more than 256 colors, since GIF is an 8 - * bit format. + * <LI>The image cannot have more than 256 colors, since GIF is an 8 bit format. * - * <LI>Since the image must be completely loaded into memory, - * there may be problems with large images. + * <LI>Since the image must be completely loaded into memory, there may be + * problems with large images. * </UL> * - * This implementation is heavily based on code made available by - * Adam Doppelt, which was based upon gifsave.c, which was written - * and released by Sverre H. Huseby. + * This implementation is heavily based on code made available by Adam Doppelt, + * which was based upon gifsave.c, which was written and released by Sverre H. + * Huseby. * * @author amd@brown.edu * @author sverrehu@ifi.uio.no * @author michael@mpowers.net */ -public class GIFEncoder -{ - short width_, height_; - int numColors_; - byte pixels_[], colors_[]; - - ScreenDescriptor sd_; - ImageDescriptor id_; - -/** - * Construct a GIFEncoder. The constructor will convert the image to - * an indexed color array. This may take some time. If more than 256 - * colors are encountered, all subsequent colors are mapped to the first - * color encountered. - * @param image The image to encode. The image must be completely loaded. - * @exception AWTException Will be thrown if the pixel grab fails. This - * can happen if Java runs out of memory. - * */ - public GIFEncoder(Image image) throws AWTException - { - width_ = (short)image.getWidth(null); - height_ = (short)image.getHeight(null); - - int values[] = new int[width_ * height_]; - PixelGrabber grabber = new PixelGrabber( - image, 0, 0, width_, height_, values, 0, width_); - - try - { - if(grabber.grabPixels() != true) - throw new AWTException("Grabber returned false: " + - grabber.status()); - } - catch (InterruptedException e) - { - } - - byte r[][] = new byte[width_][height_]; - byte g[][] = new byte[width_][height_]; - byte b[][] = new byte[width_][height_]; - int index = 0; - for (int y = 0; y < height_; ++y) - { - for (int x = 0; x < width_; ++x) - { - r[x][y] = (byte)((values[index] >> 16) & 0xFF); - g[x][y] = (byte)((values[index] >> 8) & 0xFF); - b[x][y] = (byte)((values[index]) & 0xFF); - ++index; - } - } - toIndexedColor(r, g, b); - } - -/** - * Construct a GIFEncoder. The constructor will convert the image to - * an indexed color array. This may take some time. <br><br> - * Each array stores intensity values for the image. In other words, - * r[x][y] refers to the red intensity of the pixel at column x, row y. - * @param r An array containing the red intensity values. - * @param g An array containing the green intensity values. - * @param b An array containing the blue intensity values. - * - * @exception AWTException Will be thrown if the image contains more than - * 256 colors. - * */ - public GIFEncoder(byte r[][], byte g[][], byte b[][]) throws AWTException - { - width_ = (short)(r.length); - height_ = (short)(r[0].length); - - toIndexedColor(r, g, b); - } - -/** - * Writes the image out to a stream in the GIF file format. This will - * be a single GIF87a image, non-interlaced, with no background color. - * <B>This may take some time.</B><P> - * - * @param output The stream to output to. This should probably be a - * buffered stream. - * - * @exception IOException Will be thrown if a write operation fails. - * */ - public void write(OutputStream output) throws IOException - { - BitUtils.writeString(output, "GIF87a"); - ScreenDescriptor sd = new ScreenDescriptor(width_, height_, - numColors_); - sd.write(output); - - output.write(colors_, 0, colors_.length); - - ImageDescriptor id = new ImageDescriptor(width_, height_, ','); - id.write(output); - - byte codesize = BitUtils.bitsNeeded(numColors_); - if (codesize == 1) - ++codesize; - output.write(codesize); - - LZWCompressor.LZWCompress(output, codesize, pixels_); - output.write(0); - id = new ImageDescriptor((byte)0, (byte)0, ';'); - id.write(output); - output.flush(); - } - - void toIndexedColor(byte r[][], byte g[][], - byte b[][]) throws AWTException - { - pixels_ = new byte[width_ * height_]; - colors_ = new byte[256 * 3]; - int colornum = 0; - for (int x = 0; x < width_; ++x) - { - for (int y = 0; y < height_; ++y) - { - int search; - for (search = 0; search < colornum; ++search) - if (colors_[search * 3] == r[x][y] && - colors_[search * 3 + 1] == g[x][y] && - colors_[search * 3 + 2] == b[x][y]) - break; - - if (search > 255) - search = 0; - //throw new AWTException("Too many colors."); - - pixels_[y * width_ + x] = (byte)search; - - if (search == colornum) { - colors_[search * 3] = r[x][y]; - colors_[search * 3 + 1] = g[x][y]; - colors_[search * 3 + 2] = b[x][y]; - ++colornum; - } - } - } - - numColors_ = 1 << BitUtils.bitsNeeded(colornum); - byte copy[] = new byte[numColors_ * 3]; - System.arraycopy(colors_, 0, copy, 0, numColors_ * 3); - colors_ = copy; - } +public class GIFEncoder { + short width_, height_; + int numColors_; + byte pixels_[], colors_[]; + + ScreenDescriptor sd_; + ImageDescriptor id_; + + /** + * Construct a GIFEncoder. The constructor will convert the image to an indexed + * color array. This may take some time. If more than 256 colors are + * encountered, all subsequent colors are mapped to the first color encountered. + * + * @param image The image to encode. The image must be completely loaded. + * @exception AWTException Will be thrown if the pixel grab fails. This can + * happen if Java runs out of memory. + */ + public GIFEncoder(Image image) throws AWTException { + width_ = (short) image.getWidth(null); + height_ = (short) image.getHeight(null); + + int values[] = new int[width_ * height_]; + PixelGrabber grabber = new PixelGrabber(image, 0, 0, width_, height_, values, 0, width_); + + try { + if (grabber.grabPixels() != true) + throw new AWTException("Grabber returned false: " + grabber.status()); + } catch (InterruptedException e) { + } + + byte r[][] = new byte[width_][height_]; + byte g[][] = new byte[width_][height_]; + byte b[][] = new byte[width_][height_]; + int index = 0; + for (int y = 0; y < height_; ++y) { + for (int x = 0; x < width_; ++x) { + r[x][y] = (byte) ((values[index] >> 16) & 0xFF); + g[x][y] = (byte) ((values[index] >> 8) & 0xFF); + b[x][y] = (byte) ((values[index]) & 0xFF); + ++index; + } + } + toIndexedColor(r, g, b); + } + + /** + * Construct a GIFEncoder. The constructor will convert the image to an indexed + * color array. This may take some time. <br> + * <br> + * Each array stores intensity values for the image. In other words, r[x][y] + * refers to the red intensity of the pixel at column x, row y. + * + * @param r An array containing the red intensity values. + * @param g An array containing the green intensity values. + * @param b An array containing the blue intensity values. + * + * @exception AWTException Will be thrown if the image contains more than 256 + * colors. + */ + public GIFEncoder(byte r[][], byte g[][], byte b[][]) throws AWTException { + width_ = (short) (r.length); + height_ = (short) (r[0].length); + + toIndexedColor(r, g, b); + } + + /** + * Writes the image out to a stream in the GIF file format. This will be a + * single GIF87a image, non-interlaced, with no background color. <B>This may + * take some time.</B> + * <P> + * + * @param output The stream to output to. This should probably be a buffered + * stream. + * + * @exception IOException Will be thrown if a write operation fails. + */ + public void write(OutputStream output) throws IOException { + BitUtils.writeString(output, "GIF87a"); + ScreenDescriptor sd = new ScreenDescriptor(width_, height_, numColors_); + sd.write(output); + + output.write(colors_, 0, colors_.length); + + ImageDescriptor id = new ImageDescriptor(width_, height_, ','); + id.write(output); + + byte codesize = BitUtils.bitsNeeded(numColors_); + if (codesize == 1) + ++codesize; + output.write(codesize); + + LZWCompressor.LZWCompress(output, codesize, pixels_); + output.write(0); + id = new ImageDescriptor((byte) 0, (byte) 0, ';'); + id.write(output); + output.flush(); + } + + void toIndexedColor(byte r[][], byte g[][], byte b[][]) throws AWTException { + pixels_ = new byte[width_ * height_]; + colors_ = new byte[256 * 3]; + int colornum = 0; + for (int x = 0; x < width_; ++x) { + for (int y = 0; y < height_; ++y) { + int search; + for (search = 0; search < colornum; ++search) + if (colors_[search * 3] == r[x][y] && colors_[search * 3 + 1] == g[x][y] + && colors_[search * 3 + 2] == b[x][y]) + break; + + if (search > 255) + search = 0; + // throw new AWTException("Too many colors."); + + pixels_[y * width_ + x] = (byte) search; + + if (search == colornum) { + colors_[search * 3] = r[x][y]; + colors_[search * 3 + 1] = g[x][y]; + colors_[search * 3 + 2] = b[x][y]; + ++colornum; + } + } + } + + numColors_ = 1 << BitUtils.bitsNeeded(colornum); + byte copy[] = new byte[numColors_ * 3]; + System.arraycopy(colors_, 0, copy, 0, numColors_ * 3); + colors_ = copy; + } } -class BitFile -{ - OutputStream output_; - byte buffer_[]; - int index_, bitsLeft_; - - public BitFile(OutputStream output) - { - output_ = output; - buffer_ = new byte[256]; - index_ = 0; - bitsLeft_ = 8; - } - - public void flush() throws IOException - { - int numBytes = index_ + (bitsLeft_ == 8 ? 0 : 1); - if (numBytes > 0) - { - output_.write(numBytes); - output_.write(buffer_, 0, numBytes); - buffer_[0] = 0; - index_ = 0; - bitsLeft_ = 8; - } - } - - public void writeBits(int bits, int numbits) throws IOException { - int bitsWritten = 0; - int numBytes = 255; - do - { - if ((index_ == 254 && bitsLeft_ == 0) || index_ > 254) - { - output_.write(numBytes); - output_.write(buffer_, 0, numBytes); - - buffer_[0] = 0; - index_ = 0; - bitsLeft_ = 8; - } - - if (numbits <= bitsLeft_) - { - buffer_[index_] |= (bits & ((1 << numbits) - 1)) << - (8 - bitsLeft_); - bitsWritten += numbits; - bitsLeft_ -= numbits; - numbits = 0; - } - else - { - buffer_[index_] |= (bits & ((1 << bitsLeft_) - 1)) << - (8 - bitsLeft_); - bitsWritten += bitsLeft_; - bits >>= bitsLeft_; - numbits -= bitsLeft_; - buffer_[++index_] = 0; - bitsLeft_ = 8; - } - - } - while (numbits != 0); - } +class BitFile { + OutputStream output_; + byte buffer_[]; + int index_, bitsLeft_; + + public BitFile(OutputStream output) { + output_ = output; + buffer_ = new byte[256]; + index_ = 0; + bitsLeft_ = 8; + } + + public void flush() throws IOException { + int numBytes = index_ + (bitsLeft_ == 8 ? 0 : 1); + if (numBytes > 0) { + output_.write(numBytes); + output_.write(buffer_, 0, numBytes); + buffer_[0] = 0; + index_ = 0; + bitsLeft_ = 8; + } + } + + public void writeBits(int bits, int numbits) throws IOException { + int bitsWritten = 0; + int numBytes = 255; + do { + if ((index_ == 254 && bitsLeft_ == 0) || index_ > 254) { + output_.write(numBytes); + output_.write(buffer_, 0, numBytes); + + buffer_[0] = 0; + index_ = 0; + bitsLeft_ = 8; + } + + if (numbits <= bitsLeft_) { + buffer_[index_] |= (bits & ((1 << numbits) - 1)) << (8 - bitsLeft_); + bitsWritten += numbits; + bitsLeft_ -= numbits; + numbits = 0; + } else { + buffer_[index_] |= (bits & ((1 << bitsLeft_) - 1)) << (8 - bitsLeft_); + bitsWritten += bitsLeft_; + bits >>= bitsLeft_; + numbits -= bitsLeft_; + buffer_[++index_] = 0; + bitsLeft_ = 8; + } + + } while (numbits != 0); + } } -class LZWStringTable -{ - private final static int RES_CODES = 2; - private final static short HASH_FREE = (short)0xFFFF; - private final static short NEXT_FIRST = (short)0xFFFF; - private final static int MAXBITS = 12; - private final static int MAXSTR = (1 << MAXBITS); - private final static short HASHSIZE = 9973; - private final static short HASHSTEP = 2039; - - byte strChr_[]; - short strNxt_[]; - short strHsh_[]; - short numStrings_; - - public LZWStringTable() - { - strChr_ = new byte[MAXSTR]; - strNxt_ = new short[MAXSTR]; - strHsh_ = new short[HASHSIZE]; - } - - public int addCharString(short index, byte b) - { - int hshidx; - - if (numStrings_ >= MAXSTR) - return 0xFFFF; - - hshidx = Hash(index, b); - while (strHsh_[hshidx] != HASH_FREE) - hshidx = (hshidx + HASHSTEP) % HASHSIZE; - - strHsh_[hshidx] = numStrings_; - strChr_[numStrings_] = b; - strNxt_[numStrings_] = (index != HASH_FREE) ? index : NEXT_FIRST; - - return numStrings_++; - } - - public short findCharString(short index, byte b) - { - int hshidx, nxtidx; - - if (index == HASH_FREE) - return b; - - hshidx = Hash(index, b); - while ((nxtidx = strHsh_[hshidx]) != HASH_FREE) - { - if (strNxt_[nxtidx] == index && strChr_[nxtidx] == b) - return (short)nxtidx; - hshidx = (hshidx + HASHSTEP) % HASHSIZE; - } - - return (short)0xFFFF; - } - - public void clearTable(int codesize) - { - numStrings_ = 0; - - for (int q = 0; q < HASHSIZE; q++) - { - strHsh_[q] = HASH_FREE; - } - - int w = (1 << codesize) + RES_CODES; - for (int q = 0; q < w; q++) - { - addCharString((short)0xFFFF, (byte)q); - } - } - - static public int Hash(short index, byte lastbyte) - { - return ((int)((short)(lastbyte << 8) ^ index) & 0xFFFF) % HASHSIZE; - } +class LZWStringTable { + private final static int RES_CODES = 2; + private final static short HASH_FREE = (short) 0xFFFF; + private final static short NEXT_FIRST = (short) 0xFFFF; + private final static int MAXBITS = 12; + private final static int MAXSTR = (1 << MAXBITS); + private final static short HASHSIZE = 9973; + private final static short HASHSTEP = 2039; + + byte strChr_[]; + short strNxt_[]; + short strHsh_[]; + short numStrings_; + + public LZWStringTable() { + strChr_ = new byte[MAXSTR]; + strNxt_ = new short[MAXSTR]; + strHsh_ = new short[HASHSIZE]; + } + + public int addCharString(short index, byte b) { + int hshidx; + + if (numStrings_ >= MAXSTR) + return 0xFFFF; + + hshidx = Hash(index, b); + while (strHsh_[hshidx] != HASH_FREE) + hshidx = (hshidx + HASHSTEP) % HASHSIZE; + + strHsh_[hshidx] = numStrings_; + strChr_[numStrings_] = b; + strNxt_[numStrings_] = (index != HASH_FREE) ? index : NEXT_FIRST; + + return numStrings_++; + } + + public short findCharString(short index, byte b) { + int hshidx, nxtidx; + + if (index == HASH_FREE) + return b; + + hshidx = Hash(index, b); + while ((nxtidx = strHsh_[hshidx]) != HASH_FREE) { + if (strNxt_[nxtidx] == index && strChr_[nxtidx] == b) + return (short) nxtidx; + hshidx = (hshidx + HASHSTEP) % HASHSIZE; + } + + return (short) 0xFFFF; + } + + public void clearTable(int codesize) { + numStrings_ = 0; + + for (int q = 0; q < HASHSIZE; q++) { + strHsh_[q] = HASH_FREE; + } + + int w = (1 << codesize) + RES_CODES; + for (int q = 0; q < w; q++) { + addCharString((short) 0xFFFF, (byte) q); + } + } + + static public int Hash(short index, byte lastbyte) { + return ((int) ((short) (lastbyte << 8) ^ index) & 0xFFFF) % HASHSIZE; + } } class LZWCompressor { - public static void LZWCompress(OutputStream output, int codesize, - byte toCompress[]) throws IOException - { - byte c; - short index; - int clearcode, endofinfo, numbits, limit, errcode; - short prefix = (short)0xFFFF; - - BitFile bitFile = new BitFile(output); - LZWStringTable strings = new LZWStringTable(); - - clearcode = 1 << codesize; - endofinfo = clearcode + 1; - - numbits = codesize + 1; - limit = (1 << numbits) - 1; - strings.clearTable(codesize); - bitFile.writeBits(clearcode, numbits); - - for (int loop = 0; loop < toCompress.length; ++loop) - { - c = toCompress[loop]; - if ((index = strings.findCharString(prefix, c)) != -1) - { - prefix = index; - } - else - { - bitFile.writeBits(prefix, numbits); - if (strings.addCharString(prefix, c) > limit) { - if (++numbits > 12) { - bitFile.writeBits(clearcode, numbits - 1); - strings.clearTable(codesize); - numbits = codesize + 1; - } - limit = (1 << numbits) - 1; - } - - prefix = (short)((short)c & 0xFF); - } - } - - if (prefix != -1) - bitFile.writeBits(prefix, numbits); - - bitFile.writeBits(endofinfo, numbits); - bitFile.flush(); - } + public static void LZWCompress(OutputStream output, int codesize, byte toCompress[]) throws IOException { + byte c; + short index; + int clearcode, endofinfo, numbits, limit, errcode; + short prefix = (short) 0xFFFF; + + BitFile bitFile = new BitFile(output); + LZWStringTable strings = new LZWStringTable(); + + clearcode = 1 << codesize; + endofinfo = clearcode + 1; + + numbits = codesize + 1; + limit = (1 << numbits) - 1; + strings.clearTable(codesize); + bitFile.writeBits(clearcode, numbits); + + for (int loop = 0; loop < toCompress.length; ++loop) { + c = toCompress[loop]; + if ((index = strings.findCharString(prefix, c)) != -1) { + prefix = index; + } else { + bitFile.writeBits(prefix, numbits); + if (strings.addCharString(prefix, c) > limit) { + if (++numbits > 12) { + bitFile.writeBits(clearcode, numbits - 1); + strings.clearTable(codesize); + numbits = codesize + 1; + } + limit = (1 << numbits) - 1; + } + + prefix = (short) ((short) c & 0xFF); + } + } + + if (prefix != -1) + bitFile.writeBits(prefix, numbits); + + bitFile.writeBits(endofinfo, numbits); + bitFile.flush(); + } } -class ScreenDescriptor -{ - public short localScreenWidth_, localScreenHeight_; - private byte byte_; - public byte backgroundColorIndex_, pixelAspectRatio_; - - public ScreenDescriptor(short width, short height, int numColors) - { - localScreenWidth_ = width; - localScreenHeight_ = height; - setGlobalColorTableSize((byte)(BitUtils.bitsNeeded(numColors) - 1)); - setGlobalColorTableFlag((byte)1); - setSortFlag((byte)0); - setColorResolution((byte)7); - backgroundColorIndex_ = 0; - pixelAspectRatio_ = 0; - } - - public void write(OutputStream output) throws IOException - { - BitUtils.writeWord(output, localScreenWidth_); - BitUtils.writeWord(output, localScreenHeight_); - output.write(byte_); - output.write(backgroundColorIndex_); - output.write(pixelAspectRatio_); - } - - public void setGlobalColorTableSize(byte num) - { - byte_ |= (num & 7); - } - - public void setSortFlag(byte num) - { - byte_ |= (num & 1) << 3; - } - - public void setColorResolution(byte num) - { - byte_ |= (num & 7) << 4; - } - - public void setGlobalColorTableFlag(byte num) - { - byte_ |= (num & 1) << 7; - } +class ScreenDescriptor { + public short localScreenWidth_, localScreenHeight_; + private byte byte_; + public byte backgroundColorIndex_, pixelAspectRatio_; + + public ScreenDescriptor(short width, short height, int numColors) { + localScreenWidth_ = width; + localScreenHeight_ = height; + setGlobalColorTableSize((byte) (BitUtils.bitsNeeded(numColors) - 1)); + setGlobalColorTableFlag((byte) 1); + setSortFlag((byte) 0); + setColorResolution((byte) 7); + backgroundColorIndex_ = 0; + pixelAspectRatio_ = 0; + } + + public void write(OutputStream output) throws IOException { + BitUtils.writeWord(output, localScreenWidth_); + BitUtils.writeWord(output, localScreenHeight_); + output.write(byte_); + output.write(backgroundColorIndex_); + output.write(pixelAspectRatio_); + } + + public void setGlobalColorTableSize(byte num) { + byte_ |= (num & 7); + } + + public void setSortFlag(byte num) { + byte_ |= (num & 1) << 3; + } + + public void setColorResolution(byte num) { + byte_ |= (num & 7) << 4; + } + + public void setGlobalColorTableFlag(byte num) { + byte_ |= (num & 1) << 7; + } } -class ImageDescriptor -{ - public byte separator_; - public short leftPosition_, topPosition_, width_, height_; - private byte byte_; - - public ImageDescriptor(short width, short height, char separator) - { - separator_ = (byte)separator; - leftPosition_ = 0; - topPosition_ = 0; - width_ = width; - height_ = height; - setLocalColorTableSize((byte)0); - setReserved((byte)0); - setSortFlag((byte)0); - setInterlaceFlag((byte)0); - setLocalColorTableFlag((byte)0); - } - - public void write(OutputStream output) throws IOException - { - output.write(separator_); - BitUtils.writeWord(output, leftPosition_); - BitUtils.writeWord(output, topPosition_); - BitUtils.writeWord(output, width_); - BitUtils.writeWord(output, height_); - output.write(byte_); - } - - public void setLocalColorTableSize(byte num) - { - byte_ |= (num & 7); - } - - public void setReserved(byte num) - { - byte_ |= (num & 3) << 3; - } - - public void setSortFlag(byte num) - { - byte_ |= (num & 1) << 5; - } - - public void setInterlaceFlag(byte num) - { - byte_ |= (num & 1) << 6; - } - - public void setLocalColorTableFlag(byte num) - { - byte_ |= (num & 1) << 7; - } +class ImageDescriptor { + public byte separator_; + public short leftPosition_, topPosition_, width_, height_; + private byte byte_; + + public ImageDescriptor(short width, short height, char separator) { + separator_ = (byte) separator; + leftPosition_ = 0; + topPosition_ = 0; + width_ = width; + height_ = height; + setLocalColorTableSize((byte) 0); + setReserved((byte) 0); + setSortFlag((byte) 0); + setInterlaceFlag((byte) 0); + setLocalColorTableFlag((byte) 0); + } + + public void write(OutputStream output) throws IOException { + output.write(separator_); + BitUtils.writeWord(output, leftPosition_); + BitUtils.writeWord(output, topPosition_); + BitUtils.writeWord(output, width_); + BitUtils.writeWord(output, height_); + output.write(byte_); + } + + public void setLocalColorTableSize(byte num) { + byte_ |= (num & 7); + } + + public void setReserved(byte num) { + byte_ |= (num & 3) << 3; + } + + public void setSortFlag(byte num) { + byte_ |= (num & 1) << 5; + } + + public void setInterlaceFlag(byte num) { + byte_ |= (num & 1) << 6; + } + + public void setLocalColorTableFlag(byte num) { + byte_ |= (num & 1) << 7; + } } -class BitUtils -{ - public static byte bitsNeeded(int n) - { - byte ret = 1; - - if (n-- == 0) - return 0; - - while ((n >>= 1) != 0) - ++ret; - - return ret; - } - - public static void writeWord(OutputStream output, - short w) throws IOException - { - output.write(w & 0xFF); - output.write((w >> 8) & 0xFF); - } - - static void writeString(OutputStream output, - String string) throws IOException - { - for (int loop = 0; loop < string.length(); ++loop) - output.write((byte)(string.charAt(loop))); - } -} +class BitUtils { + public static byte bitsNeeded(int n) { + byte ret = 1; + if (n-- == 0) + return 0; + while ((n >>= 1) != 0) + ++ret; + + return ret; + } + + public static void writeWord(OutputStream output, short w) throws IOException { + output.write(w & 0xFF); + output.write((w >> 8) & 0xFF); + } + + static void writeString(OutputStream output, String string) throws IOException { + for (int loop = 0; loop < string.length(); ++loop) + output.write((byte) (string.charAt(loop))); + } +} diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ObjectInspector.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ObjectInspector.java index 6c8d7ee..ad94ddd 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ObjectInspector.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/ObjectInspector.java @@ -44,183 +44,165 @@ import net.wotonomy.ui.swing.components.PropertyEditorTable; import net.wotonomy.ui.swing.components.PropertyEditorTableModel; /** -* The ObjectInspector displays a JFrame containing -* a PropertyEditorTable that displays an object. <br><br> -* -* @author michael@mpowers.net -* @author $Author: cgruber $ -* @version $Revision: 904 $ -*/ + * The ObjectInspector displays a JFrame containing a PropertyEditorTable that + * displays an object. <br> + * <br> + * + * @author michael@mpowers.net + * @author $Author: cgruber $ + * @version $Revision: 904 $ + */ -public class ObjectInspector implements ActionListener, MouseListener -{ - protected JTable table = null; +public class ObjectInspector implements ActionListener, MouseListener { + protected JTable table = null; - // key command to copy contents to clipboard - static public final String COPY = "COPY"; + // key command to copy contents to clipboard + static public final String COPY = "COPY"; /** - * Displays the specified object in a frame. - */ - public ObjectInspector( Object anObject ) - { - initLayout( anObject ); - } - - protected void initLayout( Object aTargetObject ) - { - PropertyEditorTableModel model = - new PropertyEditorTableModel(); - model.setObject( aTargetObject ); - table = new PropertyEditorTable() - { - public void methodInvoked( Object anObject, Method aMethod, Object aResult ) - { - if - ( ( aResult == null ) - || ( aResult instanceof Number ) - || ( aResult instanceof Boolean ) - || ( aResult instanceof String ) ) - { - System.out.println( aMethod.getName() + ": " + aResult ); - } - else - { - new ObjectInspector( aResult ); + * Displays the specified object in a frame. + */ + public ObjectInspector(Object anObject) { + initLayout(anObject); + } + + protected void initLayout(Object aTargetObject) { + PropertyEditorTableModel model = new PropertyEditorTableModel(); + model.setObject(aTargetObject); + table = new PropertyEditorTable() { + public void methodInvoked(Object anObject, Method aMethod, Object aResult) { + if ((aResult == null) || (aResult instanceof Number) || (aResult instanceof Boolean) + || (aResult instanceof String)) { + System.out.println(aMethod.getName() + ": " + aResult); + } else { + new ObjectInspector(aResult); } } }; - table.setModel( model ); - table.addMouseListener( this ); // listen for double-clicks - - // set up keyboard events for cut-copy: Ctrl-C, Ctrl-X - table.registerKeyboardAction( this, COPY, - KeyStroke.getKeyStroke( KeyEvent.VK_C, - Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ), - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); - table.registerKeyboardAction( this, COPY, - KeyStroke.getKeyStroke( KeyEvent.VK_X, - Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ), - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); - - JPanel panel = new JPanel(); - panel.setBorder( new EmptyBorder( new Insets( 10, 10, 10, 10 ) ) ); - panel.setLayout( new BorderLayout( 10, 10 ) ); - - JScrollPane scrollPane = new JScrollPane( table ); - scrollPane.setPreferredSize( new Dimension( 325, 350 ) ); - panel.add( scrollPane, BorderLayout.CENTER ); - - JFrame window = new JFrame(); - window.setTitle( aTargetObject.getClass().getName() ); - window.getContentPane().add( panel ); - - window.pack(); - WindowUtilities.cascade( window ); - window.show(); - } - - // interface MouseListener - - /** - * Double click to call invokeFileFromString. - */ - - public void mouseClicked(MouseEvent e) - { - if ( e.getSource() == table ) - { - if ( e.getClickCount() > 1 ) - { - int row = table.rowAtPoint( e.getPoint() ); - int col = table.columnAtPoint( e.getPoint() ); - - if ( ( row == -1 ) || ( col != 0 ) ) return; - - /* do something here */ - } - } - } - - public void mouseReleased(MouseEvent e) {} - public void mousePressed(MouseEvent e) {} - public void mouseEntered(MouseEvent e) {} - public void mouseExited(MouseEvent e) {} - - - // interface ActionEventListener - for listening to key commands - - public void actionPerformed(ActionEvent evt) - { - if ( COPY.equals( evt.getActionCommand() ) ) - { - copyToClipboard(); - return; - } - } + table.setModel(model); + table.addMouseListener(this); // listen for double-clicks + + // set up keyboard events for cut-copy: Ctrl-C, Ctrl-X + table.registerKeyboardAction(this, COPY, + KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + table.registerKeyboardAction(this, COPY, + KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + + JPanel panel = new JPanel(); + panel.setBorder(new EmptyBorder(new Insets(10, 10, 10, 10))); + panel.setLayout(new BorderLayout(10, 10)); + + JScrollPane scrollPane = new JScrollPane(table); + scrollPane.setPreferredSize(new Dimension(325, 350)); + panel.add(scrollPane, BorderLayout.CENTER); + + JFrame window = new JFrame(); + window.setTitle(aTargetObject.getClass().getName()); + window.getContentPane().add(panel); + + window.pack(); + WindowUtilities.cascade(window); + window.show(); + } + + // interface MouseListener -/** -* Copies the contents of the table to the clipboard as a tab-delimited string. -*/ - public void copyToClipboard() - { - Toolkit toolkit = Toolkit.getDefaultToolkit(); - Clipboard clipboard = toolkit.getSystemClipboard(); - StringSelection selection = - new StringSelection( getTabDelimitedString() ); - clipboard.setContents( selection, selection ); - } - /** - * Converts the contents of the table to a tab-delimited string. - * @return A String containing the text contents of the table. - */ - public String getTabDelimitedString() - { - StringBuffer result = new StringBuffer(64); - - TableModel model = table.getModel(); - int cols = model.getColumnCount(); - int rows = model.getRowCount(); - - Object o = null; - for ( int y = 0; y < rows; y++ ) - { - for ( int x = 0; x < cols; x++ ) - { - o = model.getValueAt( y, x ); - if ( o == null ) o = ""; - result.append( o ); - result.append( '\t' ); - } - result.append( '\n' ); - } - - return result.toString(); - } + * Double click to call invokeFileFromString. + */ + + public void mouseClicked(MouseEvent e) { + if (e.getSource() == table) { + if (e.getClickCount() > 1) { + int row = table.rowAtPoint(e.getPoint()); + int col = table.columnAtPoint(e.getPoint()); + + if ((row == -1) || (col != 0)) + return; + + /* do something here */ + } + } + } + + public void mouseReleased(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + // interface ActionEventListener - for listening to key commands + + public void actionPerformed(ActionEvent evt) { + if (COPY.equals(evt.getActionCommand())) { + copyToClipboard(); + return; + } + } + + /** + * Copies the contents of the table to the clipboard as a tab-delimited string. + */ + public void copyToClipboard() { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + Clipboard clipboard = toolkit.getSystemClipboard(); + StringSelection selection = new StringSelection(getTabDelimitedString()); + clipboard.setContents(selection, selection); + } + + /** + * Converts the contents of the table to a tab-delimited string. + * + * @return A String containing the text contents of the table. + */ + public String getTabDelimitedString() { + StringBuffer result = new StringBuffer(64); + + TableModel model = table.getModel(); + int cols = model.getColumnCount(); + int rows = model.getRowCount(); + + Object o = null; + for (int y = 0; y < rows; y++) { + for (int x = 0; x < cols; x++) { + o = model.getValueAt(y, x); + if (o == null) + o = ""; + result.append(o); + result.append('\t'); + } + result.append('\n'); + } + + return result.toString(); + } } /* - * $Log$ - * Revision 1.2 2006/02/18 23:19:05 cgruber - * Update imports and maven dependencies. + * $Log$ Revision 1.2 2006/02/18 23:19:05 cgruber Update imports and maven + * dependencies. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.3 2003/08/06 23:07:53 chochos - * general code cleanup (mostly, removing unused imports) + * Revision 1.3 2003/08/06 23:07:53 chochos general code cleanup (mostly, + * removing unused imports) * - * Revision 1.2 2002/11/16 16:33:31 mpowers - * Now using platform-specific accelerator key for shortcuts. + * Revision 1.2 2002/11/16 16:33:31 mpowers Now using platform-specific + * accelerator key for shortcuts. * - * Revision 1.1.1.1 2000/12/21 15:51:27 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:51:27 mpowers Contributing wotonomy. * - * Revision 1.3 2000/12/20 16:25:45 michael - * Added log to all files. + * Revision 1.3 2000/12/20 16:25:45 michael Added log to all files. * * */ - diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/PositionComparator.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/PositionComparator.java index f5fe3e4..7f2adb8 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/PositionComparator.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/PositionComparator.java @@ -27,63 +27,55 @@ import java.util.Comparator; import javax.swing.SwingUtilities; /** -* A Comparator that will sort components in a common container -* based first on their y-coordinate and then on their x-coordinate, -* producing a list sorted from top to bottom and left to right. -* If all components are not in the same container, the resulting -* sort is undefined. -* -* @author michael@mpowers.net -* @author $Author: cgruber $ -* @version $Revision: 904 $ -*/ -public class PositionComparator implements Comparator, Serializable -{ - private Container rootContainer; - private transient Component c1, c2; - private transient Point p1, p2; + * A Comparator that will sort components in a common container based first on + * their y-coordinate and then on their x-coordinate, producing a list sorted + * from top to bottom and left to right. If all components are not in the same + * container, the resulting sort is undefined. + * + * @author michael@mpowers.net + * @author $Author: cgruber $ + * @version $Revision: 904 $ + */ +public class PositionComparator implements Comparator, Serializable { + private Container rootContainer; + private transient Component c1, c2; + private transient Point p1, p2; -/** -* Standard constructor to configure the comparator. -* @param aContainer The common container for all the objects to be compared. -*/ - public PositionComparator( Container aContainer ) - { - rootContainer = aContainer; - } + /** + * Standard constructor to configure the comparator. + * + * @param aContainer The common container for all the objects to be compared. + */ + public PositionComparator(Container aContainer) { + rootContainer = aContainer; + } - // interface Comparable + // interface Comparable - public int compare(Object o1, Object o2) - { - c1 = (Component) o1; - c2 = (Component) o2; + public int compare(Object o1, Object o2) { + c1 = (Component) o1; + c2 = (Component) o2; - p1 = SwingUtilities.convertPoint( c1.getParent(), c1.getLocation(), rootContainer ); - p2 = SwingUtilities.convertPoint( c2.getParent(), c2.getLocation(), rootContainer ); + p1 = SwingUtilities.convertPoint(c1.getParent(), c1.getLocation(), rootContainer); + p2 = SwingUtilities.convertPoint(c2.getParent(), c2.getLocation(), rootContainer); - if ( p1.y != p2.y ) - { - return p1.y - p2.y; - } - return p1.x - p2.x; - } + if (p1.y != p2.y) { + return p1.y - p2.y; + } + return p1.x - p2.x; + } } /* - * $Log$ - * Revision 1.2 2006/02/18 23:19:05 cgruber - * Update imports and maven dependencies. + * $Log$ Revision 1.2 2006/02/18 23:19:05 cgruber Update imports and maven + * dependencies. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.1.1.1 2000/12/21 15:51:27 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:51:27 mpowers Contributing wotonomy. * - * Revision 1.2 2000/12/20 16:25:45 michael - * Added log to all files. + * Revision 1.2 2000/12/20 16:25:45 michael Added log to all files. * * */ - diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/StackTraceInspector.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/StackTraceInspector.java index 7e61411..ae4bb2d 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/StackTraceInspector.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/StackTraceInspector.java @@ -50,408 +50,364 @@ import javax.swing.table.TableModel; import net.wotonomy.ui.swing.components.MultiLineLabel; /** -* The StackTraceInspector displays a JFrame containing -* stack trace information for a Throwable. <br><br> -* -* There are also a few static methods for obtaining -* information about the current stack, which is useful -* for determining who's calling you at runtime. -* -* @author michael@mpowers.net -* @version $Revision: 904 $ -*/ + * The StackTraceInspector displays a JFrame containing stack trace information + * for a Throwable. <br> + * <br> + * + * There are also a few static methods for obtaining information about the + * current stack, which is useful for determining who's calling you at runtime. + * + * @author michael@mpowers.net + * @version $Revision: 904 $ + */ -public class StackTraceInspector - implements TableModel, MouseListener, ActionListener -{ - protected JTable table = null; - protected List tableModelListeners = null; - protected List methodNames = new ArrayList(); +public class StackTraceInspector implements TableModel, MouseListener, ActionListener { + protected JTable table = null; + protected List tableModelListeners = null; + protected List methodNames = new ArrayList(); + + // key command to copy contents to clipboard + static public final String COPY = "COPY"; + + /** + * Displays the current stack trace at the time of instantiation in a table on a + * frame. + */ + public StackTraceInspector() { + initLayout(parseStackTrace(new RuntimeException()), null); + } + + /** + * Displays the current stack trace at the time of instantiation in a table on a + * frame annotated with the specified message. + */ + public StackTraceInspector(String aMessage) { + initLayout(parseStackTrace(new RuntimeException()), aMessage); + } + + /** + * Displays the stack trace for the given throwable in a table on a frame. + * + * @param aThrowable A Throwable whose stack will be examined. + */ + public StackTraceInspector(Throwable aThrowable) { + initLayout(parseStackTrace(aThrowable), aThrowable.getClass() + ": " + aThrowable.getMessage()); + } + + /** + * Simply displays the list items in a dialog. Presumably (but not necessarily) + * called from the other constructors. (I guess if you just want a frame with + * strings in table, you can call this.) + * + * @param aStringList A List containing Strings. + */ + public StackTraceInspector(List aStringList) { + initLayout(aStringList, null); + } + + protected void initLayout(List items, String message) { + methodNames = new ArrayList(items); + table = new JTable(this); // this class is the table model + table.addMouseListener(this); // listen for double-clicks + + // set up keyboard events for cut-copy: Ctrl-C, Ctrl-X + table.registerKeyboardAction(this, COPY, + KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + table.registerKeyboardAction(this, COPY, + KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + + JPanel panel = new JPanel(); + panel.setBorder(new EmptyBorder(new Insets(10, 10, 10, 10))); + panel.setLayout(new BorderLayout(10, 10)); + + if (message != null) { + panel.add(new MultiLineLabel(message), BorderLayout.NORTH); + } - // key command to copy contents to clipboard - static public final String COPY = "COPY"; + JScrollPane scrollPane = new JScrollPane(table); + scrollPane.setPreferredSize(new Dimension(325, 350)); + panel.add(scrollPane, BorderLayout.CENTER); -/** -* Displays the current stack trace at the time -* of instantiation in a table on a frame. -*/ - public StackTraceInspector() - { - initLayout( parseStackTrace( new RuntimeException() ), null ); - } + JFrame window = new JFrame(); + window.setTitle("Stack Trace Inspector"); + window.getContentPane().add(panel); -/** -* Displays the current stack trace at the time -* of instantiation in a table on a frame -* annotated with the specified message. -*/ - public StackTraceInspector( String aMessage ) - { - initLayout( parseStackTrace( new RuntimeException() ), aMessage ); - } + window.pack(); + WindowUtilities.cascade(window); + window.show(); + } -/** -* Displays the stack trace for the given throwable -* in a table on a frame. -* @param aThrowable A Throwable whose stack will be examined. -*/ - public StackTraceInspector( Throwable aThrowable ) - { - initLayout( parseStackTrace( aThrowable ), - aThrowable.getClass() + ": " + aThrowable.getMessage() ); - } + // interface TableModel -/** -* Simply displays the list items in a dialog. -* Presumably (but not necessarily) called from -* the other constructors. (I guess if you just -* want a frame with strings in table, you can -* call this.) -* @param aStringList A List containing Strings. -*/ - public StackTraceInspector( List aStringList ) - { - initLayout( aStringList, null ); - } - - protected void initLayout( List items, String message ) - { - methodNames = new ArrayList( items ); - table = new JTable( this ); // this class is the table model - table.addMouseListener( this ); // listen for double-clicks - - // set up keyboard events for cut-copy: Ctrl-C, Ctrl-X - table.registerKeyboardAction( this, COPY, - KeyStroke.getKeyStroke( KeyEvent.VK_C, - Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ), - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); - table.registerKeyboardAction( this, COPY, - KeyStroke.getKeyStroke( KeyEvent.VK_X, - Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ), - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); - - JPanel panel = new JPanel(); - panel.setBorder( new EmptyBorder( new Insets( 10, 10, 10, 10 ) ) ); - panel.setLayout( new BorderLayout( 10, 10 ) ); - - if ( message != null ) - { - panel.add( new MultiLineLabel( message ), BorderLayout.NORTH ); + public int getRowCount() { + return methodNames.size(); + } + + public int getColumnCount() { + return 1; + } + + public String getColumnName(int columnIndex) { + switch (columnIndex) { + case 0: + return "Methods"; + case 1: + return "Property"; } + System.out.println("StackTraceInspector.getColumnName: unknown column: " + columnIndex); + return ""; + } + + public Class getColumnClass(int columnIndex) { + switch (columnIndex) { + case 0: + return String.class; + case 1: + return String.class; + } + System.out.println("StackTraceInspector.getColumnClass: unknown column: " + columnIndex); + return Object.class; + } - JScrollPane scrollPane = new JScrollPane( table ); - scrollPane.setPreferredSize( new Dimension( 325, 350 ) ); - panel.add( scrollPane, BorderLayout.CENTER ); - - JFrame window = new JFrame(); - window.setTitle( "Stack Trace Inspector" ); - window.getContentPane().add( panel ); - - window.pack(); - WindowUtilities.cascade( window ); - window.show(); - } - - // interface TableModel - - public int getRowCount() - { - return methodNames.size(); - } - - public int getColumnCount() - { - return 1; - } - - public String getColumnName(int columnIndex) - { - switch ( columnIndex ) - { - case 0: - return "Methods"; - case 1: - return "Property"; - } - System.out.println( "StackTraceInspector.getColumnName: unknown column: " + columnIndex ); - return ""; - } - - public Class getColumnClass(int columnIndex) - { - switch ( columnIndex ) - { - case 0: - return String.class; - case 1: - return String.class; - } - System.out.println( "StackTraceInspector.getColumnClass: unknown column: " + columnIndex ); - return Object.class; - } - - public boolean isCellEditable(int rowIndex, - int columnIndex) - { - return false; - } - - public Object getValueAt(int rowIndex, - int columnIndex) - { - return methodNames.get( rowIndex ); - } - - public void setValueAt(Object aValue, - int rowIndex, - int columnIndex) - { - } - - public void addTableModelListener(TableModelListener l) - { - if ( tableModelListeners == null ) - { - tableModelListeners = new ArrayList(); - } - tableModelListeners.add( l ); - } - - public void removeTableModelListener(TableModelListener l) - { - if ( tableModelListeners != null ) - { - tableModelListeners.remove( l ); - } - } - - // interface MouseListener - - /** - * Double click to call invokeFileFromString. - */ - - public void mouseClicked(MouseEvent e) - { - if ( e.getSource() == table ) - { - if ( e.getClickCount() > 1 ) - { - int row = table.rowAtPoint( e.getPoint() ); - int col = table.columnAtPoint( e.getPoint() ); - - if ( ( row == -1 ) || ( col != 0 ) ) return; - - invokeFileFromString( methodNames.get( row ).toString() ); - } - } - } - - public void mouseReleased(MouseEvent e) {} - public void mousePressed(MouseEvent e) {} - public void mouseEntered(MouseEvent e) {} - public void mouseExited(MouseEvent e) {} - - - // interface ActionEventListener - for listening to key commands - - public void actionPerformed(ActionEvent evt) - { - if ( COPY.equals( evt.getActionCommand() ) ) - { - copyToClipboard(); - return; - } - } + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } -/** -* Copies the contents of the table to the clipboard as a tab-delimited string. -*/ - public void copyToClipboard() - { - Toolkit toolkit = Toolkit.getDefaultToolkit(); - Clipboard clipboard = toolkit.getSystemClipboard(); - StringSelection selection = - new StringSelection( getSelectedStackString() ); - clipboard.setContents( selection, selection ); - } + public Object getValueAt(int rowIndex, int columnIndex) { + return methodNames.get(rowIndex); + } -/** -* Converts the selected contents of the table to a string. -* @return A String containing the text contents of the table. -*/ - public String getSelectedStackString() - { - StringBuffer result = new StringBuffer(64); + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + } - TableModel model = table.getModel(); + public void addTableModelListener(TableModelListener l) { + if (tableModelListeners == null) { + tableModelListeners = new ArrayList(); + } + tableModelListeners.add(l); + } - Object o; - int[] selectedRows = table.getSelectedRows(); - for ( int i = 0; i < selectedRows.length; i++ ) - { - o = model.getValueAt( selectedRows[i], 0 ); - if ( o == null ) o = ""; - result.append( o ); - result.append( '\n' ); - } + public void removeTableModelListener(TableModelListener l) { + if (tableModelListeners != null) { + tableModelListeners.remove(l); + } + } - return result.toString(); - } + // interface MouseListener + /** + * Double click to call invokeFileFromString. + */ - // static methods + public void mouseClicked(MouseEvent e) { + if (e.getSource() == table) { + if (e.getClickCount() > 1) { + int row = table.rowAtPoint(e.getPoint()); + int col = table.columnAtPoint(e.getPoint()); -/** -* Obtains a list of strings representing the stack trace -* associated with this throwable starting with the most recent call. -* @param aThrowable A Throwable whose stack trace is parsed. -* @return a List containing the method names as Strings. -*/ - static public List parseStackTrace( Throwable aThrowable ) - { - String trace = null; + if ((row == -1) || (col != 0)) + return; - // create new stream - ByteArrayOutputStream os = new ByteArrayOutputStream( 256 ); - PrintStream newErr = new PrintStream( os ); - aThrowable.printStackTrace( newErr ); // prints to System.err + invokeFileFromString(methodNames.get(row).toString()); + } + } + } - // convert to string - trace = os.toString(); + public void mouseReleased(MouseEvent e) { + } - List result = new ArrayList(); + public void mousePressed(MouseEvent e) { + } - // populate list with parsed trace, starting from top - String token; - StringTokenizer tokens = new StringTokenizer( trace, "\n" ); - tokens.nextToken(); // strip off description of throwable - while ( tokens.hasMoreTokens() ) - { - token = tokens.nextToken(); - if ( token.indexOf( StackTraceInspector.class.getName() ) == -1 ) - { // add only those methods not from this class + public void mouseEntered(MouseEvent e) { + } - // strip whitespace, "at " from front, and \r from end - token.trim(); - token = token.substring( 4, token.length() - 1 ); + public void mouseExited(MouseEvent e) { + } - result.add( token ); - } - } + // interface ActionEventListener - for listening to key commands - return result; - } + public void actionPerformed(ActionEvent evt) { + if (COPY.equals(evt.getActionCommand())) { + copyToClipboard(); + return; + } + } + + /** + * Copies the contents of the table to the clipboard as a tab-delimited string. + */ + public void copyToClipboard() { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + Clipboard clipboard = toolkit.getSystemClipboard(); + StringSelection selection = new StringSelection(getSelectedStackString()); + clipboard.setContents(selection, selection); + } + + /** + * Converts the selected contents of the table to a string. + * + * @return A String containing the text contents of the table. + */ + public String getSelectedStackString() { + StringBuffer result = new StringBuffer(64); + + TableModel model = table.getModel(); + + Object o; + int[] selectedRows = table.getSelectedRows(); + for (int i = 0; i < selectedRows.length; i++) { + o = model.getValueAt(selectedRows[i], 0); + if (o == null) + o = ""; + result.append(o); + result.append('\n'); + } -/** -* Convenience method that obtains a String representing -* the caller's caller. -* @return a String representing a method in stack trace format. -*/ - static public String getMyCaller() - { - List trace = parseStackTrace( new RuntimeException() ); - if ( trace.size() > 1 ) - { - return trace.get( 1 ).toString(); - } + return result.toString(); + } + + // static methods + + /** + * Obtains a list of strings representing the stack trace associated with this + * throwable starting with the most recent call. + * + * @param aThrowable A Throwable whose stack trace is parsed. + * @return a List containing the method names as Strings. + */ + static public List parseStackTrace(Throwable aThrowable) { + String trace = null; + + // create new stream + ByteArrayOutputStream os = new ByteArrayOutputStream(256); + PrintStream newErr = new PrintStream(os); + aThrowable.printStackTrace(newErr); // prints to System.err + + // convert to string + trace = os.toString(); + + List result = new ArrayList(); + + // populate list with parsed trace, starting from top + String token; + StringTokenizer tokens = new StringTokenizer(trace, "\n"); + tokens.nextToken(); // strip off description of throwable + while (tokens.hasMoreTokens()) { + token = tokens.nextToken(); + if (token.indexOf(StackTraceInspector.class.getName()) == -1) { // add only those methods not from this + // class + + // strip whitespace, "at " from front, and \r from end + token.trim(); + token = token.substring(4, token.length() - 1); + + result.add(token); + } + } - return null; - } + return result; + } + + /** + * Convenience method that obtains a String representing the caller's caller. + * + * @return a String representing a method in stack trace format. + */ + static public String getMyCaller() { + List trace = parseStackTrace(new RuntimeException()); + if (trace.size() > 1) { + return trace.get(1).toString(); + } -/** -* Prints a stack trace up to the first method whose fully -* qualified class name begins with "java" to System.out. -*/ - static public void printShortStackTrace() - { - String s; - Iterator i = parseStackTrace( new RuntimeException() ).iterator(); - while ( i.hasNext() ) - { - System.out.println( " " + ( s = i.next().toString() ) ); - if ( s.startsWith( "java" ) ) break; - } - } - - protected void invokeFileFromString( String aString ) - { - // strip off parentheses, if any - int openParam = aString.indexOf( "(" ); - if ( openParam != -1 ) - { - aString = aString.substring( 0, openParam ); - } - - // separate class name from method name - int lastDot = aString.lastIndexOf( "." ); - if ( lastDot == -1 ) return; - String className = aString.substring( 0, lastDot ); - String methodName = aString.substring( lastDot + 1 ); - - // convert "."s to file separator characters - StringBuffer buf = new StringBuffer(); - StringTokenizer tokens = new StringTokenizer( className, "." ); - while ( true ) - { - buf.append( tokens.nextToken() ); - if ( ! tokens.hasMoreTokens() ) break; - buf.append( File.separator ); - } - String path = buf.toString(); - java.net.URL url = ClassLoader.getSystemResource( path + ".java" ); - if ( url == null ) return; // do nothing - - String name = url.getFile(); - - // try to launch the document - try - { - // NOTE: This is Windows-dependent! - String args[] = new String[] { - "cmd", "/c", "\"start \"\" \"" + name.substring(1) + "\"\"" }; - // this translates to: cmd /c "start "" "path"" - // apparently an array is more reliable for calling exec(). - // all the extra quotes are to handle paths with spaces. - // trims off the first "/" before the drive letter. - // needed a dummy title for the console or it wouldn't work. - Runtime.getRuntime().exec( args ); - } - catch ( Exception exc ) - { - System.out.println( "DocumentLinkPanel.invokeDocument: " + exc ); - } - return; - } + return null; + } + + /** + * Prints a stack trace up to the first method whose fully qualified class name + * begins with "java" to System.out. + */ + static public void printShortStackTrace() { + String s; + Iterator i = parseStackTrace(new RuntimeException()).iterator(); + while (i.hasNext()) { + System.out.println(" " + (s = i.next().toString())); + if (s.startsWith("java")) + break; + } + } + + protected void invokeFileFromString(String aString) { + // strip off parentheses, if any + int openParam = aString.indexOf("("); + if (openParam != -1) { + aString = aString.substring(0, openParam); + } + + // separate class name from method name + int lastDot = aString.lastIndexOf("."); + if (lastDot == -1) + return; + String className = aString.substring(0, lastDot); + String methodName = aString.substring(lastDot + 1); + + // convert "."s to file separator characters + StringBuffer buf = new StringBuffer(); + StringTokenizer tokens = new StringTokenizer(className, "."); + while (true) { + buf.append(tokens.nextToken()); + if (!tokens.hasMoreTokens()) + break; + buf.append(File.separator); + } + String path = buf.toString(); + java.net.URL url = ClassLoader.getSystemResource(path + ".java"); + if (url == null) + return; // do nothing + + String name = url.getFile(); + + // try to launch the document + try { + // NOTE: This is Windows-dependent! + String args[] = new String[] { "cmd", "/c", "\"start \"\" \"" + name.substring(1) + "\"\"" }; + // this translates to: cmd /c "start "" "path"" + // apparently an array is more reliable for calling exec(). + // all the extra quotes are to handle paths with spaces. + // trims off the first "/" before the drive letter. + // needed a dummy title for the console or it wouldn't work. + Runtime.getRuntime().exec(args); + } catch (Exception exc) { + System.out.println("DocumentLinkPanel.invokeDocument: " + exc); + } + return; + } } /* - * $Log$ - * Revision 1.2 2006/02/18 23:19:05 cgruber - * Update imports and maven dependencies. + * $Log$ Revision 1.2 2006/02/18 23:19:05 cgruber Update imports and maven + * dependencies. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.5 2003/08/06 23:07:53 chochos - * general code cleanup (mostly, removing unused imports) + * Revision 1.5 2003/08/06 23:07:53 chochos general code cleanup (mostly, + * removing unused imports) * - * Revision 1.4 2002/11/16 16:33:31 mpowers - * Now using platform-specific accelerator key for shortcuts. + * Revision 1.4 2002/11/16 16:33:31 mpowers Now using platform-specific + * accelerator key for shortcuts. * - * Revision 1.3 2001/07/18 21:53:33 mpowers - * Added a string argument for display as a message. + * Revision 1.3 2001/07/18 21:53:33 mpowers Added a string argument for display + * as a message. * - * Revision 1.2 2001/07/17 14:01:43 mpowers - * Added short stack trace method. + * Revision 1.2 2001/07/17 14:01:43 mpowers Added short stack trace method. * - * Revision 1.1.1.1 2000/12/21 15:51:34 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:51:34 mpowers Contributing wotonomy. * - * Revision 1.5 2000/12/20 16:25:45 michael - * Added log to all files. + * Revision 1.5 2000/12/20 16:25:45 michael Added log to all files. * * */ - diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/TextInputRangeChecker.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/TextInputRangeChecker.java index 36dbacf..20f37c1 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/TextInputRangeChecker.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/TextInputRangeChecker.java @@ -30,339 +30,298 @@ import javax.swing.SwingUtilities; import javax.swing.text.JTextComponent; /** -* This class will actively check the inputs of 2 numbers in seperate text -* components. The number in the text components represent an upper and lower -* bound to some range. This class checks to make sure the user inputs values -* in the lower bound text field that are less than the value of the upper -* bound and vice versa for the upper bound text field. This class will also -* check to make sure the bounds fall within a given range if specified. -* -* The checks are automatically performed when the focus is lost on either -* component. If the inputs are correct then no event occurs. If the inputs -* are not correct, then a dialog message is displayed stating the reason why -* the bounds are invalid, and the original correct value is restored into the -* text components. -* -* @author rglista -* @author $Author: cgruber $ -* @version $Revision: 904 $ -*/ -public class TextInputRangeChecker implements FocusListener -{ - protected static final int NONE = 0; - protected static final int LOWER = 1; - protected static final int UPPER = 2; - - private JTextComponent lowerComponent; - private JTextComponent upperComponent; - private double maxRange; - private double lowerNumber; - private double upperNumber; - private Collection focusListeners; - - private String invalidLowerMessage; - private String invalidUpperMessage; - private String invalidEitherMessage; - private String invalidRangeMessage; - - -/** -* Constructor with some of the settable parameters. No range checking is used. -* @param aLowerTextComponent A text component for the lower bound. -* @param anUpperTextComponent A text component for the upper bound. -*/ - public TextInputRangeChecker( JTextComponent aLowerTextComponent, - JTextComponent anUpperTextComponent ) - { - this( aLowerTextComponent, anUpperTextComponent, null, null, 0.0 ); - } - -/** -* Constructor with some of the settable parameters. No range checking is -* used. -* @param aLowerTextComponent A text component for the lower bound. -* @param anUpperTextComponent A text component for the upper bound. -* @param lowerTextName The name of the lower bound, eg - start year. -* @param upperTextName The name of the upper bound, eg - end year. -* is used. -*/ - public TextInputRangeChecker( JTextComponent aLowerTextComponent, - JTextComponent anUpperTextComponent, - String lowerTextName, String upperTextName ) - { - this( aLowerTextComponent, anUpperTextComponent, lowerTextName, upperTextName, 0.0 ); - } - -/** -* Constructor with some of the settable parameters. -* @param aLowerTextComponent A text component for the lower bound. -* @param anUpperTextComponent A text component for the upper bound. -* @param aMaxRange The range the bounds muist fall between, if 0 then no range -* is used. -*/ - public TextInputRangeChecker( JTextComponent aLowerTextComponent, - JTextComponent anUpperTextComponent, - double aMaxRange ) - { - this( aLowerTextComponent, anUpperTextComponent, null, null, aMaxRange ); - } - -/** -* Constructor with all the settable parameters. -* @param aLowerTextComponent A text component for the lower bound. -* @param anUpperTextComponent A text component for the upper bound. -* @param lowerTextName The name of the lower bound, eg - start year. -* @param upperTextName The name of the upper bound, eg - end year. -* @param aMaxRange The range the bounds muist fall between, if 0 then no range -* is used. -*/ - public TextInputRangeChecker( JTextComponent aLowerTextComponent, - JTextComponent anUpperTextComponent, - String lowerTextName, String upperTextName, - double aMaxRange ) - { - lowerComponent = aLowerTextComponent; - upperComponent = anUpperTextComponent; - maxRange = aMaxRange; - - focusListeners = new ArrayList( 1 ); // For most cases, there will be only 1 listener. - - lowerComponent.addFocusListener( this ); - upperComponent.addFocusListener( this ); - - lowerNumber = getNumber( lowerComponent ); - upperNumber = getNumber( upperComponent ); - - if ( ( lowerTextName != null ) && ( upperTextName != null ) ) - { - invalidLowerMessage = "The " + lowerTextName + " must be less than or equal to the " + upperTextName + "."; - invalidUpperMessage = "The " + upperTextName + " must be greater than or equal to the " + lowerTextName + "."; - invalidEitherMessage = "The " + lowerTextName + " and/or the " + upperTextName + " are not correct."; - invalidRangeMessage = "The maximum range for the " + lowerTextName + " and " + upperTextName + " is " + maxRange + "."; - } - else - { - invalidLowerMessage = "The lower bound must be less than or equal to the upper bound."; - invalidUpperMessage = "The upper bound must be greater than or equal to the lower bound."; - invalidEitherMessage = "The upper and/or lower bounds are not correct."; - invalidRangeMessage = "The maximum range is " + maxRange + "."; - } - } - -/** -* Allows the caller to perform the validation of the bounds programatically. -* The lower bound is compared to the upper bound and range checking is performed. -* If the lower bound is greater than the upper bound, or the range between the -* bounds is greater than the max range, then validation fails. -* @return TRUE is validation is successfull, FALSE if it fails. -*/ - public boolean performCheck() - { - return validate( null ); - } - -/** -* Adds the listener to the lists of focus listener maintened by this object. -* When one of the 2 text components receives a focus event, this object will -* fire that focus event to any of its listeners. This is useful when the -* calling object wants to be notified of the components focus events, but wants -* to ensure that the validation has occured first. -* <br><br> -* NOTE: The focus is only fired if the validation was successful. This might -* have to be changed. -* @param aListener A Focus Listener to receive Focus Events. -*/ - public void addFocusListener( FocusListener aListener ) - { - focusListeners.add( aListener ); - } - -/** -* Returns the last valid value of the lower bound. If this is called while -* the user is updating the text component but before the focus is lost, the -* value returned will be the original value before the user started updating -* the bound. -* @return The last valid value of the lower bound. -*/ - public double getLastValidatedLowerNumber() - { - return lowerNumber; - } - -/** -* Returns the last valid value of the upper bound. If this is called while -* the user is updating the text component but before the focus is lost, the -* value returned will be the original value before the user started updating -* the bound. -* @return The last valid value of the upper bound. -*/ - public double getLastValidatedUpperNumber() - { - return upperNumber; - } - -/** -* Method used to be notified when one of the text components has gained its -* focus. -*/ - public void focusGained( FocusEvent e ) - { - lowerNumber = getNumber( lowerComponent ); - upperNumber = getNumber( upperComponent ); - } - -/** -* Method used to be notified when one of the text components has lost its -* focus. Automatic validation occurs here. -*/ - public void focusLost( FocusEvent e ) - { - if ( e.isTemporary() ) - { - return; - } - - if ( validate( e.getSource() ) ) - { - fireFocusEvent( e ); - } - } - -/** -* Fires a focus lost event if the validation was successfull. -*/ - protected void fireFocusEvent( FocusEvent e ) - { - for ( Iterator it = focusListeners.iterator(); it.hasNext(); ) - { - ( ( FocusListener )it.next() ).focusLost( e ); - } - } - -/** -* Validates the bounds inputed by the user. -* @param aComponent The component to use to display a dialog window, if neccessray. -* If null, then the parent window of the text componets will be used. -* @return TRUE if validation was successful, FALSE otherwise. -*/ - protected boolean validate( Object aComponent ) - { - int componentUsed = NONE; - if ( aComponent == lowerComponent ) - { - componentUsed = LOWER; - } - else if ( aComponent == upperComponent ) - { - componentUsed = UPPER; - } - - double lower = getNumber( lowerComponent ); - double upper = getNumber( upperComponent ); - - if ( lower > upper ) - { - if ( componentUsed == LOWER ) - { - lowerComponent.setText( Double.toString( lowerNumber ) ); - displayMessage( invalidLowerMessage, lowerComponent ); - } - else if ( componentUsed == UPPER ) - { - upperComponent.setText( Double.toString( upperNumber ) ); - displayMessage( invalidUpperMessage, upperComponent ); - } - else - { - upperComponent.setText( Double.toString( upperNumber ) ); - lowerComponent.setText( Double.toString( lowerNumber ) ); - displayMessage( invalidEitherMessage, lowerComponent.getTopLevelAncestor() ); - } - - return false; - } - - if ( maxRange != 0.0 ) - { - if ( ( upper - lower ) > maxRange ) - { - if ( componentUsed == LOWER ) - { - lowerComponent.setText( Double.toString( lowerNumber ) ); - displayMessage( invalidRangeMessage, lowerComponent ); - } - else if ( componentUsed == UPPER ) - { - upperComponent.setText( Double.toString( upperNumber ) ); - displayMessage( invalidRangeMessage, upperComponent ); - } - else - { - upperComponent.setText( Double.toString( upperNumber ) ); - lowerComponent.setText( Double.toString( lowerNumber ) ); - displayMessage( invalidRangeMessage, lowerComponent.getTopLevelAncestor() ); - } - - return false; - } - } - - lowerNumber = lower; - upperNumber = upper; - return true; - } - -/** -* Creates a JOptionPane to display the reason why the bounds failed validation. -*/ - protected void displayMessage( final String message, final Component parent ) - { - SwingUtilities.invokeLater( new Runnable() - { - public void run() - { - JOptionPane.showMessageDialog( parent, message, "Data Entry Error", - JOptionPane.ERROR_MESSAGE ); - } - } ); - } - -/** -* Gets the number represented in the text component. If the text does not -* represent a number, then zero is returned. -*/ - protected double getNumber( JTextComponent aComponent ) - { - try - { - return Double.valueOf( aComponent.getText() ).doubleValue(); + * This class will actively check the inputs of 2 numbers in seperate text + * components. The number in the text components represent an upper and lower + * bound to some range. This class checks to make sure the user inputs values in + * the lower bound text field that are less than the value of the upper bound + * and vice versa for the upper bound text field. This class will also check to + * make sure the bounds fall within a given range if specified. + * + * The checks are automatically performed when the focus is lost on either + * component. If the inputs are correct then no event occurs. If the inputs are + * not correct, then a dialog message is displayed stating the reason why the + * bounds are invalid, and the original correct value is restored into the text + * components. + * + * @author rglista + * @author $Author: cgruber $ + * @version $Revision: 904 $ + */ +public class TextInputRangeChecker implements FocusListener { + protected static final int NONE = 0; + protected static final int LOWER = 1; + protected static final int UPPER = 2; + + private JTextComponent lowerComponent; + private JTextComponent upperComponent; + private double maxRange; + private double lowerNumber; + private double upperNumber; + private Collection focusListeners; + + private String invalidLowerMessage; + private String invalidUpperMessage; + private String invalidEitherMessage; + private String invalidRangeMessage; + + /** + * Constructor with some of the settable parameters. No range checking is used. + * + * @param aLowerTextComponent A text component for the lower bound. + * @param anUpperTextComponent A text component for the upper bound. + */ + public TextInputRangeChecker(JTextComponent aLowerTextComponent, JTextComponent anUpperTextComponent) { + this(aLowerTextComponent, anUpperTextComponent, null, null, 0.0); + } + + /** + * Constructor with some of the settable parameters. No range checking is used. + * + * @param aLowerTextComponent A text component for the lower bound. + * @param anUpperTextComponent A text component for the upper bound. + * @param lowerTextName The name of the lower bound, eg - start year. + * @param upperTextName The name of the upper bound, eg - end year. is + * used. + */ + public TextInputRangeChecker(JTextComponent aLowerTextComponent, JTextComponent anUpperTextComponent, + String lowerTextName, String upperTextName) { + this(aLowerTextComponent, anUpperTextComponent, lowerTextName, upperTextName, 0.0); + } + + /** + * Constructor with some of the settable parameters. + * + * @param aLowerTextComponent A text component for the lower bound. + * @param anUpperTextComponent A text component for the upper bound. + * @param aMaxRange The range the bounds muist fall between, if 0 + * then no range is used. + */ + public TextInputRangeChecker(JTextComponent aLowerTextComponent, JTextComponent anUpperTextComponent, + double aMaxRange) { + this(aLowerTextComponent, anUpperTextComponent, null, null, aMaxRange); + } + + /** + * Constructor with all the settable parameters. + * + * @param aLowerTextComponent A text component for the lower bound. + * @param anUpperTextComponent A text component for the upper bound. + * @param lowerTextName The name of the lower bound, eg - start year. + * @param upperTextName The name of the upper bound, eg - end year. + * @param aMaxRange The range the bounds muist fall between, if 0 + * then no range is used. + */ + public TextInputRangeChecker(JTextComponent aLowerTextComponent, JTextComponent anUpperTextComponent, + String lowerTextName, String upperTextName, double aMaxRange) { + lowerComponent = aLowerTextComponent; + upperComponent = anUpperTextComponent; + maxRange = aMaxRange; + + focusListeners = new ArrayList(1); // For most cases, there will be only 1 listener. + + lowerComponent.addFocusListener(this); + upperComponent.addFocusListener(this); + + lowerNumber = getNumber(lowerComponent); + upperNumber = getNumber(upperComponent); + + if ((lowerTextName != null) && (upperTextName != null)) { + invalidLowerMessage = "The " + lowerTextName + " must be less than or equal to the " + upperTextName + "."; + invalidUpperMessage = "The " + upperTextName + " must be greater than or equal to the " + lowerTextName + + "."; + invalidEitherMessage = "The " + lowerTextName + " and/or the " + upperTextName + " are not correct."; + invalidRangeMessage = "The maximum range for the " + lowerTextName + " and " + upperTextName + " is " + + maxRange + "."; + } else { + invalidLowerMessage = "The lower bound must be less than or equal to the upper bound."; + invalidUpperMessage = "The upper bound must be greater than or equal to the lower bound."; + invalidEitherMessage = "The upper and/or lower bounds are not correct."; + invalidRangeMessage = "The maximum range is " + maxRange + "."; + } + } + + /** + * Allows the caller to perform the validation of the bounds programatically. + * The lower bound is compared to the upper bound and range checking is + * performed. If the lower bound is greater than the upper bound, or the range + * between the bounds is greater than the max range, then validation fails. + * + * @return TRUE is validation is successfull, FALSE if it fails. + */ + public boolean performCheck() { + return validate(null); + } + + /** + * Adds the listener to the lists of focus listener maintened by this object. + * When one of the 2 text components receives a focus event, this object will + * fire that focus event to any of its listeners. This is useful when the + * calling object wants to be notified of the components focus events, but wants + * to ensure that the validation has occured first. <br> + * <br> + * NOTE: The focus is only fired if the validation was successful. This might + * have to be changed. + * + * @param aListener A Focus Listener to receive Focus Events. + */ + public void addFocusListener(FocusListener aListener) { + focusListeners.add(aListener); + } + + /** + * Returns the last valid value of the lower bound. If this is called while the + * user is updating the text component but before the focus is lost, the value + * returned will be the original value before the user started updating the + * bound. + * + * @return The last valid value of the lower bound. + */ + public double getLastValidatedLowerNumber() { + return lowerNumber; + } + + /** + * Returns the last valid value of the upper bound. If this is called while the + * user is updating the text component but before the focus is lost, the value + * returned will be the original value before the user started updating the + * bound. + * + * @return The last valid value of the upper bound. + */ + public double getLastValidatedUpperNumber() { + return upperNumber; + } + + /** + * Method used to be notified when one of the text components has gained its + * focus. + */ + public void focusGained(FocusEvent e) { + lowerNumber = getNumber(lowerComponent); + upperNumber = getNumber(upperComponent); + } + + /** + * Method used to be notified when one of the text components has lost its + * focus. Automatic validation occurs here. + */ + public void focusLost(FocusEvent e) { + if (e.isTemporary()) { + return; + } + + if (validate(e.getSource())) { + fireFocusEvent(e); + } + } + + /** + * Fires a focus lost event if the validation was successfull. + */ + protected void fireFocusEvent(FocusEvent e) { + for (Iterator it = focusListeners.iterator(); it.hasNext();) { + ((FocusListener) it.next()).focusLost(e); + } + } + + /** + * Validates the bounds inputed by the user. + * + * @param aComponent The component to use to display a dialog window, if + * neccessray. If null, then the parent window of the text + * componets will be used. + * @return TRUE if validation was successful, FALSE otherwise. + */ + protected boolean validate(Object aComponent) { + int componentUsed = NONE; + if (aComponent == lowerComponent) { + componentUsed = LOWER; + } else if (aComponent == upperComponent) { + componentUsed = UPPER; + } + + double lower = getNumber(lowerComponent); + double upper = getNumber(upperComponent); + + if (lower > upper) { + if (componentUsed == LOWER) { + lowerComponent.setText(Double.toString(lowerNumber)); + displayMessage(invalidLowerMessage, lowerComponent); + } else if (componentUsed == UPPER) { + upperComponent.setText(Double.toString(upperNumber)); + displayMessage(invalidUpperMessage, upperComponent); + } else { + upperComponent.setText(Double.toString(upperNumber)); + lowerComponent.setText(Double.toString(lowerNumber)); + displayMessage(invalidEitherMessage, lowerComponent.getTopLevelAncestor()); + } + + return false; + } + + if (maxRange != 0.0) { + if ((upper - lower) > maxRange) { + if (componentUsed == LOWER) { + lowerComponent.setText(Double.toString(lowerNumber)); + displayMessage(invalidRangeMessage, lowerComponent); + } else if (componentUsed == UPPER) { + upperComponent.setText(Double.toString(upperNumber)); + displayMessage(invalidRangeMessage, upperComponent); + } else { + upperComponent.setText(Double.toString(upperNumber)); + lowerComponent.setText(Double.toString(lowerNumber)); + displayMessage(invalidRangeMessage, lowerComponent.getTopLevelAncestor()); + } + + return false; + } + } + + lowerNumber = lower; + upperNumber = upper; + return true; + } + + /** + * Creates a JOptionPane to display the reason why the bounds failed validation. + */ + protected void displayMessage(final String message, final Component parent) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + JOptionPane.showMessageDialog(parent, message, "Data Entry Error", JOptionPane.ERROR_MESSAGE); + } + }); + } + + /** + * Gets the number represented in the text component. If the text does not + * represent a number, then zero is returned. + */ + protected double getNumber(JTextComponent aComponent) { + try { + return Double.valueOf(aComponent.getText()).doubleValue(); //1.2 return Double.parseDouble( aComponent.getText() ); - } - catch ( NumberFormatException e ) - { - System.out.println("[GUI] TextInputRangeChecker.getNumber(): The text is NOT a number: " + aComponent.getText() ); - return 0.0; - } - } + } catch (NumberFormatException e) { + System.out.println( + "[GUI] TextInputRangeChecker.getNumber(): The text is NOT a number: " + aComponent.getText()); + return 0.0; + } + } } /* - * $Log$ - * Revision 1.2 2006/02/18 23:19:05 cgruber - * Update imports and maven dependencies. + * $Log$ Revision 1.2 2006/02/18 23:19:05 cgruber Update imports and maven + * dependencies. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.2 2003/08/06 23:07:53 chochos - * general code cleanup (mostly, removing unused imports) + * Revision 1.2 2003/08/06 23:07:53 chochos general code cleanup (mostly, + * removing unused imports) * - * Revision 1.1.1.1 2000/12/21 15:51:49 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:51:49 mpowers Contributing wotonomy. * - * Revision 1.2 2000/12/20 16:25:46 michael - * Added log to all files. + * Revision 1.2 2000/12/20 16:25:46 michael Added log to all files. * * */ - diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/WindowGrabber.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/WindowGrabber.java index c360105..4ac8374 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/WindowGrabber.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/WindowGrabber.java @@ -31,173 +31,140 @@ import javax.swing.JFrame; import javax.swing.JWindow; /** - * WindowGrabber is a collection of static utility methods - * for taking screen shots of lightweight containers. All - * components that are not native peers will be drawn to a - * bitmap that will be run-length compressed (LZW encoding, GIF format) - * and written to the specified file or output stream. <br><br> + * WindowGrabber is a collection of static utility methods for taking screen + * shots of lightweight containers. All components that are not native peers + * will be drawn to a bitmap that will be run-length compressed (LZW encoding, + * GIF format) and written to the specified file or output stream. <br> + * <br> * - * Any Swing/JFC or IFC window is a good candidate for use with these - * methods. The component is not expected to contain more than 256 colors - * (the maximum that GIF allows). While there is a color depth limitation, - * the compression is lossless, with no blurs or bleeding color. + * Any Swing/JFC or IFC window is a good candidate for use with these methods. + * The component is not expected to contain more than 256 colors (the maximum + * that GIF allows). While there is a color depth limitation, the compression is + * lossless, with no blurs or bleeding color. * * @author michael@mpowers.net - * @version $Revision: 904 $ - * $Date: 2006-02-18 18:19:05 -0500 (Sat, 18 Feb 2006) $ + * @version $Revision: 904 $ $Date: 2006-02-18 18:19:05 -0500 (Sat, 18 Feb 2006) + * $ */ -public class WindowGrabber -{ -/** - * Captures the screen contents of the specified component, - * and write it to a file with the specified name. - * - * @param aComponent a lightweight component or container. - * @param aFileName the name of the file to write, optionally preceded by path. - * @return True if the file was successfully written, false if there was an error. - * Errors are written to the standard error stream. - */ - static public boolean grab( Component aComponent, String aFileName ) - { +public class WindowGrabber { + /** + * Captures the screen contents of the specified component, and write it to a + * file with the specified name. + * + * @param aComponent a lightweight component or container. + * @param aFileName the name of the file to write, optionally preceded by path. + * @return True if the file was successfully written, false if there was an + * error. Errors are written to the standard error stream. + */ + static public boolean grab(Component aComponent, String aFileName) { OutputStream output = null; - try - { - output = new FileOutputStream( aFileName ); - } - catch ( Exception exc ) - { - System.err.println( exc ); + try { + output = new FileOutputStream(aFileName); + } catch (Exception exc) { + System.err.println(exc); return false; } - return grab( aComponent, output ); + return grab(aComponent, output); } -/** - * Captures the screen contents of the specified component, - * and write it to a file with the specified name. - * - * @param aComponent a lightweight component or container. - * @param anOutputStream an output stream to which the image will be written. - * @return True if the image was successfully written, false if there was an error. - * Errors are written to the standard error stream. - */ - static public boolean grab( Component aComponent, OutputStream anOutputStream ) - { - Image img = aComponent.createImage( - aComponent.getSize().width, aComponent.getSize().height ); - aComponent.paintAll( img.getGraphics() ); + /** + * Captures the screen contents of the specified component, and write it to a + * file with the specified name. + * + * @param aComponent a lightweight component or container. + * @param anOutputStream an output stream to which the image will be written. + * @return True if the image was successfully written, false if there was an + * error. Errors are written to the standard error stream. + */ + static public boolean grab(Component aComponent, OutputStream anOutputStream) { + Image img = aComponent.createImage(aComponent.getSize().width, aComponent.getSize().height); + aComponent.paintAll(img.getGraphics()); try { - GIFEncoder encoder = new GIFEncoder( img ); - encoder.write( anOutputStream ); + GIFEncoder encoder = new GIFEncoder(img); + encoder.write(anOutputStream); anOutputStream.flush(); - } catch ( Exception exc ) { - System.err.println( exc ); + } catch (Exception exc) { + System.err.println(exc); return false; } return true; } - protected static void processFilenames( String path, String[] filenames ) - { + protected static void processFilenames(String path, String[] filenames) { ClassLoader loader = new ClassGrabber(); File f; - for ( int i = 0; i < filenames.length; i++ ) - { - try - { - f = new File( path + filenames[i] ); - if ( f.isDirectory() ) - { - processFilenames ( - path + filenames[i] + "/", - f.list( new FilenameFilter() - { - public boolean accept(File dir, String name) - { - return name.endsWith( ".class" ); + for (int i = 0; i < filenames.length; i++) { + try { + f = new File(path + filenames[i]); + if (f.isDirectory()) { + processFilenames(path + filenames[i] + "/", f.list(new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.endsWith(".class"); + } + })); + } else { + System.out.println("Loading " + filenames[i] + ": "); + Class c = loader.loadClass(path + filenames[i]); + + System.out.println(c); + + if (JWindow.class.isAssignableFrom(c) || JDialog.class.isAssignableFrom(c) + || JFrame.class.isAssignableFrom(c)) { + try { + Window w = (Window) c.newInstance(); + if (w.getBounds().width * w.getBounds().height == 0) { // if size not specified or set, pack + // it + w.pack(); } - }) - ); - } - else - { - System.out.println( "Loading " + filenames[i] + ": " ); - Class c = loader.loadClass( path + filenames[i] ); - - System.out.println( c ); - - if ( JWindow.class.isAssignableFrom( c ) || - JDialog.class.isAssignableFrom( c ) || - JFrame.class.isAssignableFrom( c ) ) - { - try - { - Window w = (Window) c.newInstance(); - if ( w.getBounds().width * w.getBounds().height == 0 ) - { // if size not specified or set, pack it - w.pack(); - } - String gifName = // replace .class with .gif - filenames[i].substring( - 0, filenames[i].length() - 5 ) + "gif"; - w.addNotify(); - w.repaint(); - grab( w, gifName ); - System.out.println( "wrote: " + gifName ); - } - catch ( Exception exc ) - { - System.err.println( "WindowGrab failed for " + filenames[i] + ": " ); - exc.printStackTrace(); - } - - } - else - { - System.out.println( "not a JWindow, JDialog, or JFrame; ignored." ); - } + String gifName = // replace .class with .gif + filenames[i].substring(0, filenames[i].length() - 5) + "gif"; + w.addNotify(); + w.repaint(); + grab(w, gifName); + System.out.println("wrote: " + gifName); + } catch (Exception exc) { + System.err.println("WindowGrab failed for " + filenames[i] + ": "); + exc.printStackTrace(); + } + + } else { + System.out.println("not a JWindow, JDialog, or JFrame; ignored."); + } } - } - catch ( Exception exc ) - { - System.err.println( filenames[i] + ": " + exc ); + } catch (Exception exc) { + System.err.println(filenames[i] + ": " + exc); } } } -/** - * Captures images of any Swing window component classes specified - * as parameters. If created, image file will have the same name - * as the corresponding class file, but with a ".gif" extension. - * - * @param argv a list of filenames or directory names. - */ - public static void main( String[] argv ) - { - processFilenames( "", argv ); - System.exit( 0 ); + /** + * Captures images of any Swing window component classes specified as + * parameters. If created, image file will have the same name as the + * corresponding class file, but with a ".gif" extension. + * + * @param argv a list of filenames or directory names. + */ + public static void main(String[] argv) { + processFilenames("", argv); + System.exit(0); } } /* - * $Log$ - * Revision 1.2 2006/02/18 23:19:05 cgruber - * Update imports and maven dependencies. + * $Log$ Revision 1.2 2006/02/18 23:19:05 cgruber Update imports and maven + * dependencies. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.1.1.1 2000/12/21 15:51:49 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:51:49 mpowers Contributing wotonomy. * - * Revision 1.2 2000/12/20 16:25:46 michael - * Added log to all files. + * Revision 1.2 2000/12/20 16:25:46 michael Added log to all files. * * */ - diff --git a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/WindowUtilities.java b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/WindowUtilities.java index a36ba12..e9d3329 100644 --- a/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/WindowUtilities.java +++ b/projects/net.wotonomy.ui.swing/src/main/java/net/wotonomy/ui/swing/util/WindowUtilities.java @@ -34,488 +34,440 @@ import java.util.List; import java.util.Map; /** -* A collection of window-related utilities. -* -* @author michael@mpowers.net -* @author $Author: cgruber $ -* @version $Revision: 904 $ -* $Date: 2006-02-18 18:19:05 -0500 (Sat, 18 Feb 2006) $ -* -*/ -public class WindowUtilities -{ - -/** -* Place frame at center (vertically and horizontally) of screen. -*/ - public static final int CENTER = 0; - -/** -* Center dialog on frame area of parent, if any. -*/ - public static final int CENTER_PARENT = 1; - -/** -* Place lower and to the right of the last window -* placed in this manner. Will wrap to top and left -* of screen as necessary. -*/ - public static final int CASCADE = 10; - - // cascade state - private static int lastX = 0; - private static int lastY = 0; - private static int incrementX = 20; - private static int incrementY = 20; - -/** -* Place the window in the center of the screen. -* Note: don't forget to first set the size of your window. -* This is a convenience method and simply calls place() with -* the CENTER parameter. -* @param aWindow The window to be centered. -* @see #place -*/ - public static void center( Window aWindow ) - { - place( aWindow, CENTER ); - } - -/** -* Place lower and to the right of the last window -* placed in this manner. Will wrap to top and left -* of screen as necessary. -* This is a convenience method and simply calls place() with -* the CASCADE parameter. -* @param aWindow The window to be cascaded. -* @see #place -*/ - public static void cascade( Window aWindow ) - { - place( aWindow, CASCADE ); - } - -/** -* Place the window in the specified location. -* Note: don't forget to first set the size of your window. -* @param aWindow The window to be placed. -* @param location Where on screen to place the frame. -*/ - public static void place( Window aWindow, int location) - { - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension mySize = aWindow.getSize(); - int x = (aWindow.getLocation()).x; - int y = (aWindow.getLocation()).y; - float aspectRatio = (float)screenSize.height/(float)screenSize.width; - - // hack to make windows appear on left monitor if dual monitor - // if aspect ratio is less than 0.6, assume dual monitor - if (aspectRatio < 0.6) - { - screenSize.width = screenSize.width/2; - } - - switch (location) - { - case CENTER_PARENT: - if ( ( ! ( aWindow instanceof Dialog ) ) - || ( ((Dialog)aWindow).getParent() == null ) ) + * A collection of window-related utilities. + * + * @author michael@mpowers.net + * @author $Author: cgruber $ + * @version $Revision: 904 $ $Date: 2006-02-18 18:19:05 -0500 (Sat, 18 Feb 2006) + * $ + * + */ +public class WindowUtilities { + + /** + * Place frame at center (vertically and horizontally) of screen. + */ + public static final int CENTER = 0; + + /** + * Center dialog on frame area of parent, if any. + */ + public static final int CENTER_PARENT = 1; + + /** + * Place lower and to the right of the last window placed in this manner. Will + * wrap to top and left of screen as necessary. + */ + public static final int CASCADE = 10; + + // cascade state + private static int lastX = 0; + private static int lastY = 0; + private static int incrementX = 20; + private static int incrementY = 20; + + /** + * Place the window in the center of the screen. Note: don't forget to first set + * the size of your window. This is a convenience method and simply calls + * place() with the CENTER parameter. + * + * @param aWindow The window to be centered. + * @see #place + */ + public static void center(Window aWindow) { + place(aWindow, CENTER); + } + + /** + * Place lower and to the right of the last window placed in this manner. Will + * wrap to top and left of screen as necessary. This is a convenience method and + * simply calls place() with the CASCADE parameter. + * + * @param aWindow The window to be cascaded. + * @see #place + */ + public static void cascade(Window aWindow) { + place(aWindow, CASCADE); + } + + /** + * Place the window in the specified location. Note: don't forget to first set + * the size of your window. + * + * @param aWindow The window to be placed. + * @param location Where on screen to place the frame. + */ + public static void place(Window aWindow, int location) { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + Dimension mySize = aWindow.getSize(); + int x = (aWindow.getLocation()).x; + int y = (aWindow.getLocation()).y; + float aspectRatio = (float) screenSize.height / (float) screenSize.width; + + // hack to make windows appear on left monitor if dual monitor + // if aspect ratio is less than 0.6, assume dual monitor + if (aspectRatio < 0.6) { + screenSize.width = screenSize.width / 2; + } + + switch (location) { + case CENTER_PARENT: + if ((!(aWindow instanceof Dialog)) || (((Dialog) aWindow).getParent() == null)) //1.2 || ( ((Dialog)aWindow).getOwner() == null ) ) - { - place( aWindow, CENTER ); - return; - } - Point parentLocation = (((Dialog)aWindow).getParent()).getLocation(); + { + place(aWindow, CENTER); + return; + } + Point parentLocation = (((Dialog) aWindow).getParent()).getLocation(); //1.2 (((Dialog)aWindow).getOwner()).getLocation(); - Dimension parentSize = (((Dialog)aWindow).getParent()).getSize(); + Dimension parentSize = (((Dialog) aWindow).getParent()).getSize(); //1.2 Dimension parentSize = (((Dialog)aWindow).getOwner()).getSize(); - if (parentSize.width > mySize.width) - { - x = ((parentSize.width - mySize.width)/2) + parentLocation.x; - } - if (parentSize.height > mySize.height) - { - y = ((parentSize.height - mySize.height)/2) + parentLocation.y; - } - break; - case CENTER: - if (screenSize.width > mySize.width) - { - x = (screenSize.width - mySize.width)/2; - } - if (screenSize.height > mySize.height) - { - y = (screenSize.height - mySize.height)/2; - } - break; - case CASCADE: - x = lastX + incrementX; - if ( x + mySize.width > screenSize.width ) - { - x = incrementX; - } - y = lastY + incrementY; - if ( y + mySize.height > screenSize.height ) - { - y = incrementY; - } - lastX = x; - lastY = y; - break; - default: - // don't move the frame - Point p = aWindow.getLocation(); - x = p.x; - y = p.y; - break; - } - aWindow.setLocation(x,y); - } - -/** - * Returns the first parent Window of the specified component. - * - * @param c the Component whose parent will be found. - * @return the Window that contains the component, - * or null if the component does not have a valid Frame parent. - */ - public static Window getWindowForComponent(Component c) - { - for(Component p = c; p != null; p = p.getParent()) { - if (p instanceof Window) { - return (Window) p; - } - } - return null; - } - - - -/** -* Prints out a list of all components to System.out. -* @param aContainer the Container whose components will be listed. -*/ - public static void dumpComponents( Container aContainer ) - { - dumpComponents( aContainer, "" ); - } - - protected static void dumpComponents( Container aContainer, String padding ) - { - Component c = null; - int count = aContainer.getComponentCount(); - for ( int i = 0; i < count; i++ ) - { - c = aContainer.getComponent( i ); - if ( c instanceof javax.swing.JComponent ) - { - System.out.println( padding + c.getClass() + ": " - + ((javax.swing.JComponent)c).getAccessibleContext().getAccessibleName() ); - } - else - { - System.out.println( padding + c.getClass() + ": " + c.getName() ); - } - if ( c instanceof Container ) - { - dumpComponents( (Container) c, padding + " " ); - } - } - } - -/** -* Gets a list of all children of a specified container, sorted by position. -* Components are sorted from top to bottom and then left to right. -* @param aContainer The container whose children are to be returned. -* @result A List containing the sorted components. -*/ - public static List getSortedChildComponents( Container aContainer ) - { - List result = new ArrayList( getAllChildComponents( aContainer ) ); - Collections.sort( result, new PositionComparator( aContainer ) ); - return result; - } - - public static void dumpSortedChildComponents( Container aContainer ) - { - Component c = null; - Iterator it = getSortedChildComponents( aContainer ).iterator(); - while ( it.hasNext() ) - { - c = (Component) it.next(); - System.out.println( c.getLocation() + " : " + c.getClass() ); - } - } - - public static void dumpNamedChildComponents( Container aContainer ) - { - Iterator it = getUniqueNameMap( getSortedChildComponents( aContainer ) ).values().iterator(); - while ( it.hasNext() ) - { - System.out.println( it.next() ); - } - } - -/** -* Generates a unique name for each object in a list and returns -* a map that maps the objects to the names. The name is based -* on the class of the object in the object list. -* @param anObjectList A List of objects. -* @return A Map that maps the objects in the list to the generated names. -*/ - public static Map getUniqueNameMap( List anObjectList ) - { - Map namesToObjects = new HashMap(anObjectList.size(), 1F); - Map objectsToNames = new HashMap(anObjectList.size(), 1F); - - Object o = null; - String name = null; - int lastIndex = 0; - Iterator it = anObjectList.iterator(); - while ( it.hasNext() ) - { - o = it.next(); - name = o.getClass().getName(); - lastIndex = name.lastIndexOf( "." ); - if ( lastIndex != -1 ) - { - name = name.substring( lastIndex+1 ); - } - name = incrementString( name ); - while ( namesToObjects.get( name ) != null ) - { - name = incrementString( name ); - } - namesToObjects.put( name, o ); - objectsToNames.put( o, name ); - } - - return objectsToNames; - } - -/** -* Numerically increments a string. For example, "hello" becomes "hello1" -* and "hello1" becomes "hello2" while "hello999" becomes "hello1000". -* @param aString a String to be incremented. -* @return The incremented String. -*/ - public static String incrementString( String aString ) - { - int i = aString.length()-1; - while ( ( i >= 0 ) && ( Character.isDigit( aString.charAt( i ) ) ) ) - { - i--; - } - - if ( i == aString.length()-1 ) - { // no numerics at end of string, increment manually - return aString + "1"; - } - - String alpha = aString.substring( 0, i+1 ); - String numeric = aString.substring( i+1 ); - numeric = Integer.toString( Integer.parseInt( numeric ) + 1 ); - - return alpha + numeric; - - } - -/** -* Gets all children of the specified container. -* @param aContainer the Container to be searched. -* @return A Collection containing all of the child components of the container. -*/ - public static Collection getAllChildComponents( Container aContainer ) - { - Collection result = new ArrayList(); - addAllChildComponents( aContainer, result ); - return result; - } - -/** -* Adds all children of the specified container to the specified collection. -* @param aContainer the Container to be searched. -* @param aCollection the Collection to which the child components will be added. -*/ - protected static void addAllChildComponents( Container aContainer, Collection aCollection ) - { - Component c = null; - int count = aContainer.getComponentCount(); - for ( int i = 0; i < count; i++ ) - { - c = aContainer.getComponent( i ); - aCollection.add( c ); - if ( c instanceof Container ) - { - addAllChildComponents( (Container) c, aCollection ); - } - } - } - -/** -* Sets each child component's tooltip to show the name generated from -* getComponentNameMap(). -* (We're doing this so the tooltip authors can know how to reference -* the components.) -* @param aContainer the Container whose components will be labeled. -*/ - public static void labelComponents( Container aContainer ) - { - Map nameToComponent = getNameToComponentMap( aContainer ); - Map nameToName = new HashMap(nameToComponent.size(), 1F); - Iterator it = nameToComponent.keySet().iterator(); - String key; - while ( it.hasNext() ) - { - key = it.next().toString(); - nameToName.put( key, key ); - } - labelComponents( aContainer, nameToName ); - } - -/** -* Sets each child component's tooltip to show a given string retrieved -* from a map using the component's generated name as a key. -* @param aContainer the Container whose components will be labeled. -* @param aNameMap a Map of generated names to string values. -*/ - public static void labelComponents( Container aContainer, Map aNameMap ) - { - if ( aNameMap == null ) return; - - String key; - Object o ; - Iterator it = aNameMap.keySet().iterator(); - Map nameToComponent = getNameToComponentMap( aContainer ); - while ( it.hasNext() ) - { - key = it.next().toString(); - o = nameToComponent.get( key ); - if ( o instanceof javax.swing.JComponent ) - { - ((javax.swing.JComponent)o).setToolTipText( aNameMap.get( key ).toString() ); - } - } - } - -/** -* Generates a deterministically unique name for each component in a -* container. The name is based on the name of the class of the component -* followed by a number. Each class of component is numbered based on it's -* position in the container, sorted from top to bottom and left to right. -* @param aContainer the Container whose components will named. -* @return a Map that maps each component to its name. -*/ - public static Map getComponentToNameMap( Container aContainer ) - { - return getUniqueNameMap( getSortedChildComponents( aContainer ) ); - } - -/** -* Maps a deterministically unique name to a component in a -* container. The name is based on the name of the class of the component -* followed by a number. Each class of component is numbered based on it's -* position in the container, sorted from top to bottom and left to right. -* @param aContainer the Container whose components will named. -* @return a Map that maps each component to its name. -*/ - public static Map getNameToComponentMap( Container aContainer ) - { - Map componentToName = getComponentToNameMap( aContainer ); - Map result = new HashMap(componentToName.size(), 1F); - Iterator it = componentToName.keySet().iterator(); - Object key; - while ( it.hasNext() ) - { - key = it.next(); - result.put( componentToName.get( key ), key ); - } - return result; - } - -/** -* Sets the tooltips of all components in a container to the -* respective names of those components. (We're using this -* so the tooltip authors can know how to reference the components.) -* @param aContainer the Container whose components will be labeled. -*/ - public static void nameComponents( Container aContainer ) - { - nameComponents( aContainer, "" ); - } - - protected static void nameComponents( Container aContainer, String path ) - { - Component c = null; - String className = null; - int index = 0; - int count = aContainer.getComponentCount(); - for ( int i = 0; i < count; i++ ) - { - c = aContainer.getComponent( i ); - className = c.getClass().getName(); - className = className.substring( className.lastIndexOf( '.' ) + 1 ); - System.out.println( path + className ); - if ( c instanceof javax.swing.JComponent ) - { - // ((javax.swing.JComponent)c).setToolTipText( path + className + " (" + c.getName() + ")" ); - ((javax.swing.JComponent)c).setToolTipText( c.getName() ); - } - if ( c instanceof Container ) - { - nameComponents( (Container) c, path + className + "." ); - } - } - } - -/** -* Sets the enabled state of a container and all of its components. -* @param aContainer the Container whose components will be enabled. -* @param isEnabled True if enabled, false id disabled. -*/ - public static void enableComponents( Container aContainer, boolean isEnabled ) - { - Component c = null; - String className = null; - int index = 0; - int count = aContainer.getComponentCount(); - for ( int i = 0; i < count; i++ ) - { - c = aContainer.getComponent( i ); - if ( c instanceof Container ) - { - enableComponents( (Container) c, isEnabled ); - } - else - { - c.setEnabled( isEnabled ); - } - } - aContainer.setEnabled( isEnabled ); - } + if (parentSize.width > mySize.width) { + x = ((parentSize.width - mySize.width) / 2) + parentLocation.x; + } + if (parentSize.height > mySize.height) { + y = ((parentSize.height - mySize.height) / 2) + parentLocation.y; + } + break; + case CENTER: + if (screenSize.width > mySize.width) { + x = (screenSize.width - mySize.width) / 2; + } + if (screenSize.height > mySize.height) { + y = (screenSize.height - mySize.height) / 2; + } + break; + case CASCADE: + x = lastX + incrementX; + if (x + mySize.width > screenSize.width) { + x = incrementX; + } + y = lastY + incrementY; + if (y + mySize.height > screenSize.height) { + y = incrementY; + } + lastX = x; + lastY = y; + break; + default: + // don't move the frame + Point p = aWindow.getLocation(); + x = p.x; + y = p.y; + break; + } + aWindow.setLocation(x, y); + } + + /** + * Returns the first parent Window of the specified component. + * + * @param c the Component whose parent will be found. + * @return the Window that contains the component, or null if the component does + * not have a valid Frame parent. + */ + public static Window getWindowForComponent(Component c) { + for (Component p = c; p != null; p = p.getParent()) { + if (p instanceof Window) { + return (Window) p; + } + } + return null; + } + + /** + * Prints out a list of all components to System.out. + * + * @param aContainer the Container whose components will be listed. + */ + public static void dumpComponents(Container aContainer) { + dumpComponents(aContainer, ""); + } + + protected static void dumpComponents(Container aContainer, String padding) { + Component c = null; + int count = aContainer.getComponentCount(); + for (int i = 0; i < count; i++) { + c = aContainer.getComponent(i); + if (c instanceof javax.swing.JComponent) { + System.out.println(padding + c.getClass() + ": " + + ((javax.swing.JComponent) c).getAccessibleContext().getAccessibleName()); + } else { + System.out.println(padding + c.getClass() + ": " + c.getName()); + } + if (c instanceof Container) { + dumpComponents((Container) c, padding + " "); + } + } + } + + /** + * Gets a list of all children of a specified container, sorted by position. + * Components are sorted from top to bottom and then left to right. + * + * @param aContainer The container whose children are to be returned. + * @result A List containing the sorted components. + */ + public static List getSortedChildComponents(Container aContainer) { + List result = new ArrayList(getAllChildComponents(aContainer)); + Collections.sort(result, new PositionComparator(aContainer)); + return result; + } + + public static void dumpSortedChildComponents(Container aContainer) { + Component c = null; + Iterator it = getSortedChildComponents(aContainer).iterator(); + while (it.hasNext()) { + c = (Component) it.next(); + System.out.println(c.getLocation() + " : " + c.getClass()); + } + } + + public static void dumpNamedChildComponents(Container aContainer) { + Iterator it = getUniqueNameMap(getSortedChildComponents(aContainer)).values().iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } + + /** + * Generates a unique name for each object in a list and returns a map that maps + * the objects to the names. The name is based on the class of the object in the + * object list. + * + * @param anObjectList A List of objects. + * @return A Map that maps the objects in the list to the generated names. + */ + public static Map getUniqueNameMap(List anObjectList) { + Map namesToObjects = new HashMap(anObjectList.size(), 1F); + Map objectsToNames = new HashMap(anObjectList.size(), 1F); + + Object o = null; + String name = null; + int lastIndex = 0; + Iterator it = anObjectList.iterator(); + while (it.hasNext()) { + o = it.next(); + name = o.getClass().getName(); + lastIndex = name.lastIndexOf("."); + if (lastIndex != -1) { + name = name.substring(lastIndex + 1); + } + name = incrementString(name); + while (namesToObjects.get(name) != null) { + name = incrementString(name); + } + namesToObjects.put(name, o); + objectsToNames.put(o, name); + } + + return objectsToNames; + } + + /** + * Numerically increments a string. For example, "hello" becomes "hello1" and + * "hello1" becomes "hello2" while "hello999" becomes "hello1000". + * + * @param aString a String to be incremented. + * @return The incremented String. + */ + public static String incrementString(String aString) { + int i = aString.length() - 1; + while ((i >= 0) && (Character.isDigit(aString.charAt(i)))) { + i--; + } + + if (i == aString.length() - 1) { // no numerics at end of string, increment manually + return aString + "1"; + } + + String alpha = aString.substring(0, i + 1); + String numeric = aString.substring(i + 1); + numeric = Integer.toString(Integer.parseInt(numeric) + 1); + + return alpha + numeric; + + } + + /** + * Gets all children of the specified container. + * + * @param aContainer the Container to be searched. + * @return A Collection containing all of the child components of the container. + */ + public static Collection getAllChildComponents(Container aContainer) { + Collection result = new ArrayList(); + addAllChildComponents(aContainer, result); + return result; + } + + /** + * Adds all children of the specified container to the specified collection. + * + * @param aContainer the Container to be searched. + * @param aCollection the Collection to which the child components will be + * added. + */ + protected static void addAllChildComponents(Container aContainer, Collection aCollection) { + Component c = null; + int count = aContainer.getComponentCount(); + for (int i = 0; i < count; i++) { + c = aContainer.getComponent(i); + aCollection.add(c); + if (c instanceof Container) { + addAllChildComponents((Container) c, aCollection); + } + } + } + + /** + * Sets each child component's tooltip to show the name generated from + * getComponentNameMap(). (We're doing this so the tooltip authors can know how + * to reference the components.) + * + * @param aContainer the Container whose components will be labeled. + */ + public static void labelComponents(Container aContainer) { + Map nameToComponent = getNameToComponentMap(aContainer); + Map nameToName = new HashMap(nameToComponent.size(), 1F); + Iterator it = nameToComponent.keySet().iterator(); + String key; + while (it.hasNext()) { + key = it.next().toString(); + nameToName.put(key, key); + } + labelComponents(aContainer, nameToName); + } + + /** + * Sets each child component's tooltip to show a given string retrieved from a + * map using the component's generated name as a key. + * + * @param aContainer the Container whose components will be labeled. + * @param aNameMap a Map of generated names to string values. + */ + public static void labelComponents(Container aContainer, Map aNameMap) { + if (aNameMap == null) + return; + + String key; + Object o; + Iterator it = aNameMap.keySet().iterator(); + Map nameToComponent = getNameToComponentMap(aContainer); + while (it.hasNext()) { + key = it.next().toString(); + o = nameToComponent.get(key); + if (o instanceof javax.swing.JComponent) { + ((javax.swing.JComponent) o).setToolTipText(aNameMap.get(key).toString()); + } + } + } + + /** + * Generates a deterministically unique name for each component in a container. + * The name is based on the name of the class of the component followed by a + * number. Each class of component is numbered based on it's position in the + * container, sorted from top to bottom and left to right. + * + * @param aContainer the Container whose components will named. + * @return a Map that maps each component to its name. + */ + public static Map getComponentToNameMap(Container aContainer) { + return getUniqueNameMap(getSortedChildComponents(aContainer)); + } + + /** + * Maps a deterministically unique name to a component in a container. The name + * is based on the name of the class of the component followed by a number. Each + * class of component is numbered based on it's position in the container, + * sorted from top to bottom and left to right. + * + * @param aContainer the Container whose components will named. + * @return a Map that maps each component to its name. + */ + public static Map getNameToComponentMap(Container aContainer) { + Map componentToName = getComponentToNameMap(aContainer); + Map result = new HashMap(componentToName.size(), 1F); + Iterator it = componentToName.keySet().iterator(); + Object key; + while (it.hasNext()) { + key = it.next(); + result.put(componentToName.get(key), key); + } + return result; + } + + /** + * Sets the tooltips of all components in a container to the respective names of + * those components. (We're using this so the tooltip authors can know how to + * reference the components.) + * + * @param aContainer the Container whose components will be labeled. + */ + public static void nameComponents(Container aContainer) { + nameComponents(aContainer, ""); + } + + protected static void nameComponents(Container aContainer, String path) { + Component c = null; + String className = null; + int index = 0; + int count = aContainer.getComponentCount(); + for (int i = 0; i < count; i++) { + c = aContainer.getComponent(i); + className = c.getClass().getName(); + className = className.substring(className.lastIndexOf('.') + 1); + System.out.println(path + className); + if (c instanceof javax.swing.JComponent) { + // ((javax.swing.JComponent)c).setToolTipText( path + className + " (" + + // c.getName() + ")" ); + ((javax.swing.JComponent) c).setToolTipText(c.getName()); + } + if (c instanceof Container) { + nameComponents((Container) c, path + className + "."); + } + } + } + + /** + * Sets the enabled state of a container and all of its components. + * + * @param aContainer the Container whose components will be enabled. + * @param isEnabled True if enabled, false id disabled. + */ + public static void enableComponents(Container aContainer, boolean isEnabled) { + Component c = null; + String className = null; + int index = 0; + int count = aContainer.getComponentCount(); + for (int i = 0; i < count; i++) { + c = aContainer.getComponent(i); + if (c instanceof Container) { + enableComponents((Container) c, isEnabled); + } else { + c.setEnabled(isEnabled); + } + } + aContainer.setEnabled(isEnabled); + } } /* - * $Log$ - * Revision 1.2 2006/02/18 23:19:05 cgruber - * Update imports and maven dependencies. + * $Log$ Revision 1.2 2006/02/18 23:19:05 cgruber Update imports and maven + * dependencies. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.2 2001/02/17 16:52:05 mpowers - * Changes in imports to support building with jdk1.1 collections. + * Revision 1.2 2001/02/17 16:52:05 mpowers Changes in imports to support + * building with jdk1.1 collections. * - * Revision 1.1.1.1 2000/12/21 15:51:55 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:51:55 mpowers Contributing wotonomy. * - * Revision 1.2 2000/12/20 16:25:46 michael - * Added log to all files. + * Revision 1.2 2000/12/20 16:25:46 michael Added log to all files. * * */ - |
