* Source/NSButtonCell.m ([NSButtonCell -setCellAttribute:to:]):

implemented.
([NSButtonCell -cellAttribute:]): implemented.

* Source/NSPopUpButton.m ([NSPopUpButton -keyDown:]): implemented
keyboard selection.
([NSPopUpButton -resignFirstResponder]): implemented.
([NSPopUpButton -resignKeyWindow]): implemented.

* Source/NSPopUpButtonCell.m ([NSPopUpButtonCell
-drawInteriorWithFrame:inView:]): from -drawWithFrame:inView:

* Source/NSButton.m ([NSButton -becomeFirstResponder]): set cell first
responder.
([NSButton -resignFirstResponder]): likewise.
([NSButton -becomeKeyWindow]): likewise.
([NSButton -resignKeyWindow]): likewise.

* Source/NSBrowserCell.m ([NSBrowserCell -drawInteriorWithFrame:
inView:]): draw correct dotted box.

* Source/NSBrowser.m ([NSBrowser -becomeFirstResponder]): make first
responder the latest column.
([NSBrowser -acceptsFirstResponder]): accepts first responder status.
([NSBrowser -keyDown:]): handle tabs to select next/previous key view.
([NSBrowser -moveRight:]): make browser column the first responder.
([NSBrowser -moveUp:]): likewise.
([NSBrowser -moveDown:]): likewise.
([NSBrowser -moveLeft:]): likewise.
([NSBrowser -_unloadFromColumn:]): remove columns from superview and
array.
([NSBrowser -_remapColumnSubviews:]): set the correct first responder.

* Source/NSWindow.m ([NSWindow -sendEvent:]): retain/release first
responder for keyUp/keyDown events. Discard NSLeftMouseDown for closed
windows.
([NSWindow -dealloc]): release _originalResponder

* Source/NSView.m ([NSView -removeSubview:]): remove next responder.

* Source/NSCell.m ([NSCell -setUpFieldEditorAttributes:]): clear
selected range.
([NSCell -editWithFrame:inView:editor:delegate:event:]): redisplay
textObject after invoking mouseDown:
([NSCell -drawInteriorWithFrame:inView:]): draw dotted-line outline
when first responder.
([NSCell -setCellAttribute:to:]): implemented.

* Source/NSTextView.m ([NSTextView -moveUp:]): don't call
_illegalMovement: for the text field editor.
([NSTextView -moveDown:]): likewise.
([NSTextView -moveLeft:]): likewise.
([NSTextView -moveRight:]): likewise.

* Source/NSTextField.m ([NSTextField -textDidEndEditing:]): fixed
return/tab/backtab text movement code.

* Headers/gnustep/gui/NSGraphics.h: added NSDottedFrameRect prototype.

* Headers/gnustep/gui/NSMatrix.h: added ivars for dotted frame rect.
* Source/NSMatrix.m ([NSMatrix -selectCell:]): implemented.
([NSMatrix -_selectCell:atRow:column:]): new method.
([NSMatrix -selectCellAtRow:column:]): call _selectCell:atRow:column:
([NSMatrix -selectCellWithTag:]): likewise.
([NSMatrix -selectAll:]): Do not select disabled or editable cells.
([NSMatrix -textDidEndEditing:]): fixed return/tab/backtab text
movement code.
([NSMatrix -_selectNextSelectableCellAfterRow:column:]): don't select
disabled cells.
([NSMatrix -_selectPreviousSelectableCellBeforeRow:column:]): likewise.
([NSMatrix -_privateFrame:mode:numberOfRows:numberOfColumns:]): set
dottedRow and dottedColumn.
([NSMatrix -insertRow:withCells:]): likewise.
([NSMatrix -removeColumn:]): likewise.
([NSMatrix -removeRow:]): likewise.
([NSMatrix -mouseDown:]): likewise and discard disabled cells.
([NSMatrix -drawRect:]): set shows cell first responder.
([NSMatrix -becomeFirstResponder]): draw dotted box for cell.
([NSMatrix -resignFirstResponder]): likewise.
([NSMatrix -becomeKeyWindow]): likewise.
([NSMatrix -resignKeyWindow]): likewise.
([NSMatrix -_setNeedsDisplayDottedCell]): likewise.
([NSMatrix -selectTextAtRow:column:]): set shows cell first responder.
([NSMatrix -setState:atRow:column:]): likewise. Deselect previous
selected cell in radio mode.

* Source/NSSavePanel.m (createRowsForColumn:): use _gsSavePanelCompare:
and check extension against _requiredFileType and not "app", "bundle",
etc.
([NSString -_gsSavePanelCompare:]): filename compare.
([NSSavePanel -_initWithoutGModel]): set key view for keyboard
interaction.
([NSSavePanel -keyDown:]): removed.
([NSSavePanel -controlTextDidEndEditing:]): removed.

* Source/NSOpenPanel.m ([NSOpenPanel -_shouldShowExtension:isDir:]):
added isDir argument.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@9473 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
mirko 2001-03-22 00:27:37 +00:00
parent 96b026ab00
commit 5a0ddcdeba
17 changed files with 1001 additions and 290 deletions

100
ChangeLog
View file

@ -1,3 +1,103 @@
2001-03-22 Mirko Viviani <mirko.viviani@rccr.cremona.it>
* Source/NSButtonCell.m ([NSButtonCell -setCellAttribute:to:]):
implemented.
([NSButtonCell -cellAttribute:]): implemented.
* Source/NSPopUpButton.m ([NSPopUpButton -keyDown:]): implemented
keyboard selection.
([NSPopUpButton -resignFirstResponder]): implemented.
([NSPopUpButton -resignKeyWindow]): implemented.
* Source/NSPopUpButtonCell.m ([NSPopUpButtonCell
-drawInteriorWithFrame:inView:]): from -drawWithFrame:inView:
* Source/NSButton.m ([NSButton -becomeFirstResponder]): set cell first
responder.
([NSButton -resignFirstResponder]): likewise.
([NSButton -becomeKeyWindow]): likewise.
([NSButton -resignKeyWindow]): likewise.
* Source/NSBrowserCell.m ([NSBrowserCell -drawInteriorWithFrame:
inView:]): draw correct dotted box.
* Source/NSBrowser.m ([NSBrowser -becomeFirstResponder]): make first
responder the latest column.
([NSBrowser -acceptsFirstResponder]): accepts first responder status.
([NSBrowser -keyDown:]): handle tabs to select next/previous key view.
([NSBrowser -moveRight:]): make browser column the first responder.
([NSBrowser -moveUp:]): likewise.
([NSBrowser -moveDown:]): likewise.
([NSBrowser -moveLeft:]): likewise.
([NSBrowser -_unloadFromColumn:]): remove columns from superview and
array.
([NSBrowser -_remapColumnSubviews:]): set the correct first responder.
* Source/NSWindow.m ([NSWindow -sendEvent:]): retain/release first
responder for keyUp/keyDown events. Discard NSLeftMouseDown for closed
windows.
([NSWindow -dealloc]): release _originalResponder
* Source/NSView.m ([NSView -removeSubview:]): remove next responder.
* Source/NSCell.m ([NSCell -setUpFieldEditorAttributes:]): clear
selected range.
([NSCell -editWithFrame:inView:editor:delegate:event:]): redisplay
textObject after invoking mouseDown:
([NSCell -drawInteriorWithFrame:inView:]): draw dotted-line outline
when first responder.
([NSCell -setCellAttribute:to:]): implemented.
* Source/NSTextView.m ([NSTextView -moveUp:]): don't call
_illegalMovement: for the text field editor.
([NSTextView -moveDown:]): likewise.
([NSTextView -moveLeft:]): likewise.
([NSTextView -moveRight:]): likewise.
* Source/NSTextField.m ([NSTextField -textDidEndEditing:]): fixed
return/tab/backtab text movement code.
* Headers/gnustep/gui/NSGraphics.h: added NSDottedFrameRect prototype.
* Headers/gnustep/gui/NSMatrix.h: added ivars for dotted frame rect.
* Source/NSMatrix.m ([NSMatrix -selectCell:]): implemented.
([NSMatrix -_selectCell:atRow:column:]): new method.
([NSMatrix -selectCellAtRow:column:]): call _selectCell:atRow:column:
([NSMatrix -selectCellWithTag:]): likewise.
([NSMatrix -selectAll:]): Do not select disabled or editable cells.
([NSMatrix -textDidEndEditing:]): fixed return/tab/backtab text
movement code.
([NSMatrix -_selectNextSelectableCellAfterRow:column:]): don't select
disabled cells.
([NSMatrix -_selectPreviousSelectableCellBeforeRow:column:]): likewise.
([NSMatrix -_privateFrame:mode:numberOfRows:numberOfColumns:]): set
dottedRow and dottedColumn.
([NSMatrix -insertRow:withCells:]): likewise.
([NSMatrix -removeColumn:]): likewise.
([NSMatrix -removeRow:]): likewise.
([NSMatrix -mouseDown:]): likewise and discard disabled cells.
([NSMatrix -drawRect:]): set shows cell first responder.
([NSMatrix -becomeFirstResponder]): draw dotted box for cell.
([NSMatrix -resignFirstResponder]): likewise.
([NSMatrix -becomeKeyWindow]): likewise.
([NSMatrix -resignKeyWindow]): likewise.
([NSMatrix -_setNeedsDisplayDottedCell]): likewise.
([NSMatrix -selectTextAtRow:column:]): set shows cell first responder.
([NSMatrix -setState:atRow:column:]): likewise. Deselect previous
selected cell in radio mode.
* Source/NSSavePanel.m (createRowsForColumn:): use _gsSavePanelCompare:
and check extension against _requiredFileType and not "app", "bundle",
etc.
([NSString -_gsSavePanelCompare:]): filename compare.
([NSSavePanel -_initWithoutGModel]): set key view for keyboard
interaction.
([NSSavePanel -keyDown:]): removed.
([NSSavePanel -controlTextDidEndEditing:]): removed.
* Source/NSOpenPanel.m ([NSOpenPanel -_shouldShowExtension:isDir:]):
added isDir argument.
2001-03-21 Richard Frith-Macdonald <richard@brainstorm.co.uk> 2001-03-21 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/NSColor.m: Change archiving/unarchiving of colors to avoid * Source/NSColor.m: Change archiving/unarchiving of colors to avoid

