Calc.java
/* 
 * Copyright 2008 IT Mill Ltd.
 
 * 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.itmill.toolkit.demo;

import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.GridLayout;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.Window;

/**
 <p>
 * An example application implementing a simple web-based calculator using IT
 * Mill Toolkit. The application opens up a window and places the needed UI
 * components (display label, buttons etc.) on it, and registers a button click
 * listener for them.
 </p>
 
 <p>
 * When any of the buttons are pressed the application finds out which button
 * was pressed, figures what that button does, and updates the user interface
 * accordingly.
 </p>
 
 @see com.itmill.toolkit.Application
 @see com.itmill.toolkit.ui.Button.ClickListener
 */
public class Calc extends com.itmill.toolkit.Application implements
        Button.ClickListener {

    /** The label used as the display */
    private Label display = null;

    /** Last completed result */
    private double stored = 0.0;

    /** The number being currently edited. */
    private double current = 0.0;

    /** Last activated operation. */
    private String operation = "C";

    /** Button captions. */
    private static String[] captions = // Captions for the buttons
    "7""8""9""/""4""5""6""*""1""2""3""-""0""=",
            "C""+" };

    /**
     <p>
     * Initializes the application. This is the only method an application is
     * required to implement. It's called by the framework and it should perform
     * whatever initialization tasks the application needs to perform.
     </p>
     
     <p>
     * In this case we create the main window, the display, the grid to hold the
     * buttons, and the buttons themselves.
     </p>
     */
    public void init() {

        // Create a new layout for the components used by the calculator
        final GridLayout layout = new GridLayout(45);

        // Styling: fix grids size, cells will become equally sized
        layout.setWidth("15em");
        layout.setHeight("18em");
        // Styling: leave margin around layout
        layout.setMargin(true);

        // Create a new label component for displaying the result
        display = new Label(Double.toString(current));
        display.setCaption("Result");

        // Place the label to the top of the previously created grid.
        layout.addComponent(display, 0030);

        // Create the buttons and place them in the grid
        for (int i = 0; i < captions.length; i++) {
            final Button button = new Button(captions[i]this);
            button.setSizeFull()// use all size given by grid
            layout.addComponent(button);
        }

        // Create the main window with a caption and add it to the application.
        addWindow(new Window("Calculator", layout));

    }

    /**
     <p>
     * The button listener method called any time a button is pressed. This
     * method catches all button presses, figures out what the user wanted the
     * application to do, and updates the UI accordingly.
     </p>
     
     <p>
     * The button click event passed to this method contains information about
     * which button was pressed. If it was a number, the currently edited number
     * is updated. If it was something else, the requested operation is
     * performed. In either case the display label is updated to include the
     * outcome of the button click.
     </p>
     
     @param event
     *                the button click event specifying which button was pressed
     */
    public void buttonClick(Button.ClickEvent event) {

        try {
            // Number button pressed
            current = current * 10
                    + Double.parseDouble(event.getButton().getCaption());
            display.setValue(Double.toString(current));
        catch (final java.lang.NumberFormatException e) {

            // Operation button pressed
            if (operation.equals("+")) {
                stored += current;
            }
            if (operation.equals("-")) {
                stored -= current;
            }
            if (operation.equals("*")) {
                stored *= current;
            }
            if (operation.equals("/")) {
                stored /= current;
            }
            if (operation.equals("C")) {
                stored = current;
            }
            if (event.getButton().getCaption().equals("C")) {
                stored = 0.0;
            }
            operation = event.getButton().getCaption();
            current = 0.0;
            display.setValue(Double.toString(stored));
        }
    }
}