package org.gcube.portlets.user.geoportaldataviewer.client.ui.dandd; import java.util.LinkedHashMap; import org.gcube.application.geoportalcommon.shared.geoportal.geojson.GeoJSON; import org.gcube.application.geoportalcommon.shared.geoportal.project.TemporalReferenceDV; import org.gcube.portlets.user.geoportaldataviewer.client.GeoportalDataViewerServiceAsync; 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.resources.GNAImages; import org.gcube.portlets.user.geoportaldataviewer.client.ui.cms.project.ProjectUtil; import org.gcube.portlets.user.geoportaldataviewer.client.util.LoaderIcon; 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.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.FontWeight; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; 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.shared.HandlerManager; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class DragDropLayer extends FlowPanel { private static final String _22PX = "22px"; private static DragDropLayer dragging = null; private static DragDropLayer draggingTarget = null; final boolean droppable; private Label labelLayerName; private Image imgLayerVisible = new Image(GNAImages.ICONS.layerVisible()); private Image imgLayerInvisible = new Image(GNAImages.ICONS.layerInvisible()); private Image imgLocate = new Image(GNAImages.ICONS.locate()); private Image imgLocateNone = new Image(GNAImages.ICONS.locateNone()); private boolean locateEnabled = false; private HTML buttonLocate = new HTML(); private DragDropLayer INSTANCE = this; private LoaderIcon loaderIcon = new LoaderIcon("Loading features", null); private Button draggableButton = new Button(); private HandlerManager applicationBus; private LayerObject layerObject; private LayerItem layerItem; private com.google.gwt.user.client.ui.Label labelProject; private boolean layerVisibility = true; private HTML buttonLayerVisibility = new HTML(); public DragDropLayer(HandlerManager applicationBus, LayerObject layerObject, boolean draggable, boolean droppable) { this.applicationBus = applicationBus; this.layerObject = layerObject; this.layerItem = layerObject.getLayerItem(); GWT.log("DragDropLayer for projectDV: " + layerObject.getProjectDV()); // Checking the spatial reference if (layerObject.getProjectDV() != null && layerObject.getProjectDV().getSpatialReference() == null) { GeoportalDataViewerServiceAsync.Util.getInstance().getSpatialReference(layerObject.getProfileID(), layerObject.getProjectID(), new AsyncCallback() { @Override public void onFailure(Throwable caught) { // TODO Auto-generated method stub } @Override public void onSuccess(GeoJSON result) { if (result != null) layerObject.getProjectDV().setSpatialReference(result); } }); } String referProjectID = "Project ID: " + layerObject.getProjectDV().getId(); labelProject = new com.google.gwt.user.client.ui.Label(""); labelProject.setTitle(referProjectID); GeoportalDataViewerServiceAsync.Util.getInstance().getEntrySetsDocumentForProjectID( layerObject.getProjectDV().getProfileID(), layerObject.getProjectDV().getId(), 1, new AsyncCallback>() { @Override public void onSuccess(LinkedHashMap result) { String realProjectName = ""; if (result != null) { for (String key : result.keySet()) { result.get(key); //referProject = key + ": " + result.get(key); realProjectName = result.get(key)+""; break; } } if (realProjectName != null && !realProjectName.isEmpty()) { labelProject.setText(StringUtil.ellipsize(realProjectName, 40)); labelProject.setTitle(realProjectName); } } @Override public void onFailure(Throwable caught) { labelProject.setTitle("Error on reading the project name"); } }); String layerName = StringUtil.fullNameToLayerName(layerItem.getName(), ":"); this.labelLayerName = new Label(layerName); this.labelLayerName.setTitle(layerItem.getName()); this.labelLayerName.setType(LabelType.INFO); 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"); imgLayerVisible.getElement().addClassName("layer-visibility-st"); imgLayerInvisible.getElement().addClassName("layer-visibility-st"); imgLocate.setWidth(_22PX); imgLocate.setHeight(_22PX); imgLocateNone.setWidth(_22PX); imgLocateNone.setHeight(_22PX); imgLocate.getElement().addClassName("layer-visibility-st"); imgLocateNone.getElement().addClassName("layer-visibility-st"); setLocateEnabledButtonImage(); setLayerVisibilityButtonImage(); VerticalPanel vp = new VerticalPanel(); VerticalPanel vpInner = new VerticalPanel(); HorizontalPanel hp0 = new HorizontalPanel(); HorizontalPanel hpFunct = new HorizontalPanel(); vpInner.getElement().getStyle().setMarginLeft(47, Unit.PX); hp0.add(draggableButton); labelProject.getElement().getStyle().setMarginLeft(10, Unit.PX); labelProject.getElement().getStyle().setFontWeight(FontWeight.BOLD); hp0.add(labelProject); hpFunct.add(buttonLayerVisibility); hpFunct.add(buttonLocate); hpFunct.add(loaderIcon); setVisibleLoaderFeatures(false, null); if(layerObject.getProjectDV().getTemporalReference()!=null) { TemporalReferenceDV tempRef = layerObject.getProjectDV().getTemporalReference(); // ft.setWidget(ft.getRowCount() + 1, 2, new HTML(ProjectUtil.toHTMLCode(tempRef))); vpInner.add(new HTML(ProjectUtil.toHTMLCode(tempRef))); } vpInner.add(labelLayerName); // vpInner.add(new SimplePanel(rs)); vp.add(hp0); hpFunct.getElement().getStyle().setMarginTop(5, Unit.PX); vpInner.add(hpFunct); vpInner.add(new SimplePanel(rs)); vp.add(vpInner); add(vp); // add(ft); draggableButton.setIcon(IconType.MOVE); buttonLayerVisibility.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { layerVisibility = !layerVisibility; setLayerVisibilityButtonImage(); DoActionOnDetailLayersEvent dae = new DoActionOnDetailLayersEvent(DO_LAYER_ACTION.VISIBILITY, layerItem, layerObject); dae.setVisibility(layerVisibility); applicationBus.fireEvent(dae); } }); buttonLocate.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { locateEnabled = !locateEnabled; setLocateEnabledButtonImage(); DoActionOnDetailLayersEvent dae = new DoActionOnDetailLayersEvent(DO_LAYER_ACTION.LOCATE_LAYER, layerItem, layerObject); dae.setUIEventSource(INSTANCE); setVisibleLoaderFeatures(true, null); applicationBus.fireEvent(dae); } }); } private void setLayerVisibilityButtonImage() { buttonLayerVisibility.getElement().removeAllChildren(); if (layerVisibility) { buttonLayerVisibility.getElement().appendChild(imgLayerVisible.getElement()); buttonLayerVisibility.setTitle("Hide the layer"); } else { buttonLayerVisibility.getElement().appendChild(imgLayerInvisible.getElement()); buttonLayerVisibility.setTitle("Show the layer"); } } private void setLocateEnabledButtonImage() { buttonLocate.getElement().removeAllChildren(); if (locateEnabled) { buttonLocate.getElement().appendChild(imgLocate.getElement()); buttonLocate.setTitle("Unselect the layer features"); } else { buttonLocate.getElement().appendChild(imgLocateNone.getElement()); buttonLocate.setTitle("Highlight the layer features"); } } 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, layerObject); 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; } /** * Sets the visible loader features. * * @param bool the bool * @param msg the msg */ public void setVisibleLoaderFeatures(boolean bool, String msg) { loaderIcon.setVisible(bool); if(msg!=null) loaderIcon.setText(msg); } }