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:
@@ -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<nsIDOMNode> endNode;
|
||||
nsCOMPtr<nsIDOMNode> startNode;
|
||||
aRange->GetEndParent(getter_AddRefs(endNode));
|
||||
aRange->GetStartParent(getter_AddRefs(startNode));
|
||||
nsCOMPtr<nsIContent> content;
|
||||
rv = GetContent(getter_AddRefs(content));
|
||||
nsCOMPtr<nsIDOMNode> 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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<nsIDOMNode> endNode;
|
||||
nsCOMPtr<nsIDOMNode> startNode;
|
||||
aRange->GetEndParent(getter_AddRefs(endNode));
|
||||
aRange->GetStartParent(getter_AddRefs(startNode));
|
||||
nsCOMPtr<nsIContent> content;
|
||||
rv = GetContent(getter_AddRefs(content));
|
||||
nsCOMPtr<nsIDOMNode> 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user