/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.widget.layer.client.presenter; import com.google.gwt.event.shared.HandlerRegistration; import com.smartgwt.client.widgets.grid.ListGrid; import org.geomajas.gwt.client.map.event.LayerChangedHandler; import org.geomajas.gwt.client.map.event.LayerLabeledEvent; import org.geomajas.gwt.client.map.event.LayerShownEvent; import org.geomajas.gwt.client.map.event.MapModelChangedEvent; import org.geomajas.gwt.client.map.event.MapModelChangedHandler; import org.geomajas.gwt.client.map.layer.Layer; import org.geomajas.gwt.client.map.layer.RasterLayer; import org.geomajas.gwt.client.map.layer.VectorLayer; import org.geomajas.gwt.client.widget.MapWidget; import java.util.ArrayList; import java.util.List; /** * Default implementation of {@link LayerListPresenter}. * The layers list is retrieved from a {@link MapWidget}. * * @author Jan Venstermans * */ public class LayerListPresenterImpl implements LayerListPresenter, LayerListPresenter.Handler, MapModelChangedHandler, LayerChangedHandler { private MapWidget mapWidget; private int amountOfRasterLayers; // necessary for drag drop in gwt2 ! private boolean dragDropEnabled; private List<HandlerRegistration> layerRegistrations = new ArrayList<HandlerRegistration>(); private View view; public LayerListPresenterImpl(MapWidget mapWidget) { this.mapWidget = mapWidget; this.view = createViewInConstructor(); bind(); if (mapWidget.getMapModel().isInitialized()) { updateView(); } } protected View createViewInConstructor() { return createLayerListView(); } protected LayerListPresenter.View createLayerListView() { LayerListPresenter.View view = org.geomajas.widget.layer.client.Layer.getViewFactory().createLayerListView(); view.setHandler(this); view.setDragDropEnabled(dragDropEnabled); return view; } private void bind() { mapWidget.getMapModel().addMapModelChangedHandler(this); } protected MapWidget getMapWidget() { return mapWidget; } @Override public void onMoveLayer(Layer layer, int index) { boolean success = false; if (layer instanceof VectorLayer) { // in gwt client, the index must be transformed to the 'vector' index, i.e. the nth vector layer // because raster layers are first in the list, we need to subtract // amountOfRasterLayers from given index value success = mapWidget.getMapModel().moveVectorLayer((VectorLayer) layer, index - amountOfRasterLayers); } else if (layer instanceof RasterLayer) { // in gwt client, the index must be transformed to the 'raster' index, i.e. the nth raster layer. // because raster layers are first in the list, we can take given index value success = mapWidget.getMapModel().moveRasterLayer((RasterLayer) layer, index); } if (!success) { // drag/drop has not resulted in change of order in MapModel updateView(); // this will revert changed of drag/drop } } @Override public void onToggleVisibility(Layer layer) { layer.setVisible(!layer.isShowing()); } @Override public void setDragDropEnabled(boolean dragDropEnabled) { this.dragDropEnabled = dragDropEnabled; view.setDragDropEnabled(dragDropEnabled); } @Override public void updateView() { view.updateView(mapWidget.getMapModel().getLayers()); } @Override public View getView() { return view; } protected void setView(View view) { this.view = view; } @Override public ListGrid getWidget() { return view.getWidget(); } @Override public void onMapModelChanged(MapModelChangedEvent event) { List<Layer<?>> layers = mapWidget.getMapModel().getLayers(); amountOfRasterLayers = layers.size() - LayerListPresenterImpl.this.mapWidget.getMapModel().getVectorLayers().size(); for (HandlerRegistration registration : layerRegistrations) { registration.removeHandler(); } layerRegistrations.clear(); for (Layer layer : layers) { layerRegistrations.add(layer.addLayerChangedHandler(new LayerChangedHandler() { @Override public void onVisibleChange(LayerShownEvent event) { updateView(); } @Override public void onLabelChange(LayerLabeledEvent event) { updateView(); } })); } LayerListPresenterImpl.this.updateView(); } @Override public void onVisibleChange(LayerShownEvent event) { updateView(); } @Override public void onLabelChange(LayerLabeledEvent event) { updateView(); } protected boolean isDragDropEnabled() { return dragDropEnabled; } }