1  import java.awt.*;
  2  import java.awt.event.*;
  3  import java.awt.geom.*;
  4  import javax.swing.*;
  5  
  6  import java.util.*;
  7  
  8  /**
  9     A component that shows a scene composed of shapes.
 10  */
 11  public class SceneComponent extends JComponent
 12  {
 13     public SceneComponent()
 14     {
 15        shapes = new ArrayList<>();
 16        addMouseListener(new MousePressedListener());
 17        addMouseMotionListener(new MouseDraggedListener());
 18     }
 19  
 20     private class MousePressedListener extends MouseAdapter
 21     {
 22  	   @Override
 23  	   public void mousePressed(MouseEvent event) 
 24  	   {
 25           mousePoint = event.getPoint();
 26           for (SceneShape s : shapes)
 27           {
 28              if (s.contains(mousePoint))
 29                 s.setSelected(!s.isSelected());
 30           }
 31           repaint();		
 32  	   }
 33     }
 34     
 35     private class MouseDraggedListener extends MouseAdapter
 36     {
 37        @Override
 38        public void mouseDragged(MouseEvent event)
 39        {
 40           Point lastMousePoint = mousePoint;
 41           mousePoint = event.getPoint();
 42           for (SceneShape s : shapes)
 43           {
 44              if (s.isSelected())
 45              {
 46                 double dx = mousePoint.getX() - lastMousePoint.getX();
 47                 double dy = mousePoint.getY() - lastMousePoint.getY();
 48                 s.translate((int) dx, (int) dy);
 49              }
 50           }
 51           repaint();
 52        }
 53     }
 54     
 55     /**
 56        Adds a shape to the scene.
 57        @param s the shape to add
 58     */
 59     public void add(SceneShape s)
 60     {
 61        shapes.add(s);
 62        repaint();
 63     }
 64  
 65     /**
 66        Removes all selected shapes from the scene.
 67     */
 68     public void removeSelected()
 69     {
 70        for (int i = shapes.size() - 1; i >= 0; i--)
 71        {
 72           SceneShape s = shapes.get(i);
 73           if (s.isSelected()) shapes.remove(i);
 74        }
 75        repaint();
 76     }
 77  
 78     public void paintComponent(Graphics g)
 79     {
 80        Graphics2D g2 = (Graphics2D) g;
 81        for (SceneShape s : shapes)
 82        {
 83           s.draw(g2);
 84           if (s.isSelected())
 85              s.drawSelection(g2);
 86        }
 87     }
 88  
 89     private ArrayList<SceneShape> shapes;
 90     private Point mousePoint;
 91  }