package net.osmand.plus.mapcontextmenu.other; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.mapcontextmenu.BaseMenuController; import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.mapcontextmenu.MenuController.MenuType; import net.osmand.plus.mapcontextmenu.MenuTitleController; import net.osmand.plus.views.ContextMenuLayer; import net.osmand.plus.views.ContextMenuLayer.IContextMenuProvider; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; public class MapMultiSelectionMenu extends BaseMenuController { private LatLon latLon; private LinkedList<MenuObject> objects = new LinkedList<>(); private Map<Object, IContextMenuProvider> selectedObjects = new HashMap<>(); public static class MenuObject extends MenuTitleController { private LatLon latLon; private PointDescription pointDescription; private Object object; private int order; private MapActivity mapActivity; private MenuController controller; public MenuObject(LatLon latLon, PointDescription pointDescription, Object object, MapActivity mapActivity) { this.latLon = latLon; this.pointDescription = pointDescription; this.object = object; this.mapActivity = mapActivity; init(); } protected void init() { controller = MenuController.getMenuController(mapActivity, latLon, pointDescription, object, MenuType.MULTI_LINE); controller.setActive(true); initTitle(); } @Override public LatLon getLatLon() { return latLon; } @Override public PointDescription getPointDescription() { return pointDescription; } @Override public Object getObject() { return object; } @Override public MapActivity getMapActivity() { return mapActivity; } @Override public MenuController getMenuController() { return controller; } @Override protected boolean needStreetName() { return false; } } public MapMultiSelectionMenu(MapActivity mapActivity) { super(mapActivity); } public void setMapActivity(MapActivity mapActivity) { super.setMapActivity(mapActivity); for (MenuObject o : objects) { o.mapActivity = mapActivity; o.init(); } } public List<MenuObject> getObjects() { return objects; } @Override public float getHalfScreenMaxHeightKoef() { return 0.5f; } private void createCollection(Map<Object, IContextMenuProvider> selectedObjects) { this.selectedObjects.clear(); this.selectedObjects.putAll(selectedObjects); objects.clear(); for (Map.Entry<Object, IContextMenuProvider> e : selectedObjects.entrySet()) { Object selectedObj = e.getKey(); IContextMenuProvider contextObject = selectedObjects.get(selectedObj); LatLon ll = null; PointDescription pointDescription = null; if (contextObject != null) { ll = contextObject.getObjectLocation(selectedObj); pointDescription = contextObject.getObjectName(selectedObj); } if (ll == null) { ll = latLon; } if (pointDescription == null) { pointDescription = new PointDescription(latLon.getLatitude(), latLon.getLongitude()); } MenuObject menuObject = new MenuObject(ll, pointDescription, selectedObj, getMapActivity()); objects.add(menuObject); if (contextObject instanceof ContextMenuLayer.IContextMenuProviderSelection) { menuObject.order = ((ContextMenuLayer.IContextMenuProviderSelection) contextObject).getOrder(selectedObj); } } Collections.sort(objects, new Comparator<MenuObject>() { @Override public int compare(MenuObject obj1, MenuObject obj2) { if (obj1.order == obj2.order) { return obj1.getTitleStr().compareToIgnoreCase(obj2.getTitleStr()); } else { return obj1.order - obj2.order; } } }); } private void clearMenu() { clearSelectedObjects(); objects.clear(); getMapActivity().refreshMap(); } public void show(LatLon latLon, Map<Object, IContextMenuProvider> selectedObjects) { if (isVisible()) { hide(); } /* for (Map.Entry<Object, IContextMenuProvider> e : selectedObjects.entrySet()) { if (e.getValue() instanceof ContextMenuLayer.IContextMenuProviderSelection) { ((ContextMenuLayer.IContextMenuProviderSelection) e.getValue()).setSelectedObject(e.getKey()); } } */ this.latLon = latLon; createCollection(selectedObjects); updateNightMode(); MapMultiSelectionMenuFragment.showInstance(getMapActivity()); getMapActivity().refreshMap(); } public boolean isVisible() { Fragment fragment = getFragmentByTag(); return fragment != null; } public Fragment getFragmentByTag() { return getMapActivity().getSupportFragmentManager().findFragmentByTag(MapMultiSelectionMenuFragment.TAG); } public void hide() { clearMenu(); Fragment fragment = getFragmentByTag(); if (fragment != null) { MapMultiSelectionMenuFragment menuFragment = (MapMultiSelectionMenuFragment) fragment; menuFragment.dismissMenu(); } } public void onStop() { clearSelectedObjects(); } public void openContextMenu(@NonNull MenuObject menuObject) { IContextMenuProvider provider = selectedObjects.remove(menuObject.getObject()); hide(); getMapActivity().getMapLayers().getContextMenuLayer().showContextMenu( menuObject.getLatLon(), menuObject.getPointDescription(), menuObject.getObject(), provider); } private void clearSelectedObjects() { for(IContextMenuProvider p : selectedObjects.values()) { if(p instanceof ContextMenuLayer.IContextMenuProviderSelection){ ((ContextMenuLayer.IContextMenuProviderSelection) p).clearSelectedObject(); } } selectedObjects.clear(); } }