@Override
  public void onStart() {
    formulaEditorKeyboard.setClickable(true);

    getView().requestFocus();
    View.OnTouchListener touchListener =
        new View.OnTouchListener() {
          private Handler handler;
          private Runnable deleteAction;

          private boolean handleLongClick(final View view, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
              if (handler == null) {
                return true;
              }
              handler.removeCallbacks(deleteAction);
              handler = null;
            }
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
              deleteAction =
                  new Runnable() {
                    @Override
                    public void run() {
                      handler.postDelayed(this, 100);
                      if (formulaEditorEditText.isThereSomethingToDelete()) {
                        formulaEditorEditText.handleKeyEvent(view.getId(), "");
                      }
                    }
                  };

              if (handler != null) {
                return true;
              }
              handler = new Handler();
              handler.postDelayed(deleteAction, 400);
            }
            return true;
          }

          @Override
          public boolean onTouch(View view, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
              updateButtonsOnKeyboardAndInvalidateOptionsMenu();
              view.setPressed(false);
              handleLongClick(view, event);
              return true;
            }

            if (event.getAction() == MotionEvent.ACTION_DOWN) {

              view.setPressed(true);

              switch (view.getId()) {
                case R.id.formula_editor_keyboard_compute:
                  InternFormulaParser internFormulaParser =
                      formulaEditorEditText.getFormulaParser();
                  FormulaElement formulaElement = internFormulaParser.parseFormula();
                  if (formulaElement == null) {
                    if (internFormulaParser.getErrorTokenIndex() >= 0) {
                      formulaEditorEditText.setParseErrorCursorAndSelection();
                    }
                    return false;
                  }
                  Formula formulaToCompute = new Formula(formulaElement);
                  FormulaEditorComputeDialog computeDialog =
                      new FormulaEditorComputeDialog(context);
                  computeDialog.setFormula(formulaToCompute);
                  computeDialog.show();
                  return true;
                case R.id.formula_editor_keyboard_function:
                  showFormularEditorCategorylistFragment(
                      FormulaEditorCategoryListFragment.FUNCTION_TAG,
                      R.string.formula_editor_functions);
                  return true;
                case R.id.formula_editor_keyboard_logic:
                  showFormularEditorCategorylistFragment(
                      FormulaEditorCategoryListFragment.LOGIC_TAG, R.string.formula_editor_logic);
                  return true;
                case R.id.formula_editor_keyboard_object:
                  showFormularEditorCategorylistFragment(
                      FormulaEditorCategoryListFragment.OBJECT_TAG,
                      R.string.formula_editor_choose_object_variable);
                  return true;
                case R.id.formula_editor_keyboard_sensors:
                  showFormularEditorCategorylistFragment(
                      FormulaEditorCategoryListFragment.SENSOR_TAG, R.string.formula_editor_device);
                  return true;
                case R.id.formula_editor_keyboard_data:
                  showFormulaEditorDataFragment(
                      FormulaEditorDataFragment.USER_DATA_TAG, R.string.formula_editor_data);
                  return true;
                case R.id.formula_editor_keyboard_ok:
                  endFormulaEditor();
                  return true;
                case R.id.formula_editor_keyboard_string:
                  FragmentManager fragmentManager = ((Activity) context).getFragmentManager();
                  Fragment dialogFragment =
                      fragmentManager.findFragmentByTag(NewStringDialog.DIALOG_FRAGMENT_TAG);

                  if (dialogFragment == null) {
                    dialogFragment = NewStringDialog.newInstance();
                  }

                  ((NewStringDialog) dialogFragment)
                      .show(fragmentManager, NewStringDialog.DIALOG_FRAGMENT_TAG);
                  return true;
                case R.id.formula_editor_keyboard_delete:
                  formulaEditorEditText.handleKeyEvent(view.getId(), "");
                  return handleLongClick(view, event);
                default:
                  formulaEditorEditText.handleKeyEvent(view.getId(), "");
                  return true;
              }
            }
            return false;
          }
        };

    for (int index = 0; index < formulaEditorKeyboard.getChildCount(); index++) {
      View tableRow = formulaEditorKeyboard.getChildAt(index);
      if (tableRow instanceof TableRow) {
        TableRow row = (TableRow) tableRow;
        for (int indexRow = 0; indexRow < row.getChildCount(); indexRow++) {
          row.getChildAt(indexRow).setOnTouchListener(touchListener);
        }
      }
    }

    updateButtonsOnKeyboardAndInvalidateOptionsMenu();

    super.onStart();
  }