com.sun.javafx.binding.StringFormatter Maven / Gradle / Ivy
/*
* Copyright (c) 2011, 2022, 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 com.sun.javafx.binding;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javafx.beans.binding.StringBinding;
import javafx.beans.binding.StringExpression;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
public abstract class StringFormatter extends StringBinding {
private static Object extractValue(Object obj) {
return obj instanceof ObservableValue ? ((ObservableValue>)obj).getValue() : obj;
}
private static Object[] extractValues(Object[] objs) {
final int n = objs.length;
final Object[] values = new Object[n];
for (int i = 0; i < n; i++) {
values[i] = extractValue(objs[i]);
}
return values;
}
private static ObservableValue>[] extractDependencies(Object... args) {
final List> dependencies = new ArrayList<>();
for (final Object obj : args) {
if (obj instanceof ObservableValue) {
dependencies.add((ObservableValue>) obj);
}
}
return dependencies.toArray(new ObservableValue[dependencies.size()]);
}
public static StringExpression convert(final ObservableValue> observableValue) {
if (observableValue == null) {
throw new NullPointerException("ObservableValue must be specified");
}
if (observableValue instanceof StringExpression) {
return (StringExpression) observableValue;
} else {
return new StringBinding() {
{
super.bind(observableValue);
}
@Override
public void dispose() {
super.unbind(observableValue);
}
@Override
protected String computeValue() {
final Object value = observableValue.getValue();
return (value == null)? "null" : value.toString();
}
@Override
public ObservableList> getDependencies() {
return FXCollections.> singletonObservableList(observableValue);
}
};
}
}
public static StringExpression concat(final Object... args) {
if ((args == null) || (args.length == 0)) {
return StringConstant.valueOf("");
}
if (args.length == 1) {
final Object cur = args[0];
return cur instanceof ObservableValue ? convert((ObservableValue>) cur)
: StringConstant.valueOf(cur.toString());
}
if (extractDependencies(args).length == 0) {
final StringBuilder builder = new StringBuilder();
for (final Object obj : args) {
builder.append(obj);
}
return StringConstant.valueOf(builder.toString());
}
return new StringFormatter() {
{
super.bind(extractDependencies(args));
}
@Override
public void dispose() {
super.unbind(extractDependencies(args));
}
@Override
protected String computeValue() {
final StringBuilder builder = new StringBuilder();
for (final Object obj : args) {
builder.append(extractValue(obj));
}
return builder.toString();
}
@Override
public ObservableList> getDependencies() {
return FXCollections.unmodifiableObservableList(FXCollections
.observableArrayList(extractDependencies(args)));
}
};
}
public static StringExpression format(final Locale locale, final String format, final Object... args) {
if (format == null) {
throw new NullPointerException("Format cannot be null.");
}
if (extractDependencies(args).length == 0) {
return StringConstant.valueOf(String.format(locale, format, args));
}
final StringFormatter formatter = new StringFormatter() {
{
super.bind(extractDependencies(args));
}
@Override
public void dispose() {
super.unbind(extractDependencies(args));
}
@Override
protected String computeValue() {
final Object[] values = extractValues(args);
return String.format(locale, format, values);
}
@Override
public ObservableList> getDependencies() {
return FXCollections.unmodifiableObservableList(FXCollections
.observableArrayList(extractDependencies(args)));
}
};
// Force calculation to check format
formatter.get();
return formatter;
}
public static StringExpression format(final String format, final Object... args) {
if (format == null) {
throw new NullPointerException("Format cannot be null.");
}
if (extractDependencies(args).length == 0) {
return StringConstant.valueOf(String.format(format, args));
}
final StringFormatter formatter = new StringFormatter() {
{
super.bind(extractDependencies(args));
}
@Override
public void dispose() {
super.unbind(extractDependencies(args));
}
@Override
protected String computeValue() {
final Object[] values = extractValues(args);
return String.format(format, values);
}
@Override
public ObservableList> getDependencies() {
return FXCollections.unmodifiableObservableList(FXCollections
.observableArrayList(extractDependencies(args)));
}
};
// Force calculation to check format
formatter.get();
return formatter;
}
}