package de.nisble.droidsweeper.gui.grid;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import de.nisble.droidsweeper.game.Field;
import de.nisble.droidsweeper.game.Position;
import de.nisble.droidsweeper.game.jni.FieldListener;
import de.nisble.droidsweeper.game.jni.FieldStatus;
import de.nisble.droidsweeper.game.jni.MineSweeperMatrix;
import de.nisble.droidsweeper.utilities.LogDog;
/** A FieldView is an ImageView responsible for showing the {@link FieldStatus
* status} of a single field on the {@link GameGridView game grid}. It implements
* the {@link FieldListener} interface and can therefore be registered in
* {@link MineSweeperMatrix#setFieldListener(FieldListener)}. The
* {@link FieldListener#onStatusChanged(FieldStatus, int)} is than directly
* called from native code, causing this widget to change its appearance.
* @author Moritz Nisblé moritz.nisble@gmx.de */
public class FieldView extends ImageView implements FieldListener {
private static final String CLASSNAME = FieldView.class.getSimpleName();
private Field mField = null;
private void init() {
mField = new Field(new Position(), FieldStatus.HIDDEN, 0);
setImageDrawable(FieldDrawables.getDrawable(mField.STATUS, 0));
}
/** Constructor. */
public FieldView(Context context) {
this(context, null);
}
/** Constructor. */
public FieldView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
/** Constructor. */
public FieldView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
@Override
public Position getPosition() {
return mField.POSITION;
}
/** @return The current {@link FieldStatus}. */
public FieldStatus getFieldStatus() {
return mField.STATUS;
}
/** Reset the internal {@link FieldStatus} to {@link FieldStatus#HIDDEN
* HIDDEN}, load the corresponding {@link FieldDrawables image} and the
* {@link Position} to the given one.
* @param p The new {@link Position}. */
public void reset(Position p) {
mField = new Field(p, FieldStatus.HIDDEN, 0);
setImageDrawable(FieldDrawables.getDrawable(mField.STATUS, 0));
}
/* (non-Javadoc)
* @see
* de.nisble.droidsweeper.binding.FieldListener#onStatusChanged(de.nisble
* .droidsweeper.binding.FieldStatus, int)
* This method is directly called from native code. */
@Override
public void onStatusChanged(FieldStatus status, int adjacentBombs) {
LogDog.d(CLASSNAME, "Changing status of " + mField.POSITION.toString() + " to " + status.toString());
mField = new Field(mField.POSITION, status, adjacentBombs);
setImageDrawable(FieldDrawables.getDrawable(status, adjacentBombs));
}
}