diff --git a/layout/base/src/nsRangeList.cpp b/layout/base/src/nsRangeList.cpp index 76e0db1a333f..92155874a666 100644 --- a/layout/base/src/nsRangeList.cpp +++ b/layout/base/src/nsRangeList.cpp @@ -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 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,38 +1730,13 @@ nsDOMSelection::selectFrames(nsIDOMRange *aRange, PRBool aFlags) } //end start content 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) - return result; -#if OLD_SELECTION - result = inneriter->Init(content); - if (NS_SUCCEEDED(result)) - { - nsCOMPtr 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(); - } + result = iter->CurrentNode(getter_AddRefs(content)); + if (NS_FAILED(result) || !content) + return result; + 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)) diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 1bf4bf44a7f8..d48e3ccd977a 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -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 endNode; @@ -1744,6 +1747,7 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) } } } +#endif return NS_OK; } diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index dc73f672d927..94f4ceff7934 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -1791,10 +1791,13 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) nsCOMPtr 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(); - while (frame){ - frame->SetSelected(aRange,aSelected,eSpreadNone); - result = frame->GetNextInFlow(&frame); - if (NS_FAILED(result)) - break; + 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; } diff --git a/layout/html/base/src/nsFrame.cpp b/layout/html/base/src/nsFrame.cpp index 1bf4bf44a7f8..d48e3ccd977a 100644 --- a/layout/html/base/src/nsFrame.cpp +++ b/layout/html/base/src/nsFrame.cpp @@ -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 endNode; @@ -1744,6 +1747,7 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) } } } +#endif return NS_OK; } diff --git a/layout/html/base/src/nsTextFrame.cpp b/layout/html/base/src/nsTextFrame.cpp index dc73f672d927..94f4ceff7934 100644 --- a/layout/html/base/src/nsTextFrame.cpp +++ b/layout/html/base/src/nsTextFrame.cpp @@ -1791,10 +1791,13 @@ nsTextFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) nsCOMPtr 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(); - while (frame){ - frame->SetSelected(aRange,aSelected,eSpreadNone); - result = frame->GetNextInFlow(&frame); - if (NS_FAILED(result)) - break; + 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; } diff --git a/layout/html/table/src/nsTableCellFrame.cpp b/layout/html/table/src/nsTableCellFrame.cpp index 1b40ef3b9e0c..1df5137dbaa2 100644 --- a/layout/html/table/src/nsTableCellFrame.cpp +++ b/layout/html/table/src/nsTableCellFrame.cpp @@ -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 diff --git a/layout/html/table/src/nsTableFrame.cpp b/layout/html/table/src/nsTableFrame.cpp index 07fc334b64f6..add1afc7d77f 100644 --- a/layout/html/table/src/nsTableFrame.cpp +++ b/layout/html/table/src/nsTableFrame.cpp @@ -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 diff --git a/layout/tables/nsTableCellFrame.cpp b/layout/tables/nsTableCellFrame.cpp index 1b40ef3b9e0c..1df5137dbaa2 100644 --- a/layout/tables/nsTableCellFrame.cpp +++ b/layout/tables/nsTableCellFrame.cpp @@ -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 diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index 07fc334b64f6..add1afc7d77f 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -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