#import "ITTabView.h"
-/*************************************************************************/
-#pragma mark -
-#pragma mark EVIL HACKERY
-/*************************************************************************/
-
-@interface NSTabViewItem (HACKHACKHACKHACK)
+@interface NSTabViewItem (ITTabViewHacks)
- (NSRect)_tabRect;
@end
-
@implementation ITTabView
-- (id)initWithFrame:(NSRect)frame
-{
- if ( (self = [super initWithFrame:frame]) ) {
- _draggedTab = nil;
- _allowsDragging = NO;
- }
- return self;
+- (id)initWithFrame:(NSRect)frame {
+ if ((self = [super initWithFrame:frame])) {
+ _draggedTab = nil;
+ _allowsDragging = NO;
+ _requiredModifiers = NSCommandKeyMask;
+ }
+ return self;
+}
+
+- (void)setAllowsDragging:(BOOL)flag {
+ _allowsDragging = flag;
}
-- (void)setAllowsDragging:(bool)flag
-{
- _allowsDragging = flag;
+- (BOOL)allowsDragging {
+ return _allowsDragging;
}
-- (bool)allowsDragging
-{
- return _allowsDragging;
+- (void)setRequiredModifiers:(unsigned int)modifiers {
+ _requiredModifiers = modifiers;
}
-- (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];
- }
+- (unsigned int)requiredModifiers {
+ return _requiredModifiers;
}
-- (void)mouseDown:(NSEvent *)event
-{
- if ([self allowsDragging]) {
- NSPoint clickedPoint = [self convertPoint:[event locationInWindow] fromView:[[self window] contentView]];
- NSTabViewItem *clickedTab = [self tabViewItemAtPoint:clickedPoint];
- _draggedTab = clickedTab;
- }
- [super mouseDown:event];
+- (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)mouseUp:(NSEvent *)event
-{
- 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;
- }
- [super mouseUp:event];
+- (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)mouseDragged:(NSEvent *)event
-{
- 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];
+- (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
+@end
\ No newline at end of file