187 lines
7.4 KiB
Java
187 lines
7.4 KiB
Java
/*
|
|
* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved.
|
|
*
|
|
* JTattoo is multiple licensed. If your are an open source developer you can use
|
|
* it under the terms and conditions of the GNU General Public License version 2.0
|
|
* or later as published by the Free Software Foundation.
|
|
*
|
|
* see: gpl-2.0.txt
|
|
*
|
|
* If you pay for a license you will become a registered user who could use the
|
|
* software under the terms and conditions of the GNU Lesser General Public License
|
|
* version 2.0 or later with classpath exception as published by the Free Software
|
|
* Foundation.
|
|
*
|
|
* see: lgpl-2.0.txt
|
|
* see: classpath-exception.txt
|
|
*
|
|
* Registered users could also use JTattoo under the terms and conditions of the
|
|
* Apache License, Version 2.0 as published by the Apache Software Foundation.
|
|
*
|
|
* see: APACHE-LICENSE-2.0.txt
|
|
*/
|
|
|
|
package com.jtattoo.plaf;
|
|
|
|
import java.awt.*;
|
|
import java.awt.event.FocusEvent;
|
|
import java.awt.event.FocusListener;
|
|
import java.beans.PropertyChangeEvent;
|
|
import java.beans.PropertyChangeListener;
|
|
import javax.swing.*;
|
|
import javax.swing.border.Border;
|
|
import javax.swing.plaf.ComponentUI;
|
|
import javax.swing.plaf.UIResource;
|
|
import javax.swing.plaf.basic.BasicComboBoxUI;
|
|
|
|
public class BaseComboBoxUI extends BasicComboBoxUI {
|
|
|
|
private PropertyChangeListener propertyChangeListener = null;
|
|
private FocusListener focusListener = null;
|
|
private Border orgBorder = null;
|
|
private Color orgBackgroundColor = null;
|
|
|
|
public static ComponentUI createUI(JComponent c) {
|
|
return new BaseComboBoxUI();
|
|
}
|
|
|
|
public void installUI(JComponent c) {
|
|
super.installUI(c);
|
|
comboBox.setRequestFocusEnabled(true);
|
|
if (comboBox.getEditor() != null) {
|
|
if (comboBox.getEditor().getEditorComponent() instanceof JTextField) {
|
|
((JTextField) (comboBox.getEditor().getEditorComponent())).setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void installListeners() {
|
|
super.installListeners();
|
|
propertyChangeListener = new PropertyChangeHandler();
|
|
comboBox.addPropertyChangeListener(propertyChangeListener);
|
|
|
|
if (AbstractLookAndFeel.getTheme().doShowFocusFrame()) {
|
|
focusListener = new FocusListener() {
|
|
|
|
public void focusGained(FocusEvent e) {
|
|
if (comboBox != null) {
|
|
orgBorder = comboBox.getBorder();
|
|
orgBackgroundColor = comboBox.getBackground();
|
|
LookAndFeel laf = UIManager.getLookAndFeel();
|
|
if (laf instanceof AbstractLookAndFeel) {
|
|
if (orgBorder instanceof UIResource) {
|
|
Border focusBorder = ((AbstractLookAndFeel)laf).getBorderFactory().getFocusFrameBorder();
|
|
comboBox.setBorder(focusBorder);
|
|
}
|
|
Color backgroundColor = AbstractLookAndFeel.getTheme().getFocusBackgroundColor();
|
|
comboBox.setBackground(backgroundColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void focusLost(FocusEvent e) {
|
|
if (comboBox != null) {
|
|
if (orgBorder instanceof UIResource) {
|
|
comboBox.setBorder(orgBorder);
|
|
}
|
|
comboBox.setBackground(orgBackgroundColor);
|
|
}
|
|
}
|
|
};
|
|
comboBox.addFocusListener(focusListener);
|
|
}
|
|
}
|
|
|
|
protected void uninstallListeners() {
|
|
comboBox.removePropertyChangeListener(propertyChangeListener);
|
|
comboBox.removeFocusListener(focusListener);
|
|
propertyChangeListener = null;
|
|
focusListener = null;
|
|
super.uninstallListeners();
|
|
}
|
|
|
|
public Dimension getPreferredSize(JComponent c) {
|
|
Dimension size = super.getPreferredSize(c);
|
|
if (comboBox.getGraphics() != null) {
|
|
FontMetrics fm = JTattooUtilities.getFontMetrics(comboBox, comboBox.getGraphics(), comboBox.getFont());
|
|
size.height = fm.getHeight() + 2;
|
|
if (UIManager.getLookAndFeel() instanceof AbstractLookAndFeel) {
|
|
AbstractLookAndFeel laf = (AbstractLookAndFeel)UIManager.getLookAndFeel();
|
|
size.height = Math.max(size.height, laf.getIconFactory().getDownArrowIcon().getIconHeight() + 2);
|
|
}
|
|
}
|
|
return new Dimension(size.width + 2, size.height + 2);
|
|
}
|
|
|
|
public JButton createArrowButton() {
|
|
JButton button = new ArrowButton();
|
|
if (JTattooUtilities.isLeftToRight(comboBox)) {
|
|
Border border = BorderFactory.createMatteBorder(0, 1, 0, 0, AbstractLookAndFeel.getFrameColor());
|
|
button.setBorder(border);
|
|
} else {
|
|
Border border = BorderFactory.createMatteBorder(0, 0, 0, 1, AbstractLookAndFeel.getFrameColor());
|
|
button.setBorder(border);
|
|
}
|
|
return button;
|
|
}
|
|
|
|
protected void setButtonBorder() {
|
|
if (JTattooUtilities.isLeftToRight(comboBox)) {
|
|
Border border = BorderFactory.createMatteBorder(0, 1, 0, 0, AbstractLookAndFeel.getFrameColor());
|
|
arrowButton.setBorder(border);
|
|
} else {
|
|
Border border = BorderFactory.createMatteBorder(0, 0, 0, 1, AbstractLookAndFeel.getFrameColor());
|
|
arrowButton.setBorder(border);
|
|
}
|
|
}
|
|
|
|
public class PropertyChangeHandler implements PropertyChangeListener {
|
|
|
|
public void propertyChange(PropertyChangeEvent e) {
|
|
String name = e.getPropertyName();
|
|
if (name.equals("componentOrientation")) {
|
|
setButtonBorder();
|
|
}
|
|
}
|
|
}
|
|
//-----------------------------------------------------------------------------
|
|
|
|
public static class ArrowButton extends NoFocusButton {
|
|
|
|
public void paint(Graphics g) {
|
|
Dimension size = getSize();
|
|
Color colors[];
|
|
if (isEnabled()) {
|
|
if (getModel().isArmed() && getModel().isPressed()) {
|
|
colors = AbstractLookAndFeel.getTheme().getPressedColors();
|
|
} else if (getModel().isRollover()) {
|
|
colors = AbstractLookAndFeel.getTheme().getRolloverColors();
|
|
} else {
|
|
colors = AbstractLookAndFeel.getTheme().getButtonColors();
|
|
}
|
|
} else {
|
|
colors = AbstractLookAndFeel.getTheme().getDisabledColors();
|
|
}
|
|
JTattooUtilities.fillHorGradient(g, colors, 0, 0, size.width, size.height);
|
|
|
|
boolean inverse = ColorHelper.getGrayValue(colors) < 128;
|
|
|
|
Icon icon = inverse ? BaseIcons.getComboBoxInverseIcon() : BaseIcons.getComboBoxIcon();
|
|
int x = (size.width - icon.getIconWidth()) / 2;
|
|
int y = (size.height - icon.getIconHeight()) / 2;
|
|
|
|
Graphics2D g2D = (Graphics2D) g;
|
|
Composite savedComposite = g2D.getComposite();
|
|
g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
|
|
if (getModel().isPressed() && getModel().isArmed()) {
|
|
icon.paintIcon(this, g, x + 2, y + 1);
|
|
} else {
|
|
icon.paintIcon(this, g, x + 1, y);
|
|
}
|
|
g2D.setComposite(savedComposite);
|
|
paintBorder(g2D);
|
|
|
|
}
|
|
}
|
|
}
|