View file

@ -105,6 +105,7 @@ NSRect NSDrawTiledRects(NSRect aRect, const NSRect clipRect,
const NSRectEdge *sides, const float *grays, const NSRectEdge *sides, const float *grays,
int count); int count);
void NSDrawWhiteBezel(const NSRect aRect, const NSRect clipRect); void NSDrawWhiteBezel(const NSRect aRect, const NSRect clipRect);
void NSDottedFrameRect(const NSRect aRect);
void NSFrameRect(const NSRect aRect); void NSFrameRect(const NSRect aRect);
void NSFrameRectWithWidth(const NSRect aRect, float frameWidth); void NSFrameRectWithWidth(const NSRect aRect, float frameWidth);

View file

@ -82,6 +82,8 @@ typedef enum _NSMatrixMode {
BOOL _autosizesCells; BOOL _autosizesCells;
BOOL _autoscroll; BOOL _autoscroll;
id _keyCell; id _keyCell;
int _dottedRow;
int _dottedColumn;
} }
/* /*

View file

@ -49,6 +49,7 @@
#include <AppKit/NSTextFieldCell.h> #include <AppKit/NSTextFieldCell.h>
#include <AppKit/PSOperators.h> #include <AppKit/PSOperators.h>
#include <AppKit/NSEvent.h> #include <AppKit/NSEvent.h>
#include <AppKit/NSWindow.h>
/* Cache */ /* Cache */
static float scrollerWidth; // == [NSScroller scrollerWidth] static float scrollerWidth; // == [NSScroller scrollerWidth]
@ -767,7 +768,7 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
// Create a scrollview // Create a scrollview
sc = [[NSScrollView alloc] sc = [[NSScrollView alloc]
initWithFrame: rect]; initWithFrame: rect];
[sc setHasHorizontalScroller: NO]; [sc setHasHorizontalScroller: NO];
[sc setHasVerticalScroller: YES]; [sc setHasVerticalScroller: YES];
[bc setColumnScrollView: sc]; [bc setColumnScrollView: sc];
@ -780,6 +781,28 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
[self tile]; [self tile];
} }
- (BOOL) acceptsFirstResponder
{
return YES;
}
- (BOOL) becomeFirstResponder
{
NSMatrix *matrix;
int selectedColumn;
selectedColumn = [self selectedColumn];
if (selectedColumn == -1)
matrix = [self matrixInColumn: 0];
else
matrix = [self matrixInColumn: selectedColumn];
if (matrix)
[_window makeFirstResponder: matrix];
return YES;
}
// ------------------- // -------------------
// Updates the NSBrowser to display all loaded columns. // Updates the NSBrowser to display all loaded columns.
// //
@ -2092,7 +2115,7 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
if ([sender class] != _browserMatrixClass) if ([sender class] != _browserMatrixClass)
return; return;
column = [self columnOfMatrix: sender]; column = [self columnOfMatrix: sender];
// If the matrix isn't ours then just return // If the matrix isn't ours then just return
if (column == -1) if (column == -1)
@ -2312,7 +2335,7 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
[NSStringFromRect(rect) cString]); [NSStringFromRect(rect) cString]);
#endif #endif
[super initWithFrame: rect]; self = [super initWithFrame: rect];
// Class setting // Class setting
_browserCellClass = [NSBrowser cellClass]; _browserCellClass = [NSBrowser cellClass];
@ -2518,7 +2541,7 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
- (void)moveUp:(id)sender - (void)moveUp:(id)sender
{ {
if(_acceptsArrowKeys == YES) if (_acceptsArrowKeys == YES)
{ {
NSArray *cells; NSArray *cells;
NSMatrix *matrix; NSMatrix *matrix;
@ -2527,29 +2550,30 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
int selectedRow, oldSelectedRow, selectedColumn, numberOfRows; int selectedRow, oldSelectedRow, selectedColumn, numberOfRows;
selectedColumn = [self selectedColumn]; selectedColumn = [self selectedColumn];
if(selectedColumn == -1) if (selectedColumn == -1)
{ {
matrix = [self matrixInColumn:0]; matrix = [self matrixInColumn: 0];
cells = [matrix cells]; cells = [matrix cells];
numberOfRows = [cells count]; numberOfRows = [cells count];
oldSelectedRow = selectedRow = numberOfRows - 1; oldSelectedRow = selectedRow = numberOfRows - 1;
} }
else else
{ {
matrix = [self matrixInColumn:selectedColumn]; matrix = [self matrixInColumn: selectedColumn];
cells = [matrix cells]; cells = [matrix cells];
numberOfRows = [cells count]; numberOfRows = [cells count];
oldSelectedRow = selectedRow = [matrix selectedRow]; oldSelectedRow = selectedRow = [matrix selectedRow];
} }
while(1) while (1)
{ {
if(selectedColumn == -1) if (selectedColumn == -1)
{ {
if(numberOfRows) if (numberOfRows)
{ {
[matrix selectCellAtRow:selectedRow column:0]; [matrix selectCellAtRow: selectedRow column: 0];
[self doClick:matrix]; [_window makeFirstResponder: matrix];
[self doClick: matrix];
selectedColumn = 0; selectedColumn = 0;
} }
else else
@ -2557,7 +2581,7 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
} }
else else
{ {
if(!selectedRow) if (!selectedRow)
{ {
numberOfRows = [cells count]; numberOfRows = [cells count];
if(numberOfRows <= 1) if(numberOfRows <= 1)
@ -2570,25 +2594,26 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
selectedRow--; selectedRow--;
[matrix deselectAllCells]; [matrix deselectAllCells];
[matrix selectCellAtRow:selectedRow column:0]; [matrix selectCellAtRow: selectedRow column: 0];
[self doClick:matrix]; [_window makeFirstResponder: matrix];
[self doClick: matrix];
} }
selectedCell = [matrix selectedCell]; selectedCell = [matrix selectedCell];
if(selectedCell || if (selectedCell ||
(firstPass == NO && selectedRow == oldSelectedRow)) (firstPass == NO && selectedRow == oldSelectedRow))
break; break;
} }
if(_sendsActionOnArrowKeys == YES) if (_sendsActionOnArrowKeys == YES)
[super sendAction:_action to:_target]; [super sendAction: _action to: _target];
} }
} }
- (void)moveDown:(id)sender - (void)moveDown:(id)sender
{ {
if(_acceptsArrowKeys) if (_acceptsArrowKeys)
{ {
NSArray *cells; NSArray *cells;
NSMatrix *matrix; NSMatrix *matrix;
@ -2597,28 +2622,29 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
int selectedRow, oldSelectedRow, selectedColumn, numberOfRows; int selectedRow, oldSelectedRow, selectedColumn, numberOfRows;
selectedColumn = [self selectedColumn]; selectedColumn = [self selectedColumn];
if(selectedColumn == -1) if (selectedColumn == -1)
{ {
matrix = [self matrixInColumn:0]; matrix = [self matrixInColumn: 0];
oldSelectedRow = selectedRow = 0; oldSelectedRow = selectedRow = 0;
} }
else else
{ {
matrix = [self matrixInColumn:selectedColumn]; matrix = [self matrixInColumn: selectedColumn];
oldSelectedRow = selectedRow = [matrix selectedRow]; oldSelectedRow = selectedRow = [matrix selectedRow];
} }
cells = [matrix cells]; cells = [matrix cells];
numberOfRows = [cells count]; numberOfRows = [cells count];
while(1) while (1)
{ {
if(selectedColumn == -1) if (selectedColumn == -1)
{ {
if(numberOfRows) if (numberOfRows)
{ {
[matrix selectCellAtRow:0 column:0]; [matrix selectCellAtRow: 0 column: 0];
[self doClick:matrix]; [_window makeFirstResponder: matrix];
[self doClick: matrix];
selectedColumn = 0; selectedColumn = 0;
} }
else else
@ -2628,9 +2654,9 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
{ {
selectedRow++; selectedRow++;
if(selectedRow >= numberOfRows) if (selectedRow >= numberOfRows)
{ {
if(numberOfRows <= 1) if (numberOfRows <= 1)
return; return;
selectedRow = 0; selectedRow = 0;
@ -2638,86 +2664,92 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
} }
[matrix deselectAllCells]; [matrix deselectAllCells];
[matrix selectCellAtRow:selectedRow column:0]; [matrix selectCellAtRow: selectedRow column: 0];
[self doClick:matrix]; [_window makeFirstResponder: matrix];
[self doClick: matrix];
} }
selectedCell = [matrix selectedCell]; selectedCell = [matrix selectedCell];
if(selectedCell || if (selectedCell ||
(firstPass == NO && selectedRow == oldSelectedRow)) (firstPass == NO && selectedRow == oldSelectedRow))
break; break;
} }
if(_sendsActionOnArrowKeys == YES) if (_sendsActionOnArrowKeys == YES)
[super sendAction:_action to:_target]; [super sendAction: _action to: _target];
} }
} }
- (void)moveLeft:(id)sender - (void)moveLeft:(id)sender
{ {
if(_acceptsArrowKeys) if (_acceptsArrowKeys)
{ {
NSMatrix *matrix; NSMatrix *matrix;
NSCell *selectedCell; NSCell *selectedCell;
int selectedRow, selectedColumn; int selectedRow, selectedColumn;
selectedColumn = [self selectedColumn]; selectedColumn = [self selectedColumn];
if(selectedColumn >= 0) if (selectedColumn >= 0)
{ {
matrix = [self matrixInColumn:selectedColumn]; matrix = [self matrixInColumn: selectedColumn];
selectedCell = [matrix selectedCell]; selectedCell = [matrix selectedCell];
selectedRow = [matrix selectedRow]; selectedRow = [matrix selectedRow];
[matrix deselectAllCells]; [matrix deselectAllCells];
if(selectedColumn+1 <= [self lastColumn]) if(selectedColumn+1 <= [self lastColumn])
[self setLastColumn:selectedColumn]; [self setLastColumn: selectedColumn];
if(_sendsActionOnArrowKeys == YES) matrix = [self matrixInColumn: [self selectedColumn]];
[super sendAction:_action to:_target]; [_window makeFirstResponder: matrix];
if (_sendsActionOnArrowKeys == YES)
[super sendAction: _action to: _target];
} }
} }
} }
- (void)moveRight:(id)sender - (void)moveRight:(id)sender
{ {
if(_acceptsArrowKeys) if (_acceptsArrowKeys)
{ {
NSMatrix *matrix; NSMatrix *matrix;
BOOL selectFirstRow = NO; BOOL selectFirstRow = NO;
int selectedColumn; int selectedColumn;
selectedColumn = [self selectedColumn]; selectedColumn = [self selectedColumn];
if(selectedColumn == -1) if (selectedColumn == -1)
{ {
matrix = [self matrixInColumn:0]; matrix = [self matrixInColumn: 0];
if([[matrix cells] count]) if ([[matrix cells] count])
{ {
[matrix selectCellAtRow:0 column:0]; [matrix selectCellAtRow: 0 column: 0];
[self doClick:matrix]; [_window makeFirstResponder: matrix];
[self doClick: matrix];
selectedColumn = 0; selectedColumn = 0;
} }
} }
else else
{ {
matrix = [self matrixInColumn:selectedColumn]; matrix = [self matrixInColumn: selectedColumn];
selectFirstRow = YES; selectFirstRow = YES;
} }
if(selectFirstRow == YES) if(selectFirstRow == YES)
{ {
matrix = [self matrixInColumn:[self lastColumn]]; matrix = [self matrixInColumn: [self lastColumn]];
if([[matrix cells] count]) if ([[matrix cells] count])
{ {
[matrix selectCellAtRow:0 column:0]; [matrix selectCellAtRow: 0 column: 0];
[self doClick:matrix]; [_window makeFirstResponder: matrix];
[self doClick: matrix];
} }
} }
if(_sendsActionOnArrowKeys == YES) if (_sendsActionOnArrowKeys == YES)
[super sendAction:_action to:_target]; [super sendAction: _action to: _target];
} }
} }
@ -2731,7 +2763,7 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
character = [characters characterAtIndex: 0]; character = [characters characterAtIndex: 0];
} }
if(_acceptsArrowKeys) if (_acceptsArrowKeys)
{ {
switch (character) switch (character)
{ {
@ -2747,6 +2779,14 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
case NSRightArrowFunctionKey: case NSRightArrowFunctionKey:
[self moveRight:self]; [self moveRight:self];
return; return;
case NSTabCharacter:
{
if ([theEvent modifierFlags] & NSShiftKeyMask)
[_window selectKeyViewPrecedingView: self];
else
[_window selectKeyViewFollowingView: self];
}
break;
} }
} }
@ -2913,20 +2953,25 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
{ {
id bc, sc; id bc, sc;
int i, count; int i, count;
id firstResponder = nil;
BOOL setFirstResponder = NO;
#if defined NSBTRACE__remapColumnSubviews || defined NSBTRACE_all #if defined NSBTRACE__remapColumnSubviews || defined NSBTRACE_all
fprintf(stderr, "NSBrowser - (void)_remapColumnSubviews: %d\n", fromFirst); fprintf(stderr, "NSBrowser - (void)_remapColumnSubviews: %d\n", fromFirst);
#endif #endif
// Removes all column subviews. // Removes all column subviews.
count = [_browserColumns count]; count = [_browserColumns count];
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
bc = [_browserColumns objectAtIndex: i]; bc = [_browserColumns objectAtIndex: i];
sc = [bc columnScrollView]; sc = [bc columnScrollView];
[sc removeFromSuperviewWithoutNeedingDisplay];
if (!firstResponder && [bc columnMatrix] == [_window firstResponder])
firstResponder = [bc columnMatrix];
if (sc)
[sc removeFromSuperviewWithoutNeedingDisplay];
} }
if (_firstVisibleColumn > _lastVisibleColumn) if (_firstVisibleColumn > _lastVisibleColumn)
return; return;
@ -2939,7 +2984,18 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
bc = [_browserColumns objectAtIndex: i]; bc = [_browserColumns objectAtIndex: i];
sc = [bc columnScrollView]; sc = [bc columnScrollView];
[self addSubview: sc]; [self addSubview: sc];
if ([bc columnMatrix] == firstResponder)
{
[_window makeFirstResponder: firstResponder];
setFirstResponder = YES;
}
} }
if (firstResponder && setFirstResponder == NO)
[_window makeFirstResponder:
[[_browserColumns objectAtIndex: _firstVisibleColumn]
columnMatrix]];
} }
else else
{ {
@ -2948,7 +3004,18 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
bc = [_browserColumns objectAtIndex: i]; bc = [_browserColumns objectAtIndex: i];
sc = [bc columnScrollView]; sc = [bc columnScrollView];
[self addSubview: sc]; [self addSubview: sc];
if ([bc columnMatrix] == firstResponder)
{
[_window makeFirstResponder: firstResponder];
setFirstResponder = YES;
}
} }
if (firstResponder && setFirstResponder == NO)
[_window makeFirstResponder:
[[_browserColumns objectAtIndex: _lastVisibleColumn]
columnMatrix]];
} }
} }
@ -2966,8 +3033,7 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
fprintf(stderr, "NSBrowser - (void)_performLoadOfColumn: %d\n", column); fprintf(stderr, "NSBrowser - (void)_performLoadOfColumn: %d\n", column);
#endif #endif
if (!(bc = [_browserColumns objectAtIndex: column])) bc = [_browserColumns objectAtIndex: column];
return;
if (!(sc = [bc columnScrollView])) if (!(sc = [bc columnScrollView]))
return; return;
@ -3072,19 +3138,22 @@ static float scrollerWidth; // == [NSScroller scrollerWidth]
count = [_browserColumns count]; count = [_browserColumns count];
for (i = column; i < count; ++i) for (i = column; i < count; ++i)
{ {
if (!(bc = [_browserColumns objectAtIndex: i])) bc = [_browserColumns objectAtIndex: i];
{ sc = [bc columnScrollView];
continue;
}
if ([bc isLoaded]) if ([bc isLoaded])
{ {
if (!(sc = [bc columnScrollView]))
continue;
// Make the column appear empty by removing the matrix // Make the column appear empty by removing the matrix
[sc setDocumentView: nil]; if (sc)
[sc setNeedsDisplay: YES]; {
[sc setDocumentView: nil];
[sc setNeedsDisplay: YES];
}
[bc setIsLoaded: NO]; [bc setIsLoaded: NO];
} }
if (!_reusesColumns && i >= _maxVisibleColumns)
[_browserColumns removeObject:bc];
} }
if (column == 0) if (column == 0)

