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());
}