diff --git a/Source/NSTextView_actions.m b/Source/NSTextView_actions.m
index a4e427c3f..63beeb6b2 100644
--- a/Source/NSTextView_actions.m
+++ b/Source/NSTextView_actions.m
@@ -1,6 +1,8 @@
/**
NSTextView
- Copyright (C) 1996, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Categories which add user actions to NSTextView
+
+ 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
#include
@@ -51,11 +53,6 @@
#include
#include
-
-/**** 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
-