#import "ITTabView.h"
+/*************************************************************************/
+#pragma mark -
+#pragma mark EVIL HACKERY
+/*************************************************************************/
+
+@interface NSTabViewItem (HACKHACKHACKHACK)
+- (NSRect)_tabRect;
+@end
+
+
@implementation ITTabView
- (id)initWithFrame:(NSRect)frame
{
if ( (self = [super initWithFrame:frame]) ) {
_draggedTab = nil;
+ _allowsDragging = NO;
}
return self;
}
+- (void)setAllowsDragging:(bool)flag
+{
+ _allowsDragging = flag;
+}
+
+- (bool)allowsDragging
+{
+ return _allowsDragging;
+}
+
+- (void)moveTab:(NSTabViewItem *)tab toIndex:(int)index
+{
+ if ([self indexOfTabViewItem:tab] != index)
+ {
+ [tab retain];
+ [self removeTabViewItem:tab];
+ [self insertTabViewItem:tab atIndex:index];
+ [self selectTabViewItem:tab];
+ }
+}
+
- (void)mouseDown:(NSEvent *)event
{
- NSPoint clickedPoint = [self convertPoint:[event locationInWindow] fromView:[[self window] contentView]];
- NSTabViewItem *clickedTab = [self tabViewItemAtPoint:clickedPoint];
- _draggedTab = clickedTab;
+ if ([self allowsDragging]) {
+ 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];
+ if ([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;
}
- _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];
+ if ([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