package xapi.dev.ui;
import xapi.collect.api.StringTo;
import xapi.fu.In1;
import static xapi.collect.X_Collect.*;
/**
* Created by James X. Nelson (james @wetheinter.net) on 7/1/16.
*/
public class UiVisitScope {
public enum ScopeType {
CONTAINER, FEATURE
}
public static class UiVisitScopeImmutable extends UiVisitScope {
public UiVisitScopeImmutable(ScopeType type) {
super(type);
}
@Override
protected <T> StringTo<T> newMap(Class<T> cls) {
return collections().newStringMap(cls, IMMUTABLE);
}
@Override
public UiVisitScope setVisitChildren(boolean visitChildren) {
return this;
}
}
@SuppressWarnings("all")
public static final UiVisitScope DEFAULT_CONTAINER = new UiVisitScopeImmutable(ScopeType.CONTAINER);
@SuppressWarnings("all")
public static final UiVisitScope DEFAULT_FEATURE = new UiVisitScopeImmutable(ScopeType.FEATURE);
private final ScopeType type;
private boolean visitChildren;
private StringTo<UiComponentGenerator> componentOverrides;
private StringTo<UiFeatureGenerator> featureOverrides;
private StringTo<Object> settings;
public UiVisitScope(ScopeType type) {
visitChildren = true;
this.type = type;
componentOverrides = newMap(UiComponentGenerator.class);
featureOverrides = newMap(UiFeatureGenerator.class);
settings = newMap(Object.class);
}
protected <T> StringTo<T> newMap(Class<T> cls) {
return newStringMap(cls);
}
public boolean isVisitChildren() {
return visitChildren;
}
public UiVisitScope setVisitChildren(boolean visitChildren) {
this.visitChildren = visitChildren;
return this;
}
public StringTo<UiComponentGenerator> getComponentOverrides() {
return componentOverrides;
}
public UiVisitScope viewComponentOverrides(In1<StringTo<UiComponentGenerator>> callback) {
callback.in(componentOverrides);
return this;
}
public StringTo<UiFeatureGenerator> getFeatureOverrides() {
return featureOverrides;
}
public UiVisitScope viewFeatureOverrides(In1<StringTo<UiFeatureGenerator>> callback) {
callback.in(featureOverrides);
return this;
}
public StringTo<Object> getSettings() {
return settings;
}
public UiVisitScope viewSettings(In1<StringTo<Object>> callback) {
callback.in(settings);
return this;
}
public ScopeType getType() {
return type;
}
public static UiVisitScope visitScope(ScopeType type, boolean visitChildren) {
return new UiVisitScope(type).setVisitChildren(visitChildren);
}
}