/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onebusaway.webapp.gwt.where_library.view;
import org.onebusaway.geospatial.model.CoordinateBounds;
import org.onebusaway.transit_data.model.StopBean;
import org.onebusaway.webapp.gwt.where_library.OBAConfig;
import org.onebusaway.webapp.gwt.where_library.view.events.StopClickedEvent;
import org.onebusaway.webapp.gwt.where_library.view.events.StopClickedHandler;
import org.onebusaway.webapp.gwt.where_library.view.stops.TransitMapManager;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.maps.client.InfoWindow;
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.control.MapTypeControl;
import com.google.gwt.maps.client.control.ScaleControl;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.geom.LatLngBounds;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiFactory;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
public class StopFinderWidget extends Composite {
private static MyUiBinder _uiBinder = GWT.create(MyUiBinder.class);
private static OBAConfig _config = OBAConfig.getConfig();
private static LatLng _center = LatLng.newInstance(_config.getCenterLat(), _config.getCenterLon());
private static int _zoom = 11;
/*****************************************************************************
* Private Members
****************************************************************************/
@UiField
FlowPanel _titlePanel;
@UiField
FormPanel _searchFormPanel;
@UiField
TextBox _searchTextBox;
@UiField
FlowPanel _linksPanel;
@UiField
Anchor _currentLinkAnchor;
@UiField
FlowPanel _resultsPanel;
@UiField
MapWidgetComposite _mapPanel;
@UiField
StopFinderCssResource style;
protected MapWidget _map = new MapWidget(_center, _zoom);
protected TransitMapManager _transitMapManager = new TransitMapManager(_map);
protected StopFinderInterface _stopFinder;
/*****************************************************************************
* Public Methods
****************************************************************************/
public StopFinderWidget() {
initWidget(_uiBinder.createAndBindUi(this));
_map.addControl(new LargeMapControl());
_map.addControl(new MapTypeControl());
_map.addControl(new ScaleControl());
_map.setScrollWheelZoomEnabled(true);
// We delay initialization of the map
Scheduler scheduler = Scheduler.get();
scheduler.scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
_map.checkResizeAndCenter();
CoordinateBounds b = _config.getBounds();
LatLng from = LatLng.newInstance(b.getMinLat(), b.getMinLon());
LatLng to = LatLng.newInstance(b.getMaxLat(), b.getMaxLon());
LatLngBounds bounds = LatLngBounds.newInstance(from, to);
int zoom = _map.getBoundsZoomLevel(bounds);
System.out.println(bounds + " => " + zoom);
_map.setZoomLevel(zoom);
_map.checkResizeAndCenter();
}
});
_transitMapManager.addStopClickedHandler(new StopClickedHandler() {
@Override
public void handleStopClicked(StopClickedEvent event) {
StopBean stop = event.getStop();
InfoWindow window = _map.getInfoWindow();
LatLng point = LatLng.newInstance(stop.getLat(), stop.getLon());
Widget widget = getStopInfoWindowWidget(stop,style);
window.open(point, new InfoWindowContent(widget));
}
});
}
public void setStopFinder(StopFinderInterface stopFinder) {
_stopFinder = stopFinder;
}
public StopFinderInterface getStopFinder() {
return _stopFinder;
}
public MapWidget getMapWidget() {
return _map;
}
public TransitMapManager getTransitMapManager() {
return _transitMapManager;
}
public StopFinderCssResource getCss() {
return style;
}
@UiFactory
MapWidgetComposite makeMapPanel() {
return new MapWidgetComposite(_map);
}
/****
* Public Methods
****/
public void setTitleWidget(Widget widget) {
_titlePanel.clear();
_titlePanel.add(widget);
}
public void setSearchText(String value) {
_searchTextBox.setText(value);
DeferredCommand.addCommand(new Command() {
public void execute() {
_searchTextBox.setFocus(true);
}
});
}
public void resetContents() {
_map.clearOverlays();
_resultsPanel.clear();
}
public Panel getResultsPanel() {
return _resultsPanel;
}
/****
* Local Methods
****/
@UiHandler("_searchFormPanel")
void doSubmit(SubmitEvent event) {
event.cancel();
String value = _searchTextBox.getText();
if (value == null)
return;
value = value.trim();
if (value.length() == 0)
return;
_stopFinder.query(value);
}
@UiHandler("_currentLinkAnchor")
void onCurrentLinkAnchorMouseOver(MouseOverEvent event) {
String url = _stopFinder.getCurrentViewAsUrl();
_currentLinkAnchor.setHref(url);
}
protected Widget getStopInfoWindowWidget(StopBean stop, StopFinderCssResource css) {
return new StopInfoWindowWidget(_stopFinder, _transitMapManager, stop,css);
}
protected void hideLinksPanel() {
_linksPanel.setVisible(false);
}
interface MyUiBinder extends UiBinder<Widget, StopFinderWidget> {
}
}