Swing JFC Java

/*
** Salsa - Swing Add-On Suite
** Copyright (c) 2001, 2002 by Gerald Bauer
**
** This program is free software.
**
** You may redistribute it and/or modify it under the terms of the GNU
** General Public License as published by the Free Software Foundation.
** Version 2 of the license should be included with this distribution in
** the file LICENSE, as well as License.html. If the license is not
** included with this distribution, you may find a copy at the FSF web
** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the
** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA.
**
** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND,
** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR
** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY
** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR
** REDISTRIBUTION OF THIS SOFTWARE.
**
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
public class ColorMenu extends JMenu
{
   Border _activeBorder;
   Map _colorPanes;
   Border _selectedBorder;
   ColorPane _selectedColorPane;
   Border _unselectedBorder;
   public ColorMenu( String name )
   {
      super( name );
      _unselectedBorder = new CompoundBorder(
            new MatteBorder( 1, 1, 1, 1, getBackground() ),
            new BevelBorder( BevelBorder.LOWERED, Color.WHITE, Color.GRAY ) );
      _selectedBorder = new CompoundBorder(
            new MatteBorder( 2, 2, 2, 2, Color.RED ),
            new MatteBorder( 1, 1, 1, 1, getBackground() ) );
      _activeBorder = new CompoundBorder(
            new MatteBorder( 2, 2, 2, 2, Color.BLUE ),
            new MatteBorder( 1, 1, 1, 1, getBackground() ) );
      JPanel p = new JPanel();
      p.setBorder( new EmptyBorder( 5, 5, 5, 5 ) );
      p.setLayout( new GridLayout( 8, 8 ) );
      _colorPanes = new HashMap();
      int values[] = new int[]{0, 128, 192, 255};
      for( int r = 0; r < values.length; r++ )
         for( int g = 0; g < values.length; g++ )
            for( int b = 0; b < values.length; b++ )
            {
               Color color = new Color( values[r], values[g], values[b] );
               ColorPane colorPane = new ColorPane( color );
               p.add( colorPane );
               _colorPanes.put( color, colorPane );
            }
      add( p );
   }
   public void setColor( Color c )
   {
      Object obj = _colorPanes.get( c );
      if( obj == null )
         return;
      if( _selectedColorPane != null )
         _selectedColorPane.setSelected( false );
      _selectedColorPane = ( ColorPane ) obj;
      _selectedColorPane.setSelected( true );
   }
   public Color getColor()
   {
      if( _selectedColorPane == null )
         return null;
      return _selectedColorPane.getColor();
   }
   public void doSelection()
   {
      fireActionPerformed( new ActionEvent( this,
            ActionEvent.ACTION_PERFORMED, getActionCommand() ) );
   }
   class ColorPane extends JPanel implements MouseListener
   {
      Color _color;
      boolean _isSelected;
      public ColorPane( Color color )
      {
         _color = color;
         setBackground( color );
         setBorder( _unselectedBorder );
         String msg = "rgb( " + color.getRed() + ", "
                + color.getGreen() + ", "
                + color.getBlue() + " )";
         setToolTipText( msg );
         addMouseListener( this );
      }
      public void setSelected( boolean isSelected )
      {
         _isSelected = isSelected;
         if( _isSelected )
            setBorder( _selectedBorder );
         else
            setBorder( _unselectedBorder );
      }
      public Color getColor()
      {
         return _color;
      }
      public Dimension getMaximumSize()
      {
         return getPreferredSize();
      }
      public Dimension getMinimumSize()
      {
         return getPreferredSize();
      }
      public Dimension getPreferredSize()
      {
         return new Dimension( 15, 15 );
      }
      public boolean isSelected()
      {
         return _isSelected;
      }
      public void mouseClicked( MouseEvent ev ) { }
      public void mouseEntered( MouseEvent ev )
      {
         setBorder( _activeBorder );
      }
      public void mouseExited( MouseEvent ev )
      {
         setBorder( _isSelected ? _selectedBorder : _unselectedBorder );
      }
      public void mousePressed( MouseEvent ev ) { }
      public void mouseReleased( MouseEvent ev )
      {
         setColor( _color );
         MenuSelectionManager.defaultManager().clearSelectedPath();
         doSelection();
      }
   }
}