From a86f4802a36c8fe50b673ac2f68d7604f7a09aa8 Mon Sep 17 00:00:00 2001 From: "peterl%netscape.com" Date: Wed, 16 Jun 1999 06:17:21 +0000 Subject: [PATCH] fixed re-resolve style contexts to handle local pseudo elements and capture style change information git-svn-id: svn://10.0.0.236/trunk@35705 18797224-902f-48f8-a5cc-f745e15eee43 --- .../layout/forms/nsButtonFrameRenderer.cpp | 29 +++++++++++++------ mozilla/layout/forms/nsButtonFrameRenderer.h | 7 ++++- .../layout/forms/nsHTMLButtonControlFrame.cpp | 7 +++-- .../html/forms/src/nsButtonControlFrame.cpp | 7 +++-- .../html/forms/src/nsButtonFrameRenderer.cpp | 29 +++++++++++++------ .../html/forms/src/nsButtonFrameRenderer.h | 7 ++++- .../forms/src/nsHTMLButtonControlFrame.cpp | 7 +++-- .../xul/base/src/nsTitledButtonFrame.cpp | 7 +++-- 8 files changed, 72 insertions(+), 28 deletions(-) diff --git a/mozilla/layout/forms/nsButtonFrameRenderer.cpp b/mozilla/layout/forms/nsButtonFrameRenderer.cpp index 33899e03e1c..8138bd5216d 100644 --- a/mozilla/layout/forms/nsButtonFrameRenderer.cpp +++ b/mozilla/layout/forms/nsButtonFrameRenderer.cpp @@ -30,7 +30,7 @@ void nsButtonFrameRenderer::SetFrame(nsFrame* aFrame, nsIPresContext& aPresContext) { mFrame = aFrame; - ReResolveStyles(aPresContext); + ReResolveStyles(aPresContext, 0, nsnull, nsnull); } void @@ -316,7 +316,10 @@ nsButtonFrameRenderer::GetAddedButtonBorderAndPadding() * Call this when styles change */ void -nsButtonFrameRenderer::ReResolveStyles(nsIPresContext& aPresContext) +nsButtonFrameRenderer::ReResolveStyles(nsIPresContext& aPresContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange) { // get all the styles @@ -328,32 +331,40 @@ nsButtonFrameRenderer::ReResolveStyles(nsIPresContext& aPresContext) // style that draw an outline around the button // see if the outline has changed. -// nsCOMPtr oldOutline = mOutlineStyle; + nsCOMPtr oldOutline = mOutlineStyle; nsCOMPtr atom ( getter_AddRefs(NS_NewAtom(":-moz-outline")) ); aPresContext.ProbePseudoStyleContextFor(content, atom, context, PR_FALSE, getter_AddRefs(mOutlineStyle)); - /* - if (mOutlineStyle != oldOutline) - { - // if changed redraw the old rect - mFrame->Invalidate(mOutlineRect, PR_TRUE); + if ((mOutlineStyle && oldOutline) && (mOutlineStyle != oldOutline)) { + nsFrame::CaptureStyleChangeFor(mFrame, oldOutline, mOutlineStyle, + aParentChange, aChangeList, aLocalChange); } - */ // style for the inner such as a dotted line (Windows) atom = getter_AddRefs(NS_NewAtom(":-moz-focus-inner")); + nsCOMPtr oldInnerFocus = mInnerFocusStyle; aPresContext.ProbePseudoStyleContextFor(content, atom, context, PR_FALSE, getter_AddRefs(mInnerFocusStyle)); + if ((mInnerFocusStyle && oldInnerFocus) && (mInnerFocusStyle != oldInnerFocus)) { + nsFrame::CaptureStyleChangeFor(mFrame, oldInnerFocus, mInnerFocusStyle, + aParentChange, aChangeList, aLocalChange); + } // style for outer focus like a ridged border (MAC). atom = getter_AddRefs(NS_NewAtom(":-moz-focus-outer")); + nsCOMPtr oldOuterFocus = mOuterFocusStyle; aPresContext.ProbePseudoStyleContextFor(content, atom, context, PR_FALSE, getter_AddRefs(mOuterFocusStyle)); + + if ((mOuterFocusStyle && oldOuterFocus) && (mOuterFocusStyle != oldOuterFocus)) { + nsFrame::CaptureStyleChangeFor(mFrame, oldOuterFocus, mOuterFocusStyle, + aParentChange, aChangeList, aLocalChange); + } } diff --git a/mozilla/layout/forms/nsButtonFrameRenderer.h b/mozilla/layout/forms/nsButtonFrameRenderer.h index f611f6f65cd..ba20d5a1232 100644 --- a/mozilla/layout/forms/nsButtonFrameRenderer.h +++ b/mozilla/layout/forms/nsButtonFrameRenderer.h @@ -30,6 +30,8 @@ #include "nsCOMPtr.h" #include "nsFrame.h" +class nsStyleChangeList; + class nsButtonFrameRenderer { public: @@ -76,7 +78,10 @@ public: virtual nsMargin GetFullButtonBorderAndPadding(); virtual nsMargin GetAddedButtonBorderAndPadding(); - virtual void ReResolveStyles(nsIPresContext& aPresContext); + virtual void ReResolveStyles(nsIPresContext& aPresContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange); virtual void Redraw(); diff --git a/mozilla/layout/forms/nsHTMLButtonControlFrame.cpp b/mozilla/layout/forms/nsHTMLButtonControlFrame.cpp index 680de89e788..cd94650bb4d 100644 --- a/mozilla/layout/forms/nsHTMLButtonControlFrame.cpp +++ b/mozilla/layout/forms/nsHTMLButtonControlFrame.cpp @@ -589,9 +589,12 @@ nsHTMLButtonControlFrame::ReResolveStyleContext ( nsIPresContext* aPresContext, return rv; } - if (NS_COMFALSE != rv) { - mRenderer.ReResolveStyles(*aPresContext); + if (NS_COMFALSE != rv) { // frame style changed + if (aLocalChange) { + aParentChange = *aLocalChange; // tell children about or change + } } + mRenderer.ReResolveStyles(*aPresContext, aParentChange, aChangeList, aLocalChange); return rv; diff --git a/mozilla/layout/html/forms/src/nsButtonControlFrame.cpp b/mozilla/layout/html/forms/src/nsButtonControlFrame.cpp index 390907542b6..9dca0fbb356 100644 --- a/mozilla/layout/html/forms/src/nsButtonControlFrame.cpp +++ b/mozilla/layout/html/forms/src/nsButtonControlFrame.cpp @@ -224,9 +224,12 @@ nsButtonControlFrame::ReResolveStyleContext ( nsIPresContext* aPresContext, nsIS return rv; } - if (NS_COMFALSE != rv) { - mRenderer.ReResolveStyles(*aPresContext); + if (NS_COMFALSE != rv) { // frame style changed + if (aLocalChange) { + aParentChange = *aLocalChange; // tell children about or change + } } + mRenderer.ReResolveStyles(*aPresContext, aParentChange, aChangeList, aLocalChange); return rv; diff --git a/mozilla/layout/html/forms/src/nsButtonFrameRenderer.cpp b/mozilla/layout/html/forms/src/nsButtonFrameRenderer.cpp index 33899e03e1c..8138bd5216d 100644 --- a/mozilla/layout/html/forms/src/nsButtonFrameRenderer.cpp +++ b/mozilla/layout/html/forms/src/nsButtonFrameRenderer.cpp @@ -30,7 +30,7 @@ void nsButtonFrameRenderer::SetFrame(nsFrame* aFrame, nsIPresContext& aPresContext) { mFrame = aFrame; - ReResolveStyles(aPresContext); + ReResolveStyles(aPresContext, 0, nsnull, nsnull); } void @@ -316,7 +316,10 @@ nsButtonFrameRenderer::GetAddedButtonBorderAndPadding() * Call this when styles change */ void -nsButtonFrameRenderer::ReResolveStyles(nsIPresContext& aPresContext) +nsButtonFrameRenderer::ReResolveStyles(nsIPresContext& aPresContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange) { // get all the styles @@ -328,32 +331,40 @@ nsButtonFrameRenderer::ReResolveStyles(nsIPresContext& aPresContext) // style that draw an outline around the button // see if the outline has changed. -// nsCOMPtr oldOutline = mOutlineStyle; + nsCOMPtr oldOutline = mOutlineStyle; nsCOMPtr atom ( getter_AddRefs(NS_NewAtom(":-moz-outline")) ); aPresContext.ProbePseudoStyleContextFor(content, atom, context, PR_FALSE, getter_AddRefs(mOutlineStyle)); - /* - if (mOutlineStyle != oldOutline) - { - // if changed redraw the old rect - mFrame->Invalidate(mOutlineRect, PR_TRUE); + if ((mOutlineStyle && oldOutline) && (mOutlineStyle != oldOutline)) { + nsFrame::CaptureStyleChangeFor(mFrame, oldOutline, mOutlineStyle, + aParentChange, aChangeList, aLocalChange); } - */ // style for the inner such as a dotted line (Windows) atom = getter_AddRefs(NS_NewAtom(":-moz-focus-inner")); + nsCOMPtr oldInnerFocus = mInnerFocusStyle; aPresContext.ProbePseudoStyleContextFor(content, atom, context, PR_FALSE, getter_AddRefs(mInnerFocusStyle)); + if ((mInnerFocusStyle && oldInnerFocus) && (mInnerFocusStyle != oldInnerFocus)) { + nsFrame::CaptureStyleChangeFor(mFrame, oldInnerFocus, mInnerFocusStyle, + aParentChange, aChangeList, aLocalChange); + } // style for outer focus like a ridged border (MAC). atom = getter_AddRefs(NS_NewAtom(":-moz-focus-outer")); + nsCOMPtr oldOuterFocus = mOuterFocusStyle; aPresContext.ProbePseudoStyleContextFor(content, atom, context, PR_FALSE, getter_AddRefs(mOuterFocusStyle)); + + if ((mOuterFocusStyle && oldOuterFocus) && (mOuterFocusStyle != oldOuterFocus)) { + nsFrame::CaptureStyleChangeFor(mFrame, oldOuterFocus, mOuterFocusStyle, + aParentChange, aChangeList, aLocalChange); + } } diff --git a/mozilla/layout/html/forms/src/nsButtonFrameRenderer.h b/mozilla/layout/html/forms/src/nsButtonFrameRenderer.h index f611f6f65cd..ba20d5a1232 100644 --- a/mozilla/layout/html/forms/src/nsButtonFrameRenderer.h +++ b/mozilla/layout/html/forms/src/nsButtonFrameRenderer.h @@ -30,6 +30,8 @@ #include "nsCOMPtr.h" #include "nsFrame.h" +class nsStyleChangeList; + class nsButtonFrameRenderer { public: @@ -76,7 +78,10 @@ public: virtual nsMargin GetFullButtonBorderAndPadding(); virtual nsMargin GetAddedButtonBorderAndPadding(); - virtual void ReResolveStyles(nsIPresContext& aPresContext); + virtual void ReResolveStyles(nsIPresContext& aPresContext, + PRInt32 aParentChange, + nsStyleChangeList* aChangeList, + PRInt32* aLocalChange); virtual void Redraw(); diff --git a/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.cpp b/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.cpp index 680de89e788..cd94650bb4d 100644 --- a/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.cpp +++ b/mozilla/layout/html/forms/src/nsHTMLButtonControlFrame.cpp @@ -589,9 +589,12 @@ nsHTMLButtonControlFrame::ReResolveStyleContext ( nsIPresContext* aPresContext, return rv; } - if (NS_COMFALSE != rv) { - mRenderer.ReResolveStyles(*aPresContext); + if (NS_COMFALSE != rv) { // frame style changed + if (aLocalChange) { + aParentChange = *aLocalChange; // tell children about or change + } } + mRenderer.ReResolveStyles(*aPresContext, aParentChange, aChangeList, aLocalChange); return rv; diff --git a/mozilla/layout/xul/base/src/nsTitledButtonFrame.cpp b/mozilla/layout/xul/base/src/nsTitledButtonFrame.cpp index 6a31c9e2b64..716b474a5b5 100644 --- a/mozilla/layout/xul/base/src/nsTitledButtonFrame.cpp +++ b/mozilla/layout/xul/base/src/nsTitledButtonFrame.cpp @@ -1083,9 +1083,12 @@ nsTitledButtonFrame :: ReResolveStyleContext ( nsIPresContext* aPresContext, nsI return rv; } - if (NS_COMFALSE != rv) { - mRenderer.ReResolveStyles(*aPresContext); + if (NS_COMFALSE != rv) { // frame style changed + if (aLocalChange) { + aParentChange = *aLocalChange; // tell children about or change + } } + mRenderer.ReResolveStyles(*aPresContext, aParentChange, aChangeList, aLocalChange); return rv;