164 lines
5.4 KiB
Java
164 lines
5.4 KiB
Java
package org.gcube.portlets.user.geoportaldataviewer.client.ui.dandd;
|
|
|
|
import org.gcube.portlets.user.geoportaldataviewer.client.events.DoActionOnDetailLayersEvent;
|
|
import org.gcube.portlets.user.geoportaldataviewer.client.events.DoActionOnDetailLayersEvent.DO_LAYER_ACTION;
|
|
import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem;
|
|
|
|
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.event.logical.shared.ValueChangeEvent;
|
|
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
|
import com.google.gwt.event.shared.HandlerManager;
|
|
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();
|
|
private HandlerManager applicationBus;
|
|
|
|
public DragDropLayer(HandlerManager applicationBus, LayerItem layer, boolean draggable, boolean droppable) {
|
|
this.applicationBus = applicationBus;
|
|
|
|
int layerSep = layer.getName().lastIndexOf(":");
|
|
String layerName = layerSep > 0 && (layerSep + 1) < layer.getName().length()
|
|
? layer.getName().substring(layerSep + 1, layer.getName().length())
|
|
: layer.getName();
|
|
|
|
this.label = new Label(layerName);
|
|
this.label.setTitle(layer.getName());
|
|
|
|
getElement().getStyle().setMarginTop(5, Unit.PX);
|
|
getElement().getStyle().setMarginBottom(10, Unit.PX);
|
|
setWidth("350px");
|
|
|
|
if (draggable) {
|
|
initDrag();
|
|
}
|
|
if (droppable) {
|
|
initDrop();
|
|
}
|
|
this.droppable = droppable;
|
|
|
|
if (droppable) {
|
|
button.addStyleName("droppable");
|
|
} else if (draggable) {
|
|
button.addStyleName("draggable");
|
|
}
|
|
|
|
RangeSlider rs = new RangeSlider();
|
|
rs.setWidth("250px");
|
|
FlexTable ft = new FlexTable();
|
|
ft.setWidget(0, 0, button);
|
|
checkBoxVisibility.getElement().getStyle().setMarginLeft(10, Unit.PX);
|
|
checkBoxVisibility.setValue(true);
|
|
|
|
label.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);
|
|
|
|
checkBoxVisibility.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
|
|
|
|
@Override
|
|
public void onValueChange(ValueChangeEvent<Boolean> event) {
|
|
DoActionOnDetailLayersEvent dae = new DoActionOnDetailLayersEvent(DO_LAYER_ACTION.VISIBILITY, layer,
|
|
null);
|
|
dae.setVisibility(checkBoxVisibility.getValue());
|
|
applicationBus.fireEvent(dae);
|
|
|
|
}
|
|
});
|
|
}
|
|
|
|
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());
|
|
}
|
|
|
|
}
|