Use method calls instead of some of the direct references to

NSLayoutManager ivar. General clean up.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@16092 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2003-03-01 00:43:54 +00:00
parent 005bacbebb
commit df30e235c5

View file

@ -1,6 +1,8 @@
/** <title>NSTextView</title>
Copyright (C) 1996, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
<abstract>Categories which add user actions to NSTextView</abstract>
Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
Originally moved here from NSTextView.m.
@ -40,8 +42,8 @@
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <Foundation/NSNotification.h>
#include <Foundation/NSValue.h>
@ -51,11 +53,6 @@
#include <AppKit/NSTextStorage.h>
#include <AppKit/NSTextView.h>
/**** User actions ****/
/* TODO: all these need to be cleaned up */
/*
These methods are for user actions, ie. they are normally called from
-doCommandBySelector: (which is called by the input manager) in response
@ -69,7 +66,6 @@ and make sure all necessary notifications are sent. This is done by sending
All actions from NSResponder that make sense for a text view should be
implemented here, but this is _not_ the place to add new actions.
When changing attributes, the range returned by
rangeForUserCharacterAttributeChange or rangeForUserParagraphAttributeChange
should be used. If the location is NSNotFound, nothing should be done (in
@ -79,21 +75,13 @@ returns YES, the attributes of the range and the typing attributes should be
changed, and -didChangeText should be called.
In a non-rich-text text view, the typing attributes _must_always_ hold the
attributes of the text. Thus, the typing attributes muse always be changed
attributes of the text. Thus, the typing attributes must always be changed
in the same way that the attributes of the text are changed.
(TODO: Will need to look over methods that deal with attributes to make
sure this holds.)
TODO: can the selected range's location be NSNotFound? when?
Not all user actions are here. Exceptions:
-toggleRuler:
-copy:
-copyFont:
-copyRuler:
@ -108,9 +96,6 @@ Not all user actions are here. Exceptions:
-selectAll: (implemented in NSText)
-toggleContinuousSpellChecking:
Not all methods that handle user-induced text modifications are here.
Exceptions:
(TODO)
@ -142,7 +127,7 @@ send -shouldChangeTextInRange:replacementString: or -didChangeText.
@implementation NSTextView (user_action_helpers)
-(void) _illegalMovement: (int)textMovement
- (void) _illegalMovement: (int)textMovement
{
/* This is similar to [self resignFirstResponder], with the
difference that in the notification we need to put the
@ -177,9 +162,9 @@ send -shouldChangeTextInRange:replacementString: or -didChangeText.
}
-(void) _changeAttribute: (NSString *)name
inRange: (NSRange)r
using: (id (*)(id))func
- (void) _changeAttribute: (NSString *)name
inRange: (NSRange)r
using: (id (*)(id))func
{
unsigned int i;
NSRange e, r2;
@ -301,7 +286,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
}
-(void) subscript: (id)sender
- (void) subscript: (id)sender
{
NSRange r = [self rangeForUserCharacterAttributeChange];
@ -313,7 +298,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
using: int_minus_one];
}
-(void) superscript: (id)sender
- (void) superscript: (id)sender
{
NSRange r = [self rangeForUserCharacterAttributeChange];
@ -325,7 +310,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
using: int_plus_one];
}
-(void) lowerBaseline: (id)sender
- (void) lowerBaseline: (id)sender
{
NSRange r = [self rangeForUserCharacterAttributeChange];
@ -337,7 +322,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
using: float_plus_one];
}
-(void) raiseBaseline: (id)sender
- (void) raiseBaseline: (id)sender
{
NSRange r = [self rangeForUserCharacterAttributeChange];
@ -349,7 +334,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
using: float_minus_one];
}
-(void) unscript: (id)sender
- (void) unscript: (id)sender
{
NSRange aRange = [self rangeForUserCharacterAttributeChange];
@ -372,12 +357,11 @@ static NSNumber *float_plus_one(NSNumber *cur)
[_layoutManager->_typingAttributes removeObjectForKey: NSSuperscriptAttributeName];
[_layoutManager->_typingAttributes removeObjectForKey: NSBaselineOffsetAttributeName];
[self didChangeText];
}
-(void) underline: (id)sender
- (void) underline: (id)sender
{
BOOL doUnderline = YES;
NSRange aRange = [self rangeForUserCharacterAttributeChange];
@ -409,7 +393,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
}
-(void) useStandardKerning: (id)sender
- (void) useStandardKerning: (id)sender
{
NSRange aRange = [self rangeForUserCharacterAttributeChange];
@ -425,7 +409,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
[self didChangeText];
}
-(void) turnOffKerning: (id)sender
- (void) turnOffKerning: (id)sender
{
NSRange aRange = [self rangeForUserCharacterAttributeChange];
@ -443,7 +427,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
[self didChangeText];
}
-(void) loosenKerning: (id)sender
- (void) loosenKerning: (id)sender
{
NSRange r = [self rangeForUserCharacterAttributeChange];
@ -455,7 +439,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
using: float_plus_one];
}
-(void) tightenKerning: (id)sender
- (void) tightenKerning: (id)sender
{
NSRange r = [self rangeForUserCharacterAttributeChange];
@ -467,7 +451,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
using: float_minus_one];
}
-(void) turnOffLigatures: (id)sender
- (void) turnOffLigatures: (id)sender
{
NSRange aRange = [self rangeForUserCharacterAttributeChange];
@ -485,7 +469,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
[self didChangeText];
}
-(void) useStandardLigatures: (id)sender
- (void) useStandardLigatures: (id)sender
{
NSRange aRange = [self rangeForUserCharacterAttributeChange];
@ -502,7 +486,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
[self didChangeText];
}
-(void) useAllLigatures: (id)sender
- (void) useAllLigatures: (id)sender
{
NSRange aRange = [self rangeForUserCharacterAttributeChange];
@ -520,7 +504,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
[self didChangeText];
}
-(void) toggleTraditionalCharacterShape: (id)sender
- (void) toggleTraditionalCharacterShape: (id)sender
{
// TODO
NSLog(@"Method %s is not implemented for class %s",
@ -528,7 +512,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
}
-(void) insertNewline: (id)sender
- (void) insertNewline: (id)sender
{
if (_tf.is_field_editor)
{
@ -539,7 +523,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
[self insertText: @"\n"];
}
-(void) insertTab: (id)sender
- (void) insertTab: (id)sender
{
if (_tf.is_field_editor)
{
@ -550,7 +534,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
[self insertText: @"\t"];
}
-(void) insertBacktab: (id)sender
- (void) insertBacktab: (id)sender
{
if (_tf.is_field_editor)
{
@ -563,7 +547,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
}
-(void) deleteForward: (id)sender
- (void) deleteForward: (id)sender
{
NSRange range = [self rangeForUserTextChange];
@ -605,7 +589,7 @@ static NSNumber *float_plus_one(NSNumber *cur)
[self setSelectedRange: NSMakeRange (range.location, 0)];
}
-(void) deleteBackward: (id)sender
- (void) deleteBackward: (id)sender
{
NSRange range = [self rangeForUserTextChange];
@ -683,24 +667,32 @@ added to the selection (1,3).
*/
-(unsigned int) _movementOrigin
- (unsigned int) _movementOrigin
{
if (_layoutManager->_selectionAffinity == NSSelectionAffinityUpstream)
return _layoutManager->_selected_range.location;
NSRange range = [self selectedRange];
if ([self selectionAffinity] == NSSelectionAffinityUpstream)
return range.location;
else
return NSMaxRange(_layoutManager->_selected_range);
return NSMaxRange(range);
}
-(void) _moveTo: (unsigned int)cindex
select: (BOOL)select
- (unsigned int) _movementEnd
{
NSRange range = [self selectedRange];
if ([self selectionAffinity] == NSSelectionAffinityDownstream)
return range.location;
else
return NSMaxRange(range);
}
- (void) _moveTo: (unsigned int)cindex
select: (BOOL)select
{
if (select)
{
unsigned int anchor;
if (_layoutManager->_selectionAffinity == NSSelectionAffinityDownstream)
anchor = _layoutManager->_selected_range.location;
else
anchor = NSMaxRange(_layoutManager->_selected_range);
unsigned int anchor = [self _movementEnd];
if (anchor < cindex)
{
@ -721,9 +713,9 @@ added to the selection (1,3).
}
}
-(void) _move: (GSInsertionPointMovementDirection)direction
distance: (float)distance
select: (BOOL)select
- (void) _move: (GSInsertionPointMovementDirection)direction
distance: (float)distance
select: (BOOL)select
{
unsigned int cindex;
int new_direction;
@ -749,7 +741,6 @@ added to the selection (1,3).
{
_originalInsertionPointCharacterIndex = cindex;
}
cindex = [_layoutManager characterIndexMoving: direction
fromCharacterIndex: cindex
@ -766,84 +757,46 @@ added to the selection (1,3).
/*
Insertion point movement actions.
TODO: should implement: (D marks done)
D-(void) moveBackward: (id)sender;
D-(void) moveBackwardAndModifySelection: (id)sender;
D-(void) moveForward: (id)sender;
D-(void) moveForwardAndModifySelection: (id)sender;
D-(void) moveDown: (id)sender;
D-(void) moveDownAndModifySelection: (id)sender;
D-(void) moveUp: (id)sender;
D-(void) moveUpAndModifySelection: (id)sender;
D-(void) moveLeft: (id)sender;
D-(void) moveRight: (id)sender;
D-(void) moveWordBackward: (id)sender;
D-(void) moveWordBackwardAndModifySelection: (id)sender;
D-(void) moveWordForward: (id)sender;
D-(void) moveWordForwardAndModifySelection: (id)sender;
D-(void) moveToBeginningOfDocument: (id)sender;
D-(void) moveToEndOfDocument: (id)sender;
D-(void) moveToBeginningOfLine: (id)sender;
D-(void) moveToEndOfLine: (id)sender;
-(void) moveToBeginningOfParagraph: (id)sender;
-(void) moveToEndOfParagraph: (id)sender;
TODO: think hard about behavior for pageUp: and pageDown:
D-(void) pageDown: (id)sender;
D-(void) pageUp: (id)sender;
TODO: some of these used to do nothing if self is a field editor. should
check if there was a reason for that.
*/
-(void) moveUp: (id)sender
- (void) moveUp: (id)sender
{
[self _move: GSInsertionPointMoveUp
distance: 0.0
select: NO];
}
-(void) moveUpAndModifySelection: (id)sender
- (void) moveUpAndModifySelection: (id)sender
{
[self _move: GSInsertionPointMoveUp
distance: 0.0
select: YES];
}
-(void) moveDown: (id)sender
- (void) moveDown: (id)sender
{
[self _move: GSInsertionPointMoveDown
distance: 0.0
select: NO];
}
-(void) moveDownAndModifySelection: (id)sender
- (void) moveDownAndModifySelection: (id)sender
{
[self _move: GSInsertionPointMoveDown
distance: 0.0
select: YES];
}
-(void) moveLeft: (id)sender
- (void) moveLeft: (id)sender
{
[self _move: GSInsertionPointMoveLeft
distance: 0.0
select: NO];
}
-(void) moveRight: (id)sender
- (void) moveRight: (id)sender
{
[self _move: GSInsertionPointMoveRight
distance: 0.0
@ -851,18 +804,21 @@ check if there was a reason for that.
}
-(void) moveBackward: (id)sender
- (void) moveBackward: (id)sender
{
unsigned int to = [self _movementOrigin];
if (to == 0)
return;
to--;
[self _moveTo: to
select: NO];
}
-(void) moveBackwardAndModifySelection: (id)sender
- (void) moveBackwardAndModifySelection: (id)sender
{
unsigned int to = [self _movementOrigin];
if (to == 0)
return;
to--;
@ -870,18 +826,20 @@ check if there was a reason for that.
select: YES];
}
-(void) moveForward: (id)sender
- (void) moveForward: (id)sender
{
unsigned int to = [self _movementOrigin];
if (to == [_textStorage length])
return;
to++;
[self _moveTo: to
select: NO];
}
-(void) moveForwardAndModifySelection: (id)sender
- (void) moveForwardAndModifySelection: (id)sender
{
unsigned int to = [self _movementOrigin];
if (to == [_textStorage length])
return;
to++;
@ -889,68 +847,76 @@ check if there was a reason for that.
select: YES];
}
-(void) moveWordBackward: (id)sender
- (void) moveWordBackward: (id)sender
{
unsigned int newLocation;
newLocation = [_textStorage nextWordFromIndex: [self _movementOrigin]
forward: NO];
[self _moveTo: newLocation
select: NO];
}
-(void) moveWordBackwardAndModifySelection: (id)sender
- (void) moveWordBackwardAndModifySelection: (id)sender
{
unsigned int newLocation;
newLocation = [_textStorage nextWordFromIndex: [self _movementOrigin]
forward: NO];
[self _moveTo: newLocation
select: YES];
}
-(void) moveWordForward: (id)sender
- (void) moveWordForward: (id)sender
{
unsigned newLocation;
newLocation = [_textStorage nextWordFromIndex: [self _movementOrigin]
forward: YES];
[self _moveTo: newLocation
select: NO];
}
-(void) moveWordForwardAndModifySelection: (id)sender
- (void) moveWordForwardAndModifySelection: (id)sender
{
unsigned newLocation;
newLocation = [_textStorage nextWordFromIndex: [self _movementOrigin]
forward: YES];
[self _moveTo: newLocation
select: YES];
}
-(void) moveToBeginningOfDocument: (id)sender
- (void) moveToBeginningOfDocument: (id)sender
{
[self _moveTo: 0
select: NO];
}
-(void) moveToEndOfDocument: (id)sender
- (void) moveToEndOfDocument: (id)sender
{
[self _moveTo: [_textStorage length]
select: NO];
}
-(void) moveToBeginningOfParagraph: (id)sender
- (void) moveToBeginningOfParagraph: (id)sender
{
NSRange aRange;
aRange = [[_textStorage string] lineRangeForRange: NSMakeRange([self _movementOrigin], 0)];
aRange = [[_textStorage string] lineRangeForRange:
NSMakeRange([self _movementOrigin], 0)];
[self _moveTo: aRange.location
select: NO];
}
-(void) moveToEndOfParagraph: (id)sender
- (void) moveToEndOfParagraph: (id)sender
{
NSRange aRange;
unsigned newLocation;
unsigned maxRange;
aRange = [[_textStorage string] lineRangeForRange: NSMakeRange([self _movementOrigin], 0)];
aRange = [[_textStorage string] lineRangeForRange:
NSMakeRange([self _movementOrigin], 0)];
maxRange = NSMaxRange (aRange);
if (maxRange == 0)
@ -1000,27 +966,26 @@ check if there was a reason for that.
/* TODO: this is only the beginning and end of lines if lines are horizontal
and layout is left-to-right */
-(void) moveToBeginningOfLine: (id)sender
- (void) moveToBeginningOfLine: (id)sender
{
[self _move: GSInsertionPointMoveLeft
distance: 1e8
select: NO];
}
-(void) moveToEndOfLine: (id)sender
- (void) moveToEndOfLine: (id)sender
{
[self _move: GSInsertionPointMoveRight
distance: 1e8
select: NO];
}
/**
* Tries to move the selection/insertion point down one page of the
* visible rect in the receiver while trying to maintain the
* horizontal position of the last vertical movement.
* If the receiver is a field editor, this method returns immediatly.
*/
-(void) pageDown: (id)sender
- (void) pageDown: (id)sender
{
float scrollDelta;
float oldOriginY;
@ -1055,7 +1020,7 @@ and layout is left-to-right */
* horizontal position of the last vertical movement.
* If the receiver is a field editor, this method returns immediatly.
*/
-(void) pageUp: (id)sender
- (void) pageUp: (id)sender
{
float scrollDelta;
float oldOriginY;
@ -1085,30 +1050,28 @@ and layout is left-to-right */
select: NO];
}
-(void) scrollLineDown: (id)sender
- (void) scrollLineDown: (id)sender
{
// TODO
NSLog(@"Method %s is not implemented for class %s",
"scrollLineDown:", "NSTextView");
}
-(void) scrollLineUp: (id)sender
- (void) scrollLineUp: (id)sender
{
// TODO
NSLog(@"Method %s is not implemented for class %s",
"scrollLineUp:", "NSTextView");
}
-(void) scrollPageDown: (id)sender
- (void) scrollPageDown: (id)sender
{
// TODO
NSLog(@"Method %s is not implemented for class %s",
"scrollPageDown:", "NSTextView");
}
-(void) scrollPageUp: (id)sender
- (void) scrollPageUp: (id)sender
{
// TODO
NSLog(@"Method %s is not implemented for class %s",
@ -1118,7 +1081,7 @@ and layout is left-to-right */
/* -selectAll: inherited from NSText */
-(void) selectLine: (id)sender
- (void) selectLine: (id)sender
{
unsigned int start, end, cindex;
@ -1144,32 +1107,26 @@ and layout is left-to-right */
TODO: description incorrect. should swap characters on either side of the
insertion point. (see also: miswart)
*/
-(void) transpose: (id)sender
- (void) transpose: (id)sender
{
NSRange range;
NSRange range = [self selectedRange];
NSString *string;
NSString *replacementString;
unichar chars[2];
unichar tmp;
/* Do nothing if we are at beginning of text. */
if (_layoutManager->_selected_range.location < 2)
if (range.location < 2)
{
return;
}
range = NSMakeRange (_layoutManager->_selected_range.location - 2, 2);
range = NSMakeRange(range.location - 2, 2);
/* Get the two chars. */
/* Get the two chars and swap them. */
string = [_textStorage string];
chars[0] = [string characterAtIndex: (_layoutManager->_selected_range.location - 2)];
chars[1] = [string characterAtIndex: (_layoutManager->_selected_range.location - 1)];
chars[1] = [string characterAtIndex: range.location];
chars[0] = [string characterAtIndex: (range.location + 1)];
/* Swap them. */
tmp = chars[0];
chars[0] = chars[1];
chars[1] = tmp;
/* Replace the original chars with the swapped ones. */
replacementString = [NSString stringWithCharacters: chars length: 2];
@ -1182,17 +1139,17 @@ insertion point. (see also: miswart)
}
}
-(void) delete: (id)sender
- (void) delete: (id)sender
{
[self deleteForward: sender];
}
/* Helper for -align*: */
-(void) _alignUser: (NSTextAlignment)alignment
- (void) _alignUser: (NSTextAlignment)alignment
{
NSRange r = [self rangeForUserParagraphAttributeChange];
if (r.location == NSNotFound)
return;
if (![self shouldChangeTextInRange: r
@ -1204,35 +1161,35 @@ insertion point. (see also: miswart)
[self didChangeText];
}
-(void) alignCenter: (id)sender
- (void) alignCenter: (id)sender
{
[self _alignUser: NSCenterTextAlignment];
}
-(void) alignLeft: (id)sender
- (void) alignLeft: (id)sender
{
[self _alignUser: NSLeftTextAlignment];
}
-(void) alignRight: (id)sender
- (void) alignRight: (id)sender
{
[self _alignUser: NSRightTextAlignment];
}
-(void) alignJustified: (id)sender
- (void) alignJustified: (id)sender
{
[self _alignUser: NSJustifiedTextAlignment];
}
-(void) toggleContinuousSpellChecking: (id)sender
- (void) toggleContinuousSpellChecking: (id)sender
{
[self setContinuousSpellCheckingEnabled:
![self isContinuousSpellCheckingEnabled]];
}
-(void) toggleRuler: (id)sender
- (void) toggleRuler: (id)sender
{
[self setRulerVisible: !_tf.is_ruler_visible];
}
@end