mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-06-01 20:21:57 +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>
|
||||
|
||||
* Headers/AppKit/AppKit.h: Add NSMenuToolbarItem.h
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue