mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-06-03 13:30:42 +00:00
Merge pull request #281 from gnustep/NSBrowser_branch
Add new 10.6 delegate methods to NSBrowserDelegate
This commit is contained in:
commit
97ea7c5cc5
3 changed files with 868 additions and 728 deletions
|
@ -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>
|
2024-06-28 Gregory John Casamento <greg.casamento@gmail.com>
|
||||||
|
|
||||||
* Headers/AppKit/AppKit.h: Add NSMenuToolbarItem.h
|
* Headers/AppKit/AppKit.h: Add NSMenuToolbarItem.h
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
@class NSEvent;
|
@class NSEvent;
|
||||||
@class NSMatrix;
|
@class NSMatrix;
|
||||||
@class NSScroller;
|
@class NSScroller;
|
||||||
//@class NSBox;
|
@class NSViewController;
|
||||||
|
|
||||||
#if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST)
|
#if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST)
|
||||||
enum _NSBrowserColumnResizingType
|
enum _NSBrowserColumnResizingType
|
||||||
|
@ -62,7 +62,6 @@ APPKIT_EXPORT_CLASS
|
||||||
Class _browserMatrixClass;
|
Class _browserMatrixClass;
|
||||||
NSString *_pathSeparator;
|
NSString *_pathSeparator;
|
||||||
|
|
||||||
//NSBox *_horizontalScrollerBox;
|
|
||||||
NSScroller *_horizontalScroller;
|
NSScroller *_horizontalScroller;
|
||||||
NSTimeInterval _lastKeyPressed;
|
NSTimeInterval _lastKeyPressed;
|
||||||
NSString *_charBuffer;
|
NSString *_charBuffer;
|
||||||
|
@ -99,6 +98,8 @@ APPKIT_EXPORT_CLASS
|
||||||
int _lastVisibleColumn;
|
int _lastVisibleColumn;
|
||||||
NSString *_columnsAutosaveName;
|
NSString *_columnsAutosaveName;
|
||||||
NSBrowserColumnResizingType _columnResizing;
|
NSBrowserColumnResizingType _columnResizing;
|
||||||
|
|
||||||
|
BOOL _itemBasedDelegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -355,6 +356,31 @@ canDragRowsWithIndexes: (NSIndexSet *)rowIndexes
|
||||||
inColumn: (NSInteger)column
|
inColumn: (NSInteger)column
|
||||||
withEvent: (NSEvent *)event;
|
withEvent: (NSEvent *)event;
|
||||||
#endif
|
#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
|
@end
|
||||||
|
|
||||||
#if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST)
|
#if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST)
|
||||||
|
|
|
@ -14,6 +14,9 @@
|
||||||
Date: September 2000
|
Date: September 2000
|
||||||
Author: Fred Kiefer <FredKiefer@gmx.de>
|
Author: Fred Kiefer <FredKiefer@gmx.de>
|
||||||
Date: September 2002
|
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.
|
This file is part of the GNUstep GUI Library.
|
||||||
|
|
||||||
|
@ -34,34 +37,38 @@
|
||||||
Boston, MA 02110-1301, USA.
|
Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <math.h> // (float)rintf(float x)
|
#include <math.h> // (float)rintf(float x}
|
||||||
#import "config.h"
|
#import "config.h"
|
||||||
|
|
||||||
#import <Foundation/NSArray.h>
|
#import <Foundation/NSArray.h>
|
||||||
#import <Foundation/NSDebug.h>
|
#import <Foundation/NSDebug.h>
|
||||||
|
#import <Foundation/NSDictionary.h>
|
||||||
#import <Foundation/NSException.h>
|
#import <Foundation/NSException.h>
|
||||||
#import <Foundation/NSIndexPath.h>
|
#import <Foundation/NSIndexPath.h>
|
||||||
#import <Foundation/NSNotification.h>
|
#import <Foundation/NSNotification.h>
|
||||||
#import <Foundation/NSUserDefaults.h>
|
#import <Foundation/NSUserDefaults.h>
|
||||||
|
|
||||||
|
#import "AppKit/AppKitExceptions.h"
|
||||||
|
#import "AppKit/NSBezierPath.h"
|
||||||
#import "AppKit/NSBrowser.h"
|
#import "AppKit/NSBrowser.h"
|
||||||
#import "AppKit/NSBrowserCell.h"
|
#import "AppKit/NSBrowserCell.h"
|
||||||
#import "AppKit/AppKitExceptions.h"
|
|
||||||
#import "AppKit/NSScroller.h"
|
|
||||||
#import "AppKit/NSCell.h"
|
#import "AppKit/NSCell.h"
|
||||||
#import "AppKit/NSColor.h"
|
#import "AppKit/NSColor.h"
|
||||||
#import "AppKit/NSFont.h"
|
#import "AppKit/NSFont.h"
|
||||||
#import "AppKit/NSScrollView.h"
|
|
||||||
#import "AppKit/NSGraphics.h"
|
#import "AppKit/NSGraphics.h"
|
||||||
#import "AppKit/NSMatrix.h"
|
#import "AppKit/NSMatrix.h"
|
||||||
|
#import "AppKit/NSScroller.h"
|
||||||
|
#import "AppKit/NSScrollView.h"
|
||||||
#import "AppKit/NSTableHeaderCell.h"
|
#import "AppKit/NSTableHeaderCell.h"
|
||||||
#import "AppKit/NSEvent.h"
|
#import "AppKit/NSEvent.h"
|
||||||
|
#import "AppKit/NSViewController.h"
|
||||||
#import "AppKit/NSWindow.h"
|
#import "AppKit/NSWindow.h"
|
||||||
#import "AppKit/NSBezierPath.h"
|
|
||||||
#import "GNUstepGUI/GSTheme.h"
|
|
||||||
|
|
||||||
|
#import "GNUstepGUI/GSTheme.h"
|
||||||
#import "GSGuiPrivate.h"
|
#import "GSGuiPrivate.h"
|
||||||
|
|
||||||
/* Cache */
|
/* Cache */
|
||||||
static CGFloat scrollerWidth; // == [NSScroller scrollerWidth]
|
static CGFloat scrollerWidth; // == [NSScroller scrollerWidth];
|
||||||
static NSTextFieldCell *titleCell;
|
static NSTextFieldCell *titleCell;
|
||||||
static CGFloat browserColumnSeparation;
|
static CGFloat browserColumnSeparation;
|
||||||
static CGFloat browserVerticalPadding;
|
static CGFloat browserVerticalPadding;
|
||||||
|
@ -245,6 +252,7 @@ static BOOL browserUseBezels;
|
||||||
@interface NSBrowser (Private)
|
@interface NSBrowser (Private)
|
||||||
- (NSString *) _getTitleOfColumn: (NSInteger)column;
|
- (NSString *) _getTitleOfColumn: (NSInteger)column;
|
||||||
- (void) _performLoadOfColumn: (NSInteger)column;
|
- (void) _performLoadOfColumn: (NSInteger)column;
|
||||||
|
- (id) _itemForColumn: (NSInteger)column;
|
||||||
- (void) _remapColumnSubviews: (BOOL)flag;
|
- (void) _remapColumnSubviews: (BOOL)flag;
|
||||||
- (void) _setColumnTitlesNeedDisplay;
|
- (void) _setColumnTitlesNeedDisplay;
|
||||||
- (NSBorderType) _resolvedBorderType;
|
- (NSBorderType) _resolvedBorderType;
|
||||||
|
@ -1218,6 +1226,7 @@ static BOOL browserUseBezels;
|
||||||
|
|
||||||
// Perform the data load
|
// Perform the data load
|
||||||
[self _performLoadOfColumn: column];
|
[self _performLoadOfColumn: column];
|
||||||
|
|
||||||
// set last column loaded
|
// set last column loaded
|
||||||
[self setLastColumn: column];
|
[self setLastColumn: column];
|
||||||
|
|
||||||
|
@ -1620,13 +1629,26 @@ static BOOL browserUseBezels;
|
||||||
inRect: (NSRect)aRect
|
inRect: (NSRect)aRect
|
||||||
ofColumn: (NSInteger)column
|
ofColumn: (NSInteger)column
|
||||||
{
|
{
|
||||||
|
NSView *cv = nil;
|
||||||
|
|
||||||
if (!_isTitled || !NSBR_COLUMN_IS_VISIBLE(column))
|
if (!_isTitled || !NSBR_COLUMN_IS_VISIBLE(column))
|
||||||
return;
|
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 setStringValue: title];
|
||||||
[titleCell drawWithFrame: aRect inView: self];
|
[titleCell drawWithFrame: aRect inView: self];
|
||||||
[titleCell setControlView: nil];
|
[titleCell setControlView: cv];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** <p>Returns the height of column titles. The Nextish look returns 21.</p>
|
/** <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. */
|
/* Default to YES for nil delegate. */
|
||||||
_passiveDelegate = YES;
|
_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:
|
if ([anObject respondsToSelector:
|
||||||
@selector(browser:numberOfRowsInColumn:)])
|
@selector(browser:numberOfRowsInColumn:)])
|
||||||
{
|
{
|
||||||
|
@ -2282,6 +2317,7 @@ static BOOL browserUseBezels;
|
||||||
(@selector(browser:numberOfRowsInColumn:)),
|
(@selector(browser:numberOfRowsInColumn:)),
|
||||||
GSNameFromSelector
|
GSNameFromSelector
|
||||||
(@selector(browser:createRowsForColumn:inMatrix:))];
|
(@selector(browser:createRowsForColumn:inMatrix:))];
|
||||||
|
}
|
||||||
|
|
||||||
_browserDelegate = anObject;
|
_browserDelegate = anObject;
|
||||||
}
|
}
|
||||||
|
@ -2519,6 +2555,9 @@ static BOOL browserUseBezels;
|
||||||
_maxVisibleColumns = 3;
|
_maxVisibleColumns = 3;
|
||||||
[self _createColumn];
|
[self _createColumn];
|
||||||
|
|
||||||
|
// Item based delegate, 10.6+
|
||||||
|
_itemBasedDelegate = NO;
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter]
|
[[NSNotificationCenter defaultCenter]
|
||||||
addObserver: self
|
addObserver: self
|
||||||
selector: @selector(_themeDidActivate:)
|
selector: @selector(_themeDidActivate:)
|
||||||
|
@ -2965,6 +3004,9 @@ static BOOL browserUseBezels;
|
||||||
if (_minColumnWidth < 100.0)
|
if (_minColumnWidth < 100.0)
|
||||||
_minColumnWidth = 100.0;
|
_minColumnWidth = 100.0;
|
||||||
|
|
||||||
|
// Item based delegate, 10.6+
|
||||||
|
_itemBasedDelegate = NO;
|
||||||
|
|
||||||
// Horizontal scroller
|
// Horizontal scroller
|
||||||
_scrollerRect.origin.x = bs.width;
|
_scrollerRect.origin.x = bs.width;
|
||||||
_scrollerRect.origin.y = bs.height;
|
_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). */
|
/* Loads column 'column' (asking the delegate). */
|
||||||
- (void) _performLoadOfColumn: (NSInteger)column
|
- (void) _performLoadOfColumn: (NSInteger)column
|
||||||
{
|
{
|
||||||
|
@ -3255,8 +3332,18 @@ static BOOL browserUseBezels;
|
||||||
NSScrollView *sc;
|
NSScrollView *sc;
|
||||||
NSMatrix *matrix;
|
NSMatrix *matrix;
|
||||||
NSInteger i, rows, cols;
|
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
|
// Ask the delegate for the number of rows
|
||||||
rows = [_browserDelegate browser: self numberOfRowsInColumn: column];
|
rows = [_browserDelegate browser: self numberOfRowsInColumn: column];
|
||||||
|
@ -3319,8 +3406,28 @@ static BOOL browserUseBezels;
|
||||||
}
|
}
|
||||||
[sc setDocumentView: matrix];
|
[sc setDocumentView: matrix];
|
||||||
|
|
||||||
// Loading is different based upon passive/active delegate
|
// Loading is different based upon item/passive/active delegate
|
||||||
if (_passiveDelegate)
|
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
|
// Now loop through the cells and load each one
|
||||||
id aCell;
|
id aCell;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue