2001-12-17 16:51:51 +00:00
|
|
|
/** <title>NSTabView</title>
|
2000-05-09 05:31:59 +00:00
|
|
|
|
2001-12-17 16:51:51 +00:00
|
|
|
<abstract>The tabular view class</abstract>
|
2000-05-09 05:31:59 +00:00
|
|
|
|
|
|
|
Copyright (C) 1999,2000 Free Software Foundation, Inc.
|
|
|
|
|
2001-12-17 16:51:51 +00:00
|
|
|
Author: Michael Hanni <mhanni@sprintmail.com>
|
2000-05-09 05:31:59 +00:00
|
|
|
Date: 1999
|
|
|
|
|
|
|
|
This file is part of the GNUstep GUI Library.
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
2007-10-29 21:16:17 +00:00
|
|
|
modify it under the terms of the GNU Lesser General Public
|
2000-05-09 05:31:59 +00:00
|
|
|
License as published by the Free Software Foundation; either
|
2008-06-10 04:01:49 +00:00
|
|
|
version 2 of the License, or (at your option) any later version.
|
2000-05-09 05:31:59 +00:00
|
|
|
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2007-10-29 21:16:17 +00:00
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
2000-05-09 05:31:59 +00:00
|
|
|
|
2007-10-29 21:16:17 +00:00
|
|
|
You should have received a copy of the GNU Lesser General Public
|
2000-05-09 05:31:59 +00:00
|
|
|
License along with this library; see the file COPYING.LIB.
|
2007-10-29 21:16:17 +00:00
|
|
|
If not, see <http://www.gnu.org/licenses/> or write to the
|
|
|
|
Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
|
|
|
Boston, MA 02110-1301, USA.
|
2000-05-09 05:31:59 +00:00
|
|
|
*/
|
|
|
|
|
2011-11-02 23:16:38 +00:00
|
|
|
#import <Foundation/NSKeyValueCoding.h>
|
|
|
|
#import <Foundation/NSValue.h>
|
2010-05-24 10:48:14 +00:00
|
|
|
#import "AppKit/NSColor.h"
|
|
|
|
#import "AppKit/NSEvent.h"
|
|
|
|
#import "AppKit/NSFont.h"
|
2011-11-02 23:16:38 +00:00
|
|
|
#import "AppKit/NSFontManager.h"
|
2010-05-24 10:48:14 +00:00
|
|
|
#import "AppKit/NSForm.h"
|
|
|
|
#import "AppKit/NSGraphics.h"
|
|
|
|
#import "AppKit/NSImage.h"
|
2011-11-02 23:16:38 +00:00
|
|
|
#import "AppKit/NSKeyValueBinding.h"
|
2010-05-24 10:48:14 +00:00
|
|
|
#import "AppKit/NSMatrix.h"
|
|
|
|
#import "AppKit/NSTabView.h"
|
|
|
|
#import "AppKit/NSTabViewItem.h"
|
|
|
|
#import "AppKit/NSWindow.h"
|
|
|
|
#import "GNUstepGUI/GSTheme.h"
|
2011-11-02 23:16:38 +00:00
|
|
|
#import "GSBindingHelpers.h"
|
2012-10-04 09:20:08 +00:00
|
|
|
#import "NSViewPrivate.h"
|
|
|
|
|
|
|
|
@interface NSTabViewItem (KeyViewLoop)
|
|
|
|
- (void) _setUpKeyViewLoopWithNextKeyView: (NSView *)nextKeyView;
|
|
|
|
- (NSView *) _lastKeyView;
|
|
|
|
@end
|
1999-06-19 11:44:32 +00:00
|
|
|
|
2012-10-09 17:29:51 +00:00
|
|
|
|
1999-06-19 11:44:32 +00:00
|
|
|
@implementation NSTabView
|
2001-11-04 00:10:46 +00:00
|
|
|
|
2007-03-07 23:15:07 +00:00
|
|
|
/*
|
|
|
|
* Class methods
|
|
|
|
*/
|
|
|
|
+ (void) initialize
|
|
|
|
{
|
|
|
|
if (self == [NSTabView class])
|
|
|
|
{
|
2012-04-10 21:42:25 +00:00
|
|
|
[self setVersion: 3];
|
2011-11-02 23:16:38 +00:00
|
|
|
|
|
|
|
[self exposeBinding: NSSelectedIndexBinding];
|
|
|
|
[self exposeBinding: NSFontBinding];
|
|
|
|
[self exposeBinding: NSFontNameBinding];
|
|
|
|
[self exposeBinding: NSFontSizeBinding];
|
2007-03-07 23:15:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (id) initWithFrame: (NSRect)rect
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2007-02-20 22:04:45 +00:00
|
|
|
self = [super initWithFrame: rect];
|
1999-06-19 11:44:32 +00:00
|
|
|
|
2007-02-20 22:04:45 +00:00
|
|
|
if (self)
|
|
|
|
{
|
|
|
|
// setup variables
|
|
|
|
ASSIGN(_items, [NSMutableArray array]);
|
|
|
|
ASSIGN(_font, [NSFont systemFontOfSize: 0]);
|
2012-10-09 17:29:51 +00:00
|
|
|
_selected = nil;
|
2007-02-20 22:04:45 +00:00
|
|
|
//_truncated_label = NO;
|
|
|
|
}
|
1999-06-19 11:44:32 +00:00
|
|
|
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2000-10-23 07:42:34 +00:00
|
|
|
- (void) dealloc
|
|
|
|
{
|
2012-10-04 09:20:08 +00:00
|
|
|
// Reset the _selected attribute to prevent crash when -dealloc calls
|
|
|
|
// -setNextKeyView:
|
|
|
|
_selected = nil;
|
2012-11-01 00:06:46 +00:00
|
|
|
RELEASE(_items);
|
|
|
|
RELEASE(_font);
|
2000-10-23 07:42:34 +00:00
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
2007-09-10 11:12:44 +00:00
|
|
|
- (BOOL) isFlipped
|
|
|
|
{
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
1999-06-19 11:44:32 +00:00
|
|
|
// tab management.
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) addTabViewItem: (NSTabViewItem*)tabViewItem
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
[self insertTabViewItem: tabViewItem atIndex: [_items count]];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) insertTabViewItem: (NSTabViewItem*)tabViewItem
|
2011-12-17 17:16:09 +00:00
|
|
|
atIndex: (NSInteger)index
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
if (tabViewItem == nil)
|
|
|
|
return;
|
2020-07-26 09:37:25 +00:00
|
|
|
|
|
|
|
if (_items == nil)
|
|
|
|
{
|
|
|
|
ASSIGN(_items, [NSMutableArray array]);
|
|
|
|
}
|
2012-10-09 17:29:51 +00:00
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
[tabViewItem _setTabView: self];
|
2001-11-04 00:10:46 +00:00
|
|
|
[_items insertObject: tabViewItem atIndex: index];
|
2020-07-26 09:37:25 +00:00
|
|
|
|
2012-10-09 17:29:51 +00:00
|
|
|
// If this is the first inserted then select it...
|
|
|
|
if ([_items count] == 1)
|
|
|
|
[self selectTabViewItem: tabViewItem];
|
1999-07-26 06:44:26 +00:00
|
|
|
|
2012-10-09 17:29:51 +00:00
|
|
|
if ([_delegate respondsToSelector:
|
2000-05-09 05:31:59 +00:00
|
|
|
@selector(tabViewDidChangeNumberOfTabViewItems:)])
|
1999-07-26 06:44:26 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
[_delegate tabViewDidChangeNumberOfTabViewItems: self];
|
1999-07-26 06:44:26 +00:00
|
|
|
}
|
2004-11-10 04:36:23 +00:00
|
|
|
|
|
|
|
/* TODO (Optimize) - just mark the tabs rect as needing redisplay */
|
|
|
|
[self setNeedsDisplay: YES];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) removeTabViewItem: (NSTabViewItem*)tabViewItem
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
NSUInteger i = [self indexOfTabViewItem: tabViewItem];
|
1999-06-19 11:44:32 +00:00
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
if (i == NSNotFound)
|
1999-06-19 11:44:32 +00:00
|
|
|
return;
|
|
|
|
|
2012-11-01 00:06:46 +00:00
|
|
|
RETAIN(tabViewItem);
|
2012-10-09 17:29:51 +00:00
|
|
|
// Do this BEFORE removing from array...in case it gets released...
|
2012-11-01 00:06:46 +00:00
|
|
|
[tabViewItem _setTabView: nil];
|
2001-11-04 00:10:46 +00:00
|
|
|
[_items removeObjectAtIndex: i];
|
1999-07-26 06:44:26 +00:00
|
|
|
|
2012-10-09 17:29:51 +00:00
|
|
|
if (tabViewItem == _selected)
|
2007-02-20 22:04:45 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
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]];
|
|
|
|
}
|
2007-02-20 22:04:45 +00:00
|
|
|
}
|
2012-11-01 00:06:46 +00:00
|
|
|
RELEASE(tabViewItem);
|
2012-10-09 17:29:51 +00:00
|
|
|
|
|
|
|
if ([_delegate respondsToSelector: @selector(tabViewDidChangeNumberOfTabViewItems:)])
|
1999-07-26 06:44:26 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
[_delegate tabViewDidChangeNumberOfTabViewItems: self];
|
1999-07-26 06:44:26 +00:00
|
|
|
}
|
2020-01-18 15:03:24 +00:00
|
|
|
|
|
|
|
/* TODO (Optimize) - just mark the tabs rect as needing redisplay */
|
|
|
|
[self setNeedsDisplay: YES];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2011-12-17 17:16:09 +00:00
|
|
|
- (NSInteger) indexOfTabViewItem: (NSTabViewItem*)tabViewItem
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return [_items indexOfObject: tabViewItem];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2011-12-17 17:16:09 +00:00
|
|
|
- (NSInteger) indexOfTabViewItemWithIdentifier: (id)identifier
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2011-12-17 17:16:09 +00:00
|
|
|
NSUInteger howMany = [_items count];
|
|
|
|
NSUInteger i;
|
1999-07-26 06:44:26 +00:00
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
for (i = 0; i < howMany; i++)
|
1999-07-26 06:44:26 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
id anItem = [_items objectAtIndex: i];
|
1999-07-26 06:44:26 +00:00
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
if ([[anItem identifier] isEqual: identifier])
|
1999-07-26 06:44:26 +00:00
|
|
|
return i;
|
|
|
|
}
|
2000-10-20 23:02:57 +00:00
|
|
|
|
1999-07-26 06:44:26 +00:00
|
|
|
return NSNotFound;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2011-12-17 17:16:09 +00:00
|
|
|
- (NSInteger) numberOfTabViewItems
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return [_items count];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2011-12-17 17:16:09 +00:00
|
|
|
- (NSTabViewItem*) tabViewItemAtIndex: (NSInteger)index
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return [_items objectAtIndex: index];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (NSArray*) tabViewItems
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return (NSArray*)_items;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) selectFirstTabViewItem: (id)sender
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2000-05-09 05:31:59 +00:00
|
|
|
[self selectTabViewItemAtIndex: 0];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) selectLastTabViewItem: (id)sender
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
[self selectTabViewItem: [_items lastObject]];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) selectNextTabViewItem: (id)sender
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
NSUInteger selected_item = [self indexOfTabViewItem:_selected];
|
|
|
|
if (selected_item != NSNotFound)
|
2007-02-27 10:47:52 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
[self selectTabViewItemAtIndex: selected_item + 1];
|
2007-02-27 10:47:52 +00:00
|
|
|
}
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) selectPreviousTabViewItem: (id)sender
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
NSUInteger selected_item = [self indexOfTabViewItem:_selected];
|
|
|
|
if (selected_item != NSNotFound)
|
2007-02-27 10:47:52 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
[self selectTabViewItemAtIndex: selected_item - 1];
|
2007-02-27 10:47:52 +00:00
|
|
|
}
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (NSTabViewItem*) selectedTabViewItem
|
1999-07-26 06:44:26 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
return _selected;
|
1999-07-26 06:44:26 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) selectTabViewItem: (NSTabViewItem*)tabViewItem
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
1999-07-26 06:44:26 +00:00
|
|
|
BOOL canSelect = YES;
|
2012-10-09 17:29:51 +00:00
|
|
|
NSView *selectedView = nil;
|
1999-07-26 06:44:26 +00:00
|
|
|
|
2012-11-01 00:06:46 +00:00
|
|
|
if ([_delegate respondsToSelector: @selector(tabView:shouldSelectTabViewItem:)])
|
1999-07-26 06:44:26 +00:00
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
canSelect = [_delegate tabView: self shouldSelectTabViewItem: tabViewItem];
|
1999-07-26 06:44:26 +00:00
|
|
|
}
|
2012-10-09 17:29:51 +00:00
|
|
|
|
1999-07-26 06:44:26 +00:00
|
|
|
if (canSelect)
|
|
|
|
{
|
2012-11-01 00:06:46 +00:00
|
|
|
if ([_delegate respondsToSelector: @selector(tabView:willSelectTabViewItem:)])
|
2012-10-09 17:29:51 +00:00
|
|
|
{
|
|
|
|
[_delegate tabView: self willSelectTabViewItem: tabViewItem];
|
|
|
|
}
|
|
|
|
|
2002-02-26 19:11:21 +00:00
|
|
|
if (_selected != nil)
|
1999-07-26 06:44:26 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
[_selected _setTabState: NSBackgroundTab];
|
2002-02-26 19:11:21 +00:00
|
|
|
|
2007-09-10 11:12:44 +00:00
|
|
|
/* NB: If [_selected view] is nil this does nothing, which
|
2002-02-26 19:11:21 +00:00
|
|
|
is fine. */
|
2007-09-10 11:12:44 +00:00
|
|
|
[[_selected view] removeFromSuperview];
|
|
|
|
}
|
1999-07-26 06:44:26 +00:00
|
|
|
|
2007-02-20 22:04:45 +00:00
|
|
|
_selected = tabViewItem;
|
2001-11-04 00:10:46 +00:00
|
|
|
[_selected _setTabState: NSSelectedTab];
|
2002-02-26 19:11:21 +00:00
|
|
|
selectedView = [_selected view];
|
|
|
|
if (selectedView != nil)
|
2007-09-10 11:12:44 +00:00
|
|
|
{
|
2012-10-04 09:20:08 +00:00
|
|
|
NSView *firstResponder;
|
|
|
|
|
2007-09-10 11:12:44 +00:00
|
|
|
[self addSubview: selectedView];
|
2011-11-02 23:16:38 +00:00
|
|
|
// FIXME: We should not change this mask
|
2012-10-04 09:20:08 +00:00
|
|
|
[selectedView setAutoresizingMask:
|
|
|
|
NSViewWidthSizable | NSViewHeightSizable];
|
2007-09-10 11:12:44 +00:00
|
|
|
[selectedView setFrame: [self contentRect]];
|
2012-10-04 09:20:08 +00:00
|
|
|
firstResponder = [_selected initialFirstResponder];
|
|
|
|
if (firstResponder == nil)
|
|
|
|
{
|
|
|
|
firstResponder = [_selected view];
|
|
|
|
[_selected setInitialFirstResponder: firstResponder];
|
|
|
|
[firstResponder _setUpKeyViewLoopWithNextKeyView:
|
|
|
|
_original_nextKeyView];
|
|
|
|
}
|
|
|
|
[self setNextKeyView: firstResponder];
|
|
|
|
[_window makeFirstResponder: firstResponder];
|
2007-09-10 11:12:44 +00:00
|
|
|
}
|
2002-02-26 19:11:21 +00:00
|
|
|
|
2004-11-10 04:36:23 +00:00
|
|
|
/* Will need to redraw tabs and content area. */
|
2000-10-19 22:47:09 +00:00
|
|
|
[self setNeedsDisplay: YES];
|
2002-02-26 19:11:21 +00:00
|
|
|
|
2001-11-04 00:10:46 +00:00
|
|
|
if ([_delegate respondsToSelector:
|
2012-11-01 00:06:46 +00:00
|
|
|
@selector(tabView:didSelectTabViewItem:)])
|
2007-09-10 11:12:44 +00:00
|
|
|
{
|
|
|
|
[_delegate tabView: self didSelectTabViewItem: _selected];
|
|
|
|
}
|
1999-07-26 06:44:26 +00:00
|
|
|
}
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2011-12-17 17:16:09 +00:00
|
|
|
- (void) selectTabViewItemAtIndex: (NSInteger)index
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2004-11-10 04:36:23 +00:00
|
|
|
if (index < 0 || index >= [_items count])
|
2000-05-09 05:31:59 +00:00
|
|
|
[self selectTabViewItem: nil];
|
|
|
|
else
|
2001-11-04 00:10:46 +00:00
|
|
|
[self selectTabViewItem: [_items objectAtIndex: index]];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2007-02-27 10:47:52 +00:00
|
|
|
- (void) selectTabViewItemWithIdentifier: (id)identifier
|
2003-05-06 04:26:37 +00:00
|
|
|
{
|
2011-12-17 17:16:09 +00:00
|
|
|
NSInteger index = [self indexOfTabViewItemWithIdentifier: identifier];
|
2007-02-27 10:47:52 +00:00
|
|
|
|
2003-05-06 04:26:37 +00:00
|
|
|
[self selectTabViewItemAtIndex: index];
|
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) takeSelectedTabViewItemFromSender: (id)sender
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2011-12-17 17:16:09 +00:00
|
|
|
NSInteger index = -1;
|
2000-05-09 05:31:59 +00:00
|
|
|
|
|
|
|
if ([sender respondsToSelector: @selector(indexOfSelectedItem)] == YES)
|
|
|
|
{
|
|
|
|
index = [sender indexOfSelectedItem];
|
|
|
|
}
|
|
|
|
else if ([sender isKindOfClass: [NSMatrix class]] == YES)
|
|
|
|
{
|
2011-12-17 17:16:09 +00:00
|
|
|
NSInteger cols = [sender numberOfColumns];
|
|
|
|
NSInteger row = [sender selectedRow];
|
|
|
|
NSInteger col = [sender selectedColumn];
|
2000-05-09 05:31:59 +00:00
|
|
|
|
|
|
|
if (row >= 0 && col >= 0)
|
2007-09-10 11:12:44 +00:00
|
|
|
{
|
|
|
|
index = row * cols + col;
|
|
|
|
}
|
2000-05-09 05:31:59 +00:00
|
|
|
}
|
2001-11-04 00:10:46 +00:00
|
|
|
[self selectTabViewItemAtIndex: index];
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) setFont: (NSFont*)font
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
ASSIGN(_font, font);
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (NSFont*) font
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return _font;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) setTabViewType: (NSTabViewType)tabViewType
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
_type = tabViewType;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (NSTabViewType) tabViewType
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return _type;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) setDrawsBackground: (BOOL)flag
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
_draws_background = flag;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL) drawsBackground
|
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return _draws_background;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) setAllowsTruncatedLabels: (BOOL)allowTruncatedLabels
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
_truncated_label = allowTruncatedLabels;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (BOOL) allowsTruncatedLabels
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return _truncated_label;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) setDelegate: (id)anObject
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
_delegate = anObject;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (id) delegate
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
return _delegate;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// content and size
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (NSSize) minimumSize
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2005-11-29 00:16:10 +00:00
|
|
|
switch (_type)
|
|
|
|
{
|
|
|
|
case NSTopTabsBezelBorder:
|
2013-02-22 09:26:55 +00:00
|
|
|
return NSMakeSize(3, 19);
|
2005-11-29 00:16:10 +00:00
|
|
|
case NSNoTabsBezelBorder:
|
2013-02-22 09:26:55 +00:00
|
|
|
return NSMakeSize(3, 3);
|
2007-02-20 22:04:45 +00:00
|
|
|
case NSNoTabsLineBorder:
|
2013-02-22 09:26:55 +00:00
|
|
|
return NSMakeSize(2, 2);
|
2005-11-29 00:16:10 +00:00
|
|
|
case NSBottomTabsBezelBorder:
|
2013-02-22 09:26:55 +00:00
|
|
|
return NSMakeSize(3, 19);
|
2007-02-20 22:04:45 +00:00
|
|
|
case NSLeftTabsBezelBorder:
|
2013-02-22 09:26:55 +00:00
|
|
|
return NSMakeSize(21, 3);
|
2007-02-20 22:04:45 +00:00
|
|
|
case NSRightTabsBezelBorder:
|
2013-02-22 09:26:55 +00:00
|
|
|
return NSMakeSize(21, 3);
|
2007-02-20 22:04:45 +00:00
|
|
|
case NSNoTabsNoBorder:
|
2005-11-29 00:16:10 +00:00
|
|
|
default:
|
2007-09-10 11:12:44 +00:00
|
|
|
return NSZeroSize;
|
2005-11-29 00:16:10 +00:00
|
|
|
}
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (NSRect) contentRect
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2013-10-15 07:27:44 +00:00
|
|
|
NSRect result = [[GSTheme theme] tabViewContentRectForBounds: _bounds
|
|
|
|
tabViewType: [self tabViewType]
|
|
|
|
tabView: self];
|
|
|
|
return result;
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
1999-06-20 10:13:34 +00:00
|
|
|
// Drawing.
|
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
- (void) drawRect: (NSRect)rect
|
1999-06-20 10:13:34 +00:00
|
|
|
{
|
2012-10-14 19:21:55 +00:00
|
|
|
// Make sure some tab is selected
|
|
|
|
if ((_selected == nil) && ([_items count] > 0))
|
|
|
|
{
|
|
|
|
[self selectFirstTabViewItem: nil];
|
|
|
|
}
|
|
|
|
|
2010-11-26 18:08:58 +00:00
|
|
|
[[GSTheme theme] drawTabViewRect: rect
|
|
|
|
inView: self
|
|
|
|
withItems: _items
|
|
|
|
selectedItem: _selected];
|
1999-06-20 10:13:34 +00:00
|
|
|
}
|
|
|
|
|
2000-01-10 02:04:25 +00:00
|
|
|
- (BOOL) isOpaque
|
|
|
|
{
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
1999-06-19 11:44:32 +00:00
|
|
|
// Event handling.
|
|
|
|
|
2006-05-23 21:15:14 +00:00
|
|
|
/*
|
|
|
|
* Find the tab view item containing the NSPoint point. This point
|
|
|
|
* is expected to be alreay in the coordinate system of the tab view.
|
|
|
|
*/
|
2000-05-09 05:31:59 +00:00
|
|
|
- (NSTabViewItem*) tabViewItemAtPoint: (NSPoint)point
|
1999-06-19 11:44:32 +00:00
|
|
|
{
|
2011-12-17 17:16:09 +00:00
|
|
|
NSInteger howMany = [_items count];
|
|
|
|
NSInteger i;
|
1999-07-09 21:04:00 +00:00
|
|
|
|
2000-05-09 05:31:59 +00:00
|
|
|
for (i = 0; i < howMany; i++)
|
|
|
|
{
|
2001-11-04 00:10:46 +00:00
|
|
|
NSTabViewItem *anItem = [_items objectAtIndex: i];
|
1999-07-09 21:04:00 +00:00
|
|
|
|
2007-02-20 22:04:45 +00:00
|
|
|
if (NSPointInRect(point, [anItem _tabRect]))
|
2007-09-10 11:12:44 +00:00
|
|
|
return anItem;
|
2000-05-09 05:31:59 +00:00
|
|
|
}
|
1999-07-09 21:04:00 +00:00
|
|
|
|
1999-06-19 11:44:32 +00:00
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
2002-02-20 23:13:15 +00:00
|
|
|
- (void) mouseDown: (NSEvent *)theEvent
|
1999-06-21 02:16:37 +00:00
|
|
|
{
|
2006-05-23 21:15:14 +00:00
|
|
|
NSPoint location = [self convertPoint: [theEvent locationInWindow]
|
2007-09-10 11:12:44 +00:00
|
|
|
fromView: nil];
|
2002-02-20 23:13:15 +00:00
|
|
|
NSTabViewItem *anItem = [self tabViewItemAtPoint: location];
|
|
|
|
|
|
|
|
if (anItem != nil && ![anItem isEqual: _selected])
|
1999-07-26 06:44:26 +00:00
|
|
|
{
|
2000-05-09 05:31:59 +00:00
|
|
|
[self selectTabViewItem: anItem];
|
2011-11-02 23:16:38 +00:00
|
|
|
|
2012-10-09 17:29:51 +00:00
|
|
|
GSKeyValueBinding *theBinding = [GSKeyValueBinding getBinding: NSSelectedIndexBinding
|
|
|
|
forObject: self];
|
2011-11-02 23:16:38 +00:00
|
|
|
if (theBinding != nil)
|
|
|
|
[theBinding reverseSetValueFor: NSSelectedIndexBinding];
|
1999-07-10 01:49:18 +00:00
|
|
|
}
|
1999-06-21 02:16:37 +00:00
|
|
|
}
|
1999-06-21 01:53:43 +00:00
|
|
|
|
2002-02-20 23:13:15 +00:00
|
|
|
|
2002-10-13 13:50:06 +00:00
|
|
|
- (NSControlSize) controlSize
|
2001-11-04 00:10:46 +00:00
|
|
|
{
|
|
|
|
// FIXME
|
|
|
|
return NSRegularControlSize;
|
|
|
|
}
|
|
|
|
|
2002-10-13 13:50:06 +00:00
|
|
|
/**
|
|
|
|
* Not implemented.
|
|
|
|
*/
|
|
|
|
- (void) setControlSize: (NSControlSize)controlSize
|
2001-11-04 00:10:46 +00:00
|
|
|
{
|
|
|
|
// FIXME
|
|
|
|
}
|
|
|
|
|
2002-10-13 13:50:06 +00:00
|
|
|
- (NSControlTint) controlTint
|
2001-11-04 00:10:46 +00:00
|
|
|
{
|
|
|
|
// FIXME
|
|
|
|
return NSDefaultControlTint;
|
|
|
|
}
|
|
|
|
|
2002-10-13 13:50:06 +00:00
|
|
|
/**
|
|
|
|
* Not implemented.
|
|
|
|
*/
|
|
|
|
- (void) setControlTint: (NSControlTint)controlTint
|
2001-11-04 00:10:46 +00:00
|
|
|
{
|
|
|
|
// FIXME
|
|
|
|
}
|
|
|
|
|
1999-06-19 11:44:32 +00:00
|
|
|
// Coding.
|
|
|
|
|
|
|
|
- (void) encodeWithCoder: (NSCoder*)aCoder
|
|
|
|
{
|
|
|
|
[super encodeWithCoder: aCoder];
|
2006-08-09 01:37:32 +00:00
|
|
|
if ([aCoder allowsKeyedCoding])
|
|
|
|
{
|
2007-03-07 23:15:07 +00:00
|
|
|
unsigned int type = _type; // no flags set...
|
2006-08-16 04:54:25 +00:00
|
|
|
|
2006-08-09 01:37:32 +00:00
|
|
|
[aCoder encodeBool: [self allowsTruncatedLabels] forKey: @"NSAllowTruncatedLabels"];
|
|
|
|
[aCoder encodeBool: [self drawsBackground] forKey: @"NSDrawsBackground"];
|
|
|
|
[aCoder encodeObject: [self font] forKey: @"NSFont"];
|
|
|
|
[aCoder encodeObject: _items forKey: @"NSTabViewItems"];
|
|
|
|
[aCoder encodeObject: [self selectedTabViewItem] forKey: @"NSSelectedTabViewItem"];
|
2007-03-07 23:15:07 +00:00
|
|
|
[aCoder encodeInt: type forKey: @"NSTvFlags"];
|
2006-08-09 01:37:32 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
NSUInteger selected_item = [self indexOfTabViewItem:_selected];
|
2006-08-09 01:37:32 +00:00
|
|
|
[aCoder encodeObject: _items];
|
|
|
|
[aCoder encodeObject: _font];
|
2010-12-27 11:57:04 +00:00
|
|
|
[aCoder encodeValueOfObjCType: @encode(int) at: &_type];
|
2006-08-09 01:37:32 +00:00
|
|
|
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &_draws_background];
|
|
|
|
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &_truncated_label];
|
|
|
|
[aCoder encodeConditionalObject: _delegate];
|
2012-10-09 17:29:51 +00:00
|
|
|
[aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &selected_item];
|
2006-08-09 01:37:32 +00:00
|
|
|
}
|
1999-06-19 11:44:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (id) initWithCoder: (NSCoder*)aDecoder
|
|
|
|
{
|
2004-02-08 20:33:07 +00:00
|
|
|
self = [super initWithCoder: aDecoder];
|
1999-06-19 11:44:32 +00:00
|
|
|
|
2004-02-08 20:33:07 +00:00
|
|
|
if ([aDecoder allowsKeyedCoding])
|
|
|
|
{
|
|
|
|
if ([aDecoder containsValueForKey: @"NSAllowTruncatedLabels"])
|
|
|
|
{
|
2007-09-10 11:12:44 +00:00
|
|
|
[self setAllowsTruncatedLabels: [aDecoder decodeBoolForKey:
|
|
|
|
@"NSAllowTruncatedLabels"]];
|
|
|
|
}
|
2004-02-08 20:33:07 +00:00
|
|
|
if ([aDecoder containsValueForKey: @"NSDrawsBackground"])
|
|
|
|
{
|
2007-09-10 11:12:44 +00:00
|
|
|
[self setDrawsBackground: [aDecoder decodeBoolForKey:
|
|
|
|
@"NSDrawsBackground"]];
|
|
|
|
}
|
2004-02-08 20:33:07 +00:00
|
|
|
if ([aDecoder containsValueForKey: @"NSFont"])
|
|
|
|
{
|
2007-09-10 11:12:44 +00:00
|
|
|
[self setFont: [aDecoder decodeObjectForKey: @"NSFont"]];
|
|
|
|
}
|
2011-11-02 23:16:38 +00:00
|
|
|
if ([aDecoder containsValueForKey: @"NSTvFlags"])
|
|
|
|
{
|
|
|
|
int vFlags = [aDecoder decodeIntForKey: @"NSTvFlags"];
|
|
|
|
|
|
|
|
[self setControlTint: ((vFlags & 0x70000000) >> 28)];
|
|
|
|
[self setControlSize: ((vFlags & 0x0c000000) >> 26)];
|
|
|
|
[self setTabViewType: (vFlags & 0x00000007)];
|
|
|
|
}
|
2004-02-08 20:33:07 +00:00
|
|
|
if ([aDecoder containsValueForKey: @"NSTabViewItems"])
|
|
|
|
{
|
2007-09-10 11:12:44 +00:00
|
|
|
ASSIGN(_items, [aDecoder decodeObjectForKey: @"NSTabViewItems"]);
|
2020-07-03 17:37:45 +00:00
|
|
|
[_items makeObjectsPerformSelector: @selector(_setTabView:) withObject: self];
|
2007-09-10 11:12:44 +00:00
|
|
|
}
|
2021-10-27 19:18:23 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
ASSIGN(_items, [NSMutableArray array]);
|
|
|
|
}
|
2004-02-08 20:33:07 +00:00
|
|
|
if ([aDecoder containsValueForKey: @"NSSelectedTabViewItem"])
|
|
|
|
{
|
2013-10-15 06:17:36 +00:00
|
|
|
// N.B.: As a side effect, this discards the subview frame
|
|
|
|
// and sets it to [self contentRect].
|
|
|
|
//
|
|
|
|
// This is desirable because the subview frame will be different
|
2020-07-03 17:37:45 +00:00
|
|
|
// depending on whether the archive is from Cocoa or GNUstep,
|
2013-10-15 06:17:36 +00:00
|
|
|
// and which GNUstep theme was active at save time.
|
|
|
|
//
|
|
|
|
// However, it does mean that the tab view contents should be
|
|
|
|
// prepared to resize slightly.
|
2007-09-10 11:12:44 +00:00
|
|
|
[self selectTabViewItem: [aDecoder decodeObjectForKey:
|
|
|
|
@"NSSelectedTabViewItem"]];
|
|
|
|
}
|
2004-02-08 20:33:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-03-07 23:15:07 +00:00
|
|
|
int version = [aDecoder versionForClassName: @"NSTabView"];
|
|
|
|
|
2004-02-08 20:33:07 +00:00
|
|
|
[aDecoder decodeValueOfObjCType: @encode(id) at: &_items];
|
|
|
|
[aDecoder decodeValueOfObjCType: @encode(id) at: &_font];
|
2010-12-27 11:57:04 +00:00
|
|
|
[aDecoder decodeValueOfObjCType: @encode(int) at: &_type];
|
2007-03-07 23:15:07 +00:00
|
|
|
if (version < 2)
|
|
|
|
{
|
2007-09-10 11:12:44 +00:00
|
|
|
switch(_type)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
_type = NSTopTabsBezelBorder;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
_type = NSLeftTabsBezelBorder;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
_type = NSBottomTabsBezelBorder;
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
_type = NSRightTabsBezelBorder;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
_type = NSNoTabsBezelBorder;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
_type = NSNoTabsLineBorder;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
_type = NSNoTabsNoBorder;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2004-02-08 20:33:07 +00:00
|
|
|
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_draws_background];
|
|
|
|
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_truncated_label];
|
|
|
|
_delegate = [aDecoder decodeObject];
|
2012-10-09 17:29:51 +00:00
|
|
|
|
|
|
|
NSUInteger selected_item = NSNotFound;
|
2012-04-10 21:42:25 +00:00
|
|
|
if (version < 3)
|
|
|
|
{
|
2012-10-09 17:29:51 +00:00
|
|
|
int tmp;
|
2012-04-10 21:42:25 +00:00
|
|
|
[aDecoder decodeValueOfObjCType: @encode(int) at: &tmp];
|
2012-10-09 17:29:51 +00:00
|
|
|
selected_item = tmp;
|
|
|
|
}
|
2012-04-10 21:42:25 +00:00
|
|
|
else
|
2012-10-09 17:29:51 +00:00
|
|
|
{
|
|
|
|
[aDecoder decodeValueOfObjCType: @encode(NSUInteger) at: &selected_item];
|
|
|
|
}
|
2013-10-15 06:17:36 +00:00
|
|
|
|
|
|
|
// N.B. Recalculates subview frame; see comment above.
|
|
|
|
[self selectTabViewItemAtIndex: selected_item];
|
2004-02-08 20:33:07 +00:00
|
|
|
}
|
1999-06-19 11:44:32 +00:00
|
|
|
return self;
|
|
|
|
}
|
2011-11-02 23:16:38 +00:00
|
|
|
|
|
|
|
- (void) setValue: (id)anObject forKey: (NSString*)aKey
|
|
|
|
{
|
|
|
|
if ([aKey isEqual: NSSelectedIndexBinding])
|
|
|
|
{
|
|
|
|
[self selectTabViewItemAtIndex: [anObject intValue]];
|
|
|
|
}
|
|
|
|
else if ([aKey isEqual: NSFontNameBinding])
|
|
|
|
{
|
|
|
|
[self setFont: [[NSFontManager sharedFontManager] convertFont: [self font]
|
|
|
|
toFace: anObject]];
|
|
|
|
}
|
|
|
|
else if ([aKey isEqual: NSFontSizeBinding])
|
|
|
|
{
|
|
|
|
[self setFont: [[NSFontManager sharedFontManager] convertFont: [self font]
|
|
|
|
toSize: [anObject doubleValue]]];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
[super setValue: anObject forKey: aKey];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (id) valueForKey: (NSString*)aKey
|
|
|
|
{
|
|
|
|
if ([aKey isEqual: NSSelectedIndexBinding])
|
|
|
|
{
|
|
|
|
return [NSNumber numberWithInt: [self indexOfTabViewItem:
|
|
|
|
[self selectedTabViewItem]]];
|
|
|
|
}
|
|
|
|
else if ([aKey isEqual: NSFontNameBinding])
|
|
|
|
{
|
|
|
|
return [[self font] fontName];
|
|
|
|
}
|
|
|
|
else if ([aKey isEqual: NSFontSizeBinding])
|
|
|
|
{
|
|
|
|
return [NSNumber numberWithDouble: (double)[[self font] pointSize]];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return [super valueForKey: aKey];
|
|
|
|
}
|
|
|
|
}
|
1999-06-19 11:44:32 +00:00
|
|
|
@end
|
2012-10-04 09:20:08 +00:00
|
|
|
|
|
|
|
@implementation NSTabViewItem (KeyViewLoop)
|
|
|
|
|
|
|
|
- (void) _setUpKeyViewLoopWithNextKeyView: (NSView *)nextKeyView
|
|
|
|
{
|
|
|
|
[self setInitialFirstResponder: [self view]];
|
|
|
|
[[self view] _setUpKeyViewLoopWithNextKeyView: nextKeyView];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSView *) _lastKeyView
|
|
|
|
{
|
|
|
|
NSView *keyView = [self initialFirstResponder];
|
|
|
|
NSView *itemView = [self view];
|
|
|
|
NSView *lastKeyView = nil;
|
|
|
|
NSMutableArray *views = // cycle protection
|
|
|
|
[[NSMutableArray alloc] initWithCapacity: 1 + [[itemView subviews] count]];
|
|
|
|
|
|
|
|
if (keyView == nil && itemView != nil)
|
|
|
|
{
|
|
|
|
[self _setUpKeyViewLoopWithNextKeyView: itemView];
|
|
|
|
}
|
|
|
|
while ([keyView isDescendantOf: itemView] && ![views containsObject: keyView])
|
|
|
|
{
|
|
|
|
[views addObject: keyView];
|
|
|
|
lastKeyView = keyView;
|
|
|
|
keyView = [keyView nextKeyView];
|
|
|
|
}
|
|
|
|
[views release];
|
|
|
|
return lastKeyView;
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation NSTabView (KeyViewLoop)
|
|
|
|
|
|
|
|
- (void) _setUpKeyViewLoopWithNextKeyView: (NSView *)nextKeyView
|
|
|
|
{
|
|
|
|
[_items makeObjectsPerform: @selector(_setUpKeyViewLoopWithNextKeyView:)
|
|
|
|
withObject: nextKeyView];
|
|
|
|
if (_selected)
|
|
|
|
{
|
|
|
|
[super setNextKeyView: [_selected initialFirstResponder]];
|
|
|
|
}
|
|
|
|
[self setNextKeyView: nextKeyView];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setNextKeyView: (NSView *)nextKeyView
|
|
|
|
{
|
|
|
|
_original_nextKeyView = nextKeyView;
|
|
|
|
if (_selected)
|
|
|
|
{
|
|
|
|
[[_selected _lastKeyView] setNextKeyView: nextKeyView];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
[super setNextKeyView: nextKeyView];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|