import edu.neu.ccs.*;
import edu.neu.ccs.gui.*;
import edu.neu.ccs.codec.*;
import edu.neu.ccs.console.*;
import edu.neu.ccs.filter.*;
import edu.neu.ccs.jpf.*;
import edu.neu.ccs.parser.*;
import edu.neu.ccs.pedagogy.*;
import edu.neu.ccs.quick.*;
import edu.neu.ccs.util.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;
import java.util.*;
import java.math.*;
import java.beans.*;
import java.lang.reflect.*;
import java.net.URL;
import java.util.regex.*;
import java.text.ParseException;

public class RandomShapeClass2
    extends DisplayPanel
{
    PaintableSequence sequence = new PaintableSequence();
    
    Tile tile = new Tile(sequence);
    
    {
        XRect bounds = new XRect(0, 0, 500, 500);
        tile.setDefaultBounds2D(bounds);
    }
    
    PaintableComponent wrap = new PaintableComponent(tile);
    
    
    SimpleAction newCircle = new SimpleAction("New Circle") {
        public void perform() { newCircle(); }
    };
    
    
    MouseAction press = new MouseAction() {
        public void mouseActionPerformed(MouseEvent evt) {
            mousePressed(evt);
        }
    };
    
    
    MouseAction drag = new MouseAction() {
        public void mouseActionPerformed(MouseEvent evt) {
            mouseDragged(evt);
        }
    };
    
    
    Object[] stuff = { wrap, newCircle };
    
    VTable panel = new VTable(stuff, 10, 10, CENTER);
    
    int x0 = 0;
    int y0 = 0;
    
    Paintable selected = null;
    
    
    public RandomShapeClass2() {
        addObject(panel);
        installMouseActions();
    }
    
    
    void newCircle() {
        int x = MathUtilities.randomInt(0, 500);
        int y = MathUtilities.randomInt(0, 500);
        int r = MathUtilities.randomInt(50, 100);
        
        XCircle c = new XCircle(x, y, r);
        
        BasicStroke s = new BasicStroke(4);
        
        ShapePaintable p =
            new ShapePaintable
                (c, PaintMode.FILL_DRAW, Colors.red, Colors.blue, s);
        
        sequence.addPaintable(p);
    }
    
    
    void mousePressed(MouseEvent evt) {
        int x = evt.getX();
        int y = evt.getY();
        
        selected = sequence.hits(x, y);
        
        if (selected != null) {
            x0 = x;
            y0 = y;
            
            sequence.shiftPaintableToTop(selected);
        }
    }
    
    
    void mouseDragged(MouseEvent evt) {
        if (selected != null) {
            int x = evt.getX();
            int y = evt.getY();
            
            selected.move(x-x0, y-y0);
            
            x0 = x;
            y0 = y;
        }
    }
    
    
    void installMouseActions() {
        MouseActionAdapter adapter =
            wrap.getMouseActionAdapter();
        
        adapter.addMousePressedAction(press);
        adapter.addMouseDraggedAction(drag);
    }
    
    
    public static void main(String[] args) {
        new RandomShapeClass2().frame();
    }
}

