private void dragOverHitObject()

in kit/src/main/java/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/DragGesture.java [232:372]


    private void dragOverHitObject(FXOMObject hitObject) {
        assert hitObject != null;
                
        final FXOMDocument fxomDocument
                = contentPanelController.getEditorController().getFxomDocument();
        final AbstractDragSource dragSource
                = dragController.getDragSource();
        final DesignHierarchyMask m 
                = new DesignHierarchyMask(hitObject);
        final double hitX 
                = lastDragEvent.getSceneX();
        final double hitY 
                = lastDragEvent.getSceneY();
        
        assert fxomDocument != null;
        assert dragSource != null;

        AbstractDropTarget dropTarget = null;
        FXOMObject newHitParent = null;
        DesignHierarchyMask newHitParentMask = null;
        
        // dragSource is a single ImageView ?
        final boolean hitImageView = hitObject.getSceneGraphObject() instanceof ImageView;
        final boolean externalDragSource = dragSource instanceof ExternalDragSource;

        if (dragSource.isSingleImageViewOnly() && hitImageView && externalDragSource) {
            dropTarget = new ImageViewDropTarget(hitObject);
            newHitParent = hitObject;
            newHitParentMask = m;
        }
        
        // dragSource is a single Tooltip ?
        if (dropTarget == null) {
            if (dragSource.isSingleTooltipOnly()) {
                assert hitObject instanceof FXOMInstance;
                dropTarget = new AccessoryDropTarget((FXOMInstance)hitObject, Accessory.TOOLTIP);
                newHitParent = hitObject;
                newHitParentMask = m;
            }
        }
        
        // dragSource is a single ContextMenu ?
        if (dropTarget == null) {
            if (dragSource.isSingleContextMenuOnly()) {
                assert hitObject instanceof FXOMInstance;
                dropTarget = new AccessoryDropTarget((FXOMInstance)hitObject, Accessory.CONTEXT_MENU);
                newHitParent = hitObject;
                newHitParentMask = m;
            }
        }
        
        // hitObject is BorderPane ?
        if (dropTarget == null) {
            if (hitObject.getSceneGraphObject() instanceof BorderPane) {
                final AbstractDriver driver = contentPanelController.lookupDriver(hitObject);
                assert driver instanceof BorderPaneDriver;
                dropTarget = driver.makeDropTarget(hitObject, hitX, hitY);
                newHitParent = hitObject;
                newHitParentMask = m;
            }
        }
        
        // hitObject has sub-components (ie it is a container)
        if (dropTarget == null) {
            if (m.isAcceptingSubComponent()) {
                final AbstractDriver driver = contentPanelController.lookupDriver(hitObject);
                dropTarget = driver.makeDropTarget(hitObject, hitX, hitY);
                newHitParent = hitObject;
                newHitParentMask = m;
            }
        }
        
        // hitObject accepts Accessory.CONTENT
        if (dropTarget == null) {
            if (m.isAcceptingAccessory(Accessory.CONTENT)) {
                assert hitObject instanceof FXOMInstance;
                dropTarget = new AccessoryDropTarget((FXOMInstance)hitObject, Accessory.CONTENT);
                newHitParent = hitObject;
                newHitParentMask = m;
            }
        }
        
        // hitObject parent is a container ?
        if (dropTarget == null) {
            final FXOMObject hitObjectParent = hitObject.getParentObject();
            if (hitObjectParent != null) {
                final DesignHierarchyMask mp = new DesignHierarchyMask(hitObjectParent);
                if (mp.isAcceptingSubComponent()) {
                    final AbstractDriver driver = contentPanelController.lookupDriver(hitObjectParent);
                    dropTarget = driver.makeDropTarget(hitObjectParent, hitX, hitY);
                    newHitParent = hitObjectParent;
                    newHitParentMask = mp;
                }
            }
        }
                
        // Update movingGuideController
        if (newHitParent != hitParent) {
            hitParent = newHitParent;
            hitParentMask = newHitParentMask;
            if (hitParent == null) {
                assert hitParentMask == null;
                movingGuideController.clearSampleBounds();
            } else {
                assert hitParentMask != null;
                if (hitParentMask.isFreeChildPositioning() && dragSource.isNodeOnly()) {
                    populateMovingGuideController();
                } else {
                    movingGuideController.clearSampleBounds();
                }
            }
        }
        
        final double guidedX, guidedY;
        if (movingGuideController.hasSampleBounds() && (guidesDisabled == false)) {
            updateShadow(hitX, hitY);
            final Bounds shadowBounds = shadow.getLayoutBounds();
            final Bounds shadowBoundsInScene = shadow.localToScene(shadowBounds, true /* rootScene */);
            movingGuideController.match(shadowBoundsInScene);
            
            guidedX = hitX + movingGuideController.getSuggestedDX();
            guidedY = hitY + movingGuideController.getSuggestedDY();
        } else {
            guidedX = hitX;
            guidedY = hitY;
        }

        updateShadow(guidedX, guidedY);
        
        if (!MathUtils.equals(guidedX , hitX) || !MathUtils.equals(guidedY, hitY)) {
            assert dropTarget != null;
            assert dropTarget instanceof ContainerXYDropTarget;
            final AbstractDriver driver = contentPanelController.lookupDriver(dropTarget.getTargetObject());
            dropTarget = driver.makeDropTarget(hitParent, guidedX, guidedY);
            assert dropTarget instanceof ContainerXYDropTarget;
        }
        
        dragController.setDropTarget(dropTarget);
        lastDragEvent.acceptTransferModes(dragController.getAcceptedTransferModes());
        
    }