From 79948ad6bd0142a645cf2b7dbaa9f6e1f528d8c2 Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Tue, 12 Oct 2021 12:42:25 +0200 Subject: [PATCH] #21991 first version of Layer Switcher has been implemented --- CHANGELOG.md | 1 + .../client/GeoportalDataViewer.java | 15 ++- .../client/LayerManager.java | 10 -- .../client/OLMapManager.java | 2 +- .../events/DoActionOnDetailLayersEvent.java | 108 +++++++++++++---- .../client/gis/OpenLayerOSM.java | 112 +++++++----------- .../client/ui/dandd/DragDropLayer.java | 41 ++++--- .../client/ui/dandd/RangeSlider.java | 64 ++++++---- .../client/ui/dandd/RangeSlider.ui.xml | 2 +- 9 files changed, 210 insertions(+), 145 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb933d1..7912a35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - [#22042] Implemented the public access - [#22040] Revisited the "Abstract and Relazione di Scavo" - [#22041] Files have been ported to FileSet model +- [#21991] Implement the Layer Switcher ## [v1.2.0-SNAPSHOT] - 2021-07-19 diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java index 0ea872f..74be1f1 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/GeoportalDataViewer.java @@ -26,6 +26,7 @@ import org.gcube.portlets.user.geoportaldataviewer.client.events.ZoomOutOverMini import org.gcube.portlets.user.geoportaldataviewer.client.events.ZoomOutOverMinimumEventHandler; import org.gcube.portlets.user.geoportaldataviewer.client.gis.ExtentWrapped; import org.gcube.portlets.user.geoportaldataviewer.client.gis.MapUtils; +import org.gcube.portlets.user.geoportaldataviewer.client.gis.OpenLayerOSM; import org.gcube.portlets.user.geoportaldataviewer.client.ui.GeonaDataViewMainPanel; import org.gcube.portlets.user.geoportaldataviewer.client.util.URLUtil; import org.gcube.portlets.user.geoportaldataviewer.shared.gis.GeoQuery; @@ -367,24 +368,28 @@ public class GeoportalDataViewer implements EntryPoint { DO_LAYER_ACTION doAction = doLayerActionEvent.getDoAction(); GWT.log("event: "+doAction); - GWT.log("layer source: "+doLayerActionEvent.getLayerSource().getName()); - GWT.log("layer target: "+doLayerActionEvent.getLayerTarget()); + GWT.log("layer source: "+doLayerActionEvent.getLayerItem().getName()); + OpenLayerOSM olMap = olMapMng.getOLOSMMap(); switch (doAction) { case OPACITY: GWT.log("opacity: "+doLayerActionEvent.getOpacity()); - olMapMng.getOLOSMMap().setWMSDetailLayerOpacity(doLayerActionEvent.getLayerSource(), + olMap.setWMSDetailLayerOpacity(doLayerActionEvent.getLayerItem(), doLayerActionEvent.getOpacity()); break; case SWAP: - + org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem sourceLayerSwap = doLayerActionEvent.getSourceLayerSwap(); + org.gcube.portlets.user.geoportaldataviewer.shared.gis.LayerItem target = doLayerActionEvent.getTargetLayerSwap(); + GWT.log("SWAPPING source "+sourceLayerSwap.getName() +", target: "+target.getName()); + olMap.swapDetailsLayers(sourceLayerSwap.getName(), target.getName()); break; case VISIBILITY: GWT.log("visibility: "+doLayerActionEvent.getVisibility()); - olMapMng.getOLOSMMap().setWMSDetailLayerVisible(doLayerActionEvent.getLayerSource(), + olMap.setWMSDetailLayerVisible(doLayerActionEvent.getLayerItem(), doLayerActionEvent.getVisibility()); + break; default: diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/LayerManager.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/LayerManager.java index d2fac8f..bafc06c 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/LayerManager.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/LayerManager.java @@ -808,16 +808,6 @@ public class LayerManager { } - /** - * Checks if is layer visible. - * - * @param layerItem the layer item - * @return true, if is layer visible - */ - public boolean isLayerVisible(LayerItem layerItem) { - return olMap.isLayerVisible(layerItem.getName()); - } - /** * Sets the ol map. * diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java index 6914a0a..150922f 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/OLMapManager.java @@ -38,7 +38,7 @@ public class OLMapManager { private ol.Extent dragEndExtent = null; public static final int QUERY_MIN_ZOOM_LEVEL = 13; public static final Double LAYER_DETAIL_MIN_RESOLUTION = 0.01; - public static final Double LAYER_DETAIL_MAX_RESOLUTION = 13.0; + public static final Double LAYER_DETAIL_MAX_RESOLUTION = 13.2; /** diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/DoActionOnDetailLayersEvent.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/DoActionOnDetailLayersEvent.java index b74e257..20aa606 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/DoActionOnDetailLayersEvent.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/events/DoActionOnDetailLayersEvent.java @@ -9,7 +9,7 @@ import com.google.gwt.event.shared.GwtEvent; * * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it * - * Oct 8, 2021 + * Oct 12, 2021 */ public class DoActionOnDetailLayersEvent extends GwtEvent { public static Type TYPE = new Type(); @@ -19,35 +19,56 @@ public class DoActionOnDetailLayersEvent extends GwtEvent wmsDetailsLayerMap; + private LinkedHashMap wmsDetailsLayerMap; private Integer[] wmsDetailsLayerZIndex = new Integer[100]; - private HashMap wmsLayerMap; + private LinkedHashMap wmsLayerMap; /** * Instantiates a new open layer OSM. @@ -341,7 +340,7 @@ public abstract class OpenLayerOSM { public void addWMSLayer(LayerItem layerItem) { if (wmsLayerMap == null) - wmsLayerMap = new HashMap(); + wmsLayerMap = new LinkedHashMap(); String key = layerItem.getName(); @@ -391,7 +390,7 @@ public abstract class OpenLayerOSM { public void addWMSDetailLayer(LayerItem layerItem) { if (wmsDetailsLayerMap == null) - wmsDetailsLayerMap = new HashMap(); + wmsDetailsLayerMap = new LinkedHashMap(); String key = layerItem.getName(); @@ -422,7 +421,7 @@ public abstract class OpenLayerOSM { Image wmsLayer = new Image(layerOptions); map.addLayer(wmsLayer); wmsDetailsLayerMap.put(key, wmsLayer); - + GWT.log("Added WMSDetailLayer for layer name: " + layerItem.getName()); eventBus.fireEvent(new AddedLayerToMapEvent(layerItem, LAYER_TYPE.OVERLAY)); } else { @@ -577,55 +576,6 @@ public abstract class OpenLayerOSM { return overlay; } - /** - * Checks if is layer visible. - * - * @param layerName the layer name - * @return true, if is layer visible - */ - public boolean isLayerVisible(String layerName) { - - Collection layers = map.getLayers(); - - if (layers != null) { - Base[] layersArr = layers.getArray(); - for (int i = 0; i < layersArr.length; i++) { - Base layer = layersArr[i]; - String theLayerName = (String) layer.get("name"); - GWT.log("The Layer name is: " + theLayerName); - if (theLayerName != null && theLayerName.equals(layerName)) - return true; - } - } - - return false; - } - - /** - * Gets the layer property. - * - * @param layerName the layer name - * @param property the property - * @return the layer property - */ - public String getLayerProperty(String layerName, String property) { - - Collection layers = map.getLayers(); - - if (layers != null) { - Base[] layersArr = layers.getArray(); - for (int i = 0; i < layersArr.length; i++) { - Base layer = layersArr[i]; - String theLayerName = (String) layer.get("name"); - GWT.log("The Layer name is: " + layerName); - if (theLayerName != null && theLayerName.equals(layerName)) - return layer.get(property); - } - } - - return null; - } - /** * Gets the projection code. * @@ -724,9 +674,9 @@ public abstract class OpenLayerOSM { * * @return the layers from map */ - public List getLayersFromMap() { + public ArrayList getLayersFromMap() { Collection layers = map.getLayers(); - List layerNames = null; + ArrayList layerNames = null; if (layers != null) { Base[] layersArr = layers.getArray(); layerNames = new ArrayList(layersArr.length); @@ -759,7 +709,7 @@ public abstract class OpenLayerOSM { * * @return the wms details layer map */ - public java.util.Map getWmsDetailsLayerMap() { + public LinkedHashMap getWmsDetailsLayerMap() { return wmsDetailsLayerMap; } @@ -768,34 +718,60 @@ public abstract class OpenLayerOSM { * * @return the wms layer map */ - public HashMap getWmsLayerMap() { + public LinkedHashMap getWmsLayerMap() { return wmsLayerMap; } + /** + * Sets the WMS detail layer visible. + * + * @param layerItem the layer item + * @param visible the visible + */ public void setWMSDetailLayerVisible(LayerItem layerItem, boolean visible) { String key = layerItem.getName(); - GWT.log("current layers: "+wmsDetailsLayerMap.keySet()); Image layer = wmsDetailsLayerMap.get(key); layer.setVisible(visible); } - public void setWMSDetailLayerOpacity(LayerItem layerItem, int opacity) { + /** + * Sets the WMS detail layer opacity. + * + * @param layerItem the layer item + * @param opacity the opacity + */ + public void setWMSDetailLayerOpacity(LayerItem layerItem, double opacity) { String key = layerItem.getName(); Image layer = wmsDetailsLayerMap.get(key); layer.setOpacity(opacity); } - public void swapLayers(LayerItem layerItem, LayerItem layerItem2) { - String key1 = layerItem.getName(); - Image layer1 = wmsDetailsLayerMap.get(key1); - - String key2 = layerItem.getName(); - Image layer2 = wmsDetailsLayerMap.get(key2); + /** + * Swap details layers. + * + * @param layerSource the source index + * @param layerTarget the target index + */ + public void swapDetailsLayers(String layerSource, String layerTarget) { + Image layer1 = wmsDetailsLayerMap.get(layerSource); + Image layer2 = wmsDetailsLayerMap.get(layerTarget); int zIndex1 = layer1.getZIndex(); int zIndex2 = layer2.getZIndex(); layer1.setZIndex(zIndex2); layer2.setZIndex(zIndex1); + + } + + /** + * Gets the layer by index. + * + * @param map the map + * @param index the index + * @return the layer by index + */ + private Image getLayerByIndex(LinkedHashMap map, int index) { + return map.get((map.keySet().toArray())[index]); } } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/DragDropLayer.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/DragDropLayer.java index a371124..9301ee3 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/DragDropLayer.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/DragDropLayer.java @@ -34,11 +34,13 @@ public class DragDropLayer extends FlowPanel { final boolean droppable; private Label label; private CheckBox checkBoxVisibility = new CheckBox(); - private Button button = new Button(); + private Button draggableButton = new Button(); private HandlerManager applicationBus; + private LayerItem layerItem; public DragDropLayer(HandlerManager applicationBus, LayerItem layer, boolean draggable, boolean droppable) { this.applicationBus = applicationBus; + this.layerItem = layer; int layerSep = layer.getName().lastIndexOf(":"); String layerName = layerSep > 0 && (layerSep + 1) < layer.getName().length() @@ -61,15 +63,16 @@ public class DragDropLayer extends FlowPanel { this.droppable = droppable; if (droppable) { - button.addStyleName("droppable"); + draggableButton.addStyleName("droppable"); } else if (draggable) { - button.addStyleName("draggable"); + draggableButton.addStyleName("draggable"); } - RangeSlider rs = new RangeSlider(); + RangeSlider rs = new RangeSlider(applicationBus, layer); rs.setWidth("250px"); FlexTable ft = new FlexTable(); - ft.setWidget(0, 0, button); + ft.setWidget(0, 0, draggableButton); + draggableButton.setTitle("Drag me to change my position"); checkBoxVisibility.getElement().getStyle().setMarginLeft(10, Unit.PX); checkBoxVisibility.setValue(true); @@ -78,14 +81,13 @@ public class DragDropLayer extends FlowPanel { ft.setWidget(0, 2, label); ft.setWidget(1, 2, new SimplePanel(rs)); add(ft); - button.setIcon(IconType.MOVE); + draggableButton.setIcon(IconType.MOVE); checkBoxVisibility.addValueChangeHandler(new ValueChangeHandler() { @Override public void onValueChange(ValueChangeEvent event) { - DoActionOnDetailLayersEvent dae = new DoActionOnDetailLayersEvent(DO_LAYER_ACTION.VISIBILITY, layer, - null); + DoActionOnDetailLayersEvent dae = new DoActionOnDetailLayersEvent(DO_LAYER_ACTION.VISIBILITY, layer); dae.setVisibility(checkBoxVisibility.getValue()); applicationBus.fireEvent(dae); @@ -94,7 +96,7 @@ public class DragDropLayer extends FlowPanel { } private void initDrag() { - button.getElement().setDraggable(Element.DRAGGABLE_TRUE); + draggableButton.getElement().setDraggable(Element.DRAGGABLE_TRUE); addDomHandler(new DragStartHandler() { @@ -113,7 +115,7 @@ public class DragDropLayer extends FlowPanel { addDomHandler(new DragOverHandler() { @Override public void onDragOver(DragOverEvent event) { - button.addStyleName("dropping-over"); + draggableButton.addStyleName("dropping-over"); GWT.log("drag over"); draggingTarget = (DragDropLayer) event.getSource(); } @@ -122,7 +124,7 @@ public class DragDropLayer extends FlowPanel { addDomHandler(new DragLeaveHandler() { @Override public void onDragLeave(DragLeaveEvent event) { - button.removeStyleName("dropping-over"); + draggableButton.removeStyleName("dropping-over"); GWT.log("drag leave"); // draggingTarget = (DragDropLayer) event.getSource(); } @@ -134,17 +136,18 @@ public class DragDropLayer extends FlowPanel { event.preventDefault(); Object dropTarget = event.getSource(); GWT.log("on drop"); - button.removeStyleName("dropping-over"); + draggableButton.removeStyleName("dropping-over"); if (dragging != null) { - Widget target = 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); - GWT.log("targetIndex: " + targetIndex); + + 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; @@ -152,6 +155,10 @@ public class DragDropLayer extends FlowPanel { if (source != null && target != null) { tree.insert(source, targetIndex); // target.setState(true); + DoActionOnDetailLayersEvent actionSwapLayers = new DoActionOnDetailLayersEvent( + DO_LAYER_ACTION.SWAP, layerItem); + actionSwapLayers.setSwapLayers(dragging.getLayerItem(), draggingTarget.getLayerItem()); + applicationBus.fireEvent(actionSwapLayers); } dragging = null; } @@ -159,5 +166,9 @@ public class DragDropLayer extends FlowPanel { } }, DropEvent.getType()); } + + public LayerItem getLayerItem() { + return layerItem; + } } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/RangeSlider.java b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/RangeSlider.java index ed5a97e..b012a2e 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/RangeSlider.java +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/RangeSlider.java @@ -1,9 +1,12 @@ 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.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; -import com.google.gwt.event.dom.client.DragStartEvent; -import com.google.gwt.event.dom.client.DragStartHandler; +import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Event; @@ -18,33 +21,52 @@ public class RangeSlider extends Composite { interface RangeSliderUiBinder extends UiBinder { } - + @UiField Element theSlider; - + private String sliderId; - public RangeSlider() { + private HandlerManager applicationBus; + + private LayerItem layer; + + public RangeSlider(HandlerManager applicationBus, LayerItem layer) { + this.applicationBus = applicationBus; + this.layer = layer; initWidget(uiBinder.createAndBindUi(this)); - String sliderId = "slider-" +Random.nextInt(); + sliderId = "slider-" + Random.nextInt(); theSlider.addClassName("slider"); theSlider.setId(sliderId); - Event.sinkEvents(theSlider, Event.ONMOUSEUP); - Event.setEventListener(theSlider, new EventListener() { + theSlider.setTitle("Set opacity of "+layer.getName()); - @Override - public void onBrowserEvent(Event event) { - System.out.println("ok"); - if(Event.ONMOUSEUP == event.getTypeInt()) { - GWT.log("Event.ONMOUSEUP"); - GWT.log("obj"+theSlider.getPropertyObject("value")); - GWT.log("attr"+theSlider.getAttribute("value")); - } - - } - }); - + bindEvents(); } - + + private void bindEvents() { + + Event.sinkEvents(theSlider, Event.ONMOUSEUP); + Event.setEventListener(theSlider, new EventListener() { + + @Override + public void onBrowserEvent(Event event) { + System.out.println("ok"); + if (Event.ONMOUSEUP == event.getTypeInt()) { + GWT.log("Event.ONMOUSEUP"); + DoActionOnDetailLayersEvent actionChangeOpacity = new DoActionOnDetailLayersEvent( + DO_LAYER_ACTION.OPACITY, layer); + int value = Integer.parseInt((String) theSlider.getPropertyObject("value")); + GWT.log("opacity int value: "+value); + double opacity = (double) ((double) value/100); + GWT.log("opacity double value: "+opacity); + actionChangeOpacity.setOpacity(opacity); + applicationBus.fireEvent(actionChangeOpacity); + } + + } + }); + + } + } diff --git a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/RangeSlider.ui.xml b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/RangeSlider.ui.xml index 574b54e..f9cfa64 100644 --- a/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/RangeSlider.ui.xml +++ b/src/main/java/org/gcube/portlets/user/geoportaldataviewer/client/ui/dandd/RangeSlider.ui.xml @@ -11,6 +11,6 @@ } - + \ No newline at end of file