package ru.denull.wire; import java.awt.Component; import java.awt.Container; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import javax.swing.*; public class InteractiveList extends JList implements MouseListener, MouseMotionListener { private static final long serialVersionUID = 3293889755508863611L; public InteractiveList() { super(); addMouseListener(this); //addMouseMotionListener(this); } @Override public void mouseClicked(MouseEvent e) { forwardEvent(e); } @Override public void mousePressed(MouseEvent e) { forwardEvent(e); } @Override public void mouseReleased(MouseEvent e) { forwardEvent(e); } @Override public void mouseEntered(MouseEvent e) { forwardEvent(e); } @Override public void mouseExited(MouseEvent e) { forwardEvent(e); } @Override public void mouseDragged(MouseEvent e) { //forwardEvent(e); } @Override public void mouseMoved(MouseEvent e) { forwardEvent(e); } private void forwardEvent(MouseEvent e) { int index = locationToIndex(e.getPoint()); if (index == -1) return; ListCellRenderer renderer = getCellRenderer(); if (renderer == null) return; Rectangle bounds = getCellBounds(index, index); if (bounds == null || !bounds.contains(e.getPoint())) return; ListModel model = getModel(); if (model == null) return; ListSelectionModel selection = getSelectionModel(); Component comp = renderer.getListCellRendererComponent(this, model.getElementAt(index), index, selection.isSelectedIndex(index), hasFocus() && selection.getLeadSelectionIndex() == index); //System.out.println("forw event at " + (e.getX() - bounds.x) + ", " + (e.getY() - bounds.y) + " (index " + index + ")"); if (comp instanceof JComponent) { sendEvent((JComponent) comp, e, e.getX() - bounds.x, e.getY() - bounds.y); } repaint(); } private void sendEvent(Component comp, MouseEvent e, int x, int y) { if (comp instanceof AbstractButton) { //((AbstractButton) comp).setSelected(true); MouseEvent ev = new MouseEvent(comp, e.getID(), e.getWhen(), e.getModifiers(), x, y, e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton()); comp.dispatchEvent(ev); } else if (comp instanceof Container) { for (Component child : ((Container) comp).getComponents()) { sendEvent(child, e, x - child.getX(), y - child.getY()); } } else { if (comp instanceof AbstractButton) { System.out.println("found btn"); ((AbstractButton) comp).setSelected(true); } MouseEvent ev = new MouseEvent(e.getComponent(), e.getID(), e.getWhen(), e.getModifiers(), x, y, e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton()); comp.dispatchEvent(ev); } } }