/*
* Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package javafx.scene.control.cell;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.HBox;
import javafx.util.Callback;
import javafx.util.StringConverter;
import javafx.util.converter.DefaultStringConverter;
A class containing a TreeCell
implementation that draws a TextField
node inside the cell. By default, the TextFieldTreeCell is rendered as a Label
when not being edited, and as a TextField when in editing mode. The TextField will, by default, stretch to fill the entire tree cell.
Type parameters: - <T> – The type of the elements contained within the TreeView.
Since: JavaFX 2.2
/**
* A class containing a {@link TreeCell} implementation that draws a
* {@link TextField} node inside the cell.
*
* <p>By default, the TextFieldTreeCell is rendered as a {@link Label} when not
* being edited, and as a TextField when in editing mode. The TextField will, by
* default, stretch to fill the entire tree cell.
*
* @param <T> The type of the elements contained within the TreeView.
* @since JavaFX 2.2
*/
public class TextFieldTreeCell<T> extends DefaultTreeCell<T> {
/***************************************************************************
* *
* Static cell factories *
* *
**************************************************************************/
Provides a TextField
that allows editing of the cell content when the cell is double-clicked, or when TreeView.edit(TreeItem)
is called. This method will only work on TreeView
instances which are of type String. Returns: A Callback
that can be inserted into the cell factory property
of a TreeView, that enables textual editing of the content.
/**
* Provides a {@link TextField} that allows editing of the cell content when
* the cell is double-clicked, or when
* {@link TreeView#edit(javafx.scene.control.TreeItem)} is called.
* This method will only work on {@link TreeView} instances which are of
* type String.
*
* @return A {@link Callback} that can be inserted into the
* {@link TreeView#cellFactoryProperty() cell factory property} of a
* TreeView, that enables textual editing of the content.
*/
public static Callback<TreeView<String>, TreeCell<String>> forTreeView() {
return forTreeView(new DefaultStringConverter());
}
Provides a TextField
that allows editing of the cell content when the cell is double-clicked, or when TreeView.edit(TreeItem)
is called. This method will work on any TreeView
instance, regardless of its generic type. However, to enable this, a StringConverter
must be provided that will convert the given String (from what the user typed in) into an instance of type T. This item will then be passed along to the TreeView.onEditCommitProperty()
callback. Params: - converter – A
StringConverter
that can convert the given String (from what the user typed in) into an instance of type T.
Type parameters: - <T> – The type of the elements contained within the TreeView
Returns: A Callback
that can be inserted into the cell factory property
of a TreeView, that enables textual editing of the content.
/**
* Provides a {@link TextField} that allows editing of the cell content when
* the cell is double-clicked, or when
* {@link TreeView#edit(javafx.scene.control.TreeItem)} is called. This
* method will work on any {@link TreeView} instance,
* regardless of its generic type. However, to enable this, a
* {@link StringConverter} must be provided that will convert the given String
* (from what the user typed in) into an instance of type T. This item will
* then be passed along to the {@link TreeView#onEditCommitProperty()}
* callback.
*
* @param <T> The type of the elements contained within the TreeView
* @param converter A {@link StringConverter} that can convert the given String
* (from what the user typed in) into an instance of type T.
* @return A {@link Callback} that can be inserted into the
* {@link TreeView#cellFactoryProperty() cell factory property} of a
* TreeView, that enables textual editing of the content.
*/
public static <T> Callback<TreeView<T>, TreeCell<T>> forTreeView(
final StringConverter<T> converter) {
return list -> new TextFieldTreeCell<T>(converter);
}
*
Fields *
*
/***************************************************************************
* *
* Fields *
* *
**************************************************************************/
private TextField textField;
private HBox hbox;
/***************************************************************************
* *
* Constructors *
* *
**************************************************************************/
Creates a default TextFieldTreeCell with a null converter. Without a StringConverter
specified, this cell will not be able to accept input from the TextField (as it will not know how to convert this back to the domain object). It is therefore strongly encouraged to not use this constructor unless you intend to set the converter separately. /**
* Creates a default TextFieldTreeCell with a null converter. Without a
* {@link StringConverter} specified, this cell will not be able to accept
* input from the TextField (as it will not know how to convert this back
* to the domain object). It is therefore strongly encouraged to not use
* this constructor unless you intend to set the converter separately.
*/
public TextFieldTreeCell() {
this(null);
}
Creates a TextFieldTreeCell that provides a TextField
when put into editing mode that allows editing of the cell content. This method will work on any TreeView instance, regardless of its generic type. However, to enable this, a StringConverter
must be provided that will convert the given String (from what the user typed in) into an instance of type T. This item will then be passed along to the TreeView.onEditCommitProperty()
callback. Params: - converter – A
converter
that can convert the given String (from what the user typed in) into an instance of type T.
/**
* Creates a TextFieldTreeCell that provides a {@link TextField} when put
* into editing mode that allows editing of the cell content. This method
* will work on any TreeView instance, regardless of its generic type.
* However, to enable this, a {@link StringConverter} must be provided that
* will convert the given String (from what the user typed in) into an
* instance of type T. This item will then be passed along to the
* {@link TreeView#onEditCommitProperty()} callback.
*
* @param converter A {@link StringConverter converter} that can convert
* the given String (from what the user typed in) into an instance of
* type T.
*/
public TextFieldTreeCell(StringConverter<T> converter) {
this.getStyleClass().add("text-field-tree-cell");
setConverter(converter);
}
*
Properties *
*
/***************************************************************************
* *
* Properties *
* *
**************************************************************************/
// --- converter
private ObjectProperty<StringConverter<T>> converter =
new SimpleObjectProperty<StringConverter<T>>(this, "converter");
The StringConverter
property. Returns: the StringConverter
property
/**
* The {@link StringConverter} property.
* @return the {@link StringConverter} property
*/
public final ObjectProperty<StringConverter<T>> converterProperty() {
return converter;
}
Sets the StringConverter
to be used in this cell. Params: - value – the
StringConverter
to be used in this cell
/**
* Sets the {@link StringConverter} to be used in this cell.
* @param value the {@link StringConverter} to be used in this cell
*/
public final void setConverter(StringConverter<T> value) {
converterProperty().set(value);
}
Returns the StringConverter
used in this cell. Returns: the StringConverter
used in this cell
/**
* Returns the {@link StringConverter} used in this cell.
* @return the {@link StringConverter} used in this cell
*/
public final StringConverter<T> getConverter() {
return converterProperty().get();
}
/***************************************************************************
* *
* Public API *
* *
**************************************************************************/
{@inheritDoc} /** {@inheritDoc} */
@Override public void startEdit() {
if (! isEditable() || ! getTreeView().isEditable()) {
return;
}
super.startEdit();
if (isEditing()) {
StringConverter<T> converter = getConverter();
if (textField == null) {
textField = CellUtils.createTextField(this, converter);
}
if (hbox == null) {
hbox = new HBox(CellUtils.TREE_VIEW_HBOX_GRAPHIC_PADDING);
}
CellUtils.startEdit(this, converter, hbox, getTreeItemGraphic(), textField);
}
}
{@inheritDoc} /** {@inheritDoc} */
@Override public void cancelEdit() {
super.cancelEdit();
CellUtils.cancelEdit(this, getConverter(), getTreeItemGraphic());
}
{@inheritDoc} /** {@inheritDoc} */
@Override public void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
CellUtils.updateItem(this, getConverter(), hbox, getTreeItemGraphic(), textField);
}
*
Private Implementation *
*
/***************************************************************************
* *
* Private Implementation *
* *
**************************************************************************/
private Node getTreeItemGraphic() {
TreeItem<T> treeItem = getTreeItem();
return treeItem == null ? null : treeItem.getGraphic();
}
}