geoportal-data-viewer-app/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/DragDropLayer.java

131 lines
4.0 KiB
Java

package org.gcube.portlets.user.geoportaldataviewer.client.ui.dandd;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.CheckBox;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.DragLeaveEvent;
import com.google.gwt.event.dom.client.DragLeaveHandler;
import com.google.gwt.event.dom.client.DragOverEvent;
import com.google.gwt.event.dom.client.DragOverHandler;
import com.google.gwt.event.dom.client.DragStartEvent;
import com.google.gwt.event.dom.client.DragStartHandler;
import com.google.gwt.event.dom.client.DropEvent;
import com.google.gwt.event.dom.client.DropHandler;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class DragDropLayer extends FlowPanel {
private static DragDropLayer dragging = null;
private static DragDropLayer draggingTarget = null;
final boolean droppable;
private Label label;
private CheckBox checkBoxVisibility = new CheckBox();
private Button button = new Button();
public DragDropLayer(String text, boolean draggable, boolean droppable) {
this.label = new Label(text);
getElement().getStyle().setMarginTop(5, Unit.PX);
getElement().getStyle().setMarginBottom(10, Unit.PX);
if (draggable) {
initDrag();
}
if (droppable) {
initDrop();
}
this.droppable = droppable;
if (droppable) {
button.addStyleName("droppable");
} else if (draggable) {
button.addStyleName("draggable");
}
RangeSlider rs = new RangeSlider();
FlexTable ft = new FlexTable();
ft.setWidget(0, 0, button);
checkBoxVisibility.getElement().getStyle().setMarginLeft(10, Unit.PX);
ft.setWidget(0, 1, checkBoxVisibility);
ft.setWidget(0, 2, label);
ft.setWidget(1, 2, new SimplePanel(rs));
add(ft);
button.setIcon(IconType.MOVE);
}
private void initDrag() {
button.getElement().setDraggable(Element.DRAGGABLE_TRUE);
addDomHandler(new DragStartHandler() {
@Override
public void onDragStart(DragStartEvent event) {
dragging = DragDropLayer.this;
event.setData("ID", "UniqueIdentifier");
event.getDataTransfer().setDragImage(getElement(), 10, 10);
}
}, DragStartEvent.getType());
}
private void initDrop() {
addDomHandler(new DragOverHandler() {
@Override
public void onDragOver(DragOverEvent event) {
button.addStyleName("dropping-over");
GWT.log("drag over");
draggingTarget = (DragDropLayer) event.getSource();
}
}, DragOverEvent.getType());
addDomHandler(new DragLeaveHandler() {
@Override
public void onDragLeave(DragLeaveEvent event) {
button.removeStyleName("dropping-over");
GWT.log("drag leave");
// draggingTarget = (DragDropLayer) event.getSource();
}
}, DragLeaveEvent.getType());
addDomHandler(new DropHandler() {
@Override
public void onDrop(DropEvent event) {
event.preventDefault();
Object dropTarget = event.getSource();
GWT.log("on drop");
button.removeStyleName("dropping-over");
if (dragging != null) {
Widget target = null;
Widget source = null;
FlowPanel tree = (FlowPanel) DragDropLayer.this.getParent();
source = dragging;
int sourceIndex = tree.getWidgetIndex(source);
int targetIndex = tree.getWidgetIndex(draggingTarget);
GWT.log("sourceIndex: " + sourceIndex);
GWT.log("targetIndex: " + targetIndex);
if (sourceIndex != targetIndex && targetIndex > 0) {
tree.remove(source);
target = tree;
if (source != null && target != null) {
tree.insert(source, targetIndex);
// target.setState(true);
}
dragging = null;
}
}
}
}, DropEvent.getType());
}
}