/*
* 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.feature;
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ResizeLayoutPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import org.geomajas.geometry.Coordinate;
import org.geomajas.gwt2.client.GeomajasImpl;
import org.geomajas.gwt2.client.GeomajasServerExtension;
import org.geomajas.gwt2.plugin.corewidget.example.client.sample.feature.controller.FeatureMouseOverListener;
import org.geomajas.gwt2.plugin.corewidget.example.client.sample.feature.controller.FeatureMouseOverEvent;
import org.geomajas.gwt2.plugin.corewidget.example.client.sample.feature.controller.FeatureMouseOverHandler;
import org.geomajas.gwt2.client.event.MapInitializationEvent;
import org.geomajas.gwt2.client.event.MapInitializationHandler;
import org.geomajas.gwt2.client.map.MapPresenter;
import org.geomajas.gwt2.client.map.feature.Feature;
import org.geomajas.gwt2.client.widget.MapLayoutPanel;
import org.geomajas.gwt2.example.base.client.sample.SamplePanel;
import org.geomajas.gwt2.plugin.corewidget.example.client.sample.feature.tooltip.ToolTip;
import java.util.ArrayList;
import java.util.List;
/**
* FeatureMouseOver showcase example.
*
* @author David Debuck
*/
public class FeatureMouseOverExample implements SamplePanel {
protected DockLayoutPanel rootElement;
private MapPresenter mapPresenter;
private final MapLayoutPanel layout;
private ToolTip toolTip;
@UiField
protected ResizeLayoutPanel mapPanel;
@UiField
protected VerticalPanel layerEventLayout;
@UiField
protected ScrollPanel scrollPanel;
@Override
public Widget asWidget() {
// return root layout element
return rootElement;
}
/**
* UI binder interface.
*
* @author David Debuck
*/
interface FeatureSelectedExampleUiBinder extends UiBinder<DockLayoutPanel, FeatureMouseOverExample> {
}
private static final FeatureSelectedExampleUiBinder UIBINDER = GWT.create(FeatureSelectedExampleUiBinder.class);
/**
* Default constructor.
*/
public FeatureMouseOverExample() {
rootElement = UIBINDER.createAndBindUi(this);
// Create the MapPresenter
mapPresenter = GeomajasImpl.getInstance().createMapPresenter();
// add FeatureClickedHandler where we handle FeaturesClickedEvent
mapPresenter.getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());
// Define the layout:
ResizeLayoutPanel resizeLayoutPanel = new ResizeLayoutPanel();
layout = new MapLayoutPanel();
resizeLayoutPanel.setWidget(layout);
resizeLayoutPanel.setSize("100%", "100%");
layout.setPresenter(mapPresenter);
mapPanel.add(resizeLayoutPanel);
// Initialize the map
GeomajasServerExtension.getInstance().initializeMap(mapPresenter, "appCoreWidget", "mapCoreWidget");
///////////////////////////////////////////////////////////////////////////////////////////
// We have to add the FeatureMouseOverListener after the map has been initialized.
///////////////////////////////////////////////////////////////////////////////////////////
// add feature mouse over listener.
mapPresenter.getEventBus().addMapInitializationHandler(new MapInitializationHandler() {
@Override
public void onMapInitialized(MapInitializationEvent event) {
FeatureMouseOverListener listener = new FeatureMouseOverListener();
mapPresenter.addMapListener(listener);
}
});
///////////////////////////////////////////////////////////////////////////////////////////
// Create the tooltip and keep track of the mouse pointer position.
///////////////////////////////////////////////////////////////////////////////////////////
toolTip = new ToolTip();
}
/**
* Handler that handles FeatureMouseOverEvent.
*/
private class MyFeatureMouseOverHandler implements FeatureMouseOverHandler {
@Override
public void onFeatureMouseOver(FeatureMouseOverEvent event) {
///////////////////////////////////////////////////////////////////////////////////////////
// Hide the tooltip when we receive a null value.
// This means that the mouse is not hovering over a feature.
///////////////////////////////////////////////////////////////////////////////////////////
if (event.getFeatures() == null) {
toolTip.hide();
return;
}
List<Feature> features = event.getFeatures();
///////////////////////////////////////////////////////////////////////////////////////////
// Show the tooltip when there are features found.
///////////////////////////////////////////////////////////////////////////////////////////
if (!features.isEmpty()) {
toolTip.clearContent();
List<Label> content = new ArrayList<Label>();
for (Feature feature : features) {
final Label label = new Label(feature.getLabel());
content.add(label);
}
// Calculate a position for where to show the tooltip.
int left = RootPanel.get().getAbsoluteLeft() + layout.getAbsoluteLeft();
int top = RootPanel.get().getAbsoluteTop() + layout.getAbsoluteTop();
// Add some extra pixels to the tooltip so we can still drag the map.
toolTip.addContentAndShow(
content,
left + (int) event.getCoordinate().getX() + 5,
top + (int) event.getCoordinate().getY() + 5,
false
);
}
///////////////////////////////////////////////////////////////////////////////////////////
// Log all FeatureMouseOver events in our showcase example, even when there are non found.
///////////////////////////////////////////////////////////////////////////////////////////
layerEventLayout.add(new Label("On FeatureMouseOverEvent: ( " + features.size() + " feature(s) found. )"));
for (Feature feature : features) {
Coordinate coordinate = feature.getGeometry().getCoordinates()[0];
layerEventLayout.add(new Label("# Feature => " + feature.getLabel()));
layerEventLayout.add(new Label("- Coordinate x => " + coordinate.getX()));
layerEventLayout.add(new Label("- Coordinate y => " + coordinate.getY()));
layerEventLayout.add(new Label("- layer title => " + feature.getLayer().getTitle()));
}
layerEventLayout.add(new Label("-------------------------------------------------"));
scrollPanel.scrollToBottom();
}
}
}