package graphics.draw2d;

import ip.gui.frames.ShortCutFrame;
import ip.graphics.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import graphics.ImageUtils;

public class DrawTest extends ShortCutFrame
    implements MouseListener, MouseMotionListener {

  Font font
      = new Font("Times", Font.PLAIN, 12);


  MenuBar mb = new MenuBar();

  Menu fileMenu = new Menu("File");
  MenuItem saveAsPict_mi =
      addMenuItem(fileMenu, "[E-s]ave as pict");
  MenuItem line_mi =
      addMenuItem(fileMenu, "[l]ine");
  MenuItem circle_mi =
      addMenuItem(fileMenu, "[c]ircle");
  MenuItem oval_mi =
      addMenuItem(fileMenu, "[o]val");
  MenuItem rect_mi =
      addMenuItem(fileMenu, "[r]ect");
  MenuItem string_mi =
      addMenuItem(fileMenu, "[s]tring");
  MenuItem lens_mi =
      addMenuItem(fileMenu, "[L]ens");
  MenuItem ray_mi =
      addMenuItem(fileMenu, "[R]ay shoot");
  MenuItem erase_mi =
      addMenuItem(fileMenu, "[e]rase");

  MenuItem lastSelected = line_mi;

  Shapes shapeList = new Shapes();

  int x1,y1;
  int x2,y2;
  int xl,yl;


  DrawTest(String title) {
    super(title);
    mb.add(fileMenu);
    setMenuBar(mb);
    setBackground(Color.white);
    addMouseMotionListener(this);
    addMouseListener(this);
  }

  private void save() {
    ImageUtils.print(this);
  }

  public void actionPerformed(ActionEvent e) {

    if (match(e, erase_mi)) {
      shapeList = new Shapes();
      repaint();
      return;
    }
    if (match(e, ray_mi)) {
      shapeList.addLineToLastCircle();
      repaint();
      return;
    }
    if (match(e, lens_mi)) {
      lastSelected = lens_mi;
      return;
    }
    if (match(e, string_mi)) {
      lastSelected = string_mi;
      return;
    }

    if (match(e, rect_mi)) {
      lastSelected = rect_mi;
      return;
    }
    if (match(e, saveAsPict_mi)) {
      save();
      return;
    }

    if (match(e, line_mi)) {
      lastSelected = line_mi;
      return;
    }
    if (match(e, circle_mi)) {
      lastSelected = circle_mi;
      return;
    }
    if (match(e, oval_mi)) {
      lastSelected = oval_mi;
      return;
    }

  }

  public static void main(String args[]) {
    DrawTest drawTest = new DrawTest("DrawTest");
    drawTest.setSize(300, 300);
    drawTest.show();
  }

  public void mouseDragged(MouseEvent e) {
    e.consume();
    xl = x2;
    yl = y2;
    x2 = e.getX();
    y2 = e.getY();
    repaint();
  }

  public void mouseMoved(MouseEvent e) {
  }

  public void mousePressed(MouseEvent e) {
    e.consume();
    x1 = e.getX();
    y1 = e.getY();
    x2 = -1;
  }

  public void mouseReleased(MouseEvent e) {
    e.consume();

    if (lastSelected == lens_mi)
      shapeList.add(
          new Arc2d(x1, y1, e.getX(), e.getY()));
    if (lastSelected == string_mi)
      shapeList.add(
          new String2d(e.getX(), e.getY(), "String me!"));
    if (lastSelected == line_mi)
      shapeList.add(
          new Line2d(x1, y1, e.getX(), e.getY()));
    if (lastSelected == rect_mi)
      shapeList.add(
          new Rect2d(x1, y1, e.getX(), e.getY()));
    if (lastSelected == circle_mi)
      shapeList.add(
          new Circle2d(x1, y1, e.getX(), e.getY()));
    if (lastSelected == oval_mi)
      shapeList.add(
          new Oval2d(x1, y1, e.getX(), e.getY()));
    x2 = xl = -1;
    repaint();
  }

  public void mouseEntered(MouseEvent e) {
  }

  public void mouseExited(MouseEvent e) {
  }

  public void mouseClicked(MouseEvent e) {
  }

  public void drawRubberBand(Graphics g) {
    if (x2 == -1) return;
    g.setXORMode(getBackground());
    if (lastSelected == lens_mi) {
      Arc2d a =
          new Arc2d(x1, y1, x2, y2);
      a.paint(g);
      return;
    }
    if (lastSelected == string_mi) {
      String2d s =
          new String2d(x2, y2, "String me!");
      s.paint(g);
      return;
    }
    if (lastSelected == line_mi) {
      g.drawLine(x1, y1, x2, y2);
      return;
    }

    if (lastSelected == circle_mi) {
      Circle2d c = new Circle2d(x1, y1, x2, y2);
      c.paint(g);
      return;
    }
    if (lastSelected == oval_mi) {
      Oval2d o = new Oval2d(x1, y1, x2, y2);
      o.paint(g);
      return;
    }
    if (lastSelected == rect_mi) {
      Rect2d r = new Rect2d(x1, y1, x2, y2);
      r.paint(g);
      return;
    }
  }

  public void paint(Graphics g) {
    g.setFont(font);
    shapeList.paint(g);
    drawRubberBand(g);
  }

}