All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nasdanika.html.knockout.impl.KnockoutImpl Maven / Gradle / Ivy

There is a newer version: 2022.1.1
Show newest version
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