/* * Copyright 2012 osmdroid authors: * Copyright 2012 Nicolas Gramlich * Copyright 2012 Theodore Hong * Copyright 2012 Fred Eisele * * Copyright 2013 Hannes Janetzek * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later version. * * This program 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package org.oscim.layers.marker; import org.oscim.core.Point; import org.oscim.layers.Layer; import org.oscim.map.Map; /** * Draws a list of {@link MarkerItem} as markers to a map. The item with the * lowest index is drawn as last and therefore the 'topmost' marker. It also * gets checked for onTap first. This class is generic, because you then you get * your custom item-class passed back in onTap(). << TODO */ public abstract class MarkerLayer<Item extends MarkerItem> extends Layer { protected final MarkerRenderer mMarkerRenderer; protected Item mFocusedItem; /** * Method by which subclasses create the actual Items. This will only be * called from populate() we'll cache them for later use. */ protected abstract Item createItem(int i); /** * The number of items in this overlay. */ public abstract int size(); @SuppressWarnings("unchecked") public MarkerLayer(Map map, MarkerSymbol defaultSymbol) { super(map); mMarkerRenderer = new MarkerRenderer((MarkerLayer<MarkerItem>) this, defaultSymbol); mRenderer = mMarkerRenderer; } /** * Utility method to perform all processing on a new ItemizedOverlay. * Subclasses provide Items through the createItem(int) method. The subclass * should call this as soon as it has data, before anything else gets * called. */ protected final void populate() { mMarkerRenderer.populate(size()); } /** * TODO * If the given Item is found in the overlay, force it to be the current * focus-bearer. Any registered {link ItemizedLayer#OnFocusChangeListener} * will be notified. This does not move the map, so if the Item isn't * already centered, the user may get confused. If the Item is not found, * this is a no-op. You can also pass null to remove focus. * * @param item */ public void setFocus(Item item) { mFocusedItem = item; } /** * @return the currently-focused item, or null if no item is currently * focused. */ public Item getFocus() { return mFocusedItem; } /** * TODO * Interface definition for overlays that contain items that can be snapped * to (for example, when the user invokes a zoom, this could be called * allowing the user to snap the zoom to an interesting point.) */ public interface Snappable { /** * Checks to see if the given x and y are close enough to an item * resulting in snapping the current action (e.g. zoom) to the item. * * @param x * The x in screen coordinates. * @param y * The y in screen coordinates. * @param snapPoint * To be filled with the the interesting point (in screen * coordinates) that is closest to the given x and y. Can be * untouched if not snapping. * @return Whether or not to snap to the interesting point. */ boolean onSnapToItem(int x, int y, Point snapPoint); } }