* 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 Viviani 2001-03-22 00:27:37 +00:00
parent 2bbfbf1bb5
commit 60b8f20ce4
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>
* 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,
int count);
void NSDrawWhiteBezel(const NSRect aRect, const NSRect clipRect);
void NSDottedFrameRect(const NSRect aRect);
void NSFrameRect(const NSRect aRect);
void NSFrameRectWithWidth(const NSRect aRect, float frameWidth);

View file

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

View file

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

View file

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

View file

@ -323,6 +323,34 @@ id _nsbuttonCellClass = nil;
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
{
if ([self isEnabled])

View file

@ -127,6 +127,79 @@
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
{
// TODO Should change the size of the key equivalent font
@ -739,6 +812,16 @@
{
[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];
}

View file

@ -395,7 +395,76 @@ static NSColor *shadowCol;
- (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 setRichText: _cell.is_rich_text];
[textObject setImportsGraphics: _cell.imports_graphics];
[textObject setSelectedRange: NSMakeRange(0, 0)];
return textObject;
}
@ -1438,11 +1508,6 @@ static NSColor *shadowCol;
[controlView lockFocus];
/* TODO: Enable this when NSDottedFrameRect is implemented.
if (_cell.show_first_responder && [controlView isFirstResponder])
NSDottedFrameRect(cellFrame);
*/
switch (_cell.type)
{
case NSTextCellType:
@ -1480,6 +1545,11 @@ static NSColor *shadowCol;
case NSNullCellType:
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
// to reuse this code while doing their own custom highlighting and
// prettyfying
@ -1576,12 +1646,13 @@ static NSColor *shadowCol;
[textObject setDelegate: anObject];
[[controlView window] makeFirstResponder: textObject];
[textObject display];
if ([theEvent type] == NSLeftMouseDown)
{
[textObject mouseDown: theEvent];
}
[textObject display];
}
- (void) endEditing: (NSText*)textObject

View file

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

View file

@ -62,7 +62,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
@interface NSOpenPanel (_PrivateMethods)
- (void) _resetDefaults;
- (BOOL) _shouldShowExtension: (NSString *)extension;
- (BOOL) _shouldShowExtension: (NSString *)extension isDir: (BOOL *)isDir;
@end
@implementation NSOpenPanel (_PrivateMethods)
@ -75,16 +75,27 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
[self setAllowsMultipleSelection: NO];
[_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
@ -110,7 +121,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
else
{
[self _selectCellName:[[_form cellAtIndex: 0] stringValue]];
[_form selectTextAtIndex:0];
// [_form selectTextAtIndex:0];
[_okButton setEnabled:YES];
}
}
@ -118,7 +129,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
{
[_form abortEditing];
[[_form cellAtIndex: 0] setStringValue:nil];
[_form selectTextAtIndex:0];
// [_form selectTextAtIndex:0];
[_form setNeedsDisplay:YES];
[_okButton setEnabled:YES];
}
@ -132,7 +143,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
if([[[_form cellAtIndex: 0] stringValue] length] > 0)
{
[self _selectCellName:[[_form cellAtIndex: 0] stringValue]];
[_form selectTextAtIndex:0];
// [_form selectTextAtIndex:0];
[_form setNeedsDisplay:YES];
}

View file

@ -296,7 +296,20 @@ Class _nspopupbuttonCellClass = 0;
{
[[popb_menu menuRepresentation] sizeToFit];
[super sizeToFit];
}
}
- (BOOL) resignFirstResponder
{
[_cell dismissPopUp];
return [super resignFirstResponder];
}
- (void) resignKeyWindow
{
[_cell dismissPopUp];
[super resignKeyWindow];
}
- (void) mouseDown: (NSEvent*)theEvent
{
@ -342,6 +355,102 @@ Class _nspopupbuttonCellClass = 0;
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
*/

View file

@ -525,8 +525,8 @@ static NSImage *_pbc_image[2];
* that is used to draw cells in the menu.
* This looks like a mess to do in this framework.
*/
- (void) drawWithFrame: (NSRect)cellFrame
inView: (NSView*)view
- (void) drawInteriorWithFrame: (NSRect)cellFrame
inView: (NSView*)view
{
NSSize size;
NSPoint position;
@ -538,11 +538,19 @@ static NSImage *_pbc_image[2];
[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
cellFrame.origin.x += 5;
cellFrame.size.width -= 5;
// cellFrame.origin.x += 5;
// cellFrame.size.width -= 5;
[self _drawText: [self titleOfSelectedItem] inFrame: cellFrame];
@ -562,6 +570,16 @@ static NSImage *_pbc_image[2];
position.y += size.height;
[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 file

@ -63,7 +63,7 @@ static BOOL _gs_display_reading_progress = NO;
// Subclasses (read NSOpenPanel) may implement this
// to filter some extensions out of displayed files.
@interface NSObject (_SavePanelPrivate)
-(BOOL) _shouldShowExtension: (NSString*)extension;
-(BOOL) _shouldShowExtension: (NSString*)extension isDir: (BOOL *)isDir;
@end
//
@ -92,6 +92,7 @@ static BOOL _gs_display_reading_progress = NO;
NSButton *button;
NSImage *image;
NSRect r;
id lastKeyView;
//
// 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);
_browser = [[NSBrowser alloc] initWithFrame: r];
lastKeyView = _browser;
[_browser setDelegate: self];
[_browser setMaxVisibleColumns: 2];
[_browser setHasHorizontalScroller: YES];
@ -146,6 +148,8 @@ static BOOL _gs_display_reading_progress = NO;
[_form setAutoresizingMask: NSViewWidthSizable];
[_form setDelegate: self];
[_bottomView addSubview: _form];
[lastKeyView setNextKeyView: _form];
lastKeyView = _form;
[_form release];
r = NSMakeRect (43, 6, 27, 27);
@ -161,6 +165,8 @@ static BOOL _gs_display_reading_progress = NO;
[button setAutoresizingMask: NSViewMinXMargin];
[button setTag: NSFileHandlingPanelHomeButton];
[_bottomView addSubview: button];
[lastKeyView setNextKeyView: button];
lastKeyView = button;
[button release];
r = NSMakeRect (78, 6, 27, 27);
@ -175,6 +181,8 @@ static BOOL _gs_display_reading_progress = NO;
[button setAutoresizingMask: NSViewMinXMargin];
[button setTag: NSFileHandlingPanelDiskButton];
[_bottomView addSubview: button];
[lastKeyView setNextKeyView: button];
lastKeyView = button;
[button release];
r = NSMakeRect (112, 6, 27, 27);
@ -189,6 +197,8 @@ static BOOL _gs_display_reading_progress = NO;
[button setAutoresizingMask: NSViewMinXMargin];
[button setTag: NSFileHandlingPanelDiskEjectButton];
[_bottomView addSubview: button];
[lastKeyView setNextKeyView: button];
lastKeyView = button;
[button release];
r = NSMakeRect (148, 6, 71, 27);
@ -202,6 +212,8 @@ static BOOL _gs_display_reading_progress = NO;
[button setAutoresizingMask: NSViewMinXMargin];
[button setTag: NSFileHandlingPanelCancelButton];
[_bottomView addSubview: button];
[lastKeyView setNextKeyView: button];
lastKeyView = button;
[button release];
r = NSMakeRect (228, 6, 71, 27);
@ -215,11 +227,12 @@ static BOOL _gs_display_reading_progress = NO;
[_okButton setTarget: self];
[_okButton setAction: @selector(ok:)];
[_okButton setEnabled: NO];
// [_okButton setNextKeyView: _form];
[_okButton setAutoresizingMask: NSViewMinXMargin];
[_okButton setTag: NSFileHandlingPanelOKButton];
[_bottomView addSubview: _okButton];
[self setDefaultButtonCell:[_okButton cell]];
[lastKeyView setNextKeyView: _okButton];
[_okButton setNextKeyView: _browser];
[self setDefaultButtonCell: [_okButton cell]];
[_okButton release];
[_browser setDoubleAction: @selector(performClick:)];
@ -259,6 +272,7 @@ static BOOL _gs_display_reading_progress = NO;
[bar release];
[self setContentSize: NSMakeSize (384, 426)];
[self setInitialFirstResponder: _form];
[super setTitle: @""];
return self;
@ -317,7 +331,7 @@ static BOOL _gs_display_reading_progress = NO;
if (isLeaf)
{
[[_form cellAtIndex: 0] setStringValue: [selectedCell stringValue]];
[_form selectTextAtIndex:0];
// [_form selectTextAtIndex:0];
[_form setNeedsDisplay:YES];
[_okButton setEnabled:YES];
}
@ -327,7 +341,7 @@ static BOOL _gs_display_reading_progress = NO;
{
[_okButton setEnabled:YES];
[self _selectCellName:[[_form cellAtIndex: 0] stringValue]];
[_form selectTextAtIndex:0];
// [_form selectTextAtIndex:0];
[_form setNeedsDisplay:YES];
}
else
@ -448,7 +462,7 @@ static BOOL _gs_display_reading_progress = NO;
_delegateHasShowFilenameFilter = NO;
_delegateHasValidNameFilter = NO;
if ([self respondsToSelector: @selector(_shouldShowExtension:)])
if ([self respondsToSelector: @selector(_shouldShowExtension:isDir:)])
_selfHasShowExtensionFilter = YES;
else
_selfHasShowExtensionFilter = NO;
@ -767,6 +781,7 @@ static BOOL _gs_display_reading_progress = NO;
switch (character)
{
#if 0
case NSTabCharacter:
if ([theEvent modifierFlags] & NSShiftKeyMask)
{
@ -794,7 +809,7 @@ static BOOL _gs_display_reading_progress = NO;
isARepeat:NO
keyCode:0]];
break;
#endif
case NSUpArrowFunctionKey:
case NSDownArrowFunctionKey:
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
{
if ([aDelegate respondsToSelector:
@ -889,6 +858,91 @@ static BOOL _gs_display_reading_progress = NO;
}
@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
//
@ -990,7 +1044,7 @@ createRowsForColumn: (int)column
context: nil];
}
else
files = [files sortedArrayUsingSelector: @selector(compare:)];
files = [files sortedArrayUsingSelector: @selector(_gsSavePanelCompare:)];
addedRows = 0;
for (i = 0; i < count; i++)
@ -1020,17 +1074,14 @@ createRowsForColumn: (int)column
if (_treatsFilePackagesAsDirectories == NO && isDir == YES && exists)
{
// Ones with more chance first
if ([extension isEqualToString: @"app"]
|| [extension isEqualToString: @"bundle"]
|| [extension isEqualToString: @"palette"]
|| [extension isEqualToString: @"debug"]
|| [extension isEqualToString: @"profile"])
isDir = NO;
if ([self isMemberOfClass: [NSSavePanel class]] == YES)
if ([extension isEqualToString: _requiredFileType] == YES)
isDir = NO;
}
if (_selfHasShowExtensionFilter && exists && (isDir == NO))
if (_selfHasShowExtensionFilter && exists)
{
exists = [self _shouldShowExtension: extension];
exists = [self _shouldShowExtension: extension isDir: &isDir];
}
if (exists)
@ -1149,33 +1200,10 @@ selectCellWithString: (NSString*)title
// NSForm delegate methods
//
@interface NSSavePanel (FormDelegate)
- (void) controlTextDidEndEditing: (NSNotification*)aNotification;
- (void) controlTextDidChange: (NSNotification *)aNotification;
@end
@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;
{
NSString *s, *selectedString;

View file

@ -458,13 +458,23 @@ static NSNotificationCenter *nc;
switch ([(NSNumber *)textMovement intValue])
{
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;
case NSTabTextMovement:
[_window selectKeyViewFollowingView: self];
if ([_window firstResponder] == _window)
[self selectText: self];
break;
case NSBacktabTextMovement:
[_window selectKeyViewPrecedingView: self];
if ([_window firstResponder] == _window)
[self selectText: self];
break;
}
}

View file

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

View file

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

View file

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