package com.commonsensenet.realfarm.control; import java.text.DecimalFormat; import android.content.Context; import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.View.OnTouchListener; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import com.commonsensenet.realfarm.R; public class NumberPicker extends LinearLayout implements OnClickListener, OnLongClickListener, OnTouchListener { private class RepetetiveUpdater implements Runnable { private double mIncrement = 0.1; public RepetetiveUpdater(double increment) { mIncrement = increment; } public void run() { if (mAutoIncrement) { increment(mIncrement); mHandler.postDelayed(new RepetetiveUpdater(mIncrement), REPEAT_DELAY); } } } private static final DecimalFormat ONE_DIGIT_FORMAT = new DecimalFormat( "#,###0.0"); private static final long REPEAT_DELAY = 100; private static final DecimalFormat TWO_DIGIT_FORMAT = new DecimalFormat( "#,###0.00"); private boolean mAutoIncrement = false; private double mCurNb = 10; private int mDigitNb = 0; private Handler mHandler = new Handler(); private double mIncrementStep = 1; private double mMax = 20; private double mMin = 0; private ImageButton mMinusButton; private TextView mNumberTextView; private ImageButton mPlusButton; public NumberPicker(Context context) { super(context); } public NumberPicker(Context context, double min, double max, double curNb, double increment, int digitNb) { super(context); inflate(context, R.layout.numberpicker, this); mMin = min; mMax = max; mCurNb = curNb; mIncrementStep = increment; mDigitNb = digitNb; mMinusButton = (ImageButton) findViewById(R.id.button1); mPlusButton = (ImageButton) findViewById(R.id.button2); mNumberTextView = (TextView) findViewById(R.id.tw); mPlusButton.setOnClickListener(this); mMinusButton.setOnClickListener(this); mPlusButton.setOnTouchListener(this); mMinusButton.setOnTouchListener(this); mPlusButton.setOnLongClickListener(this); mMinusButton.setOnLongClickListener(this); increment(0); } public void increment(double inc) { double tmp = mCurNb + inc; mPlusButton.setImageResource(R.drawable.incactionactive); mMinusButton.setImageResource(R.drawable.decactionactive); if (tmp >= mMax) { mPlusButton.setImageResource(R.drawable.incactioninactive); mPlusButton.setPressed(false); } else if (tmp <= mMin) { mMinusButton.setImageResource(R.drawable.decactioninactive); mMinusButton.setPressed(false); } if (tmp > mMax) { mAutoIncrement = false; } else if (tmp < mMin) { mAutoIncrement = false; } else { mCurNb = tmp; if (mDigitNb == 0) mNumberTextView.setText((int) (mCurNb) + ""); else if (mDigitNb == 1) mNumberTextView.setText(Double.valueOf(ONE_DIGIT_FORMAT .format(mCurNb)) + ""); else mNumberTextView.setText(Double.valueOf(TWO_DIGIT_FORMAT .format(mCurNb)) + ""); } } public void onClick(View v) { if (v.getId() == R.id.button1) { increment(-mIncrementStep); } else if (v.getId() == R.id.button2) { increment(mIncrementStep); } } public boolean onLongClick(View v) { if (v.getId() == R.id.button1) { mAutoIncrement = true; mHandler.post(new RepetetiveUpdater(-mIncrementStep)); } else if (v.getId() == R.id.button2) { mAutoIncrement = true; mHandler.post(new RepetetiveUpdater(mIncrementStep)); } return false; } public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { mAutoIncrement = false; } return false; } }