Listing of Source client/RCONSOLE_COLORCHOOSER.java
package cuserwin2;

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JColorChooser;
import javax.swing.colorchooser.ColorSelectionModel;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import se.entra.phantom.client.PJUserWindow;
import se.entra.phantom.client.CUserWindow;
import se.entra.phantom.client.AEvent;
import se.entra.phantom.common.Transaction;
import se.entra.phantom.common.NetPhantomConstants;

/**
 * This user window let the user select color from a color scheme. The window is
 * based on the swing class JColorChooser.
 */
@SuppressWarnings("serial")
public class RCONSOLE_COLORCHOOSER extends PJUserWindow implements ChangeListener
{
  /**
   * The color chooser.
   */
  private final JColorChooser colorChooser = new JColorChooser();

  /**
   * Currently selected/created color.
   */
  private Color currentColor;

  /**
   * The base user window control.
   */
  private CUserWindow uw;
  
  ///

  /**
   * Creates the user window that let user select RGB color.
   */
  public RCONSOLE_COLORCHOOSER(CUserWindow uw,byte [] data)
    {
    super(uw,data);
    this.uw=uw;
    }

  /**
   * Create/initiate color chooser from transaction.
   */
  @Override
  public void create(Transaction trans)
    {
    // Layout color chooser.
    setLayout(new BorderLayout());
    add(BorderLayout.CENTER,colorChooser);

    // Set current color from transaction.
    setColor(trans);

    // Get notifications when user selects new color.
    ColorSelectionModel defaultModel=colorChooser.getSelectionModel();
    defaultModel.addChangeListener(this);
    }

  /**
   * Update color chooser from transaction.
   */
  @Override
  public void update(Transaction trans)
    {
    // Set current color from transaction.
    setColor(trans);
    }

  /**
   * Notify server of selected color (if changed).
   */
  @Override
  public void issueUpdate(Transaction trans)
    {
    // Notify server of new selection.
    Color color=colorChooser.getColor();
    if ( !color.equals(currentColor) )
      {
      currentColor=color;
      trans.appendString(Integer.toString(color.getRGB()));
      }
    }

  /**
   * Set color from RGB create/update transaction.
   */
  private void setColor(Transaction trans)
    {
    // Create new color from RGB string value
    currentColor=new Color(Integer.parseInt(trans.readString()));
    colorChooser.setColor(currentColor);
    }

  /**
   * We can handle focus.
   */
  @Override
  public boolean isFocusTraversable()
    {
    return true;
    }

  // PropertyChangeListener interface

  /**
   * Get a notification when a colorChooser property has changed.
   */
  public void stateChanged(ChangeEvent e)
    {
    Color color=colorChooser.getColor();
    if ( !color.equals(currentColor) )
      {
      // Notify server.
      AEvent.sendUserWindowEvent(uw,NetPhantomConstants.EVENT_SELECT,false,true,null);
      }
    }
}