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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值