package org.orienteer.core.behavior; import org.apache.wicket.Component; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.event.IEvent; import org.apache.wicket.util.lang.Objects; import org.orienteer.core.component.command.Command; import org.orienteer.core.event.ActionPerformedEvent; /** * Behavior to update component if model changing {@link Command} was executed */ public class UpdateOnActionPerformedEventBehavior extends Behavior { public static final UpdateOnActionPerformedEventBehavior INSTANCE_ALL_CONTINUE = new UpdateOnActionPerformedEventBehavior(false); public static final UpdateOnActionPerformedEventBehavior INSTANCE_ALL_STOP = new UpdateOnActionPerformedEventBehavior(true); public static final UpdateOnActionPerformedEventBehavior INSTANCE_CHANGING_CONTINUE = new UpdateChangingOnActionPerformedEventBehavior(false); public static final UpdateOnActionPerformedEventBehavior INSTANCE_CHANGING_STOP = new UpdateChangingOnActionPerformedEventBehavior(true); public static final UpdateOnActionPerformedEventBehavior INSTANCE_ALWAYS = new UpdateAlwaysOnActionPerformedEventBehavior(false, false); public static final UpdateOnActionPerformedEventBehavior INSTANCE_ALWAYS_FOR_CHANGING = new UpdateAlwaysOnActionPerformedEventBehavior(false, true); private static class UpdateChangingOnActionPerformedEventBehavior extends UpdateOnActionPerformedEventBehavior { public UpdateChangingOnActionPerformedEventBehavior(boolean stopEvent) { super(stopEvent); } @Override protected boolean match(Component component, ActionPerformedEvent<?> event, IEvent<?> wicketEvent) { return super.match(component, event, wicketEvent) && event.getCommand().isChangingModel(); } } private static class UpdateAlwaysOnActionPerformedEventBehavior extends UpdateOnActionPerformedEventBehavior { private final boolean shouldBeChanging; public UpdateAlwaysOnActionPerformedEventBehavior(boolean stopEvent, boolean shouldBeChanging) { super(stopEvent); this.shouldBeChanging = shouldBeChanging; } @Override protected boolean match(Component component, ActionPerformedEvent<?> event, IEvent<?> wicketEvent) { return !shouldBeChanging && event.getCommand().isChangingModel(); } } private final boolean stopEvent; public UpdateOnActionPerformedEventBehavior(boolean stopEvent) { this.stopEvent = stopEvent; } @Override public void bind(Component component) { super.bind(component); component.setOutputMarkupId(true); } @Override public void onEvent(Component component, IEvent<?> wicketEvent) { Object payload = wicketEvent.getPayload(); if(payload instanceof ActionPerformedEvent) { ActionPerformedEvent<?> event = (ActionPerformedEvent<?>)payload; if(event.isAjax() && match(component, event, wicketEvent)) { update(component, event, wicketEvent); } if(stopEvent) wicketEvent.stop(); } } protected void update(Component component, ActionPerformedEvent<?> event, IEvent<?> wicketEvent) { component.configure(); if(component.isVisibleInHierarchy()) event.getTarget().add(component); } protected boolean match(Component component, ActionPerformedEvent<?> event, IEvent<?> wicketEvent) { return Objects.equal(component.getDefaultModelObject(), event.getObject()); } }