View file

@ -220,6 +220,7 @@ static NSFont *_leafFont;
NSImage *image = nil; NSImage *image = nil;
NSColor *backColor; NSColor *backColor;
NSWindow *cvWin = [controlView window]; NSWindow *cvWin = [controlView window];
BOOL showsFirstResponder;
if (!cvWin) if (!cvWin)
return; return;
@ -244,6 +245,8 @@ static NSFont *_leafFont;
// Clear the background // Clear the background
NSRectFill(cellFrame); NSRectFill(cellFrame);
showsFirstResponder = _cell.shows_first_responder;
// Draw the branch image if there is one // Draw the branch image if there is one
if (image) if (image)
{ {
@ -290,9 +293,16 @@ static NSFont *_leafFont;
else else
{ {
// Draw image, or text // Draw image, or text
_cell.shows_first_responder = NO;
[super drawInteriorWithFrame: title_rect inView: controlView]; [super drawInteriorWithFrame: title_rect inView: controlView];
} }
if (showsFirstResponder == YES)
NSDottedFrameRect(cellFrame);
_cell.shows_first_responder = showsFirstResponder;
[controlView unlockFocus]; [controlView unlockFocus];
} }

View file

@ -323,6 +323,34 @@ id _nsbuttonCellClass = nil;
return [self isEnabled]; return [self isEnabled];
} }
- (BOOL) becomeFirstResponder
{
[_cell setShowsFirstResponder: YES];
[self setNeedsDisplay: YES];
return YES;
}
- (BOOL) resignFirstResponder
{
[_cell setShowsFirstResponder: NO];
[self setNeedsDisplay: YES];
return YES;
}
- (void) becomeKeyWindow
{
[_cell setShowsFirstResponder: YES];
[self setNeedsDisplay: YES];
}
- (void) resignKeyWindow
{
[_cell setShowsFirstResponder: NO];
[self setNeedsDisplay: YES];
}
- (void) keyDown: (NSEvent*)theEvent - (void) keyDown: (NSEvent*)theEvent
{ {
if ([self isEnabled]) if ([self isEnabled])

View file

@ -127,6 +127,79 @@
return _altContents; return _altContents;
} }
- (int) cellAttribute: (NSCellAttribute)aParameter
{
int value = 0;
switch (aParameter)
{
case NSPushInCell:
if (_highlightsByMask & NSPushInCellMask)
value = 1;
break;
case NSChangeGrayCell:
if (_highlightsByMask & NSChangeGrayCellMask)
value = 1;
break;
case NSChangeBackgroundCell:
if (_highlightsByMask & NSChangeBackgroundCellMask)
value = 1;
break;
default:
value = [super cellAttribute: aParameter];
break;
}
return value;
}
- (void) setCellAttribute: (NSCellAttribute)aParameter to: (int)value
{
switch (aParameter)
{
case NSPushInCell:
if (value)
_highlightsByMask |= NSPushInCellMask;
else
_highlightsByMask &= ~NSPushInCellMask;
break;
case NSChangeGrayCell:
if (value)
_highlightsByMask |= NSChangeGrayCellMask;
else
_highlightsByMask &= ~NSChangeGrayCellMask;
break;
case NSChangeBackgroundCell:
if (value)
_highlightsByMask |= NSChangeBackgroundCellMask;
else
_highlightsByMask &= ~NSChangeBackgroundCellMask;
break;
/*
case NSCellLightsByContents:
_cell. = value;
break;
case NSCellChangesContents:
_cell. = value;
break;
*/
case NSCellLightsByGray:
if (value)
_highlightsByMask |= NSChangeGrayCellMask;
else
_highlightsByMask &= ~NSChangeGrayCellMask;
break;
case NSCellLightsByBackground:
if (value)
_highlightsByMask |= NSChangeBackgroundCellMask;
else
_highlightsByMask &= ~NSChangeBackgroundCellMask;
break;
default:
[super setCellAttribute: aParameter to: value];
}
}
- (void) setFont: (NSFont*)fontObject - (void) setFont: (NSFont*)fontObject
{ {
// TODO Should change the size of the key equivalent font // TODO Should change the size of the key equivalent font
@ -739,6 +812,16 @@
{ {
[self _drawText: titleToDisplay inFrame: titleRect]; [self _drawText: titleToDisplay inFrame: titleRect];
} }
if (_cell.shows_first_responder
&& [[controlView window] firstResponder] == controlView)
{
if (_cell.is_bordered || _cell.is_bezeled)
NSDottedFrameRect(cellFrame);
else
NSDottedFrameRect(titleRect);
}
[controlView unlockFocus]; [controlView unlockFocus];
} }

