Remove most uses of the method [NSView -removeSubview:].

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@33047 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2011-05-15 14:42:08 +00:00
parent d199cb565e
commit 6c54fd6be5
7 changed files with 50 additions and 21 deletions

View file

@ -1,3 +1,17 @@
2011-05-15 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSView.m (-removeFromSuperview): Use
removeFromSuperviewWithoutNeedingDisplay.
* Source/GSWindowDecorationView.m: Add method [NSWindow
-_clearContentView] to avoid recursion when removing the content view.
* Source/GSWindowDecorationView.m: Replace the method
-removeSubview: with -willRemoveSubview:.
* Source/NSScrollView.m: Dito.
* Source/NSClipView.m (-initWithCoder:): Use -removeFromSuperview
instead of -removeSubview:.
* Source/NSMenu.m (-setMenuRepresentation:): Dito.
* Source/NSColorPanel.m (-setAccessoryView:): Dito.
2011-05-15 Eric Wasylishen <ewasylishen@gmail.com> 2011-05-15 Eric Wasylishen <ewasylishen@gmail.com>
* Source/NSTextView.m: Use pointing hand cursor for links * Source/NSTextView.m: Use pointing hand cursor for links

View file

@ -38,6 +38,20 @@
#import "NSToolbarFrameworkPrivate.h" #import "NSToolbarFrameworkPrivate.h"
@interface NSWindow (GSWindowDecorationView)
- (void)_clearContentView;
@end
@implementation NSWindow (GSWindowDecorationView)
/* This method prevents a recursion when removing the contet view of a window.
The method [NSWindow -setContentView:] would again lead to a call to -willRemoveSubview:.
*/
- (void)_clearContentView
{
_contentView = nil;
}
@end
@implementation GSWindowDecorationView @implementation GSWindowDecorationView
static inline NSRect RectWithSizeScaledByFactor(NSRect aRect, CGFloat factor) static inline NSRect RectWithSizeScaledByFactor(NSRect aRect, CGFloat factor)
@ -229,21 +243,19 @@ static inline NSRect RectWithSizeScaledByFactor(NSRect aRect, CGFloat factor)
* the old window will automatically disappear (this is how it works * the old window will automatically disappear (this is how it works
* on Apple too). * on Apple too).
*/ */
- (void) removeSubview: (NSView*)aView - (void) willRemoveSubview: (NSView*)aView
{ {
RETAIN(aView);
/* /*
* If the content view is removed (for example, because it was added * If the content view is removed (for example, because it was added
* to another view in another window), we must let the window know. * to another view in another window), we must let the window know.
* Otherwise, it would keep trying to resize/manage it as if it was * Otherwise, it would keep trying to resize/manage it as if it was
* its content view, while it actually is now in another window! * its content view, while it actually is now in another window!
*/ */
[super removeSubview: aView]; [super willRemoveSubview: aView];
if (aView == [_window contentView]) if (aView == [_window contentView])
{ {
[_window setContentView: nil]; [_window _clearContentView];
} }
RELEASE(aView);
} }
- (void) setBackgroundColor: (NSColor *)color - (void) setBackgroundColor: (NSColor *)color

View file

