#import "ITTabView.h"
+@interface NSTabViewItem (ITTabViewHacks)
+- (NSRect)_tabRect;
+@end
+
@implementation ITTabView
-- (id)initWithFrame:(NSRect)frame
-{
- if ( (self = [super initWithFrame:frame]) ) {
- _draggedTab = nil;
- }
- return self;
-}
-
-- (void)mouseDown:(NSEvent *)event
-{
- NSPoint clickedPoint = [self convertPoint:[event locationInWindow] fromView:[[self window] contentView]];
- NSTabViewItem *clickedTab = [self tabViewItemAtPoint:clickedPoint];
- _draggedTab = clickedTab;
- [super mouseDown:event];
-}
-
-- (void)mouseUp:(NSEvent *)event
-{
- NSPoint releasedPoint = [self convertPoint:[event locationInWindow] fromView:[[self window] contentView]];
- NSTabViewItem *releasedTab = [self tabViewItemAtPoint:releasedPoint];
- if (releasedTab && ![releasedTab isEqualTo:_draggedTab]) {
- int releasedTabIndex = [self indexOfTabViewItem:releasedTab];
- [_draggedTab retain];
- [self removeTabViewItem:_draggedTab];
- [self insertTabViewItem:_draggedTab atIndex:releasedTabIndex];
- [self selectTabViewItem:_draggedTab];
- }
- _draggedTab = nil;
- [super mouseUp:event];
-}
-
-- (void)mouseDragged:(NSEvent *)event
-{
- NSPoint currentPoint = [self convertPoint:[event locationInWindow] fromView:[[self window] contentView]];
- NSTabViewItem *curTab = [self tabViewItemAtPoint:currentPoint];
- if (curTab && ![curTab isEqualTo:_draggedTab]) {
- int curTabIndex = [self indexOfTabViewItem:curTab];
- [_draggedTab retain];
- [self removeTabViewItem:_draggedTab];
- [self insertTabViewItem:_draggedTab atIndex:curTabIndex];
- [self selectTabViewItem:_draggedTab];
- }
- [super mouseDragged:event];
+- (id)initWithFrame:(NSRect)frame {
+ if ((self = [super initWithFrame:frame])) {
+ _draggedTab = nil;
+ _allowsDragging = NO;
+ _requiredModifiers = NSCommandKeyMask;
+ }
+ return self;
}
-@end
+- (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