package com.revivius.nb.darcula.ui;
import java.awt.Color;
import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicToolBarUI;
import org.netbeans.swing.plaf.LFCustoms;
/**
* A ToolBarUI that installs a ChangeListener on buttons to enable rollover for
* JButtons and JToggleButtons.
*
* @author Revivius
*/
public class RolloverToolBarUI extends BasicToolBarUI {
private static final String LISTENER_KEY = "ToolbarUI.ListenerKey";
private static final ChangeListener LISTENER = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
AbstractButton b = (AbstractButton) e.getSource();
boolean rollover = b.getModel().isRollover();
b.setContentAreaFilled(rollover || b.getModel().isSelected());
b.setBorderPainted(rollover);
}
};
// #24
// o.openide.awt.ToolbarWithOverflow
private static final PropertyChangeListener BORDER_UPDATER = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
JComponent src = (JComponent) evt.getSource();
Border border = src.getBorder();
if (border instanceof LineBorder) {
LineBorder lb = (LineBorder) border;
if (lb.getThickness() == 1 && Color.LIGHT_GRAY.equals(lb.getLineColor())) {
src.setBorder(BorderFactory.createLineBorder(UIManager.getColor(LFCustoms.SCROLLPANE_BORDER_COLOR)));
}
}
}
};
public static ComponentUI createUI(JComponent c) {
return new RolloverToolBarUI();
}
@Override
public void installUI(JComponent c) {
super.installUI(c);
// #24
if ("overflowToolbar".equals(toolBar.getName())) {
toolBar.addPropertyChangeListener("border", BORDER_UPDATER);
}
}
@Override
protected void uninstallDefaults() {
super.uninstallDefaults();
// #24
if ("overflowToolbar".equals(toolBar.getName())) {
toolBar.removePropertyChangeListener("border", BORDER_UPDATER);
}
}
@Override
protected void setBorderToNonRollover(Component c) {
if (c instanceof AbstractButton) {
AbstractButton b = (AbstractButton) c;
configureButton(b);
}
}
@Override
protected void setBorderToRollover(Component c) {
if (c instanceof AbstractButton) {
AbstractButton b = (AbstractButton) c;
configureButton(b);
}
}
@Override
protected void setBorderToNormal(Component c) {
if (c instanceof AbstractButton) {
AbstractButton b = (AbstractButton) c;
b.setBorderPainted(true);
b.setContentAreaFilled(true);
b.setRolloverEnabled(false);
uninstallListener(b);
}
}
private void configureButton(AbstractButton b) {
b.setBorderPainted(false);
b.setContentAreaFilled(false);
b.setRolloverEnabled(true);
installListener(b);
}
private void installListener(AbstractButton b) {
Object o = b.getClientProperty(LISTENER_KEY);
if (o == null) {
b.addChangeListener(LISTENER);
LISTENER.stateChanged(new ChangeEvent(b));
}
}
private void uninstallListener(AbstractButton b) {
Object o = b.getClientProperty(LISTENER_KEY);
if (o != null) {
b.addChangeListener(LISTENER);
}
}
}