diff --git a/Source/NSBrowser.m b/Source/NSBrowser.m
index 750469f48..ba8860dbd 100644
--- a/Source/NSBrowser.m
+++ b/Source/NSBrowser.m
@@ -2,7 +2,7 @@
Control to display and select from hierarchal lists
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2002 Free Software Foundation, Inc.
Author: Scott Christley
Date: 1996
@@ -12,6 +12,8 @@
Date: November 1999
Author: Mirko Viviani
Date: September 2000
+ Author: Fred Kiefer
+ Date: September 2002
This file is part of the GNUstep GUI Library.
@@ -46,8 +48,7 @@
#include
#include
#include
-#include
-#include
+#include
#include
#include
@@ -72,7 +73,6 @@ static NSTextFieldCell *titleCell;
BOOL _isLoaded;
id _columnScrollView;
id _columnMatrix;
- int _numberOfRows;
NSString *_columnTitle;
}
@@ -82,8 +82,6 @@ static NSTextFieldCell *titleCell;
- (id) columnScrollView;
- (void) setColumnMatrix: (id)aMatrix;
- (id) columnMatrix;
-- (void) setNumberOfRows: (int)num;
-- (int) numberOfRows;
- (void) setColumnTitle: (NSString *)aString;
- (NSString *) columnTitle;
@end
@@ -137,16 +135,6 @@ static NSTextFieldCell *titleCell;
return _columnMatrix;
}
-- (void) setNumberOfRows: (int)num
-{
- _numberOfRows = num;
-}
-
-- (int) numberOfRows
-{
- return _numberOfRows;
-}
-
- (void) setColumnTitle: (NSString *)aString
{
if (!aString)
@@ -162,15 +150,19 @@ static NSTextFieldCell *titleCell;
- (void) encodeWithCoder: (NSCoder *)aCoder
{
- [aCoder encodeValueOfObjCType: @encode(BOOL) at:&_isLoaded];
+ int dummy = 0;
+
+ [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_isLoaded];
[aCoder encodeObject: _columnScrollView];
[aCoder encodeObject: _columnMatrix];
- [aCoder encodeValueOfObjCType: @encode(int) at:&_numberOfRows];
+ [aCoder encodeValueOfObjCType: @encode(int) at: &dummy];
[aCoder encodeObject: _columnTitle];
}
- (id) initWithCoder: (NSCoder *)aDecoder
{
+ int dummy = 0;
+
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_isLoaded];
_columnScrollView = [aDecoder decodeObject];
if (_columnScrollView)
@@ -178,7 +170,7 @@ static NSTextFieldCell *titleCell;
_columnMatrix = [aDecoder decodeObject];
if (_columnMatrix)
RETAIN(_columnMatrix);
- [aDecoder decodeValueOfObjCType: @encode(int) at: &_numberOfRows];
+ [aDecoder decodeValueOfObjCType: @encode(int) at: &dummy];
_columnTitle = [aDecoder decodeObject];
if (_columnTitle)
RETAIN(_columnTitle);
@@ -188,25 +180,10 @@ static NSTextFieldCell *titleCell;
@end
// NB: this is used in the NSFontPanel too
-@interface GSBrowserTitleCell: NSTextFieldCell
+@interface GSBrowserTitleCell: NSTableHeaderCell
@end
@implementation GSBrowserTitleCell
-- (id) initTextCell: (NSString *)aString
-{
- [super initTextCell: aString];
-
- [self setTextColor: [NSColor windowFrameTextColor]];
- [self setBackgroundColor: [NSColor controlShadowColor]];
- [self setFont: [NSFont titleBarFontOfSize: 0]];
- [self setAlignment: NSCenterTextAlignment];
- _cell.is_editable = NO;
- _cell.is_bezeled = YES;
- _textfieldcell_draws_background = YES;
-
- return self;
-}
-
- (void) drawWithFrame: (NSRect)cellFrame inView: (NSView*)controlView
{
if (NSIsEmptyRect (cellFrame) || ![controlView window])
@@ -227,10 +204,7 @@ static NSTextFieldCell *titleCell;
@interface NSBrowser (Private)
- (NSString *) _getTitleOfColumn: (int)column;
- (void) _performLoadOfColumn: (int)column;
-- (void) _unloadFromColumn: (int)column;
- (void) _remapColumnSubviews: (BOOL)flag;
-- (void) _adjustMatrixOfColumn: (int)column;
-- (void) _setColumnSubviewsNeedDisplay;
- (void) _setColumnTitlesNeedDisplay;
@end
@@ -776,11 +750,8 @@ static NSTextFieldCell *titleCell;
// Update and display title of column
if (_isTitled)
{
- NSString *title = [self _getTitleOfColumn: column];
- [self setTitle: title ofColumn: column];
- [self drawTitle: title
- inRect: [self titleFrameOfColumn: column]
- ofColumn: column];
+ [self drawTitleOfColumn: column
+ inRect: [self titleFrameOfColumn: column]];
}
// Display column
@@ -835,14 +806,56 @@ static NSTextFieldCell *titleCell;
/** Sets the last column to column. */
- (void) setLastColumn: (int)column
{
- if (column < -1)
+ int i, count, num;
+ id bc, sc;
+
+ if (column <= -1)
{
column = -1;
+ _isLoaded = NO;
}
_lastColumnLoaded = column;
- [self _unloadFromColumn: column + 1];
- [self _setColumnTitlesNeedDisplay];
+ // Unloads columns.
+ count = [_browserColumns count];
+ num = [self numberOfVisibleColumns];
+
+ for (i = column + 1; i < count; ++i)
+ {
+ bc = [_browserColumns objectAtIndex: i];
+ sc = [bc columnScrollView];
+
+ if ([bc isLoaded])
+ {
+ // Make the column appear empty by removing the matrix
+ if (sc)
+ {
+ [sc setDocumentView: nil];
+ [sc setNeedsDisplay: YES];
+ }
+ [bc setIsLoaded: NO];
+ [bc setColumnTitle: nil];
+ }
+
+ if (!_reusesColumns && i >= num)
+ {
+ [sc removeFromSuperview];
+ [_browserColumns removeObject: bc];
+ count--;
+ i--;
+ }
+ }
+
+ // Scroll if needed.
+ if ((column < _lastVisibleColumn) && (_firstVisibleColumn > 0))
+ {
+ [self scrollColumnsLeftBy: _lastVisibleColumn - column];
+ }
+ else
+ {
+ [self updateScroller];
+ [self _setColumnTitlesNeedDisplay];
+ }
}
/** Returns the index of the first visible column. */
@@ -947,6 +960,8 @@ static NSTextFieldCell *titleCell;
// Perform the data load
[self _performLoadOfColumn: column];
+ // set last column loaded
+ [self setLastColumn: column];
// Restore the selected cells
if (count > 0)
@@ -965,9 +980,6 @@ static NSTextFieldCell *titleCell;
}
NSZoneFree (NSDefaultMallocZone (), selectedIndexes);
}
-
- // set last column loaded
- [self setLastColumn: column];
}
@@ -1117,18 +1129,18 @@ static NSTextFieldCell *titleCell;
/** Returns the title displayed for the column at index column. */
- (NSString *) titleOfColumn: (int)column
{
- id bc;
+ NSBrowserColumn *bc;
bc = [_browserColumns objectAtIndex: column];
- return [bc columnTitle];
+ return bc->_columnTitle;
}
/** Sets the title of the column at index column to aString. */
- (void) setTitle: (NSString *)aString
ofColumn: (int)column
{
- id bc;
+ NSBrowserColumn *bc;
bc = [_browserColumns objectAtIndex: column];
@@ -1235,26 +1247,24 @@ static NSTextFieldCell *titleCell;
/** Scrolls to make the column at index column visible. */
- (void) scrollColumnToVisible: (int)column
{
- int i;
-
- // If its the last visible column then we are there already
- if (_lastVisibleColumn == column)
- return;
-
// If there are not enough columns to scroll with
// then the column must be visible
if (_lastColumnLoaded + 1 <= [self numberOfVisibleColumns])
return;
- i = _lastVisibleColumn - column;
- if (i > 0)
- [self scrollColumnsLeftBy: i];
- else
- [self scrollColumnsRightBy: (-i)];
+ // If its the last visible column then we are there already
+ if (_lastVisibleColumn < column)
+ {
+ [self scrollColumnsRightBy: (column - _lastVisibleColumn)];
+ }
+ else if (_firstVisibleColumn > column)
+ {
+ [self scrollColumnsLeftBy: (_firstVisibleColumn - column)];
+ }
}
/** Scrolls columns left by shiftAmount columns. */
-- (void)scrollColumnsLeftBy: (int)shiftAmount
+- (void) scrollColumnsLeftBy: (int)shiftAmount
{
// Cannot shift past the zero column
if ((_firstVisibleColumn - shiftAmount) < 0)
@@ -1286,7 +1296,7 @@ static NSTextFieldCell *titleCell;
}
/** Scrolls columns right by shiftAmount columns. */
-- (void)scrollColumnsRightBy: (int)shiftAmount
+- (void) scrollColumnsRightBy: (int)shiftAmount
{
// Cannot shift past the last loaded column
if ((shiftAmount + _lastVisibleColumn) > _lastColumnLoaded)
@@ -1348,7 +1358,7 @@ static NSTextFieldCell *titleCell;
}
/** Scrolls columns left or right based on an NSScroller. */
-- (void)scrollViaScroller: (NSScroller *)sender
+- (void) scrollViaScroller: (NSScroller *)sender
{
NSScrollerPart hit;
@@ -1375,12 +1385,10 @@ static NSTextFieldCell *titleCell;
case NSScrollerKnob:
case NSScrollerKnobSlot:
{
- int num = [self numberOfVisibleColumns];
float f = [sender floatValue];
- float n = _lastColumnLoaded + 1 - num;
_skipUpdateScroller = YES;
- [self scrollColumnToVisible: rintf(f * n) + num - 1];
+ [self scrollColumnToVisible: rintf(f * _lastColumnLoaded)];
_skipUpdateScroller = NO;
}
break;
@@ -1397,13 +1405,13 @@ static NSTextFieldCell *titleCell;
*/
/** Returns whether an NSScroller is used to scroll horizontally. */
-- (BOOL)hasHorizontalScroller
+- (BOOL) hasHorizontalScroller
{
return _hasHorizontalScroller;
}
/** Sets whether an NSScroller is used to scroll horizontally. */
-- (void)setHasHorizontalScroller: (BOOL)flag
+- (void) setHasHorizontalScroller: (BOOL)flag
{
if (_hasHorizontalScroller != flag)
{
@@ -1423,7 +1431,7 @@ static NSTextFieldCell *titleCell;
*/
/** Returns YES if the arrow keys are enabled. */
-- (BOOL)acceptsArrowKeys
+- (BOOL) acceptsArrowKeys
{
return _acceptsArrowKeys;
}
@@ -1518,7 +1526,6 @@ static NSTextFieldCell *titleCell;
{
NSSize bs = _sizeForBorderType (NSBezelBorder);
int i, num, columnCount, delta;
- id bc, sc;
_columnSize.height = _frame.size.height;
@@ -1606,6 +1613,9 @@ static NSTextFieldCell *titleCell;
for (i = _firstVisibleColumn; i <= _lastVisibleColumn; i++)
{
+ id bc, sc;
+ id matrix;
+
bc = [_browserColumns objectAtIndex: i];
if (!(sc = [bc columnScrollView]))
@@ -1615,7 +1625,19 @@ static NSTextFieldCell *titleCell;
}
[sc setFrame: [self frameOfColumn: i]];
- [self _adjustMatrixOfColumn: i];
+ matrix = [bc columnMatrix];
+
+ // Adjust matrix to fit in scrollview if column has been loaded
+ if (matrix && [bc isLoaded])
+ {
+ NSSize cs, ms;
+
+ cs = [sc contentSize];
+ ms = [matrix cellSize];
+ ms.width = cs.width;
+ [matrix setCellSize: ms];
+ [sc setDocumentView: matrix];
+ }
}
if (columnCount != num)
@@ -1646,13 +1668,17 @@ static NSTextFieldCell *titleCell;
- (void) setDelegate: (id)anObject
{
BOOL flag = NO;
- BOOL both = NO;
if ([anObject respondsToSelector:
@selector(browser:numberOfRowsInColumn:)])
{
_passiveDelegate = YES;
flag = YES;
+ if (![anObject respondsToSelector:
+ @selector(browser:willDisplayCell:atRow:column:)])
+ [NSException raise: NSBrowserIllegalDelegateException
+ format: @"(Passive) Delegate does not respond to %s\n",
+ "browser: willDisplayCell: atRow: column: "];
}
if ([anObject respondsToSelector:
@@ -1663,29 +1689,22 @@ static NSTextFieldCell *titleCell;
// If flag is already set
// then delegate must respond to both methods
if (flag)
- both = YES;
+ {
+ [NSException raise: NSBrowserIllegalDelegateException
+ format: @"Delegate responds to both %s and %s\n",
+ "browser: numberOfRowsInColumn: ",
+ "browser: createRowsForColumn: inMatrix: "];
+ }
flag = YES;
}
- if (_passiveDelegate && ![anObject respondsToSelector:
- @selector(browser:willDisplayCell:atRow:column:)])
- [NSException raise: NSBrowserIllegalDelegateException
- format: @"(Passive) Delegate does not respond to %s\n",
- "browser: willDisplayCell: atRow: column: "];
-
if (!flag)
[NSException raise: NSBrowserIllegalDelegateException
format: @"Delegate does not respond to %s or %s\n",
"browser: numberOfRowsInColumn: ",
"browser: createRowsForColumn: inMatrix: "];
- if (both)
- [NSException raise: NSBrowserIllegalDelegateException
- format: @"Delegate responds to both %s and %s\n",
- "browser: numberOfRowsInColumn: ",
- "browser: createRowsForColumn: inMatrix: "];
-
_browserDelegate = anObject;
}
@@ -1825,14 +1844,11 @@ static NSTextFieldCell *titleCell;
// Send the action to target
[self sendAction];
- // Marks titles band as needing display.
- [self _setColumnTitlesNeedDisplay];
-
RELEASE(selectedCells);
}
/** Responds to double-clicks in a column of the NSBrowser. */
-- (void)doDoubleClick: (id)sender
+- (void) doDoubleClick: (id)sender
{
// We have already handled the single click
// so send the double action
@@ -1840,7 +1856,7 @@ static NSTextFieldCell *titleCell;
[self sendAction: _doubleAction to: [self target]];
}
-+ (void)initialize
++ (void) initialize
{
if (self == [NSBrowser class])
{
@@ -1856,7 +1872,7 @@ static NSTextFieldCell *titleCell;
*/
/** Setups browser with frame 'rect'. */
-- (id)initWithFrame: (NSRect)rect
+- (id) initWithFrame: (NSRect)rect
{
NSSize bs;
//NSScroller *hs;
@@ -1915,7 +1931,7 @@ static NSTextFieldCell *titleCell;
return self;
}
-- (void)dealloc
+- (void) dealloc
{
RELEASE(_browserCellPrototype);
RELEASE(_pathSeparator);
@@ -1962,7 +1978,7 @@ static NSTextFieldCell *titleCell;
* Events handling
*/
-- (void)drawRect: (NSRect)rect
+- (void) drawRect: (NSRect)rect
{
NSRectClip(rect);
[[_window backgroundColor] set];
@@ -1984,11 +2000,8 @@ static NSTextFieldCell *titleCell;
NSRect titleRect = [self titleFrameOfColumn: i];
if (NSIntersectsRect (titleRect, rect) == YES)
{
- NSString *title;
-
- title = [self _getTitleOfColumn: i];
- [self setTitle: title ofColumn: i];
- [self drawTitle: title inRect: titleRect ofColumn: i];
+ [self drawTitleOfColumn: i
+ inRect: titleRect];
}
}
}
@@ -2020,11 +2033,11 @@ static NSTextFieldCell *titleCell;
/* Override NSControl handler (prevents highlighting). */
-- (void)mouseDown: (NSEvent *)theEvent
+- (void) mouseDown: (NSEvent *)theEvent
{
}
-- (void)moveLeft:(id)sender
+- (void) moveLeft: (id)sender
{
if (_acceptsArrowKeys)
{
@@ -2053,7 +2066,7 @@ static NSTextFieldCell *titleCell;
}
}
-- (void)moveRight:(id)sender
+- (void) moveRight: (id)sender
{
if (_acceptsArrowKeys)
{
@@ -2380,7 +2393,7 @@ static NSTextFieldCell *titleCell;
*/
/** Returns YES if the alphanumerical keys are enabled. */
-- (BOOL)acceptsAlphaNumericalKeys
+- (BOOL) acceptsAlphaNumericalKeys
{
return _acceptsAlphaNumericalKeys;
}
@@ -2416,57 +2429,7 @@ static NSTextFieldCell *titleCell;
*/
@implementation NSBrowser (Private)
-- (void)_adjustMatrixOfColumn: (int)column
-{
- NSBrowserColumn *bc;
- NSScrollView *sc;
- id matrix;
- NSSize cs, ms;
-
- if (column >= (int)[_browserColumns count])
- return;
-
- bc = [_browserColumns objectAtIndex: column];
-
- sc = [bc columnScrollView];
- matrix = [bc columnMatrix];
-
- // Adjust matrix to fit in scrollview if column has been loaded
- if (sc && matrix && [bc isLoaded])
- {
- cs = [sc contentSize];
- ms = [matrix cellSize];
- ms.width = cs.width;
- [matrix setCellSize: ms];
- [sc setDocumentView: matrix];
- }
-}
-
-#if 0
-- (void)_adjustScrollerFrameOfColumn: (int)column force: (BOOL)flag
-{
- // Only if we've loaded the first column
- if ((_isLoaded) || (flag))
- {
- NSBrowserColumn *bc;
- NSScrollView *sc;
-
- if (column >= (int)[_browserColumns count])
- return;
-
- bc = [_browserColumns objectAtIndex: column];
- sc = [bc columnScrollView];
-
- // Set the scrollview frame
- // Only set before the column has been loaded
- // Or we are being forced
- if (sc && ((![bc isLoaded]) || flag))
- [sc setFrame: [self frameOfInsideOfColumn: column]];
- }
-}
-#endif
-
-- (void)_remapColumnSubviews: (BOOL)fromFirst
+- (void) _remapColumnSubviews: (BOOL)fromFirst
{
id bc, sc;
int i, count;
@@ -2543,11 +2506,22 @@ static NSTextFieldCell *titleCell;
}
/* Loads column 'column' (asking the delegate). */
-- (void)_performLoadOfColumn: (int)column
+- (void) _performLoadOfColumn: (int)column
{
id bc, sc, matrix;
- NSRect matrixRect = {{0, 0}, {100, 100}};
- NSSize matrixIntercellSpace = {0, 0};
+ int i, rows, cols;
+
+ if (_passiveDelegate)
+ {
+ // Ask the delegate for the number of rows
+ rows = [_browserDelegate browser: self numberOfRowsInColumn: column];
+ cols = 1;
+ }
+ else
+ {
+ rows = 0;
+ cols = 0;
+ }
bc = [_browserColumns objectAtIndex: column];
@@ -2556,203 +2530,103 @@ static NSTextFieldCell *titleCell;
matrix = [bc columnMatrix];
- // Loading is different based upon passive/active delegate
- if (_passiveDelegate)
+ if (_reusesColumns && matrix)
{
- // Ask the delegate for the number of rows
- int i, n = [_browserDelegate browser: self numberOfRowsInColumn: column];
+ [matrix renewRows: rows columns: cols];
- if (_reusesColumns && matrix)
- {
- [matrix renewRows: n columns: 1];
- [sc setDocumentView: matrix];
-
- for (i = 0; i < n; i++)
- {
- [[matrix cellAtRow: i column: 0] setLoaded: NO];
- [self loadedCellAtRow: i column: column];
- }
- }
- else
- {
- // create a new col matrix
- matrix = [[_browserMatrixClass alloc]
- initWithFrame: matrixRect
- mode: NSListModeMatrix
- prototype: _browserCellPrototype
- numberOfRows: n
- numberOfColumns: 1];
- [matrix setIntercellSpacing:matrixIntercellSpace];
- [matrix setAllowsEmptySelection: _allowsEmptySelection];
- [matrix setAutoscroll: YES];
- if (!_allowsMultipleSelection)
- {
- [matrix setMode: NSRadioModeMatrix];
- }
- [matrix setTarget: self];
- [matrix setAction: @selector(doClick:)];
- [matrix setDoubleAction: @selector(doDoubleClick:)];
-
- // set new col matrix and release old
- [bc setColumnMatrix: matrix];
- RELEASE (matrix);
- [sc setDocumentView: matrix];
-
- // Now loop through the cells and load each one
- {
- NSBrowserColumn *bc;
- id matrix;
- id aCell;
- bc = [_browserColumns objectAtIndex: column];
- matrix = [bc columnMatrix];
- if (_passiveDelegate || [_browserDelegate respondsToSelector:
- @selector(browser:willDisplayCell:atRow:column:)])
- {
- SEL sel1 = @selector(browser:willDisplayCell:atRow:column:);
- IMP imp1 = [_browserDelegate methodForSelector: sel1];
- SEL sel2 = @selector(cellAtRow:column:);
- IMP imp2 = [matrix methodForSelector: sel2];
- for (i = 0; i < n; i++)
- {
- aCell = (*imp2)(matrix, sel2, i, 0);
- if (![aCell isLoaded])
- {
- (*imp1)(_browserDelegate, sel1, self, aCell, i,
- column);
- [aCell setLoaded: YES];
- }
- }
- }
- }
+ // Mark all the cells as unloaded
+ for (i = 0; i < rows; i++)
+ {
+ [[matrix cellAtRow: i column: 0] setLoaded: NO];
}
}
else
{
- if (_reusesColumns && matrix)
- {
- [matrix renewRows: 0 columns: 1];
- [sc setDocumentView: matrix];
+ NSRect matrixRect = {{0, 0}, {100, 100}};
+ NSSize matrixIntercellSpace = {0, 0};
- [_browserDelegate browser: self
- createRowsForColumn: column
- inMatrix: matrix];
+ // create a new col matrix
+ matrix = [[_browserMatrixClass alloc]
+ initWithFrame: matrixRect
+ mode: NSListModeMatrix
+ prototype: _browserCellPrototype
+ numberOfRows: rows
+ numberOfColumns: cols];
+ [matrix setIntercellSpacing: matrixIntercellSpace];
+ [matrix setAllowsEmptySelection: _allowsEmptySelection];
+ [matrix setAutoscroll: YES];
+ if (!_allowsMultipleSelection)
+ {
+ [matrix setMode: NSRadioModeMatrix];
}
- else
- {
- // create a new col matrix
- matrix = [[_browserMatrixClass alloc]
- initWithFrame: matrixRect
- mode: NSRadioModeMatrix
- prototype: _browserCellPrototype
- numberOfRows: 0
- numberOfColumns: 0];
- [matrix setIntercellSpacing:matrixIntercellSpace];
- [matrix setAllowsEmptySelection: _allowsEmptySelection];
- [matrix setAutoscroll: YES];
- if (_allowsMultipleSelection)
+ [matrix setTarget: self];
+ [matrix setAction: @selector(doClick:)];
+ [matrix setDoubleAction: @selector(doDoubleClick:)];
+
+ // set new col matrix and release old
+ [bc setColumnMatrix: matrix];
+ RELEASE (matrix);
+ }
+ [sc setDocumentView: matrix];
+
+ // Loading is different based upon passive/active delegate
+ if (_passiveDelegate)
+ {
+ // Now loop through the cells and load each one
+ id aCell;
+ SEL sel1 = @selector(browser:willDisplayCell:atRow:column:);
+ IMP imp1 = [_browserDelegate methodForSelector: sel1];
+ SEL sel2 = @selector(cellAtRow:column:);
+ IMP imp2 = [matrix methodForSelector: sel2];
+
+ for (i = 0; i < rows; i++)
+ {
+ aCell = (*imp2)(matrix, sel2, i, 0);
+ if (![aCell isLoaded])
{
- [matrix setMode: NSListModeMatrix];
+ (*imp1)(_browserDelegate, sel1, self, aCell, i,
+ column);
+ [aCell setLoaded: YES];
}
- [matrix setTarget: self];
- [matrix setAction: @selector(doClick:)];
- [matrix setDoubleAction: @selector(doDoubleClick:)];
-
- // set new col matrix and release old
- [bc setColumnMatrix: matrix];
- RELEASE (matrix);
- [sc setDocumentView: matrix];
-
- // Tell the delegate to create the rows
- [_browserDelegate browser: self
- createRowsForColumn: column
- inMatrix: matrix];
}
}
+ else
+ {
+ // Tell the delegate to create the rows
+ [_browserDelegate browser: self
+ createRowsForColumn: column
+ inMatrix: matrix];
+ }
+
+ [sc setNeedsDisplay: YES];
+ [bc setIsLoaded: YES];
/* Determine the height of a cell in the matrix, and set that as the
cellSize of the matrix. */
{
+ NSSize cs, ms;
NSBrowserCell *b = [matrix cellAtRow: 0 column: 0];
-
+
if (b != nil)
{
- [matrix setCellSize: [b cellSize]];
+ ms = [b cellSize];
}
+ else
+ {
+ ms = [matrix cellSize];
+ }
+ cs = [sc contentSize];
+ ms.width = cs.width;
+ [matrix setCellSize: ms];
}
-
- [sc setNeedsDisplay: YES];
- [bc setIsLoaded: YES];
- [self _adjustMatrixOfColumn: column];
+
+ // Get the title even when untiteled, as this may change later.
+ [self setTitle: [self _getTitleOfColumn: column] ofColumn: column];
}
-/* Unloads all columns from and including 'column'. */
-- (void)_unloadFromColumn: (int)column
+/* Get the title of a column. */
+- (NSString *) _getTitleOfColumn: (int)column
{
- int i, count, num;
- id bc, sc;
-
- // Unloads columns.
- count = [_browserColumns count];
- num = [self numberOfVisibleColumns];
-
- for (i = column; i < count; ++i)
- {
- bc = [_browserColumns objectAtIndex: i];
- sc = [bc columnScrollView];
-
- if ([bc isLoaded])
- {
- // Make the column appear empty by removing the matrix
- if (sc)
- {
- [sc setDocumentView: nil];
- [sc setNeedsDisplay: YES];
- }
- [bc setIsLoaded: NO];
- }
-
- if (!_reusesColumns && i >= num)
- {
- [sc removeFromSuperview];
- [_browserColumns removeObject: bc];
- count--;
- i--;
- }
- }
-
- if (column == 0)
- {
- _isLoaded = NO;
- }
-
- // Scrolls if needed.
- if (column <= _lastVisibleColumn)
- {
- [self scrollColumnsLeftBy: _lastVisibleColumn - column + 1];
- }
- [self updateScroller];
-}
-
-/* Marks all visible columns as needing to be redrawn. */
-- (void)_setColumnSubviewsNeedDisplay
-{
- int i;
-
- for (i = _firstVisibleColumn; i <= _lastVisibleColumn; i++)
- {
- [[[_browserColumns objectAtIndex:i] columnScrollView]
- setNeedsDisplay:YES];
- }
-}
-
-
-/* Marks all titles as needing to be redrawn. */
-- (NSString *)_getTitleOfColumn: (int)column
-{
- // If not visible then nothing to display
- if ((column < _firstVisibleColumn) || (column > _lastVisibleColumn))
- return @"";
-
// Ask the delegate for the column title
if ([_browserDelegate respondsToSelector:
@selector(browser:titleOfColumn:)])
@@ -2821,7 +2695,7 @@ static NSTextFieldCell *titleCell;
}
/* Marks all titles as needing to be redrawn. */
-- (void)_setColumnTitlesNeedDisplay
+- (void) _setColumnTitlesNeedDisplay
{
if (_isTitled)
{