//Binding
public class CondBinding extends AbstractBinding {
private final Binding conditionBinding;
private final Binding trueBinding;
private final Binding falseBinding;
private final TypeCoercer resolver;

public CondBinding(Binding conditionBinding, Binding trueBinding, Binding falseBinding, TypeCoercer resolver) {
this.trueBinding = trueBinding;
this.falseBinding = falseBinding;
this.conditionBinding = conditionBinding;
this.resolver = resolver;
}


@Override
public Object get() {
String valueTrue = resolver.coerce(trueBinding.get(), String.class);
String valueFalse = resolver.coerce(falseBinding.get(), String.class);
Boolean condition = resolver.coerce(conditionBinding.get(), Boolean.class);
return condition != null && condition ? valueTrue : valueFalse;
}
}

//Factory
public class CondBindingFactory implements BindingFactory {
private static final String DELIMETER = "\\s*,\\s*";
private static final String DEFAULT_VALUE_PREFIX = "literal";
private static final String DEFAULT_CONDITION_PREFIX = "prop";

private final BindingSource bindingSource;
private final TypeCoercer resolver;

public CondBindingFactory(BindingSource bindingSource, TypeCoercer resolver) {
this.bindingSource = bindingSource;
this.resolver = resolver;
}

@Override
public Binding newBinding(String description, ComponentResources container, ComponentResources component, String expression, Location location) {
String[] parts = expression.split(DELIMETER, 3);

if (parts.length < 3) {
return bindingSource.newBinding(description, container, component, "prop", expression, location);
}

String condition = parts[0];
String valueTrue = parts[1];
String valueFalse = parts[2];

return new CondBinding(makeBinding(condition, DEFAULT_CONDITION_PREFIX, container, description),
makeBinding(valueTrue, DEFAULT_VALUE_PREFIX, container, description),
makeBinding(valueFalse, DEFAULT_VALUE_PREFIX, container, description), resolver);
}

private Binding makeBinding(String expression, String defaultPrefix, ComponentResources container, String description) {
String prefix = defaultPrefix;
String reference = "";

if (!StringUtils.isEmpty(expression)) {
String[] parts = expression.split("\\s*:\\s*", 1);

prefix = parts.length == 2 ? parts[0] : defaultPrefix;
reference = parts.length == 2 ? parts[1] : parts[0];
}

return bindingSource.newBinding(description, container, prefix, reference);
}
}

//Contribution in AppModule
public static void contributeBindingSource(MappedConfiguration<String, BindingFactory> configuration,
BindingSource bindingSource, TypeCoercer coercer) {
configuration.add("cond", new CondBindingFactory(bindingSource, coercer));
}

//Usage

${cond:isActive, literal:active, literal:notActive}


But for CSS classes and boolean values its better to use something like that:
<div class="active_${isActive}"/>

/*Active css class*/
.active_true {}

/*Unactive css class*/
.active_false {}

17.11.2013 18:30, Matthias пишет:
Hi, if theres something in tapestry for inline conditional expressions? I think of something like

<a href="www.google.com" class="${isActive ? 'active' : 'notActive'}">google</a>

I found nothing like that, but i loved to have it.

Thanks in advance
Matthias

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org


--
Best regards,
Michael Gagauz


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to