public void installDndSupport(ChangeListOwner owner) { myDragOwner = owner; myDropTarget = new DropTarget(); myDndManager = DnDManager.getInstance(); myDndManager.registerSource(this); myDndManager.registerTarget(myDropTarget, this); }
@Override public void dispose() { if (myDropTarget != null) { myDndManager.unregisterSource(this); myDndManager.unregisterTarget(myDropTarget, this); myDropTarget = null; myDndManager = null; myDragOwner = null; } }
@Override public void dispose() { if (myDndManager != null) { if (myDropTarget != null) { myDndManager.unregisterTarget(myDropTarget, myTree); myDropTarget = null; } if (myDragSource != null) { myDndManager.unregisterSource(myDragSource, myTree); myDragSource = null; } myDndManager = null; } setTreeBuilder(null); myTree = null; myTreeStructure = null; }
public void track(DnDInfo info) { DropAgent curAgent = dropAgent; // Re-use the same dropAgent until it returns 'false' from track if (dropAgent != null) dropAgent = dropAgent.track(dragElement, info) ? dropAgent : null; // If we don't have a drop agent currently try to get one if (dropAgent == null) { if (curAgent != null) curAgent.dragLeave(dragElement, info); dropAgent = dndManager.getDropAgent(dragElement, info); if (dropAgent != null) dropAgent.dragEnter(dragElement, info); else { dndManager.setCursor(Display.getCurrent().getSystemCursor(SWT.CURSOR_NO)); } } }
protected void enableDnD() { if (!ApplicationManager.getApplication().isHeadlessEnvironment()) { myDropTarget = new ProjectViewDropTarget( myTree, new Retriever() { @Override public PsiElement getPsiElement(@Nullable TreeNode node) { return getPSIElement(getElementFromTreeNode(node)); } @Override public Module getModule(TreeNode treeNode) { return getNodeModule(getElementFromTreeNode(treeNode)); } }, myProject); myDragSource = new MyDragSource(); myDndManager = DnDManager.getInstance(); myDndManager.registerSource(myDragSource, myTree); myDndManager.registerTarget(myDropTarget, myTree); } }
/** * Start a drag operation on the given element. * * @param element The element to drag */ public void dragStart(DnDInfo info) { // cache a placeholder where the element started (NOTE: this also prevents the parent from // being auto-removed by going 'empty' if (dragElement.getParent() != null) { if (dragElement instanceof MStackElement) dragPH = AdvancedFactoryImpl.eINSTANCE.createPlaceholder(); else if (dragElement instanceof MPartStack) dragPH = BasicFactoryImpl.eINSTANCE.createPartSashContainer(); else if (dragElement instanceof MTrimElement) dragPH = MenuFactoryImpl.eINSTANCE.createToolControl(); dragPH.setElementId(DRAG_PLACEHOLDER_ID); dragPH.setToBeRendered(false); List<MUIElement> kids = dragElement.getParent().getChildren(); kids.add(kids.indexOf(dragElement), dragPH); } dropAgent = dndManager.getDropAgent(dragElement, info); if (dropAgent != null) dropAgent.dragEnter(dragElement, info); }
/** * Restore the DragAgent to a state where it will be ready to start a new drag * * @param performDrop determines if a drop operation should be performed if possible */ public void dragFinished(boolean performDrop, DnDInfo info) { boolean isNoDrop = dndManager.getDragShell().getCursor() == Display.getCurrent().getSystemCursor(SWT.CURSOR_NO); if (performDrop && dropAgent != null && !isNoDrop) { dropAgent.drop(dragElement, info); } else { cancelDrag(); } if (dropAgent != null) dropAgent.dragLeave(dragElement, info); if (dragPH == null) return; if (dragPH != null) { dragPH.getParent().getChildren().remove(dragPH); dragPH = null; } dragElement = null; }
protected final JTree createTree(boolean dndAware) { final Tree tree; final NullableFunction<Object, PsiElement> toPsiConverter = o -> { if (o instanceof HierarchyNodeDescriptor) { return ((HierarchyNodeDescriptor) o).getContainingFile(); } return null; }; if (dndAware) { tree = new DnDAwareTree(new DefaultTreeModel(new DefaultMutableTreeNode(""))) { @Override public void removeNotify() { super.removeNotify(); if (ScreenUtil.isStandardAddRemoveNotify(this)) myRefreshAction.unregisterCustomShortcutSet(this); } @Override public boolean isFileColorsEnabled() { return ProjectViewTree.isFileColorsEnabledFor(this); } @Override public Color getFileColorFor(Object object) { return ProjectViewTree.getColorForObject(object, myProject, toPsiConverter); } }; if (!ApplicationManager.getApplication().isHeadlessEnvironment()) { DnDManager.getInstance() .registerSource( new DnDSource() { @Override public boolean canStartDragging(final DnDAction action, final Point dragOrigin) { return getSelectedElements().length > 0; } @Override public DnDDragStartBean startDragging( final DnDAction action, final Point dragOrigin) { return new DnDDragStartBean( new TransferableWrapper() { @Override public TreeNode[] getTreeNodes() { return tree.getSelectedNodes(TreeNode.class, null); } @Override public PsiElement[] getPsiElements() { return getSelectedElements(); } @Override public List<File> asFileList() { return PsiCopyPasteManager.asFileList(getPsiElements()); } }); } @Override public Pair<Image, Point> createDraggedImage( final DnDAction action, final Point dragOrigin) { return null; } @Override public void dragDropEnd() {} @Override public void dropActionChanged(final int gestureModifiers) {} }, tree); } } else { tree = new Tree(new DefaultTreeModel(new DefaultMutableTreeNode(""))) { @Override public void removeNotify() { super.removeNotify(); if (ScreenUtil.isStandardAddRemoveNotify(this)) myRefreshAction.unregisterCustomShortcutSet(this); } @Override public boolean isFileColorsEnabled() { return ProjectViewTree.isFileColorsEnabledFor(this); } @Override public Color getFileColorFor(Object object) { return ProjectViewTree.getColorForObject(object, myProject, toPsiConverter); } }; } configureTree(tree); EditSourceOnDoubleClickHandler.install(tree); myRefreshAction.registerShortcutOn(tree); return tree; }