/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.client.ui.dd;
import java.util.Iterator;
import com.google.gwt.user.client.Command;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.UIDL;
import com.vaadin.client.extensions.DropTargetExtensionConnector;
import com.vaadin.event.Transferable;
import com.vaadin.event.dd.DropTarget;
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
/**
*
* @author Vaadin Ltd
* @deprecated Replaced in 8.1 with {@link DropTargetExtensionConnector}
*/
@Deprecated
public abstract class VAbstractDropHandler implements VDropHandler {
private UIDL criterioUIDL;
private VAcceptCriterion acceptCriteria = new VAcceptAll();
/**
* Implementor/user of {@link VAbstractDropHandler} must pass the UIDL
* painted by {@link AcceptCriterion} to this method. Practically the
* details about {@link AcceptCriterion} are saved.
*
* @param uidl
*/
public void updateAcceptRules(UIDL uidl) {
criterioUIDL = uidl;
/*
* supports updating the accept rule root directly or so that it is
* contained in given uidl node
*/
if (!uidl.getTag().equals("-ac")) {
Iterator<Object> childIterator = uidl.getChildIterator();
while (!uidl.getTag().equals("-ac") && childIterator.hasNext()) {
uidl = (UIDL) childIterator.next();
}
}
acceptCriteria = VAcceptCriteria.get(uidl.getStringAttribute("name"));
if (acceptCriteria == null) {
throw new IllegalArgumentException(
"No accept criteria found with given name "
+ uidl.getStringAttribute("name"));
}
}
/**
* Default implementation does nothing.
*/
@Override
public void dragOver(VDragEvent drag) {
}
/**
* Default implementation does nothing. Implementors should clean possible
* emphasis or drag icons here.
*/
@Override
public void dragLeave(VDragEvent drag) {
}
/**
* The default implementation in {@link VAbstractDropHandler} checks if the
* Transferable is accepted.
* <p>
* If transferable is accepted (either via server visit or client side
* rules) the default implementation calls abstract
* {@link #dragAccepted(VDragEvent)} method.
* <p>
* If drop handler has distinct places where some parts may accept the
* {@link Transferable} and others don't, one should use similar validation
* logic in dragOver method and replace this method with empty
* implementation.
*
*/
@Override
public void dragEnter(final VDragEvent drag) {
validate(new VAcceptCallback() {
@Override
public void accepted(VDragEvent event) {
dragAccepted(drag);
}
}, drag);
}
/**
* This method is called when a valid drop location was found with
* {@link AcceptCriterion} either via client or server side check.
* <p>
* Implementations can set some hints for users here to highlight that the
* drag is on a valid drop location.
*
* @param drag
*/
abstract protected void dragAccepted(VDragEvent drag);
protected void validate(final VAcceptCallback cb, final VDragEvent event) {
Command checkCriteria = new Command() {
@Override
public void execute() {
acceptCriteria.accept(event, criterioUIDL, cb);
}
};
VDragAndDropManager.get().executeWhenReady(checkCriteria);
}
boolean validated = false;
/**
* The default implemmentation visits server if {@link AcceptCriterion}
* can't be verified on client or if {@link AcceptCriterion} are met on
* client.
*/
@Override
public boolean drop(VDragEvent drag) {
if (acceptCriteria.needsServerSideCheck(drag, criterioUIDL)) {
return true;
} else {
validated = false;
acceptCriteria.accept(drag, criterioUIDL, new VAcceptCallback() {
@Override
public void accepted(VDragEvent event) {
validated = true;
}
});
return validated;
}
}
/**
* Returns the Paintable who owns this {@link VAbstractDropHandler}. Server
* side counterpart of the Paintable is expected to implement
* {@link DropTarget} interface.
*/
@Override
public abstract ComponentConnector getConnector();
}