/*
* 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 java.util.ArrayList;
import java.util.List;
import org.geomajas.configuration.AbstractAttributeInfo;
import org.geomajas.configuration.AbstractReadOnlyAttributeInfo;
import org.geomajas.configuration.AssociationAttributeInfo;
import org.geomajas.configuration.PrimitiveAttributeInfo;
import org.geomajas.configuration.client.ClientVectorLayerInfo;
import org.geomajas.gwt.client.Geomajas;
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.util.UrlBuilder;
import org.geomajas.sld.FeatureTypeStyleInfo;
import org.geomajas.sld.RuleInfo;
import org.geomajas.sld.UserStyleInfo;
import org.geomajas.widget.layer.client.i18n.LayerMessages;
import org.geomajas.widget.layer.client.util.LayerIconUtil;
import com.google.gwt.core.client.GWT;
import com.smartgwt.client.data.RecordList;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLPane;
import com.smartgwt.client.widgets.Window;
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.VLayout;
/**
* A simple layerinfo window.
*
* @author Kristof Heirwegh
* @author Wout Swartenbroekx
* @author An Buyle
*/
public class LayerInfo extends Window {
private static final LayerMessages MESSAGES = GWT.create(LayerMessages.class);
private static final String NUMERIC_TYPES = "short integer long float double currency";
private static final int WINDOW_HEIGHT = 400;
private static final int WINDOW_WIDTH = 450;
private static final String ATTRI = "att";
private static final String LABEL = "lab";
private static final String TYPE = "typ";
private static final String EDITA = "edi";
private static final String IDENT = "ide";
private static final String HIDDE = "hid";
private static final String NUMER = "num";
/**
* Constructor.
*
* @param layer layer
*/
public LayerInfo(Layer<?> layer) {
super();
setTitle(MESSAGES.layerInfoWindowLegendTitle() + " - " + layer.getLabel());
setAutoCenter(true);
setWidth(WINDOW_WIDTH);
setHeight(WINDOW_HEIGHT);
setKeepInParentRect(true);
setCanDragResize(true); // resize
VLayout layout = new VLayout();
layout.setWidth100();
layout.setHeight100();
layout.setPadding(5);
layout.setMembersMargin(5);
layout.setOverflow(Overflow.AUTO);
if (layer instanceof VectorLayer) {
layout.addMember(createVectorLegend((VectorLayer) layer));
layout.addMember(createFeatureInfo((VectorLayer) layer));
} else if (layer instanceof RasterLayer) { // handle unchecked cast below
Canvas c = createLegendInfo((RasterLayer) layer);
if (c != null) {
layout.addMember(c);
layout.setPadding(1);
}
}
// ----------------------------------------------------------
addItem(layout);
}
private Canvas createVectorLegend(VectorLayer layer) {
VLayout legend = new VLayout();
legend.setWidth100();
legend.setIsGroup(true);
legend.setPadding(5);
legend.setGroupTitle(MESSAGES.layerInfoLayerInfoLegend());
legend.addMember(new VectorLegendListGrid(layer));
legend.setHeight100();
return legend;
}
private Canvas createFeatureInfo(VectorLayer layer) {
List<ListGridRecord> records = new ArrayList<ListGridRecord>();
for (AbstractAttributeInfo attInfo : layer.getLayerInfo().getFeatureInfo().getAttributes()) {
ListGridRecord r = new ListGridRecord();
records.add(r);
String type = getType(attInfo);
r.setAttribute(ATTRI, attInfo.getName());
r.setAttribute(LABEL, ((AbstractReadOnlyAttributeInfo) attInfo).getLabel());
r.setAttribute(TYPE, type);
r.setAttribute(EDITA,
(((AbstractReadOnlyAttributeInfo) attInfo).isEditable() ? MESSAGES.layerInfoLayerInfoAttYes()
: MESSAGES.layerInfoLayerInfoAttNo()));
r.setAttribute(IDENT, (((AbstractReadOnlyAttributeInfo) attInfo).isIdentifying()
? MESSAGES.layerInfoLayerInfoAttYes() : MESSAGES.layerInfoLayerInfoAttNo()));
r.setAttribute(HIDDE,
(((AbstractReadOnlyAttributeInfo) attInfo).isHidden() ? MESSAGES.layerInfoLayerInfoAttYes()
: MESSAGES.layerInfoLayerInfoAttNo()));
r.setAttribute(NUMER,
(isNumeric(type) ? MESSAGES.layerInfoLayerInfoAttYes() : MESSAGES.layerInfoLayerInfoAttNo()));
}
// ----------------------------------------------------------
VLayout c = new VLayout();
c.setIsGroup(true);
c.setGroupTitle(MESSAGES.layerInfoLayerInfoFldInfo());
c.setPadding(5);
ListGrid info = new ListGrid();
info.setShowAllRecords(true);
info.setCanResizeFields(true);
info.setWidth100();
info.setHeight(400);
ListGridField fld1 = new ListGridField(ATTRI, MESSAGES.layerInfoLayerInfoAttAttribute());
ListGridField fld2 = new ListGridField(LABEL, MESSAGES.layerInfoLayerInfoAttLabel());
ListGridField fld3 = new ListGridField(TYPE, MESSAGES.layerInfoLayerInfoAttType());
ListGridField fld4 = new ListGridField(EDITA, MESSAGES.layerInfoLayerInfoAttEditable());
ListGridField fld5 = new ListGridField(IDENT, MESSAGES.layerInfoLayerInfoAttIdentifying());
ListGridField fld6 = new ListGridField(HIDDE, MESSAGES.layerInfoLayerInfoAttHidden());
ListGridField fld7 = new ListGridField(NUMER, MESSAGES.layerInfoLayerInfoAttNumeric());
fld1.setWidth(70);
fld2.setWidth(90);
info.setFields(fld1, fld2, fld3, fld4, fld5, fld6, fld7);
info.setData(records.toArray(new ListGridRecord[records.size()]));
c.addMember(info);
return c;
}
private boolean isNumeric(String type) {
return (NUMERIC_TYPES.indexOf(type) > -1);
}
private String getType(AbstractAttributeInfo attInfo) {
if (attInfo instanceof PrimitiveAttributeInfo) {
return ((PrimitiveAttributeInfo) attInfo).getType().toString();
} else if (attInfo instanceof AssociationAttributeInfo) {
return ((AssociationAttributeInfo) attInfo).getType().toString();
} else {
return attInfo.toString();
}
}
private Canvas createLegendInfo(RasterLayer layer) {
final HTMLPane legendPane = new HTMLPane();
String url = LayerIconUtil.getLegendUrl(layer);
if (url != null) {
legendPane.setContents("<img src=\"" + url + "\" border=\"0\">");
legendPane.setOverflow(Overflow.AUTO);
// legendPane.addDomHandler(new LoadHandler() {
// public void onLoad(LoadEvent event) {
// legendPane.markForRedraw();
// }
// }, LoadEvent.getType());
} else {
legendPane.setContents("<br /><div style=\"text-align: center\">"
+ MESSAGES.layerInfoLayerInfoLegendNoLegend() + "</div>");
}
return legendPane;
}
// -------------------------------------------------
/**
* ListGrid to show Legend elements.
*/
private class VectorLegendListGrid extends ListGrid {
private static final String KEY_FLD = "keyField";
private static final String VALUE_FLD = "valueField";
private static final String LEGEND_ICONS_PATH = "legendgraphic";
private static final String LEGEND_ICONS_TYPE = ".png";
private static final int ICONSIZE = 18;
public VectorLegendListGrid(VectorLayer layer) {
super();
setWidth100();
setHeight(24); // Min height
setCanEdit(false);
setShowSelectedStyle(false);
setShowRollOver(false);
setShowHeader(false);
setShowAllRecords(true);
setBodyOverflow(Overflow.VISIBLE);
setOverflow(Overflow.VISIBLE);
setLeaveScrollbarGap(false);
setWrapCells(true);
setFixedRecordHeights(false);
setImageSize(ICONSIZE);
String name = layer.getLayerInfo().getNamedStyleInfo().getName();
UrlBuilder url = new UrlBuilder(Geomajas.getDispatcherUrl());
url.addPath(LEGEND_ICONS_PATH);
url.addPath(layer.getServerLayerId());
url.addPath(name);
// -- FIELDS
ListGridField keyField = new ListGridField(KEY_FLD, "Symbool", 45);
keyField.setAlign(Alignment.CENTER);
keyField.setType(ListGridFieldType.IMAGE);
keyField.setImageURLPrefix(url.toString() + "/");
keyField.setImageURLSuffix(LEGEND_ICONS_TYPE);
ListGridField valueField = new ListGridField(VALUE_FLD, "Naam");
valueField.setWidth("*");
setFields(keyField, valueField);
// -- VALUES
final RecordList recordList = new RecordList();
ClientVectorLayerInfo layerInfo = layer.getLayerInfo();
UserStyleInfo userStyle = layerInfo.getNamedStyleInfo().getUserStyle();
FeatureTypeStyleInfo info = userStyle.getFeatureTypeStyleList().get(0);
if (info.getRuleList().size() > 0) {
int i = 0;
for (RuleInfo rule : info.getRuleList()) {
String title = (rule.getTitle() != null ? rule.getTitle() : rule.getName());
if (title == null) {
title = layerInfo.getNamedStyleInfo().getName();
}
recordList.add(createRecord(title, i));
i++;
}
}
setData(recordList);
}
private ListGridRecord createRecord(String title, Integer index) {
ListGridRecord r = new ListGridRecord();
r.setAttribute(KEY_FLD, index.toString());
r.setAttribute(VALUE_FLD, title);
return r;
}
}
}