Command.java 
/**  * @author aassd  *  * To change this generated comment edit the template variable "typecomment":  * Window>Preferences>Java>Templates.  * To enable and disable the creation of type comments go to  * Window>Preferences>Java>Code Generation.  */ 
public interface Command {  public final static int LINE = 2;  public final static int CIRCLE = 4;  public final static int RECTANGLE = 8; } 
  
ICircle.java 
import java.awt.*; 
/**  * @author aassd  *  * To change this generated comment edit the template variable "typecomment":  * Window>Preferences>Java>Templates.  * To enable and disable the creation of type comments go to  * Window>Preferences>Java>Code Generation.  */ public class ICircle implements Shape {  private Color color;  private int x;  private int y;  private int width;  private int height; 
 public ICircle(int x, int y, int width, int height, Color color) {   this.x = x;   this.y = y;   this.width = width;   this.height = height;   this.color = color;  }  public void draw(Graphics g) {   g.setColor(color);   g.drawArc(x, y, width, height, 0, 360);  } 
}
 
  
ILine.java 
import java.awt.*; 
/**  * @author aassd  *  * To change this generated comment edit the template variable "typecomment":  * Window>Preferences>Java>Templates.  * To enable and disable the creation of type comments go to  * Window>Preferences>Java>Code Generation.  */ public class ILine implements Shape {  private int x1;  private int y1;  private int x2;  private int y2;  private Color color; 
 public ILine(int x1, int y1, int x2, int y2, Color color) {   this.x1 = x1;   this.y1 = y1;   this.x2 = x2;   this.y2 = y2;   this.color = color;  } 
 public void draw(Graphics g) {   g.setColor(color);   g.drawLine(x1, y1, x2, y2);  } }
  
IRectangle.java 
import java.awt.*; import java.awt.event.*; import java.util.Vector; 
/**  * @author aassd  *  * To change this generated comment edit the template variable "typecomment":  * Window>Preferences>Java>Templates.  * To enable and disable the creation of type comments go to  * Window>Preferences>Java>Code Generation.  */ public class IRectangle implements Shape {  private int x;     private int y;     private int width;     private int height;     private Color color; 
    public IRectangle(int x, int y, int width, int height, Color color) {      this.x = x;      this.y = y;      this.width = width;      this.height = height;      this.color = color;     } 
  public void draw(Graphics g) {   g.setColor(color);   g.drawRect(x, y, width, height);  } 
 }
  
  
