Merge pull request #281 from gnustep/NSBrowser_branch

Add new 10.6 delegate methods to NSBrowserDelegate
This commit is contained in:
Gregory Casamento 2024-08-18 21:08:54 -04:00 committed by GitHub
commit 97ea7c5cc5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 868 additions and 728 deletions

View file

@ -1,3 +1,10 @@
2024-07-25 Gregory John Casamento <greg.casamento@gmail.com>
* Headers/AppKit/NSBrowser.h: Add declarations for
10.6 delegate methods for item-based browsers.
* Source/NSBrowser.m: Add support for 10.6 item-based
delegate methods.
2024-06-28 Gregory John Casamento <greg.casamento@gmail.com>
* Headers/AppKit/AppKit.h: Add NSMenuToolbarItem.h

View file

@ -42,7 +42,7 @@
@class NSEvent;
@class NSMatrix;
@class NSScroller;
//@class NSBox;
@class NSViewController;
#if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST)
enum _NSBrowserColumnResizingType
@ -62,7 +62,6 @@ APPKIT_EXPORT_CLASS
Class _browserMatrixClass;
NSString *_pathSeparator;
//NSBox *_horizontalScrollerBox;
NSScroller *_horizontalScroller;
NSTimeInterval _lastKeyPressed;
NSString *_charBuffer;
@ -99,6 +98,8 @@ APPKIT_EXPORT_CLASS
int _lastVisibleColumn;
NSString *_columnsAutosaveName;
NSBrowserColumnResizingType _columnResizing;
BOOL _itemBasedDelegate;
}
//
@ -355,6 +356,31 @@ canDragRowsWithIndexes: (NSIndexSet *)rowIndexes
inColumn: (NSInteger)column
withEvent: (NSEvent *)event;
#endif
#if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST)
- (NSInteger) browser: (NSBrowser *)browser
numberOfChildrenOfItem: (id)item;
- (id) browser: (NSBrowser *)browser
child: (NSInteger)index
ofItem: (id)item;
- (BOOL) browser: (NSBrowser *)browser
isLeafItem: (id)item;
- (BOOL) browser: (NSBrowser *)browser
shouldEditItem: (id)item;
- (id) browser: (NSBrowser *)browser
objectValueForItem: (id)item;
- (id) browser: (NSBrowser *)browser
setObjectValue: (id)object
forItem: (id)item;
- (id) rootItemForBrowser: (NSBrowser *)browser;
- (NSViewController *) browser: (NSBrowser *)browser
previewViewControllerForLeafItem: (id)item;
- (NSViewController *) browser: (NSBrowser *)browser
headerViewControllerForItem: (id)item;
- (void) browser: (NSBrowser *)browser
didChangeLastColumn: (NSInteger)oldLastColumn
toColumn: (NSInteger)column;
#endif
@end
#if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST)

View file

