コード例 #1
0
ファイル: Calculator.java プロジェクト: ajmulhollan1/Calc
  // ======================================================================
  // [FUNC] Accepts input key from the user.
  public void inputKey(String key) {
    if (hasError) {
      if (key == CXX || key == GRP) {
      } else if (key == HEX || key == DEC || key == OCT || key == BIN) initFields();
      else {
        beep();
        return;
      }
    } else if (lastKey == EQU && key != BSP) {
      clear();
    }

    switch (key) {
      case GRP:
        groupDigits = !groupDigits;
        if (hasError) return;
        break;
      case BIN:
      case OCT:
      case DEC:
      case HEX:
        prmScreenText = dec2rad(rad2dec(prmScreenText, numMode), key);
        numMode = key;
        clearPrmScreen = true;
        break;
      case MCX:
        memValue = "0";
        clearPrmScreen = true;
        break;
      case MRX:
        if (memValue != "0") prmScreenText = dec2rad(memValue, numMode);
        else {
          prmScreenText = "0";
          lastKey = DG0;
          return;
        }
        clearPrmScreen = true;
        break;
      case MSX:
        memValue = rad2dec(prmScreenText, numMode);
        clearPrmScreen = true;
        break;
      case MPX:
        memValue =
            new BigDecimal(rad2dec(prmScreenText, numMode))
                .add(new BigDecimal(memValue))
                .toPlainString();
        clearPrmScreen = true;
        break;
      case MMX:
        memValue =
            new BigDecimal(rad2dec(memValue, numMode))
                .subtract(new BigDecimal(prmScreenText))
                .toPlainString();
        clearPrmScreen = true;
        break;
      case BSP:
        if (clearPrmScreen) {
          beep();
          return;
        } else if (prmScreenText.length() > 1)
          prmScreenText = prmScreenText.substring(0, prmScreenText.length() - 1);
        else if (prmScreenText != "0") prmScreenText = "0";
        else if (expr[0].hasItems()) pop();
        else beep();
        break;
      case CEX:
        prmScreenText = "0";
        break;
      case CXX:
        this.initFields();
        break;
      case AVG:
        if (nset.size() > 0) {
          BigDecimal bd = BigDecimal.ZERO;
          for (int i = 0; i < nset.size(); i++) bd = bd.add((BigDecimal) nset.get(i));
          prmScreenText =
              dec2rad(
                  bd.divide(new BigDecimal(nset.size()), 32, BigDecimal.ROUND_HALF_EVEN)
                      .stripTrailingZeros()
                      .toPlainString(),
                  numMode);
        } else throwError("Invalid Operation: Empty set");
        clearPrmScreen = true;
        break;
      case SUM:
        BigDecimal bd = BigDecimal.ZERO;
        for (int i = 0; i < nset.size(); i++) bd = bd.add((BigDecimal) nset.get(i));
        prmScreenText = dec2rad(bd.toPlainString(), numMode);
        clearPrmScreen = true;
        if (prmScreenText == "0") {
          lastKey = DG0;
          return;
        }
        break;
      case LST:
        if (prmScreenText != "0") nset.add(new BigDecimal(rad2dec(prmScreenText, numMode)));
        else beep();
        clearPrmScreen = true;
        break;
      case CLS:
        nset.clear();
        break;
      case DG0:
        if (clearPrmScreen) {
          prmScreenText = "0";
          clearPrmScreen = false;
        } else if (prmScreenText != "0") prmScreenText += key;
        else if (lastKey == DG0) beep();
        break;
      case DG1:
      case DG2:
      case DG3:
      case DG4:
      case DG5:
      case DG6:
      case DG7:
      case DG8:
      case DG9:
      case DGA:
      case DGB:
      case DGC:
      case DGD:
      case DGE:
      case DGF:
        if (clearPrmScreen || prmScreenText == DG0) {
          prmScreenText = key;
          clearPrmScreen = false;
        } else prmScreenText += key;
        break;
      case DOT:
        if (clearPrmScreen || prmScreenText == DG0) {
          prmScreenText = DG0 + DOT;
          clearPrmScreen = false;
        } else if (prmScreenText.indexOf(DOT) < 0) prmScreenText += key;
        else beep();
        break;
      case BR1:
      case BR2:
      case SRT:
      case CRT:
      case REC:
      case SQR:
      case CUB:
      case FCT:
      case SIN:
      case COS:
      case TAN:
      case LOG:
      case NLG:
      case INT:
      case NEG:
      case POW:
      case MUL:
      case DIV:
      case MOD:
      case ADD:
      case SUB:
        if (prmScreenText != "0" || isDigit(lastKey)) push(prmScreenText);
        if (key.equals(BR1)) push(Expression.BRO);
        else if (key.equals(BR2)) push(Expression.BRC);
        else if (key.equals(SRT)) push(Expression.SRT);
        else if (key.equals(CRT)) push(Expression.CRT);
        else if (key.equals(REC)) push(Expression.REC);
        else if (key.equals(SQR)) push(Expression.SQR);
        else if (key.equals(CUB)) push(Expression.CUB);
        else if (key.equals(FCT)) push(Expression.FCT);
        else if (key.equals(SIN)) push(Expression.SIN);
        else if (key.equals(COS)) push(Expression.COS);
        else if (key.equals(TAN)) push(Expression.TAN);
        else if (key.equals(LOG)) push(Expression.LOG);
        else if (key.equals(NLG)) push(Expression.NLG);
        else if (key.equals(INT)) push(Expression.INT);
        else if (key.equals(NEG)) push(Expression.NEG);
        else if (key.equals(POW)) push(Expression.POW);
        else if (key.equals(MUL)) push(Expression.MUL);
        else if (key.equals(DIV)) push(Expression.DIV);
        else if (key.equals(MOD)) push(Expression.MOD);
        else if (key.equals(ADD)) push(Expression.ADD);
        else if (key.equals(SUB)) push(Expression.SUB);
        prmScreenText = "0";
        clearPrmScreen = false;
        break;
      case EQU:
        if (prmScreenText != "0" || isDigit(lastKey) || !expr[0].hasItems()) push(prmScreenText);
        try {
          prmScreenText = stripZeros(expr[0].eval().toPlainString());
          if (numMode == BIN) prmScreenText = dec2rad(prmScreenText, BIN);
          else if (numMode == OCT) prmScreenText = dec2rad(prmScreenText, OCT);
          else if (numMode == HEX) prmScreenText = dec2rad(prmScreenText, HEX);
          clearPrmScreen = true;
        } catch (SyntaxErrorException e) {
          throwError("Syntax Error: " + e.getMessage());
        } catch (InvalidInputException e) {
          throwError("Input Error: " + e.getMessage());
        } catch (UnknownOperatorException e) {
          throwError("Unknown Operator: " + e.getMessage());
        } catch (ArithmeticException e) {
          throwError("Math Error: " + e.getMessage());
        } catch (Exception e) {
          throwError("Application Error: " + e.getMessage());
        }
        break;
    }

    lastKey = key;
  }