/*
   Chapter 6:  Programming Assignment 7
   Programmer: Brad Shedd
   Date:    March 15, 2004
   Filename:   Calculator2.java
   Purpose: This program creates a calculator with a menu.
*/

import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.text.DecimalFormat;
import javax.swing.JOptionPane;

public class Calculator2 extends Frame implements ActionListener
{
  
private Button keys[];
  
private Panel keypad;
  
private TextField lcd;
  
private double op1;
  
private boolean first;
  
private boolean foundKey;
  
private boolean clearText;
  
private int lastOp;
  
private DecimalFormat calcPattern;

  
public Calculator2()
   {
     
//create an instance of the menu
      MenuBar mnuBar = new MenuBar();
      setMenuBar(mnuBar);

     
//construct and populate the File menu
      Menu mnuFile = new Menu ("File", true);
      mnuBar.add(mnuFile);
        MenuItem mnuFileExit =
new MenuItem("Exit");
         mnuFile.add(mnuFileExit);

     
//construct and populate the Edit menu
      Menu mnuEdit = new Menu ("Edit", true);
      mnuBar.add(mnuEdit);
         MenuItem mnuEditClear =
new MenuItem("Clear");
         mnuEdit.add(mnuEditClear);
         mnuEdit.insertSeparator(1);
         MenuItem mnuEditCopy=
new MenuItem("Copy");
        mnuEdit.add(mnuEditCopy);
         MenuItem mnuEditPaste=
new MenuItem("Paste");
         mnuEdit.add(mnuEditPaste);

     
//construct and populate the About menu
      Menu mnuAbout = new Menu ("About", true);
      mnuBar.add(mnuAbout);
         MenuItem mnuAboutCalculator =
new MenuItem("About Calculator");
         mnuAbout.add(mnuAboutCalculator);

     
//add the ActionListener to each menu item
      mnuFileExit.addActionListener(this);
      mnuEditClear.addActionListener(
this);
      mnuEditCopy.addActionListener(
this);
      mnuEditPaste.addActionListener(
this);
      mnuAboutCalculator.addActionListener(
this);

     
//assign an Action Command to each menu item
      mnuFileExit.setActionCommand("Exit");
      mnuEditClear.setActionCommand(
"Clear");
      mnuEditCopy.setActionCommand(
"Copy");
      mnuEditPaste.setActionCommand(
"Paste");
      mnuAboutCalculator.setActionCommand(
"About");

     
//construct components and initialize beginning values
      lcd = new TextField(20);
         lcd.setEditable(
false);
      keypad =
new Panel();
      keys =
new Button [20];
      first =
true;
      op1 = 0.0;
      clearText =
true;
      lastOp = 0;
      calcPattern =
new DecimalFormat("########.########");

     
//construct and assign captions to the Buttons
      for(int i=0; i<=9; i++)
         keys[i] =
new Button(String.valueOf(i));

      keys[10] =
new Button("/");
      keys[11] =
new Button("*");
      keys[12] =
new Button("-");
      keys[13] =
new Button("+");
      keys[14] =
new Button("=");
      keys[15] =
new Button(".");
      keys[16] =
new Button("M+");
      keys[17] =
new Button("pasteM");
      keys[18] =
new Button("Backspace");
      keys[19] =
new Button("Clear");

     
//set Frame and keypad layout to grid layout
      setLayout(new BorderLayout());
      keypad.setLayout(
new GridLayout(5,4,10,10));

     
for (int i=7; i<=10; i++) // 7, 8, 9, divide
         keypad.add(keys[i]);

     
for (int i=4; i<=6; i++) // 4, 5, 6
         keypad.add(keys[i]);

      keypad.add(keys[11]);
// multiply

      for (int i=1; i<=3; i++) // 1, 2, 3
         keypad.add(keys[i]);

      keypad.add(keys[12]);
// subtract

      keypad.add(keys[0]); // 0 key

      for (int i=15; i>=13; i--) // decimal point, =, add (+) keys
         keypad.add(keys[i]);

     
for (int i=19; i>=16; i--) //
         keypad.add(keys[i]);


     
for (int i=0; i<keys.length; i++)
         keys[i].addActionListener(
this);

      add(lcd, BorderLayout.NORTH);
      add(keypad, BorderLayout.CENTER);

      addWindowListener(
        
new WindowAdapter()
            {
           
public void windowClosing(WindowEvent e)
               {
                 System.exit(0);
               }
            }
      );
   }
// end of constructor method

