package org.gcube.portlets.user.geoportaldataviewer.client.ui.dandd; import org.gcube.application.geoportalcommon.shared.products.BaseConcessioneDV; 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.client.events.DoActionOnDetailLayersEvent.SwapLayer; import org.gcube.portlets.user.geoportaldataviewer.client.util.StringUtil; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerObject; import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.CheckBox; import com.github.gwtbootstrap.client.ui.Label; import com.github.gwtbootstrap.client.ui.constants.IconType; import com.github.gwtbootstrap.client.ui.constants.LabelType; 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.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 labelLayerName; private CheckBox checkBoxVisibility = new CheckBox(); private Button draggableButton = new Button(); private HandlerManager applicationBus; private LayerObject layerObject; private LayerItem layerItem; public DragDropLayer(HandlerManager applicationBus, LayerObject layerObject, boolean draggable, boolean droppable) { this.applicationBus = applicationBus; this.layerObject = layerObject; this.layerItem = layerObject.getLayerItem(); String layerName = StringUtil.fullNameToLayerName(layerItem.getName(), ":"); this.labelLayerName = new Label(layerName); this.labelLayerName.setTitle(layerItem.getName()); this.labelLayerName.setType(LabelType.INFO); BaseConcessioneDV refConcessione = layerObject.getSourceConcessione(); String nameConcessione = StringUtil.ellipsize(refConcessione.getNome(),40); com.google.gwt.user.client.ui.Label labelConcessione = new com.google.gwt.user.client.ui.Label(nameConcessione); labelConcessione.setTitle(refConcessione.getNome()); getElement().getStyle().setMarginTop(5, Unit.PX); getElement().getStyle().setMarginBottom(10, Unit.PX); this.getElement().addClassName("dand-layer"); if (draggable) { initDrag(); } if (droppable) { initDrop(); } this.droppable = droppable; if (droppable) { draggableButton.addStyleName("droppable"); } else if (draggable) { draggableButton.addStyleName("draggable"); } RangeSlider rs = new RangeSlider(applicationBus, layerItem); rs.getElement().addClassName("range-slider "); FlexTable ft = new FlexTable(); ft.setWidget(0, 0, draggableButton); draggableButton.setTitle("Drag and Drop me up or down to change my position on the Map"); checkBoxVisibility.getElement().getStyle().setMarginLeft(10, Unit.PX); checkBoxVisibility.setValue(true); //labelLayerName.getElement().getStyle().setMarginLeft(10, Unit.PX); ft.setWidget(0, 1, checkBoxVisibility); ft.setWidget(0, 2, labelConcessione); ft.setWidget(1, 2, labelLayerName); ft.setWidget(2, 2, new SimplePanel(rs)); add(ft); draggableButton.setIcon(IconType.MOVE); checkBoxVisibility.addValueChangeHandler(new ValueChangeHandler() { @Override public void onValueChange(ValueChangeEvent event) { DoActionOnDetailLayersEvent dae = new DoActionOnDetailLayersEvent(DO_LAYER_ACTION.VISIBILITY, layerItem); dae.setVisibility(checkBoxVisibility.getValue()); applicationBus.fireEvent(dae); } }); } private void initDrag() { draggableButton.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) { draggableButton.addStyleName("dropping-over"); GWT.log("drag over"); draggingTarget = (DragDropLayer) event.getSource(); } }, DragOverEvent.getType()); addDomHandler(new DragLeaveHandler() { @Override public void onDragLeave(DragLeaveEvent event) { draggableButton.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"); draggableButton.removeStyleName("dropping-over"); if (dragging != null) { Widget source = null; Widget target = null; FlowPanel tree = (FlowPanel) DragDropLayer.this.getParent(); source = dragging; int sourceIndex = tree.getWidgetIndex(source); int targetIndex = tree.getWidgetIndex(draggingTarget); GWT.log("sourceIndex: " + sourceIndex+", sourceItem: "+dragging.getLayerItem().getName()); GWT.log("targetIndex: " + targetIndex+", targetItem: "+draggingTarget.getLayerItem().getName()); if (sourceIndex != targetIndex && targetIndex >= 0) { tree.remove(source); target = tree; if (source != null && target != null) { tree.insert(source, targetIndex); // target.setState(true); DoActionOnDetailLayersEvent actionSwapLayers = new DoActionOnDetailLayersEvent( DO_LAYER_ACTION.SWAP, layerItem); SwapLayer swapLS = new DoActionOnDetailLayersEvent.SwapLayer(dragging.getLayerItem(), sourceIndex); SwapLayer swapLT = new DoActionOnDetailLayersEvent.SwapLayer(draggingTarget.getLayerItem(), targetIndex); actionSwapLayers.setSwapLayers(swapLS, swapLT); applicationBus.fireEvent(actionSwapLayers); } dragging = null; } } } }, DropEvent.getType()); } public LayerItem getLayerItem() { return layerItem; } }