BasicColorChooserUI.java [plain text]
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.UIDefaults;
import javax.swing.UIManager;
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;
public class BasicColorChooserUI extends ColorChooserUI
{
public class PropertyHandler implements PropertyChangeListener
{
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();
}
}
private class PreviewListener implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
if (pane != null)
{
AbstractColorChooserPanel panel = (AbstractColorChooserPanel) pane
.getSelectedComponent();
if (panel != null)
panel.updateChooser();
}
chooser.repaint();
}
}
private class TabPaneListener implements ChangeListener
{
public void stateChanged(ChangeEvent e)
{
AbstractColorChooserPanel comp = (AbstractColorChooserPanel) pane
.getSelectedComponent();
comp.updateChooser();
}
}
protected AbstractColorChooserPanel[] defaultChoosers;
protected ChangeListener previewListener;
protected PropertyChangeListener propertyChangeListener;
private JColorChooser chooser;
private JTabbedPane pane;
private Container prevContainer;
public BasicColorChooserUI()
{
super();
}
public static ComponentUI createUI(JComponent c)
{
return new BasicColorChooserUI();
}
protected AbstractColorChooserPanel[] createDefaultChoosers()
{
return ColorChooserComponentFactory.getDefaultChooserPanels();
}
public void installUI(JComponent c)
{
if (c instanceof JColorChooser)
{
chooser = (JColorChooser) c;
chooser.setLayout(new BorderLayout());
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();
}
}
private void makeTabs(AbstractColorChooserPanel[] panels)
{
pane.removeAll();
for (int i = 0; i < panels.length; i++)
pane.addTab(panels[i].getDisplayName(), panels[i].getSmallDisplayIcon(),
panels[i]);
}
public void uninstallUI(JComponent c)
{
uninstallListeners();
uninstallDefaults();
pane = null;
chooser = null;
}
protected void installPreviewPanel()
{
updatePreviewPanel(ColorChooserComponentFactory.getPreviewPanel());
}
private 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);
}
protected void installDefaults()
{
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
chooser.setFont(defaults.getFont("ColorChooser.font"));
chooser.setForeground(defaults.getColor("ColorChooser.foreground"));
chooser.setBackground(defaults.getColor("ColorChooser.background"));
}
protected void uninstallDefaults()
{
chooser.setBackground(null);
chooser.setForeground(null);
chooser.setFont(null);
}
protected void installListeners()
{
propertyChangeListener = createPropertyChangeListener();
previewListener = new PreviewListener();
chooser.addPropertyChangeListener(propertyChangeListener);
chooser.getSelectionModel().addChangeListener(previewListener);
pane.addChangeListener(new TabPaneListener());
}
protected PropertyChangeListener createPropertyChangeListener()
{
return new PropertyHandler();
}
protected void uninstallListeners()
{
chooser.removePropertyChangeListener(propertyChangeListener);
chooser.getSelectionModel().removeChangeListener(previewListener);
previewListener = null;
propertyChangeListener = null;
}
}