NumericDialog.java :  » App » greenmileage » org » greenmileage » ui » Android Open Source

Android Open Source » App » greenmileage 
greenmileage » org » greenmileage » ui » NumericDialog.java
package org.greenmileage.ui;

import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputFilter;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.TextView.BufferType;
import org.greenmileage.R;
import org.greenmileage.util.CallbackListener;

/**
 * A dialog allowing numeric input
 * @author Connor Garvey
 * @created Jan 10, 2009, 11:08:51 PM
 * @version 0.0.5
 * @since 0.0.4
 */
public class NumericDialog extends AlertDialog {
  private static class NumberButtonListener implements View.OnClickListener {
    private final TextView field;
    private final String number;
    
    public NumberButtonListener(final TextView field, final String number) {
      this.field = field;
      this.number = number;
    }
    
    @Override
    public void onClick(final View v) {
      this.field.append(this.number);
    }
  }
  
  private static final String NUMBER = "number";
  private Button button0;
  private Button button1;
  private Button button2;
  private Button button3;
  private Button button4;
  private Button button5;
  private Button button6;
  private Button button7;
  private Button button8;
  private Button button9;
  private ImageButton buttonBack;
  private Button buttonOK;
  private CallbackListener<String> callbackListener;
  private TextView numberText;
  
  /**
   * Creates a numeric dialog
   * @param context The context
   * @param initialValue The initial value to display
   * @param cancelable True if the dialog should be allowed to be cancelled, false otherwise
   * @param cancelListener Receives the cancel event
   * @param callbackListener Receives the input number
   */
  public NumericDialog(final Context context, final String initialValue, final boolean cancelable,
      final OnCancelListener cancelListener, final CallbackListener<String> callbackListener) {
    super(context, cancelable, cancelListener);
    this.construct(context, initialValue, callbackListener);
  }
  
  /**
   * Creates a numeric dialog
   * @param context The context
   * @param initialValue The initial value to display
   * @param callbackListener Receives the input number
   */
  public NumericDialog(final Context context, final String initialValue,
      final CallbackListener<String> callbackListener) {
    super(context);
    this.construct(context, initialValue, callbackListener);
  }
  
  /**
   * Creates a numeric dialog
   * @param context The context
   * @param initialValue The initial value to display
   * @param theme The theme to apply to the dialog
   * @param callbackListener Receives the input number
   */
  public NumericDialog(final Context context, final String initialValue, final int theme,
      final CallbackListener<String> callbackListener) {
    super(context, theme);
    this.construct(context, initialValue, callbackListener);
  }
  
  /**
   * Updates the text watcher for the number field
   * @param textWatcher The text watcher
   */
  public void addTextWatcher(final TextWatcher textWatcher) {
    this.numberText.addTextChangedListener(textWatcher);
  }
  