@ -773,6 +773,11 @@ static inline NSRect integralRect (NSRect rect, NSView *view)
- (id) initWithCoder: (NSCoder*)aDecoder - (id) initWithCoder: (NSCoder*)aDecoder
{ {
self = [super initWithCoder: aDecoder]; self = [super initWithCoder: aDecoder];
if (self == nil)
{
return nil;
}
if ([aDecoder allowsKeyedCoding]) if ([aDecoder allowsKeyedCoding])
{ {
[self setAutoresizesSubviews: YES]; [self setAutoresizesSubviews: YES];
@ -793,7 +798,6 @@ static inline NSRect integralRect (NSRect rect, NSView *view)
if ([[self subviews] count] > 0) if ([[self subviews] count] > 0)
{ {
NSRect rect; NSRect rect;
id document = [aDecoder decodeObjectForKey: @"NSDocView"]; id document = [aDecoder decodeObjectForKey: @"NSDocView"];
NSAssert([document class] != [NSCustomView class], NSAssert([document class] != [NSCustomView class],
@ -802,14 +806,13 @@ static inline NSRect integralRect (NSRect rect, NSView *view)
rect.origin = NSZeroPoint; rect.origin = NSZeroPoint;
[document setFrame: rect]; [document setFrame: rect];
RETAIN(document); // prevent it from being released. RETAIN(document); // prevent it from being released.
[self removeSubview: document]; [document removeFromSuperview];
[self setDocumentView: document]; [self setDocumentView: document];
RELEASE(document); RELEASE(document);
} }
} }
else else
{ {
NSView *document;
BOOL temp; BOOL temp;
[self setAutoresizesSubviews: YES]; [self setAutoresizesSubviews: YES];
@ -822,9 +825,11 @@ static inline NSRect integralRect (NSRect rect, NSView *view)
if ([[self subviews] count] > 0) if ([[self subviews] count] > 0)
{ {
document = AUTORELEASE(RETAIN([[self subviews] objectAtIndex: 0])); NSView *document = [[self subviews] objectAtIndex: 0];
[self removeSubview: document]; RETAIN(document); // prevent it from being released.
[document removeFromSuperview];
[self setDocumentView: document]; [self setDocumentView: document];
RELEASE(document);
} }
} }
return self; return self;

View file

@ -547,7 +547,7 @@ static int _gs_gui_color_picker_mode = NSRGBModeColorPanel;
return; return;
if (_accessoryView != nil) if (_accessoryView != nil)
[_splitView removeSubview: _accessoryView]; [_accessoryView removeFromSuperview];
_accessoryView = aView; _accessoryView = aView;
[_splitView addSubview: _accessoryView]; [_splitView addSubview: _accessoryView];
} }

View file

@ -1413,7 +1413,7 @@ static BOOL menuBarVisible = YES;
if (_view != nil) if (_view != nil)
{ {
// remove the old representation // remove the old representation
[contentView removeSubview: _view]; [_view removeFromSuperview];
[_view setMenu: nil]; [_view setMenu: nil];
} }

View file

@ -278,7 +278,7 @@ static float scrollerWidth;
[self tile]; [self tile];
} }
- (void) removeSubview: (NSView *)aView - (void) willRemoveSubview: (NSView *)aView
{ {
if (aView == _contentView) if (aView == _contentView)
{ {
@ -292,7 +292,7 @@ static float scrollerWidth;
{ {
_cornerView = nil; _cornerView = nil;
} }
[super removeSubview: aView]; [super willRemoveSubview: aView];
} }
- (void) setHorizontalScroller: (NSScroller*)aScroller - (void) setHorizontalScroller: (NSScroller*)aScroller

View file

@ -900,8 +900,7 @@ GSSetDragTypes(NSView* obj, NSArray *types)
} }
/** /**
* Removes the receiver from its superviews list of subviews, by * Removes the receiver from its superviews list of subviews.
* invoking the superviews [-removeSubview:] method.
*/ */
- (void) removeFromSuperviewWithoutNeedingDisplay - (void) removeFromSuperviewWithoutNeedingDisplay
{ {
@ -912,10 +911,9 @@ GSSetDragTypes(NSView* obj, NSArray *types)
} }
/** /**
<p> Removes the receiver from its superviews list of subviews, by <p> Removes the receiver from its superviews list of subviews
invoking the superviews -removeSubview: method, and marks the and marks the rectangle that the reciever occupied in the
rectangle that the reciever occupied in the superview as needing superview as needing redisplay. </p>
redisplay. </p>
<p> This is dangerous to use during display, since it alters the <p> This is dangerous to use during display, since it alters the
rectangles needing display. In this case, you can use the rectangles needing display. In this case, you can use the
@ -925,7 +923,7 @@ GSSetDragTypes(NSView* obj, NSArray *types)
if (_super_view != nil) if (_super_view != nil)
{ {
[_super_view setNeedsDisplayInRect: _frame]; [_super_view setNeedsDisplayInRect: _frame];
[_super_view removeSubview: self]; [self removeFromSuperviewWithoutNeedingDisplay];
} }
} }