package com.csound.wizard.view.unit;
import java.util.Calendar;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.csound.wizard.Const;
import com.csound.wizard.layout.Units.StatefulUnit;
import com.csound.wizard.layout.param.ColorParam;
import com.csound.wizard.view.Listener;
import com.csound.wizard.view.ViewUtils;
import com.csound.wizard.view.GraphUtils.Circle;
import com.csound.wizard.view.GraphUtils.Rect;
import com.csound.wizard.view.Listener.OnPress;
import com.csound.wizard.view.Listener.OnPressListener;
import com.csound.wizard.view.ViewUtils.OnMeasure;
public class ToggleButton extends View implements StatefulUnit, OnPressListener {
private OnPress mListener = Listener.defaultOnPress();
private Paint paint = new Paint();
private String mid;
private boolean isOn = false;
private static final int desiredSize = Const.desiredCircleSize;
private Circle mCircle = new Circle();
private Rect mRect = new Rect();
private static final int MAX_CLICK_DURATION = 200;
private long startClickTime;
private ColorParam colors = new ColorParam();
public ToggleButton(Context context, String id, boolean initVal, ColorParam colorParam) {
super(context);
ViewUtils.initPaint(paint);
colors = colorParam;
isOn = initVal;
mid = id;
}
public ToggleButton(Context context, AttributeSet attrs) {
super(context, attrs);
ViewUtils.initPaint(attrs, paint);
}
@Override
public void setOnPressListener(OnPress listener) {
mListener = listener;
}
@Override
public String getUnitId() {
return mid;
}
@Override
public double[] getUnitState() {
double[] ds = new double[1];
ds[0] = isOn ? 1 : 0;
return ds;
}
@Override
public void onDraw(Canvas canvas) {
mRect.setView(this);
mCircle.setCircle(mRect.getCenterX(), mRect.getCenterY(), 0.45f * mRect.getWidth() );
if (colors.getBkgColor() != Color.TRANSPARENT) {
paint.setColor(colors.getBkgColor());
mCircle.drawFill(canvas, paint);
}
if (isOn) {
paint.setColor(colors.getFstColor());
mCircle.drawRim(canvas, paint);
paint.setStyle(Style.FILL);
mCircle.drawPlayButton(canvas, paint);
} else {
paint.setColor(colors.getSndColor());
mCircle.drawRim(canvas, paint);
paint.setStyle(Style.FILL);
mCircle.drawStopButton(canvas, paint);
}
}
@Override
public boolean performClick() {
// TODO Auto-generated method stub
return super.performClick();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
if (mCircle.contains(event.getX(0), event.getY(0))) {
startClickTime = Calendar.getInstance().getTimeInMillis();
performClick();
}
break;
}
case MotionEvent.ACTION_UP: {
long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
if(clickDuration < MAX_CLICK_DURATION) {
toggleButton();
}
}
}
return true;
}
private void toggleButton() {
isOn = !isOn;
invalidate();
if (isOn) {
mListener.press();
} else {
mListener.release();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
ViewUtils.mkOnMeasure(widthMeasureSpec, heightMeasureSpec, desiredSize, desiredSize, onMeasureRunner);
}
private OnMeasure onMeasureRunner = new OnMeasure() {
@Override
public void apply(int width, int height) {
int size = Math.min(width, height);
mCircle.setCircle(size/2, size/2, size/2 - 10);
setMeasuredDimension(size, size);
}
};
public static boolean defaultState() {
return false;
}
}