All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eu.hansolo.applefx.MacosComboBoxCell Maven / Gradle / Ivy

package eu.hansolo.applefx;

import eu.hansolo.applefx.tools.Helper;
import eu.hansolo.applefx.tools.MacosAccentColor;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.BooleanPropertyBase;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ObjectPropertyBase;
import javafx.css.PseudoClass;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.ListCell;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;


public class MacosComboBoxCell extends ListCell implements MacosControlWithAccentColor {
    private static final ImageView                        EMPTY_CHECK_MARK  = new ImageView(new Image(MacosComboBoxCell.class.getResourceAsStream("macos-checkmark-empty.png"), 10, 10, true, false));
    private static final ImageView                        BLACK_CHECK_MARK  = new ImageView(new Image(MacosComboBoxCell.class.getResourceAsStream("macos-checkmark-black.png"), 10, 10, true, false));
    private static final ImageView                        WHITE_CHECK_MARK  = new ImageView(new Image(MacosComboBoxCell.class.getResourceAsStream("macos-checkmark-white.png"), 10, 10, true, false));
    private static final PseudoClass                      DARK_PSEUDO_CLASS = PseudoClass.getPseudoClass("dark");
    private              BooleanProperty                  dark;
    private              ObjectProperty accentColor;


    // ******************** Constructors **************************************
    public MacosComboBoxCell(final MacosComboBox comboBox) {
        getStyleClass().add("macos-combo-box-cell");
        this.dark        = new BooleanPropertyBase(Helper.isDarkMode()) {
            @Override protected void invalidated() {
                pseudoClassStateChanged(DARK_PSEUDO_CLASS, get());
            }
            @Override public Object getBean() { return MacosComboBoxCell.this; }
            @Override public String getName() { return "dark"; }
        };
        this.accentColor = new ObjectPropertyBase<>(Helper.getMacosAccentColor()) {
            @Override protected void invalidated() { setStyle(isDark() ? new StringBuilder("-accent-color-dark: ").append(get().getDarkStyleClass()).append(";").toString() : new StringBuilder("-accent-color: ").append(get().getAquaStyleClass()).append(";").toString()); }
            @Override public Object getBean() { return MacosComboBoxCell.this; }
            @Override public String getName() { return "accentColor"; }
        };
        setGraphicTextGap(5);
        setContentDisplay(ContentDisplay.LEFT);

        comboBox.darkProperty().addListener((o, ov, nv) -> this.dark.set(nv));
        this.accentColor.bind(comboBox.accentColorProperty());
        pseudoClassStateChanged(DARK_PSEUDO_CLASS, comboBox.isDark());
    }


    // ******************** Methods *******************************************
    @Override public final boolean isDark() {
        return dark.get();
    }
    @Override public final void setDark(final boolean dark) { this.dark.set(dark); }
    @Override public final BooleanProperty darkProperty() { return dark; }

    @Override public MacosAccentColor getAccentColor() { return accentColor.get(); }
    @Override public void setAccentColor(final MacosAccentColor accentColor) { this.accentColor.set(accentColor); }
    @Override public ObjectProperty accentColorProperty() { return accentColor; }


    @Override protected void updateItem(final T item, final boolean empty) {
        super.updateItem(item, empty);

        if (empty || null == item) {
            setText(null);
            setGraphic(null);
        } else {
            setText(item.toString());
            setGraphic(isSelected() ? (isDark() ? WHITE_CHECK_MARK : BLACK_CHECK_MARK) : EMPTY_CHECK_MARK);
        }
    }

    @Override public String toString() {
        return getItem().toString();
    }


    // ******************** Style related *************************************
    @Override public String getUserAgentStylesheet() { return MacosComboBoxCell.class.getResource("apple.css").toExternalForm(); }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy