/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wms.web.data;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.web.wicket.GeoServerAjaxFormLink;
import org.geoserver.web.wicket.GeoServerDataProvider;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geoserver.web.wicket.GeoServerTablePanel;
/**
* Panel for selecting a layer from the list of layers. Used by {@link LayerAttributePanel} and
* {@link OpenLayersPreviewPanel} to change the preview layer.
*/
public class LayerChooser extends Panel {
private static final long serialVersionUID = -127345071729297975L;
private static class LayerProvider extends GeoServerDataProvider<LayerInfo> {
private static final long serialVersionUID = -2117784735301652240L;
private AbstractStylePage parent;
public LayerProvider(AbstractStylePage parent) {
this.parent = parent;
}
public static Property<LayerInfo> workspace =
new AbstractProperty<LayerInfo>("Workspace") {
private static final long serialVersionUID = -7055816211775541759L;
public Object getPropertyValue(LayerInfo x) {
return x.getResource().getStore().getWorkspace().getName();
}
};
public static Property<LayerInfo> store =
new AbstractProperty<LayerInfo>("Store") {
private static final long serialVersionUID = -4021230907568644439L;
public Object getPropertyValue(LayerInfo x) {
return x.getResource().getStore().getName();
}
};
public static Property<LayerInfo> name =
new AbstractProperty<LayerInfo>("Layer") {
private static final long serialVersionUID = 8913729089849537790L;
public Object getPropertyValue(LayerInfo x) {
return x.getName();
}
};
@Override
public List<LayerInfo> getItems() {
List<LayerInfo> items = new ArrayList<LayerInfo>();
for (LayerInfo l : parent.getCatalog().getLayers()) {
if (l.getResource() instanceof FeatureTypeInfo) {
items.add(l);
}
if (l.getResource() instanceof CoverageInfo) {
items.add(l);
}
}
return items;
}
@Override
public List<Property<LayerInfo>> getProperties() {
return Arrays.asList(workspace, store, name);
}
}
public LayerChooser(final String id, final AbstractStylePage parent) {
super(id);
LayerProvider provider = new LayerProvider(parent);
GeoServerTablePanel<LayerInfo> table =
new GeoServerTablePanel<LayerInfo>("layer.table", provider) {
private static final long serialVersionUID = 1196129584558094662L;
@Override
public Component getComponentForProperty(
String id, IModel<LayerInfo> value, Property<LayerInfo> property
) {
final LayerInfo layer = (LayerInfo) value.getObject();
final String text = property.getPropertyValue(layer).toString();
if (property == LayerProvider.name) {
return new Fragment(id, "layer.link", LayerChooser.this) {
private static final long serialVersionUID = -7619814477490657757L;
{
add(new GeoServerAjaxFormLink("link", parent.styleForm) {
{
add(new Label("layer.name", new Model<String>(text)));
}
private static final long serialVersionUID = 8020574396677784792L;
@Override
protected void onClick(AjaxRequestTarget target, Form<?> form) {
parent.getLayerModel().setObject(layer);
parent.getPopup().close(target);
parent.configurationChanged();
target.add(parent.getFeedbackPanel());
target.add(parent.styleForm);
}
@Override
public boolean getDefaultFormProcessing() {
return false;
}
});
}
};
} else {
return new Label(id, text);
}
}
};
add(table);
}
}