checking in fixes for selection around nodes where get primary frame will not lead to the discovery of all frames

git-svn-id: svn://10.0.0.236/trunk@48406 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
mjudge%netscape.com
1999-09-20 21:47:37 +00:00
parent 9ca0e1429c
commit 179e58ff5f
4 changed files with 134 additions and 38 deletions

View File

@@ -1782,23 +1782,7 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
nsresult result;
if (aSelected && ParentDisablesSelection())
return NS_OK;
if (aSpread == eSpreadDown)
{
nsIFrame *frame = GetPrevInFlow();
while(frame){
frame->SetSelected(aRange,aSelected,eSpreadNone);
result = frame->GetPrevInFlow(&frame);
if (NS_FAILED(result))
break;
}
frame = GetNextInFlow();
while (frame){
frame->SetSelected(aRange,aSelected,eSpreadNone);
result = frame->GetNextInFlow(&frame);
if (NS_FAILED(result))
break;
}
}
nsFrameState frameState;
GetFrameState(&frameState);
PRBool isSelected = ((frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT);
@@ -1808,6 +1792,7 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
}
PRBool found = PR_FALSE;
PRBool wholeContentFound = PR_FALSE;//if the entire content we look at is selected.
if (aRange) {
//lets see if the range contains us, if so we must redraw!
nsCOMPtr<nsIDOMNode> endNode;
@@ -1841,8 +1826,11 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
else
found = PR_FALSE;
}
else
else//this WHOLE content is selected.
{
found = PR_TRUE;
wholeContentFound = PR_TRUE;
}
}
else {
if ( aSelected != (PRBool)(frameState | NS_FRAME_SELECTED_CONTENT) ){
@@ -1862,6 +1850,34 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
Invalidate(rect, PR_FALSE);
// ForceDrawFrame(this);
}
if (aSpread == eSpreadDown)
{
nsIFrame *frame = GetPrevInFlow();
while(frame){
frame->SetSelected(aRange,aSelected,eSpreadNone);
result = frame->GetPrevInFlow(&frame);
if (NS_FAILED(result))
break;
}
frame = GetNextInFlow();
while (frame){
frame->SetSelected(aRange,aSelected,eSpreadNone);
result = frame->GetNextInFlow(&frame);
if (NS_FAILED(result))
break;
}
if (wholeContentFound)//we need to talk to siblings as well as flow
{
nsIFrame *frame;
result = GetNextSibling(&frame);
while (NS_SUCCEEDED(result) && frame){
frame->SetSelected(aRange,aSelected,eSpreadDown);
result = frame->GetNextSibling(&frame);
if (NS_FAILED(result))
break;
}
}
}
return NS_OK;
}