PaintApp.java 
import java.awt.*; import java.awt.event.*; import java.util.*; 
/**  * @author aassd  *  * To change this generated comment edit the template variable "typecomment":  * Window>Preferences>Java>Templates.  * To enable and disable the creation of type comments go to  * Window>Preferences>Java>Code Generation.  */ public class PaintApp extends Frame {  Panel commandPanel = new Panel();  Panel colorPanel = new Panel();  Panel shapePanel = new Panel(); 
 Button btnRed = new Button("Red");  Button btnGreen = new Button("Green");  Button btnBlue = new Button("Blue"); 
 Button btnLine = new Button("Line");  Button btnRectangle = new Button("Rectangle");  Button btnCircle = new Button("Circle"); 
 Button btnUndo = new Button("Undo");  Button btnRedo = new Button("Redo");  Button btnExit = new Button("Exit"); 
 PaintBoard paintBoard = new PaintBoard(); 
 public PaintApp() {   this.setLayout(new BorderLayout()); 
  btnLine.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnLine_actionPerformed(e);    }   });   btnRectangle.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnRectangle_actionPerformed(e);    }   });   btnCircle.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnCircle_actionPerformed(e);    }   }); 
  btnExit.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnExit_actionPerformed(e);    }   });   btnUndo.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnUndo_actionPerformed(e);    }   });   btnRedo.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnRedo_actionPerformed(e);    }   }); 
   shapePanel.setLayout(new FlowLayout());   shapePanel.add(btnLine, null);   shapePanel.add(btnRectangle, null);   shapePanel.add(btnCircle, null); 
  shapePanel.add(btnUndo, null);   shapePanel.add(btnRedo, null);   shapePanel.add(btnExit,null); 
  btnRed.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnRed_actionPerformed(e);    }   });   btnGreen.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnGreen_actionPerformed(e);    }   });   btnBlue.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {        btnBlue_actionPerformed(e);    }   }); 
  colorPanel.setLayout(new FlowLayout());   colorPanel.add(btnRed, null);   colorPanel.add(btnGreen, null);   colorPanel.add(btnBlue, null); 
   commandPanel.setLayout(new BorderLayout());   commandPanel.add(shapePanel, BorderLayout.NORTH);   commandPanel.add(colorPanel, BorderLayout.CENTER); 
  this.add(commandPanel, BorderLayout.SOUTH);   this.add(paintBoard, BorderLayout.CENTER); 
        /////////////////////////////////////////////////////////////////////////// 
        btnLine.setForeground(Color.red);         paintBoard.setCommand(Command.LINE); 
        btnRed.setForeground(Color.red);         paintBoard.setColor(Color.red);         /////////////////////////////////////////////////////////////////////////// 
  } 
 void btnExit_actionPerformed(ActionEvent e) {   System.exit(0);  } 
 void btnUndo_actionPerformed(ActionEvent e) {   paintBoard.undo();  } 
 void btnRedo_actionPerformed(ActionEvent e) {   paintBoard.redo();  } 
  void btnLine_actionPerformed(ActionEvent e) {   btnLine.setForeground(Color.red);   btnRectangle.setForeground(Color.black);   btnCircle.setForeground(Color.black);   paintBoard.setCommand(Command.LINE);  }  void btnRectangle_actionPerformed(ActionEvent e) {   btnLine.setForeground(Color.black);   btnRectangle.setForeground(Color.red);   btnCircle.setForeground(Color.black);   paintBoard.setCommand(Command.RECTANGLE);  }  void btnCircle_actionPerformed(ActionEvent e) {   btnLine.setForeground(Color.black);   btnRectangle.setForeground(Color.black);   btnCircle.setForeground(Color.red);   paintBoard.setCommand(Command.CIRCLE);  } 
 void btnRed_actionPerformed(ActionEvent e) {   btnRed.setForeground(Color.red);   btnGreen.setForeground(Color.black);   btnBlue.setForeground(Color.black);   paintBoard.setColor(Color.red);  }  void btnGreen_actionPerformed(ActionEvent e) {   btnRed.setForeground(Color.black);   btnGreen.setForeground(Color.red);   btnBlue.setForeground(Color.black);   paintBoard.setColor(Color.green);  }  void btnBlue_actionPerformed(ActionEvent e) {   btnRed.setForeground(Color.black);   btnGreen.setForeground(Color.black);   btnBlue.setForeground(Color.red);   paintBoard.setColor(Color.blue);  } 
  public static void main(String[] args) {   PaintApp paintApp = new PaintApp();   paintApp.setSize(600, 500);   paintApp.setVisible(true);  } 
}
  
