/* BasicColorChooserUI.java --
   Copyright (C) 2004, 2005 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package javax.swing.plaf.basic;

import java.awt.BorderLayout;
import java.awt.Container;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.LookAndFeel;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import javax.swing.colorchooser.ColorChooserComponentFactory;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.ColorChooserUI;
import javax.swing.plaf.ComponentUI;

/**
 * This is the UI Class for the JColorChooser in the Basic Look and Feel.
 */
public class BasicColorChooserUI extends ColorChooserUI
{
  /**
   * This helper class handles property changes from the JColorChooser.
   */
  public class PropertyHandler implements PropertyChangeListener
  {
    /**
     * This method is called when any of the properties of the JColorChooser
     * change.
     *
     * @param e The PropertyChangeEvent.
     */
    public void propertyChange(PropertyChangeEvent e)
    {
      if (e.getPropertyName() == JColorChooser.CHOOSER_PANELS_PROPERTY)
	makeTabs(chooser.getChooserPanels());
      else if (e.getPropertyName() == JColorChooser.PREVIEW_PANEL_PROPERTY)
	updatePreviewPanel(chooser.getPreviewPanel());
      else if (e.getPropertyName() == JColorChooser.SELECTION_MODEL_PROPERTY)
	((AbstractColorChooserPanel) pane.getSelectedComponent())
	.updateChooser();

      chooser.repaint();
    }
  }

  /**
   * This is a helper class that listens to the Model of the JColorChooser for
   * color change events so it can update the preview panel.
   */
  private class PreviewListener implements ChangeListener
  {
    /**
     * This method is called whenever the JColorChooser's color changes.
     *
     * @param e The ChangeEvent.
     */
    public void stateChanged(ChangeEvent e)
    {
      if (pane != null)
        {
	  AbstractColorChooserPanel panel = (AbstractColorChooserPanel) pane
	                                    .getSelectedComponent();
	  if (panel != null)
	    panel.updateChooser();
        }
      chooser.repaint();
    }
  }

  /**
   * This helper class listens to the JTabbedPane that is used for tab
   * changes.
   */
  private class TabPaneListener implements ChangeListener
  {
    /**
     * This method is called whenever a different tab is selected in the
     * JTabbedPane.
     *
     * @param e The ChangeEvent.
     */
    public void stateChanged(ChangeEvent e)
    {
      // Need to do this because we don't update all the tabs when they're not
      // visible, so they are not informed of new colors when they're hidden.
      AbstractColorChooserPanel comp = (AbstractColorChooserPanel) pane
                                       .getSelectedComponent();
      comp.updateChooser();
    }
  }

  /** An array of default choosers to use in the JColorChooser. */
  protected AbstractColorChooserPanel[] defaultChoosers;

  /** The listener for the preview panel. */
  protected ChangeListener previewListener;

  /** The PropertyChangeListener for the JColorChooser. */
  protected PropertyChangeListener propertyChangeListener;

  /**
   * The JColorChooser this is installed on.
   */
  protected JColorChooser chooser;

  /** The JTabbedPane that is used. */
  JTabbedPane pane;

  /** The Container that holds the preview panel. */
  private Container prevContainer;

  /**
   * Creates a new BasicColorChooserUI object.
   */
  public BasicColorChooserUI()
  {
    super();
  }

  /**
   * This method creates a new UI Component for the given JComponent.
   *
   * @param c The JComponent to create an UI for.
   *
   * @return A new BasicColorChooserUI.
   */
  public static ComponentUI createUI(JComponent c)
  {
    return new BasicColorChooserUI();
  }

  /**
   * This method creates the default chooser panels for the JColorChooser.
   *
   * @return The default chooser panels.
   */
  protected AbstractColorChooserPanel[] createDefaultChoosers()
  {
    return ColorChooserComponentFactory.getDefaultChooserPanels();
  }

  /**
   * This method installs the UI Component for the given JComponent.
   *
   * @param c The JComponent to install this UI for.
   */
  public void installUI(JComponent c)
  {
    if (c instanceof JColorChooser)
      {
	chooser = (JColorChooser) c;
	chooser.setLayout(new BorderLayout());

	// Do this first, so we avoid doing work for property change events.
	defaultChoosers = createDefaultChoosers();
	chooser.setChooserPanels(defaultChoosers);
	pane = new JTabbedPane();

	pane.addChangeListener(new ChangeListener()
	    {
	      public void stateChanged(ChangeEvent e)
	      {
		pane.repaint();
	      }
	    });

	makeTabs(defaultChoosers);

	chooser.add(pane, BorderLayout.NORTH);

	installPreviewPanel();

	installDefaults();
	installListeners();
      }
  }

  /**
   * This method adds tabs to the JTabbedPane for the chooserPanels defined in
   * the JColorChooser.
   * This is package-private to avoid an accessor method.
   *
   * @param panels The Panels that need tabs to be made for them.
   */
  void makeTabs(AbstractColorChooserPanel[] panels)
  {
    pane.removeAll();
    for (int i = 0; i < panels.length; i++)
      pane.addTab(panels[i].getDisplayName(), panels[i].getSmallDisplayIcon(),
                  panels[i]);
  }

  /**
   * This method uninstalls this UI for the given JComponent.
   *
   * @param c The JComponent that will have this UI removed.
   */
  public void uninstallUI(JComponent c)
  {
    uninstallListeners();
    uninstallDefaults();
    uninstallDefaultChoosers();

    pane = null;
    chooser = null;
  }

  /**
   * Uninstalls the default color choosers that have been installed by this UI.
   */
  protected void uninstallDefaultChoosers()
  {
    defaultChoosers = null;
  }

  /**
   * This method installs the preview panel for the JColorChooser.
   */
  protected void installPreviewPanel()
  {
    updatePreviewPanel(ColorChooserComponentFactory.getPreviewPanel());
  }

  /**
   * This is a helper method that swaps the existing preview panel with the
   * given panel.
   * This is package-private to avoid an accessor method.
   *
   * @param preview The new preview panel.
   */
  void updatePreviewPanel(JComponent preview)
  {
    if (prevContainer == null)
      {
	prevContainer = new JPanel();
	prevContainer.setLayout(new BorderLayout());
	chooser.add(prevContainer, BorderLayout.CENTER);
      }
    prevContainer.removeAll();
    prevContainer.add(preview, BorderLayout.CENTER);
  }

  /**
   * This method installs the default properties given by the Basic Look and
   * Feel.
   */
  protected void installDefaults()
  {
    LookAndFeel.installColorsAndFont(chooser, "ColorChooser.background",
                                     "ColorChooser.foreground",
                                     "ColorChooser.font");
  }

  /**
   * This method uninstalls the default properties given by the Basic Look and
   * Feel.
   */
  protected void uninstallDefaults()
  {
    chooser.setBackground(null);
    chooser.setForeground(null);
    chooser.setFont(null);
  }

  /**
   * This method installs any listeners required for this UI to function.
   */
  protected void installListeners()
  {
    propertyChangeListener = createPropertyChangeListener();
    previewListener = new PreviewListener();

    chooser.addPropertyChangeListener(propertyChangeListener);
    chooser.getSelectionModel().addChangeListener(previewListener);

    pane.addChangeListener(new TabPaneListener());
  }

  /**
   * This method creates the PropertyChangeListener used for listening to the
   * JColorChooser.
   *
   * @return A PropertyChangeListener.
   */
  protected PropertyChangeListener createPropertyChangeListener()
  {
    return new PropertyHandler();
  }

  /**
   * This method uninstalls any listeners that were previously installed by
   * the UI.
   */
  protected void uninstallListeners()
  {
    chooser.removePropertyChangeListener(propertyChangeListener);
    chooser.getSelectionModel().removeChangeListener(previewListener);

    previewListener = null;
    propertyChangeListener = null;
  }
}
