/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2010-2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.features.poller.remote.gwt.client; import static org.opennms.features.poller.remote.gwt.client.utils.GoogleMapsUtils.toGWTBounds; import static org.opennms.features.poller.remote.gwt.client.utils.GoogleMapsUtils.toLatLng; import static org.opennms.features.poller.remote.gwt.client.utils.GoogleMapsUtils.toLatLngBounds; import java.util.HashMap; import java.util.Map; import org.opennms.features.poller.remote.gwt.client.events.GWTMarkerClickedEvent; import org.opennms.features.poller.remote.gwt.client.events.MapPanelBoundsChangedEvent; import com.google.gwt.core.client.GWT; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.maps.client.InfoWindowContent; import com.google.gwt.maps.client.MapWidget; import com.google.gwt.maps.client.control.LargeMapControl; import com.google.gwt.maps.client.event.InfoWindowCloseClickHandler; import com.google.gwt.maps.client.event.MapMoveEndHandler; import com.google.gwt.maps.client.event.MarkerClickHandler; import com.google.gwt.maps.client.geom.LatLngBounds; import com.google.gwt.maps.client.geom.Point; import com.google.gwt.maps.client.geom.Size; import com.google.gwt.maps.client.overlay.Icon; import com.google.gwt.maps.client.overlay.Marker; import com.google.gwt.maps.client.overlay.MarkerOptions; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * <p>GoogleMapsPanel class.</p> * * @author ranger * @version $Id: $ * @since 1.8.1 */ public class GoogleMapsPanel extends Composite implements MapPanel { private static GoogleMapsPanelUiBinder uiBinder = GWT.create(GoogleMapsPanelUiBinder.class); interface GoogleMapsPanelUiBinder extends UiBinder<Widget, GoogleMapsPanel> {} @UiField MapWidget m_mapWidget; private Map<String, Marker> m_markers = new HashMap<String, Marker>(); private Map<String, GWTMarkerState> m_markerStates = new HashMap<String,GWTMarkerState>(); private HandlerManager m_eventBus; /** * <p>Constructor for GoogleMapsPanel.</p> * * @param eventBus a {@link com.google.gwt.event.shared.HandlerManager} object. */ public GoogleMapsPanel(final HandlerManager eventBus) { m_eventBus = eventBus; initWidget(uiBinder.createAndBindUi(this)); initializeMapPanel(); m_mapWidget.addMapMoveEndHandler(new MapMoveEndHandler() { public void onMoveEnd(MapMoveEndEvent event) { m_eventBus.fireEvent(new MapPanelBoundsChangedEvent(getBounds())); } }); } private MapWidget getMapWidget() { return m_mapWidget; } /** {@inheritDoc} */ public void showLocationDetails(final String name, final String htmlTitle, final String htmlContent) { final Marker m = m_markers.get(name); getMapWidget().savePosition(); getMapWidget().setCenter(m.getLatLng()); if (m != null) { final VerticalPanel panel = new VerticalPanel(); panel.add(new Label(htmlTitle)); panel.add(new HTML(htmlContent)); getMapWidget().getInfoWindow().open(m.getLatLng(), new InfoWindowContent(panel.toString())); getMapWidget().getInfoWindow().addInfoWindowCloseClickHandler(new InfoWindowCloseClickHandler() { public void onCloseClick(InfoWindowCloseClickEvent event) { getMapWidget().returnToSavedPosition(); } }); } } /** * <p>getBounds</p> * * @return a {@link org.opennms.features.poller.remote.gwt.client.GWTBounds} object. */ public GWTBounds getBounds() { return toGWTBounds(getMapWidget().getBounds()); } /** {@inheritDoc} */ public void setBounds(GWTBounds b) { LatLngBounds bounds = toLatLngBounds(b); getMapWidget().setCenter(bounds.getCenter(), getMapWidget().getBoundsZoomLevel(bounds)); } private void initializeMapPanel() { getMapWidget().setSize("100%", "100%"); getMapWidget().setUIToDefault(); getMapWidget().addControl(new LargeMapControl()); getMapWidget().setScrollWheelZoomEnabled(true); Window.addResizeHandler(new ResizeHandler() { public void onResize(final ResizeEvent resizeEvent) { if (getMapWidget() != null) { getMapWidget().checkResizeAndCenter(); } } }); } private void addOverlay(final Marker newMarker) { getMapWidget().addOverlay(newMarker); } private Marker createMarker(final GWTMarkerState marker) { final Icon icon = Icon.newInstance(); icon.setIconSize(Size.newInstance(32, 32)); icon.setIconAnchor(Point.newInstance(16, 32)); String markerImageURL = marker.getImageURL(); icon.setImageURL(markerImageURL); final MarkerOptions markerOptions = MarkerOptions.newInstance(); markerOptions.setAutoPan(true); markerOptions.setClickable(true); markerOptions.setTitle(marker.getName()); markerOptions.setIcon(icon); Marker m = new Marker(toLatLng(marker.getLatLng()), markerOptions); m.setVisible(marker.isVisible()); m.addMarkerClickHandler(new DefaultMarkerClickHandler(marker)); return m; } /** {@inheritDoc} */ public void placeMarker(final GWTMarkerState marker) { m_markerStates.put(marker.getName(), marker); Marker m = m_markers.get(marker.getName()); if (m == null) { m = createMarker(marker); m_markers.put(marker.getName(), m); addOverlay(m); } updateMarkerFromState(m, marker); } private void updateMarkerFromState(Marker m, GWTMarkerState marker) { m.setImage(marker.getImageURL()); m.setVisible(marker.isVisible()); } private final class DefaultMarkerClickHandler implements MarkerClickHandler { private final GWTMarkerState m_marker; DefaultMarkerClickHandler(GWTMarkerState marker) { m_marker = marker; } public void onClick(final MarkerClickEvent mke) { //showLocationDetails(m_marker); m_eventBus.fireEvent(new GWTMarkerClickedEvent(m_marker)); } } /** * <p>getWidget</p> * * @return a {@link com.google.gwt.user.client.ui.Widget} object. */ public Widget getWidget() { return this; } }