package Mouse;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JPanel;
public class MousePanel extends JPanel
{
public MousePanel()
{
squares = new ArrayList<Rectangle2D>();
current = null;
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
//desenarea tuturor patratelor
for(Rectangle2D r: squares)
{
g2.draw(r);
}
}
/**
* Gasirea primului patrat, care are punctul necesar
* @param p puntul
* @return primul patrat, ca ara puntul p
*/
public Rectangle2D find(Point2D p)
{
for(Rectangle2D r:squares)
{
if(r.contains(p)) return r;
}
return null;
}
/**
* Adaugarea patratutlui la centru
* @param p centru patratului
*/
public void add(Point2D p)
{
double x = p.getX();
double y = p.getY();
current = new Rectangle2D.Double(x-SIDELENGHT/2,y-SIDELENGHT/2,SIDELENGHT,SIDELENGHT);
squares.add(current);
repaint();
}
/**
* Stergetrea unui patrat din multime
* @param s Patratul care trenbue de sters
*/
public void remove(Rectangle2D s)
{
if(s == null) return;
if(s == current) current = null;
squares.remove(s);
repaint();
}
private static final int SIDELENGHT = 10;
private ArrayList<Rectangle2D> squares;
private Rectangle2D current;
/**
* Patratutl in limitele caruia se afla cursorul.
*/
private class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent event)
{
//daca cursorul este peste toti patratii sa adauga un nou patrat
current = find(event.getPoint());
if(current == null)
add(event.getPoint());
}
public void mouseClicked(MouseEvent event)
{
//dupa dublu click ..patratul curent se sterge
current = find(event.getPoint());
if(current != null && event.getClickCount() >=2 )
{
remove(current);
}
}
}
private class MouseMotionHandler implements MouseMotionListener
{
public void mouseDragged(MouseEvent event)
{
if(current != null)
{
int x=event.getX();
int y=event.getY();
//Schimbarea prin apucare a patratului in punctul x,y
current.setFrame(x-SIDELENGHT/2,y-SIDELENGHT/2,SIDELENGHT,SIDELENGHT);
repaint();
}
}
//Daca cursorul este in limita patratului , el ea forma de cruce
public void mouseMoved(MouseEvent event )
{
if(find(event.getPoint()) == null)
setCursor(Cursor.getDefaultCursor());
else
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
}
}