void (@NotNull Component component, @Nullable Point point) { if (!(component instanceof XDebuggerFramesList list)) return; var oldHoverIndex = getHoveredIndex(component); ClientProperty.put(list, HOVER_POSITION, null); ClientProperty.put(list, HOVER_BOUNDS, null); ClientProperty.put(list, HOVER_INDEX, -1); ClientProperty.put(list, CAN_DROP_FRAME, false); ClientProperty.put(list, RESET_ICON_HOVERED, false); boolean resetHoverActions = true; if (point != null) { var renderer = getFrameListRenderer(list, point); var index = list.locationToIndex(point); var bounds = list.getCellBounds(index, index); var pointInCellBounds = bounds == null ? point : new Point(point.x - bounds.x, point.y - bounds.y); if (oldHoverIndex != index) { HelpTooltip.hide(list); } if (bounds != null) { ClientProperty.put(list, HOVER_POSITION, pointInCellBounds); ClientProperty.put(list, HOVER_BOUNDS, bounds); } ClientProperty.put(list, HOVER_INDEX, index); if (index >= 0 && index < list.getModel().getSize()) { var value = list.getModel().getElementAt(index); if (value instanceof XStackFrame) { var dropFrameHandler = findDropFrameHandler(list); ClientProperty.put(list, CAN_DROP_FRAME, dropFrameHandler != null && dropFrameHandler.canDrop((XStackFrame)value)); } } if (renderer != null && getCanDropFrame(list)) { boolean isHovered = renderer.isIconHovered(pointInCellBounds, bounds); if (isHovered) { list.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); ClientProperty.put(list, RESET_ICON_HOVERED, true); resetHoverActions = false; } } } if (resetHoverActions) { list.setCursor(Cursor.getDefaultCursor()); HelpTooltip.hide(list); } component.repaint(); }