View file

@ -395,7 +395,76 @@ static NSColor *shadowCol;
- (void) setCellAttribute: (NSCellAttribute)aParameter to: (int)value - (void) setCellAttribute: (NSCellAttribute)aParameter to: (int)value
{ {
// TODO switch (aParameter)
{
case NSCellDisabled:
_cell.is_disabled = value;
break;
case NSCellState:
_cell.state = value;
break;
case NSCellEditable:
_cell.is_editable = value;
break;
case NSCellHighlighted:
_cell.is_highlighted = value;
break;
case NSCellHasOverlappingImage:
if (value)
_cell.image_position = NSImageOverlaps;
else
{
if (_cell.image_position == NSImageOverlaps)
_cell.image_position = NSImageLeft;
}
break;
case NSCellHasImageHorizontal:
if (value)
{
if (_cell.image_position != NSImageLeft
&& _cell.image_position != NSImageRight)
_cell.image_position = NSImageLeft;
}
else
{
if (_cell.image_position == NSImageLeft)
_cell.image_position = NSImageAbove;
else if (_cell.image_position == NSImageRight)
_cell.image_position = NSImageBelow;
}
break;
case NSCellHasImageOnLeftOrBottom:
if (value)
{
if (_cell.image_position == NSImageAbove)
_cell.image_position = NSImageBelow;
else
_cell.image_position = NSImageLeft;
}
else
{
if (_cell.image_position == NSImageBelow)
_cell.image_position = NSImageAbove;
else
_cell.image_position = NSImageRight;
}
break;
/*
case NSCellChangesContents:
_cell. = value;
break;
case NSCellIsInsetButton:
_cell. = value;
break;
*/
case NSCellIsBordered:
_cell.is_bordered = value;
break;
case NSCellAllowsMixedState:
_cell.allows_mixed_state = value;
break;
default:
}
} }
/* /*
@ -714,6 +783,7 @@ static NSColor *shadowCol;
[textObject setSelectable: _cell.is_selectable || _cell.is_editable]; [textObject setSelectable: _cell.is_selectable || _cell.is_editable];
[textObject setRichText: _cell.is_rich_text]; [textObject setRichText: _cell.is_rich_text];
[textObject setImportsGraphics: _cell.imports_graphics]; [textObject setImportsGraphics: _cell.imports_graphics];
[textObject setSelectedRange: NSMakeRange(0, 0)];
return textObject; return textObject;
} }
@ -1438,11 +1508,6 @@ static NSColor *shadowCol;
[controlView lockFocus]; [controlView lockFocus];
/* TODO: Enable this when NSDottedFrameRect is implemented.
if (_cell.show_first_responder && [controlView isFirstResponder])
NSDottedFrameRect(cellFrame);
*/
switch (_cell.type) switch (_cell.type)
{ {
case NSTextCellType: case NSTextCellType:
@ -1480,6 +1545,11 @@ static NSColor *shadowCol;
case NSNullCellType: case NSNullCellType:
break; break;
} }
if (_cell.shows_first_responder
&& [[controlView window] firstResponder] == controlView)
NSDottedFrameRect(cellFrame);
// NB: We don't do any highlighting to make it easier for subclasses // NB: We don't do any highlighting to make it easier for subclasses
// to reuse this code while doing their own custom highlighting and // to reuse this code while doing their own custom highlighting and
// prettyfying // prettyfying
@ -1576,12 +1646,13 @@ static NSColor *shadowCol;
[textObject setDelegate: anObject]; [textObject setDelegate: anObject];
[[controlView window] makeFirstResponder: textObject]; [[controlView window] makeFirstResponder: textObject];
[textObject display];
if ([theEvent type] == NSLeftMouseDown) if ([theEvent type] == NSLeftMouseDown)
{ {
[textObject mouseDown: theEvent]; [textObject mouseDown: theEvent];
} }
[textObject display];
} }
- (void) endEditing: (NSText*)textObject - (void) endEditing: (NSText*)textObject

View file

