Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
251 changes: 156 additions & 95 deletions HMCL/src/main/java/com/jfoenix/controls/JFXComboBox.java

Large diffs are not rendered by default.

184 changes: 91 additions & 93 deletions HMCL/src/main/java/com/jfoenix/controls/JFXPasswordField.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,23 @@

package com.jfoenix.controls;

import com.jfoenix.skins.JFXPasswordFieldSkin;
import com.jfoenix.controls.base.IFXLabelFloatControl;
import com.jfoenix.skins.JFXTextFieldSkin;
import com.jfoenix.validation.base.ValidatorBase;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.css.*;
import javafx.css.converter.BooleanConverter;
import javafx.css.converter.PaintConverter;
import javafx.scene.control.Control;
import javafx.scene.control.PasswordField;
import javafx.scene.control.Skin;
import javafx.scene.control.TextField;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import org.jackhuang.hmcl.ui.FXUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import static org.jackhuang.hmcl.ui.FXUtils.useJFXContextMenu;

/**
* JFXPasswordField is the material design implementation of a password Field.
Expand All @@ -49,7 +44,7 @@
* @version 1.0
* @since 2016-03-09
*/
public class JFXPasswordField extends PasswordField {
public class JFXPasswordField extends PasswordField implements IFXLabelFloatControl {

/**
* {@inheritDoc}
Expand All @@ -63,162 +58,166 @@ public JFXPasswordField() {
*/
@Override
protected Skin<?> createDefaultSkin() {
return new JFXPasswordFieldSkin(this);
return new JFXTextFieldSkin<>(this);
}

private void initialize() {
this.getStyleClass().add(DEFAULT_STYLE_CLASS);
if ("dalvik".equals(System.getProperty("java.vm.name").toLowerCase(Locale.ROOT))) {
this.setStyle("-fx-skin: \"com.jfoenix.android.skins.JFXPasswordFieldSkinAndroid\";");
}


useJFXContextMenu(this);
FXUtils.useJFXContextMenu(this);
}

/**
* Initialize the style class to 'jfx-password-field'.
* <p>
* This is the selector class from which CSS can be used to style
* this control.
*/
private static final String DEFAULT_STYLE_CLASS = "jfx-password-field";

/***************************************************************************
* *
* Properties *
* *
**************************************************************************/

/**
* holds the current active validator on the password field in case of validation error
* wrapper for validation properties / methods
*/
private ReadOnlyObjectWrapper<ValidatorBase> activeValidator = new ReadOnlyObjectWrapper<>();
private final ValidationControl validationControl = new ValidationControl(this);

@Override
public ValidatorBase getActiveValidator() {
return activeValidator == null ? null : activeValidator.get();
return validationControl.getActiveValidator();
}

@Override
public ReadOnlyObjectProperty<ValidatorBase> activeValidatorProperty() {
return this.activeValidator.getReadOnlyProperty();
return validationControl.activeValidatorProperty();
}

/**
* list of validators that will validate the password value upon calling
* {{@link #validate()}
*/
private ObservableList<ValidatorBase> validators = FXCollections.observableArrayList();

@Override
public ObservableList<ValidatorBase> getValidators() {
return validators;
return validationControl.getValidators();
}

@Override
public void setValidators(ValidatorBase... validators) {
this.validators.addAll(validators);
validationControl.setValidators(validators);
}

/**
* validates the password value using the list of validators provided by the user
* {{@link #setValidators(ValidatorBase...)}
*
* @return true if the value is valid else false
*/
@Override
public boolean validate() {
for (ValidatorBase validator : validators) {
if (validator.getSrcControl() == null) {
validator.setSrcControl(this);
}
validator.validate();
if (validator.getHasErrors()) {
activeValidator.set(validator);
return false;
}
}
activeValidator.set(null);
return true;
return validationControl.validate();
}

@Override
public void resetValidation() {
pseudoClassStateChanged(ValidatorBase.PSEUDO_CLASS_ERROR, false);
activeValidator.set(null);
validationControl.resetValidation();
}

/***************************************************************************
* *
* styleable Properties *
* Styleable Properties *
* *
**************************************************************************/

/**
* Initialize the style class to 'jfx-password-field'.
* <p>
* This is the selector class from which CSS can be used to style
* this control.
*/
private static final String DEFAULT_STYLE_CLASS = "jfx-password-field";

/**
* set true to show a float the prompt text when focusing the field
*/
private StyleableBooleanProperty labelFloat = new SimpleStyleableBooleanProperty(StyleableProperties.LABEL_FLOAT, JFXPasswordField.this, "lableFloat", false);
private final StyleableBooleanProperty labelFloat = new SimpleStyleableBooleanProperty(StyleableProperties.LABEL_FLOAT,
JFXPasswordField.this,
"labelFloat",
false);

@Override
public final StyleableBooleanProperty labelFloatProperty() {
return this.labelFloat;
}

@Override
public final boolean isLabelFloat() {
return this.labelFloatProperty().get();
}

@Override
public final void setLabelFloat(final boolean labelFloat) {
this.labelFloatProperty().set(labelFloat);
}

/**
* default color used when the field is unfocused
*/
private StyleableObjectProperty<Paint> unFocusColor = new SimpleStyleableObjectProperty<>(StyleableProperties.UNFOCUS_COLOR, JFXPasswordField.this, "unFocusColor", Color.rgb(77, 77, 77));
private final StyleableObjectProperty<Paint> unFocusColor = new SimpleStyleableObjectProperty<>(StyleableProperties.UNFOCUS_COLOR,
JFXPasswordField.this,
"unFocusColor",
Color.rgb(77,
77,
77));

@Override
public Paint getUnFocusColor() {
return unFocusColor == null ? Color.rgb(77, 77, 77) : unFocusColor.get();
}

@Override
public StyleableObjectProperty<Paint> unFocusColorProperty() {
return this.unFocusColor;
}

@Override
public void setUnFocusColor(Paint color) {
this.unFocusColor.set(color);
}

/**
* default color used when the field is focused
*/
private StyleableObjectProperty<Paint> focusColor = new SimpleStyleableObjectProperty<>(StyleableProperties.FOCUS_COLOR, JFXPasswordField.this, "focusColor", Color.valueOf("#4059A9"));
private StyleableObjectProperty<Paint> focusColor = new SimpleStyleableObjectProperty<>(StyleableProperties.FOCUS_COLOR,
JFXPasswordField.this,
"focusColor",
Color.valueOf("#4059A9"));

@Override
public Paint getFocusColor() {
return focusColor == null ? Color.valueOf("#4059A9") : focusColor.get();
}

@Override
public StyleableObjectProperty<Paint> focusColorProperty() {
return this.focusColor;
}

@Override
public void setFocusColor(Paint color) {
this.focusColor.set(color);
}

/**
* disable animation on validation
*/
private StyleableBooleanProperty disableAnimation = new SimpleStyleableBooleanProperty(StyleableProperties.DISABLE_ANIMATION, JFXPasswordField.this, "disableAnimation", false);
/// disable animation on validation
private final StyleableBooleanProperty disableAnimation = new SimpleStyleableBooleanProperty(StyleableProperties.DISABLE_ANIMATION,
JFXPasswordField.this,
"disableAnimation",
false);

@Override
public final StyleableBooleanProperty disableAnimationProperty() {
return this.disableAnimation;
}

public final Boolean isDisableAnimation() {
@Override
public final boolean isDisableAnimation() {
return disableAnimation != null && this.disableAnimationProperty().get();
}

public final void setDisableAnimation(final Boolean disabled) {
@Override
public final void setDisableAnimation(final boolean disabled) {
this.disableAnimationProperty().set(disabled);
}

private final static class StyleableProperties {
private static final CssMetaData<JFXPasswordField, Paint> UNFOCUS_COLOR = new CssMetaData<JFXPasswordField, Paint>("-jfx-unfocus-color", PaintConverter.getInstance(), Color.valueOf("#A6A6A6")) {
private static final class StyleableProperties {
private static final CssMetaData<JFXPasswordField, Paint> UNFOCUS_COLOR = new CssMetaData<>(
"-jfx-unfocus-color",
PaintConverter.getInstance(),
Color.valueOf("#A6A6A6")) {
@Override
public boolean isSettable(JFXPasswordField control) {
return control.unFocusColor == null || !control.unFocusColor.isBound();
Expand All @@ -229,7 +228,10 @@ public StyleableProperty<Paint> getStyleableProperty(JFXPasswordField control) {
return control.unFocusColorProperty();
}
};
private static final CssMetaData<JFXPasswordField, Paint> FOCUS_COLOR = new CssMetaData<JFXPasswordField, Paint>("-jfx-focus-color", PaintConverter.getInstance(), Color.valueOf("#3f51b5")) {
private static final CssMetaData<JFXPasswordField, Paint> FOCUS_COLOR = new CssMetaData<>(
"-jfx-focus-color",
PaintConverter.getInstance(),
Color.valueOf("#3f51b5")) {
@Override
public boolean isSettable(JFXPasswordField control) {
return control.focusColor == null || !control.focusColor.isBound();
Expand All @@ -241,7 +243,10 @@ public StyleableProperty<Paint> getStyleableProperty(JFXPasswordField control) {
}
};

private static final CssMetaData<JFXPasswordField, Boolean> LABEL_FLOAT = new CssMetaData<JFXPasswordField, Boolean>("-jfx-label-float", BooleanConverter.getInstance(), false) {
private static final CssMetaData<JFXPasswordField, Boolean> LABEL_FLOAT = new CssMetaData<>(
"-jfx-label-float",
BooleanConverter.getInstance(),
false) {
@Override
public boolean isSettable(JFXPasswordField control) {
return control.labelFloat == null || !control.labelFloat.isBound();
Expand All @@ -253,45 +258,38 @@ public StyleableBooleanProperty getStyleableProperty(JFXPasswordField control) {
}
};

private static final CssMetaData<JFXPasswordField, Boolean> DISABLE_ANIMATION = new CssMetaData<JFXPasswordField, Boolean>("-fx-disable-animation", BooleanConverter.getInstance(), false) {
@Override
public boolean isSettable(JFXPasswordField control) {
return control.disableAnimation == null || !control.disableAnimation.isBound();
}
private static final CssMetaData<JFXPasswordField, Boolean> DISABLE_ANIMATION =
new CssMetaData<>("-fx-disable-animation",
BooleanConverter.getInstance(), false) {
@Override
public boolean isSettable(JFXPasswordField control) {
return control.disableAnimation == null || !control.disableAnimation.isBound();
}

@Override
public StyleableBooleanProperty getStyleableProperty(JFXPasswordField control) {
return control.disableAnimationProperty();
}
};
@Override
public StyleableBooleanProperty getStyleableProperty(JFXPasswordField control) {
return control.disableAnimationProperty();
}
};


private static final List<CssMetaData<? extends Styleable, ?>> CHILD_STYLEABLES;

static {
final List<CssMetaData<? extends Styleable, ?>> styleables = new ArrayList<>(Control.getClassCssMetaData());
final List<CssMetaData<? extends Styleable, ?>> styleables = new ArrayList<>(
PasswordField.getClassCssMetaData());
Collections.addAll(styleables, UNFOCUS_COLOR, FOCUS_COLOR, LABEL_FLOAT, DISABLE_ANIMATION);
CHILD_STYLEABLES = Collections.unmodifiableList(styleables);
CHILD_STYLEABLES = List.copyOf(styleables);
}
}

// inherit the styleable properties from parent
private List<CssMetaData<? extends Styleable, ?>> STYLEABLES;

@Override
public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
if (STYLEABLES == null) {
final List<CssMetaData<? extends Styleable, ?>> styleables = new ArrayList<>(Control.getClassCssMetaData());
styleables.addAll(getClassCssMetaData());
styleables.addAll(TextField.getClassCssMetaData());
STYLEABLES = Collections.unmodifiableList(styleables);
}
return STYLEABLES;
return getClassCssMetaData();
}

public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
return StyleableProperties.CHILD_STYLEABLES;
}

}

Loading