miercuri, 6 iunie 2012

Calculator

package calculator;

public interface CalcModel
{
    void processCommand(Commands cmd);
    String getDisplayText();
    String getLabelText();
}

package calculator;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class Calculator extends JFrame implements ActionListener
{
    private JTextField txtDisplay;
    private JTextField label;
    private CalcModel model;

    public Calculator()
    {
        super("Calculator");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents();
        pack();
        setResizable(false);
        setLocationRelativeTo(null);
        setVisible(true);
        model = new ExtendDefaultCalcModel();
    }

    private void initComponents()
    {
        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        txtDisplay = new JTextField();
        txtDisplay.setEditable(false);
        txtDisplay.setBackground(Color.WHITE);
        txtDisplay.setHorizontalAlignment(JTextField.RIGHT);
        add(txtDisplay, BorderLayout.NORTH);
        //
        Commands[] cmdButtons = Commands.values();
        // group 1
        JPanel pnlGroup1 = new JPanel(new GridLayout(4, 1, 5, 5));
        for (int btnIndex = 0; btnIndex < 3; btnIndex++)
        {
            CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
            btn.addActionListener(this);
            pnlGroup1.add(btn);
        }
        add(pnlGroup1, BorderLayout.WEST);
        // group2
        JPanel pnlGroup2 = new JPanel(new GridLayout(4, 5, 5, 5));
        for (int btnIndex = 3; btnIndex < cmdButtons.length - 4; btnIndex++)
        {
            CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
            btn.addActionListener(this);
            pnlGroup2.add(btn);
        }
        add(pnlGroup2, BorderLayout.EAST);
        // group 3
        JPanel pnlGroup3 = new JPanel(new GridLayout(1, 5, 5, 5));
        label = new JTextField();
        label.setEditable(false);
        label.setBackground(Color.lightGray);
        label.setHorizontalAlignment(JTextField.RIGHT);
        pnlGroup3.add(label);
        for (int btnIndex = cmdButtons.length - 4; btnIndex < cmdButtons.length; btnIndex++)
        {
            CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
            btn.addActionListener(this);
            pnlGroup3.add(btn);
        }
        add(pnlGroup3, BorderLayout.SOUTH);
    }

    public void actionPerformed(ActionEvent arg0)
    {
        CommandButton btn = (CommandButton) arg0.getSource();
        model.processCommand(btn.getCommand());
        txtDisplay.setText(model.getDisplayText());
        label.setText(model.getLabelText());
    }
}

package calculator;

import javax.swing.JButton;

@SuppressWarnings("serial")
public class CommandButton extends JButton
{
    private Commands cmd;

    public Commands getCommand()
    {
        return cmd;
    }

    public CommandButton(Commands cmd)
    {
        super(cmd.displayText());
        this.cmd = cmd;
    }
}

package calculator;

public enum Commands
{
    BACKSPACE("Backspace"),
    CE("CE"),
    C("C"),
    NR_7("7", 7),
    NR_8("8", 8),
    NR_9("9", 9),
    DIV("/"),
    SQRT("sqrt"),
    NR_4("4", 4),
    NR_5("5", 5),
    NR_6("6", 6),
    MUL("*"),
    MOD("%"),
    NR_1("1", 1),
    NR_2("2", 2),
    NR_3("3",3),
    MINUS("-"),
    DIV_BY("1/x"),
    NR_0("0", 0),
    PLUS_MINUS("+/-"),
    PERIOD("."),
    PLUS("+"),
    EQUALS("="),
    MS("MS"),
    M_PLUS("M+"),
    MR("MR"),
    MC("MC");
   
    private int number;
    private String displayText;

    int number()
    {
        return number;
    }

    String displayText()
    {
        return displayText;
    }

    Commands(String displayText)
    {
        this(displayText, -1);
    }

    Commands(String displayText, int number)
    {
        this.displayText = displayText;
        this.number = number;
    }

    boolean usable()
    {
        switch (this)
        {
        case DIV:
        case PLUS:
        case MINUS:
        case MUL:
        case MOD:
            return true;
        default:

            return false;
        }
    }
}

package calculator;

public class DefaultCalcModel implements CalcModel
{
    private double currentRezult;
    protected double currentValue;
    private Commands operatie;
    private Commands lastButton;
    private int virgula;

    public DefaultCalcModel()
    {
        currentRezult = 0;
        currentValue = 0;
        operatie = null;
        lastButton = null;
        virgula = 1;
    }

