+- (void)setAllowsDragging:(BOOL)flag {
+ _allowsDragging = flag;
+}
+
+- (BOOL)allowsDragging {
+ return _allowsDragging;
+}
+
+- (void)setRequiredModifiers:(unsigned int)modifiers {
+ _requiredModifiers = modifiers;
+}
+
+- (unsigned int)requiredModifiers {
+ return _requiredModifiers;
+}
+
+- (void)moveTab:(NSTabViewItem *)tab toIndex:(int)index {
+ int oldIndex = [self indexOfTabViewItem:tab];
+ if ((oldIndex != NSNotFound) && (oldIndex != index)) {
+ [tab retain];
+ [self removeTabViewItem:tab];
+ [self insertTabViewItem:tab atIndex:index];
+ [self selectTabViewItem:tab];
+ [tab release];
+ }
+}
+
+- (void)mouseDown:(NSEvent *)event {
+ if ((_requiredModifiers == 0 || ([[NSApp currentEvent] modifierFlags] & _requiredModifiers)) && [self allowsDragging]) {
+ NSPoint clickedPoint;
+ clickedPoint = [self convertPoint:[event locationInWindow] fromView:[[self window] contentView]];
+ NSTabViewItem *clickedTab = [self tabViewItemAtPoint:clickedPoint];
+ _draggedTab = clickedTab;
+ }
+ [super mouseDown:event];
+}
+
+- (void)mouseUp:(NSEvent *)event {
+ if (_draggedTab && [self allowsDragging]) {
+ NSPoint releasedPoint = [self convertPoint:[event locationInWindow] fromView:[[self window] contentView]];
+ NSTabViewItem *releasedTab = [self tabViewItemAtPoint:releasedPoint];
+ if (releasedTab && ![releasedTab isEqualTo:_draggedTab]) {
+ [self moveTab:_draggedTab toIndex:[self indexOfTabViewItem:releasedTab]];
+ }
+ _draggedTab = nil;
+ }
+ [super mouseUp:event];
+}
+
+- (void)mouseDragged:(NSEvent *)event {
+ if (_draggedTab && [self allowsDragging]) {
+ NSPoint currentPoint = [self convertPoint:[event locationInWindow] fromView:[[self window] contentView]];
+ NSTabViewItem *curTab = [self tabViewItemAtPoint:currentPoint];
+ if (curTab && ![curTab isEqualTo:_draggedTab]) {
+ [self moveTab:_draggedTab toIndex:[self indexOfTabViewItem:curTab]];
+ [self selectTabViewItem:_draggedTab];
+ }
+ }
+ [super mouseDragged:event];
+}
+
+@end
\ No newline at end of file