diff --git a/mozilla/layout/generic/nsFrame.cpp b/mozilla/layout/generic/nsFrame.cpp index f41aca7e2ea..9f4b3c11762 100644 --- a/mozilla/layout/generic/nsFrame.cpp +++ b/mozilla/layout/generic/nsFrame.cpp @@ -50,6 +50,8 @@ #include "nsFrameTraversal.h" #include "nsCOMPtr.h" #include "nsStyleChangeList.h" +#include "nsIDOMRange.h" + #define NORMAL_DRAG_HANDLING 1 // remove this to simulate a start-drag event. #if !NORMAL_DRAG_HANDLING @@ -1583,6 +1585,8 @@ nsFrame::XMLQuote(nsString& aString) PRBool nsFrame::ParentDisablesSelection() const { + return PR_FALSE;//depricating method perhaps. +/* PRBool selected; if (NS_FAILED(GetSelected(&selected))) return PR_FALSE; @@ -1594,6 +1598,7 @@ nsFrame::ParentDisablesSelection() const if (target) return ((nsFrame *)target)->ParentDisablesSelection(); return PR_FALSE; //default this does not happen + */ } NS_IMETHODIMP @@ -1701,9 +1706,10 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) { if (aSelected && ParentDisablesSelection()) return NS_OK; + nsresult rv; if (eSpreadDown == aSpread){ nsIFrame* kid; - nsresult rv = FirstChild(nsnull, &kid); + rv = FirstChild(nsnull, &kid); if (NS_SUCCEEDED(rv)) { while (nsnull != kid) { kid->SetSelected(nsnull,aSelected,aSpread); @@ -1728,6 +1734,32 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) GetRect(frameRect); nsRect rect(0, 0, frameRect.width, frameRect.height); Invalidate(rect, PR_FALSE); + if (aRange) { + //lets see if the range contains us, if so we must redraw! + nsCOMPtr endNode; + nsCOMPtr startNode; + aRange->GetEndParent(getter_AddRefs(endNode)); + aRange->GetStartParent(getter_AddRefs(startNode)); + nsCOMPtr content; + rv = GetContent(getter_AddRefs(content)); + nsCOMPtr thisNode; + thisNode = do_QueryInterface(content); + +//we must tell the siblings about the set selected call +//since the getprimaryframe call is done with this content node. + if (thisNode != startNode && thisNode != endNode) + { //whole node selected + nsIFrame *frame; + rv = GetNextSibling(&frame); + while (NS_SUCCEEDED(rv) && frame) + { + frame->SetSelected(aRange,aSelected,eSpreadDown); + rv = frame->GetNextSibling(&frame); + if (NS_FAILED(rv)) + break; + } + } + } return NS_OK; } diff --git a/mozilla/layout/generic/nsTextFrame.cpp b/mozilla/layout/generic/nsTextFrame.cpp index c90f14cdb27..f5102e981e1 100644 --- a/mozilla/layout/generic/nsTextFrame.cpp +++ b/mozilla/layout/generic/nsTextFrame.cpp @@ -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 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; } diff --git a/mozilla/layout/html/base/src/nsFrame.cpp b/mozilla/layout/html/base/src/nsFrame.cpp index f41aca7e2ea..9f4b3c11762 100644 --- a/mozilla/layout/html/base/src/nsFrame.cpp +++ b/mozilla/layout/html/base/src/nsFrame.cpp @@ -50,6 +50,8 @@ #include "nsFrameTraversal.h" #include "nsCOMPtr.h" #include "nsStyleChangeList.h" +#include "nsIDOMRange.h" + #define NORMAL_DRAG_HANDLING 1 // remove this to simulate a start-drag event. #if !NORMAL_DRAG_HANDLING @@ -1583,6 +1585,8 @@ nsFrame::XMLQuote(nsString& aString) PRBool nsFrame::ParentDisablesSelection() const { + return PR_FALSE;//depricating method perhaps. +/* PRBool selected; if (NS_FAILED(GetSelected(&selected))) return PR_FALSE; @@ -1594,6 +1598,7 @@ nsFrame::ParentDisablesSelection() const if (target) return ((nsFrame *)target)->ParentDisablesSelection(); return PR_FALSE; //default this does not happen + */ } NS_IMETHODIMP @@ -1701,9 +1706,10 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) { if (aSelected && ParentDisablesSelection()) return NS_OK; + nsresult rv; if (eSpreadDown == aSpread){ nsIFrame* kid; - nsresult rv = FirstChild(nsnull, &kid); + rv = FirstChild(nsnull, &kid); if (NS_SUCCEEDED(rv)) { while (nsnull != kid) { kid->SetSelected(nsnull,aSelected,aSpread); @@ -1728,6 +1734,32 @@ nsFrame::SetSelected(nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread) GetRect(frameRect); nsRect rect(0, 0, frameRect.width, frameRect.height); Invalidate(rect, PR_FALSE); + if (aRange) { + //lets see if the range contains us, if so we must redraw! + nsCOMPtr endNode; + nsCOMPtr startNode; + aRange->GetEndParent(getter_AddRefs(endNode)); + aRange->GetStartParent(getter_AddRefs(startNode)); + nsCOMPtr content; + rv = GetContent(getter_AddRefs(content)); + nsCOMPtr thisNode; + thisNode = do_QueryInterface(content); + +//we must tell the siblings about the set selected call +//since the getprimaryframe call is done with this content node. + if (thisNode != startNode && thisNode != endNode) + { //whole node selected + nsIFrame *frame; + rv = GetNextSibling(&frame); + while (NS_SUCCEEDED(rv) && frame) + { + frame->SetSelected(aRange,aSelected,eSpreadDown); + rv = frame->GetNextSibling(&frame); + if (NS_FAILED(rv)) + break; + } + } + } return NS_OK; } diff --git a/mozilla/layout/html/base/src/nsTextFrame.cpp b/mozilla/layout/html/base/src/nsTextFrame.cpp index c90f14cdb27..f5102e981e1 100644 --- a/mozilla/layout/html/base/src/nsTextFrame.cpp +++ b/mozilla/layout/html/base/src/nsTextFrame.cpp @@ -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 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; }