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(); }
页:
[1]