changes to selection code to stop a never ending loop

This commit is contained in:
mjudge@netscape.com
1999-09-21 22:58:14 +00:00
parent 456caf893e
commit 95d94af406
9 changed files with 115 additions and 61 deletions

View File

@@ -165,6 +165,7 @@ private:
void setAnchorFocusRange(PRInt32 aIndex); //pass in index into rangelist void setAnchorFocusRange(PRInt32 aIndex); //pass in index into rangelist
NS_IMETHOD selectFrames(nsIContentIterator *aInnerIter, nsIContent *aContent, nsIDOMRange *aRange, PRBool aFlags);
NS_IMETHOD selectFrames(nsIDOMRange *aRange, PRBool aSelect); NS_IMETHOD selectFrames(nsIDOMRange *aRange, PRBool aSelect);
NS_IMETHOD FixupSelectionPoints(nsIDOMRange *aRange, nsDirection *aDir, PRBool *aFixupState); NS_IMETHOD FixupSelectionPoints(nsIDOMRange *aRange, nsDirection *aDir, PRBool *aFixupState);
@@ -837,6 +838,7 @@ nsRangeList::HandleKeyEvent(nsGUIEvent *aGuiEvent)
break; break;
default :return NS_ERROR_FAILURE; default :return NS_ERROR_FAILURE;
} }
pos.mPreferLeft = mHint;
if (NS_SUCCEEDED(result) && NS_SUCCEEDED(frame->PeekOffset(&pos)) && pos.mResultContent) if (NS_SUCCEEDED(result) && NS_SUCCEEDED(frame->PeekOffset(&pos)) && pos.mResultContent)
result = TakeFocus(pos.mResultContent, pos.mContentOffset, pos.mContentOffset, keyEvent->isShift, PR_FALSE); result = TakeFocus(pos.mResultContent, pos.mContentOffset, pos.mContentOffset, keyEvent->isShift, PR_FALSE);
if (NS_SUCCEEDED(result)) if (NS_SUCCEEDED(result))
@@ -1654,6 +1656,41 @@ nsDOMSelection::GetPrimaryFrameForFocusNode(nsIFrame **aReturnFrame)
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
//select all content children of aContent
NS_IMETHODIMP
nsDOMSelection::selectFrames(nsIContentIterator *aInnerIter, nsIContent *aContent, nsIDOMRange *aRange, PRBool aFlags)
{
nsresult result = aInnerIter->Init(aContent);
nsIFrame *frame;
if (NS_SUCCEEDED(result))
{
nsCOMPtr<nsIContent> innercontent;
while (NS_COMFALSE == aInnerIter->IsDone())
{
result = aInnerIter->CurrentNode(getter_AddRefs(innercontent));
if (NS_FAILED(result) || !innercontent)
continue;
result = mRangeList->GetTracker()->GetPrimaryFrameFor(innercontent, &frame);
if (NS_SUCCEEDED(result) && frame)
frame->SetSelected(aRange,aFlags,eSpreadDown);//spread from here to hit all frames in flow
result = aInnerIter->Next();
if (NS_FAILED(result))
return result;
}
#if 0
result = mRangeList->GetTracker()->GetPrimaryFrameFor(content, &frame);
if (NS_SUCCEEDED(result) && frame)
frame->SetSelected(aRange,aFlags,eSpreadDown);//spread from here to hit all frames in flow
#endif
return NS_OK;
}
return NS_ERROR_FAILURE;
}
//the idea of this helper method is to select, deselect "top to bottom" traversing through the frames //the idea of this helper method is to select, deselect "top to bottom" traversing through the frames
NS_IMETHODIMP NS_IMETHODIMP
nsDOMSelection::selectFrames(nsIDOMRange *aRange, PRBool aFlags) nsDOMSelection::selectFrames(nsIDOMRange *aRange, PRBool aFlags)
@@ -1693,38 +1730,13 @@ nsDOMSelection::selectFrames(nsIDOMRange *aRange, PRBool aFlags)
} }
//end start content //end start content
result = iter->First(); result = iter->First();
if (NS_SUCCEEDED(result)) while (NS_SUCCEEDED(result) && NS_COMFALSE == iter->IsDone())
{ {
while (NS_COMFALSE == iter->IsDone()) result = iter->CurrentNode(getter_AddRefs(content));
{ if (NS_FAILED(result) || !content)
result = iter->CurrentNode(getter_AddRefs(content)); return result;
if (NS_FAILED(result) || !content) selectFrames(inneriter, content, aRange, aFlags);
return result; result = iter->Next();
#if OLD_SELECTION
result = inneriter->Init(content);
if (NS_SUCCEEDED(result))
{
nsCOMPtr<nsIContent> innercontent;
while (NS_COMFALSE == inneriter->IsDone())
{
result = iter->CurrentNode(getter_AddRefs(innercontent));
if (NS_FAILED(result) || !innercontent)
continue;
result = mRangeList->GetTracker()->GetPrimaryFrameFor(innercontent, &frame);
if (NS_SUCCEEDED(result) && frame)
frame->SetSelected(aRange,aFlags,eSpreadDown);//spread from here to hit all frames in flow
result = inneriter->Next();
if (NS_FAILED(result))
return result;
}
}
#else
result = mRangeList->GetTracker()->GetPrimaryFrameFor(content, &frame);
if (NS_SUCCEEDED(result) && frame)
frame->SetSelected(aRange,aFlags,eSpreadDown);//spread from here to hit all frames in flow
#endif
result = iter->Next();
}
} }
//we must now do the last one if it is not the same as the first //we must now do the last one if it is not the same as the first
if (FetchEndParent(aRange) != FetchStartParent(aRange)) if (FetchEndParent(aRange) != FetchStartParent(aRange))

View File

@@ -1690,7 +1690,8 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
{ {
if (aSelected && ParentDisablesSelection()) if (aSelected && ParentDisablesSelection())
return NS_OK; return NS_OK;
nsresult rv; /* nsresult rv;
if (eSpreadDown == aSpread){ if (eSpreadDown == aSpread){
nsIFrame* kid; nsIFrame* kid;
rv = FirstChild(nsnull, &kid); rv = FirstChild(nsnull, &kid);
@@ -1701,6 +1702,7 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
} }
} }
} }
*/
nsFrameState frameState; nsFrameState frameState;
GetFrameState(&frameState); GetFrameState(&frameState);
PRBool isSelected = ((frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT); PRBool isSelected = ((frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT);
@@ -1718,6 +1720,7 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
GetRect(frameRect); GetRect(frameRect);
nsRect rect(0, 0, frameRect.width, frameRect.height); nsRect rect(0, 0, frameRect.width, frameRect.height);
Invalidate(rect, PR_FALSE); Invalidate(rect, PR_FALSE);
#if 0
if (aRange) { if (aRange) {
//lets see if the range contains us, if so we must redraw! //lets see if the range contains us, if so we must redraw!
nsCOMPtr<nsIDOMNode> endNode; nsCOMPtr<nsIDOMNode> endNode;
@@ -1744,6 +1747,7 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
} }
} }
} }
#endif
return NS_OK; return NS_OK;
} }

View File

@@ -1791,10 +1791,13 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
nsCOMPtr<nsIDOMNode> thisNode; nsCOMPtr<nsIDOMNode> thisNode;
thisNode = do_QueryInterface(content); thisNode = do_QueryInterface(content);
if (thisNode == startNode){ if (thisNode == startNode)
if ((mContentOffset + mContentLength) >= startOffset){ {
if ((mContentOffset + mContentLength) >= startOffset)
{
found = PR_TRUE; found = PR_TRUE;
if (thisNode == endNode){ //special case if (thisNode == endNode)
{ //special case
if (endOffset == startOffset) //no need to redraw since drawing takes place with cursor if (endOffset == startOffset) //no need to redraw since drawing takes place with cursor
found = PR_FALSE; found = PR_FALSE;
@@ -1803,16 +1806,19 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
} }
} }
} }
else if (thisNode == endNode){ else if (thisNode == endNode)
{
if (mContentOffset < endOffset) if (mContentOffset < endOffset)
found = PR_TRUE; found = PR_TRUE;
else else
{
found = PR_FALSE; found = PR_FALSE;
wholeContentFound = PR_TRUE;
}
} }
else//this WHOLE content is selected. else
{ {
found = PR_TRUE; found = PR_TRUE;
wholeContentFound = PR_TRUE;
} }
} }
else { else {
@@ -1843,13 +1849,17 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
break; break;
} }
frame = GetNextInFlow(); frame = GetNextInFlow();
while (frame){ if (!wholeContentFound)
frame->SetSelected(aRange,aSelected,eSpreadNone); {
result = frame->GetNextInFlow(&frame); while (frame){
if (NS_FAILED(result)) frame->SetSelected(aRange,aSelected,eSpreadNone);
break; result = frame->GetNextInFlow(&frame);
if (NS_FAILED(result))
break;
}
} }
if (wholeContentFound)//we need to talk to siblings as well as flow #if 0
else //we need to talk to siblings as well as flow
{ {
nsIFrame *frame; nsIFrame *frame;
result = GetNextSibling(&frame); result = GetNextSibling(&frame);
@@ -1860,6 +1870,7 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
break; break;
} }
} }
#endif
} }
return NS_OK; return NS_OK;
} }

View File

@@ -1690,7 +1690,8 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
{ {
if (aSelected && ParentDisablesSelection()) if (aSelected && ParentDisablesSelection())
return NS_OK; return NS_OK;
nsresult rv; /* nsresult rv;
if (eSpreadDown == aSpread){ if (eSpreadDown == aSpread){
nsIFrame* kid; nsIFrame* kid;
rv = FirstChild(nsnull, &kid); rv = FirstChild(nsnull, &kid);
@@ -1701,6 +1702,7 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
} }
} }
} }
*/
nsFrameState frameState; nsFrameState frameState;
GetFrameState(&frameState); GetFrameState(&frameState);
PRBool isSelected = ((frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT); PRBool isSelected = ((frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT);
@@ -1718,6 +1720,7 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
GetRect(frameRect); GetRect(frameRect);
nsRect rect(0, 0, frameRect.width, frameRect.height); nsRect rect(0, 0, frameRect.width, frameRect.height);
Invalidate(rect, PR_FALSE); Invalidate(rect, PR_FALSE);
#if 0
if (aRange) { if (aRange) {
//lets see if the range contains us, if so we must redraw! //lets see if the range contains us, if so we must redraw!
nsCOMPtr<nsIDOMNode> endNode; nsCOMPtr<nsIDOMNode> endNode;
@@ -1744,6 +1747,7 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
} }
} }
} }
#endif
return NS_OK; return NS_OK;
} }

View File

@@ -1791,10 +1791,13 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
nsCOMPtr<nsIDOMNode> thisNode; nsCOMPtr<nsIDOMNode> thisNode;
thisNode = do_QueryInterface(content); thisNode = do_QueryInterface(content);
if (thisNode == startNode){ if (thisNode == startNode)
if ((mContentOffset + mContentLength) >= startOffset){ {
if ((mContentOffset + mContentLength) >= startOffset)
{
found = PR_TRUE; found = PR_TRUE;
if (thisNode == endNode){ //special case if (thisNode == endNode)
{ //special case
if (endOffset == startOffset) //no need to redraw since drawing takes place with cursor if (endOffset == startOffset) //no need to redraw since drawing takes place with cursor
found = PR_FALSE; found = PR_FALSE;
@@ -1803,16 +1806,19 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
} }
} }
} }
else if (thisNode == endNode){ else if (thisNode == endNode)
{
if (mContentOffset < endOffset) if (mContentOffset < endOffset)
found = PR_TRUE; found = PR_TRUE;
else else
{
found = PR_FALSE; found = PR_FALSE;
wholeContentFound = PR_TRUE;
}
} }
else//this WHOLE content is selected. else
{ {
found = PR_TRUE; found = PR_TRUE;
wholeContentFound = PR_TRUE;
} }
} }
else { else {
@@ -1843,13 +1849,17 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
break; break;
} }
frame = GetNextInFlow(); frame = GetNextInFlow();
while (frame){ if (!wholeContentFound)
frame->SetSelected(aRange,aSelected,eSpreadNone); {
result = frame->GetNextInFlow(&frame); while (frame){
if (NS_FAILED(result)) frame->SetSelected(aRange,aSelected,eSpreadNone);
break; result = frame->GetNextInFlow(&frame);
if (NS_FAILED(result))
break;
}
} }
if (wholeContentFound)//we need to talk to siblings as well as flow #if 0
else //we need to talk to siblings as well as flow
{ {
nsIFrame *frame; nsIFrame *frame;
result = GetNextSibling(&frame); result = GetNextSibling(&frame);
@@ -1860,6 +1870,7 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
break; break;
} }
} }
#endif
} }
return NS_OK; return NS_OK;
} }

