Removing the use of private CoreGraphics APIs to draw shadows, and replacing with...
[ITKit.git] / ITTabView.m
old mode 100755 (executable)
new mode 100644 (file)
index 9fbfe56..a94825a
@@ -1,50 +1,79 @@
 #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