`

SWT 可拖拉的CTabFolder

阅读更多
   原本以为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();
    }
分享到:
评论

相关推荐

    org.eclipse.swt.win32

    org.eclipse.swt.custom.CTabFolder2Listener.class org.eclipse.swt.custom.CTabFolderAdapter.class org.eclipse.swt.custom.CTabFolderEvent.class org.eclipse.swt.custom.CTabFolderLayout.class org.eclipse....

    Eclipse_Swt_Jface_核心应用_部分19

    6.4 自定义选项卡(CTabFolder ) 83 6.4.1 带有“关闭”按钮的选项卡 84 6.4.2 带有边框的选项卡 85 6.4.3 显示“最大化/最小化”按钮 85 6.4.4 设置选项卡的颜色和背景图片 85 6.4.5 仿Eclipse编辑区的...

    eclipse开发技术详解第6章 容器

    `CTabFolder`是自定义选项卡,提供了更多的样式和功能,如设置标签颜色、高度和位置。 【带滚动条的面板(ScrolledComposite)】 当组件数量超出屏幕范围时,`ScrolledComposite`可以添加滚动条。不过需要注意,...

    The Rich Ajax Platform

    - **特殊控件**:包括专为Workbench设计的一些特殊控件,如CTabFolder、CBanner等。 - **可编辑组合框**:新的组合框控件允许用户输入。 - **改进的树结构**:增强了树控件的功能,支持列视图。 - **表格增强**:...

    快照:使用JRuby和Glimmer并从Logo和Scratch汲取灵感的Ruby教学游乐场

    有用的链接Java / Eclipse SWT文档-SashForm,CTabFolder等笔记将.mov转换为.gif并尝试优化ffmpeg -i 21-01-24_snap_demo.mov -pix_fmt rgb24 -r 24 -s 1440x900 snap_demo1.gifconvert -layers Optimize snap_demo1...

    简述Eclipse中的CSS编辑器使用

    #org-eclipse-ui-editorss CTabFolder.MPartStack { swt-single: true; } ``` 同时,还可以修改标签的样式,比如切换到经典的2.1和3.x风格,或者调整标签的字体大小。例如,减少标签字体大小的CSS代码如下: ```css...

Global site tag (gtag.js) - Google Analytics