@ -14,6 +14,9 @@
Date: September 2000
Author: Fred Kiefer <FredKiefer@gmx.de>
Date: September 2002
Author: Gregory Casamento <greg.casamento@gmail.com>
Date: July 2024
Note: Added support for 10.6+ delegate methods.
This file is part of the GNUstep GUI Library.
@ -34,34 +37,38 @@
Boston, MA 02110-1301, USA.
*/
#include <math.h> // (float)rintf(float x)
#include <math.h> // (float)rintf(float x}
#import "config.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSDebug.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h>
#import <Foundation/NSIndexPath.h>
#import <Foundation/NSNotification.h>
#import <Foundation/NSUserDefaults.h>
#import "AppKit/AppKitExceptions.h"
#import "AppKit/NSBezierPath.h"
#import "AppKit/NSBrowser.h"
#import "AppKit/NSBrowserCell.h"
#import "AppKit/AppKitExceptions.h"
#import "AppKit/NSScroller.h"
#import "AppKit/NSCell.h"
#import "AppKit/NSColor.h"
#import "AppKit/NSFont.h"
#import "AppKit/NSScrollView.h"
#import "AppKit/NSGraphics.h"
#import "AppKit/NSMatrix.h"
#import "AppKit/NSScroller.h"
#import "AppKit/NSScrollView.h"
#import "AppKit/NSTableHeaderCell.h"
#import "AppKit/NSEvent.h"
#import "AppKit/NSViewController.h"
#import "AppKit/NSWindow.h"
#import "AppKit/NSBezierPath.h"
#import "GNUstepGUI/GSTheme.h"
#import "GNUstepGUI/GSTheme.h"
#import "GSGuiPrivate.h"
/* Cache */
static CGFloat scrollerWidth; // == [NSScroller scrollerWidth]
static CGFloat scrollerWidth; // == [NSScroller scrollerWidth];
static NSTextFieldCell *titleCell;
static CGFloat browserColumnSeparation;
static CGFloat browserVerticalPadding;
@ -245,6 +252,7 @@ static BOOL browserUseBezels;
@interface NSBrowser (Private)
- (NSString *) _getTitleOfColumn: (NSInteger)column;
- (void) _performLoadOfColumn: (NSInteger)column;
- (id) _itemForColumn: (NSInteger)column;
- (void) _remapColumnSubviews: (BOOL)flag;
- (void) _setColumnTitlesNeedDisplay;
- (NSBorderType) _resolvedBorderType;
@ -1218,6 +1226,7 @@ static BOOL browserUseBezels;
// Perform the data load
[self _performLoadOfColumn: column];
// set last column loaded
[self setLastColumn: column];
@ -1620,13 +1629,26 @@ static BOOL browserUseBezels;
inRect: (NSRect)aRect
ofColumn: (NSInteger)column
{
NSView *cv = nil;
if (!_isTitled || !NSBR_COLUMN_IS_VISIBLE(column))
return;
// [titleCell setControlView: self];
if (_itemBasedDelegate == YES)
{
SEL sel = @selector(browser:headerViewControllerForItem:);
if ([_browserDelegate respondsToSelector: sel])
{
id item = [self _itemForColumn: column];
NSViewController *vc = nil;
vc = [_browserDelegate browser: self headerViewControllerForItem: item];
cv = [vc view];
}
}
[titleCell setStringValue: title];
[titleCell drawWithFrame: aRect inView: self];
[titleCell setControlView: nil];
[titleCell setControlView: cv];
}
/** <p>Returns the height of column titles. The Nextish look returns 21.</p>
@ -2242,7 +2264,20 @@ static BOOL browserUseBezels;
/* Default to YES for nil delegate. */
_passiveDelegate = YES;
_itemBasedDelegate = NO;
if ([anObject respondsToSelector:
@selector(browser:numberOfChildrenOfItem:)]
&& [anObject respondsToSelector:
@selector(browser:child:ofItem:)]
&& [anObject respondsToSelector:
@selector(browser:isLeafItem:)])
{
_passiveDelegate = NO;
_itemBasedDelegate = YES;
}
else
{
if ([anObject respondsToSelector:
@selector(browser:numberOfRowsInColumn:)])
{
@ -2282,6 +2317,7 @@ static BOOL browserUseBezels;
(@selector(browser:numberOfRowsInColumn:)),
GSNameFromSelector
(@selector(browser:createRowsForColumn:inMatrix:))];
}
_browserDelegate = anObject;
}
@ -2519,6 +2555,9 @@ static BOOL browserUseBezels;
_maxVisibleColumns = 3;
[self _createColumn];
// Item based delegate, 10.6+
_itemBasedDelegate = NO;
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(_themeDidActivate:)
@ -2965,6 +3004,9 @@ static BOOL browserUseBezels;
if (_minColumnWidth < 100.0)
_minColumnWidth = 100.0;
// Item based delegate, 10.6+
_itemBasedDelegate = NO;
// Horizontal scroller
_scrollerRect.origin.x = bs.width;
_scrollerRect.origin.y = bs.height;
@ -3248,6 +3290,41 @@ static BOOL browserUseBezels;
}
}
- (id) _itemForColumn: (NSInteger)column
{
id item = nil;
if (column == 0)
{
item = [_browserDelegate rootItemForBrowser: self];
}
else
{
NSInteger col = column - 1;
NSBrowserColumn *bc;
bc = [_browserColumns objectAtIndex: col];
if (bc != nil)
{
NSMatrix *matrix;
matrix = [bc columnMatrix];
if (matrix != nil)
{
NSArray *selectedCells = [matrix selectedCells];
if (selectedCells != nil && [selectedCells count] > 0)
{
id cell = [selectedCells objectAtIndex: 0];
item = [cell objectValue];
}
}
}
}
return item;
}
/* Loads column 'column' (asking the delegate). */
- (void) _performLoadOfColumn: (NSInteger)column
{
@ -3255,8 +3332,18 @@ static BOOL browserUseBezels;
NSScrollView *sc;
NSMatrix *matrix;
NSInteger i, rows, cols;
id child = nil;
id item = nil;
if (_passiveDelegate)
if (_itemBasedDelegate)
{
item = [self _itemForColumn: column];
// Ask the delegate for the number of rows for a given item...
rows = [_browserDelegate browser: self numberOfChildrenOfItem: item];
cols = 1;
}
else if (_passiveDelegate)
{
// Ask the delegate for the number of rows
rows = [_browserDelegate browser: self numberOfRowsInColumn: column];
@ -3319,8 +3406,28 @@ static BOOL browserUseBezels;
}
[sc setDocumentView: matrix];
// Loading is different based upon passive/active delegate
if (_passiveDelegate)
// Loading is different based upon item/passive/active delegate
if (_itemBasedDelegate)
{
// Iterate over the children for the item....
for (i = 0; i < rows; i++)
{
id aCell = [matrix cellAtRow: i column: 0];
if (![aCell isLoaded])
{
BOOL leaf = YES;
id val = nil;
child = [_browserDelegate browser: self child: i ofItem: item];
leaf = [_browserDelegate browser: self isLeafItem: child];
val = [_browserDelegate browser: self objectValueForItem: child];
[aCell setLeaf: leaf];
[aCell setObjectValue: val];
[aCell setLoaded: YES];
}
}
}
else if (_passiveDelegate)
{
// Now loop through the cells and load each one
id aCell;