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
NS_IMETHOD selectFrames(nsIContentIterator *aInnerIter, nsIContent *aContent, nsIDOMRange *aRange, PRBool aFlags);
NS_IMETHOD selectFrames(nsIDOMRange *aRange, PRBool aSelect);
NS_IMETHOD FixupSelectionPoints(nsIDOMRange *aRange, nsDirection *aDir, PRBool *aFixupState);
@@ -837,6 +838,7 @@ nsRangeList::HandleKeyEvent(nsGUIEvent *aGuiEvent)
break;
default :return NS_ERROR_FAILURE;
}
pos.mPreferLeft = mHint;
if (NS_SUCCEEDED(result) && NS_SUCCEEDED(frame->PeekOffset(&pos)) && pos.mResultContent)
result = TakeFocus(pos.mResultContent, pos.mContentOffset, pos.mContentOffset, keyEvent->isShift, PR_FALSE);
if (NS_SUCCEEDED(result))
@@ -1654,6 +1656,41 @@ nsDOMSelection::GetPrimaryFrameForFocusNode(nsIFrame **aReturnFrame)
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
NS_IMETHODIMP
nsDOMSelection::selectFrames(nsIDOMRange *aRange, PRBool aFlags)
@@ -1693,39 +1730,14 @@ nsDOMSelection::selectFrames(nsIDOMRange *aRange, PRBool aFlags)
}
//end start content
result = iter->First();
if (NS_SUCCEEDED(result))
{
while (NS_COMFALSE == iter->IsDone())
while (NS_SUCCEEDED(result) && NS_COMFALSE == iter->IsDone())
{
result = iter->CurrentNode(getter_AddRefs(content));
if (NS_FAILED(result) || !content)
return result;
#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
selectFrames(inneriter, content, aRange, aFlags);
result = iter->Next();
}
}
//we must now do the last one if it is not the same as the first
if (FetchEndParent(aRange) != FetchStartParent(aRange))
{

View File

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

View File

@@ -1791,10 +1791,13 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
nsCOMPtr<nsIDOMNode> thisNode;
thisNode = do_QueryInterface(content);
if (thisNode == startNode){
if ((mContentOffset + mContentLength) >= startOffset){
if (thisNode == startNode)
{
if ((mContentOffset + mContentLength) >= startOffset)
{
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
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)
found = PR_TRUE;
else
{
found = PR_FALSE;
wholeContentFound = PR_TRUE;
}
else//this WHOLE content is selected.
}
else
{
found = PR_TRUE;
wholeContentFound = PR_TRUE;
}
}
else {
@@ -1843,13 +1849,17 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
break;
}
frame = GetNextInFlow();
if (!wholeContentFound)
{
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
}
#if 0
else //we need to talk to siblings as well as flow
{
nsIFrame *frame;
result = GetNextSibling(&frame);
@@ -1860,6 +1870,7 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
break;
}
}
#endif
}
return NS_OK;
}

View File

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

View File

@@ -1791,10 +1791,13 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
nsCOMPtr<nsIDOMNode> thisNode;
thisNode = do_QueryInterface(content);
if (thisNode == startNode){
if ((mContentOffset + mContentLength) >= startOffset){
if (thisNode == startNode)
{
if ((mContentOffset + mContentLength) >= startOffset)
{
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
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)
found = PR_TRUE;
else
{
found = PR_FALSE;
wholeContentFound = PR_TRUE;
}
else//this WHOLE content is selected.
}
else
{
found = PR_TRUE;
wholeContentFound = PR_TRUE;
}
}
else {
@@ -1843,13 +1849,17 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
break;
}
frame = GetNextInFlow();
if (!wholeContentFound)
{
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
}
#if 0
else //we need to talk to siblings as well as flow
{
nsIFrame *frame;
result = GetNextSibling(&frame);
@@ -1860,6 +1870,7 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
break;
}
}
#endif
}
return NS_OK;
}

View File

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

View File

@@ -1962,6 +1962,7 @@ NS_METHOD nsTableFrame::Paint(nsIPresContext& aPresContext,
NS_IMETHODIMP
nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
{
#if 0
//traverse through children unselect tables
if ((aSpread == eSpreadDown)){
nsIFrame* kid;
@@ -1972,7 +1973,9 @@ nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread
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

View File

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

View File

@@ -1962,6 +1962,7 @@ NS_METHOD nsTableFrame::Paint(nsIPresContext& aPresContext,
NS_IMETHODIMP
nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread)
{
#if 0
//traverse through children unselect tables
if ((aSpread == eSpreadDown)){
nsIFrame* kid;
@@ -1972,7 +1973,9 @@ nsTableFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread
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