org.zkoss.bind.impl.LoadChildrenBindingImpl Maven / Gradle / Ivy
The newest version!
/* LoadChildrenBindingImpl.java
Purpose:
Description:
History:
2012/1/2 Created by Dennis Chen
Copyright (C) 2011 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.bind.impl;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.zkoss.bind.BindContext;
import org.zkoss.bind.Binder;
import org.zkoss.bind.Converter;
import org.zkoss.bind.sys.BindEvaluatorX;
import org.zkoss.bind.sys.BinderCtrl;
import org.zkoss.bind.sys.ConditionType;
import org.zkoss.bind.sys.LoadChildrenBinding;
import org.zkoss.bind.sys.debugger.BindingExecutionInfoCollector;
import org.zkoss.bind.sys.debugger.impl.info.LoadInfo;
import org.zkoss.bind.xel.zel.BindELContext;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.UiException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.event.ListDataListener;
/**
* Implementation of {@link LoadChildrenBinding}.
* @author dennis
* @since 6.0.0
*/
public class LoadChildrenBindingImpl extends ChildrenBindingImpl implements LoadChildrenBinding {
private static final long serialVersionUID = 1463169907348730644L;
private Set _doneDependsOn;
public LoadChildrenBindingImpl(Binder binder, Component comp, String loadExpr, ConditionType conditionType,
String command, Map bindingArgs, String converterExpr, Map converterArgs) {
super(binder, comp, loadExpr, conditionType, command, bindingArgs, converterExpr, converterArgs);
}
@SuppressWarnings("unchecked")
public void load(BindContext ctx) {
final Component comp = getComponent(); //ctx.getComponent();
final BindEvaluatorX eval = getBinder().getEvaluatorX();
final BindingExecutionInfoCollector collector = ((BinderCtrl) getBinder()).getBindingExecutionInfoCollector();
//get data from property
Object value = eval.getValue(ctx, comp, _accessInfo.getProperty());
final boolean activating = ((BinderCtrl) getBinder()).isActivating();
//use _converter to convert type if any
final Converter conv = getConverter();
Object old = value;
if (conv != null) {
// //if a converter depends on some property, we should also add tracker
// //TODO, Dennis, ISSUES, currently, a base path of a converter, is its binding path.
// //ex @bind(vm.person.firstName) , it's base path is 'vm.person.firstName', not 'vm.person'
// //this sepc is different with DependsOn of a property
// addConverterDependsOnTrackings(conv, ctx);
if (activating)
return; //don't load to component if activating
value = conv.coerceToUi(value, comp, ctx);
if (value == Converter.IGNORED_VALUE) {
if (collector != null) {
collector.addInfo(new LoadInfo(LoadInfo.CHILDREN_LOAD, comp, getConditionString(ctx),
getPropertyString(), null, old, getArgs(), "*Converter.IGNORED_VALUE"));
}
return;
}
}
if (activating)
return; //don't load to component if activating
// Bug B80-ZK-2927
final List cbrCompsList = (List) comp
.getAttribute(BinderCtrl.CHILDREN_BINDING_RENDERED_COMPONENTS);
if (cbrCompsList != null)
cbrCompsList.clear();
// force to call onBindClean before onBindInit that BindChildRenderer will trigger onBindInit directly
for (Component cmp : new ArrayList(comp.getChildren())) {
cmp.detach();
Events.sendEvent(new Event(BinderCtrl.ON_BIND_CLEAN, comp));
}
BindELContext.removeModel(comp);
if (value != null) {
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy