package it.geosolutions.geocollect.android.core.form.action; import org.mapsforge.core.model.GeoPoint; import it.geosolutions.android.map.overlay.items.DescribedMarker; import it.geosolutions.android.map.view.AdvancedMapView; import it.geosolutions.geocollect.android.core.form.FormPageFragment; import it.geosolutions.geocollect.android.core.mission.Mission; import it.geosolutions.geocollect.model.viewmodel.FormAction; import it.geosolutions.geocollect.model.viewmodel.Page; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import com.actionbarsherlock.app.SherlockFragment; public class CenterOnMarkerAction extends AndroidAction { private static final long serialVersionUID = -2858057391209301056L; public CenterOnMarkerAction(FormAction a) { super(a); } /** * finds the mapview, looks for the first marker and centers the map on its position */ @Override public void performAction(SherlockFragment fragment, FormAction action, Mission m, Page p) { if(fragment instanceof FormPageFragment){ final LinearLayout formView = ((FormPageFragment) fragment).getFormView(); //find mapview final AdvancedMapView mapView = findMapView(formView); if(mapView == null){ Log.e(LocalizeAction.class.getSimpleName(), "no mapView found, cannot continue"); return; } DescribedMarker setMarker = null; //find the marker if(mapView.getOverlayManger().getMarkerOverlay().getMarkers() != null && mapView.getOverlayManger().getMarkerOverlay().getMarkers().size() > 0){ setMarker = mapView.getOverlayManger().getMarkerOverlay().getMarkers().get(0); GeoPoint geoPoint = setMarker.getGeoPoint(); //center map on markers position mapView.getMapViewPosition().setCenter(geoPoint); } } } /** * traverses recursively the view hierarchy of the * @param root until it finds a AdvancedMapView instance * @return the instance found or null if none was found */ public AdvancedMapView findMapView(ViewGroup root) { final int childCount = root.getChildCount(); for (int i = 0; i < childCount; ++i) { final View child = root.getChildAt(i); if(child instanceof AdvancedMapView){ return (AdvancedMapView) child; } if (child instanceof ViewGroup) { return findMapView((ViewGroup) child); } } return null; } }