From 8346a4a220d18b9fc96e4e58727d723c4c87ed07 Mon Sep 17 00:00:00 2001 From: gcasa Date: Tue, 9 Oct 2012 17:29:51 +0000 Subject: [PATCH] Merges from the testplant branch for NSTabView, GSXibLoader. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@35661 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 7 +++ Headers/AppKit/NSTabView.h | 2 +- Source/GSXibLoader.m | 27 ++++++++- Source/NSTabView.m | 113 +++++++++++++++++++------------------ 4 files changed, 91 insertions(+), 58 deletions(-) diff --git a/ChangeLog b/ChangeLog index fb2779ae3..c4514e762 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-10-07 02:12-EDT Gregory John Casamento + + * Headers/AppKit/NSTabView.h + * Source/GSXibLoader.m + * Source/NSTabView.m: Merge changes from TestPlant branch + 2012-10-06 Wolfgang Lux * Source/NSWindow.m (-_checkTrackingRectangles:forEvent:): @@ -12,6 +18,7 @@ * Source/GSToolTips.m (GSTTProvider): Remove view rectangles from GSTTProvider class. They are no longer used. +>>>>>>> .r35660 2012-10-04 Wolfgang Lux Improve keyboard navigation by automatically computing a key view diff --git a/Headers/AppKit/NSTabView.h b/Headers/AppKit/NSTabView.h index 7a5903b6d..b569e3e07 100644 --- a/Headers/AppKit/NSTabView.h +++ b/Headers/AppKit/NSTabView.h @@ -54,8 +54,8 @@ typedef enum { BOOL _draws_background; BOOL _truncated_label; id _delegate; - NSUInteger _selected_item; NSView *_original_nextKeyView; + NSUInteger _selected_item; } - (void)addTabViewItem:(NSTabViewItem *)tabViewItem; - (void)insertTabViewItem:(NSTabViewItem *)tabViewItem diff --git a/Source/GSXibLoader.m b/Source/GSXibLoader.m index a47430911..ae9838ef2 100644 --- a/Source/GSXibLoader.m +++ b/Source/GSXibLoader.m @@ -55,7 +55,9 @@ @end @interface NSCustomObject (NibCompatibility) +- (id) realObject; - (void) setRealObject: (id)obj; +- (NSString *)className; @end @interface NSNibConnector (NibCompatibility) @@ -841,6 +843,19 @@ id obj; NSMutableArray *topLevelObjects = [context objectForKey: NSNibTopLevelObjects]; id owner = [context objectForKey: NSNibOwner]; + id first = nil; + id app = [(NSCustomObject*)[rootObjects objectAtIndex: 2] realObject]; + + // Get the file's owner and NSApplication object references... + if ([[(NSCustomObject*)[rootObjects objectAtIndex: 1] className] isEqualToString: @"FirstResponder"]) + first = [(NSCustomObject*)[rootObjects objectAtIndex: 1] realObject]; + else + NSLog(@"%s:first responder missing\n", __PRETTY_FUNCTION__); + + if ([[(NSCustomObject*)[rootObjects objectAtIndex: 2] className] isEqualToString: @"NSApplication"]) + app = [(NSCustomObject*)[rootObjects objectAtIndex: 2] realObject]; + else + NSLog(@"%s:NSApplication missing\n", __PRETTY_FUNCTION__); // Use the owner as first root object [(NSCustomObject*)[rootObjects objectAtIndex: 0] setRealObject: owner]; @@ -858,7 +873,9 @@ // All top level objects must be released by the caller to avoid // leaking, unless they are going to be released by other nib // objects on behalf of the owner. - RETAIN(obj); + // IGNORE file's owner, first responder and NSApplication instances... + if ((obj != owner) && (obj != first) && (obj != app)) + RETAIN(obj); } if (([obj isKindOfClass: [NSMenu class]]) && @@ -1175,8 +1192,14 @@ - (id) initForReadingWithData: (NSData*)data { NSXMLParser *theParser; + NSData *theData = data; - NSData *theData = [self _preProcessXib: data]; + // If we are in the interface builder app, do not replace + // the existing classes with their custom subclasses. + if([NSClassSwapper isInInterfaceBuilder] == NO) + { + theData = [self _preProcessXib: data]; + } objects = [[NSMutableDictionary alloc] init]; stack = [[NSMutableArray alloc] init]; diff --git a/Source/NSTabView.m b/Source/NSTabView.m index a424fe8cf..3fec26f65 100644 --- a/Source/NSTabView.m +++ b/Source/NSTabView.m @@ -49,6 +49,7 @@ - (NSView *) _lastKeyView; @end + @implementation NSTabView /* @@ -76,8 +77,7 @@ // setup variables ASSIGN(_items, [NSMutableArray array]); ASSIGN(_font, [NSFont systemFontOfSize: 0]); - _selected_item = NSNotFound; - //_selected = nil; + _selected = nil; //_truncated_label = NO; } @@ -112,15 +112,17 @@ - (void) insertTabViewItem: (NSTabViewItem*)tabViewItem atIndex: (NSInteger)index { + if (tabViewItem == nil) + return; + [tabViewItem _setTabView: self]; [_items insertObject: tabViewItem atIndex: index]; + + // If this is the first inserted then select it... + if ([_items count] == 1) + [self selectTabViewItem: tabViewItem]; - if ((_selected_item != NSNotFound) && (index <= _selected_item)) - { - _selected_item++; - } - - if ([_delegate respondsToSelector: + if ([_delegate respondsToSelector: @selector(tabViewDidChangeNumberOfTabViewItems:)]) { [_delegate tabViewDidChangeNumberOfTabViewItems: self]; @@ -132,35 +134,33 @@ - (void) removeTabViewItem: (NSTabViewItem*)tabViewItem { - NSUInteger i = [_items indexOfObject: tabViewItem]; + NSUInteger i = [self indexOfTabViewItem: tabViewItem]; if (i == NSNotFound) return; - if ([tabViewItem isEqual: _selected]) - { - // We cannot call [self selectTabViewItem: nil] here as the delegate might refuse this - [[_selected view] removeFromSuperview]; - _selected = nil; - _selected_item = NSNotFound; - } - + // Do this BEFORE removing from array...in case it gets released... + [tabViewItem _setTabView:nil]; [_items removeObjectAtIndex: i]; - if ((_selected_item != NSNotFound) && (i <= _selected_item)) + if (tabViewItem == _selected) { - _selected_item--; + if ([_items count] == 0) + { + [self selectTabViewItem: nil]; + } + else + { + // Select a new tab index... + NSUInteger newIndex = ((i < [_items count]) ? i : (i-1)); + [self selectTabViewItem: [_items objectAtIndex: newIndex]]; + } } - - if ([_delegate respondsToSelector: - @selector(tabViewDidChangeNumberOfTabViewItems:)]) + + if ([_delegate respondsToSelector: @selector(tabViewDidChangeNumberOfTabViewItems:)]) { [_delegate tabViewDidChangeNumberOfTabViewItems: self]; } - - /* TODO (Optimize) - just mark the tabs rect as needing redisplay unless - removed tab was selected */ - [self setNeedsDisplay: YES]; } - (NSInteger) indexOfTabViewItem: (NSTabViewItem*)tabViewItem @@ -211,43 +211,44 @@ - (void) selectNextTabViewItem: (id)sender { - if ((_selected_item != NSNotFound) && ((_selected_item + 1) < [_items count])) + NSUInteger selected_item = [self indexOfTabViewItem:_selected]; + if (selected_item != NSNotFound) { - [self selectTabViewItemAtIndex: _selected_item + 1]; + [self selectTabViewItemAtIndex: selected_item + 1]; } } - (void) selectPreviousTabViewItem: (id)sender { - if ((_selected_item != NSNotFound) && (_selected_item > 0)) + NSUInteger selected_item = [self indexOfTabViewItem:_selected]; + if (selected_item != NSNotFound) { - [self selectTabViewItemAtIndex: _selected_item - 1]; + [self selectTabViewItemAtIndex: selected_item - 1]; } } - (NSTabViewItem*) selectedTabViewItem { - // FIXME: Why not just return _selected? - if (_selected_item == NSNotFound || [_items count] == 0) - return nil; - return [_items objectAtIndex: _selected_item]; + return _selected; } - (void) selectTabViewItem: (NSTabViewItem*)tabViewItem { BOOL canSelect = YES; + NSView *selectedView = nil; - if ([_delegate respondsToSelector: - @selector(tabView: shouldSelectTabViewItem:)]) + if ([_delegate respondsToSelector: @selector(tabView: shouldSelectTabViewItem:)]) { - canSelect = [_delegate tabView: self - shouldSelectTabViewItem: tabViewItem]; + canSelect = [_delegate tabView: self shouldSelectTabViewItem: tabViewItem]; } - + if (canSelect) { - NSView *selectedView; - + if ([_delegate respondsToSelector: @selector(tabView: willSelectTabViewItem:)]) + { + [_delegate tabView: self willSelectTabViewItem: tabViewItem]; + } + if (_selected != nil) { [_selected _setTabState: NSBackgroundTab]; @@ -255,6 +256,7 @@ /* NB: If [_selected view] is nil this does nothing, which is fine. */ [[_selected view] removeFromSuperview]; + _selected = nil; } if ([_delegate respondsToSelector: @@ -507,12 +509,10 @@ if (anItem != nil && ![anItem isEqual: _selected]) { - GSKeyValueBinding *theBinding; - [self selectTabViewItem: anItem]; - theBinding = [GSKeyValueBinding getBinding: NSSelectedIndexBinding - forObject: self]; + GSKeyValueBinding *theBinding = [GSKeyValueBinding getBinding: NSSelectedIndexBinding + forObject: self]; if (theBinding != nil) [theBinding reverseSetValueFor: NSSelectedIndexBinding]; } @@ -565,13 +565,14 @@ } else { + NSUInteger selected_item = [self indexOfTabViewItem:_selected]; [aCoder encodeObject: _items]; [aCoder encodeObject: _font]; [aCoder encodeValueOfObjCType: @encode(int) at: &_type]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_draws_background]; [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_truncated_label]; [aCoder encodeConditionalObject: _delegate]; - [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &_selected_item]; + [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &selected_item]; } } @@ -579,8 +580,6 @@ { self = [super initWithCoder: aDecoder]; - _selected_item = NSNotFound; - if ([aDecoder allowsKeyedCoding]) { if ([aDecoder containsValueForKey: @"NSAllowTruncatedLabels"]) @@ -654,17 +653,21 @@ [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_draws_background]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_truncated_label]; _delegate = [aDecoder decodeObject]; + + NSUInteger selected_item = NSNotFound; if (version < 3) { - int tmp; + int tmp; [aDecoder decodeValueOfObjCType: @encode(int) at: &tmp]; - _selected_item = tmp; - } + selected_item = tmp; + } else - { - [aDecoder decodeValueOfObjCType: @encode(NSUInteger) at: &_selected_item]; - } - _selected = [_items objectAtIndex: _selected_item]; + { + [aDecoder decodeValueOfObjCType: @encode(NSUInteger) at: &selected_item]; + } + + if (selected_item != NSNotFound) + _selected = [_items objectAtIndex: selected_item]; } return self; }