/* * 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.gwt2.plugin.corewidget.example.client.sample.map; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.http.client.URL; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import org.geomajas.configuration.NamedStyleInfo; import org.geomajas.gwt2.client.GeomajasServerExtension; import org.geomajas.gwt2.client.map.layer.Layer; import org.geomajas.gwt2.client.map.layer.LegendUrlSupported; import org.geomajas.gwt2.client.map.layer.RasterServerLayerImpl; import org.geomajas.gwt2.client.map.layer.VectorServerLayerImpl; import org.geomajas.gwt2.plugin.corewidget.client.map.layercontrolpanel.LayerControlPanelPresenter; import org.geomajas.gwt2.plugin.corewidget.client.map.layercontrolpanel.LayerControlPanelView; import org.geomajas.gwt2.plugin.corewidget.client.map.layercontrolpanel.resource.LayerControlPanelResource; import org.geomajas.sld.FeatureTypeStyleInfo; import org.geomajas.sld.RuleInfo; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.logging.Logger; /** * Map Legend implementation of * {@link org.geomajas.gwt2.plugin.corewidget.client.map.layercontrolpanel.LayerControlPanelView}. * * @author Dosi Bingov */ public class LayerControlPanelLegendViewImpl implements LayerControlPanelView { private Logger log = Logger.getLogger(LayerControlPanelLegendViewImpl.class.getName()); private LayerControlPanelPresenter presenter; private HorizontalPanel widget; @UiField protected FlexTable legendTable; @UiField protected CheckBox visibilityToggle; @UiField protected Label title; private Layer layer; private LayerControlPanelResource resource; private static final LayerControlUiBinder UIBINDER = GWT.create(LayerControlUiBinder.class); /** * UI binder interface. * * @author Dosi Bingov * */ interface LayerControlUiBinder extends UiBinder<Widget, LayerControlPanelLegendViewImpl> { } public LayerControlPanelLegendViewImpl(LayerControlPanelResource layerControlPanelResource) { resource = layerControlPanelResource; widget = (HorizontalPanel) UIBINDER.createAndBindUi(this); widget.setStyleName(layerControlPanelResource.css().layerControlPanel()); title.setStyleName(layerControlPanelResource.css().layerControlPanelTitle()); visibilityToggle.addStyleName(layerControlPanelResource.css().layerControlPanelToggle()); resource.css().ensureInjected(); bindEvents(); } // ------------------------------------------------------------------------ // Public methods: // ------------------------------------------------------------------------ @Override public Widget asWidget() { return widget; } private void setLegendUrl(String url) { Image image = new Image(url); final int row = legendTable.insertRow(legendTable.getRowCount()); legendTable.addCell(row); legendTable.setWidget(row, 0, image); } private void addLayerLegendWidget(LayerLegendWidget layerLegendWidget) { final int row = legendTable.insertRow(legendTable.getRowCount()); legendTable.addCell(row); legendTable.setWidget(row, 0, layerLegendWidget); } @Override public Layer getLayer() { return layer; } @Override public void setLayer(Layer layer) { this.layer = layer; visibilityToggle.setValue(layer.isMarkedAsVisible()); // Add the legend if supported if (layer instanceof LegendUrlSupported) { setLegendUrl(((LegendUrlSupported) layer).getLegendImageUrl()); } else if (layer instanceof VectorServerLayerImpl) { VectorServerLayerImpl serverLayer = (VectorServerLayerImpl) layer; String legendUrl = GeomajasServerExtension.getInstance().getEndPointService().getLegendServiceUrl(); NamedStyleInfo styleInfo = serverLayer.getLayerInfo().getNamedStyleInfo(); String name = serverLayer.getLayerInfo().getNamedStyleInfo().getName(); int i = 0; for (FeatureTypeStyleInfo sfi : styleInfo.getUserStyle().getFeatureTypeStyleList()) { for (RuleInfo rInfo : sfi.getRuleList()) { UrlBuilder url = new UrlBuilder(legendUrl); url.addPath(serverLayer.getServerLayerId()); url.addPath(name); url.addPath(i + ".png"); i++; addLayerLegendWidget(new LayerLegendWidget(url.toString(), rInfo.getName())); } } } else if (layer instanceof RasterServerLayerImpl) { RasterServerLayerImpl serverLayer = (RasterServerLayerImpl) layer; String legendUrl = GeomajasServerExtension.getInstance().getEndPointService().getLegendServiceUrl(); UrlBuilder url = new UrlBuilder(legendUrl); url.addPath(serverLayer.getServerLayerId() + ".png"); addLayerLegendWidget(new LayerLegendWidget(url.toString(), "")); } } @Override public void setPresenter(LayerControlPanelPresenter presenter) { this.presenter = presenter; } @Override public void setLayerVisible(boolean visible) { visibilityToggle.setValue(visible); } @Override public void enableVisibilityToggle(boolean enable) { visibilityToggle.setEnabled(enable); } @Override public void setLayerTitle(String title) { this.title.setText(title); } // ------------------------------------------------------------------------ // Private methods: // ------------------------------------------------------------------------ private void bindEvents() { visibilityToggle.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (visibilityToggle.isEnabled()) { layer.setMarkedAsVisible(!layer.isMarkedAsVisible()); visibilityToggle.setEnabled(true); // Works because JavaScript is single threaded... } } }); } /** * Builds parametrized URL from a base URL. * * @author Jan De Moerloose */ public class UrlBuilder { private final Map<String, String> params = new HashMap<String, String>(); private String baseUrl; /** * Constructor using the given base URL. * * @param baseUrl base URL */ public UrlBuilder(String baseUrl) { this.baseUrl = baseUrl; } /** * Add a parameter. * * @param name * name of parameter * @param value * value of parameter * @return this to allow concatenation */ public UrlBuilder addParameter(String name, String value) { if (value == null) { value = ""; } params.put(name, value); return this; } /** * Add a path extension. * * @param path * path * @return this to allow concatenation */ public UrlBuilder addPath(String path) { if (path.startsWith("/") && baseUrl.endsWith("/")) { baseUrl = baseUrl + path.substring(1); } else if (baseUrl.endsWith("/")) { baseUrl = baseUrl + path; } else { baseUrl = baseUrl + "/" + path; } return this; } /** * Build the URL and return it as an encoded string. * * @return the encoded URL string */ public String toString() { StringBuilder url = new StringBuilder(baseUrl); if (params.size() > 0) { url.append("?"); for (Iterator<String> iterator = params.keySet().iterator(); iterator.hasNext();) { String name = iterator.next(); url.append(name).append("=").append(params.get(name)); if (iterator.hasNext()) { url.append("&"); } } } return URL.encode(url.toString()); } } /** * @author Dosi Bingov */ class LayerLegendWidget implements IsWidget { private HorizontalPanel layout; public LayerLegendWidget(String imageUrl, String label) { layout = new HorizontalPanel(); layout.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); layout.add(new Image(imageUrl)); Label labelUi = new Label(label); labelUi.getElement().getStyle().setMarginLeft(5, Style.Unit.PX); layout.add(labelUi); } @Override public Widget asWidget() { return layout; } } }