diff --git a/ChangeLog b/ChangeLog index 3a3c7426c..60b0a1a26 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2003-02-14 17:47 Alexander Malmberg + + * Headers/gnustep/gui/NSTextView.h, Source/NSTextView.m, + Source/NSTextView_actions.m: Keep track of the original index of a + sequence of moves in one dimension. Pass it to the layout manager + when moving the insertion point to prevent drifting. + + * Source/GSHorizontalTypesetter.m (-layoutLineNewParagraph:): Fix + an edge case in tab handling. Also, if tabs occur and the paragraph + style has no more tab stops, act as if there were tabs every 100 + points. + + * Source/NSLayoutManager.m (-characterIndexMoving:fromCharacterIndex: + originalCharacterIndex:distance:): When moving vertically, return the + index of the character nearest the target horizontally. + 2003-02-13 01:01 Alexander Malmberg * TextConverters/RTF/rtfGrammer.y (rtfCharset): Treat unknown diff --git a/Headers/gnustep/gui/NSTextView.h b/Headers/gnustep/gui/NSTextView.h index 11f86dd79..c4844dd50 100644 --- a/Headers/gnustep/gui/NSTextView.h +++ b/Headers/gnustep/gui/NSTextView.h @@ -185,39 +185,33 @@ therefore be stored in the NSLayoutManager to avoid problems. need to be recomputed . */ NSRect _insertionPointRect; -#if 0 - /* This is used when you move the insertion point up or down. The - system remembers the horizontal position of the insertion point - at the beginning of the process, and always tries to put the - insertion point in that horizontal position on each line when you - go up or down. The memory of the horizontal position is changed - as soon as you do something different from moving the cursor - up/down. */ - /* TODO: cursor movement needs to be worked out. The current methods - aren't good enough (eg. in a vertical layout, the original y position - should be preserved when moving left/right, but the original x position - is meaningless). A position (in the text container coordinate system) - based system won't work when moving through ligatures. A character based - system is better. A _originalCharacterIndex here should solve the problems; - a method: + /* + This is the character index a sequence of moves in one dimension (ie. + up/down or left/right) started at. It is passed to the layout manager + and is used when an NSTextView is deciding where to move. (Eg. + NSLayoutManager tries to maintain the original horizontal position when + moving up/down.) + */ + unsigned int _originalInsertionPointCharacterIndex; - -(unsigned int) characterIndexMoving: (int)direction - from: (unsigned int)currentCharIndex - original: (unsigned int)originalCharIndex + /* + 0=no information (_originalInsertionPointCharacterIndex undefined) + 1=horizontal + 2=vertical + */ + int _currentInsertionPointMovementDirection; - should be able to give proper behavior in all cases. - - Need to figure out what "proper behavior" is when moving between two + /* + TODO: + Still need to figure out what "proper behavior" is when moving between two NSTextView:s, though. */ - unsigned int _originalCharIndex; -#endif } /* Returns the default typing attributes: black text, default paragraph style, default user font and size. */ -+(NSDictionary*) defaultTypingAttributes; /* GNUstep extension */ ++(NSDictionary *) defaultTypingAttributes; /* GNUstep extension */ /**** Initializing ****/ diff --git a/Source/NSTextView.m b/Source/NSTextView.m index 0ae43df6e..fac93cb27 100644 --- a/Source/NSTextView.m +++ b/Source/NSTextView.m @@ -23,6 +23,9 @@ Author: Pierre-Yves Rivaille Date: September 2002 + Extensive reworking: Alexander Malmberg + Date: December 2002 - February 2003 + This file is part of the GNUstep GUI Library. This library is free software; you can redistribute it and/or @@ -711,6 +714,8 @@ to this method from the text container or layout manager. _layoutManager->_selected_range = NSMakeRange(0,0); } + _currentInsertionPointMovementDirection = 0; + [self _updateMultipleTextViews]; } @@ -2610,6 +2615,14 @@ afterString in order over charRange. /* Set the new selected range */ _layoutManager->_selected_range = charRange; + /* Clear the remembered position and direction for insertion point + movement. + + Note that we must _not_ clear the index. Many movement actions will + reset the direction to a valid value, and they assume that the index + remains unchanged here. */ + _currentInsertionPointMovementDirection = 0; + /* TODO: when and if to restart timer */ [self updateInsertionPointStateAndRestartTimer: !stillSelectingFlag]; diff --git a/Source/NSTextView_actions.m b/Source/NSTextView_actions.m index 7cfe4b04e..a4e427c3f 100644 --- a/Source/NSTextView_actions.m +++ b/Source/NSTextView_actions.m @@ -22,6 +22,9 @@ Author: Pierre-Yves Rivaille Date: September 2002 + Extensive reworking: Alexander Malmberg + Date: December 2002 - February 2003 + This file is part of the GNUstep GUI Library. This library is free software; you can redistribute it and/or @@ -723,14 +726,40 @@ added to the selection (1,3). select: (BOOL)select { unsigned int cindex; + int new_direction; + + if (direction == GSInsertionPointMoveUp || + direction == GSInsertionPointMoveDown) + { + new_direction = 2; + } + else if (direction == GSInsertionPointMoveLeft || + direction == GSInsertionPointMoveRight) + { + new_direction = 1; + } + else + { + new_direction = 0; + } cindex = [self _movementOrigin]; + if (new_direction != _currentInsertionPointMovementDirection || + !new_direction) + { + _originalInsertionPointCharacterIndex = cindex; + } + + cindex = [_layoutManager characterIndexMoving: direction fromCharacterIndex: cindex - originalCharacterIndex: cindex /* TODO */ + originalCharacterIndex: _originalInsertionPointCharacterIndex distance: distance]; [self _moveTo: cindex select: select]; + /* Setting the selected range will clear out the current direction, but + not the index. Thus, we always set the direction here. */ + _currentInsertionPointMovementDirection = new_direction; }