   public void actionPerformed(ActionEvent e)
   {
     
// test for menu item clicks
      String arg = e.getActionCommand();
     
if (arg == "Exit")
         System.exit(0);

     
if (arg == "Clear")
     {
         clearText =
true;
         first =
true;
         op1 = 0.0;
        lcd.setText(
"");
         lcd.requestFocus();
      }

     
if (arg == "Copy")
      {
         Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
         StringSelection contents =
new StringSelection(lcd.getText());
         cb.setContents(contents,
null);
      }

     
if (arg == "Paste")
      {
         Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
         Transferable content = cb.getContents(
this);
        
try
         {
            String s = (String)content.getTransferData(DataFlavor.stringFlavor);
            lcd.setText(calcPattern.format(Double.parseDouble(s)));
         }
        
catch (Throwable exc)
         {
            lcd.setText(
"");
         }

      }

     
if (arg == "About")
      {
         String message =
        
"Calculator ver.1.0\nOpenExhibit Software\nCopyright 2004\nAll rights reserved";
         JOptionPane.showMessageDialog(
null,message,"About Calculator", JOptionPane.
         INFORMATION_MESSAGE);
      }

     
// test for button clicks
      foundKey = false;

     
// search for the clicked key
      for (int i=0; i<keys.length && !foundKey; i++)
      {
        
if(e.getSource() == keys[i])
         {
           foundKey=
true;
           
switch(i)
            {
              
// number and decimal point buttons
               case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
              
case 9: case 15:
              
if(clearText)
               {
                  lcd.setText(
"");
                  clearText =
false; // !clearText;
               }
               lcd.setText(lcd.getText() + keys[i].getLabel());
              
break;

              
//operator buttons
               case 10: case 11: case 12: case 13: case 14:
                  clearText =
true;

                 
if (first) // first operand
                  {
                    
if(lcd.getText().length()==0) op1 = 0.0;
                    
else op1 = Double.parseDouble(lcd.getText());

                     first =
false;
                     clearText =
true;
                     lastOp = i;
// save last operator
                  }
                 
else // second operand
                  {
                    
switch(lastOp)
                     {
                        
case 10: // divide button
                           op1 /= Double.parseDouble(lcd.getText());
                          
break;
                       
case 11: // multiply button
                           op1 *= Double.parseDouble(lcd.getText());
                          
break;
                       
case 12: // minus button
                           op1 -= Double.parseDouble(lcd.getText());
                          
break;
                       
case 13: // plus button
                           op1 += Double.parseDouble(lcd.getText());
                          
break;
                        }
// end of switch(lastOp)
                        lcd.setText(calcPattern.format(op1));
                        clearText =
true;
                       
if(i==14) first = true; // equal button
                        else lastOp = i; // save last operator
                     } // end else
                     break;

              
case 16:
               {
                  Clipboard cd = Toolkit.getDefaultToolkit().
                  getSystemClipboard();
                  StringSelection contents =
new StringSelection(lcd.getText());
                  cd.setContents(contents,
null);
               }
                 
break;
             
case 17:
               {
                  Clipboard cd = Toolkit.getDefaultToolkit().
                  getSystemClipboard();
                  Transferable content = cd.getContents(
this);
                 
try
                  {
                     String s = (String)content.getTransferData(DataFlavor.stringFlavor);
                     lcd.setText (calcPattern.format(Double.parseDouble (s)));
                  }
                 
catch (Throwable exc)
                  {
                     lcd.setText(
"");
                  }
               }
                 
break;
              
case 18:
                  lcd.setText(lcd.getText().substring(0, lcd.getText(). length()-1));
                 
break;
              
case 19:
                  lcd.setText(
"");
                  
break;
                  }
// end of switch(i)
               } // end of if
            } // end of for
         } // end of actionPerformed

         public static void main(String args[])
         {
           
// set frame properties
            Calculator2 f = new Calculator2();
            f.setTitle(
"Extra Buttons Calculator");
            f.setBounds(200,200,300,300);
            f.setVisible(
true);

           
//set image properties and add to frame
            Image icon = Toolkit.getDefaultToolkit().getImage("calcImage.gif");
            f.setIconImage(icon);

         }
// end of main
      } // end of class

Homepage