`
louisling
  • 浏览: 143912 次
  • 性别: Icon_minigender_1
  • 来自: ZhuHai
社区版块
存档分类
最新评论

Drag and Drop in a Tree

    博客分类:
  • RCP
J# 
阅读更多
public class TreeDragDropTest {
    private static Display display;
    private static Shell shell;

    public static void main(String[] args) {
        display = new Display();
        shell = new Shell(display);
        shell.setLayout(new FillLayout());

        final Tree tree = createTree(shell);
        addDragDropSupport(tree);

        shell.setSize(400, 400);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

    static void addDragDropSupport(final Tree tree) {
        //1) Define 'Transfer Type', 'Operation'
        Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
        int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;

        //2) DragSource
        final DragSource source = new DragSource(tree, operations);
        source.setTransfer(types);
        final TreeItem[] dragSourceItem = new TreeItem[1];
        source.addDragListener(new DragSourceListener() {
            public void dragStart(DragSourceEvent event) {
                TreeItem[] selection = tree.getSelection();
                //Selected a leaf node
                if (selection.length > 0 && selection[0].getItemCount() == 0) {
                    event.doit = true;
                    dragSourceItem[0] = selection[0];
                } else {
                    event.doit = false;
                }
            };

            public void dragSetData(DragSourceEvent event) {
                event.data = dragSourceItem[0].getText();
            }

            public void dragFinished(DragSourceEvent event) {
                if (event.detail == DND.DROP_MOVE)
                    dragSourceItem[0].dispose();
                dragSourceItem[0] = null;
            }
        });

        //3) DropTarget
        DropTarget target = new DropTarget(tree, operations);
        target.setTransfer(types);
        target.addDropListener(new DropTargetAdapter() {
            public void dragOver(DropTargetEvent event) {
                event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
                if (event.item != null) {
                    //Target TreeItem
                    TreeItem targetTreeItem = (TreeItem) event.item;

                    //Convert drop coordinate from Display to Tree
                    Point pt = display.map(null, tree, event.x, event.y);
                    Rectangle bounds = targetTreeItem.getBounds();
                    if (pt.y < bounds.y + bounds.height / 3) {
                        event.feedback |= DND.FEEDBACK_INSERT_BEFORE;
                    } else if (pt.y > bounds.y + 2 * bounds.height / 3) {
                        event.feedback |= DND.FEEDBACK_INSERT_AFTER;
                    } else {
                        event.feedback |= DND.FEEDBACK_SELECT;
                    }
                }
            }

            public void drop(DropTargetEvent event) {
                if (event.data == null) {
                    event.detail = DND.DROP_NONE;
                    return;
                }

                String text = (String) event.data;

                if (event.item == null) {
                    //Move to the root node
                    TreeItem item = new TreeItem(tree, SWT.NONE);
                    item.setText(text);
                } else {
                    //Move under a TreeItem node
                    TreeItem dropItem = (TreeItem) event.item;
                    Point pt = display.map(null, tree, event.x, event.y);

                    Rectangle bounds = dropItem.getBounds();
                    TreeItem parent = dropItem.getParentItem();

                    if (parent != null) {
                        //Target node has parent
                        TreeItem[] siblingItems = parent.getItems();

                        int index = 0;
                        for (int i = 0; i < siblingItems.length; i++) {
                            if (siblingItems[i] == dropItem) {
                                index = i;
                                break;
                            }
                        }

                        TreeItem newItem;
                        if (pt.y < bounds.y + bounds.height / 3)
                            newItem = new TreeItem(parent, SWT.NONE, index);
                        else if (pt.y > bounds.y + 2 * bounds.height / 3)
                            newItem = new TreeItem(parent, SWT.NONE, index + 1);
                        else
                            newItem = new TreeItem(dropItem, SWT.NONE);

                        newItem.setText(text);
                    } else {
                        //Target has no parent
                        TreeItem[] siblingItems = tree.getItems();

                        int index = 0;
                        for (int i = 0; i < siblingItems.length; i++) {
                            if (siblingItems[i] == dropItem) {
                                index = i;
                                break;
                            }
                        }

                        TreeItem newItem;
                        if (pt.y < bounds.y + bounds.height / 3)
                            newItem = new TreeItem(tree, SWT.NONE, index);
                        else if (pt.y > bounds.y + 2 * bounds.height / 3)
                            newItem = new TreeItem(tree, SWT.NONE, index + 1);
                        else
                            newItem = new TreeItem(dropItem, SWT.NONE);
                        newItem.setText(text);
                    }
                }
            }
        });
    }

    static Tree createTree(final Shell shell) {
        Tree tree = new Tree(shell, SWT.BORDER);
        for (int i = 0; i < 3; i++) {
            TreeItem item = new TreeItem(tree, SWT.NONE);
            item.setText("item " + i);
            for (int j = 0; j < 3; j++) {
                TreeItem subItem = new TreeItem(item, SWT.NONE);
                subItem.setText("item " + i + " " + j);
                for (int k = 0; k < 3; k++) {
                    TreeItem subsubItem = new TreeItem(subItem, SWT.NONE);
                    subsubItem.setText("item " + i + " " + j + " " + k);
                }
            }
        }

        return tree;
    }
}
分享到:
评论

相关推荐

    drag-drop-folder-tree(功能强大的动态树)

    "drag-drop-folder-tree" 是一个专为实现这种功能而设计的组件,它不仅具备基本的树形展示,还提供了额外的交互功能,如节点的拖放操作和右键点击菜单。 动态树的核心特点在于其动态性,这意味着树中的节点可以根据...

    js动态树合集(dtree,dhtmlxtree,drag-drop-tree)

    在给定的压缩包文件中,包含了几种不同的库,如dtree、dhtmlxtree(1.5普通版及1.3专业版)以及drag-drop-tree,这些都是用于实现动态树功能的JavaScript库。接下来,我们将深入探讨这些库及其相关的知识点。 1. ...

    A.Drag.and.Drop.List.Control

    本文将深入探讨如何在MFC环境中实现一个具有拖放功能的列表控件,即"A.Drag.and.Drop.List.Control"。 首先,我们需要了解MFC中的拖放操作基本原理。在MFC中,拖放功能是通过实现OleDragDrop和OleInitialize等接口...

    drag-drop-folder-tree.rar_Tree 菜单_drag drop java_drag-drop-fold

    本文将深入探讨“drag-drop-folder-tree.rar”这个压缩包所包含的资源,它提供了一个强大的动态树视图,支持节点的拖放操作,并且允许用户通过右键点击进行交互。 首先,"Tree 菜单"指的是在图形用户界面中用于展示...

    drag-drop-folder-tree.zip_ajax_dhtmlxtree dr_drop_tree_tree ja

    在这个特定的例子"drag-drop-folder-tree.zip_ajax_dhtmlxtree_dr_drop_tree_tree_ja"中,开发者利用JavaScript的特性实现了一个拖放功能,这在AJAX(Asynchronous JavaScript and XML)开发中非常常见。AJAX允许...

    drag-drop-folder-tree.rar_Do You

    A folder tree with support for drag and drop. Rearrange the nodes in the tree by dragging and dropping them like you do with folders in a file manager or in a mail program(Outlook, Thunderbird etc.). ...

    drag-drop-folder-tree.rar

    1. **HTML5 Drag and Drop API**: 这是实现拖放功能的基础,它允许开发者创建可拖动元素,并定义它们在何处可以被放置。HTML5中的`draggable`属性设置为`true`,即可使元素具有拖放功能。同时,通过监听`dragstart`...

    ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局

    在"ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局"中,我们将会探讨以下几个核心概念: 1. **Drag and Drop(拖放)**: ExtJS4提供了完善的拖放支持,允许用户通过鼠标操作在界面上移动元素...

    YUI3 实现overlay展开是tree,并且树节点可以拖拽-drag和drop

    在这个场景中,我们讨论的是如何使用`YUI3`实现一个特殊的组件——一个可展开的`Overlay`,它内部展示了一个树形结构(Tree),并且树节点支持拖放(Drag and Drop)功能。 首先,`Overlay`是`YUI3`中的一个基础...

    dragtree.zip

    在给定的"dragtree.zip"文件中,我们关注的是一个特定的前端应用场景,即如何利用Vue.js、Element UI和ZTree库来实现表格(table)与树形结构(tree)之间的数据拖放功能。下面将详细解释这个场景涉及的技术和知识点...

    VC.drag.tree.control.design.rar_VC 树形_drop_tree 拖拽_拖拽tree_树 拖拽

    首先,我们需要理解拖放(Drag and Drop)的基本原理。在Windows API中,拖放操作涉及到数据对象、数据源和数据目标。数据对象包含了待拖放的数据,数据源是发起拖放动作的对象,而数据目标则是接收拖放数据的对象。...

    idea中配置tomcat.pdf

    idea中配置tomcat.pdf 用 IntelliJ IDEA 进行开发语言的学习者。 用 IntelliJ IDEA 进行开发语言的开发工作者。 其中对于语言开发学习者我是非常建议你使用 IntelliJ IDEA,因为一些代码格式、命名规范在 IntelliJ...

    mfc_DragTree

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库中的TreeControl来实现树状节点的拖放(Drag and Drop)以及节点合并功能。MFC是Microsoft开发的一个C++类库,它提供了对Windows API的封装,...

    DRAG_EXPAND.rar_tree

    "DRAG_EXPAND"可能是指该控件支持拖放操作(Drag and Drop)和节点的动态展开与折叠功能。拖放操作允许用户通过鼠标将一个项目从一处拖到另一处,而展开和折叠功能则让用户能够方便地查看和隐藏树形结构中的子节点。...

    基于Vue实现可以拖拽的树形表格

    在Vue.js框架中实现一个可拖拽的树形表格是一项技术挑战,涉及到组件设计、事件处理、数据管理和DOM操作...在实际项目中,还可以考虑集成第三方库如`vuedraggable`,它封装了Drag and Drop API,简化了拖放功能的实现。

    jquery-drag-n-drop-tree:管理拖放的小功能和jQuery 中的树

    《jQuery中的拖放树结构:jquery-drag-n-drop-tree实现详解》 在Web开发中,交互性和用户体验是至关重要的元素,而拖放功能是提升用户体验的有效手段之一。jQuery作为一个广泛使用的JavaScript库,提供了丰富的插件...

    easyui datagrid 拖拽到 tree

    要实现拖拽功能,我们需要利用EasyUI提供的drag and drop(DnD)功能。在本案例中,是从datagrid拖拽行到tree,这涉及到对`datagrid-dnd.js`文件的修改。这个文件是EasyUI官方提供的用于实现datagrid内部行拖拽的...

    C++ GUI Programming with Qt 3

    The book starts with "Hello Qt" and quickly moves on to more advanced topics, such as creating custom widgets and providing drag and drop. The book focuses on explaining good idiomatic Qt 3 ...

    拖拽Tree中结点的例子

    在本文中,我们将深入探讨如何实现“拖拽Tree中结点的例子”,这主要涉及使用Adobe Flex的树组件(Tree)来实现节点的拖放(Drag and Drop)功能。Flex是一种基于ActionScript 3.0的开源框架,用于构建富互联网应用...

    vue-drag-tree::palm_tree::deciduous_tree:aVue的拖放树组件|| :sheaf_of_rice:演示

    Vue拖动树 它是一个树组件(Vue2.x),允许您拖放...预习入门指南安装npm install vue-drag-tree --S 要么yarn add vue-drag-tree -S 用法下面的代码来自PS如果您收到有关Vue packages version mismatch错误// Update

Global site tag (gtag.js) - Google Analytics