    public void processCommand(Commands cmd)
    {
        if (cmd.number() != -1)
        {
            addCifre(cmd.number());
            lastButton = cmd;
        }
        else
        {
            switch (cmd)
            {
            case BACKSPACE:
                String transform, end = "", start = "";
                transform = Double.toString(currentValue);
                int ok = 1;
                if (((currentValue - (int) currentValue) == 0) && (Math.abs(currentValue) < 10))
                    currentValue = 0;
                else
                    for (int i = transform.length() - 1; (i > -1) && (ok == 1); i--)
                        if ((transform.charAt(i) != '.')
                                && (transform.charAt(i) != '0')) {
                            ok = 0;
                            if (i > 0)
                                start = transform.substring(0, i);
                            if (i < transform.length() - 1)
                                end = transform.substring(i + 1);
                            start.concat(end);
                            currentValue = Double.valueOf(start);

                        }
                lastButton = null;
                break;
            case CE:
                lastButton = null;
                currentValue = 0;
                virgula = 1;
                break;
            case C:
                operatie = null;
                lastButton = null;
                currentValue = 0;
                currentRezult = 0;
                virgula = 1;
                break;
            case DIV:
            case MUL:
            case PLUS:
            case MINUS:
                if (operatie != null)
                {
                    if (operatie.usable())
                        this.execOperatie();
                }
                operatie = cmd;
                currentRezult = currentValue;
                lastButton = cmd;
                break;
            case MOD:
                currentValue /= 100;
                if (operatie != null)
                {
                    if (operatie.usable())
                        this.execOperatie();
                }
                operatie = null;
                currentRezult = currentValue;
                lastButton = cmd;
                break;
            case EQUALS:
                if (operatie != null)
                    if (operatie.usable())
                    {
                        this.execOperatie();
                        operatie = cmd;
                    }
                break;
            case PLUS_MINUS:
                currentValue *= -1;
                break;
            case SQRT:
                lastButton = cmd;
                currentValue = Math.sqrt(currentValue);
                break;
            case DIV_BY:
                lastButton = cmd;
                currentValue = 1 / currentValue;
                break;
            case PERIOD:
                if (virgula == 1)
                    virgula = 10;
                lastButton = cmd;
                break;
            }
        }
    }

    public String getDisplayText()
    {
        return String.valueOf(currentValue);
    }

    private void addCifre(int cifre)
    {
        if (lastButton != null)
            switch (lastButton)
            {
            case NR_0:
            case NR_1:
            case NR_2:
            case NR_3:
            case NR_4:
            case NR_5:
            case NR_6:
            case NR_7:
            case NR_8:
            case NR_9:
            case PLUS_MINUS:
            case PERIOD:
                break;
            default:
                virgula = 1;
                currentValue = 0;
            }
        if (currentValue >= 0)
            currentValue = (currentValue * (virgula == 1 ? 10 : virgula) + cifre) / virgula;
        else
            currentValue = (-1 * (Math.abs(currentValue)
                    * (virgula == 1 ? 10 : virgula) + cifre)) / virgula;
        if (virgula != 1)
            virgula *= 10;
    }

    private void execOperatie()
    {
        switch (operatie)
        {
        case DIV:
            currentValue = currentRezult / currentValue;
            break;
        case MUL:
            currentValue = currentRezult * currentValue;
            break;
        case MOD:
            currentValue = currentRezult % currentValue;
            break;
        case PLUS:
            currentValue = currentRezult + currentValue;
            break;
        case MINUS:
            currentValue = currentRezult - currentValue;
            break;
        }
    }

    public String getLabelText()
   {
        return "";
    }

    public void setCurrentValue(Double value)
    {
        currentValue = value;
    }
}

package calculator;

public class ExtendDefaultCalcModel extends DefaultCalcModel
{
    private Double memmored;

    public ExtendDefaultCalcModel()
    {
        super();
        memmored = null;
    }

    public void processCommand(Commands cmd)
    {
        boolean mem_button;
        switch (cmd)
        {
        case MC:
        case MS:
        case M_PLUS:
        case MR:
            mem_button = true;
            break;
        default:
            mem_button = false;
        }
        if (!mem_button)
            super.processCommand(cmd);
        else
            switch (cmd)
            {
            case MC:
                memmored = null;
                break;
            case MS:
                memmored = super.currentValue;
                this.getLabelText();
                break;
            case M_PLUS:
                if (memmored == null)
                    memmored = new Double(super.currentValue);
                else
                    memmored += super.currentValue;
                this.getLabelText();
                break;
            case MR:
                super.setCurrentValue(memmored);
                this.getLabelText();
            }
    }

    public String getLabelText()
    {
        if (memmored != null)
            return String.valueOf(memmored);
        else
            return "";
    }
}

package calculator;

public class Main
{
    public static void main(String[] args)
    {
        new Calculator();
    }
}

Niciun comentariu:

Trimiteți un comentariu