package org.orienteer.core.component.meta; import java.io.Serializable; import org.apache.wicket.Component; import org.apache.wicket.model.IModel; import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.lang.Objects; /** * {@link AbstractMetaPanel} that can additionally take into consideration display mode. * * @param <T> the type of an entity * @param <K> the type of a display mode * @param <C> the type of a criteria * @param <V> the type of a value */ public abstract class AbstractModeMetaPanel<T, K, C, V> extends AbstractMetaPanel<T, C, V> implements IModeAware<K> { private static final long serialVersionUID = 1L; private IModel<K> modeModel; public AbstractModeMetaPanel(String id, IModel<K> modeModel, IModel<T> entityModel, IModel<C> propertyModel, IModel<V> valueModel) { super(id, entityModel, propertyModel, valueModel); this.modeModel = modeModel; } public AbstractModeMetaPanel(String id, IModel<K> modeModel, IModel<T> entityModel, IModel<C> propertyModel) { super(id, entityModel, propertyModel); this.modeModel = modeModel; } @Override public IModel<K> getModeModel() { return modeModel; } @Override public K getModeObject() { return getModeModel().getObject(); } @Override protected Component resolveComponent(String id, C critery) { K mode = getModeObject(); Args.notNull(mode, "mode"); return resolveComponent(id, getEffectiveMode(mode, critery), critery); } protected K getEffectiveMode(K mode, C critery) { return mode; } @Override protected Serializable getSignature(C critery) { return Objects.hashCode(critery, getModeObject()); } protected abstract Component resolveComponent(String id, K mode, C critery); @Override public void detachModels() { super.detachModels(); modeModel.detach(); } }