Author: rwhitcomb Date: Tue Jun 30 16:54:05 2015 New Revision: 1688484 URL: http://svn.apache.org/r1688484 Log: PIVOT-972: Fix some more bugs with the calculator tutorial: * Implement the difference between "Clear" and "All Clear". * Highlight the current operator button (by changing border color). * When two operators are pressed in a row, just change operators, don't do the prior operation. * Fix backspace not to do it twice, and to work properly when clearing the last digit.
Modified: pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/Calculator.java pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/calculator_styles.json Modified: pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/Calculator.java URL: http://svn.apache.org/viewvc/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/Calculator.java?rev=1688484&r1=1688483&r2=1688484&view=diff ============================================================================== --- pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/Calculator.java (original) +++ pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/Calculator.java Tue Jun 30 16:54:05 2015 @@ -56,9 +56,13 @@ public class Calculator private static StringBuilder resultBuffer = new StringBuilder("0"); private static BigDecimal result = BigDecimal.ZERO; private static boolean seenDecimalPoint = false; + private static boolean clearingAll = false; private static BigDecimal accumulator = BigDecimal.ZERO; private static Operator currentOperator = null; + private static PushButton currentOperatorButton = null; + private static boolean justSeenOperator = false; + /** Instance variable so non-static components can be accessed from static methods. */ private static Calculator instance; @Override @@ -82,7 +86,6 @@ public class Calculator case '%': ACTION.PERCENT.perform(comp); return true; - case '\u0008': case '\u007F': ACTION.BACKSPACE.perform(comp); return true; @@ -92,6 +95,13 @@ public class Calculator } }); + // Hook up the operators with their buttons + Operator.ADD.setButton(plusButton); + Operator.SUBTRACT.setButton(minusButton); + Operator.MULTIPLY.setButton(multiplyButton); + Operator.DIVIDE.setButton(divideButton); + Operator.EQUALS.setButton(equalsButton); + mainWindow.open(display); mainWindow.requestFocus(); } @@ -105,7 +115,22 @@ public class Calculator instance.resultText.setText(resultBuffer.toString()); } + private static void setClearAll(boolean all) { + instance.clearButton.setButtonData(all ? "AC" : "C"); + clearingAll = all; + } + + private static void setOperatorButton(boolean on) { + if (currentOperatorButton != null) { + currentOperatorButton.setStyleName(on ? "buttonBorderHighlight" : "buttonBorderNormal"); + } + } + private static void digit(char digit) { + setClearAll(false); + setOperatorButton(false); + justSeenOperator = false; + switch (digit) { case '0': case '1': @@ -138,7 +163,17 @@ public class Calculator SUBTRACT, MULTIPLY, DIVIDE, - EQUALS + EQUALS; + + private PushButton button; + + public void setButton(PushButton button) { + this.button = button; + } + + public PushButton getButton() { + return this.button; + } } private static void changeOperator(Operator newOperator) { @@ -147,9 +182,15 @@ public class Calculator accumulator = result; resultBuffer = new StringBuilder(); seenDecimalPoint = false; - // TODO: highlight (somehow) the selected operator - } - else { + currentOperatorButton = currentOperator.getButton(); + setOperatorButton(true); + justSeenOperator = true; + } else if (justSeenOperator) { + setOperatorButton(false); + currentOperator = newOperator; + currentOperatorButton = currentOperator.getButton(); + setOperatorButton(true); + } else { // Perform the currentOperator function on accumulator x result switch (currentOperator) { case ADD: @@ -166,11 +207,14 @@ public class Calculator break; } if (newOperator == Operator.EQUALS) { + setOperatorButton(false); currentOperator = null; + currentOperatorButton = null; + justSeenOperator = false; accumulator = BigDecimal.ZERO; - } - else { + } else { currentOperator = newOperator; + currentOperatorButton = currentOperator.getButton(); accumulator = result; } seenDecimalPoint = false; @@ -311,7 +355,11 @@ public class Calculator if (ch == '.') { seenDecimalPoint = false; } - resultBuffer.deleteCharAt(resultBuffer.length() - 1); + if (resultBuffer.length() == 1) { + resultBuffer.setCharAt(0, '0'); + } else { + resultBuffer.deleteCharAt(resultBuffer.length() - 1); + } instance.resultText.setText(resultBuffer.toString()); } } @@ -321,8 +369,15 @@ public class Calculator public void perform(Component source) { result = BigDecimal.ZERO; seenDecimalPoint = false; - accumulator = BigDecimal.ZERO; - currentOperator = null; + justSeenOperator = false; + if (clearingAll) { + accumulator = BigDecimal.ZERO; + setOperatorButton(false); + currentOperator = null; + currentOperatorButton = null; + } else { + setClearAll(true); + } updateResult(); } }, Modified: pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/calculator_styles.json URL: http://svn.apache.org/viewvc/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/calculator_styles.json?rev=1688484&r1=1688483&r2=1688484&view=diff ============================================================================== --- pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/calculator_styles.json (original) +++ pivot/trunk/tutorials/src/org/apache/pivot/tutorials/calculator/calculator_styles.json Tue Jun 30 16:54:05 2015 @@ -42,5 +42,13 @@ padding : { top : 8, bottom : 8 }, }, + buttonBorderHighlight : { + borderColor : 'black' + }, + + buttonBorderNormal : { + borderColor : 7 + } + }