Clean up nsPeekOffsetStruct. bug=343763. r+sr=roc

This commit is contained in:
uriber@gmail.com
2006-07-13 06:06:29 +00:00
parent 9c0b99fb36
commit d7ce53fcff
5 changed files with 114 additions and 102 deletions

View File

@@ -3436,11 +3436,7 @@ PresShell::CompleteMove(PRBool aForward, PRBool aExtend)
nsPeekOffsetStruct pos = frame->GetExtremeCaretPosition(!aForward);
// we 'prefer left' (i.e. prefer the beginning of the next line)
// iff we're moving to the end of the content
pos.mPreferLeft = aForward;
mSelection->HandleClick(pos.mResultContent ,pos.mContentOffset ,pos.mContentOffset/*End*/ ,aExtend, PR_FALSE, pos.mPreferLeft);
mSelection->HandleClick(pos.mResultContent ,pos.mContentOffset ,pos.mContentOffset/*End*/ ,aExtend, PR_FALSE, aForward);
return ScrollSelectionIntoView(nsISelectionController::SELECTION_NORMAL, nsISelectionController::SELECTION_FOCUS_REGION, PR_TRUE);
}

View File

@@ -1992,8 +1992,7 @@ nsFrame::PeekBackwardAndForward(nsSelectionAmount aAmountBack,
nsresult rv = GetSelectionController(aPresContext, getter_AddRefs(selcon));
if (NS_FAILED(rv)) return rv;
nsIPresShell *shell = aPresContext->GetPresShell();
if (!shell || !selcon)
if (!selcon)
return NS_ERROR_NOT_INITIALIZED;
// Use peek offset one way then the other:
@@ -2002,13 +2001,10 @@ nsFrame::PeekBackwardAndForward(nsSelectionAmount aAmountBack,
nsCOMPtr<nsIContent> endContent;
nsCOMPtr<nsIDOMNode> endNode;
nsPeekOffsetStruct startpos;
startpos.SetData(shell,
0,
aAmountBack,
startpos.SetData(aAmountBack,
eDirPrevious,
aStartPos,
PR_FALSE,
PR_TRUE,
aStartPos,
0,
aJumpLines,
PR_TRUE, //limit on scrolled views
PR_FALSE,
@@ -2017,13 +2013,10 @@ nsFrame::PeekBackwardAndForward(nsSelectionAmount aAmountBack,
if (NS_FAILED(rv))
return rv;
nsPeekOffsetStruct endpos;
endpos.SetData(shell,
0,
aAmountForward,
endpos.SetData(aAmountForward,
eDirNext,
aStartPos,
PR_FALSE,
PR_FALSE,
aStartPos,
0,
aJumpLines,
PR_TRUE, //limit on scrolled views
PR_FALSE,
@@ -3823,7 +3816,7 @@ nsFrame::GetNextPrevLineFromeBlockFrame(nsPresContext* aPresContext,
aPos->mResultFrame = nsnull;
aPos->mResultContent = nsnull;
aPos->mPreferLeft = (aPos->mDirection == eDirNext);
aPos->mAttachForward = (aPos->mDirection == eDirNext);
nsresult result;
nsCOMPtr<nsILineIteratorNavigator> it;
@@ -3951,13 +3944,12 @@ nsFrame::GetNextPrevLineFromeBlockFrame(nsPresContext* aPresContext,
{
aPos->mResultContent = parent;
aPos->mContentOffset = parent->IndexOf(content);
aPos->mPreferLeft = PR_FALSE;
aPos->mAttachForward = PR_FALSE;
if ((point.x - offset.x+ tempRect.x)>tempRect.width)
{
aPos->mContentOffset++;//go to end of this frame
aPos->mPreferLeft = PR_TRUE;
aPos->mAttachForward = PR_TRUE;
}
aPos->mContentOffsetEnd = aPos->mContentOffset;
//result frame is the result frames parent.
aPos->mResultFrame = resultFrame->GetParent();
return NS_POSITION_BEFORE_TABLE;
@@ -3976,7 +3968,7 @@ nsFrame::GetNextPrevLineFromeBlockFrame(nsPresContext* aPresContext,
resultFrame->GetContentOffsetsFromPoint(point - offset);
aPos->mResultContent = offsets.content;
aPos->mContentOffset = offsets.offset;
aPos->mPreferLeft = offsets.associateWithNext;
aPos->mAttachForward = offsets.associateWithNext;
if (offsets.content)
{
PRBool selectable;
@@ -4018,7 +4010,7 @@ nsFrame::GetNextPrevLineFromeBlockFrame(nsPresContext* aPresContext,
resultFrame->GetContentOffsetsFromPoint(point - offset);
aPos->mResultContent = offsets.content;
aPos->mContentOffset = offsets.offset;
aPos->mPreferLeft = offsets.associateWithNext;
aPos->mAttachForward = offsets.associateWithNext;
if (offsets.content)
{
PRBool selectable;
@@ -4027,9 +4019,9 @@ nsFrame::GetNextPrevLineFromeBlockFrame(nsPresContext* aPresContext,
{
found = PR_TRUE;
if (resultFrame == farStoppingFrame)
aPos->mPreferLeft = PR_FALSE;
aPos->mAttachForward = PR_FALSE;
else
aPos->mPreferLeft = PR_TRUE;
aPos->mAttachForward = PR_TRUE;
break;
}
}
@@ -4054,7 +4046,7 @@ nsFrame::GetNextPrevLineFromeBlockFrame(nsPresContext* aPresContext,
aPos->mAmount = eSelectLine;
aPos->mStartOffset = 0;
aPos->mEatingWS = PR_FALSE;
aPos->mPreferLeft = !(aPos->mDirection == eDirNext);
aPos->mAttachForward = !(aPos->mDirection == eDirNext);
if (aPos->mDirection == eDirPrevious)
aPos->mStartOffset = -1;//start from end
return aBlockFrame->PeekOffset(aPresContext, aPos);
@@ -4071,7 +4063,7 @@ nsPeekOffsetStruct nsIFrame::GetExtremeCaretPosition(PRBool aStart)
FrameContentRange range = GetRangeForFrame(targetFrame.frame);
result.mResultContent = range.content;
result.mContentOffset = aStart ? range.start : range.end;
result.mPreferLeft = (result.mContentOffset == range.start);
result.mAttachForward = (result.mContentOffset == range.start);
return result;
}
@@ -4208,9 +4200,9 @@ nsFrame::PeekOffsetParagraph(nsPresContext* aPresContext,
NS_IMETHODIMP
nsFrame::PeekOffset(nsPresContext* aPresContext, nsPeekOffsetStruct *aPos)
{
if (!aPos || !aPos->mShell)
if (!aPos)
return NS_ERROR_NULL_POINTER;
nsresult result = NS_ERROR_FAILURE;
nsresult result = NS_ERROR_FAILURE;
nsPoint point;
point.x = aPos->mDesiredX;
point.y = 0;
@@ -4260,16 +4252,13 @@ nsFrame::PeekOffset(nsPresContext* aPresContext, nsPeekOffsetStruct *aPos)
}//drop into no amount
case eSelectNoAmount:
{
nsPresContext *context = aPos->mShell->GetPresContext();
if (!context)
return NS_OK;
nsIView* view;
nsPoint offset;
GetOffsetFromView(offset, &view);
ContentOffsets offsets = GetContentOffsetsFromPoint(point - offset);
aPos->mResultContent = offsets.content;
aPos->mContentOffset = offsets.offset;
aPos->mPreferLeft = offsets.associateWithNext;
aPos->mAttachForward = offsets.associateWithNext;
result = offsets.content ? NS_OK : NS_ERROR_FAILURE;
}break;
case eSelectLine :
@@ -4401,7 +4390,7 @@ nsFrame::PeekOffset(nsPresContext* aPresContext, nsPeekOffsetStruct *aPos)
FrameContentRange range = GetRangeForFrame(targetFrame.frame);
aPos->mResultContent = range.content;
aPos->mContentOffset = endOfLine ? range.end : range.start;
aPos->mPreferLeft = (aPos->mContentOffset == range.start);
aPos->mAttachForward = (aPos->mContentOffset == range.start);
if (!range.content)
return NS_ERROR_FAILURE;
return NS_OK;

View File

@@ -61,68 +61,105 @@ class nsIPresShell;
enum EWordMovementType { eStartWord, eEndWord, eDefaultBehavior };
/*PeekOffsetStruct
* @param mShell is used to get the PresContext useful for measuring text etc.
* @param mDesiredX is the "desired" location of the new caret
* @param mAmount eWord, eCharacter, eLine
* @param mDirection enum defined in this file to be eForward or eBackward
* @param mStartOffset start offset to start the peek. 0 == beginning -1 = end
* @param mResultContent content that actually is the next/previous
* @param mResultOffset offset for result content
* @param mResultFrame resulting frame for peeking
* @param mEatingWS boolean to tell us the state of our search for Next/Prev
* @param mPreferLeft true = prev line end, false = next line begin
* @param mJumpLines if this is true then it's ok to cross lines while peeking
* @param mScrollViewStop if this is true then stop peeking across scroll view boundary
* @param mWordMovementType an enum that determines whether to prefer the start or end of a word
* or to use the default beahvior, which is a combination of
* direction and the platform-based pref
* "layout.word_select.eat_space_to_next_word"
*/
/** PeekOffsetStruct is used to group various arguments (both input and output)
* that are passed to nsFrame::PeekOffset(). See below for the description of
* individual arguments.
*/
struct nsPeekOffsetStruct
{
void SetData(nsIPresShell *aShell,
nscoord aDesiredX,
nsSelectionAmount aAmount,
void SetData(nsSelectionAmount aAmount,
nsDirection aDirection,
PRInt32 aStartOffset,
PRBool aEatingWS,
PRBool aPreferLeft,
PRInt32 aStartOffset,
nscoord aDesiredX,
PRBool aJumpLines,
PRBool aScrollViewStop,
PRBool aIsKeyboardSelect,
PRBool aVisual,
EWordMovementType aWordMovementType = eDefaultBehavior )
{
mShell=aShell;
mDesiredX=aDesiredX;
mAmount=aAmount;
mDirection=aDirection;
mStartOffset=aStartOffset;
mEatingWS=aEatingWS;
mPreferLeft=aPreferLeft;
mJumpLines = aJumpLines;
mScrollViewStop = aScrollViewStop;
mIsKeyboardSelect = aIsKeyboardSelect;
mVisual = aVisual;
mWordMovementType = aWordMovementType;
}
nsIPresShell *mShell;
nscoord mDesiredX;
EWordMovementType aWordMovementType = eDefaultBehavior)
{
mAmount = aAmount;
mDirection = aDirection;
mStartOffset = aStartOffset;
mDesiredX = aDesiredX;
mJumpLines = aJumpLines;
mScrollViewStop = aScrollViewStop;
mIsKeyboardSelect = aIsKeyboardSelect;
mVisual = aVisual;
mWordMovementType = aWordMovementType;
mEatingWS = PR_FALSE;
}
// Note: Most arguments (input and output) are only used with certain values
// of mAmount. These values are indicated for each argument below.
// Arguments with no such indication are used with all values of mAmount.
/*** Input arguments ***/
// Note: The value of some of the input arguments may be changed upon exit.
// mAmount: The type of movement requested (by character, word, line, etc.)
nsSelectionAmount mAmount;
// mDirection: eDirPrevious or eDirNext.
// Used with: eSelectCharacter, eSelectWord, eSelectLine, eSelectParagraph.
nsDirection mDirection;
// mStartOffset: Offset into the content of the current frame where the peek starts.
// Used with: eSelectCharacter, eSelectWord
PRInt32 mStartOffset;
nsCOMPtr<nsIContent> mResultContent;
PRInt32 mContentOffset;
PRInt32 mContentOffsetEnd;
nsIFrame *mResultFrame;
PRBool mEatingWS;
PRBool mPreferLeft;
// mDesiredX: The desired x coordinate for the caret.
// Used with: eSelectLine.
nscoord mDesiredX;
// mJumpLines: Whether to allow jumping across line boundaries.
// Used with: eSelectCharacter, eSelectWord.
PRBool mJumpLines;
// mScrollViewStop: Whether to stop when reaching a scroll view boundary.
// Used with: eSelectCharacter, eSelectWord, eSelectLine.
PRBool mScrollViewStop;
// mIsKeyboardSelect: Whether the peeking is done in response to a keyboard action.
// Used with: eSelectWord.
PRBool mIsKeyboardSelect;
// mVisual: Whether bidi caret behavior is visual (PR_TRUE) or logical (PR_FALSE).
// Used with: eSelectCharacter, eSelectWord.
PRBool mVisual;
// mWordMovementType: An enum that determines whether to prefer the start or end of a word
// or to use the default beahvior, which is a combination of
// direction and the platform-based pref
// "layout.word_select.eat_space_to_next_word"
EWordMovementType mWordMovementType;
/*** Output arguments ***/
// mResultContent: Content reached as a result of the peek.
nsCOMPtr<nsIContent> mResultContent;
// mContentOffset: Offset into content reached as a result of the peek.
PRInt32 mContentOffset;
// mResultFrame: Frame reached as a result of the peek.
// Used with: eSelectCharacter, eSelectWord.
nsIFrame *mResultFrame;
// mAttachForward: When the result position is between two frames,
// indicates which of the two frames the caret should be painted in.
// PR_FALSE means "the end of the frame logically before the caret",
// PR_TRUE means "the beginning of the frame logically after the caret".
// Used with: eSelectLine, eSelectBeginLine, eSelectEndLine.
PRBool mAttachForward;
/*** Arguments only used internally ***/
// mEatingWS: Used only internally, for recursive calls into PeekOffset.
// Shold be PR_FALSE upon initial call to PeekOffset.
// Used with: eSelectWord.
PRBool mEatingWS;
};
struct nsPrevNextBidiLevels

View File

@@ -1208,8 +1208,8 @@ nsFrameSelection::MoveCaret(PRUint32 aKeycode,
//set data using mLimiter to stop on scroll views. If we have a limiter then we stop peeking
//when we hit scrollable views. If no limiter then just let it go ahead
pos.SetData(mShell, desiredX, aAmount, eDirPrevious, offsetused, PR_FALSE,
PR_TRUE, PR_TRUE, mLimiter != nsnull, PR_TRUE, visualMovement);
pos.SetData(aAmount, eDirPrevious, offsetused, desiredX,
PR_TRUE, mLimiter != nsnull, PR_TRUE, visualMovement);
nsBidiLevel baseLevel = nsBidiPresUtils::GetFrameBaseLevel(frame);
@@ -1218,37 +1218,29 @@ nsFrameSelection::MoveCaret(PRUint32 aKeycode,
case nsIDOMKeyEvent::DOM_VK_RIGHT :
InvalidateDesiredX();
pos.mDirection = (baseLevel & 1) ? eDirPrevious : eDirNext;
PostReason(nsISelectionListener::KEYPRESS_REASON);
break;
case nsIDOMKeyEvent::DOM_VK_LEFT : //no break
InvalidateDesiredX();
pos.mDirection = (baseLevel & 1) ? eDirNext : eDirPrevious;
PostReason(nsISelectionListener::KEYPRESS_REASON);
break;
case nsIDOMKeyEvent::DOM_VK_DOWN :
pos.mAmount = eSelectLine;
pos.mDirection = eDirNext;//no break here
PostReason(nsISelectionListener::KEYPRESS_REASON);
break;
case nsIDOMKeyEvent::DOM_VK_UP :
pos.mAmount = eSelectLine;
PostReason(nsISelectionListener::KEYPRESS_REASON);
break;
case nsIDOMKeyEvent::DOM_VK_HOME :
InvalidateDesiredX();
pos.mAmount = eSelectBeginLine;
tHint = HINTRIGHT;//stick to opposite of movement
PostReason(nsISelectionListener::KEYPRESS_REASON);
break;
case nsIDOMKeyEvent::DOM_VK_END :
InvalidateDesiredX();
pos.mAmount = eSelectEndLine;
tHint = HINTLEFT;//stick to this line
PostReason(nsISelectionListener::KEYPRESS_REASON);
break;
default :return NS_ERROR_FAILURE;
}
pos.mPreferLeft = tHint;
PostReason(nsISelectionListener::KEYPRESS_REASON);
if (NS_SUCCEEDED(result = frame->PeekOffset(context, &pos)) && pos.mResultContent)
{
nsIFrame *theFrame;
@@ -1257,7 +1249,7 @@ nsFrameSelection::MoveCaret(PRUint32 aKeycode,
if (aKeycode == nsIDOMKeyEvent::DOM_VK_RIGHT ||
aKeycode == nsIDOMKeyEvent::DOM_VK_LEFT)
{
// For left/right, PeekOffset() sets pos.mResultFrame correctly, but does not set pos.mPreferLeft,
// For left/right, PeekOffset() sets pos.mResultFrame correctly, but does not set pos.mAttachForward,
// so determine the hint here based on the result frame and offset:
// If we're at the end of a text frame, set the hint to HINTLEFT to indicate that we
// want the caret displayed at the end of this frame, not at the beginning of the next one.
@@ -1271,7 +1263,7 @@ nsFrameSelection::MoveCaret(PRUint32 aKeycode,
} else {
// For up/down and home/end, pos.mResultFrame might not be set correctly, or not at all.
// In these cases, get the frame based on the content and hint returned by PeekOffset().
tHint = (HINT)pos.mPreferLeft;
tHint = (HINT)pos.mAttachForward;
theFrame = GetFrameForNodeOffset(pos.mResultContent, pos.mContentOffset,
tHint, &currentOffset);
if (!theFrame)
@@ -2286,8 +2278,8 @@ nsFrameSelection::HandleDrag(nsIFrame *aFrame, nsPoint aPoint)
amount = eSelectEndLine;
nsPeekOffsetStruct pos;
pos.SetData(mShell, 0, amount, direction, offsets.offset, PR_FALSE,
PR_TRUE, PR_FALSE, mLimiter != nsnull, PR_TRUE, PR_FALSE);
pos.SetData(amount, direction, offsets.offset, 0,
PR_FALSE, mLimiter != nsnull, PR_FALSE, PR_FALSE);
nsIFrame* frame = mShell->GetPrimaryFrameFor(offsets.content);
if (NS_SUCCEEDED(result = frame->PeekOffset(mShell->GetPresContext(), &pos)) && pos.mResultContent) {
@@ -2303,8 +2295,8 @@ nsFrameSelection::HandleDrag(nsIFrame *aFrame, nsPoint aPoint)
nsPeekOffsetStruct pos;
//set data using mLimiter to stop on scroll views. If we have a limiter then we stop peeking
//when we hit scrollable views. If no limiter then just let it go ahead
pos.SetData(mShell, 0, eSelectDir, eDirNext, startPos, PR_FALSE,
PR_TRUE, PR_TRUE, mLimiter != nsnull, PR_FALSE);
pos.SetData(eSelectDir, eDirNext, startPos, 0,
PR_TRUE, mLimiter != nsnull, PR_FALSE, PR_TRUE);
mHint = HINT(beginOfContent);
HINT saveHint = mHint;
if (NS_GET_EMBEDDING_LEVEL(newFrame) & 1)

View File

@@ -4979,8 +4979,6 @@ TryNextFrame:
result = NS_ERROR_FAILURE; break;
}
aPos->mContentOffsetEnd = aPos->mContentOffset;
if (NS_FAILED(result)){
aPos->mResultContent = mContent;
//aPos->mContentOffset = aPos->mStartOffset;