package sandbox; import java.awt.*; import java.awt.event.*; import java.awt.geom.Rectangle2D; import java.util.Vector; import javax.swing.*; @SuppressWarnings("serial") public class JKSSelect extends JComponent { private Point point; @SuppressWarnings("unused") private JComponent component; private Vector<Selectable> unselected; private Vector<Selectable> selected; @SuppressWarnings("unchecked") public JKSSelect(JComponent component, Vector<? extends Selectable> selection) { super(); this.component = component; this.unselected = (Vector<Selectable>) selection; this.selected = new Vector<Selectable>(); this.containerAction(component); point = new Point(); this.setBorder(BorderFactory.createTitledBorder("")); component.addContainerListener(new ContainerAdapter() { @Override public void componentAdded(ContainerEvent e) { if (e.getChild() instanceof Selectable) { e.getChild().addMouseListener(new JKSClick()); } } }); } private void makeSquare(Point a, Point b) { Point aux; if (a == null || b == null) { a = new Point(0, 0); b = new Point(0, 0); } if (a.x == 0 && a.y == 0 && b.x == 0 && b.y == 0) { this.setLocation(0, 0); this.setSize(0, 0); } if ((a.x >= b.x && a.y > b.y) || (a.x < b.x && a.y >= b.y)) { aux = a; a = b; b = aux; } if (a.x <= b.x && a.y < b.y) { this.setLocation((int) (a.x), (int) (a.y)); this.setSize((int) (b.x - a.x), (int) (b.y - a.y)); } else if (a.x > b.x && a.y <= b.y) { this.setLocation((int) (b.x), (int) (a.y)); this.setSize((int) (a.x - b.x), (int) (b.y - a.y)); } } public void containerAction(JComponent container) { container.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent arg0) { unselectAll(); } @Override public void mousePressed(MouseEvent arg0) { if (!arg0.isControlDown()) unselectAll(); point = arg0.getPoint(); setVisible(true); } @Override public void mouseReleased(MouseEvent arg0) { setVisible(false); for (int x = 0; x < unselected.size(); x++) { if ((new Rectangle2D.Double(getLocation().getX(), getLocation().getY(), getSize().getWidth(), getSize().getHeight())).contains(unselected.get(x) .getLocation())) { unselected.get(x).setSelected(true); selected.add(unselected.remove(x)); x--; } } makeSquare(new Point(0, 0), new Point(0, 0)); } }); container.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent arg0) { makeSquare(point, arg0.getPoint()); } }); } public void unselectAll() { while (selected.size() != 0) { selected.get(0).setSelected(false); unselected.add(selected.remove(0)); } } public void selectAll() { while (unselected.size() != 0) { unselected.get(0).setSelected(true); selected.add(unselected.remove(0)); } } public Vector<? extends Selectable> getSelectedArray() { return this.selected; } public Vector<? extends Selectable> getUnselectedArray() { return this.unselected; } class JKSClick extends MouseAdapter { @Override public void mouseClicked(MouseEvent e) { System.out.printf("Clicado"); if (!e.isControlDown()) unselectAll(); if (selected.remove((Selectable) e.getComponent())) { unselected.add((Selectable) e.getComponent()); ((Selectable) e.getComponent()).setSelected(false); } else if (unselected.remove((Selectable) e.getComponent())) { selected.add((Selectable) e.getComponent()); ((Selectable) e.getComponent()).setSelected(true); } } } }