package fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.wicket.Component;
import org.apache.wicket.model.IDetachable;
import org.wicketstuff.wiquery.core.javascript.JsScope;
import org.wicketstuff.wiquery.core.options.DefaultOptionsRenderer;
import org.wicketstuff.wiquery.core.options.ICollectionItemOptions;
import org.wicketstuff.wiquery.core.options.IComplexOption;
import org.wicketstuff.wiquery.core.options.IModelOption;
import org.wicketstuff.wiquery.core.options.IOptionsRenderer;
import org.wicketstuff.wiquery.core.options.ITypedOption;
public abstract class SimpleOptions implements IDetachable {
private static final long serialVersionUID = 1L;
private Component owner;
private IOptionsRenderer optionsRenderer;
public SimpleOptions() {
this(null);
}
public SimpleOptions(Component owner) {
this.owner = owner;
this.optionsRenderer = DefaultOptionsRenderer.get();
}
public void setOwner(Component owner) {
if (this.owner != null && this.owner != owner)
throw new IllegalArgumentException("Cannot use the same Options for multiple components");
this.owner = owner;
}
/**
* Returns the JavaScript statement corresponding to options.
*/
protected CharSequence getJavaScriptOptions(Map<String, Object> options) {
StringBuilder sb = new StringBuilder();
this.optionsRenderer.renderBefore(sb);
int count = 0;
for (Entry<String, Object> entry : options.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof IModelOption<?>)
value = ((IModelOption<?>) value).wrapOnAssignment(owner);
boolean isLast = !(count < options.size() - 1);
if (value instanceof JsScope) {
// Case of a JsScope
sb.append(this.optionsRenderer.renderOption(key, ((JsScope) value).render(), isLast));
} else if (value instanceof ICollectionItemOptions) {
// Case of an ICollectionItemOptions
sb.append(this.optionsRenderer.renderOption(key,
((ICollectionItemOptions) value).getJavascriptOption(), isLast));
} else if (value instanceof IComplexOption) {
// Case of an IComplexOption
sb.append(this.optionsRenderer.renderOption(key, ((IComplexOption) value).getJavascriptOption(), isLast));
} else if (value instanceof ITypedOption<?>) {
// Case of an ITypedOption
sb.append(this.optionsRenderer.renderOption(key, ((ITypedOption<?>) value).getJavascriptOption(),
isLast));
} else {
// Other cases
sb.append(this.optionsRenderer.renderOption(key, value, isLast));
}
count++;
}
this.optionsRenderer.renderAfter(sb);
return sb.toString();
}
/**
* Sets the renderer to use.
*/
public void setRenderer(IOptionsRenderer optionsRenderer) {
this.optionsRenderer = optionsRenderer;
}
}