PaintBoard.java 
import java.awt.*; import java.awt.event.*; import java.util.*; 
/**  * @author aassd  *  * To change this generated comment edit the template variable "typecomment":  * Window>Preferences>Java>Templates.  * To enable and disable the creation of type comments go to  * Window>Preferences>Java>Code Generation.  */ 
public class PaintBoard extends Canvas implements java.awt.event.MouseListener, java.awt.event.MouseMotionListener {     int srcX = 0;     int srcY = 0; 
    int lineToX = 0;     int lineToY = 0;          boolean bMousePressing = false;          java.util.Stack vShapes = new java.util.Stack();     java.util.Stack vDelShapes = new java.util.Stack();          private int command = 0;     private Color color;          public void undo() {      if (vShapes.size() > 0) {    Object shape = vShapes.pop();    vDelShapes.push(shape);    repaint();      } 
    }     public void redo() {      if (vDelShapes.size() > 0) {       Object shape =  vDelShapes.pop();       vShapes.push(shape);       repaint();      }     }          public void setCommand(int command) {      this.command = command;     }     public void setColor(Color color) {      this.color = color;     } 
    public PaintBoard() {         this.addMouseListener(this);         this.addMouseMotionListener(this);     } 
    public void paint(Graphics g) { 
        Dimension size = size();         int width = size.width ;         int height = size.height;         g.setColor(Color.white);         g.fillRect(0,0, width,height); 
  Shape shape = null;         java.util.Enumeration enum = vShapes.elements();         g.setColor(Color.blue);         while (enum.hasMoreElements()) {             shape = (Shape) enum.nextElement();    shape.draw(g);         } 
     if (bMousePressing) {    g.setColor(color);    switch (command) {     case Command.LINE:            g.drawLine(srcX, srcY, lineToX, lineToY);      break;     case Command.RECTANGLE:        if (lineToX < srcX) {       if (lineToY < srcY) {        g.drawRect(lineToX, lineToY, srcX - lineToX , srcY - lineToY);        }       else {        g.drawRect(lineToX, srcY, srcX - lineToX, lineToY - srcY);       }      }      else {         if (lineToY < srcY) {        g.drawRect(srcX, lineToY, lineToX - srcX, srcY - lineToY);       }       else {        g.drawRect(srcX, srcY, lineToX - srcX, lineToY - srcY);       }      }      break;     case Command.CIRCLE:        int w = (int)java.lang.Math.sqrt((srcX - lineToX) * (srcX - lineToX) + (srcY - lineToY) * (srcY - lineToY));      g.drawArc(srcX - w/2, srcY - w/2, w, w, 0, 360);      break;    }//End switch(command)   }             } 
    public void mouseClicked(MouseEvent e) {     } 
    public void mousePressed(MouseEvent e) {         srcX = e.getX();         srcY = e.getY();         bMousePressing = true;     } 
    public void mouseReleased(MouseEvent e) {         lineToX = e.getX();         lineToY = e.getY();   bMousePressing = false;         switch (command) {          case Command.LINE:        ILine line = new ILine(srcX, srcY, lineToX, lineToY, color);     vShapes.push(line);                     break;          case Command.RECTANGLE:           IRectangle rectangle = null;           if (lineToX < srcX) {      if (lineToY < srcY) {       rectangle = new IRectangle(lineToX, lineToY, srcX - lineToX , srcY - lineToY, color);       }      else {       rectangle = new IRectangle(lineToX, srcY, srcX - lineToX, lineToY - srcY, color);      }     }     else {        if (lineToY < srcY) {       rectangle = new IRectangle(srcX, lineToY, lineToX - srcX, srcY - lineToY, color);      }      else {       rectangle = new IRectangle(srcX, srcY, lineToX - srcX, lineToY - srcY, color);      }     }           vShapes.push(rectangle);           break;          case Command.CIRCLE:     int w = (int)java.lang.Math.sqrt((srcX - lineToX) * (srcX - lineToX) + (srcY - lineToY) * (srcY - lineToY));     ICircle circle = new ICircle(srcX - w/2, srcY - w/2, w, w, color);                  vShapes.push(circle);           break;         } //End switch(command)                  repaint();     } 
    public void mouseEntered(MouseEvent e) {     } 
    public void mouseExited(MouseEvent e) {     } 
    public void mouseDragged(MouseEvent e) {         lineToX = e.getX();         lineToY = e.getY();         repaint();     } 
    public void mouseMoved(MouseEvent e) {     } 
    }
  
Shape.java 
import java.awt.*; import java.awt.event.*; 
/**  * @author aassd  *  * To change this generated comment edit the template variable "typecomment":  * Window>Preferences>Java>Templates.  * To enable and disable the creation of type comments go to  * Window>Preferences>Java>Code Generation.  */ public interface Shape {     public void draw(Graphics g); }
   
 
  |