package de.flower.common.ui.ajax.dragndrop; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.behavior.Behavior; import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.model.AbstractReadOnlyModel; /** * @author flowerrrr */ public abstract class DroppableBehavior extends Behavior { private final static String SCRIPT = "$(function () {\n" + " var id = '%s';\n" + " var rerenderAfterDrop = %s;\n" + " $('#' + id).droppable({\n" + " hoverClass: 'droppable-hover',\n" + " greedy: true,\n" + " drop: function (event, ui) {\n" + // values can be decimals. better round it to avoid parsing exception in wicket long converter. " var top = Math.round(ui.offset.top - $(this).position().top);\n" + " var left = Math.round(ui.offset.left - $(this).position().left);\n" + " var width = $(this).width();\n" + " var height = $(this).height();\n" + " var url = $('#' + id).attr('url');\n" + " var callback = eval(url);\n" + " wicketAjaxGet(callback);\n" + " if (rerenderAfterDrop) ui.draggable.remove();\n" + // remove dragged object " }\n" + " });\n" + " });\n"; private boolean rerenderAfterDrop; protected DroppableBehavior(final boolean rerenderAfterDrop) { this.rerenderAfterDrop = rerenderAfterDrop; } @Override public void bind(final Component c) { final AbstractDefaultAjaxBehavior behavior = new DropCallbackBehavior() { @Override protected void onDrop(final AjaxRequestTarget target, final DraggableDto dto) { DroppableBehavior.this.onDrop(target, dto); } }; c.add(behavior); c.add(AttributeModifier.replace("url", new AbstractReadOnlyModel<String>() { @Override public String getObject() { return "'" + behavior.getCallbackUrl().toString() + "'"; } })); } @Override public void renderHead(final Component component, final IHeaderResponse response) { response.renderOnDomReadyJavaScript(String.format(SCRIPT, component.getMarkupId(), rerenderAfterDrop)); } protected abstract void onDrop(final AjaxRequestTarget target, final DraggableDto dto); }