![JAR search and dependency download from the Maven repository](/logo.png)
org.nasdanika.html.knockout.impl.KnockoutImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of knockout Show documentation
Show all versions of knockout Show documentation
Classes for generating KnockoutJs bindings.
package org.nasdanika.html.knockout.impl;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.nasdanika.html.HTMLElement;
import org.nasdanika.html.knockout.Knockout;
import org.nasdanika.html.knockout.KnockoutBindingsSource;
import org.nasdanika.html.knockout.KnockoutFactory;
class KnockoutImpl> extends KnockoutControlFlowImpl> implements Knockout {
private static final String KNOCKOUT_DATA_BIND_ENTRIES = "knockout-data-bind-entries";
private static final String KNOCKOUT_INITIAL_VALUE_ENTRIES = "knockout-initial-value-entries";
private T htmlElement;
private Map koDataBindEntries;
private Map koInitialValueEntries;
private KnockoutFactory factory;
@SuppressWarnings("unchecked")
KnockoutImpl(KnockoutFactory factory, T htmlElement) {
this.factory = factory;
this.htmlElement = htmlElement;
koDataBindEntries = (Map) htmlElement.getData(KNOCKOUT_DATA_BIND_ENTRIES);
if (koDataBindEntries == null) {
koDataBindEntries = new LinkedHashMap<>();
htmlElement.setData(KNOCKOUT_DATA_BIND_ENTRIES, koDataBindEntries);
}
koInitialValueEntries = (Map) htmlElement.getData(KNOCKOUT_INITIAL_VALUE_ENTRIES);
if (koInitialValueEntries == null) {
koInitialValueEntries = new LinkedHashMap<>();
htmlElement.setData(KNOCKOUT_INITIAL_VALUE_ENTRIES, koInitialValueEntries);
}
}
@Override
public T toHTMLElement() {
return htmlElement;
}
@Override
public Knockout visible(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.VISIBLE.name, expression, initialValue);
}
@Override
public Knockout visible(Object expression) {
return visible(expression, null);
}
@Override
public Knockout text(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.TEXT.name, expression, initialValue);
}
@Override
public Knockout text(Object expression) {
return text(expression, null);
}
@Override
public Knockout html(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.HTML.name, expression, initialValue);
}
@Override
public Knockout html(Object expression) {
return html(expression, null);
}
@Override
public Knockout css(Object expression) {
return bind(KnockoutBindingInfo.CSS.name, expression, null);
}
@Override
public Knockout style(Object expression) {
return bind(KnockoutBindingInfo.STYLE.name, expression, null);
}
@Override
public Knockout attr(Object expression) {
return bind(KnockoutBindingInfo.ATTR.name, expression, null);
}
@Override
public Knockout click(Object expression) {
return bind(KnockoutBindingInfo.CLICK.name, expression, null);
}
@Override
public Knockout event(Object expression) {
return bind(KnockoutBindingInfo.EVENT.name, expression, null);
}
@Override
public Knockout submit(Object expression) {
return bind(KnockoutBindingInfo.SUBMIT.name, expression, null);
}
@Override
public Knockout enable(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.ENABLE.name, expression, initialValue);
}
@Override
public Knockout enable(Object expression) {
return enable(expression, null);
}
@Override
public Knockout disable(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.DISABLE.name, expression, initialValue);
}
@Override
public Knockout disable(Object expression) {
return disable(expression, null);
}
@Override
public Knockout value(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.VALUE.name, expression, initialValue);
}
@Override
public Knockout value(Object expression) {
return value(expression, null);
}
@Override
public Knockout textInput(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.TEXT_INPUT.name, expression, initialValue);
}
@Override
public Knockout textInput(Object expression) {
return textInput(expression, null);
}
@Override
public Knockout hasFocus(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.HAS_FOCUS.name, expression, initialValue);
}
@Override
public Knockout hasFocus(Object expression) {
return hasFocus(expression, null);
}
@Override
public Knockout checked(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.CHECKED.name, expression, initialValue);
}
@Override
public Knockout checked(Object expression) {
return checked(expression, null);
}
@Override
public Knockout options(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.OPTIONS.name, expression, initialValue);
}
@Override
public Knockout options(Object expression) {
return options(expression, null);
}
@Override
public Knockout selectedOptions(Object expression, Object initialValue) {
return bind(KnockoutBindingInfo.SELECTED_OPTIONS.name, expression, initialValue);
}
@Override
public Knockout selectedOptions(Object expression) {
return selectedOptions(expression, null);
}
@Override
public Knockout uniqueName(Object expression) {
return bind(KnockoutBindingInfo.UNIQUE_NAME.name, expression, null);
}
@Override
public Knockout template(Object expression) {
return bind(KnockoutBindingInfo.TEMPLATE.name, expression, null);
}
@Override
public Knockout bind(String binding, Object expression, Object initialValue) {
if (expression==null) {
koDataBindEntries.remove(binding);
koInitialValueEntries.remove(binding);
} else {
koDataBindEntries.put(binding, expression);
if (initialValue!=null) {
koInitialValueEntries.put(binding, initialValue);
}
}
return this;
}
@Override
public Collection getAllBindings() {
Map collector = new LinkedHashMap<>();
boolean isNewScope = false;
for (String binding: koDataBindEntries.keySet()) {
if (KnockoutBindingInfo.isObservable(binding)) {
String fieldName = String.valueOf(koDataBindEntries.get(binding)).trim();
if (KnockoutVirtualElementImpl.isJavaIdentifierPath(fieldName)) {
collector.put(fieldName, new KnockoutBindingImpl(fieldName, KnockoutBindingInfo.isArray(binding), koInitialValueEntries.get(binding)));
}
}
if (KnockoutBindingInfo.isNewScope(binding)) {
isNewScope = true;
}
}
if (!isNewScope) {
for (Object c: htmlElement.getContent()) {
if (c instanceof HTMLElement) {
for (Binding b: factory.from((HTMLElement>) c).getAllBindings()) {
Binding eb = collector.get(b.getName());
if (eb==null) {
collector.put(b.getName(), b);
} else if (eb.getInitialValue()==null && b.getInitialValue()!=null) {
((KnockoutBindingImpl) eb).setInitialValue(b.getInitialValue());
}
}
} else if (c instanceof KnockoutBindingsSource) {
for (Binding b: ((KnockoutBindingsSource) c).getAllBindings()) {
Binding eb = collector.get(b.getName());
if (eb==null) {
collector.put(b.getName(), b);
} else if (eb.getInitialValue()==null && b.getInitialValue()!=null) {
((KnockoutBindingImpl) eb).setInitialValue(b.getInitialValue());
}
}
}
}
}
return Collections.unmodifiableCollection(collector.values());
}
@Override
public String generateObservables(String... excludes) {
StringBuilder ret = new StringBuilder("// Generated observables").append(System.lineSeparator());
ObservablesGenerator og = new ObservablesGenerator(excludes);
for (Binding binding: getAllBindings()) {
og.addBinding(binding);
}
og.generateObservables(ret);
return ret.append("// End of generated observables").append(System.lineSeparator()).toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy