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

@@ -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;
}

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;
}

View File

@@ -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;
}

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;
}