/* * 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.widget; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.ui.Anchor; import com.smartgwt.client.data.RecordList; import com.smartgwt.client.types.ImageStyle; import com.smartgwt.client.types.Overflow; import com.smartgwt.client.types.TitleOrientation; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.HTMLPane; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.Img; import com.smartgwt.client.widgets.Slider; import com.smartgwt.client.widgets.Window; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.events.ValueChangedEvent; import com.smartgwt.client.widgets.events.ValueChangedHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.CheckboxItem; import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VLayout; import org.geomajas.configuration.client.ScaleInfo; 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.widget.layer.client.i18n.LayerMessages; import org.geomajas.widget.layer.client.util.GltLayout; import org.geomajas.widget.layer.client.util.LayerIconUtil; import org.geomajas.widget.layer.configuration.client.ClientExtraLayerInfo; /** * A simple layer actions window. * * @author Kristof Heirwegh */ public class LayerActions extends Window { private static final int WINDOW_WIDTH = 375; private static final LayerMessages MESSAGES = GWT.create(LayerMessages.class); private Img layerImg; private Img layerLabelOverlay; private Slider opacitySlider; private CheckboxItem layerlabels; private final CheckboxItem layerShow; private final Layer<?> layer; private VectorLayer vectorLayer; private RasterLayer rasterLayer; public LayerActions(Layer<?> layer) { super(); this.layer = layer; if (layer instanceof VectorLayer) { this.vectorLayer = (VectorLayer) layer; } else if (layer instanceof RasterLayer) { // handle unchecked cast below this.rasterLayer = (RasterLayer) layer; } setTitle(MESSAGES.layerActionsWindowTitle()); setAutoCenter(true); setWidth(WINDOW_WIDTH); setAutoSize(true); setKeepInParentRect(true); VLayout layout = new VLayout(); layout.setPadding(5); layout.setWidth100(); layout.setMembersMargin(5); // ---------------------------------------------------------- // -- create header -- HLayout header = new HLayout(5); header.setWidth100(); header.setHeight(90); header.addMember(createImage()); header.addMember(createTitle()); layout.addMember(header); // -- create info -- VLayout infoLayout = new VLayout(5); infoLayout.setPadding(5); infoLayout.setAutoHeight(); infoLayout.setIsGroup(true); infoLayout.setGroupTitle(MESSAGES.layerInfoLayerInfo()); infoLayout.addMember(new LayerInfoListGrid()); final ClientExtraLayerInfo eli = (ClientExtraLayerInfo) layer.getLayerInfo().getWidgetInfo( ClientExtraLayerInfo.IDENTIFIER); if (eli != null) { if (eli.getLegendUrl() != null) { final Anchor a = new Anchor(eli.getLegendUrl()); a.setHeight("5"); if (eli.getLegendUrlTitle() != null) { a.setText(eli.getLegendUrlTitle()); } a.addClickHandler(new com.google.gwt.event.dom.client.ClickHandler() { @Override public void onClick(com.google.gwt.event.dom.client.ClickEvent event) { Window window = new Window(); window.setTitle(a.getText()); window.setAutoCenter(true); window.setWidth("60%"); window.setHeight("60%"); window.setSrc(eli.getLegendUrl()); window.setContentsType("page"); window.show(); } }); infoLayout.addMember(a); } if (eli.getLegendImageUrl() != null || layer instanceof VectorLayer) { IButton legendInfo = new IButton(vectorLayer != null ? MESSAGES.layerActionsShowLegendAndFields() : MESSAGES.layerActionsShowLegend()); legendInfo.setIcon(GltLayout.iconShowLegend); legendInfo.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { showLegend(); } }); infoLayout.addMember(legendInfo); } } else if (layer instanceof VectorLayer) { IButton legendInfo = new IButton(vectorLayer != null ? MESSAGES.layerActionsShowLegendAndFields() : MESSAGES.layerActionsShowLegend()); legendInfo.setIcon(GltLayout.iconShowLegend); legendInfo.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { showLegend(); } }); infoLayout.addMember(legendInfo); } // -- create actions -- VLayout actiesLayout = new VLayout(5); actiesLayout.setPadding(5); actiesLayout.setIsGroup(true); actiesLayout.setAutoHeight(); actiesLayout.setGroupTitle(MESSAGES.layerInfoLayerActions()); DynamicForm form = new DynamicForm(); form.setTitleOrientation(TitleOrientation.TOP); form.setHeight(30); form.setColWidths(0, WINDOW_WIDTH - 50); layerShow = new CheckboxItem(); initLayerShow(); double opacity = 1; if (vectorLayer != null) { opacity = vectorLayer.getOpacity(); layerlabels = new CheckboxItem(); initLabels(); form.setFields(layerlabels, layerShow); } else if (rasterLayer != null) { opacity = rasterLayer.getOpacity(); form.setFields(layerShow); } opacitySlider = new Slider(MESSAGES.layerActionsOpacity()); initSlider((int) Math.round(opacity * 100)); actiesLayout.addMember(opacitySlider); actiesLayout.addMember(form); // ---------------------------------------------------------- if (vectorLayer != null && vectorLayer.getFilter() != null && !"".equals(vectorLayer.getFilter())) { final IButton removeFilter = new IButton(MESSAGES.layerActionsRemoveFilter()); removeFilter.setIcon(GltLayout.iconRemoveFilter); String tooltip = vectorLayer.getFilter(); if (tooltip.length() > 1000) { tooltip = tooltip.substring(0, 1000); } removeFilter.setTooltip(tooltip); removeFilter.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { vectorLayer.setFilter(null); removeFilter.setVisible(false); } }); actiesLayout.addMember(removeFilter); } // ---------------------------------------------------------- layout.addMember(infoLayout); layout.addMember(actiesLayout); addItem(layout); } private Canvas createTitle() { HTMLPane title = new HTMLPane(); StringBuffer html = new StringBuffer("<span style='font-size: 1.2em; font-weight: bold;'>" + layer.getLabel() + "</span><br /><br />"); if (vectorLayer != null) { html.append(MESSAGES.layerInfoLayerInfoFldLayerTypeVector()); html.append("<br />" + MESSAGES.layerInfoLayerInfoFldLayerType() + ": " + vectorLayer.getLayerInfo().getLayerType().name()); } else { html.append(MESSAGES.layerInfoLayerInfoFldLayerTypeRaster()); } title.setContents(html.toString()); return title; } private Canvas createImage() { layerImg = LayerIconUtil.getLargeLayerIcon(layer); layerImg.setImageType(ImageStyle.NORMAL); Canvas sampleMap = new Canvas(); sampleMap.setAutoHeight(); sampleMap.setAutoWidth(); // sampleMap.setSize("89px", "89px"); if (vectorLayer != null) { layerLabelOverlay = LayerIconUtil.getLabelOverlayImg(); layerLabelOverlay.setImageType(ImageStyle.NORMAL); sampleMap.addChild(layerImg); sampleMap.addChild(layerLabelOverlay); } else { Img layerOpacityUnderlay = LayerIconUtil.getOpacityUnderlayImg(); layerOpacityUnderlay.setImageType(ImageStyle.NORMAL); layerImg.setUseOpacityFilter(true); sampleMap.addChild(layerOpacityUnderlay); sampleMap.addChild(layerImg); } return sampleMap; } private void initLayerShow() { layerShow.setTitle(MESSAGES.layerActionsShowLayer()); layerShow.setTooltip(MESSAGES.layerActionsShowLayerToolTip()); layerShow.setTitleOrientation(TitleOrientation.LEFT); if (vectorLayer != null) { layerShow.setValue(vectorLayer.isVisible()); } else { layerShow.setValue(rasterLayer.isVisible()); } layerShow.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { if (vectorLayer != null) { vectorLayer.setVisible(layerShow.getValueAsBoolean()); } else { rasterLayer.setVisible(layerShow.getValueAsBoolean()); } } }); } private void initLabels() { layerlabels.setTitle(MESSAGES.layerActionsLabels()); layerlabels.setTooltip(MESSAGES.layerActionsLabelsToolTip()); layerlabels.setTitleOrientation(TitleOrientation.LEFT); layerlabels.setValue(vectorLayer.isLabelsVisible()); Boolean val = vectorLayer.isLabelsVisible(); layerLabelOverlay.setVisible(val); layerlabels.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent event) { Boolean val = layerlabels.getValueAsBoolean(); layerLabelOverlay.setVisible(val); vectorLayer.setLabeled(val); } }); } private void initSlider(int initialValue) { opacitySlider.setValue(initialValue); opacitySlider.setMinValue(0); opacitySlider.setMaxValue(100); opacitySlider.setNumValues(101); opacitySlider.setMaxValueLabel("100%"); opacitySlider.setVertical(false); opacitySlider.setWidth(230); opacitySlider.setLabelWidth(Integer.parseInt(MESSAGES.layerActionsOpacitySliderLabelWidth())); opacitySlider.addValueChangedHandler(new ValueChangedHandler() { public void onValueChanged(ValueChangedEvent event) { double val = opacitySlider.getValue(); layerImg.setOpacity((int) val); if (val > 0) { val /= 100; } if (rasterLayer != null) { rasterLayer.setOpacity(val); } else if (vectorLayer != null) { vectorLayer.setOpacity(val); } } }); } private void showLegend() { LayerInfo li = new LayerInfo(layer); li.draw(); } // ------------------------------------------------- /** * Listgrid for layerinfo. */ private class LayerInfoListGrid extends ListGrid { private static final String KEY_FLD = "keyField"; private static final String VALUE_FLD = "valueField"; public LayerInfoListGrid() { super(); setWidth100(); setHeight(50); setCanEdit(false); setShowSelectedStyle(false); setShowRollOver(false); setShowHeader(false); setShowAllRecords(true); setBodyOverflow(Overflow.VISIBLE); setOverflow(Overflow.VISIBLE); setLeaveScrollbarGap(false); setWrapCells(true); setFixedRecordHeights(false); // -- FIELDS ListGridField keyField = new ListGridField(KEY_FLD, "Veldnaam", 150); ListGridField valueField = new ListGridField(VALUE_FLD, "Waarde"); valueField.setWidth("*"); setFields(keyField, valueField); // -- VALUES final RecordList recordList = new RecordList(); ClientExtraLayerInfo eli = (ClientExtraLayerInfo) layer.getLayerInfo().getWidgetInfo( ClientExtraLayerInfo.IDENTIFIER); if (eli != null) { if (eli.getSource() != null && !"".equals(eli.getSource())) { recordList.add(createRecord(MESSAGES.layerInfoLayerInfoSource() + ":", eli.getSource())); } if (eli.getDate() != null) { recordList.add(createRecord(MESSAGES.layerInfoLayerInfoDate() + ":", eli.getDate())); // recordList.add(createRecord(messages.layerInfoLayerInfoDate() + ":", // DateTimeFormat.getFormat(PredefinedFormat.DATE_LONG).format(eli.getDate()))); } } String layerMax, layerMin; if (layer instanceof VectorLayer) { VectorLayer vl = (VectorLayer) layer; layerMax = buildScale(vl.getLayerInfo().getMaximumScale()); layerMin = buildScale(vl.getLayerInfo().getMinimumScale()); } else { RasterLayer rl = (RasterLayer) layer; layerMax = buildScale(rl.getLayerInfo().getMaximumScale()); layerMin = buildScale(rl.getLayerInfo().getMinimumScale()); } recordList.add(createRecord(MESSAGES.layerInfoLayerInfoFldMaxViewScale() + ":", layerMax)); recordList.add(createRecord(MESSAGES.layerInfoLayerInfoFldMinViewScale() + ":", layerMin)); setData(recordList); } private ListGridRecord createRecord(String key, String value) { ListGridRecord r = new ListGridRecord(); r.setAttribute(KEY_FLD, key); r.setAttribute(VALUE_FLD, "<b>" + (value == null ? "-" : value) + "</b>"); return r; } private String buildScale(ScaleInfo si) { // double PIXELPERUNIT = 3779.527559055; // long denominator = Math.round(PIXELPERUNIT * (1D / si.getPixelPerUnit())); return ((int) si.getNumerator()) + " : " + NumberFormat.getFormat("#,##0").format(Math.round(si.getDenominator())); } } }