@ -15,6 +15,8 @@
Date: November 1999 Date: November 1999
Implementation of Editing: Nicola Pero <n.pero@mi.flashnet.it> Implementation of Editing: Nicola Pero <n.pero@mi.flashnet.it>
Date: November 1999 Date: November 1999
Modified: Mirko Viviani <mirko.viviani@rccr.cremona.it>
Date: March 2001
This file is part of the GNUstep GUI Library. This file is part of the GNUstep GUI Library.
@ -210,6 +212,7 @@ static SEL getSel;
[self setCellBackgroundColor: [NSColor controlBackgroundColor]]; [self setCellBackgroundColor: [NSColor controlBackgroundColor]];
[self setSelectionByRect: YES]; [self setSelectionByRect: YES];
[self setAutosizesCells: YES]; [self setAutosizesCells: YES];
_dottedRow = _dottedColumn = -1;
if (_mode == NSRadioModeMatrix && _numRows > 0 && _numCols > 0) if (_mode == NSRadioModeMatrix && _numRows > 0 && _numCols > 0)
{ {
[self selectCellAtRow: 0 column: 0]; [self selectCellAtRow: 0 column: 0];
@ -437,6 +440,9 @@ static SEL getSel;
_selectedCells[row] = olds; _selectedCells[row] = olds;
if (_selectedCell && (_selectedRow >= row)) if (_selectedCell && (_selectedRow >= row))
_selectedRow++; _selectedRow++;
if (_dottedRow != -1 && _dottedRow >= row)
_dottedRow++;
} }
/* /*
@ -452,7 +458,8 @@ static SEL getSel;
} }
} }
if (_mode == NSRadioModeMatrix && !_allowsEmptySelection && _selectedCell == nil) if (_mode == NSRadioModeMatrix && !_allowsEmptySelection
&& _selectedCell == nil)
[self selectCellAtRow: 0 column: 0]; [self selectCellAtRow: 0 column: 0];
} }
@ -546,7 +553,14 @@ static SEL getSel;
if (col == _selectedColumn) if (col == _selectedColumn)
{ {
_selectedCell = nil; _selectedCell = nil;
[self selectCellAtRow: 0 column: 0]; [self selectCellAtRow: _selectedRow column: 0];
}
if (col == _dottedColumn)
{
if (_numCols && [_cells[_dottedRow][0] acceptsFirstResponder])
_dottedColumn = 0;
else
_dottedRow = _dottedColumn = -1;
} }
} }
else else
@ -585,7 +599,14 @@ static SEL getSel;
if (row == _selectedRow) if (row == _selectedRow)
{ {
_selectedCell = nil; _selectedCell = nil;
[self selectCellAtRow: 0 column: 0]; [self selectCellAtRow: 0 column: _selectedColumn];
}
if (row == _dottedRow)
{
if (_numRows && [_cells[0][_dottedColumn] acceptsFirstResponder])
_dottedRow = 0;
else
_dottedRow = _dottedColumn = -1;
} }
} }
else else
@ -782,10 +803,22 @@ static SEL getSel;
{ {
if (value) if (value)
{ {
if (_selectedRow > -1 && _selectedColumn > -1)
{
_selectedCells[_selectedRow][_selectedColumn] = NO;
}
_selectedCell = aCell; _selectedCell = aCell;
_selectedRow = row; _selectedRow = row;
_selectedColumn = column; _selectedColumn = column;
[_selectedCell setState: 1];
if ([_cells[_dottedRow][_dottedColumn] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
}
[_selectedCell setState: value];
_selectedCells[row][column] = YES; _selectedCells[row][column] = YES;
} }
else if (_allowsEmptySelection) else if (_allowsEmptySelection)
@ -861,46 +894,37 @@ static SEL getSel;
{ {
unsigned i, j; unsigned i, j;
_selectedCell = nil;
_selectedRow = -1;
_selectedColumn = -1;
for (i = 0; i < _numRows; i++) for (i = 0; i < _numRows; i++)
{ {
for (j = 0; j < _numCols; j++) for (j = 0; j < _numCols; j++)
{ {
[_cells[i][j] setState: 1]; if ([_cells[i][j] isEnabled] == YES
_selectedCells[i][j] = YES; && [_cells[i][j] isEditable] == NO)
} {
} _selectedCell = _cells[i][j];
[_selectedCell setState: 1];
_selectedCells[i][j] = YES;
/* _selectedRow = i;
* Make the selected cell the last cell _selectedColumn = j;
*/ }
if ((_numRows >0) && (_numCols > 0)) else
{ {
_selectedCell = [self cellAtRow: _numRows - 1 column: _numCols - 1]; _selectedCells[i][j] = NO;
_selectedRow = _numRows - 1; [_cells[i][j] setShowsFirstResponder: NO];
_selectedColumn = _numCols - 1; }
} }
else
{
_selectedCell = nil;
_selectedRow = -1;
_selectedColumn = -1;
} }
[self setNeedsDisplay: YES]; [self setNeedsDisplay: YES];
} }
- (void) selectCellAtRow: (int)row column: (int)column - (void) _selectCell: (NSCell *)aCell atRow: (int)row column: (int)column
{ {
NSCell *aCell;
if ((row == -1) || (column == -1))
{
[self deselectAllCells];
return;
}
aCell = [self cellAtRow: row column: column];
/* /*
* We always deselect the current selection unless the new selection * We always deselect the current selection unless the new selection
* is the same. (in NSRadioModeMatrix) * is the same. (in NSRadioModeMatrix)
@ -916,10 +940,25 @@ static SEL getSel;
if (aCell != nil) if (aCell != nil)
{ {
if (_selectedCell && _selectedCell != aCell)
{
[_selectedCell setShowsFirstResponder: NO];
[self setNeedsDisplayInRect: [self cellFrameAtRow: _selectedRow
column: _selectedColumn]];
}
_selectedCell = aCell; _selectedCell = aCell;
_selectedRow = row; _selectedRow = row;
_selectedColumn = column; _selectedColumn = column;
_selectedCells[row][column] = YES; _selectedCells[row][column] = YES;
if ([_cells[row][column] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
[_selectedCell setShowsFirstResponder: YES];
}
[_selectedCell setState: 1]; [_selectedCell setState: 1];
// Note: we select the cell iff it is 'selectable', not 'editable' // Note: we select the cell iff it is 'selectable', not 'editable'
@ -932,6 +971,30 @@ static SEL getSel;
} }
} }
- (void) selectCell: (NSCell *)aCell
{
int row, column;
if ([self getRow: &row column: &column ofCell: aCell] == YES)
[self _selectCell: aCell atRow: row column: column];
}
- (void) selectCellAtRow: (int)row column: (int)column
{
NSCell *aCell;
if ((row == -1) || (column == -1))
{
[self deselectAllCells];
return;
}
aCell = [self cellAtRow: row column: column];
if (aCell)
[self _selectCell:aCell atRow: row column: column];
}
- (BOOL) selectCellWithTag: (int)anInt - (BOOL) selectCellWithTag: (int)anInt
{ {
id aCell; id aCell;
@ -946,7 +1009,7 @@ static SEL getSel;
aCell = _cells[i][j]; aCell = _cells[i][j];
if ([aCell tag] == anInt) if ([aCell tag] == anInt)
{ {
[self selectCellAtRow: i column: j]; [self _selectCell: aCell atRow: i column: j];
return YES; return YES;
} }
} }
@ -1268,9 +1331,24 @@ static SEL getSel;
if ([t resignFirstResponder] == NO) if ([t resignFirstResponder] == NO)
return nil; return nil;
if (_selectedCell && _selectedCell != _cells[row][column])
{
[_selectedCell setShowsFirstResponder: NO];
[self setNeedsDisplayInRect: [self cellFrameAtRow: _selectedRow
column: _selectedColumn]];
}
_selectedCell = _cells[row][column]; _selectedCell = _cells[row][column];
_selectedRow = row; _selectedRow = row;
_selectedColumn = column; _selectedColumn = column;
if ([_cells[row][column] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
[_selectedCell setShowsFirstResponder: YES];
}
/* See comment in NSTextField */ /* See comment in NSTextField */
length = [[_selectedCell stringValue] length]; length = [[_selectedCell stringValue] length];
_textObject = [_selectedCell setUpFieldEditorAttributes: t]; _textObject = [_selectedCell setUpFieldEditorAttributes: t];
@ -1412,7 +1490,11 @@ static SEL getSel;
switch ([(NSNumber *)textMovement intValue]) switch ([(NSNumber *)textMovement intValue])
{ {
case NSReturnTextMovement: case NSReturnTextMovement:
[self sendAction]; if ([self sendAction] == NO)
{
if ([self performKeyEquivalent: [_window currentEvent]] == NO)
[self selectText: self];
}
break; break;
case NSTabTextMovement: case NSTabTextMovement:
if (_tabKeyTraversesCells) if (_tabKeyTraversesCells)
@ -1422,6 +1504,17 @@ static SEL getSel;
break; break;
} }
[_window selectKeyViewFollowingView: self]; [_window selectKeyViewFollowingView: self];
if ([_window firstResponder] == _window)
{
if (_tabKeyTraversesCells)
{
if([self _selectNextSelectableCellAfterRow: -1
column: -1])
break;
}
[self selectText: self];
}
break; break;
case NSBacktabTextMovement: case NSBacktabTextMovement:
if (_tabKeyTraversesCells) if (_tabKeyTraversesCells)
@ -1431,6 +1524,17 @@ static SEL getSel;
break; break;
} }
[_window selectKeyViewPrecedingView: self]; [_window selectKeyViewPrecedingView: self];
if ([_window firstResponder] == _window)
{
if (_tabKeyTraversesCells)
{
if([self _selectPreviousSelectableCellBeforeRow: _numRows
column: _numCols])
break;
}
[self selectText: self];
}
break; break;
} }
} }
@ -1595,12 +1699,23 @@ static SEL getSel;
if (col1 < 0) if (col1 < 0)
col1 = 0; col1 = 0;
if (_dottedRow != -1 && _dottedColumn != -1
&& [_cells[_dottedRow][_dottedColumn] acceptsFirstResponder])
{
[_cells[_dottedRow][_dottedColumn]
setShowsFirstResponder: ([_window isKeyWindow]
&& [_window firstResponder] == self)];
}
/* Draw the cells within the drawing rectangle. */ /* Draw the cells within the drawing rectangle. */
for (i = row1; i <= row2 && i < _numRows; i++) for (i = row1; i <= row2 && i < _numRows; i++)
for (j = col1; j <= col2 && j < _numCols; j++) for (j = col1; j <= col2 && j < _numCols; j++)
{ {
[self drawCellAtRow: i column: j]; [self drawCellAtRow: i column: j];
} }
if (_dottedRow != -1 && _dottedColumn != -1)
[_cells[_dottedRow][_dottedColumn] setShowsFirstResponder: NO];
} }
- (BOOL) isOpaque - (BOOL) isOpaque
@ -1931,40 +2046,48 @@ static SEL getSel;
column: &column column: &column
forPoint: lastLocation]) forPoint: lastLocation])
{ {
if ((_mode == NSRadioModeMatrix) && _selectedCell != nil) if ([_cells[row][column] isEnabled])
{ {
[_selectedCell setState: NSOffState]; if ((_mode == NSRadioModeMatrix) && _selectedCell != nil)
[self drawCellAtRow: _selectedRow column: _selectedColumn];
[_window flushWindow];
_selectedCells[_selectedRow][_selectedColumn] = NO;
_selectedCell = nil;
_selectedRow = _selectedColumn = -1;
}
if ([_cells[row][column] isSelectable])
{
NSText* t = [_window fieldEditor: YES forObject: self];
if ([t superview] != nil)
{ {
if ([t resignFirstResponder] == NO) [_selectedCell setState: NSOffState];
{ [self drawCellAtRow: _selectedRow column: _selectedColumn];
if ([_window makeFirstResponder: _window] == NO) [_window flushWindow];
return; _selectedCells[_selectedRow][_selectedColumn] = NO;
} _selectedCell = nil;
_selectedRow = _selectedColumn = -1;
}
if ([_cells[row][column] isSelectable])
{
NSText* t = [_window fieldEditor: YES forObject: self];
if ([t superview] != nil)
{
if ([t resignFirstResponder] == NO)
{
if ([_window makeFirstResponder: _window] == NO)
return;
}
}
// During editing, the selected cell is the cell being edited
_selectedCell = _cells[row][column];
_selectedRow = row;
_selectedColumn = column;
if ([_cells[row][column] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
}
_textObject = [_selectedCell setUpFieldEditorAttributes: t];
[_selectedCell editWithFrame: [self cellFrameAtRow: row
column: column]
inView: self
editor: _textObject
delegate: self
event: theEvent];
return;
} }
// During editing, the selected cell is the cell being edited
_selectedCell = _cells[row][column];
_selectedRow = row;
_selectedColumn = column;
_textObject = [_selectedCell setUpFieldEditorAttributes: t];
[_selectedCell editWithFrame: [self cellFrameAtRow: row
column: column]
inView: self
editor: _textObject
delegate: self
event: theEvent];
return;
} }
} }
@ -2008,7 +2131,7 @@ static SEL getSel;
{ {
aCell = [self cellAtRow: row column: column]; aCell = [self cellAtRow: row column: column];
rect = [self cellFrameAtRow: row column: column]; rect = [self cellFrameAtRow: row column: column];
if (aCell != previousCell) if (aCell != previousCell && [aCell isEnabled] == YES)
{ {
switch (_mode) switch (_mode)
{ {
@ -2019,6 +2142,11 @@ static SEL getSel;
_selectedCell = aCell; _selectedCell = aCell;
_selectedRow = row; _selectedRow = row;
_selectedColumn = column; _selectedColumn = column;
if ([_cells[row][column] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
}
if ([aCell trackMouse: lastEvent if ([aCell trackMouse: lastEvent
inRect: rect inRect: rect
ofView: self ofView: self
@ -2034,6 +2162,11 @@ static SEL getSel;
_selectedCell = aCell; _selectedCell = aCell;
_selectedRow = row; _selectedRow = row;
_selectedColumn = column; _selectedColumn = column;
if ([_cells[row][column] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
}
[aCell highlight: YES withFrame: rect inView: self]; [aCell highlight: YES withFrame: rect inView: self];
[_window flushWindow]; [_window flushWindow];
@ -2069,6 +2202,11 @@ static SEL getSel;
_selectedCell = aCell; _selectedCell = aCell;
_selectedRow = row; _selectedRow = row;
_selectedColumn = column; _selectedColumn = column;
if ([_cells[row][column] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
}
[aCell setState: 1]; [aCell setState: 1];
[aCell highlight: YES withFrame: rect inView: self]; [aCell highlight: YES withFrame: rect inView: self];
_selectedCells[row][column] = YES; _selectedCells[row][column] = YES;
@ -2102,6 +2240,12 @@ static SEL getSel;
_selectedRow = row; _selectedRow = row;
_selectedColumn = column; _selectedColumn = column;
if ([_cells[row][column] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
}
[_selectedCell setState: 1]; [_selectedCell setState: 1];
[_selectedCell highlight: YES [_selectedCell highlight: YES
withFrame: rect withFrame: rect
@ -2121,6 +2265,11 @@ static SEL getSel;
_selectedCell = aCell; _selectedCell = aCell;
_selectedRow = row; _selectedRow = row;
_selectedColumn = column; _selectedColumn = column;
if ([_cells[row][column] acceptsFirstResponder])
{
_dottedRow = row;
_dottedColumn = column;
}
break; break;
} }
} }
@ -2735,6 +2884,39 @@ static SEL getSel;
return YES; return YES;
} }
- (void) _setNeedsDisplayDottedCell
{
if (_dottedRow != -1 && _dottedColumn != -1)
{
[self setNeedsDisplayInRect: [self cellFrameAtRow: _dottedRow
column: _dottedColumn]];
}
}
- (BOOL) becomeFirstResponder
{
[self _setNeedsDisplayDottedCell];
return YES;
}
- (BOOL) resignFirstResponder
{
[self _setNeedsDisplayDottedCell];
return YES;
}
- (void) becomeKeyWindow
{
[self _setNeedsDisplayDottedCell];
}
- (void) resignKeyWindow
{
[self _setNeedsDisplayDottedCell];
}
- (BOOL) abortEditing - (BOOL) abortEditing
{ {
if (_textObject) if (_textObject)
@ -2984,7 +3166,7 @@ static SEL getSel;
// First look for cells in the same row // First look for cells in the same row
for (j = column + 1; j < _numCols; j++) for (j = column + 1; j < _numCols; j++)
{ {
if ([_cells[row][j] isSelectable]) if ([_cells[row][j] isEnabled] && [_cells[row][j] isSelectable])
{ {
_selectedCell = [self selectTextAtRow: row _selectedCell = [self selectTextAtRow: row
column: j]; column: j];
@ -2999,7 +3181,7 @@ static SEL getSel;
{ {
for (j = 0; j < _numCols; j++) for (j = 0; j < _numCols; j++)
{ {
if ([_cells[i][j] isSelectable]) if ([_cells[i][j] isEnabled] && [_cells[i][j] isSelectable])
{ {
_selectedCell = [self selectTextAtRow: i _selectedCell = [self selectTextAtRow: i
column: j]; column: j];
@ -3011,16 +3193,17 @@ static SEL getSel;
} }
return NO; return NO;
} }
-(BOOL) _selectPreviousSelectableCellBeforeRow: (int)row -(BOOL) _selectPreviousSelectableCellBeforeRow: (int)row
column: (int)column column: (int)column
{ {
int i,j; int i,j;
if (row < _numCols) if (row < _numRows)
{ {
// First look for cells in the same row // First look for cells in the same row
for (j = column - 1; j > -1; j--) for (j = column - 1; j > -1; j--)
{ {
if ([_cells[row][j] isSelectable]) if ([_cells[row][j] isEnabled] && [_cells[row][j] isSelectable])
{ {
_selectedCell = [self selectTextAtRow: row _selectedCell = [self selectTextAtRow: row
column: j]; column: j];
@ -3035,7 +3218,7 @@ static SEL getSel;
{ {
for (j = _numCols - 1; j > -1; j--) for (j = _numCols - 1; j > -1; j--)
{ {
if ([_cells[i][j] isSelectable]) if ([_cells[i][j] isEnabled] && [_cells[i][j] isSelectable])
{ {
_selectedCell = [self selectTextAtRow: i _selectedCell = [self selectTextAtRow: i
column: j]; column: j];

View file

@ -62,7 +62,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
@interface NSOpenPanel (_PrivateMethods) @interface NSOpenPanel (_PrivateMethods)
- (void) _resetDefaults; - (void) _resetDefaults;
- (BOOL) _shouldShowExtension: (NSString *)extension; - (BOOL) _shouldShowExtension: (NSString *)extension isDir: (BOOL *)isDir;
@end @end
@implementation NSOpenPanel (_PrivateMethods) @implementation NSOpenPanel (_PrivateMethods)
@ -75,16 +75,27 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
[self setAllowsMultipleSelection: NO]; [self setAllowsMultipleSelection: NO];
[_okButton setEnabled: YES]; [_okButton setEnabled: YES];
} }
// NB: Invoked only for files.
- (BOOL) _shouldShowExtension: (NSString *)extension;
{
if ((_fileTypes) && ([_fileTypes containsObject: extension] == NO))
return NO;
if (_canChooseFiles == NO)
return NO;
return YES; - (BOOL) _shouldShowExtension: (NSString *)extension
isDir: (BOOL *)isDir;
{
BOOL found = YES;
if (_fileTypes)
{
if ([_fileTypes containsObject: extension] == YES)
{
if ([self treatsFilePackagesAsDirectories] == NO)
*isDir = NO;
}
else
found = NO;
}
if (*isDir == YES || (found == YES && _canChooseFiles == YES))
return YES;
return NO;
} }
- (void) _selectTextInColumn: (int)column - (void) _selectTextInColumn: (int)column
@ -110,7 +121,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
else else
{ {
[self _selectCellName:[[_form cellAtIndex: 0] stringValue]]; [self _selectCellName:[[_form cellAtIndex: 0] stringValue]];
[_form selectTextAtIndex:0]; // [_form selectTextAtIndex:0];
[_okButton setEnabled:YES]; [_okButton setEnabled:YES];
} }
} }
@ -118,7 +129,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
{ {
[_form abortEditing]; [_form abortEditing];
[[_form cellAtIndex: 0] setStringValue:nil]; [[_form cellAtIndex: 0] setStringValue:nil];
[_form selectTextAtIndex:0]; // [_form selectTextAtIndex:0];
[_form setNeedsDisplay:YES]; [_form setNeedsDisplay:YES];
[_okButton setEnabled:YES]; [_okButton setEnabled:YES];
} }
@ -132,7 +143,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
if([[[_form cellAtIndex: 0] stringValue] length] > 0) if([[[_form cellAtIndex: 0] stringValue] length] > 0)
{ {
[self _selectCellName:[[_form cellAtIndex: 0] stringValue]]; [self _selectCellName:[[_form cellAtIndex: 0] stringValue]];
[_form selectTextAtIndex:0]; // [_form selectTextAtIndex:0];
[_form setNeedsDisplay:YES]; [_form setNeedsDisplay:YES];
} }

View file

@ -296,7 +296,20 @@ Class _nspopupbuttonCellClass = 0;
{ {
[[popb_menu menuRepresentation] sizeToFit]; [[popb_menu menuRepresentation] sizeToFit];
[super sizeToFit]; [super sizeToFit];
} }
- (BOOL) resignFirstResponder
{
[_cell dismissPopUp];
return [super resignFirstResponder];
}
- (void) resignKeyWindow
{
[_cell dismissPopUp];
[super resignKeyWindow];
}
- (void) mouseDown: (NSEvent*)theEvent - (void) mouseDown: (NSEvent*)theEvent
{ {
@ -342,6 +355,102 @@ Class _nspopupbuttonCellClass = 0;
to: [self target]]; to: [self target]];
} }
- (void) keyDown: (NSEvent*)theEvent
{
if ([self isEnabled])
{
NSString *characters = [theEvent characters];
unichar character = 0;
if ([characters length] > 0)
{
character = [characters characterAtIndex: 0];
}
switch (character)
{
case NSNewlineCharacter:
case NSEnterCharacter:
case NSCarriageReturnCharacter:
case ' ':
{
if ([[[_cell menu] window] isVisible] == NO)
{
int selectedIndex;
[[NSNotificationCenter defaultCenter]
postNotificationName: NSPopUpButtonWillPopUpNotification
object: self];
// Attach the popUp
[_cell attachPopUpWithFrame: _bounds
inView: self];
selectedIndex = [self indexOfSelectedItem];
if (selectedIndex > -1)
[[[_cell menu] menuRepresentation]
setHighlightedItemIndex: selectedIndex];
}
else
{
// Update our selected item
[self synchronizeTitleAndSelectedItem];
// Dismiss the popUp
[_cell dismissPopUp];
[super sendAction: [self action]
to: [self target]];
}
}
return;
case '\e':
[_cell dismissPopUp];
return;
case NSUpArrowFunctionKey:
{
NSMenuView *menuView;
int selectedIndex, numberOfItems;
menuView = [[_cell menu] menuRepresentation];
selectedIndex = [menuView highlightedItemIndex];
numberOfItems = [self numberOfItems];
switch (selectedIndex)
{
case -1:
selectedIndex = numberOfItems - 1;
break;
case 0:
return;
default:
selectedIndex--;
break;
}
[menuView setHighlightedItemIndex: selectedIndex];
}
return;
case NSDownArrowFunctionKey:
{
NSMenuView *menuView;
int selectedIndex, numberOfItems;
menuView = [[_cell menu] menuRepresentation];
selectedIndex = [menuView highlightedItemIndex];
numberOfItems = [self numberOfItems];
if (selectedIndex < numberOfItems-1)
[menuView setHighlightedItemIndex: selectedIndex + 1];
}
return;
}
}
[super keyDown: theEvent];
}
/* /*
* NSCoding protocol * NSCoding protocol
*/ */

View file

@ -525,8 +525,8 @@ static NSImage *_pbc_image[2];
* that is used to draw cells in the menu. * that is used to draw cells in the menu.
* This looks like a mess to do in this framework. * This looks like a mess to do in this framework.
*/ */
- (void) drawWithFrame: (NSRect)cellFrame - (void) drawInteriorWithFrame: (NSRect)cellFrame
inView: (NSView*)view inView: (NSView*)view
{ {
NSSize size; NSSize size;
NSPoint position; NSPoint position;
@ -538,11 +538,19 @@ static NSImage *_pbc_image[2];
[view lockFocus]; [view lockFocus];
[super drawWithFrame: cellFrame inView: view]; // [super drawWithFrame: cellFrame inView: view];
cellFrame = [self drawingRectForBounds: cellFrame];
if (_cell.is_bordered || _cell.is_bezeled)
{
cellFrame.origin.x += 3;
cellFrame.size.width -= 6;
cellFrame.origin.y += 1;
cellFrame.size.height -= 2;
}
// Skip 5 points from left side // Skip 5 points from left side
cellFrame.origin.x += 5; // cellFrame.origin.x += 5;
cellFrame.size.width -= 5; // cellFrame.size.width -= 5;
[self _drawText: [self titleOfSelectedItem] inFrame: cellFrame]; [self _drawText: [self titleOfSelectedItem] inFrame: cellFrame];
@ -562,6 +570,16 @@ static NSImage *_pbc_image[2];
position.y += size.height; position.y += size.height;
[anImage compositeToPoint: position operation: NSCompositeCopy]; [anImage compositeToPoint: position operation: NSCompositeCopy];
if (_cell.is_bordered || _cell.is_bezeled)
{
cellFrame.origin.x -= 1;
cellFrame.size.width += 2;
}
if (_cell.shows_first_responder
&& [[view window] firstResponder] == view)
NSDottedFrameRect(cellFrame);
[view unlockFocus]; [view unlockFocus];
} }

View file

@ -63,7 +63,7 @@ static BOOL _gs_display_reading_progress = NO;
// Subclasses (read NSOpenPanel) may implement this // Subclasses (read NSOpenPanel) may implement this
// to filter some extensions out of displayed files. // to filter some extensions out of displayed files.
@interface NSObject (_SavePanelPrivate) @interface NSObject (_SavePanelPrivate)
-(BOOL) _shouldShowExtension: (NSString*)extension; -(BOOL) _shouldShowExtension: (NSString*)extension isDir: (BOOL *)isDir;
@end @end
// //
@ -92,6 +92,7 @@ static BOOL _gs_display_reading_progress = NO;
NSButton *button; NSButton *button;
NSImage *image; NSImage *image;
NSRect r; NSRect r;
id lastKeyView;
// //
// WARNING: We create the panel sized (308, 317), which is the // WARNING: We create the panel sized (308, 317), which is the
@ -122,6 +123,7 @@ static BOOL _gs_display_reading_progress = NO;
r = NSMakeRect (8, 68, 292, 177); r = NSMakeRect (8, 68, 292, 177);
_browser = [[NSBrowser alloc] initWithFrame: r]; _browser = [[NSBrowser alloc] initWithFrame: r];
lastKeyView = _browser;
[_browser setDelegate: self]; [_browser setDelegate: self];
[_browser setMaxVisibleColumns: 2]; [_browser setMaxVisibleColumns: 2];
[_browser setHasHorizontalScroller: YES]; [_browser setHasHorizontalScroller: YES];
@ -146,6 +148,8 @@ static BOOL _gs_display_reading_progress = NO;
[_form setAutoresizingMask: NSViewWidthSizable]; [_form setAutoresizingMask: NSViewWidthSizable];
[_form setDelegate: self]; [_form setDelegate: self];
[_bottomView addSubview: _form]; [_bottomView addSubview: _form];
[lastKeyView setNextKeyView: _form];
lastKeyView = _form;
[_form release]; [_form release];
r = NSMakeRect (43, 6, 27, 27); r = NSMakeRect (43, 6, 27, 27);
@ -161,6 +165,8 @@ static BOOL _gs_display_reading_progress = NO;
[button setAutoresizingMask: NSViewMinXMargin]; [button setAutoresizingMask: NSViewMinXMargin];
[button setTag: NSFileHandlingPanelHomeButton]; [button setTag: NSFileHandlingPanelHomeButton];
[_bottomView addSubview: button]; [_bottomView addSubview: button];
[lastKeyView setNextKeyView: button];
lastKeyView = button;
[button release]; [button release];
r = NSMakeRect (78, 6, 27, 27); r = NSMakeRect (78, 6, 27, 27);
@ -175,6 +181,8 @@ static BOOL _gs_display_reading_progress = NO;
[button setAutoresizingMask: NSViewMinXMargin]; [button setAutoresizingMask: NSViewMinXMargin];
[button setTag: NSFileHandlingPanelDiskButton]; [button setTag: NSFileHandlingPanelDiskButton];
[_bottomView addSubview: button]; [_bottomView addSubview: button];
[lastKeyView setNextKeyView: button];
lastKeyView = button;
[button release]; [button release];
r = NSMakeRect (112, 6, 27, 27); r = NSMakeRect (112, 6, 27, 27);
@ -189,6 +197,8 @@ static BOOL _gs_display_reading_progress = NO;
[button setAutoresizingMask: NSViewMinXMargin]; [button setAutoresizingMask: NSViewMinXMargin];
[button setTag: NSFileHandlingPanelDiskEjectButton]; [button setTag: NSFileHandlingPanelDiskEjectButton];
[_bottomView addSubview: button]; [_bottomView addSubview: button];
[lastKeyView setNextKeyView: button];
lastKeyView = button;
[button release]; [button release];
r = NSMakeRect (148, 6, 71, 27); r = NSMakeRect (148, 6, 71, 27);
@ -202,6 +212,8 @@ static BOOL _gs_display_reading_progress = NO;
[button setAutoresizingMask: NSViewMinXMargin]; [button setAutoresizingMask: NSViewMinXMargin];
[button setTag: NSFileHandlingPanelCancelButton]; [button setTag: NSFileHandlingPanelCancelButton];
[_bottomView addSubview: button]; [_bottomView addSubview: button];
[lastKeyView setNextKeyView: button];
lastKeyView = button;
[button release]; [button release];
r = NSMakeRect (228, 6, 71, 27); r = NSMakeRect (228, 6, 71, 27);
@ -215,11 +227,12 @@ static BOOL _gs_display_reading_progress = NO;
[_okButton setTarget: self]; [_okButton setTarget: self];
[_okButton setAction: @selector(ok:)]; [_okButton setAction: @selector(ok:)];
[_okButton setEnabled: NO]; [_okButton setEnabled: NO];
// [_okButton setNextKeyView: _form];
[_okButton setAutoresizingMask: NSViewMinXMargin]; [_okButton setAutoresizingMask: NSViewMinXMargin];
[_okButton setTag: NSFileHandlingPanelOKButton]; [_okButton setTag: NSFileHandlingPanelOKButton];
[_bottomView addSubview: _okButton]; [_bottomView addSubview: _okButton];
[self setDefaultButtonCell:[_okButton cell]]; [lastKeyView setNextKeyView: _okButton];
[_okButton setNextKeyView: _browser];
[self setDefaultButtonCell: [_okButton cell]];
[_okButton release]; [_okButton release];
[_browser setDoubleAction: @selector(performClick:)]; [_browser setDoubleAction: @selector(performClick:)];
@ -259,6 +272,7 @@ static BOOL _gs_display_reading_progress = NO;
[bar release]; [bar release];
[self setContentSize: NSMakeSize (384, 426)]; [self setContentSize: NSMakeSize (384, 426)];
[self setInitialFirstResponder: _form];
[super setTitle: @""]; [super setTitle: @""];
return self; return self;
@ -317,7 +331,7 @@ static BOOL _gs_display_reading_progress = NO;
if (isLeaf) if (isLeaf)
{ {
[[_form cellAtIndex: 0] setStringValue: [selectedCell stringValue]]; [[_form cellAtIndex: 0] setStringValue: [selectedCell stringValue]];
[_form selectTextAtIndex:0]; // [_form selectTextAtIndex:0];
[_form setNeedsDisplay:YES]; [_form setNeedsDisplay:YES];
[_okButton setEnabled:YES]; [_okButton setEnabled:YES];
} }
@ -327,7 +341,7 @@ static BOOL _gs_display_reading_progress = NO;
{ {
[_okButton setEnabled:YES]; [_okButton setEnabled:YES];
[self _selectCellName:[[_form cellAtIndex: 0] stringValue]]; [self _selectCellName:[[_form cellAtIndex: 0] stringValue]];
[_form selectTextAtIndex:0]; // [_form selectTextAtIndex:0];
[_form setNeedsDisplay:YES]; [_form setNeedsDisplay:YES];
} }
else else
@ -448,7 +462,7 @@ static BOOL _gs_display_reading_progress = NO;
_delegateHasShowFilenameFilter = NO; _delegateHasShowFilenameFilter = NO;
_delegateHasValidNameFilter = NO; _delegateHasValidNameFilter = NO;
if ([self respondsToSelector: @selector(_shouldShowExtension:)]) if ([self respondsToSelector: @selector(_shouldShowExtension:isDir:)])
_selfHasShowExtensionFilter = YES; _selfHasShowExtensionFilter = YES;
else else
_selfHasShowExtensionFilter = NO; _selfHasShowExtensionFilter = NO;
@ -767,6 +781,7 @@ static BOOL _gs_display_reading_progress = NO;
switch (character) switch (character)
{ {
#if 0
case NSTabCharacter: case NSTabCharacter:
if ([theEvent modifierFlags] & NSShiftKeyMask) if ([theEvent modifierFlags] & NSShiftKeyMask)
{ {
@ -794,7 +809,7 @@ static BOOL _gs_display_reading_progress = NO;
isARepeat:NO isARepeat:NO
keyCode:0]]; keyCode:0]];
break; break;
#endif
case NSUpArrowFunctionKey: case NSUpArrowFunctionKey:
case NSDownArrowFunctionKey: case NSDownArrowFunctionKey:
case NSLeftArrowFunctionKey: case NSLeftArrowFunctionKey:
@ -806,52 +821,6 @@ static BOOL _gs_display_reading_progress = NO;
} }
} }
- (void) keyDown: (NSEvent *)theEvent
{
NSString *characters = [theEvent characters];
unichar character = 0;
if ([characters length] > 0)
{
character = [characters characterAtIndex: 0];
}
switch (character)
{
case NSTabCharacter:
case NSUpArrowFunctionKey:
case NSDownArrowFunctionKey:
case NSLeftArrowFunctionKey:
case NSRightArrowFunctionKey:
[self selectText:self];
return;
case NSEnterCharacter:
case NSFormFeedCharacter:
case NSCarriageReturnCharacter:
if([_okButton isEnabled] == YES)
{
NSMatrix *matrix;
int selectedColumn;
selectedColumn = [_browser selectedColumn];
if(selectedColumn == -1 || selectedColumn != [_browser lastColumn])
break;
matrix = [_browser matrixInColumn:selectedColumn];
if([[matrix selectedCell] isLeaf] == NO)
{
[_form abortEditing];
[[_form cellAtIndex: 0] setStringValue: nil];
}
}
break;
}
[super keyDown:theEvent];
}
- (void) setDelegate: (id)aDelegate - (void) setDelegate: (id)aDelegate
{ {
if ([aDelegate respondsToSelector: if ([aDelegate respondsToSelector:
@ -889,6 +858,91 @@ static BOOL _gs_display_reading_progress = NO;
} }
@end @end
//
// SavePanel filename compare
//
@interface NSString (_gsSavePanel)
- (NSComparisonResult)_gsSavePanelCompare:(NSString *)other;
@end
@implementation NSString (_gsSavePanel)
- (NSComparisonResult)_gsSavePanelCompare:(NSString *)other
{
int sLength, oLength;
unichar sChar, oChar;
NSComparisonResult result;
NSRange range;
sLength = [self length];
oLength = [other length];
range.location = 0;
range.length = sLength;
if (sLength == 0)
{
if (oLength == 0)
return NSOrderedSame;
else
return NSOrderedAscending;
}
else if (oLength == 0)
{
return NSOrderedDescending;
}
sChar = [self characterAtIndex: 0];
oChar = [other characterAtIndex: 0];
if (sChar == '.' && oChar != '.')
return NSOrderedDescending;
else if (sChar != '.' && oChar == '.')
return NSOrderedAscending;
if (sLength == oLength)
{
result = [self compare: other
options: NSCaseInsensitiveSearch
range: range];
if (result == NSOrderedSame)
result = [self compare: other options: 0 range: range];
}
else
{
if (sLength < oLength)
{
result = [other compare: self
options: NSCaseInsensitiveSearch
range: range];
if (result == NSOrderedAscending)
result = NSOrderedDescending;
else if (result == NSOrderedDescending)
result = NSOrderedAscending;
else
{
result = [other compare: self options: 0 range: range];
if (result == NSOrderedAscending)
result = NSOrderedDescending;
else
result = NSOrderedAscending;
}
}
else
result = [self compare: other
options: NSCaseInsensitiveSearch
range: range];
if (result == NSOrderedSame)
result = [self compare: other options: 0 range: range];
}
return result;
}
@end
// //
// NSSavePanel browser delegate methods // NSSavePanel browser delegate methods
// //
@ -990,7 +1044,7 @@ createRowsForColumn: (int)column
context: nil]; context: nil];
} }
else else
files = [files sortedArrayUsingSelector: @selector(compare:)]; files = [files sortedArrayUsingSelector: @selector(_gsSavePanelCompare:)];
addedRows = 0; addedRows = 0;
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
@ -1020,17 +1074,14 @@ createRowsForColumn: (int)column
if (_treatsFilePackagesAsDirectories == NO && isDir == YES && exists) if (_treatsFilePackagesAsDirectories == NO && isDir == YES && exists)
{ {
// Ones with more chance first // Ones with more chance first
if ([extension isEqualToString: @"app"] if ([self isMemberOfClass: [NSSavePanel class]] == YES)
|| [extension isEqualToString: @"bundle"] if ([extension isEqualToString: _requiredFileType] == YES)
|| [extension isEqualToString: @"palette"] isDir = NO;
|| [extension isEqualToString: @"debug"]
|| [extension isEqualToString: @"profile"])
isDir = NO;
} }
if (_selfHasShowExtensionFilter && exists && (isDir == NO)) if (_selfHasShowExtensionFilter && exists)
{ {
exists = [self _shouldShowExtension: extension]; exists = [self _shouldShowExtension: extension isDir: &isDir];
} }
if (exists) if (exists)
@ -1149,33 +1200,10 @@ selectCellWithString: (NSString*)title
// NSForm delegate methods // NSForm delegate methods
// //
@interface NSSavePanel (FormDelegate) @interface NSSavePanel (FormDelegate)
- (void) controlTextDidEndEditing: (NSNotification*)aNotification;
- (void) controlTextDidChange: (NSNotification *)aNotification; - (void) controlTextDidChange: (NSNotification *)aNotification;
@end @end
@implementation NSSavePanel (FormDelegate) @implementation NSSavePanel (FormDelegate)
- (void) controlTextDidEndEditing: (NSNotification*)aNotification
{
id textMovement = [[aNotification userInfo] objectForKey: @"NSTextMovement"];
if (textMovement)
{
switch ([(NSNumber *)textMovement intValue])
{
case NSTabTextMovement:
case NSBacktabTextMovement:
case NSUpTextMovement:
case NSDownTextMovement:
case NSLeftTextMovement:
case NSRightTextMovement:
case NSReturnTextMovement:
[NSApp postEvent:[self currentEvent]
atStart:YES];
break;
}
}
}
- (void) controlTextDidChange: (NSNotification *)aNotification; - (void) controlTextDidChange: (NSNotification *)aNotification;
{ {
NSString *s, *selectedString; NSString *s, *selectedString;

View file

@ -458,13 +458,23 @@ static NSNotificationCenter *nc;
switch ([(NSNumber *)textMovement intValue]) switch ([(NSNumber *)textMovement intValue])
{ {
case NSReturnTextMovement: case NSReturnTextMovement:
[self sendAction: [self action] to: [self target]]; if ([self sendAction: [self action] to: [self target]] == NO)
{
if ([self performKeyEquivalent: [_window currentEvent]] == NO)
[self selectText: self];
}
break; break;
case NSTabTextMovement: case NSTabTextMovement:
[_window selectKeyViewFollowingView: self]; [_window selectKeyViewFollowingView: self];
if ([_window firstResponder] == _window)
[self selectText: self];
break; break;
case NSBacktabTextMovement: case NSBacktabTextMovement:
[_window selectKeyViewPrecedingView: self]; [_window selectKeyViewPrecedingView: self];
if ([_window firstResponder] == _window)
[self selectText: self];
break; break;
} }
} }

View file

@ -2264,10 +2264,7 @@ afterString in order over charRange. */
unsigned newLocation; unsigned newLocation;
if (_tf.is_field_editor) if (_tf.is_field_editor)
{ return;
[self _illegalMovement: NSUpTextMovement];
return;
}
/* Do nothing if we are at beginning of text */ /* Do nothing if we are at beginning of text */
if (_selected_range.location == 0) if (_selected_range.location == 0)
@ -2303,10 +2300,7 @@ afterString in order over charRange. */
unsigned newLocation; unsigned newLocation;
if (_tf.is_field_editor) if (_tf.is_field_editor)
{ return;
[self _illegalMovement: NSDownTextMovement];
return;
}
/* Do nothing if we are at end of text */ /* Do nothing if we are at end of text */
if (_selected_range.location == [_textStorage length]) if (_selected_range.location == [_textStorage length])
@ -2341,13 +2335,7 @@ afterString in order over charRange. */
/* Do nothing if we are at beginning of text with no selection */ /* Do nothing if we are at beginning of text with no selection */
if (_selected_range.location == 0 && _selected_range.length == 0) if (_selected_range.location == 0 && _selected_range.length == 0)
{ return;
if (_tf.is_field_editor)
{
[self _illegalMovement: NSLeftTextMovement];
}
return;
}
if (_selected_range.location == 0) if (_selected_range.location == 0)
{ {
@ -2368,13 +2356,7 @@ afterString in order over charRange. */
/* Do nothing if we are at end of text */ /* Do nothing if we are at end of text */
if (_selected_range.location == length) if (_selected_range.location == length)
{ return;
if (_tf.is_field_editor)
{
[self _illegalMovement: NSRightTextMovement];
}
return;
}
newLocation = MIN (NSMaxRange (_selected_range) + 1, length); newLocation = MIN (NSMaxRange (_selected_range) + 1, length);

View file

@ -425,6 +425,7 @@ GSSetDragTypes(NSView* obj, NSArray *types)
} }
aSubview->_super_view = nil; aSubview->_super_view = nil;
[aSubview viewWillMoveToWindow: nil]; [aSubview viewWillMoveToWindow: nil];
[aSubview setNextResponder: nil];
[_sub_views removeObjectIdenticalTo: aSubview]; [_sub_views removeObjectIdenticalTo: aSubview];
if ([_sub_views count] == 0) if ([_sub_views count] == 0)
{ {

View file

@ -555,6 +555,7 @@ static NSMapTable* windowmaps = NULL;
TEST_RELEASE(_windowTitle); TEST_RELEASE(_windowTitle);
TEST_RELEASE(_rectsBeingDrawn); TEST_RELEASE(_rectsBeingDrawn);
TEST_RELEASE(_initialFirstResponder); TEST_RELEASE(_initialFirstResponder);
TEST_RELEASE(_originalResponder);
TEST_RELEASE(_defaultButtonCell); TEST_RELEASE(_defaultButtonCell);
/* /*
@ -2440,24 +2441,27 @@ resetCursorRectsForView(NSView *theView)
{ {
[NSApp activateIgnoringOtherApps: YES]; [NSApp activateIgnoringOtherApps: YES];
} }
if (_f.is_key == NO) if (_f.has_closed == NO)
{ {
[self makeKeyAndOrderFront: self]; if (_f.is_key == NO)
}
v = [_contentView hitTest: [theEvent locationInWindow]];
if (_firstResponder != v)
{
[self makeFirstResponder: v];
}
if (wasKey == YES || [v acceptsFirstMouse: theEvent] == YES)
{
if ([NSHelpManager isContextHelpModeActive])
{ {
[v helpRequested: theEvent]; [self makeKeyAndOrderFront: self];
} }
else v = [_contentView hitTest: [theEvent locationInWindow]];
if (_firstResponder != v)
{ {
[v mouseDown: theEvent]; [self makeFirstResponder: v];
}
if (wasKey == YES || [v acceptsFirstMouse: theEvent] == YES)
{
if ([NSHelpManager isContextHelpModeActive])
{
[v helpRequested: theEvent];
}
else
{
[v mouseDown: theEvent];
}
} }
} }
_lastPoint = [theEvent locationInWindow]; _lastPoint = [theEvent locationInWindow];
@ -2554,7 +2558,7 @@ resetCursorRectsForView(NSView *theView)
* Save the first responder so that the key up goes to it and not a * Save the first responder so that the key up goes to it and not a
* possible new first responder. * possible new first responder.
*/ */
_originalResponder = _firstResponder; ASSIGN(_originalResponder, _firstResponder);
[_firstResponder keyDown: theEvent]; [_firstResponder keyDown: theEvent];
break; break;
@ -2564,6 +2568,7 @@ resetCursorRectsForView(NSView *theView)
*/ */
if (_originalResponder) if (_originalResponder)
[_originalResponder keyUp: theEvent]; [_originalResponder keyUp: theEvent];
DESTROY(_originalResponder);
break; break;
case NSFlagsChanged: // Flags changed case NSFlagsChanged: // Flags changed