From 125d2a926c1bc7213e732da053cc7ea5cb019c50 Mon Sep 17 00:00:00 2001 From: Adam Wagner Date: Mon, 10 Apr 2017 16:28:22 +0300 Subject: Make Button component draggable (#9038) * Make Button component draggable (#9037) * Add own state to button drag source --- .../extensions/ButtonDragSourceConnector.java | 58 ++++++++++++++++++++++ .../main/java/com/vaadin/client/ui/VButton.java | 30 ++++++++++- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 client/src/main/java/com/vaadin/client/extensions/ButtonDragSourceConnector.java (limited to 'client/src') diff --git a/client/src/main/java/com/vaadin/client/extensions/ButtonDragSourceConnector.java b/client/src/main/java/com/vaadin/client/extensions/ButtonDragSourceConnector.java new file mode 100644 index 0000000000..4c07d7a7e1 --- /dev/null +++ b/client/src/main/java/com/vaadin/client/extensions/ButtonDragSourceConnector.java @@ -0,0 +1,58 @@ +/* + * 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.extensions; + +import com.vaadin.client.ServerConnector; +import com.vaadin.client.ui.VButton; +import com.vaadin.client.ui.button.ButtonConnector; +import com.vaadin.event.dnd.ButtonDragSource; +import com.vaadin.shared.ui.Connect; +import com.vaadin.shared.ui.dnd.ButtonDragSourceState; + +/** + * Extension to make Button a drag source for HTML5 drag and drop functionality. + * + * @author Vaadin Ltd. + * @since 8.1 + */ +@Connect(ButtonDragSource.class) +public class ButtonDragSourceConnector extends DragSourceExtensionConnector { + + private VButton buttonWidget; + + @Override + protected void extend(ServerConnector target) { + super.extend(target); + + buttonWidget = ((ButtonConnector) target).getWidget(); + + // Disable mouse event capturing to make the widget draggable + buttonWidget.setCapturingEnabled(false); + } + + @Override + public void onUnregister() { + super.onUnregister(); + + // Reset mouse event capturing + buttonWidget.setCapturingEnabled(true); + } + + @Override + public ButtonDragSourceState getState() { + return (ButtonDragSourceState) super.getState(); + } +} diff --git a/client/src/main/java/com/vaadin/client/ui/VButton.java b/client/src/main/java/com/vaadin/client/ui/VButton.java index d3bba9549c..6a32b32439 100644 --- a/client/src/main/java/com/vaadin/client/ui/VButton.java +++ b/client/src/main/java/com/vaadin/client/ui/VButton.java @@ -67,6 +67,13 @@ public class VButton extends FocusWidget implements ClickHandler { private int tabIndex = 0; + /** + * Switch for disabling mouse capturing. + * + * @see #isCapturing + */ + private boolean capturingEnabled = true; + /* * BELOW PRIVATE MEMBERS COPY-PASTED FROM GWT CustomButton */ @@ -199,7 +206,7 @@ public class VButton extends FocusWidget implements ClickHandler { clickPending = true; setFocus(true); DOM.setCapture(getElement()); - isCapturing = true; + isCapturing = isCapturingEnabled(); addStyleName(CLASSNAME_PRESSED); } break; @@ -412,6 +419,27 @@ public class VButton extends FocusWidget implements ClickHandler { } } + /** + * Enables or disables the widget's capturing of mouse events with the mouse + * held down. + * + * @param enabled + * {@literal true} if capturing enabled, {@literal false} otherwise + */ + public void setCapturingEnabled(boolean enabled) { + capturingEnabled = enabled; + } + + /** + * Returns if the widget's capturing of mouse events are enabled. + * + * @return {@literal true} if mouse capturing is enabled, {@literal false} + * otherwise + */ + public boolean isCapturingEnabled() { + return capturingEnabled; + } + private static native int getHorizontalBorderAndPaddingWidth(Element elem) /*-{ // THIS METHOD IS ONLY USED FOR INTERNET EXPLORER, IT DOESN'T WORK WITH OTHERS -- cgit v1.2.3