/*
* 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.example.client.sample.layer;
import org.geomajas.gwt2.client.GeomajasImpl;
import org.geomajas.gwt2.client.GeomajasServerExtension;
import org.geomajas.gwt2.client.event.LayerAddedEvent;
import org.geomajas.gwt2.client.event.LayerRemovedEvent;
import org.geomajas.gwt2.client.event.MapCompositionHandler;
import org.geomajas.gwt2.client.map.MapPresenter;
import org.geomajas.gwt2.client.map.layer.Layer;
import org.geomajas.gwt2.example.base.client.ExampleBase;
import org.geomajas.gwt2.example.base.client.sample.SamplePanel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ResizeLayoutPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* ContentPanel that demonstrates changing layer order.
*
* @author Jan De Moerloose
*/
public class LayerAddRemovePanel implements SamplePanel {
/**
* UI binder for this widget.
*
* @author Pieter De Graef
*/
interface MyUiBinder extends UiBinder<Widget, LayerAddRemovePanel> {
}
private static final MyUiBinder UI_BINDER = GWT.create(MyUiBinder.class);
private MapPresenter mapPresenter;
@UiField
protected VerticalPanel layerAddedPanel;
@UiField
protected VerticalPanel layerRemovedPanel;
@UiField
protected ResizeLayoutPanel mapPanel;
public Widget asWidget() {
// Define the left layout:
Widget layout = UI_BINDER.createAndBindUi(this);
// Create the MapPresenter and add an InitializationHandler:
mapPresenter = GeomajasImpl.getInstance().createMapPresenter();
mapPresenter.setSize(480, 480);
mapPresenter.getEventBus().addMapCompositionHandler(new MyMapCompositionHandler());
DecoratorPanel mapDecorator = new DecoratorPanel();
mapDecorator.add(mapPresenter.asWidget());
mapPanel.add(mapDecorator);
// Initialize the map, and return the layout:
GeomajasServerExtension.getInstance().initializeMap(mapPresenter, "gwt-app", "mapLegend");
return layout;
}
// ------------------------------------------------------------------------
// Private classes:
// ------------------------------------------------------------------------
/**
* When layers are added or removed, display them in the correct panel.
*
* @author Pieter De Graef
*/
private class MyMapCompositionHandler implements MapCompositionHandler {
public void onLayerAdded(LayerAddedEvent event) {
Layer layer = event.getLayer();
for (int i = 0; i < layerRemovedPanel.getWidgetCount(); i++) {
LayerRemovedWidget widget = (LayerRemovedWidget) layerRemovedPanel.getWidget(i);
if (layer.equals(widget.getLayer())) {
layerRemovedPanel.remove(i);
}
}
layerAddedPanel.add(new LayerAddedWidget(layer));
}
public void onLayerRemoved(LayerRemovedEvent event) {
Layer layer = event.getLayer();
for (int i = 0; i < layerAddedPanel.getWidgetCount(); i++) {
LayerAddedWidget widget = (LayerAddedWidget) layerAddedPanel.getWidget(i);
if (layer == widget.getLayer()) {
layerAddedPanel.remove(i);
}
}
layerRemovedPanel.add(new LayerRemovedWidget(layer));
}
}
/**
* Layer representation on the GUI.
*
* @author Pieter De Graef
*/
private final class LayerAddedWidget extends HorizontalPanel {
private final Layer layer;
private LayerAddedWidget(final Layer layer) {
this.layer = layer;
setWidth("100%");
Button removeBtn = new Button("Remove");
removeBtn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
mapPresenter.getLayersModel().removeLayer(layer.getId());
}
});
add(removeBtn);
add(new Label(layer.getTitle()));
setStyleName(ExampleBase.getShowcaseResource().css().sampleRow());
}
public Layer getLayer() {
return layer;
}
}
/**
* Layer representation on the GUI.
*
* @author Pieter De Graef
*/
private final class LayerRemovedWidget extends HorizontalPanel {
private final Layer layer;
private LayerRemovedWidget(final Layer layer) {
this.layer = layer;
setWidth("100%");
Button removeBtn = new Button("Add");
removeBtn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
mapPresenter.getLayersModel().addLayer(layer);
}
});
add(removeBtn);
add(new Label(layer.getTitle()));
setStyleName(ExampleBase.getShowcaseResource().css().sampleRow());
}
public Layer getLayer() {
return layer;
}
}
}