package com.marshalchen.common.uimodule.tileView.tileview.hotspots;
import android.graphics.Point;
import com.marshalchen.common.uimodule.tileView.tileview.detail.DetailLevelEventListener;
import com.marshalchen.common.uimodule.tileView.tileview.detail.DetailManager;
import java.util.ArrayList;
public class HotSpotManager implements DetailLevelEventListener {
private double scale = 1;
private ArrayList<HotSpotEventListener> listeners = new ArrayList<HotSpotEventListener>();
private ArrayList<HotSpot> spots = new ArrayList<HotSpot>();
public HotSpotManager( DetailManager detailManager ) {
detailManager.addDetailLevelEventListener( this );
}
public void addHotSpot( HotSpot hotSpot ){
spots.add( hotSpot );
}
public void removeHotSpot( HotSpot hotSpot ){
spots.remove( hotSpot );
}
public void addHotSpotEventListener( HotSpotEventListener listener ) {
listeners.add( listener );
}
public void removeHotSpotEventListener( HotSpotEventListener listener ) {
listeners.remove( listener );
}
public void clear(){
spots.clear();
}
// work from end of list - match the last one added (equivalant to z-index)
private HotSpot getMatch( Point point ){
Point scaledPoint = new Point();
scaledPoint.x = (int) ( point.x / scale );
scaledPoint.y = (int) ( point.y / scale );
for(int i = spots.size() - 1; i >= 0; i--){
HotSpot hotSpot = spots.get( i );
if(hotSpot.contains( scaledPoint.x, scaledPoint.y )){
return hotSpot;
}
}
return null;
}
public void processHit( Point point ){
// fast-fail if no listeners
if(listeners.isEmpty()){
return;
}
// is there a match?
HotSpot hotSpot = getMatch( point );
if( hotSpot != null){
HotSpotEventListener spotListener = hotSpot.getHotSpotEventListener();
if( spotListener != null ) {
spotListener.onHotSpotTap( hotSpot, point.x, point.y );
}
for( HotSpotEventListener listener : listeners ) {
listener.onHotSpotTap( hotSpot, point.x, point.y );
}
}
}
@Override
public void onDetailLevelChanged() {
}
@Override
public void onDetailScaleChanged( double s ) {
scale = s;
}
}