/* * Copyright (c) 2005-2010 Flamingo Kirill Grouchnikov. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * o Neither the name of Flamingo Kirill Grouchnikov nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.pushingpixels.flamingo.internal.ui.common.popup; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.ComponentUI; import org.pushingpixels.flamingo.api.common.popup.PopupPanelManager; import org.pushingpixels.trident.Timeline; import org.pushingpixels.trident.swing.SwingRepaintCallback; /** * Basic UI for color selector component {@link JColorSelectorComponent}. * * @author Kirill Grouchnikov */ public class BasicColorSelectorComponentUI extends ColorSelectorComponentUI { protected JColorSelectorComponent colorSelectorComponent; protected ButtonModel buttonModel; protected MouseListener mouseListener; protected ChangeListener modelChangeListener; protected ActionListener actionListener; protected Timeline rolloverTimeline; protected float rollover; /* * (non-Javadoc) * * @see javax.swing.plaf.ComponentUI#createUI(javax.swing.JComponent) */ public static ComponentUI createUI(JComponent c) { return new BasicColorSelectorComponentUI(); } /* * (non-Javadoc) * * @see javax.swing.plaf.ComponentUI#installUI(javax.swing.JComponent) */ @Override public void installUI(JComponent c) { this.colorSelectorComponent = (JColorSelectorComponent) c; this.buttonModel = new DefaultButtonModel(); installDefaults(); installComponents(); installListeners(); } /* * (non-Javadoc) * * @see javax.swing.plaf.ComponentUI#uninstallUI(javax.swing.JComponent) */ @Override public void uninstallUI(JComponent c) { uninstallListeners(); uninstallComponents(); uninstallDefaults(); c.setLayout(null); this.colorSelectorComponent = null; } /** * Installs listeners on the associated color selector component. */ protected void installListeners() { this.mouseListener = new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { if (!buttonModel.isRollover()) { colorSelectorComponent .onColorRollover(colorSelectorComponent.getColor()); rolloverTimeline.play(); } buttonModel.setRollover(true); } @Override public void mouseExited(MouseEvent e) { if (buttonModel.isRollover()) { colorSelectorComponent.onColorRollover(null); rolloverTimeline.playReverse(); } buttonModel.setRollover(false); } @Override public void mousePressed(MouseEvent e) { buttonModel.setArmed(true); buttonModel.setPressed(true); } @Override public void mouseReleased(MouseEvent e) { buttonModel.setPressed(false); buttonModel.setArmed(false); } }; this.colorSelectorComponent.addMouseListener(this.mouseListener); this.modelChangeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { colorSelectorComponent.repaint(); } }; this.buttonModel.addChangeListener(this.modelChangeListener); this.actionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { colorSelectorComponent.onColorSelected(colorSelectorComponent .getColor()); PopupPanelManager.defaultManager().hidePopups(null); } }; this.buttonModel.addActionListener(this.actionListener); } /** * Uninstalls listeners from the associated color selector component. */ protected void uninstallListeners() { this.buttonModel.removeActionListener(this.actionListener); this.actionListener = null; this.buttonModel.removeChangeListener(this.modelChangeListener); this.modelChangeListener = null; this.colorSelectorComponent.removeMouseListener(this.mouseListener); this.mouseListener = null; } /** * Installs defaults on the associated color selector component. */ protected void installDefaults() { this.rolloverTimeline = new Timeline(this); this.rolloverTimeline.addPropertyToInterpolate("rollover", 0.0f, 1.0f); this.rolloverTimeline.addCallback(new SwingRepaintCallback( this.colorSelectorComponent)); this.rolloverTimeline.setDuration(150); } /** * Uninstalls defaults from the associated color selector component. */ protected void uninstallDefaults() { } /** * Installs subcomponents on the associated color selector component. */ protected void installComponents() { } /** * Uninstalls subcomponents from the associated color selector component. */ protected void uninstallComponents() { } public void setRollover(float rollover) { this.rollover = rollover; } @Override public void update(Graphics g, JComponent c) { int w = this.colorSelectorComponent.getWidth(); int h = this.colorSelectorComponent.getHeight(); Graphics2D g2d = (Graphics2D) g.create(); Color fillColor = this.colorSelectorComponent.getColor(); g2d.setColor(fillColor); g2d.fillRect(0, 0, w, h); float[] hsb = new float[3]; Color.RGBtoHSB(fillColor.getRed(), fillColor.getGreen(), fillColor .getBlue(), hsb); float brightness = hsb[2] * 0.7f; g2d.setColor(new Color(brightness, brightness, brightness)); int ty = this.colorSelectorComponent.isTopOpen() ? 1 : 0; int by = this.colorSelectorComponent.isBottomOpen() ? 1 : 0; g2d.drawRect(0, -ty, w - 1, h - 1 + ty + by); if (this.rollover > 0.0f) { g2d.setComposite(AlphaComposite.SrcOver.derive(this.rollover)); g2d.setColor(new Color(207, 186, 115)); g2d.drawRect(0, 0, w - 1, h - 1); g2d.setColor(new Color(230, 212, 150)); g2d.drawRect(1, 1, w - 3, h - 3); } g2d.dispose(); } }