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.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@15956 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Alexander Malmberg 2003-02-14 16:58:59 +00:00
parent e729e8815b
commit 85ff161e72
4 changed files with 77 additions and 25 deletions

View file

@ -1,3 +1,19 @@
2003-02-14 17:47 Alexander Malmberg <alexander@malmberg.org>
* 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 <alexander@malmberg.org>
* TextConverters/RTF/rtfGrammer.y (rtfCharset): Treat unknown

View file

@ -185,39 +185,33 @@ therefore be stored in the NSLayoutManager to avoid problems.
need to be recomputed <eg, relayout>. */
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 ****/

View file

@ -23,6 +23,9 @@
Author: Pierre-Yves Rivaille <pyrivail@ens-lyon.fr>
Date: September 2002
Extensive reworking: Alexander Malmberg <alexander@malmberg.org>
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 <and where to stop it before> */
[self updateInsertionPointStateAndRestartTimer: !stillSelectingFlag];

View file

@ -22,6 +22,9 @@
Author: Pierre-Yves Rivaille <pyrivail@ens-lyon.fr>
Date: September 2002
Extensive reworking: Alexander Malmberg <alexander@malmberg.org>
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;
}