  /**
   * Performs constructor tasks specific to this class
   * @param context The Android context
   * @param callbackListener The callback listener
   */
  private void construct(final Context context, final String initialValue,
      final CallbackListener<String> callbackListener) {
    if (callbackListener == null) {
      throw new IllegalArgumentException("callbackListener can't be null");
    }
    this.callbackListener = callbackListener;
    final LayoutInflater inflater = (LayoutInflater)context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View view = inflater.inflate(R.layout.number_input_dialog, null);
    this.setView(view);
    this.numberText = (TextView)view.findViewById(R.id.number);
    this.button0 = (Button)view.findViewById(R.id.n0);
    this.button1 = (Button)view.findViewById(R.id.n1);
    this.button2 = (Button)view.findViewById(R.id.n2);
    this.button3 = (Button)view.findViewById(R.id.n3);
    this.button4 = (Button)view.findViewById(R.id.n4);
    this.button5 = (Button)view.findViewById(R.id.n5);
    this.button6 = (Button)view.findViewById(R.id.n6);
    this.button7 = (Button)view.findViewById(R.id.n7);
    this.button8 = (Button)view.findViewById(R.id.n8);
    this.button9 = (Button)view.findViewById(R.id.n9);
    this.buttonBack = (ImageButton)view.findViewById(R.id.back);
    this.buttonOK = (Button)view.findViewById(R.id.ok);
    this.numberText.setText(initialValue);
    this.button0.setOnClickListener(new NumberButtonListener(this.numberText, "0"));
    this.button1.setOnClickListener(new NumberButtonListener(this.numberText, "1"));
    this.button2.setOnClickListener(new NumberButtonListener(this.numberText, "2"));
    this.button3.setOnClickListener(new NumberButtonListener(this.numberText, "3"));
    this.button4.setOnClickListener(new NumberButtonListener(this.numberText, "4"));
    this.button5.setOnClickListener(new NumberButtonListener(this.numberText, "5"));
    this.button6.setOnClickListener(new NumberButtonListener(this.numberText, "6"));
    this.button7.setOnClickListener(new NumberButtonListener(this.numberText, "7"));
    this.button8.setOnClickListener(new NumberButtonListener(this.numberText, "8"));
    this.button9.setOnClickListener(new NumberButtonListener(this.numberText, "9"));
    this.buttonBack.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(final View v) {
        final TextView number = NumericDialog.this.numberText;
        final CharSequence text = number.getText();
        if (text.length() == 0) {
          return;
        }
        // This is annoyingly ugly, but is from the Android source
        if (!(text instanceof Editable)) {
          number.setText(text, BufferType.EDITABLE);
        }
        final Editable editable = (Editable)number.getText();
        editable.delete(text.length() - 1, text.length());
      }
    });
    this.buttonOK.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(final View v) {
        NumericDialog.this.dismiss();
        NumericDialog.this.callbackListener.onResult(NumericDialog.this.numberText.getText()
            .toString());
      }
    });
  }
  
  /**
   * @return the button0
   */
  public Button getButton0() {
    return this.button0;
  }
  
  /**
   * @return the button1
   */
  public Button getButton1() {
    return this.button1;
  }
  
  /**
   * @return the button2
   */
  public Button getButton2() {
    return this.button2;
  }
  
  /**
   * @return the button3
   */
  public Button getButton3() {
    return this.button3;
  }
  
  /**
   * @return the button4
   */
  public Button getButton4() {
    return this.button4;
  }
  
  /**
   * @return the button5
   */
  public Button getButton5() {
    return this.button5;
  }
  
  /**
   * @return the button6
   */
  public Button getButton6() {
    return this.button6;
  }
  
  /**
   * @return the button7
   */
  public Button getButton7() {
    return this.button7;
  }
  
  /**
   * @return the button8
   */
  public Button getButton8() {
    return this.button8;
  }
  
  /**
   * @return the button9
   */
  public Button getButton9() {
    return this.button9;
  }
  
  /**
   * @return the buttonBack
   */
  public ImageButton getButtonBack() {
    return this.buttonBack;
  }
  
  /**
   * @return the buttonOK
   */
  public Button getButtonOK() {
    return this.buttonOK;
  }
  
  /**
   * @return the numberText
   */
  public TextView getNumberText() {
    return this.numberText;
  }
  
  /**
   * @see android.app.Dialog#onRestoreInstanceState(android.os.Bundle)
   */
  @Override
  public void onRestoreInstanceState(final Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    this.numberText.setText(savedInstanceState.getString(NUMBER));
  }
  
  /**
   * @see android.app.Dialog#onSaveInstanceState()
   */
  @Override
  public Bundle onSaveInstanceState() {
    final Bundle state = super.onSaveInstanceState();
    state.putString(NUMBER, this.numberText.getText().toString());
    return state;
  }
  
  /**
   * Sets the text input filter
   * @param filter The filter
   */
  public void setInputFilter(final InputFilter filter) {
    this.numberText.setFilters(new InputFilter[] {filter});
  }
  
  /**
   * Sets the number in the dialog
   * @param value The number
   */
  public void setValue(final String value) {
    this.numberText.setText(value);
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.