六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 125|回复: 0

SWT 可拖拉的CTabFolder

[复制链接]

升级  64.67%

41

主题

41

主题

41

主题

秀才

Rank: 2

积分
147
 楼主| 发表于 2013-2-5 01:27:27 | 显示全部楼层 |阅读模式
原本以为CTabFolder中的元素默认支持可拖拉事件,无奈发现需要自己实现。实现如下代码:
public static void main(String[] args) {        final Display display = new Display();        Shell shell = new Shell(display);        shell.setLayout(new GridLayout());        final CTabFolder tabFolder =  new CTabFolder(shell, SWT.CLOSE | SWT.BORDER | SWT.FLAT);        tabFolder.setSimple(false);        tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));        for (int i = 0; i < 5; i++) {            CTabItem item = new CTabItem(tabFolder, SWT.NONE);            item.setText("item " + i);            Text text = new Text(tabFolder, SWT.BORDER | SWT.MULTI | SWT.VERTICAL);            text.setText("Text control for " + i);            item.setControl(text);        }        Listener listener = new Listener() {            boolean drag = false;            boolean exitDrag = false;            CTabItem dragItem;            Cursor cursorSizeAll = new Cursor(null, SWT.CURSOR_SIZEALL);            Cursor cursorIbeam = new Cursor(null, SWT.CURSOR_NO);            Cursor cursorArrow = new Cursor(null, SWT.CURSOR_ARROW);            public void handleEvent(Event e) {                Point p = new Point(e.x, e.y);                if (e.type == SWT.DragDetect) {                    p = tabFolder.toControl(display.getCursorLocation()); // see eclipse bug 43251                }                switch (e.type) {                    // 拖拉Tab                    case SWT.DragDetect: {                        CTabItem item = tabFolder.getItem(p);                        if (item == null) {                            return;                        }                                                drag = true;                        exitDrag = false;                        dragItem = item;                                                // 换鼠标形状                        tabFolder.getShell().setCursor(cursorIbeam);                        break;                    }                    // 鼠标进入区域                    case SWT.MouseEnter:                        if (exitDrag) {                            exitDrag = false;                            drag = e.button != 0;                        }                        break;                    // 鼠标离开区域                    case SWT.MouseExit:                        if (drag) {                            tabFolder.setInsertMark(null, false);                            exitDrag = true;                            drag = false;                                                        // 换鼠标形状                            tabFolder.getShell().setCursor(cursorArrow);                        }                        break;                    // 松开左键                    case SWT.MouseUp: {                        if (!drag) {                            return;                        }                        tabFolder.setInsertMark(null, false);                        CTabItem item = tabFolder.getItem(new Point(p.x, 1));                                                if (item != null) {                            int index = tabFolder.indexOf(item);                            int newIndex = tabFolder.indexOf(item);                            int oldIndex = tabFolder.indexOf(dragItem);                            if (newIndex != oldIndex) {                                boolean after = newIndex > oldIndex;                                index = after ? index + 1 : index/* - 1*/;                                index = Math.max(0, index);                                                                CTabItem newItem = new CTabItem(tabFolder, SWT.NONE, index);                                newItem.setText(dragItem.getText());                                                                Control c = dragItem.getControl();                                dragItem.setControl(null);                                newItem.setControl(c);                                dragItem.dispose();                                                                tabFolder.setSelection(newItem);                                                            }                        }                        drag = false;                        exitDrag = false;                        dragItem = null;                                                // 换鼠标形状                        tabFolder.getShell().setCursor(cursorArrow);                        break;                    }                    // 鼠标移动                    case SWT.MouseMove: {                        if (!drag) {                            return;                        }                        CTabItem item = tabFolder.getItem(new Point(p.x, 2));                        if (item == null) {                            tabFolder.setInsertMark(null, false);                            return;                        }                        Rectangle rect = item.getBounds();                        boolean after = p.x > rect.x + rect.width / 2;                        tabFolder.setInsertMark(item, after);                                                // 换鼠标形状                        tabFolder.getShell().setCursor(cursorSizeAll);                        break;                    }                }            }        };        tabFolder.addListener(SWT.DragDetect, listener);        tabFolder.addListener(SWT.MouseUp, listener);        tabFolder.addListener(SWT.MouseMove, listener);        tabFolder.addListener(SWT.MouseExit, listener);        tabFolder.addListener(SWT.MouseEnter, listener);        shell.open();        while (!shell.isDisposed()) {            if (!display.readAndDispatch())                display.sleep();        }        display.dispose();    }
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表