protected AbstractExpandableItemsHandler(@NotNull final ComponentType component) { myComponent = component; myComponent.add(myRendererPane); myComponent.validate(); myPopup = new MovablePopup(myComponent, myTipComponent); myTipComponent.addMouseWheelListener( new MouseWheelListener() { @Override public void mouseWheelMoved(MouseWheelEvent e) { dispatchEvent(myComponent, e); } }); myTipComponent.addMouseListener( new MouseListener() { @Override public void mouseClicked(MouseEvent e) { dispatchEvent(myComponent, e); } @Override public void mousePressed(MouseEvent e) { dispatchEvent(myComponent, e); } @Override public void mouseReleased(MouseEvent e) { dispatchEvent(myComponent, e); } @Override public void mouseEntered(MouseEvent e) {} @Override public void mouseExited(MouseEvent e) { // don't hide the hint if mouse exited to owner component if (myComponent.getMousePosition() == null) { hideHint(); } } }); myTipComponent.addMouseMotionListener( new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { dispatchEvent(myComponent, e); } @Override public void mouseDragged(MouseEvent e) { dispatchEvent(myComponent, e); } }); myComponent.addMouseListener( new MouseListener() { @Override public void mouseEntered(MouseEvent e) { handleMouseEvent(e); } @Override public void mouseExited(MouseEvent e) { // don't hide the hint if mouse exited to it if (myTipComponent.getMousePosition() == null) { hideHint(); } } @Override public void mouseClicked(MouseEvent e) {} @Override public void mousePressed(MouseEvent e) { handleMouseEvent(e); } @Override public void mouseReleased(MouseEvent e) { handleMouseEvent(e); } }); myComponent.addMouseMotionListener( new MouseMotionListener() { @Override public void mouseDragged(MouseEvent e) { handleMouseEvent(e); } @Override public void mouseMoved(MouseEvent e) { handleMouseEvent(e, false); } }); myComponent.addFocusListener( new FocusAdapter() { @Override public void focusLost(FocusEvent e) { onFocusLost(); } @Override public void focusGained(FocusEvent e) { updateCurrentSelection(); } }); myComponent.addComponentListener( new ComponentAdapter() { @Override public void componentHidden(ComponentEvent e) { hideHint(); } @Override public void componentMoved(ComponentEvent e) { updateCurrentSelection(); } @Override public void componentResized(ComponentEvent e) { updateCurrentSelection(); } }); myComponent.addHierarchyBoundsListener( new HierarchyBoundsAdapter() { @Override public void ancestorMoved(HierarchyEvent e) { updateCurrentSelection(); } @Override public void ancestorResized(HierarchyEvent e) { updateCurrentSelection(); } }); myComponent.addHierarchyListener( new HierarchyListener() { @Override public void hierarchyChanged(HierarchyEvent e) { hideHint(); } }); }
/** * Add a component of a certain type * * @param componentType The component type to add * @return The component of a specific type */ public <T extends Component> T add(ComponentType<T> componentType) { return componentType.add(this); }