CTabFolder folder = wScriptsFolder;
Tracker t;
public void handleEvent(Event e) {
CTabItem dragItem = folder.getItem(folder.toControl(display.getCursorLocation()));
if (dragItem == null)
return;
// open a tracker with current item's bounds
t = new Tracker(folder, SWT.NONE);
Rectangle[] rects = { dragItem.getBounds() };
t.setRectangles(rects);
t.addListener(SWT.Move, new Listener() {
@Override
public void handleEvent(Event e) {
// when moving the tracker around, set the rectangles to whatever item we're hovering over. if hovering over nothing, no rectangles
Point p = new Point(e.x, e.y); // display coords
Point folderPoint = folder.toControl(p);
CTabItem hoverItem = folder.getItem(folderPoint);
if (hoverItem != null) {
t.setRectangles(new Rectangle[] { hoverItem.getBounds() });
}
else {
t.setRectangles(new Rectangle[0]);
}
}
});
t.setCursor(display.getSystemCursor(SWT.CURSOR_HAND));
t.open();
// user finished dragging the tab around, let's drop it
Point folderPoint = folder.toControl(display.getCursorLocation());
CTabItem dropItem = folder.getItem(folderPoint);
if (dropItem == null || dropItem == dragItem) {
return;
}
// first find out where this is going
int idx = folder.indexOf(dropItem);
if (folder.indexOf(dragItem) < idx) {
idx++;
}
// make a copy of the item we're dragging around, as the original is going to be disposed of
CTabItem newItem = new CTabItem(folder, dragItem.getStyle(), idx);
newItem.setText(dragItem.getText());
newItem.setImage(dragItem.getImage());
Control c = dragItem.getControl();
dragItem.setControl(null);
newItem.setControl(c);
newItem.setData("role", dragItem.getData("role"));
dragItem.dispose();
folder.setSelection(newItem);
folder.redraw();