mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-23 07:00:46 +00:00
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:
parent
e729e8815b
commit
85ff161e72
4 changed files with 77 additions and 25 deletions
16
ChangeLog
16
ChangeLog
|
@ -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
|
||||
|
|
|
@ -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 ****/
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue