Professional Documents
Culture Documents
package lec20.v10;
return op_type;
}
public boolean isOperationEvent() {
return true;
}
}
this.type = type;
this.operand = operand;
}
public OpType getType() {
return type;
}
public double getOperand() {
return operand;
}
public String toString() {
String str = "";
switch (type) {
case ADD:
str = "+ "; break;
case MULT:
str = "* "; break;
case DIV:
str = "/ "; break;
case SUB:
str = "- "; break;
case SET:
str = "= "; break;
}
str += operand;
return str;
}
}
public CalculatorView() {
setLayout(new BorderLayout());
tape = new JTextArea(10,20);
tape.setEditable(false);
add(new JScrollPane(tape), BorderLayout.CENTER);
JPanel subpanel = new JPanel();
subpanel.setLayout(new BorderLayout());
display = new JLabel("0");
display.setHorizontalAlignment(SwingConstants.RIGHT);
subpanel.add(display, BorderLayout.NORTH);
button_panel.add(new JButton("7"));
button_panel.add(new JButton("8"));
button_panel.add(new JButton("9"));
button_panel.add(new JButton("+"));
button_panel.add(new JButton("4"));
button_panel.add(new JButton("5"));
button_panel.add(new JButton("6"));
button_panel.add(new JButton("-"));
button_panel.add(new JButton("1"));
button_panel.add(new JButton("2"));
button_panel.add(new JButton("3"));
button_panel.add(new JButton("*"));
subpanel.add(button_panel, BorderLayout.SOUTH);
add(subpanel, BorderLayout.SOUTH);
for(Component c: button_panel.getComponents()) {
JButton b = (JButton) c;
b.addActionListener(this);
}
listeners = new ArrayList<CalculatorViewListener>();
this.setFocusable(true);
this.grabFocus();
this.addKeyListener(this);
}
public void setDisplay(String s) {
display.setText(s);
}
public void appendToDisplay(String s) {
display.setText(display.getText()+s);
}
public String getDisplay() {
return display.getText();
}
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
case '-':
fireEvent(new OperationEvent(Operation.OpType.SUB));
break;
case '/':
fireEvent(new OperationEvent(Operation.OpType.DIV));
break;
case '*':
fireEvent(new OperationEvent(Operation.OpType.MULT));
break;
case '=':
fireEvent(new OperationEvent(Operation.OpType.SET));
break;
case 'i':
fireEvent(new InversionEvent());
break;
case '.':
fireEvent(new PointEvent());
break;
}
}
public void addCalculatorViewListener(CalculatorViewListener l) {
listeners.add(l);
}
public void removeCalculatorViewListener(CalculatorViewListener l) {
listeners.remove(l);
}
public void fireEvent(CalculatorViewEvent e) {
for (CalculatorViewListener l : listeners) {
l.handleCalculatorViewEvent(e);
}
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
dispatchEventByChar(e.getKeyChar());
}
}
public CalculatorModel() {
history = new ArrayList<Operation>();
value = 0.0;
notifyObservers(op);
}
public void reset() {
history = new ArrayList<Operation>();
value = 0.0;
}
}
CalculatorModel model;
CalculatorView view;
boolean start_of_number;
boolean point_pressed;
Operation.OpType in_progress;
view.addCalculatorViewListener(this);
start_of_number = true;
point_pressed = false;
view.setDisplay("0");
in_progress = Operation.OpType.SET;
model.addObserver(this);
}
@Override
public void handleCalculatorViewEvent(CalculatorViewEvent e) {
if (e.isDigitEvent()) {
DigitEvent digit = (DigitEvent) e;
if (start_of_number) {
view.setDisplay(digit.getString());
start_of_number = false;
} else {
if (view.getDisplay().equals("0")) {
if (digit.getValue() != 0) {
view.setDisplay(digit.getString());
}
} else {
view.appendToDisplay(digit.getString());
}
}
} else if (e.isOperationEvent()) {
OperationEvent op_event = (OperationEvent) e;
if (!start_of_number) {
double disp_value = Double.parseDouble(view.getDisplay());
model.eval(new Operation(in_progress, disp_value));
}
start_of_number = true;
point_pressed = false;
in_progress = op_event.getOpType();
if (in_progress == Operation.OpType.SET) {
model.eval(new Operation(in_progress, model.getValue()));
}
} else if (e.isInversionEvent()) {
if (Double.parseDouble(view.getDisplay()) != 0) {
String in_display = view.getDisplay();
if (in_display.charAt(0) != '-') {
view.setDisplay("-" + in_display);
} else {
view.setDisplay(in_display.substring(1));
}
}
} else if (e.isPointEvent()) {
if (start_of_number) {
view.setDisplay("0.");
start_of_number = false;
} else if (!point_pressed) {
view.appendToDisplay(".");
}
point_pressed = true;
}
}
@Override
public void update(Observable o, Object arg) {
Operation op = (Operation) arg;
view.appendToTape(op.toString() + "\n");
view.setDisplay(Double.toString(model.getValue()));
start_of_number = true;
point_pressed = false;
}
public class Main {
main_frame.setContentPane(view);
main_frame.pack();
main_frame.setVisible(true);
}
}