/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.numix.calculator.view;
import android.content.Context;
import android.text.Editable;
import android.text.InputType;
import android.text.Spanned;
import android.text.method.NumberKeyListener;
import android.view.ActionMode;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import com.numix.calculator.Logic;
import com.numix.calculator.R;
public class MatrixEditText extends EditText implements OnFocusChangeListener {
private static final char[] ACCEPTED_CHARS = "0123456789,.-\u2212".toCharArray();
private MatrixView mParent;
private AdvancedDisplay mDisplay;
public MatrixEditText(Context context) {
super(context);
}
public MatrixEditText(final AdvancedDisplay display, final MatrixView parent) {
super(display.getContext());
setCustomSelectionActionModeCallback(new NoTextSelectionMode());
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT);
int padding = getContext().getResources().getDimensionPixelSize(R.dimen.matrix_edit_text_padding);
setPadding(padding, 0, padding, 0);
this.mParent = parent;
this.mDisplay = display;
setKeyListener(new MatrixKeyListener());
setOnFocusChangeListener(this);
setGravity(Gravity.CENTER);
// Listen for the enter button on physical keyboards
setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
mDisplay.mLogic.onEnter();
return true;
}
});
}
class MatrixKeyListener extends NumberKeyListener {
@Override
public int getInputType() {
return EditorInfo.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
}
@Override
protected char[] getAcceptedChars() {
return ACCEPTED_CHARS;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
return null;
}
@Override
public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_DEL) {
if(mParent.isEmpty()) mDisplay.removeView(mParent);
}
return super.onKeyDown(view, content, keyCode, event);
}
}
class NoTextSelectionMode implements ActionMode.Callback {
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Prevents the selection action mode on double tap.
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
mDisplay.mActiveEditText = MatrixEditText.this;
if(getText().toString().equals(Logic.NAN)) {
setText("");
}
}
}
@Override
public String toString() {
return getText().toString();
}
@Override
public View focusSearch(int direction) {
switch(direction) {
case View.FOCUS_FORWARD:
return mParent.nextView(this);
case View.FOCUS_BACKWARD:
return mParent.previousView(this);
}
return super.focusSearch(direction);
}
public MatrixView getMatrixView() {
return mParent;
}
}