123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 |
- /*
- * Copyright 2000-2014 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.server;
-
- import java.io.IOException;
- import java.io.Writer;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.List;
- import java.util.Map;
- import java.util.logging.Level;
- import java.util.logging.Logger;
-
- import com.vaadin.event.Transferable;
- import com.vaadin.event.TransferableImpl;
- import com.vaadin.event.dd.DragAndDropEvent;
- import com.vaadin.event.dd.DragSource;
- import com.vaadin.event.dd.DropHandler;
- import com.vaadin.event.dd.DropTarget;
- import com.vaadin.event.dd.TargetDetails;
- import com.vaadin.event.dd.TargetDetailsImpl;
- import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
- import com.vaadin.shared.ApplicationConstants;
- import com.vaadin.shared.communication.SharedState;
- import com.vaadin.shared.ui.dd.DragEventType;
- import com.vaadin.ui.Component;
- import com.vaadin.ui.UI;
-
- import elemental.json.JsonObject;
-
- public class DragAndDropService implements VariableOwner, ClientConnector {
-
- private int lastVisitId;
-
- private boolean lastVisitAccepted = false;
-
- private DragAndDropEvent dragEvent;
-
- private final VaadinSession session;
-
- private AcceptCriterion acceptCriterion;
-
- private ErrorHandler errorHandler;
-
- public DragAndDropService(VaadinSession session) {
- this.session = session;
- }
-
- @Override
- public void changeVariables(Object source, Map<String, Object> variables) {
- Object owner = variables.get("dhowner");
-
- final Component sourceComponent = (Component) variables
- .get("component");
- if (sourceComponent != null && !sourceComponent.isConnectorEnabled()) {
- // source component not supposed to be enabled
- getLogger().warning(
- "Client dropped from " + sourceComponent
- + " even though it's disabled");
- return;
- }
-
- // Validate drop handler owner
- if (!(owner instanceof DropTarget)) {
- getLogger()
- .severe("DropHandler owner " + owner
- + " must implement DropTarget");
- return;
- }
- // owner cannot be null here
-
- DropTarget dropTarget = (DropTarget) owner;
-
- if (!dropTarget.isConnectorEnabled()) {
- getLogger()
- .warning(
- "Client dropped on " + owner
- + " even though it's disabled");
- return;
- }
-
- lastVisitId = (Integer) variables.get("visitId");
-
- // request may be dropRequest or request during drag operation (commonly
- // dragover or dragenter)
- boolean dropRequest = isDropRequest(variables);
- if (dropRequest) {
- handleDropRequest(dropTarget, variables);
- } else {
- handleDragRequest(dropTarget, variables);
- }
-
- }
-
- /**
- * Handles a drop request from the VDragAndDropManager.
- *
- * @param dropTarget
- * @param variables
- */
- private void handleDropRequest(DropTarget dropTarget,
- Map<String, Object> variables) {
- DropHandler dropHandler = (dropTarget).getDropHandler();
- if (dropHandler == null) {
- // No dropHandler returned so no drop can be performed.
- getLogger().log(Level.FINE,
- "DropTarget.getDropHandler() returned null for owner: {0}",
- dropTarget);
- return;
- }
-
- /*
- * Construct the Transferable and the DragDropDetails for the drop
- * operation based on the info passed from the client widgets (drag
- * source for Transferable, drop target for DragDropDetails).
- */
- Transferable transferable = constructTransferable(dropTarget, variables);
- TargetDetails dropData = constructDragDropDetails(dropTarget, variables);
- DragAndDropEvent dropEvent = new DragAndDropEvent(transferable,
- dropData);
- if (dropHandler.getAcceptCriterion().accept(dropEvent)) {
- dropHandler.drop(dropEvent);
- }
- }
-
- /**
- * Handles a drag/move request from the VDragAndDropManager.
- *
- * @param dropTarget
- * @param variables
- */
- private void handleDragRequest(DropTarget dropTarget,
- Map<String, Object> variables) {
- lastVisitId = (Integer) variables.get("visitId");
-
- acceptCriterion = dropTarget.getDropHandler().getAcceptCriterion();
-
- /*
- * Construct the Transferable and the DragDropDetails for the drag
- * operation based on the info passed from the client widgets (drag
- * source for Transferable, current target for DragDropDetails).
- */
- Transferable transferable = constructTransferable(dropTarget, variables);
- TargetDetails dragDropDetails = constructDragDropDetails(dropTarget,
- variables);
-
- dragEvent = new DragAndDropEvent(transferable, dragDropDetails);
-
- lastVisitAccepted = acceptCriterion.accept(dragEvent);
- }
-
- /**
- * Construct DragDropDetails based on variables from client drop target.
- * Uses DragDropDetailsTranslator if available, otherwise a default
- * DragDropDetails implementation is used.
- *
- * @param dropTarget
- * @param variables
- * @return
- */
- @SuppressWarnings("unchecked")
- private TargetDetails constructDragDropDetails(DropTarget dropTarget,
- Map<String, Object> variables) {
- Map<String, Object> rawDragDropDetails = (Map<String, Object>) variables
- .get("evt");
-
- TargetDetails dropData = dropTarget
- .translateDropTargetDetails(rawDragDropDetails);
-
- if (dropData == null) {
- // Create a default DragDropDetails with all the raw variables
- dropData = new TargetDetailsImpl(rawDragDropDetails, dropTarget);
- }
-
- return dropData;
- }
-
- private boolean isDropRequest(Map<String, Object> variables) {
- return getRequestType(variables) == DragEventType.DROP;
- }
-
- private DragEventType getRequestType(Map<String, Object> variables) {
- int type = (Integer) variables.get("type");
- return DragEventType.values()[type];
- }
-
- @SuppressWarnings("unchecked")
- private Transferable constructTransferable(DropTarget dropHandlerOwner,
- Map<String, Object> variables) {
- final Component sourceComponent = (Component) variables
- .get("component");
-
- variables = (Map<String, Object>) variables.get("tra");
-
- Transferable transferable = null;
- if (sourceComponent != null && sourceComponent instanceof DragSource) {
- transferable = ((DragSource) sourceComponent)
- .getTransferable(variables);
- }
- if (transferable == null) {
- transferable = new TransferableImpl(sourceComponent, variables);
- }
-
- return transferable;
- }
-
- @Override
- public boolean isEnabled() {
- return isConnectorEnabled();
- }
-
- @Override
- public boolean isImmediate() {
- return true;
- }
-
- public void printJSONResponse(Writer outWriter) throws IOException {
- if (isDirty()) {
-
- outWriter.write(", \"dd\":");
-
- JsonPaintTarget jsonPaintTarget = new JsonPaintTarget(
- session.getCommunicationManager(), outWriter, false);
- jsonPaintTarget.startTag("dd");
- jsonPaintTarget.addAttribute("visitId", lastVisitId);
- if (acceptCriterion != null) {
- jsonPaintTarget.addAttribute("accepted", lastVisitAccepted);
- acceptCriterion.paintResponse(jsonPaintTarget);
- }
- jsonPaintTarget.endTag("dd");
- jsonPaintTarget.close();
- lastVisitId = -1;
- lastVisitAccepted = false;
- acceptCriterion = null;
- dragEvent = null;
- }
- }
-
- private boolean isDirty() {
- if (lastVisitId > 0) {
- return true;
- }
- return false;
- }
-
- @Override
- public String getConnectorId() {
- return ApplicationConstants.DRAG_AND_DROP_CONNECTOR_ID;
- }
-
- @Override
- public boolean isConnectorEnabled() {
- // Drag'n'drop can't be disabled
- return true;
- }
-
- @Override
- public List<ClientMethodInvocation> retrievePendingRpcCalls() {
- return null;
- }
-
- @Override
- public ServerRpcManager<?> getRpcManager(String interfaceName) {
- // TODO Use rpc for drag'n'drop
- return null;
- }
-
- @Override
- public Class<? extends SharedState> getStateType() {
- return SharedState.class;
- }
-
- @Override
- @Deprecated
- public void requestRepaint() {
- markAsDirty();
- }
-
- @Override
- public void markAsDirty() {
- }
-
- @Override
- public ClientConnector getParent() {
- return null;
- }
-
- @Override
- @Deprecated
- public void requestRepaintAll() {
- markAsDirtyRecursive();
- }
-
- @Override
- public void markAsDirtyRecursive() {
- }
-
- @Override
- public void attach() {
- }
-
- @Override
- public void detach() {
- }
-
- @Override
- public Collection<Extension> getExtensions() {
- return Collections.emptySet();
- }
-
- @Override
- public void removeExtension(Extension extension) {
- }
-
- private Logger getLogger() {
- return Logger.getLogger(DragAndDropService.class.getName());
- }
-
- @Override
- public UI getUI() {
- return null;
- }
-
- @Override
- public void beforeClientResponse(boolean initial) {
- // Nothing to do
- }
-
- @Override
- public JsonObject encodeState() {
- return null;
- }
-
- @Override
- public boolean handleConnectorRequest(VaadinRequest request,
- VaadinResponse response, String path) throws IOException {
- return false;
- }
-
- @Override
- public ErrorHandler getErrorHandler() {
- return errorHandler;
- }
-
- @Override
- public void setErrorHandler(ErrorHandler errorHandler) {
- this.errorHandler = errorHandler;
- }
-
- @Override
- public void addAttachListener(AttachListener listener) {
- }
-
- @Override
- public void removeAttachListener(AttachListener listener) {
- }
-
- @Override
- public void addDetachListener(DetachListener listener) {
- }
-
- @Override
- public void removeDetachListener(DetachListener listener) {
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.vaadin.server.ClientConnector#isAttached()
- */
- @Override
- public boolean isAttached() {
- return true;
- }
- }
|