
org.fernice.reflare.ui.FlareComboBoxUI Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fernice-reflare Show documentation
Show all versions of fernice-reflare Show documentation
CSS integration through fernice-flare in Java Swing as a LookAndFeel
package org.fernice.reflare.ui;
import fernice.reflare.StyleHelper;
import fernice.reflare.StyledImageIcon;
import fernice.reflare.light.FButton;
import fernice.reflare.light.FLabel;
import fernice.reflare.light.FTextField;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import javax.swing.ComboBoxEditor;
import javax.swing.Icon;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicComboBoxEditor;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.ComboPopup;
import org.fernice.flare.selector.NonTSPseudoClass;
import org.fernice.reflare.Defaults;
import org.fernice.reflare.element.AWTComponentElement;
import org.fernice.reflare.element.ComboBoxElement;
import org.fernice.reflare.element.ComponentElement;
import org.fernice.reflare.element.StyleTreeElementLookup;
import org.fernice.reflare.element.StyleTreeHelper;
import org.fernice.reflare.meta.DefinedBy;
import org.fernice.reflare.meta.DefinedBy.Api;
import org.fernice.reflare.render.CellRendererPane;
import org.jetbrains.annotations.NotNull;
public class FlareComboBoxUI extends BasicComboBoxUI implements FlareUI {
@DefinedBy(Api.LOOK_AND_FEEL)
public static ComponentUI createUI(JComponent c) {
return new FlareComboBoxUI();
}
private ComponentElement element;
public FlareComboBoxUI() {
currentValuePane = new CellRendererPane();
}
@Override
protected void installDefaults() {
super.installDefaults();
element = new ComboBoxElement(comboBox);
squareButton = false;
padding = Defaults.INSETS_EMPTY;
UIDefaultsHelper.installDefaultProperties(this, comboBox);
comboBox.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
StyleTreeElementLookup.registerElement(comboBox, this);
}
@Override
protected void uninstallDefaults() {
StyleTreeElementLookup.deregisterElement(comboBox);
super.uninstallDefaults();
}
@Override
protected void installComponents() {
super.installComponents();
arrowButton.setFocusable(false);
}
@Override
protected LayoutManager createLayoutManager() {
return new FlareComboBoxLayout();
}
@Override
protected FButton createArrowButton() {
FButton button = new FButton();
button.setIcon(StyledImageIcon.fromResource("/reflare/icons/combobox.png"));
button.setCursor(Cursor.getDefaultCursor());
return button;
}
@Override
protected ComboBoxEditor createEditor() {
return new FlareComboBoxEditor();
}
@Override
public void paint(final Graphics graphics, JComponent component) {
element.paintBackground(graphics);
hasFocus = comboBox.hasFocus();
if (!comboBox.isEditable()) {
Rectangle r = rectangleForCurrentValue();
paintCurrentValue(graphics, r, hasFocus);
}
}
@Override
public void paintBorder(@NotNull final Component c, @NotNull final Graphics g) {
element.paintBorder(g);
}
@NotNull
@Override
public ComponentElement getElement() {
return element;
}
@Override
public Dimension getMinimumSize(JComponent c) {
if (!isMinimumSizeDirty) {
return new Dimension(cachedMinimumSize);
}
Dimension size = getDisplaySize();
Insets insets = getInsets();
//calculate the width and height of the button
int buttonHeight = size.height + insets.top + insets.bottom;
int buttonWidth = squareButton ? buttonHeight : arrowButton.getPreferredSize().width;
//adjust the size based on the button width
size.height += insets.top + insets.bottom;
size.width += insets.left + insets.right + buttonWidth;
cachedMinimumSize.setSize(size.width, size.height);
isMinimumSizeDirty = false;
return new Dimension(size);
}
@Override
protected Dimension getDisplaySize() {
Dimension size = super.getDisplaySize();
currentValuePane.removeAll();
return size;
}
@Override
protected Dimension getDefaultSize() {
FlareComboBoxRenderer renderer = new FlareComboBoxRenderer();
Dimension size = getSizeForComponent(renderer.getListCellRendererComponent(listBox, " ", -1, false, false));
currentValuePane.removeAll();
return size;
}
@Override
protected Dimension getSizeForComponent(Component comp) {
StyleHelper.getClasses(comp).remove("flr-list-cell");
if (comp.getParent() != currentValuePane) {
currentValuePane.add(comp);
}
return comp.getPreferredSize();
}
// Prevents any background from being painted apart from our CSS Background
@Override
public void paintCurrentValue(Graphics g, Rectangle bounds, boolean hasFocus) {
ListCellRenderer
© 2015 - 2025 Weber Informatics LLC | Privacy Policy