// this sample program was written by one student 
// clean it up --  restructure it - remove all anonymous classes - and resubmit it
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class simpleGraphDrawing extends JFrame {
	int mouseX=0,mouseY=0,lastX=0,lastY=0,X,Y,index,lastindex;
	boolean addBlock=false;
	boolean connectBlock=false;
	boolean olddesign=false;
	boolean line_to_be_drawn=false;
	boolean connection=false;
	boolean Object_clicked=false;
	JButton ad,connect,newd,oldd; 
        Vector vector = new Vector();
        Vector vector1 = new Vector();
	JPanel pane = new JPanel() { 
	    protected void paintComponent(Graphics g){
	           super.paintComponent(g);
		    mypaint(g);
		           }
	      };                                                             
	public void init() {
        setContentPane(makeContentPane());       
    }

	public Container makeContentPane() {     
		ad = new JButton("Add");
		connect = new JButton("Connect");    
		oldd = new JButton("Drag");    
		ad.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(ActionEvent e) {
			ad_actionPerformed(e);			   }     });                
		connect.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(ActionEvent e) {
			connect_actionPerformed(e);		   }	      });                
		oldd.addActionListener(new java.awt.event.ActionListener() {
					      public void actionPerformed(ActionEvent e) {
					 		oldd_actionPerformed(e);
					      }	      
			                }
				      );                
		pane.add(ad);
		pane.add(connect);
		pane.add(oldd);
		pane.setBackground(new Color(255,255,204));
		pane.setBorder(BorderFactory.createMatteBorder(1,1,2,2,Color.black));
		pane.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
			public void mouseDragged(MouseEvent e) {
			pane_mouseDragged(e);	         	 }                  
		public void mouseMoved(MouseEvent e) {
			pane_mouseMoved(e);	      } 			    });                                            
		pane.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
			pane_mouseClicked(e);		       }

			public void mousePressed(MouseEvent e) {
				pane_mousePressed(e);
				}
				});        
				return pane;
				}                                                                      

    
	public void ad_actionPerformed(ActionEvent ae) {
		addBlock=true; connectBlock=false;  
	}

	public void connect_actionPerformed(ActionEvent ae) {
		addBlock=false; connectBlock=true;   
	}
    
	public void oldd_actionPerformed(ActionEvent ae) {
		olddesign=true;   
	}
	public void pane_mouseClicked(MouseEvent e) {
		mouseX=e.getX();
		mouseY=e.getY();
		Point pt = new Point(mouseX,mouseY);
		if(addBlock==true) { 
			line_to_be_drawn=false; vector.add(pt);  }
		if(connectBlock==true) {
			for(int i=0;i<vector.size();i++) {
				X=(int)((Point)vector.elementAt(i)).getX();
				Y=(int)((Point)vector.elementAt(i)).getY();
				if(mouseX>X)
					{ if(mouseX-10<=X)
						{ Object_clicked=true;  index=i; i=vector.size(); } 
					   else          
						Object_clicked=false;
					}
				else if(mouseX<X)
					{ if(mouseX+10>=X)
						{ Object_clicked=true;  index=i; i=vector.size();  }
					  else 
						Object_clicked=false;
					} 
			}
			if(Object_clicked==true)
			{
				if(line_to_be_drawn==true)
				{ 
					connection=true; 
					line_to_be_drawn=false;
				}
				else
				{
					lastindex=index;
					line_to_be_drawn=true; 
				}
			}
			if(connection==true) {
				Point pt1 = new Point(lastindex,index);
				vector1.add(pt1);
				line_to_be_drawn=false;
				connection=false;
			}
		}
		 pane.repaint(); 
	}
     
    
	public void pane_mouseEntered(MouseEvent e) { }
    
	public void pane_mouseExited(MouseEvent e) { }
    
	public void pane_mousePressed(MouseEvent e) { 
		mouseX=e.getX(); 
		mouseY=e.getY(); 
		for(int i=0;i<vector.size();i++) 
		{
			X=(int)((Point)vector.elementAt(i)).getX();
			Y=(int)((Point)vector.elementAt(i)).getY();
			if(mouseX>X)
			{ if(mouseX-10<=X)
				{ Object_clicked=true;  index=i; i=vector.size(); } 
			  else          
				Object_clicked=false;
			}
			else if(mouseX<X)
			{ 	if(mouseX+10>=X)
					{ Object_clicked=true;  index=i; i=vector.size();  }
				else 
					Object_clicked=false;
			} 
		}
	}  
    
	public void pane_mouseReleased(MouseEvent e) {  }
     
	public void pane_mouseDragged(MouseEvent e) { 
		Point pt = new Point(e.getX(),e.getY());
		vector.remove(index);    
		vector.add(index,pt);
		pane.repaint();  
	}
   
	public void pane_mouseMoved(MouseEvent e) { }

	public void mypaint(Graphics g)
	{
		int index1,index2;
		for (int i=0;i<(vector.size());i++)
		{  g.fillOval((int)((Point)vector.elementAt(i)).getX(),(int)((Point)vector.elementAt(i)).getY(),10,10); }
		for (int i=0;i<vector1.size();i++)
		{ 
			index1=(int)((Point)vector1.elementAt(i)).getX();
			index2=(int)((Point)vector1.elementAt(i)).getY();
			g.drawLine((int)((Point)vector.elementAt(index1)).getX(),(int)((Point)vector.elementAt(index1)).getY(),(int)((Point)vector.elementAt(index2)).getX(),(int)((Point)vector.elementAt(index2)).getY()); 
		}
	}
		
	public static void main(String[] args){
		JFrame frame = new JFrame();
		frame.addWindowListener(new WindowAdapter() {
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
		});
		simpleGraphDrawing gd = new simpleGraphDrawing ();
		frame.setContentPane(gd.makeContentPane());
		frame.pack();
		frame.setVisible(true);              
	}                               
}

		

