Преглед изворни кода

Merge pull request #276

Fixed #220 minor issues in MFXTextField based controls
Alessadro Parisi пре 2 година
родитељ
комит
82f4c0a752

+ 30 - 0
materialfx/src/main/java/io/github/palexdev/materialfx/controls/BoundTextField.java

@@ -84,6 +84,36 @@ public class BoundTextField extends TextField {
 		textField = null;
 	}
 
+	@Override
+	public void copy() {
+		if (textField instanceof MFXPasswordField) {
+			MFXPasswordField passwordField = (MFXPasswordField) textField;
+			if (!passwordField.isAllowCopy())
+				return;
+		}
+		super.copy();
+	}
+
+	@Override
+	public void cut() {
+		if (textField instanceof MFXPasswordField) {
+			MFXPasswordField passwordField = (MFXPasswordField) textField;
+			if (!passwordField.isAllowCut())
+				return;
+		}
+		super.cut();
+	}
+
+	@Override
+	public void paste() {
+		if (textField instanceof MFXPasswordField) {
+			MFXPasswordField passwordField = (MFXPasswordField) textField;
+			if (!passwordField.isAllowPaste())
+				return;
+		}
+		super.paste();
+	}
+
 	private class CustomTextFieldSkin extends TextFieldSkin {
 		private final StringBinding textBinding;
 

+ 8 - 5
materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXPasswordField.java

@@ -22,6 +22,7 @@ import io.github.palexdev.materialfx.MFXResourcesLoader;
 import io.github.palexdev.materialfx.beans.properties.styleable.StyleableBooleanProperty;
 import io.github.palexdev.materialfx.beans.properties.styleable.StyleableStringProperty;
 import io.github.palexdev.materialfx.font.MFXFontIcon;
+import io.github.palexdev.materialfx.i18n.I18N;
 import io.github.palexdev.materialfx.utils.NodeUtils;
 import io.github.palexdev.materialfx.utils.StyleablePropertiesUtils;
 import javafx.beans.binding.Bindings;
@@ -185,7 +186,7 @@ public class MFXPasswordField extends MFXTextField {
 				.setIcon(new MFXFontIcon("mfx-delete-alt", 16))
 				.setText("Delete")
 				.setAccelerator("Ctrl + D")
-				.setOnAction(event -> deleteText(getSelection()))
+				.setOnAction(event -> boundField.deleteText(delegateGetSelection()))
 				.get();
 
 		MFXContextMenuItem selectAllItem = MFXContextMenuItem.Builder.build()
@@ -197,17 +198,19 @@ public class MFXPasswordField extends MFXTextField {
 
 		MFXContextMenuItem redoItem = MFXContextMenuItem.Builder.build()
 				.setIcon(new MFXFontIcon("mfx-redo", 12))
-				.setText("Redo")
+				.setText(I18N.getOrDefault("textField.contextMenu.redo"))
 				.setAccelerator("Ctrl + Y")
-				.setOnAction(event -> redo())
+				.setOnAction(event -> boundField.redo())
 				.get();
+		redoItem.disableProperty().bind(delegateRedoableProperty().not());
 
 		MFXContextMenuItem undoItem = MFXContextMenuItem.Builder.build()
 				.setIcon(new MFXFontIcon("mfx-undo", 12))
-				.setText("Undo")
+				.setText(I18N.getOrDefault("textField.contextMenu.undo"))
 				.setAccelerator("Ctrl + Z")
-				.setOnAction(event -> undo())
+				.setOnAction(event -> boundField.undo())
 				.get();
+		undoItem.disableProperty().bind(delegateUndoableProperty().not());
 
 		contextMenu = MFXContextMenu.Builder.build(this)
 				.addItems(copyItem, cutItem, pasteItem, deleteItem, selectAllItem)

+ 21 - 3
materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXTextField.java

@@ -43,6 +43,8 @@ import javafx.scene.control.Skin;
 import javafx.scene.control.TextField;
 import javafx.scene.control.TextFormatter;
 import javafx.scene.input.ContextMenuEvent;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
 import javafx.scene.paint.Color;
 
 import java.util.List;
@@ -207,10 +209,15 @@ public class MFXTextField extends TextField implements Validated, MFXMenuControl
 	private void initialize() {
 		getStyleClass().setAll(STYLE_CLASS);
 		setPrefColumnCount(6);
+		setFocusTraversable(false);
 		floating.addListener(invalidated -> pseudoClassStateChanged(FLOATING_PSEUDO_CLASS, floating.get()));
 		allowEditProperty().bindBidirectional(editableProperty());
 
 		addEventFilter(ContextMenuEvent.CONTEXT_MENU_REQUESTED, Event::consume);
+		addEventHandler(KeyEvent.KEY_PRESSED, event -> {
+			if (event.getCode() == KeyCode.D && event.isControlDown())
+				boundField.deleteText(delegateGetSelection());
+		});
 		defaultContextMenu();
 	}
 
@@ -240,7 +247,7 @@ public class MFXTextField extends TextField implements Validated, MFXMenuControl
 				.setIcon(new MFXFontIcon("mfx-delete-alt", 16))
 				.setText(I18N.getOrDefault("textField.contextMenu.delete"))
 				.setAccelerator("Ctrl + D")
-				.setOnAction(event -> deleteText(getSelection()))
+				.setOnAction(event -> boundField.deleteText(delegateGetSelection()))
 				.get();
 
 		MFXContextMenuItem selectAllItem = MFXContextMenuItem.Builder.build()
@@ -254,15 +261,17 @@ public class MFXTextField extends TextField implements Validated, MFXMenuControl
 				.setIcon(new MFXFontIcon("mfx-redo", 12))
 				.setText(I18N.getOrDefault("textField.contextMenu.redo"))
 				.setAccelerator("Ctrl + Y")
-				.setOnAction(event -> redo())
+				.setOnAction(event -> boundField.redo())
 				.get();
+		redoItem.disableProperty().bind(delegateRedoableProperty().not());
 
 		MFXContextMenuItem undoItem = MFXContextMenuItem.Builder.build()
 				.setIcon(new MFXFontIcon("mfx-undo", 12))
 				.setText(I18N.getOrDefault("textField.contextMenu.undo"))
 				.setAccelerator("Ctrl + Z")
-				.setOnAction(event -> undo())
+				.setOnAction(event -> boundField.undo())
 				.get();
+		undoItem.disableProperty().bind(delegateUndoableProperty().not());
 
 		contextMenu = MFXContextMenu.Builder.build(this)
 				.addItems(copyItem, cutItem, pasteItem, deleteItem, selectAllItem)
@@ -515,6 +524,15 @@ public class MFXTextField extends TextField implements Validated, MFXMenuControl
 		return boundField.focusedProperty();
 	}
 
+	/**
+	 * Specifies whether the {@link BoundTextField} it focus traversable.
+	 */
+	public BooleanProperty delegateFocusTraversableProperty() { return boundField.focusTraversableProperty(); }
+
+	public void delegateSetFocusTraversable(boolean value) { boundField.setFocusTraversable(value); }
+
+	public boolean delegateIsFocusTraversable() { return boundField.isFocusTraversable(); }
+
 	//================================================================================
 	// Validation
 	//================================================================================