View File

@@ -269,6 +269,7 @@ NS_IMETHODIMP
nsTableCellFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) nsTableCellFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
{ {
//traverse through children unselect tables //traverse through children unselect tables
#if 0
if ((aSpread == eSpreadDown)){ if ((aSpread == eSpreadDown)){
nsIFrame* kid; nsIFrame* kid;
FirstChild(nsnull, &kid); FirstChild(nsnull, &kid);
@@ -278,7 +279,9 @@ nsTableCellFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSp
kid->GetNextSibling(&kid); kid->GetNextSibling(&kid);
} }
} }
return NS_OK;//nsFrame::SetSelected(aRange,aSelected,eSpreadNone); //return nsFrame::SetSelected(aRange,aSelected,eSpreadNone);
#endif
return NS_OK;
} }
PRIntn PRIntn

View File

@@ -1962,6 +1962,7 @@ NS_METHOD nsTableFrame::Paint(nsIPresContext& aPresContext,
NS_IMETHODIMP NS_IMETHODIMP
nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
{ {
#if 0
//traverse through children unselect tables //traverse through children unselect tables
if ((aSpread == eSpreadDown)){ if ((aSpread == eSpreadDown)){
nsIFrame* kid; nsIFrame* kid;
@@ -1972,7 +1973,9 @@ nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread
rv = kid->GetNextSibling(&kid); rv = kid->GetNextSibling(&kid);
} }
} }
return NS_OK;//nsFrame::SetSelected(aRange,aSelected,eSpreadNone); #endif
return NS_OK;//return nsFrame::SetSelected(aRange,aSelected,eSpreadNone);
} }
PRBool nsTableFrame::ParentDisablesSelection() const //override default behavior PRBool nsTableFrame::ParentDisablesSelection() const //override default behavior

View File

@@ -269,6 +269,7 @@ NS_IMETHODIMP
nsTableCellFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) nsTableCellFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
{ {
//traverse through children unselect tables //traverse through children unselect tables
#if 0
if ((aSpread == eSpreadDown)){ if ((aSpread == eSpreadDown)){
nsIFrame* kid; nsIFrame* kid;
FirstChild(nsnull, &kid); FirstChild(nsnull, &kid);
@@ -278,7 +279,9 @@ nsTableCellFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSp
kid->GetNextSibling(&kid); kid->GetNextSibling(&kid);
} }
} }
return NS_OK;//nsFrame::SetSelected(aRange,aSelected,eSpreadNone); //return nsFrame::SetSelected(aRange,aSelected,eSpreadNone);
#endif
return NS_OK;
} }
PRIntn PRIntn

View File

@@ -1962,6 +1962,7 @@ NS_METHOD nsTableFrame::Paint(nsIPresContext& aPresContext,
NS_IMETHODIMP NS_IMETHODIMP
nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
{ {
#if 0
//traverse through children unselect tables //traverse through children unselect tables
if ((aSpread == eSpreadDown)){ if ((aSpread == eSpreadDown)){
nsIFrame* kid; nsIFrame* kid;
@@ -1972,7 +1973,9 @@ nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread
rv = kid->GetNextSibling(&kid); rv = kid->GetNextSibling(&kid);
} }
} }
return NS_OK;//nsFrame::SetSelected(aRange,aSelected,eSpreadNone); #endif
return NS_OK;//return nsFrame::SetSelected(aRange,aSelected,eSpreadNone);
} }
PRBool nsTableFrame::ParentDisablesSelection() const //override default behavior PRBool nsTableFrame::ParentDisablesSelection() const //override default behavior