/** * Calculator * Copyright (c) http://www.javamaniac.com. All Rights Reserved. * Commercial use is subject to license terms. * FREE for non-commercial use. * * @author gertsho@yahoo.com */ package javamaniac; import java.awt.*; class Calculator extends MainPanel { private double buffer; private double firstN; private int operation; private boolean firstReady; private boolean hasDot; private int p; private int counter; public Calculator() { operation = -1; firstReady = false; hasDot = false; } private void addToStringBuffer(String s) { if(firstReady) { buffer = 0.0D; showToDisplay(); firstReady = false; hasDot = false; counter = 0; } if(hasDot) { if(display.getText().indexOf('.') != -1) buffer = Double.valueOf(display.getText() + s).doubleValue(); else buffer = Double.valueOf(display.getText() + "." + s).doubleValue(); if(s.equals("0")) counter++; else counter = 0; } else { buffer = buffer * 10D + (double)Integer.parseInt(s); } showToDisplay(); } private void showToDisplay() { if((double)Math.round(buffer) == buffer && !hasDot) { display.setText("" + (int)buffer); return; } String s = "" + buffer; if(s.endsWith(".0")) s = s.substring(0, s.lastIndexOf(".0") + 1); else if(s.endsWith("0")) s = s.substring(0, s.lastIndexOf("0")); String s1 = "" + buffer; if(s1.indexOf(".") == -1) { display.setText("" + buffer + "." + addZero()); return; } else { display.setText("" + s + addZero()); return; } } private String addZero() { String s = ""; for(int i = 0; i < counter; i++) s += "0"; return s; } private void calculate() { firstReady = true; switch(operation) { case 0: // '\0' buffer = firstN + buffer; break; case 1: // '\001' buffer = firstN - buffer; break; case 2: // '\002' buffer = firstN * buffer; break; case 3: // '\003' buffer = firstN / buffer; break; case 4: // '\004' buffer = firstN / buffer; break; } showToDisplay(); } public boolean handleEvent(Event event) { switch(event.id) { default: break; case 1001: // Event.ACTION_EVENT if(!(event.target instanceof Button)) break; Button button = (Button)event.target; String s = button.getActionCommand(); if(s.equals("number")) addToStringBuffer("" + button.getLabel()); else if(s.equals("+/-")) { buffer = -buffer; showToDisplay(); } else if(s.equals(".")) hasDot = true; else if(s.equals("=")) calculate(); else if(s.equals("%")) calculate(); else if(s.equals("+")) { operation = 0; firstN = buffer; firstReady = true; } else if(s.equals("-")) { operation = 1; firstN = buffer; firstReady = true; } else { if(s.equals("*")) { operation = 2; firstN = buffer; firstReady = true; break; } if(s.equals("/")) { operation = 3; firstN = buffer; firstReady = true; } else if(s.equals("C")) { buffer = 0.0D; firstN = 0.0D; counter = 0; hasDot = false; showToDisplay(); } else { if(!s.equals("CE")) break; buffer = 0.0D; counter = 0; hasDot = false; showToDisplay(); } } case 401: // Event.KEY_PRESS String s1 = "" + (char)event.key; try { Integer.parseInt(s1); addToStringBuffer(s1); return true; } catch(Exception _ex) { } if(event.key == 46 || event.key == 44) { hasDot = true; counter = 0; } else if(event.key == 43) { operation = 0; firstN = buffer; firstReady = true; } else if(event.key == 45) { operation = 1; firstN = buffer; firstReady = true; } else if(event.key == 42) { operation = 2; firstN = buffer; firstReady = true; } else if(event.key == 47) { operation = 3; firstN = buffer; firstReady = true; } else if(event.key == 10) calculate(); else if(event.key == 8 || event.key == 127) { buffer = 0.0D; firstN = 0.0D; counter = 0; hasDot = false; showToDisplay(); } break; } return super.handleEvent(event); } }