box skinnablility changes.
-r Hyatt
This commit is contained in:
@@ -97,6 +97,7 @@ XUL_ATOM(crop, "crop")
|
|||||||
|
|
||||||
XUL_ATOM(mode, "mode")
|
XUL_ATOM(mode, "mode")
|
||||||
XUL_ATOM(box, "box")
|
XUL_ATOM(box, "box")
|
||||||
|
XUL_ATOM(mousethrough, "mousethrough")
|
||||||
XUL_ATOM(flex, "flex")
|
XUL_ATOM(flex, "flex")
|
||||||
XUL_ATOM(spring, "spring")
|
XUL_ATOM(spring, "spring")
|
||||||
XUL_ATOM(orient, "orient")
|
XUL_ATOM(orient, "orient")
|
||||||
@@ -130,6 +131,13 @@ XUL_ATOM(resizeafter, "resizeafter")
|
|||||||
XUL_ATOM(state, "state")
|
XUL_ATOM(state, "state")
|
||||||
XUL_ATOM(debug, "debug")
|
XUL_ATOM(debug, "debug")
|
||||||
|
|
||||||
|
// grid
|
||||||
|
XUL_ATOM(grid, "grid")
|
||||||
|
XUL_ATOM(rows, "rows")
|
||||||
|
XUL_ATOM(columns, "columns")
|
||||||
|
XUL_ATOM(row, "row")
|
||||||
|
XUL_ATOM(column, "column")
|
||||||
|
|
||||||
// toolbar & toolbar d&d atoms
|
// toolbar & toolbar d&d atoms
|
||||||
XUL_ATOM(ddDropLocation, "dd-droplocation")
|
XUL_ATOM(ddDropLocation, "dd-droplocation")
|
||||||
XUL_ATOM(ddDropLocationCoord, "dd-droplocationcoord")
|
XUL_ATOM(ddDropLocationCoord, "dd-droplocationcoord")
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ menu.colorpicker {
|
|||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
menu.colorpicker:active {
|
menu.colorpicker:active {
|
||||||
border: 1px inset #CCCCCC;
|
border: 1px inset #CCCCCC;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,7 @@
|
|||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
#include "nsDocument.h"
|
#include "nsDocument.h"
|
||||||
#include "nsToolbarItemFrame.h"
|
#include "nsToolbarItemFrame.h"
|
||||||
#include "nsXULCheckboxFrame.h"
|
#include "nsCheckBoxFrame.h"
|
||||||
#include "nsIScrollable.h"
|
#include "nsIScrollable.h"
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@@ -132,8 +132,28 @@ static PRBool gNoisyInlineConstruction = PR_FALSE;
|
|||||||
#define NEWGFX_LIST_SCROLLFRAME
|
#define NEWGFX_LIST_SCROLLFRAME
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef NEWGFX_LIST_SCROLLFRAME
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewGfxListControlFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewGfxListControlFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// grid
|
||||||
|
|
||||||
|
/*
|
||||||
|
nsresult
|
||||||
|
NS_NewGridFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewTempleFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsHorizontal);
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewObeliskFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsHorizontal);
|
||||||
|
|
||||||
|
// end grid
|
||||||
|
*/
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewRootBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewThumbFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewThumbFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
@@ -142,7 +162,7 @@ nsresult
|
|||||||
NS_NewScrollPortFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewScrollPortFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewGfxScrollFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, nsIDocument* aDocument );
|
NS_NewGfxScrollFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, nsIDocument* aDocument, PRBool aIsRoot);
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewTabFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewTabFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
@@ -163,7 +183,10 @@ nsresult
|
|||||||
NS_NewTitledButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewTitledButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewXULTextFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewImageBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewTextBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewTitledBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewTitledBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
@@ -178,7 +201,7 @@ nsresult
|
|||||||
NS_NewBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsRoot);
|
NS_NewBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsRoot);
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewXULButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
NS_NewButtonBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewSliderFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewSliderFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
@@ -2359,6 +2382,7 @@ nsCSSFrameConstructor::TableIsValidCellContent(nsIPresContext* aPresContext,
|
|||||||
#ifdef INCLUDE_XUL
|
#ifdef INCLUDE_XUL
|
||||||
if ( (nsXULAtoms::button == tag.get()) ||
|
if ( (nsXULAtoms::button == tag.get()) ||
|
||||||
(nsXULAtoms::titledbutton == tag.get()) ||
|
(nsXULAtoms::titledbutton == tag.get()) ||
|
||||||
|
(nsXULAtoms::box == tag.get()) ||
|
||||||
(nsXULAtoms::image == tag.get()) ||
|
(nsXULAtoms::image == tag.get()) ||
|
||||||
(nsXULAtoms::grippy == tag.get()) ||
|
(nsXULAtoms::grippy == tag.get()) ||
|
||||||
(nsXULAtoms::splitter == tag.get()) ||
|
(nsXULAtoms::splitter == tag.get()) ||
|
||||||
@@ -2603,6 +2627,7 @@ nsCSSFrameConstructor::ConstructDocElementFrame(nsIPresShell* aPresShell,
|
|||||||
aParentFrame,
|
aParentFrame,
|
||||||
nsLayoutAtoms::scrolledContentPseudo,
|
nsLayoutAtoms::scrolledContentPseudo,
|
||||||
document,
|
document,
|
||||||
|
PR_FALSE,
|
||||||
scrollFrame,
|
scrollFrame,
|
||||||
newContext,
|
newContext,
|
||||||
newScrollFrame);
|
newScrollFrame);
|
||||||
@@ -2837,7 +2862,15 @@ nsCSSFrameConstructor::ConstructRootFrame(nsIPresShell* aPresShell,
|
|||||||
nsIAtom* rootPseudo;
|
nsIAtom* rootPseudo;
|
||||||
|
|
||||||
if (!isPaginated) {
|
if (!isPaginated) {
|
||||||
|
PRInt32 nameSpaceID;
|
||||||
|
if (NS_SUCCEEDED(aDocElement->GetNameSpaceID(nameSpaceID)) &&
|
||||||
|
nameSpaceID == nsXULAtoms::nameSpaceID)
|
||||||
|
{
|
||||||
|
NS_NewRootBoxFrame(aPresShell, &rootFrame);
|
||||||
|
} else {
|
||||||
NS_NewRootFrame(aPresShell, &rootFrame);
|
NS_NewRootFrame(aPresShell, &rootFrame);
|
||||||
|
}
|
||||||
|
|
||||||
rootPseudo = nsLayoutAtoms::canvasPseudo;
|
rootPseudo = nsLayoutAtoms::canvasPseudo;
|
||||||
mDocElementContainingBlock = rootFrame;
|
mDocElementContainingBlock = rootFrame;
|
||||||
} else {
|
} else {
|
||||||
@@ -2868,6 +2901,8 @@ nsCSSFrameConstructor::ConstructRootFrame(nsIPresShell* aPresShell,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//isScrollable = PR_FALSE;
|
||||||
|
|
||||||
// As long as the webshell doesn't prohibit it, and the device supports
|
// As long as the webshell doesn't prohibit it, and the device supports
|
||||||
// it, create a scroll frame that will act as the scolling mechanism for
|
// it, create a scroll frame that will act as the scolling mechanism for
|
||||||
// the viewport.
|
// the viewport.
|
||||||
@@ -2941,6 +2976,7 @@ nsCSSFrameConstructor::ConstructRootFrame(nsIPresShell* aPresShell,
|
|||||||
viewportFrame,
|
viewportFrame,
|
||||||
rootPseudo,
|
rootPseudo,
|
||||||
document,
|
document,
|
||||||
|
PR_TRUE,
|
||||||
newFrame,
|
newFrame,
|
||||||
rootPseudoStyle,
|
rootPseudoStyle,
|
||||||
newScrollableFrame);
|
newScrollableFrame);
|
||||||
@@ -4656,7 +4692,7 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
else if (aTag == nsXULAtoms::button) {
|
else if (aTag == nsXULAtoms::button) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewXULButtonFrame(aPresShell, &newFrame);
|
rv = NS_NewButtonBoxFrame(aPresShell, &newFrame);
|
||||||
|
|
||||||
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
||||||
aStyleContext->GetStyleData(eStyleStruct_Display);
|
aStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
@@ -4679,15 +4715,18 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
} // End of BUTTON CONSTRUCTION logic
|
} // End of BUTTON CONSTRUCTION logic
|
||||||
|
|
||||||
// TITLED BUTTON CONSTRUCTION
|
// TITLED BUTTON CONSTRUCTION
|
||||||
else if (aTag == nsXULAtoms::titledbutton ||
|
else if (aTag == nsXULAtoms::titledbutton) {
|
||||||
aTag == nsXULAtoms::image) {
|
|
||||||
|
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewTitledButtonFrame(aPresShell, &newFrame);
|
rv = NS_NewTitledButtonFrame(aPresShell, &newFrame);
|
||||||
}
|
}
|
||||||
// End of TITLED BUTTON CONSTRUCTION logic
|
// End of TITLED BUTTON CONSTRUCTION logic
|
||||||
|
else if (aTag == nsXULAtoms::image) {
|
||||||
|
processChildren = PR_TRUE;
|
||||||
|
isReplaced = PR_TRUE;
|
||||||
|
rv = NS_NewImageBoxFrame(aPresShell, &newFrame);
|
||||||
|
}
|
||||||
else if (aTag == nsXULAtoms::spring) {
|
else if (aTag == nsXULAtoms::spring) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
@@ -4699,7 +4738,7 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
else if (aTag == nsXULAtoms::text) {
|
else if (aTag == nsXULAtoms::text) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewXULTextFrame(aPresShell, &newFrame);
|
rv = NS_NewTextBoxFrame(aPresShell, &newFrame);
|
||||||
}
|
}
|
||||||
// End of TEXT CONSTRUCTION logic
|
// End of TEXT CONSTRUCTION logic
|
||||||
|
|
||||||
@@ -4737,6 +4776,89 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewMenuPopupFrame(aPresShell, &newFrame);
|
rv = NS_NewMenuPopupFrame(aPresShell, &newFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
// ------- Begin Grid ---------
|
||||||
|
else if (aTag == nsXULAtoms::grid) {
|
||||||
|
processChildren = PR_TRUE;
|
||||||
|
isReplaced = PR_TRUE;
|
||||||
|
rv = NS_NewGridFrame(aPresShell, &newFrame);
|
||||||
|
|
||||||
|
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
||||||
|
aStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
|
|
||||||
|
// Boxes can scroll.
|
||||||
|
if (IsScrollable(aPresContext, display)) {
|
||||||
|
|
||||||
|
// set the top to be the newly created scrollframe
|
||||||
|
BuildScrollFrame(aPresShell, aPresContext, aState, aContent, aStyleContext, newFrame, aParentFrame,
|
||||||
|
topFrame, aStyleContext);
|
||||||
|
|
||||||
|
// we have a scrollframe so the parent becomes the scroll frame.
|
||||||
|
newFrame->GetParent(&aParentFrame);
|
||||||
|
|
||||||
|
primaryFrameSet = PR_TRUE;
|
||||||
|
|
||||||
|
frameHasBeenInitialized = PR_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
} //------- End Grid ------
|
||||||
|
|
||||||
|
// ------- Begin Rows/Columns ---------
|
||||||
|
else if (aTag == nsXULAtoms::rows || aTag == nsXULAtoms::columns) {
|
||||||
|
processChildren = PR_TRUE;
|
||||||
|
isReplaced = PR_TRUE;
|
||||||
|
PRBool isHorizontal = (aTag == nsXULAtoms::columns);
|
||||||
|
rv = NS_NewTempleFrame(aPresShell, &newFrame, isHorizontal);
|
||||||
|
|
||||||
|
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
||||||
|
aStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
|
|
||||||
|
// Boxes can scroll.
|
||||||
|
if (IsScrollable(aPresContext, display)) {
|
||||||
|
|
||||||
|
// set the top to be the newly created scrollframe
|
||||||
|
BuildScrollFrame(aPresShell, aPresContext, aState, aContent, aStyleContext, newFrame, aParentFrame,
|
||||||
|
topFrame, aStyleContext);
|
||||||
|
|
||||||
|
// we have a scrollframe so the parent becomes the scroll frame.
|
||||||
|
newFrame->GetParent(&aParentFrame);
|
||||||
|
|
||||||
|
primaryFrameSet = PR_TRUE;
|
||||||
|
|
||||||
|
frameHasBeenInitialized = PR_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
} //------- End Grid ------
|
||||||
|
|
||||||
|
// ------- Begin Row/Column ---------
|
||||||
|
else if (aTag == nsXULAtoms::row || aTag == nsXULAtoms::column) {
|
||||||
|
processChildren = PR_TRUE;
|
||||||
|
isReplaced = PR_TRUE;
|
||||||
|
PRBool isHorizontal = (aTag == nsXULAtoms::row);
|
||||||
|
rv = NS_NewObeliskFrame(aPresShell, &newFrame, isHorizontal);
|
||||||
|
|
||||||
|
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
||||||
|
aStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
|
|
||||||
|
// Boxes can scroll.
|
||||||
|
if (IsScrollable(aPresContext, display)) {
|
||||||
|
|
||||||
|
// set the top to be the newly created scrollframe
|
||||||
|
BuildScrollFrame(aPresShell, aPresContext, aState, aContent, aStyleContext, newFrame, aParentFrame,
|
||||||
|
topFrame, aStyleContext);
|
||||||
|
|
||||||
|
// we have a scrollframe so the parent becomes the scroll frame.
|
||||||
|
newFrame->GetParent(&aParentFrame);
|
||||||
|
|
||||||
|
primaryFrameSet = PR_TRUE;
|
||||||
|
|
||||||
|
frameHasBeenInitialized = PR_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
} //------- End Grid ------
|
||||||
|
*/
|
||||||
else if (aTag == nsXULAtoms::title) {
|
else if (aTag == nsXULAtoms::title) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
@@ -4949,7 +5071,7 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
aTag == nsXULAtoms::radio) {
|
aTag == nsXULAtoms::radio) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewXULCheckboxFrame(aPresShell, &newFrame);
|
rv = NS_NewCheckBoxFrame(aPresShell, &newFrame);
|
||||||
}
|
}
|
||||||
// End of XULCHECKBOX CONSTRUCTION logic
|
// End of XULCHECKBOX CONSTRUCTION logic
|
||||||
|
|
||||||
@@ -5123,6 +5245,7 @@ nsCSSFrameConstructor::BeginBuildingScrollFrame(nsIPresShell* aPresShell,
|
|||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsIAtom* aScrolledPseudo,
|
nsIAtom* aScrolledPseudo,
|
||||||
nsIDocument* aDocument,
|
nsIDocument* aDocument,
|
||||||
|
PRBool aIsRoot,
|
||||||
nsIFrame*& aNewFrame,
|
nsIFrame*& aNewFrame,
|
||||||
nsCOMPtr<nsIStyleContext>& aScrolledChildStyle,
|
nsCOMPtr<nsIStyleContext>& aScrolledChildStyle,
|
||||||
nsIFrame*& aScrollableFrame)
|
nsIFrame*& aScrollableFrame)
|
||||||
@@ -5140,7 +5263,7 @@ nsCSSFrameConstructor::BeginBuildingScrollFrame(nsIPresShell* aPresShell,
|
|||||||
if (isGfx) {
|
if (isGfx) {
|
||||||
|
|
||||||
BuildGfxScrollFrame(aPresShell, aPresContext, aState, aContent, aDocument, aParentFrame,
|
BuildGfxScrollFrame(aPresShell, aPresContext, aState, aContent, aDocument, aParentFrame,
|
||||||
contentStyle, gfxScrollFrame, anonymousItems);
|
contentStyle, aIsRoot, gfxScrollFrame, anonymousItems);
|
||||||
|
|
||||||
scrollFrame = anonymousItems.childList;
|
scrollFrame = anonymousItems.childList;
|
||||||
parentFrame = gfxScrollFrame;
|
parentFrame = gfxScrollFrame;
|
||||||
@@ -5283,6 +5406,7 @@ nsCSSFrameConstructor::BuildScrollFrame (nsIPresShell* aPresShell,
|
|||||||
aParentFrame,
|
aParentFrame,
|
||||||
nsLayoutAtoms::scrolledContentPseudo,
|
nsLayoutAtoms::scrolledContentPseudo,
|
||||||
document,
|
document,
|
||||||
|
PR_FALSE,
|
||||||
aNewFrame,
|
aNewFrame,
|
||||||
scrolledContentStyle,
|
scrolledContentStyle,
|
||||||
scrollFrame);
|
scrollFrame);
|
||||||
@@ -5317,10 +5441,11 @@ nsCSSFrameConstructor::BuildGfxScrollFrame (nsIPresShell* aPresShell,
|
|||||||
nsIDocument* aDocument,
|
nsIDocument* aDocument,
|
||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsIStyleContext* aStyleContext,
|
nsIStyleContext* aStyleContext,
|
||||||
|
PRBool aIsRoot,
|
||||||
nsIFrame*& aNewFrame,
|
nsIFrame*& aNewFrame,
|
||||||
nsFrameItems& aAnonymousFrames)
|
nsFrameItems& aAnonymousFrames)
|
||||||
{
|
{
|
||||||
NS_NewGfxScrollFrame(aPresShell, &aNewFrame,aDocument);
|
NS_NewGfxScrollFrame(aPresShell, &aNewFrame, aDocument, aIsRoot);
|
||||||
|
|
||||||
InitAndRestoreFrame(aPresContext, aState, aContent,
|
InitAndRestoreFrame(aPresContext, aState, aContent,
|
||||||
aParentFrame, aStyleContext, nsnull, aNewFrame);
|
aParentFrame, aStyleContext, nsnull, aNewFrame);
|
||||||
@@ -7074,6 +7199,28 @@ nsCSSFrameConstructor::ContentInserted(nsIPresContext* aPresContext,
|
|||||||
} else {
|
} else {
|
||||||
// Find the frame that precedes the insertion point.
|
// Find the frame that precedes the insertion point.
|
||||||
nsIFrame* prevSibling = FindPreviousSibling(shell, aContainer, aIndexInContainer);
|
nsIFrame* prevSibling = FindPreviousSibling(shell, aContainer, aIndexInContainer);
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (prevSibling) {
|
||||||
|
nsIFrame* parent;
|
||||||
|
prevSibling->GetParent(&parent);
|
||||||
|
nsIFrame* first;
|
||||||
|
parent->FirstChild(aPresContext, nsnull, &first);
|
||||||
|
PRBool found = PR_FALSE;
|
||||||
|
while(first)
|
||||||
|
{
|
||||||
|
if (first == prevSibling) {
|
||||||
|
found = PR_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
first->GetNextSibling(&first);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_ASSERTION(found,"Error sibling not in parent!!!!!");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
nsIFrame* nextSibling = nsnull;
|
nsIFrame* nextSibling = nsnull;
|
||||||
PRBool isAppend = PR_FALSE;
|
PRBool isAppend = PR_FALSE;
|
||||||
|
|
||||||
|
|||||||
@@ -646,6 +646,7 @@ protected:
|
|||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsIAtom* aScrolledPseudo,
|
nsIAtom* aScrolledPseudo,
|
||||||
nsIDocument* aDocument,
|
nsIDocument* aDocument,
|
||||||
|
PRBool aIsRoot,
|
||||||
nsIFrame*& aNewFrame,
|
nsIFrame*& aNewFrame,
|
||||||
nsCOMPtr<nsIStyleContext>& aScrolledChildStyle,
|
nsCOMPtr<nsIStyleContext>& aScrolledChildStyle,
|
||||||
nsIFrame*& aScrollableFrame);
|
nsIFrame*& aScrollableFrame);
|
||||||
@@ -671,6 +672,7 @@ protected:
|
|||||||
nsIDocument* aDocument,
|
nsIDocument* aDocument,
|
||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsIStyleContext* aStyleContext,
|
nsIStyleContext* aStyleContext,
|
||||||
|
PRBool aIsRoot,
|
||||||
nsIFrame*& aNewFrame,
|
nsIFrame*& aNewFrame,
|
||||||
nsFrameItems& aAnonymousFrames);
|
nsFrameItems& aAnonymousFrames);
|
||||||
|
|
||||||
|
|||||||
@@ -110,6 +110,11 @@ public:
|
|||||||
NS_IMETHOD AllocateFrame(size_t aSize, void** aResult) = 0;
|
NS_IMETHOD AllocateFrame(size_t aSize, void** aResult) = 0;
|
||||||
NS_IMETHOD FreeFrame(size_t aSize, void* aFreeChunk) = 0;
|
NS_IMETHOD FreeFrame(size_t aSize, void* aFreeChunk) = 0;
|
||||||
|
|
||||||
|
// Dynamic stack memory allocation
|
||||||
|
NS_IMETHOD PushStackMemory() = 0;
|
||||||
|
NS_IMETHOD PopStackMemory() = 0;
|
||||||
|
NS_IMETHOD AllocateStackMemory(size_t aSize, void** aResult) = 0;
|
||||||
|
|
||||||
NS_IMETHOD GetDocument(nsIDocument** aResult) = 0;
|
NS_IMETHOD GetDocument(nsIDocument** aResult) = 0;
|
||||||
|
|
||||||
NS_IMETHOD GetPresContext(nsIPresContext** aResult) = 0;
|
NS_IMETHOD GetPresContext(nsIPresContext** aResult) = 0;
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ static NS_DEFINE_CID(kCXIFConverterCID, NS_XIFFORMATCONVERTER_CID);
|
|||||||
static PRInt32 gMaxRCProcessingTime = -1;
|
static PRInt32 gMaxRCProcessingTime = -1;
|
||||||
|
|
||||||
// Largest chunk size we recycle
|
// Largest chunk size we recycle
|
||||||
static const size_t gMaxRecycledSize = 300;
|
static const size_t gMaxRecycledSize = 400;
|
||||||
|
|
||||||
// Flag for enabling/disabling asynchronous reflow
|
// Flag for enabling/disabling asynchronous reflow
|
||||||
// Set via the "layout.reflow.async" pref
|
// Set via the "layout.reflow.async" pref
|
||||||
@@ -157,6 +157,173 @@ static PRBool gDoAsyncReflow = PR_FALSE;
|
|||||||
// Set via the "layout.reflow.async.afterDocLoad" pref
|
// Set via the "layout.reflow.async.afterDocLoad" pref
|
||||||
static PRBool gDoAsyncReflowAfterDocLoad = PR_FALSE;
|
static PRBool gDoAsyncReflowAfterDocLoad = PR_FALSE;
|
||||||
|
|
||||||
|
#define MARK_INCREMENT 50
|
||||||
|
#define BLOCK_INCREMENT 2048
|
||||||
|
|
||||||
|
/**A block of memory that the stack will
|
||||||
|
* chop up and hand out
|
||||||
|
*/
|
||||||
|
struct StackBlock {
|
||||||
|
|
||||||
|
// a block of memory
|
||||||
|
void* mBlock;
|
||||||
|
|
||||||
|
// another block of memory that would only be created
|
||||||
|
// if our stack overflowed. Yes we have the ability
|
||||||
|
// to grow on a stack overflow
|
||||||
|
StackBlock* mNext;
|
||||||
|
StackBlock()
|
||||||
|
{
|
||||||
|
mBlock = new char*[BLOCK_INCREMENT];
|
||||||
|
mNext = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
~StackBlock()
|
||||||
|
{
|
||||||
|
delete[] mBlock;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* we hold an array of marks. A push pushes a mark on the stack
|
||||||
|
* a pop pops it off.
|
||||||
|
*/
|
||||||
|
struct StackMark {
|
||||||
|
// the block of memory we are currently handing out chunks of
|
||||||
|
StackBlock* mBlock;
|
||||||
|
|
||||||
|
// our current position in the memory
|
||||||
|
size_t mPos;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* A stack arena allows a stack based interface to a block of memory.
|
||||||
|
* It should be used when you need to allocate some temporary memory that
|
||||||
|
* you will immediately return.
|
||||||
|
*/
|
||||||
|
class StackArena {
|
||||||
|
public:
|
||||||
|
StackArena();
|
||||||
|
~StackArena();
|
||||||
|
|
||||||
|
// Memory management functions
|
||||||
|
nsresult Allocate(size_t aSize, void** aResult);
|
||||||
|
nsresult Push();
|
||||||
|
nsresult Pop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// our current position in memory
|
||||||
|
size_t mPos;
|
||||||
|
|
||||||
|
// a list of memory block. Usually there is only one
|
||||||
|
// but if we overrun our stack size we can get more memory.
|
||||||
|
StackBlock* mBlocks;
|
||||||
|
|
||||||
|
// the current block of memory we are passing our chucks of
|
||||||
|
StackBlock* mCurBlock;
|
||||||
|
|
||||||
|
// our stack of mark where push has been called
|
||||||
|
StackMark* mMarks;
|
||||||
|
|
||||||
|
// the current top of the the mark list
|
||||||
|
PRUint32 mStackTop;
|
||||||
|
|
||||||
|
// the size of the mark array
|
||||||
|
PRUint32 mMarkLength;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
StackArena::StackArena()
|
||||||
|
{
|
||||||
|
// allocate the marks array
|
||||||
|
mMarkLength = MARK_INCREMENT;
|
||||||
|
mMarks = new StackMark[mMarkLength];
|
||||||
|
|
||||||
|
// allocate our stack memory
|
||||||
|
mBlocks = new StackBlock();
|
||||||
|
mCurBlock = mBlocks;
|
||||||
|
|
||||||
|
mStackTop = 0;
|
||||||
|
mPos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
StackArena::~StackArena()
|
||||||
|
{
|
||||||
|
// free up our data
|
||||||
|
delete[] mMarks;
|
||||||
|
while(mBlocks)
|
||||||
|
{
|
||||||
|
StackBlock* toDelete = mBlocks;
|
||||||
|
mBlocks = mBlocks->mNext;
|
||||||
|
delete toDelete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
StackArena::Push()
|
||||||
|
{
|
||||||
|
// if the we overrun our mark array. Resize it.
|
||||||
|
if (mStackTop + 1 >= mMarkLength)
|
||||||
|
{
|
||||||
|
StackMark* oldMarks = mMarks;
|
||||||
|
PRUint32 oldLength = mMarkLength;
|
||||||
|
mMarkLength += MARK_INCREMENT;
|
||||||
|
void* marks = 0;
|
||||||
|
mMarks = new StackMark[mMarkLength];
|
||||||
|
nsCRT::memcpy(mMarks, oldMarks, sizeof(StackMark)*oldLength);
|
||||||
|
|
||||||
|
delete[] oldMarks;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set a mark at the top
|
||||||
|
mMarks[mStackTop].mBlock = mCurBlock;
|
||||||
|
mMarks[mStackTop].mPos = mPos;
|
||||||
|
|
||||||
|
mStackTop++;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
StackArena::Allocate(size_t aSize, void** aResult)
|
||||||
|
{
|
||||||
|
NS_ASSERTION(mStackTop > 0, "Error allocate called before push!!!");
|
||||||
|
|
||||||
|
// make sure we are aligned. Beard said 8 was safer then 4.
|
||||||
|
// Round size to multiple of 8
|
||||||
|
aSize = PR_ROUNDUP(aSize, 8);
|
||||||
|
|
||||||
|
// if the size makes the stack overflow. Grab another block for the stack
|
||||||
|
if (mPos + aSize >= BLOCK_INCREMENT)
|
||||||
|
{
|
||||||
|
NS_ASSERTION(aSize <= BLOCK_INCREMENT,"Requested memory is greater that our block size!!");
|
||||||
|
if (mCurBlock->mNext == nsnull)
|
||||||
|
mCurBlock->mNext = new StackBlock();
|
||||||
|
|
||||||
|
mCurBlock = mCurBlock->mNext;
|
||||||
|
mPos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the chunk they need.
|
||||||
|
*aResult = ((char*)mCurBlock->mBlock) + mPos;
|
||||||
|
mPos += aSize;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
StackArena::Pop()
|
||||||
|
{
|
||||||
|
// pop off the mark
|
||||||
|
NS_ASSERTION(mStackTop > 0, "Error Pop called 1 too many times");
|
||||||
|
mStackTop--;
|
||||||
|
mCurBlock = mMarks[mStackTop].mBlock;
|
||||||
|
mPos = mMarks[mStackTop].mPos;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Memory is allocated 4-byte aligned. We have recyclers for chunks up to
|
// Memory is allocated 4-byte aligned. We have recyclers for chunks up to
|
||||||
// 200 bytes
|
// 200 bytes
|
||||||
class FrameArena {
|
class FrameArena {
|
||||||
@@ -310,6 +477,11 @@ public:
|
|||||||
NS_IMETHOD AllocateFrame(size_t aSize, void** aResult);
|
NS_IMETHOD AllocateFrame(size_t aSize, void** aResult);
|
||||||
NS_IMETHOD FreeFrame(size_t aSize, void* aFreeChunk);
|
NS_IMETHOD FreeFrame(size_t aSize, void* aFreeChunk);
|
||||||
|
|
||||||
|
// Dynamic stack memory allocation
|
||||||
|
NS_IMETHOD PushStackMemory();
|
||||||
|
NS_IMETHOD PopStackMemory();
|
||||||
|
NS_IMETHOD AllocateStackMemory(size_t aSize, void** aResult);
|
||||||
|
|
||||||
NS_IMETHOD GetDocument(nsIDocument** aResult);
|
NS_IMETHOD GetDocument(nsIDocument** aResult);
|
||||||
NS_IMETHOD GetPresContext(nsIPresContext** aResult);
|
NS_IMETHOD GetPresContext(nsIPresContext** aResult);
|
||||||
NS_IMETHOD GetViewManager(nsIViewManager** aResult);
|
NS_IMETHOD GetViewManager(nsIViewManager** aResult);
|
||||||
@@ -522,6 +694,7 @@ protected:
|
|||||||
PRBool mPendingReflowEvent;
|
PRBool mPendingReflowEvent;
|
||||||
nsCOMPtr<nsIEventQueue> mEventQueue;
|
nsCOMPtr<nsIEventQueue> mEventQueue;
|
||||||
FrameArena mFrameArena;
|
FrameArena mFrameArena;
|
||||||
|
StackArena* mStackArena;
|
||||||
PRInt32 mAccumulatedReflowTime; // Time spent in reflow command processing so far
|
PRInt32 mAccumulatedReflowTime; // Time spent in reflow command processing so far
|
||||||
PRPackedBool mDocumentIsLoading; // A flag that is true while the document is loading.
|
PRPackedBool mDocumentIsLoading; // A flag that is true while the document is loading.
|
||||||
PRPackedBool mBatchReflows; // When set to true, the pres shell batches reflow commands.
|
PRPackedBool mBatchReflows; // When set to true, the pres shell batches reflow commands.
|
||||||
@@ -540,6 +713,8 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void FreeDynamicStack();
|
||||||
|
|
||||||
//helper funcs for disabing autoscrolling
|
//helper funcs for disabing autoscrolling
|
||||||
void DisableScrolling(){mScrollingEnabled = PR_FALSE;}
|
void DisableScrolling(){mScrollingEnabled = PR_FALSE;}
|
||||||
void EnableScrolling(){mScrollingEnabled = PR_TRUE;}
|
void EnableScrolling(){mScrollingEnabled = PR_TRUE;}
|
||||||
@@ -650,7 +825,7 @@ NS_NewPresShell(nsIPresShell** aInstancePtrResult)
|
|||||||
(void **) aInstancePtrResult);
|
(void **) aInstancePtrResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
PresShell::PresShell()
|
PresShell::PresShell():mStackArena(nsnull)
|
||||||
{
|
{
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
mIsDestroying = PR_FALSE;
|
mIsDestroying = PR_FALSE;
|
||||||
@@ -718,6 +893,9 @@ PresShell::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||||||
|
|
||||||
PresShell::~PresShell()
|
PresShell::~PresShell()
|
||||||
{
|
{
|
||||||
|
// if we allocated any stack memory free it.
|
||||||
|
FreeDynamicStack();
|
||||||
|
|
||||||
mRefCnt = 99;/* XXX hack! get around re-entrancy bugs */
|
mRefCnt = 99;/* XXX hack! get around re-entrancy bugs */
|
||||||
|
|
||||||
mIsDestroying = PR_TRUE;
|
mIsDestroying = PR_TRUE;
|
||||||
@@ -873,6 +1051,44 @@ PresShell::Init(nsIDocument* aDocument,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dynamic stack memory allocation
|
||||||
|
NS_IMETHODIMP
|
||||||
|
PresShell::PushStackMemory()
|
||||||
|
{
|
||||||
|
if (nsnull == mStackArena)
|
||||||
|
mStackArena = new StackArena();
|
||||||
|
|
||||||
|
return mStackArena->Push();
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
PresShell::PopStackMemory()
|
||||||
|
{
|
||||||
|
if (nsnull == mStackArena)
|
||||||
|
mStackArena = new StackArena();
|
||||||
|
|
||||||
|
return mStackArena->Pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
PresShell::AllocateStackMemory(size_t aSize, void** aResult)
|
||||||
|
{
|
||||||
|
if (nsnull == mStackArena)
|
||||||
|
mStackArena = new StackArena();
|
||||||
|
|
||||||
|
return mStackArena->Allocate(aSize, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PresShell::FreeDynamicStack()
|
||||||
|
{
|
||||||
|
if (mStackArena) {
|
||||||
|
delete mStackArena;
|
||||||
|
mStackArena = nsnull;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
PresShell::FreeFrame(size_t aSize, void* aPtr)
|
PresShell::FreeFrame(size_t aSize, void* aPtr)
|
||||||
{
|
{
|
||||||
@@ -2138,6 +2354,9 @@ PresShell::ProcessReflowCommands(PRBool aInterruptible)
|
|||||||
|
|
||||||
MOZ_TIMER_DEBUGLOG(("Stop: Reflow: PresShell::ProcessReflowCommands(), this=%p\n", this));
|
MOZ_TIMER_DEBUGLOG(("Stop: Reflow: PresShell::ProcessReflowCommands(), this=%p\n", this));
|
||||||
MOZ_TIMER_STOP(mReflowWatch);
|
MOZ_TIMER_STOP(mReflowWatch);
|
||||||
|
|
||||||
|
// if we allocated any stack memory during reflow free it.
|
||||||
|
//FreeDynamicStack();
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,6 +110,11 @@ public:
|
|||||||
NS_IMETHOD AllocateFrame(size_t aSize, void** aResult) = 0;
|
NS_IMETHOD AllocateFrame(size_t aSize, void** aResult) = 0;
|
||||||
NS_IMETHOD FreeFrame(size_t aSize, void* aFreeChunk) = 0;
|
NS_IMETHOD FreeFrame(size_t aSize, void* aFreeChunk) = 0;
|
||||||
|
|
||||||
|
// Dynamic stack memory allocation
|
||||||
|
NS_IMETHOD PushStackMemory() = 0;
|
||||||
|
NS_IMETHOD PopStackMemory() = 0;
|
||||||
|
NS_IMETHOD AllocateStackMemory(size_t aSize, void** aResult) = 0;
|
||||||
|
|
||||||
NS_IMETHOD GetDocument(nsIDocument** aResult) = 0;
|
NS_IMETHOD GetDocument(nsIDocument** aResult) = 0;
|
||||||
|
|
||||||
NS_IMETHOD GetPresContext(nsIPresContext** aResult) = 0;
|
NS_IMETHOD GetPresContext(nsIPresContext** aResult) = 0;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -19,12 +19,12 @@
|
|||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
#ifndef nsScrollFrame_h___
|
#ifndef nsGfxScrollFrame_h___
|
||||||
#define nsScrollFrame_h___
|
#define nsGfxScrollFrame_h___
|
||||||
|
|
||||||
#include "nsHTMLContainerFrame.h"
|
#include "nsHTMLContainerFrame.h"
|
||||||
#include "nsIAnonymousContentCreator.h"
|
#include "nsIAnonymousContentCreator.h"
|
||||||
#include "nsIBox.h"
|
#include "nsBoxFrame.h"
|
||||||
#include "nsIScrollableFrame.h"
|
#include "nsIScrollableFrame.h"
|
||||||
|
|
||||||
class nsISupportsArray;
|
class nsISupportsArray;
|
||||||
@@ -39,13 +39,12 @@ class nsGfxScrollFrameInner;
|
|||||||
* Scroll frames don't support incremental changes, i.e. you can't replace
|
* Scroll frames don't support incremental changes, i.e. you can't replace
|
||||||
* or remove the scrolled frame
|
* or remove the scrolled frame
|
||||||
*/
|
*/
|
||||||
class nsGfxScrollFrame : public nsHTMLContainerFrame,
|
class nsGfxScrollFrame : public nsIAnonymousContentCreator,
|
||||||
public nsIAnonymousContentCreator,
|
public nsBoxFrame,
|
||||||
public nsIBox,
|
|
||||||
public nsIScrollableFrame {
|
public nsIScrollableFrame {
|
||||||
public:
|
public:
|
||||||
friend nsresult NS_NewGfxScrollFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame,
|
friend nsresult NS_NewGfxScrollFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame,
|
||||||
nsIDocument* aDocument);
|
nsIDocument* aDocument, PRBool aIsRoot);
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
@@ -53,8 +52,6 @@ public:
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow);
|
nsIFrame* aPrevInFlow);
|
||||||
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug);
|
|
||||||
|
|
||||||
virtual ~nsGfxScrollFrame();
|
virtual ~nsGfxScrollFrame();
|
||||||
|
|
||||||
|
|
||||||
@@ -85,13 +82,6 @@ public:
|
|||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
nsIFrame* aOldFrame);
|
nsIFrame* aOldFrame);
|
||||||
|
|
||||||
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
|
||||||
nsDidReflowStatus aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -105,18 +95,18 @@ public:
|
|||||||
PRInt32& aContentOffsetEnd,
|
PRInt32& aContentOffsetEnd,
|
||||||
PRBool& aBeginFrameContent);
|
PRBool& aBeginFrameContent);
|
||||||
|
|
||||||
NS_IMETHOD ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild);
|
|
||||||
|
|
||||||
// nsIAnonymousContentCreator
|
// nsIAnonymousContentCreator
|
||||||
NS_IMETHOD CreateAnonymousContent(nsIPresContext* aPresContext,
|
NS_IMETHOD CreateAnonymousContent(nsIPresContext* aPresContext,
|
||||||
nsISupportsArray& aAnonymousItems);
|
nsISupportsArray& aAnonymousItems);
|
||||||
|
|
||||||
// nsIBox methods
|
// nsIBox methods
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
NS_DECL_ISUPPORTS
|
||||||
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef(void) { return NS_OK; }
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
NS_IMETHOD_(nsrefcnt) Release(void) { return NS_OK; }
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
NS_IMETHOD InvalidateCache(nsIFrame* aChild);
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD GetPadding(nsMargin& aPadding);
|
||||||
|
|
||||||
// nsIScrollableFrame
|
// nsIScrollableFrame
|
||||||
NS_IMETHOD SetScrolledFrame(nsIPresContext* aPresContext, nsIFrame *aScrolledFrame);
|
NS_IMETHOD SetScrolledFrame(nsIPresContext* aPresContext, nsIFrame *aScrolledFrame);
|
||||||
@@ -138,8 +128,10 @@ public:
|
|||||||
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
virtual nsresult GetContentOf(nsIContent** aContent);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsGfxScrollFrame(nsIDocument* aDocument);
|
nsGfxScrollFrame(nsIPresShell* aShell, nsIDocument* aDocument, PRBool aIsRoot);
|
||||||
virtual PRIntn GetSkipSides() const;
|
virtual PRIntn GetSkipSides() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -19,12 +19,12 @@
|
|||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
#ifndef nsScrollFrame_h___
|
#ifndef nsGfxScrollFrame_h___
|
||||||
#define nsScrollFrame_h___
|
#define nsGfxScrollFrame_h___
|
||||||
|
|
||||||
#include "nsHTMLContainerFrame.h"
|
#include "nsHTMLContainerFrame.h"
|
||||||
#include "nsIAnonymousContentCreator.h"
|
#include "nsIAnonymousContentCreator.h"
|
||||||
#include "nsIBox.h"
|
#include "nsBoxFrame.h"
|
||||||
#include "nsIScrollableFrame.h"
|
#include "nsIScrollableFrame.h"
|
||||||
|
|
||||||
class nsISupportsArray;
|
class nsISupportsArray;
|
||||||
@@ -39,13 +39,12 @@ class nsGfxScrollFrameInner;
|
|||||||
* Scroll frames don't support incremental changes, i.e. you can't replace
|
* Scroll frames don't support incremental changes, i.e. you can't replace
|
||||||
* or remove the scrolled frame
|
* or remove the scrolled frame
|
||||||
*/
|
*/
|
||||||
class nsGfxScrollFrame : public nsHTMLContainerFrame,
|
class nsGfxScrollFrame : public nsIAnonymousContentCreator,
|
||||||
public nsIAnonymousContentCreator,
|
public nsBoxFrame,
|
||||||
public nsIBox,
|
|
||||||
public nsIScrollableFrame {
|
public nsIScrollableFrame {
|
||||||
public:
|
public:
|
||||||
friend nsresult NS_NewGfxScrollFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame,
|
friend nsresult NS_NewGfxScrollFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame,
|
||||||
nsIDocument* aDocument);
|
nsIDocument* aDocument, PRBool aIsRoot);
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
@@ -53,8 +52,6 @@ public:
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow);
|
nsIFrame* aPrevInFlow);
|
||||||
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug);
|
|
||||||
|
|
||||||
virtual ~nsGfxScrollFrame();
|
virtual ~nsGfxScrollFrame();
|
||||||
|
|
||||||
|
|
||||||
@@ -85,13 +82,6 @@ public:
|
|||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
nsIFrame* aOldFrame);
|
nsIFrame* aOldFrame);
|
||||||
|
|
||||||
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
|
||||||
nsDidReflowStatus aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -105,18 +95,18 @@ public:
|
|||||||
PRInt32& aContentOffsetEnd,
|
PRInt32& aContentOffsetEnd,
|
||||||
PRBool& aBeginFrameContent);
|
PRBool& aBeginFrameContent);
|
||||||
|
|
||||||
NS_IMETHOD ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild);
|
|
||||||
|
|
||||||
// nsIAnonymousContentCreator
|
// nsIAnonymousContentCreator
|
||||||
NS_IMETHOD CreateAnonymousContent(nsIPresContext* aPresContext,
|
NS_IMETHOD CreateAnonymousContent(nsIPresContext* aPresContext,
|
||||||
nsISupportsArray& aAnonymousItems);
|
nsISupportsArray& aAnonymousItems);
|
||||||
|
|
||||||
// nsIBox methods
|
// nsIBox methods
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
NS_DECL_ISUPPORTS
|
||||||
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef(void) { return NS_OK; }
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
NS_IMETHOD_(nsrefcnt) Release(void) { return NS_OK; }
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
NS_IMETHOD InvalidateCache(nsIFrame* aChild);
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD GetPadding(nsMargin& aPadding);
|
||||||
|
|
||||||
// nsIScrollableFrame
|
// nsIScrollableFrame
|
||||||
NS_IMETHOD SetScrolledFrame(nsIPresContext* aPresContext, nsIFrame *aScrolledFrame);
|
NS_IMETHOD SetScrolledFrame(nsIPresContext* aPresContext, nsIFrame *aScrolledFrame);
|
||||||
@@ -138,8 +128,10 @@ public:
|
|||||||
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
virtual nsresult GetContentOf(nsIContent** aContent);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsGfxScrollFrame(nsIDocument* aDocument);
|
nsGfxScrollFrame(nsIPresShell* aShell, nsIDocument* aDocument, PRBool aIsRoot);
|
||||||
virtual PRIntn GetSkipSides() const;
|
virtual PRIntn GetSkipSides() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ static NS_DEFINE_CID(kCXIFConverterCID, NS_XIFFORMATCONVERTER_CID);
|
|||||||
static PRInt32 gMaxRCProcessingTime = -1;
|
static PRInt32 gMaxRCProcessingTime = -1;
|
||||||
|
|
||||||
// Largest chunk size we recycle
|
// Largest chunk size we recycle
|
||||||
static const size_t gMaxRecycledSize = 300;
|
static const size_t gMaxRecycledSize = 400;
|
||||||
|
|
||||||
// Flag for enabling/disabling asynchronous reflow
|
// Flag for enabling/disabling asynchronous reflow
|
||||||
// Set via the "layout.reflow.async" pref
|
// Set via the "layout.reflow.async" pref
|
||||||
@@ -157,6 +157,173 @@ static PRBool gDoAsyncReflow = PR_FALSE;
|
|||||||
// Set via the "layout.reflow.async.afterDocLoad" pref
|
// Set via the "layout.reflow.async.afterDocLoad" pref
|
||||||
static PRBool gDoAsyncReflowAfterDocLoad = PR_FALSE;
|
static PRBool gDoAsyncReflowAfterDocLoad = PR_FALSE;
|
||||||
|
|
||||||
|
#define MARK_INCREMENT 50
|
||||||
|
#define BLOCK_INCREMENT 2048
|
||||||
|
|
||||||
|
/**A block of memory that the stack will
|
||||||
|
* chop up and hand out
|
||||||
|
*/
|
||||||
|
struct StackBlock {
|
||||||
|
|
||||||
|
// a block of memory
|
||||||
|
void* mBlock;
|
||||||
|
|
||||||
|
// another block of memory that would only be created
|
||||||
|
// if our stack overflowed. Yes we have the ability
|
||||||
|
// to grow on a stack overflow
|
||||||
|
StackBlock* mNext;
|
||||||
|
StackBlock()
|
||||||
|
{
|
||||||
|
mBlock = new char*[BLOCK_INCREMENT];
|
||||||
|
mNext = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
~StackBlock()
|
||||||
|
{
|
||||||
|
delete[] mBlock;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* we hold an array of marks. A push pushes a mark on the stack
|
||||||
|
* a pop pops it off.
|
||||||
|
*/
|
||||||
|
struct StackMark {
|
||||||
|
// the block of memory we are currently handing out chunks of
|
||||||
|
StackBlock* mBlock;
|
||||||
|
|
||||||
|
// our current position in the memory
|
||||||
|
size_t mPos;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* A stack arena allows a stack based interface to a block of memory.
|
||||||
|
* It should be used when you need to allocate some temporary memory that
|
||||||
|
* you will immediately return.
|
||||||
|
*/
|
||||||
|
class StackArena {
|
||||||
|
public:
|
||||||
|
StackArena();
|
||||||
|
~StackArena();
|
||||||
|
|
||||||
|
// Memory management functions
|
||||||
|
nsresult Allocate(size_t aSize, void** aResult);
|
||||||
|
nsresult Push();
|
||||||
|
nsresult Pop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// our current position in memory
|
||||||
|
size_t mPos;
|
||||||
|
|
||||||
|
// a list of memory block. Usually there is only one
|
||||||
|
// but if we overrun our stack size we can get more memory.
|
||||||
|
StackBlock* mBlocks;
|
||||||
|
|
||||||
|
// the current block of memory we are passing our chucks of
|
||||||
|
StackBlock* mCurBlock;
|
||||||
|
|
||||||
|
// our stack of mark where push has been called
|
||||||
|
StackMark* mMarks;
|
||||||
|
|
||||||
|
// the current top of the the mark list
|
||||||
|
PRUint32 mStackTop;
|
||||||
|
|
||||||
|
// the size of the mark array
|
||||||
|
PRUint32 mMarkLength;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
StackArena::StackArena()
|
||||||
|
{
|
||||||
|
// allocate the marks array
|
||||||
|
mMarkLength = MARK_INCREMENT;
|
||||||
|
mMarks = new StackMark[mMarkLength];
|
||||||
|
|
||||||
|
// allocate our stack memory
|
||||||
|
mBlocks = new StackBlock();
|
||||||
|
mCurBlock = mBlocks;
|
||||||
|
|
||||||
|
mStackTop = 0;
|
||||||
|
mPos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
StackArena::~StackArena()
|
||||||
|
{
|
||||||
|
// free up our data
|
||||||
|
delete[] mMarks;
|
||||||
|
while(mBlocks)
|
||||||
|
{
|
||||||
|
StackBlock* toDelete = mBlocks;
|
||||||
|
mBlocks = mBlocks->mNext;
|
||||||
|
delete toDelete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
StackArena::Push()
|
||||||
|
{
|
||||||
|
// if the we overrun our mark array. Resize it.
|
||||||
|
if (mStackTop + 1 >= mMarkLength)
|
||||||
|
{
|
||||||
|
StackMark* oldMarks = mMarks;
|
||||||
|
PRUint32 oldLength = mMarkLength;
|
||||||
|
mMarkLength += MARK_INCREMENT;
|
||||||
|
void* marks = 0;
|
||||||
|
mMarks = new StackMark[mMarkLength];
|
||||||
|
nsCRT::memcpy(mMarks, oldMarks, sizeof(StackMark)*oldLength);
|
||||||
|
|
||||||
|
delete[] oldMarks;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set a mark at the top
|
||||||
|
mMarks[mStackTop].mBlock = mCurBlock;
|
||||||
|
mMarks[mStackTop].mPos = mPos;
|
||||||
|
|
||||||
|
mStackTop++;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
StackArena::Allocate(size_t aSize, void** aResult)
|
||||||
|
{
|
||||||
|
NS_ASSERTION(mStackTop > 0, "Error allocate called before push!!!");
|
||||||
|
|
||||||
|
// make sure we are aligned. Beard said 8 was safer then 4.
|
||||||
|
// Round size to multiple of 8
|
||||||
|
aSize = PR_ROUNDUP(aSize, 8);
|
||||||
|
|
||||||
|
// if the size makes the stack overflow. Grab another block for the stack
|
||||||
|
if (mPos + aSize >= BLOCK_INCREMENT)
|
||||||
|
{
|
||||||
|
NS_ASSERTION(aSize <= BLOCK_INCREMENT,"Requested memory is greater that our block size!!");
|
||||||
|
if (mCurBlock->mNext == nsnull)
|
||||||
|
mCurBlock->mNext = new StackBlock();
|
||||||
|
|
||||||
|
mCurBlock = mCurBlock->mNext;
|
||||||
|
mPos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the chunk they need.
|
||||||
|
*aResult = ((char*)mCurBlock->mBlock) + mPos;
|
||||||
|
mPos += aSize;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
StackArena::Pop()
|
||||||
|
{
|
||||||
|
// pop off the mark
|
||||||
|
NS_ASSERTION(mStackTop > 0, "Error Pop called 1 too many times");
|
||||||
|
mStackTop--;
|
||||||
|
mCurBlock = mMarks[mStackTop].mBlock;
|
||||||
|
mPos = mMarks[mStackTop].mPos;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Memory is allocated 4-byte aligned. We have recyclers for chunks up to
|
// Memory is allocated 4-byte aligned. We have recyclers for chunks up to
|
||||||
// 200 bytes
|
// 200 bytes
|
||||||
class FrameArena {
|
class FrameArena {
|
||||||
@@ -310,6 +477,11 @@ public:
|
|||||||
NS_IMETHOD AllocateFrame(size_t aSize, void** aResult);
|
NS_IMETHOD AllocateFrame(size_t aSize, void** aResult);
|
||||||
NS_IMETHOD FreeFrame(size_t aSize, void* aFreeChunk);
|
NS_IMETHOD FreeFrame(size_t aSize, void* aFreeChunk);
|
||||||
|
|
||||||
|
// Dynamic stack memory allocation
|
||||||
|
NS_IMETHOD PushStackMemory();
|
||||||
|
NS_IMETHOD PopStackMemory();
|
||||||
|
NS_IMETHOD AllocateStackMemory(size_t aSize, void** aResult);
|
||||||
|
|
||||||
NS_IMETHOD GetDocument(nsIDocument** aResult);
|
NS_IMETHOD GetDocument(nsIDocument** aResult);
|
||||||
NS_IMETHOD GetPresContext(nsIPresContext** aResult);
|
NS_IMETHOD GetPresContext(nsIPresContext** aResult);
|
||||||
NS_IMETHOD GetViewManager(nsIViewManager** aResult);
|
NS_IMETHOD GetViewManager(nsIViewManager** aResult);
|
||||||
@@ -522,6 +694,7 @@ protected:
|
|||||||
PRBool mPendingReflowEvent;
|
PRBool mPendingReflowEvent;
|
||||||
nsCOMPtr<nsIEventQueue> mEventQueue;
|
nsCOMPtr<nsIEventQueue> mEventQueue;
|
||||||
FrameArena mFrameArena;
|
FrameArena mFrameArena;
|
||||||
|
StackArena* mStackArena;
|
||||||
PRInt32 mAccumulatedReflowTime; // Time spent in reflow command processing so far
|
PRInt32 mAccumulatedReflowTime; // Time spent in reflow command processing so far
|
||||||
PRPackedBool mDocumentIsLoading; // A flag that is true while the document is loading.
|
PRPackedBool mDocumentIsLoading; // A flag that is true while the document is loading.
|
||||||
PRPackedBool mBatchReflows; // When set to true, the pres shell batches reflow commands.
|
PRPackedBool mBatchReflows; // When set to true, the pres shell batches reflow commands.
|
||||||
@@ -540,6 +713,8 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void FreeDynamicStack();
|
||||||
|
|
||||||
//helper funcs for disabing autoscrolling
|
//helper funcs for disabing autoscrolling
|
||||||
void DisableScrolling(){mScrollingEnabled = PR_FALSE;}
|
void DisableScrolling(){mScrollingEnabled = PR_FALSE;}
|
||||||
void EnableScrolling(){mScrollingEnabled = PR_TRUE;}
|
void EnableScrolling(){mScrollingEnabled = PR_TRUE;}
|
||||||
@@ -650,7 +825,7 @@ NS_NewPresShell(nsIPresShell** aInstancePtrResult)
|
|||||||
(void **) aInstancePtrResult);
|
(void **) aInstancePtrResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
PresShell::PresShell()
|
PresShell::PresShell():mStackArena(nsnull)
|
||||||
{
|
{
|
||||||
NS_INIT_REFCNT();
|
NS_INIT_REFCNT();
|
||||||
mIsDestroying = PR_FALSE;
|
mIsDestroying = PR_FALSE;
|
||||||
@@ -718,6 +893,9 @@ PresShell::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||||||
|
|
||||||
PresShell::~PresShell()
|
PresShell::~PresShell()
|
||||||
{
|
{
|
||||||
|
// if we allocated any stack memory free it.
|
||||||
|
FreeDynamicStack();
|
||||||
|
|
||||||
mRefCnt = 99;/* XXX hack! get around re-entrancy bugs */
|
mRefCnt = 99;/* XXX hack! get around re-entrancy bugs */
|
||||||
|
|
||||||
mIsDestroying = PR_TRUE;
|
mIsDestroying = PR_TRUE;
|
||||||
@@ -873,6 +1051,44 @@ PresShell::Init(nsIDocument* aDocument,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dynamic stack memory allocation
|
||||||
|
NS_IMETHODIMP
|
||||||
|
PresShell::PushStackMemory()
|
||||||
|
{
|
||||||
|
if (nsnull == mStackArena)
|
||||||
|
mStackArena = new StackArena();
|
||||||
|
|
||||||
|
return mStackArena->Push();
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
PresShell::PopStackMemory()
|
||||||
|
{
|
||||||
|
if (nsnull == mStackArena)
|
||||||
|
mStackArena = new StackArena();
|
||||||
|
|
||||||
|
return mStackArena->Pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
PresShell::AllocateStackMemory(size_t aSize, void** aResult)
|
||||||
|
{
|
||||||
|
if (nsnull == mStackArena)
|
||||||
|
mStackArena = new StackArena();
|
||||||
|
|
||||||
|
return mStackArena->Allocate(aSize, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PresShell::FreeDynamicStack()
|
||||||
|
{
|
||||||
|
if (mStackArena) {
|
||||||
|
delete mStackArena;
|
||||||
|
mStackArena = nsnull;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
PresShell::FreeFrame(size_t aSize, void* aPtr)
|
PresShell::FreeFrame(size_t aSize, void* aPtr)
|
||||||
{
|
{
|
||||||
@@ -2138,6 +2354,9 @@ PresShell::ProcessReflowCommands(PRBool aInterruptible)
|
|||||||
|
|
||||||
MOZ_TIMER_DEBUGLOG(("Stop: Reflow: PresShell::ProcessReflowCommands(), this=%p\n", this));
|
MOZ_TIMER_DEBUGLOG(("Stop: Reflow: PresShell::ProcessReflowCommands(), this=%p\n", this));
|
||||||
MOZ_TIMER_STOP(mReflowWatch);
|
MOZ_TIMER_STOP(mReflowWatch);
|
||||||
|
|
||||||
|
// if we allocated any stack memory during reflow free it.
|
||||||
|
//FreeDynamicStack();
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,8 @@
|
|||||||
#include "nsScrollPortFrame.h"
|
#include "nsScrollPortFrame.h"
|
||||||
#include "nsLayoutAtoms.h"
|
#include "nsLayoutAtoms.h"
|
||||||
#include "nsIBox.h"
|
#include "nsIBox.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
#include "nsIBoxToBlockAdaptor.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
@@ -68,7 +70,7 @@ NS_NewScrollPortFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame)
|
|||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsScrollPortFrame* it = new (aPresShell) nsScrollPortFrame;
|
nsScrollPortFrame* it = new (aPresShell) nsScrollPortFrame (aPresShell);
|
||||||
if (nsnull == it) {
|
if (nsnull == it) {
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
@@ -76,28 +78,8 @@ NS_NewScrollPortFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame)
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
nsScrollPortFrame::nsScrollPortFrame(nsIPresShell* aShell):nsBoxFrame(aShell)
|
||||||
nsScrollPortFrame::SetDebug(nsIPresContext* aPresContext, PRBool aDebug)
|
|
||||||
{
|
{
|
||||||
nsIFrame* kid = mFrames.FirstChild();
|
|
||||||
while (nsnull != kid) {
|
|
||||||
nsIBox* ibox = nsnull;
|
|
||||||
if (NS_SUCCEEDED(kid->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox) {
|
|
||||||
ibox->SetDebug(aPresContext, aDebug);
|
|
||||||
}
|
|
||||||
|
|
||||||
kid->GetNextSibling(&kid);
|
|
||||||
}
|
|
||||||
|
|
||||||
mNeedsRecalc = PR_TRUE;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsScrollPortFrame::nsScrollPortFrame()
|
|
||||||
{
|
|
||||||
//mIncremental = PR_FALSE;
|
|
||||||
mNeedsRecalc = PR_TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
@@ -107,7 +89,7 @@ nsScrollPortFrame::Init(nsIPresContext* aPresContext,
|
|||||||
nsIStyleContext* aStyleContext,
|
nsIStyleContext* aStyleContext,
|
||||||
nsIFrame* aPrevInFlow)
|
nsIFrame* aPrevInFlow)
|
||||||
{
|
{
|
||||||
nsresult rv = nsHTMLContainerFrame::Init(aPresContext, aContent,
|
nsresult rv = nsBoxFrame::Init(aPresContext, aContent,
|
||||||
aParent, aStyleContext,
|
aParent, aStyleContext,
|
||||||
aPrevInFlow);
|
aPrevInFlow);
|
||||||
|
|
||||||
@@ -121,7 +103,7 @@ nsScrollPortFrame::SetInitialChildList(nsIPresContext* aPresContext,
|
|||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
nsIFrame* aChildList)
|
nsIFrame* aChildList)
|
||||||
{
|
{
|
||||||
nsresult rv = nsHTMLContainerFrame::SetInitialChildList(aPresContext, aListName,
|
nsresult rv = nsBoxFrame::SetInitialChildList(aPresContext, aListName,
|
||||||
aChildList);
|
aChildList);
|
||||||
nsIFrame* frame = mFrames.FirstChild();
|
nsIFrame* frame = mFrames.FirstChild();
|
||||||
|
|
||||||
@@ -180,29 +162,6 @@ nsScrollPortFrame::RemoveFrame(nsIPresContext* aPresContext,
|
|||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsScrollPortFrame::DidReflow(nsIPresContext* aPresContext,
|
|
||||||
nsDidReflowStatus aStatus)
|
|
||||||
{
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
|
|
||||||
if (NS_FRAME_REFLOW_FINISHED == aStatus) {
|
|
||||||
// Let the default nsFrame implementation clear the state flags
|
|
||||||
// and size and position our view
|
|
||||||
rv = nsFrame::DidReflow(aPresContext, aStatus);
|
|
||||||
|
|
||||||
// Have the scrolling view layout
|
|
||||||
nsIScrollableView* scrollingView;
|
|
||||||
nsIView* view;
|
|
||||||
GetView(aPresContext, &view);
|
|
||||||
if (NS_SUCCEEDED(view->QueryInterface(kScrollViewIID, (void**)&scrollingView))) {
|
|
||||||
scrollingView->ComputeScrollOffsets(PR_TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsScrollPortFrame::CreateScrollingViewWidget(nsIView* aView, const nsStylePosition* aPosition)
|
nsScrollPortFrame::CreateScrollingViewWidget(nsIView* aView, const nsStylePosition* aPosition)
|
||||||
{
|
{
|
||||||
@@ -314,234 +273,127 @@ nsScrollPortFrame::CreateScrollingView(nsIPresContext* aPresContext)
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
// Calculate the total amount of space needed for the child frame,
|
nsScrollPortFrame::GetMargin(nsMargin& aMargin)
|
||||||
// including its child frames that stick outside its bounds and any
|
|
||||||
// absolutely positioned child frames.
|
|
||||||
// Updates the width/height members of the reflow metrics
|
|
||||||
nsresult
|
|
||||||
nsScrollPortFrame::CalculateChildTotalSize(nsIFrame* aKidFrame,
|
|
||||||
nsHTMLReflowMetrics& aKidReflowMetrics)
|
|
||||||
{
|
{
|
||||||
// If the frame has child frames that stick outside its bounds, then take
|
aMargin.SizeTo(0,0,0,0);
|
||||||
// them into account, too
|
|
||||||
nsFrameState kidState;
|
|
||||||
aKidFrame->GetFrameState(&kidState);
|
|
||||||
if (NS_FRAME_OUTSIDE_CHILDREN & kidState) {
|
|
||||||
aKidReflowMetrics.width = aKidReflowMetrics.mOverflowArea.width;
|
|
||||||
aKidReflowMetrics.height = aKidReflowMetrics.mOverflowArea.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsScrollPortFrame::Reflow(nsIPresContext* aPresContext,
|
nsScrollPortFrame::GetPadding(nsMargin& aMargin)
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
{
|
||||||
NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS,
|
aMargin.SizeTo(0,0,0,0);
|
||||||
("enter nsScrollPortFrame::Reflow: maxSize=%d,%d",
|
|
||||||
aReflowState.availableWidth,
|
|
||||||
aReflowState.availableHeight));
|
|
||||||
|
|
||||||
// if we have any padding then ignore it. It is inherited down to our scrolled frame
|
|
||||||
if (aReflowState.mComputedPadding.left != 0 ||
|
|
||||||
aReflowState.mComputedPadding.right != 0 ||
|
|
||||||
aReflowState.mComputedPadding.top != 0 ||
|
|
||||||
aReflowState.mComputedPadding.bottom != 0)
|
|
||||||
{
|
|
||||||
nsHTMLReflowState newState(aReflowState);
|
|
||||||
|
|
||||||
// get the padding to remove
|
|
||||||
nscoord pwidth = (newState.mComputedPadding.left + newState.mComputedPadding.right);
|
|
||||||
nscoord pheight = (newState.mComputedPadding.top + newState.mComputedPadding.bottom);
|
|
||||||
|
|
||||||
// adjust our computed size to add in the padding we are removing. Make sure
|
|
||||||
// the computed size doesn't go negative or anything.
|
|
||||||
if (newState.mComputedWidth != NS_INTRINSICSIZE)
|
|
||||||
newState.mComputedWidth += pwidth;
|
|
||||||
|
|
||||||
if (newState.mComputedHeight != NS_INTRINSICSIZE)
|
|
||||||
newState.mComputedHeight += pheight;
|
|
||||||
|
|
||||||
// fix up the borderpadding
|
|
||||||
((nsMargin&)newState.mComputedBorderPadding) -= newState.mComputedPadding;
|
|
||||||
|
|
||||||
// remove the padding
|
|
||||||
((nsMargin&)newState.mComputedPadding) = nsMargin(0,0,0,0);
|
|
||||||
|
|
||||||
// reflow us again with the correct values.
|
|
||||||
return Reflow(aPresContext, aDesiredSize, newState, aStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle Incremental Reflow
|
|
||||||
nsIFrame* incrementalChild = nsnull;
|
|
||||||
if ( aReflowState.reason == eReflowReason_Incremental ) {
|
|
||||||
nsIReflowCommand::ReflowType reflowType;
|
|
||||||
aReflowState.reflowCommand->GetType(reflowType);
|
|
||||||
|
|
||||||
// See if it's targeted at us
|
|
||||||
nsIFrame* targetFrame;
|
|
||||||
aReflowState.reflowCommand->GetTarget(targetFrame);
|
|
||||||
|
|
||||||
if (this == targetFrame) {
|
|
||||||
// if we are the target see what the type was
|
|
||||||
// and generate a normal non incremental reflow.
|
|
||||||
switch (reflowType) {
|
|
||||||
|
|
||||||
case nsIReflowCommand::StyleChanged:
|
|
||||||
{
|
|
||||||
nsHTMLReflowState newState(aReflowState);
|
|
||||||
newState.reason = eReflowReason_StyleChange;
|
|
||||||
return Reflow(aPresContext, aDesiredSize, newState, aStatus);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// if its a dirty type then reflow us with a dirty reflow
|
|
||||||
case nsIReflowCommand::ReflowDirty:
|
|
||||||
{
|
|
||||||
nsHTMLReflowState newState(aReflowState);
|
|
||||||
newState.reason = eReflowReason_Dirty;
|
|
||||||
return Reflow(aPresContext, aDesiredSize, newState, aStatus);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
NS_ASSERTION(PR_FALSE, "unexpected reflow command type");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// then get the child we need to flow incrementally
|
|
||||||
aReflowState.reflowCommand->GetNext(incrementalChild);
|
|
||||||
|
|
||||||
}
|
|
||||||
nsIFrame* kidFrame = mFrames.FirstChild();
|
|
||||||
// Reflow the child and get its desired size. Let it be as high as it
|
|
||||||
// wants
|
|
||||||
|
|
||||||
const nsMargin& border = aReflowState.mComputedBorderPadding;
|
|
||||||
|
|
||||||
/*
|
|
||||||
// we only worry about our border. Out scrolled frame worries about the padding.
|
|
||||||
// so lets remove the padding and add it to our computed size.
|
|
||||||
nsMargin padding = aReflowState.mComputedPadding;
|
|
||||||
|
|
||||||
if (aReflowState.mComputedWidth != NS_INTRINSICSIZE)
|
|
||||||
((nscoord&)aReflowState.mComputedWidth) += padding.left + padding.right;
|
|
||||||
|
|
||||||
if (aReflowState.mComputedHeight != NS_INTRINSICSIZE)
|
|
||||||
((nscoord&)aReflowState.mComputedHeight) += padding.top + padding.bottom;
|
|
||||||
|
|
||||||
|
|
||||||
((nsMargin&)aReflowState.mComputedPadding) = nsMargin(0,0,0,0);
|
|
||||||
((nsMargin&)aReflowState.mComputedBorderPadding) -= padding;
|
|
||||||
*/
|
|
||||||
|
|
||||||
nscoord theHeight;
|
|
||||||
nsIBox* box;
|
|
||||||
nsReflowReason reason = aReflowState.reason;
|
|
||||||
nsresult result = kidFrame->QueryInterface(NS_GET_IID(nsIBox), (void**)&box);
|
|
||||||
if (NS_SUCCEEDED(result))
|
|
||||||
theHeight = aReflowState.mComputedHeight;
|
|
||||||
else {
|
|
||||||
theHeight = NS_INTRINSICSIZE;
|
|
||||||
// html can't handle a reflow of dirty. Convert it to
|
|
||||||
// a resize reflow
|
|
||||||
if (reason == eReflowReason_Dirty)
|
|
||||||
reason = eReflowReason_Resize;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsSize kidReflowSize(aReflowState.availableWidth, theHeight);
|
|
||||||
nsHTMLReflowState kidReflowState(aPresContext, aReflowState,
|
|
||||||
kidFrame, kidReflowSize);
|
|
||||||
nsHTMLReflowMetrics kidDesiredSize(aDesiredSize.maxElementSize);
|
|
||||||
|
|
||||||
kidReflowState.mComputedWidth = aReflowState.mComputedWidth;
|
|
||||||
kidReflowState.mComputedHeight = theHeight;
|
|
||||||
kidReflowState.reason = reason;
|
|
||||||
|
|
||||||
nscoord pwidth = (kidReflowState.mComputedBorderPadding.left + kidReflowState.mComputedBorderPadding.right);
|
|
||||||
nscoord pheight = (kidReflowState.mComputedBorderPadding.top + kidReflowState.mComputedBorderPadding.bottom);
|
|
||||||
|
|
||||||
// child's size is our computed size minus its border and padding.
|
|
||||||
if (kidReflowState.mComputedWidth != NS_INTRINSICSIZE && kidReflowState.mComputedWidth >= pwidth)
|
|
||||||
kidReflowState.mComputedWidth -= pwidth;
|
|
||||||
|
|
||||||
if (kidReflowState.mComputedHeight != NS_INTRINSICSIZE && kidReflowState.mComputedHeight >= pheight)
|
|
||||||
kidReflowState.mComputedHeight -= pheight;
|
|
||||||
|
|
||||||
// reflow and place the child.
|
|
||||||
ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
|
|
||||||
border.left, border.top, NS_FRAME_NO_MOVE_VIEW, aStatus);
|
|
||||||
|
|
||||||
NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status");
|
|
||||||
CalculateChildTotalSize(kidFrame, kidDesiredSize);
|
|
||||||
|
|
||||||
// Place and size the child.
|
|
||||||
nscoord x = border.left;
|
|
||||||
nscoord y = border.top;
|
|
||||||
|
|
||||||
// Compute our desired size
|
|
||||||
if (aReflowState.mComputedWidth == NS_INTRINSICSIZE)
|
|
||||||
aDesiredSize.width = kidDesiredSize.width;
|
|
||||||
else
|
|
||||||
aDesiredSize.width = aReflowState.mComputedWidth;
|
|
||||||
|
|
||||||
if (aDesiredSize.width > kidDesiredSize.width)
|
|
||||||
kidDesiredSize.width = aDesiredSize.width;
|
|
||||||
|
|
||||||
aDesiredSize.width += border.left + border.right;
|
|
||||||
|
|
||||||
// Compute our desired size
|
|
||||||
if (aReflowState.mComputedHeight == NS_INTRINSICSIZE)
|
|
||||||
aDesiredSize.height = kidDesiredSize.height;
|
|
||||||
else
|
|
||||||
aDesiredSize.height = aReflowState.mComputedHeight;
|
|
||||||
|
|
||||||
if (aDesiredSize.height > kidDesiredSize.height)
|
|
||||||
kidDesiredSize.height = aDesiredSize.height;
|
|
||||||
|
|
||||||
aDesiredSize.height += border.top + border.bottom;
|
|
||||||
|
|
||||||
FinishReflowChild(kidFrame, aPresContext, kidDesiredSize, x, y, NS_FRAME_NO_MOVE_VIEW);
|
|
||||||
//printf("width=%d, height=%d\n", kidDesiredSize.width, kidDesiredSize.height);
|
|
||||||
|
|
||||||
|
|
||||||
if (nsnull != aDesiredSize.maxElementSize) {
|
|
||||||
// nscoord maxWidth = aDesiredSize.maxElementSize->width;
|
|
||||||
// maxWidth += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right;
|
|
||||||
// nscoord maxHeight = aDesiredSize.maxElementSize->height;
|
|
||||||
// maxHeight += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom;
|
|
||||||
// aDesiredSize.maxElementSize->width = maxWidth;
|
|
||||||
// aDesiredSize.maxElementSize->height = maxHeight;
|
|
||||||
*aDesiredSize.maxElementSize = *kidDesiredSize.maxElementSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
//mIncremental = PR_FALSE;
|
|
||||||
|
|
||||||
aDesiredSize.ascent = aDesiredSize.height;
|
|
||||||
aDesiredSize.descent = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (aReflowState.mComputedWidth != NS_INTRINSICSIZE)
|
|
||||||
((nscoord&)aReflowState.mComputedWidth) -= (padding.left + padding.right);
|
|
||||||
|
|
||||||
if (aReflowState.mComputedHeight != NS_INTRINSICSIZE)
|
|
||||||
((nscoord&)aReflowState.mComputedHeight) -= (padding.top + padding.bottom);
|
|
||||||
|
|
||||||
((nsMargin&)aReflowState.mComputedPadding) = padding;
|
|
||||||
((nsMargin&)aReflowState.mComputedBorderPadding) += padding;
|
|
||||||
*/
|
|
||||||
|
|
||||||
NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS,
|
|
||||||
("exit nsScrollPortFrame::Reflow: status=%d width=%d height=%d",
|
|
||||||
aStatus, aDesiredSize.width, aDesiredSize.height));
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsScrollPortFrame::GetBorder(nsMargin& aMargin)
|
||||||
|
{
|
||||||
|
aMargin.SizeTo(0,0,0,0);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsScrollPortFrame::Layout(nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
nsRect clientRect(0,0,0,0);
|
||||||
|
GetClientRect(clientRect);
|
||||||
|
nsIBox* kid = nsnull;
|
||||||
|
GetChildBox(&kid);
|
||||||
|
nsRect childRect(clientRect);
|
||||||
|
nsMargin margin(0,0,0,0);
|
||||||
|
kid->GetMargin(margin);
|
||||||
|
childRect.Deflate(margin);
|
||||||
|
nsSize min(0,0);
|
||||||
|
kid->GetMinSize(aState, min);
|
||||||
|
|
||||||
|
/*
|
||||||
|
// if our child is not html then get is min size
|
||||||
|
// and make sure we don't squeeze it smaller than that.
|
||||||
|
nsIBoxToBlockAdaptor* adaptor = nsnull;
|
||||||
|
if (NS_FAILED(kid->QueryInterface(NS_GET_IID(nsIBoxToBlockAdaptor), (void**)&adaptor))) {
|
||||||
|
if (min.height > childRect.height)
|
||||||
|
childRect.height = min.height;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (min.height > childRect.height)
|
||||||
|
childRect.height = min.height;
|
||||||
|
|
||||||
|
if (min.width > childRect.width)
|
||||||
|
childRect.width = min.width;
|
||||||
|
|
||||||
|
kid->SetBounds(aState, childRect);
|
||||||
|
kid->Layout(aState);
|
||||||
|
kid->GetBounds(childRect);
|
||||||
|
|
||||||
|
clientRect.Inflate(margin);
|
||||||
|
|
||||||
|
if (childRect.width < clientRect.width || childRect.height < childRect.height)
|
||||||
|
{
|
||||||
|
if (childRect.width < clientRect.width)
|
||||||
|
childRect.width = clientRect.width;
|
||||||
|
|
||||||
|
if (childRect.height < clientRect.height)
|
||||||
|
childRect.height = clientRect.height;
|
||||||
|
|
||||||
|
clientRect.Deflate(margin);
|
||||||
|
|
||||||
|
kid->SetBounds(aState, childRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
SyncLayout(aState);
|
||||||
|
|
||||||
|
nsIPresContext* presContext = aState.GetPresContext();
|
||||||
|
nsIScrollableView* scrollingView;
|
||||||
|
nsIView* view;
|
||||||
|
GetView(presContext, &view);
|
||||||
|
if (NS_SUCCEEDED(view->QueryInterface(kScrollViewIID, (void**)&scrollingView))) {
|
||||||
|
scrollingView->ComputeScrollOffsets(PR_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsScrollPortFrame::GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
GetChildBox(&child);
|
||||||
|
nsresult rv = child->GetPrefSize(aBoxLayoutState, aSize);
|
||||||
|
AddMargin(child, aSize);
|
||||||
|
AddBorderAndPadding(aSize);
|
||||||
|
AddInset(aSize);
|
||||||
|
nsIBox::AddCSSPrefSize(aBoxLayoutState, this, aSize);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsScrollPortFrame::GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
GetChildBox(&child);
|
||||||
|
AddBorderAndPadding(aSize);
|
||||||
|
AddInset(aSize);
|
||||||
|
nsIBox::AddCSSMinSize(aBoxLayoutState, this, aSize);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsScrollPortFrame::GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
GetChildBox(&child);
|
||||||
|
nsresult rv = child->GetMaxSize(aBoxLayoutState, aSize);
|
||||||
|
AddMargin(child, aSize);
|
||||||
|
AddBorderAndPadding(aSize);
|
||||||
|
AddInset(aSize);
|
||||||
|
nsIBox::AddCSSMaxSize(aBoxLayoutState, this, aSize);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsScrollPortFrame::Paint(nsIPresContext* aPresContext,
|
nsScrollPortFrame::Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -565,7 +417,7 @@ nsScrollPortFrame::Paint(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Paint our children
|
// Paint our children
|
||||||
nsresult rv = nsContainerFrame::Paint(aPresContext, aRenderingContext, aDirtyRect,
|
nsresult rv = nsBoxFrame::Paint(aPresContext, aRenderingContext, aDirtyRect,
|
||||||
aWhichLayer);
|
aWhichLayer);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
@@ -577,6 +429,12 @@ nsScrollPortFrame::GetSkipSides() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsScrollPortFrame::GetContentOf(nsIContent** aContent)
|
||||||
|
{
|
||||||
|
return GetContent(aContent);
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsScrollPortFrame::GetFrameType(nsIAtom** aType) const
|
nsScrollPortFrame::GetFrameType(nsIAtom** aType) const
|
||||||
{
|
{
|
||||||
@@ -590,176 +448,26 @@ nsScrollPortFrame::GetFrameType(nsIAtom** aType) const
|
|||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsScrollPortFrame::GetFrameName(nsString& aResult) const
|
nsScrollPortFrame::GetFrameName(nsString& aResult) const
|
||||||
{
|
{
|
||||||
return MakeFrameName("Scroll", aResult);
|
return MakeFrameName("ScrollPort", aResult);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP_(nsrefcnt)
|
||||||
nsScrollPortFrame::InvalidateCache(nsIFrame* aChild)
|
nsScrollPortFrame::AddRef(void)
|
||||||
{
|
{
|
||||||
mNeedsRecalc = PR_TRUE;
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
NS_IMETHODIMP_(nsrefcnt)
|
||||||
* Goes though each child asking for its size to determine our size. Returns our box size minus our border.
|
nsScrollPortFrame::Release(void)
|
||||||
* This method is defined in nsIBox interface.
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsScrollPortFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)
|
|
||||||
{
|
{
|
||||||
nsresult rv;
|
|
||||||
|
|
||||||
aSize.Clear();
|
|
||||||
|
|
||||||
nsIFrame* childFrame = mFrames.FirstChild();
|
|
||||||
|
|
||||||
// if incremental see if the next in chain is our child. Remove it if it is
|
|
||||||
// and make sure we pass it down.
|
|
||||||
if (aReflowState.reason == eReflowReason_Incremental)
|
|
||||||
{
|
|
||||||
nsIFrame* incrementalChild = nsnull;
|
|
||||||
aReflowState.reflowCommand->GetNext(incrementalChild, PR_FALSE);
|
|
||||||
if (incrementalChild == childFrame) {
|
|
||||||
aReflowState.reflowCommand->GetNext(incrementalChild);
|
|
||||||
mNeedsRecalc = PR_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mNeedsRecalc) {
|
|
||||||
// get the size of the child. This is the min, max, preferred, and spring constant
|
|
||||||
// it does not include its border.
|
|
||||||
rv = GetChildBoxInfo(aPresContext, aReflowState, childFrame, mSpring);
|
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to child box info");
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
// add in the child's margin and border/padding if there is one.
|
|
||||||
const nsStyleSpacing* spacing;
|
|
||||||
rv = childFrame->GetStyleData(eStyleStruct_Spacing,
|
|
||||||
(const nsStyleStruct*&) spacing);
|
|
||||||
|
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get spacing info");
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
nsMargin margin(0,0,0,0);
|
|
||||||
spacing->GetMargin(margin);
|
|
||||||
nsSize m(margin.left+margin.right,margin.top+margin.bottom);
|
|
||||||
mSpring.minSize += m;
|
|
||||||
mSpring.prefSize += m;
|
|
||||||
if (mSpring.maxSize.width != NS_INTRINSICSIZE)
|
|
||||||
mSpring.maxSize.width += m.width;
|
|
||||||
|
|
||||||
if (mSpring.maxSize.height != NS_INTRINSICSIZE)
|
|
||||||
mSpring.maxSize.height += m.height;
|
|
||||||
|
|
||||||
spacing->GetBorderPadding(margin);
|
|
||||||
nsSize b(margin.left+margin.right,margin.top+margin.bottom);
|
|
||||||
mSpring.minSize += b;
|
|
||||||
mSpring.prefSize += b;
|
|
||||||
if (mSpring.maxSize.width != NS_INTRINSICSIZE)
|
|
||||||
mSpring.maxSize.width += b.width;
|
|
||||||
|
|
||||||
if (mSpring.maxSize.height != NS_INTRINSICSIZE)
|
|
||||||
mSpring.maxSize.height += b.height;
|
|
||||||
|
|
||||||
|
|
||||||
// ok we don't need to calc this guy again
|
|
||||||
mNeedsRecalc = PR_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
aSize = mSpring;
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsScrollPortFrame::GetChildBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsIFrame* aFrame, nsBoxInfo& aSize)
|
|
||||||
{
|
|
||||||
|
|
||||||
aSize.Clear();
|
|
||||||
|
|
||||||
// see if the frame has IBox interface
|
|
||||||
|
|
||||||
// if it does ask it for its BoxSize and we are done
|
|
||||||
nsIBox* ibox;
|
|
||||||
if (NS_SUCCEEDED(aFrame->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox) {
|
|
||||||
ibox->GetBoxInfo(aPresContext, aReflowState, aSize);
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// start the preferred size as intrinsic
|
|
||||||
aSize.prefSize.width = NS_INTRINSICSIZE;
|
|
||||||
aSize.prefSize.height = NS_INTRINSICSIZE;
|
|
||||||
|
|
||||||
nsSize kidReflowSize(NS_INTRINSICSIZE, NS_INTRINSICSIZE);
|
|
||||||
nsHTMLReflowState kidReflowState(aPresContext, aReflowState,
|
|
||||||
aFrame, kidReflowSize);
|
|
||||||
nsHTMLReflowMetrics kidDesiredSize(nsnull);
|
|
||||||
|
|
||||||
kidReflowState.reason = eReflowReason_Resize;
|
|
||||||
|
|
||||||
kidReflowState.mComputedWidth = NS_INTRINSICSIZE;
|
|
||||||
kidReflowState.mComputedHeight = NS_INTRINSICSIZE;
|
|
||||||
|
|
||||||
nsReflowStatus status = NS_FRAME_COMPLETE;
|
|
||||||
|
|
||||||
ReflowChild(aFrame, aPresContext, kidDesiredSize, kidReflowState,
|
|
||||||
0, 0, NS_FRAME_NO_MOVE_FRAME, status);
|
|
||||||
aFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
|
|
||||||
|
|
||||||
NS_ASSERTION(NS_FRAME_IS_COMPLETE(status), "bad status");
|
|
||||||
|
|
||||||
const nsStyleSpacing* spacing;
|
|
||||||
nsresult rv = aFrame->GetStyleData(eStyleStruct_Spacing,
|
|
||||||
(const nsStyleStruct*&) spacing);
|
|
||||||
|
|
||||||
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get spacing");
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
nsMargin border(0,0,0,0);;
|
|
||||||
spacing->GetBorderPadding(border);
|
|
||||||
|
|
||||||
|
|
||||||
// remove border
|
|
||||||
kidDesiredSize.width -= (border.left + border.right);
|
|
||||||
kidDesiredSize.height -= (border.top + border.bottom);
|
|
||||||
|
|
||||||
// get the size returned and the it as the preferredsize.
|
|
||||||
aSize.prefSize.width = kidDesiredSize.width;
|
|
||||||
aSize.prefSize.height = kidDesiredSize.height;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsScrollPortFrame::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|
||||||
{
|
|
||||||
if (NULL == aInstancePtr) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
|
|
||||||
*aInstancePtr = NULL;
|
|
||||||
|
|
||||||
if (aIID.Equals(NS_GET_IID(nsIBox))) {
|
|
||||||
*aInstancePtr = (void*)(nsIBox*) this;
|
|
||||||
NS_ADDREF_THIS();
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nsHTMLContainerFrame::QueryInterface(aIID, aInstancePtr);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsScrollPortFrame::ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild)
|
|
||||||
{
|
|
||||||
if (! (mState & NS_FRAME_IS_DIRTY)) {
|
|
||||||
mState |= NS_FRAME_IS_DIRTY;
|
|
||||||
return mParent->ReflowDirtyChild(aPresShell, aChild);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_INTERFACE_MAP_BEGIN(nsScrollPortFrame)
|
||||||
|
NS_INTERFACE_MAP_ENTRY(nsIBox)
|
||||||
|
#ifdef NS_DEBUG
|
||||||
|
NS_INTERFACE_MAP_ENTRY(nsIFrameDebug)
|
||||||
|
#endif
|
||||||
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIBox)
|
||||||
|
NS_INTERFACE_MAP_END_INHERITING(nsBoxFrame)
|
||||||
|
|||||||
@@ -22,8 +22,7 @@
|
|||||||
#ifndef nsScrollPortFrame_h___
|
#ifndef nsScrollPortFrame_h___
|
||||||
#define nsScrollPortFrame_h___
|
#define nsScrollPortFrame_h___
|
||||||
|
|
||||||
#include "nsHTMLContainerFrame.h"
|
#include "nsBoxFrame.h"
|
||||||
#include "nsIBox.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The scroll frame creates and manages the scrolling view
|
* The scroll frame creates and manages the scrolling view
|
||||||
@@ -34,7 +33,7 @@
|
|||||||
* Scroll frames don't support incremental changes, i.e. you can't replace
|
* Scroll frames don't support incremental changes, i.e. you can't replace
|
||||||
* or remove the scrolled frame
|
* or remove the scrolled frame
|
||||||
*/
|
*/
|
||||||
class nsScrollPortFrame : public nsHTMLContainerFrame, public nsIBox {
|
class nsScrollPortFrame : nsBoxFrame {
|
||||||
public:
|
public:
|
||||||
friend nsresult NS_NewScrollPortFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
friend nsresult NS_NewScrollPortFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
@@ -44,8 +43,6 @@ public:
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow);
|
nsIFrame* aPrevInFlow);
|
||||||
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug);
|
|
||||||
|
|
||||||
// Called to set the one and only child frame. Returns NS_ERROR_INVALID_ARG
|
// Called to set the one and only child frame. Returns NS_ERROR_INVALID_ARG
|
||||||
// if the child frame is NULL, and NS_ERROR_UNEXPECTED if the child list
|
// if the child frame is NULL, and NS_ERROR_UNEXPECTED if the child list
|
||||||
// contains more than one frame
|
// contains more than one frame
|
||||||
@@ -71,21 +68,12 @@ public:
|
|||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
nsIFrame* aOldFrame);
|
nsIFrame* aOldFrame);
|
||||||
|
|
||||||
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
|
||||||
nsDidReflowStatus aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsFramePaintLayer aWhichLayer);
|
nsFramePaintLayer aWhichLayer);
|
||||||
|
|
||||||
NS_IMETHOD ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the "type" of the frame
|
* Get the "type" of the frame
|
||||||
*
|
*
|
||||||
@@ -98,14 +86,20 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// nsIBox methods
|
// nsIBox methods
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
NS_DECL_ISUPPORTS
|
||||||
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef(void) { return NS_OK; }
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
NS_IMETHOD_(nsrefcnt) Release(void) { return NS_OK; }
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
NS_IMETHOD InvalidateCache(nsIFrame* aChild);
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD GetPadding(nsMargin& aMargin);
|
||||||
|
NS_IMETHOD GetBorder(nsMargin& aMargin);
|
||||||
|
NS_IMETHOD GetMargin(nsMargin& aMargin);
|
||||||
|
|
||||||
|
virtual nsresult GetContentOf(nsIContent** aContent);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsScrollPortFrame();
|
nsScrollPortFrame(nsIPresShell* aShell);
|
||||||
virtual PRIntn GetSkipSides() const;
|
virtual PRIntn GetSkipSides() const;
|
||||||
|
|
||||||
// Creation of the widget for the scrolling view is factored into a virtual method so
|
// Creation of the widget for the scrolling view is factored into a virtual method so
|
||||||
@@ -119,14 +113,6 @@ protected:
|
|||||||
private:
|
private:
|
||||||
nsresult CreateScrollingView(nsIPresContext* aPresContext);
|
nsresult CreateScrollingView(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
nsresult CalculateChildTotalSize(nsIFrame* aKidFrame,
|
|
||||||
nsHTMLReflowMetrics& aKidReflowMetrics);
|
|
||||||
|
|
||||||
nsresult GetChildBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsIFrame* aFrame, nsBoxInfo& aSize);
|
|
||||||
|
|
||||||
PRBool mNeedsRecalc;
|
|
||||||
nsBoxInfo mSpring;
|
|
||||||
PRBool mIncremental;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* nsScrollPortFrame_h___ */
|
#endif /* nsScrollPortFrame_h___ */
|
||||||
|
|||||||
@@ -120,7 +120,7 @@
|
|||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
#include "nsDocument.h"
|
#include "nsDocument.h"
|
||||||
#include "nsToolbarItemFrame.h"
|
#include "nsToolbarItemFrame.h"
|
||||||
#include "nsXULCheckboxFrame.h"
|
#include "nsCheckBoxFrame.h"
|
||||||
#include "nsIScrollable.h"
|
#include "nsIScrollable.h"
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@@ -132,8 +132,28 @@ static PRBool gNoisyInlineConstruction = PR_FALSE;
|
|||||||
#define NEWGFX_LIST_SCROLLFRAME
|
#define NEWGFX_LIST_SCROLLFRAME
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef NEWGFX_LIST_SCROLLFRAME
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewGfxListControlFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewGfxListControlFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// grid
|
||||||
|
|
||||||
|
/*
|
||||||
|
nsresult
|
||||||
|
NS_NewGridFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewTempleFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsHorizontal);
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewObeliskFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsHorizontal);
|
||||||
|
|
||||||
|
// end grid
|
||||||
|
*/
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewRootBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewThumbFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewThumbFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
@@ -142,7 +162,7 @@ nsresult
|
|||||||
NS_NewScrollPortFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewScrollPortFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewGfxScrollFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, nsIDocument* aDocument );
|
NS_NewGfxScrollFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, nsIDocument* aDocument, PRBool aIsRoot);
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewTabFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewTabFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
@@ -163,7 +183,10 @@ nsresult
|
|||||||
NS_NewTitledButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewTitledButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewXULTextFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewImageBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewTextBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewTitledBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewTitledBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
@@ -178,7 +201,7 @@ nsresult
|
|||||||
NS_NewBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsRoot);
|
NS_NewBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsRoot);
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewXULButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
NS_NewButtonBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewSliderFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
NS_NewSliderFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame );
|
||||||
@@ -2359,6 +2382,7 @@ nsCSSFrameConstructor::TableIsValidCellContent(nsIPresContext* aPresContext,
|
|||||||
#ifdef INCLUDE_XUL
|
#ifdef INCLUDE_XUL
|
||||||
if ( (nsXULAtoms::button == tag.get()) ||
|
if ( (nsXULAtoms::button == tag.get()) ||
|
||||||
(nsXULAtoms::titledbutton == tag.get()) ||
|
(nsXULAtoms::titledbutton == tag.get()) ||
|
||||||
|
(nsXULAtoms::box == tag.get()) ||
|
||||||
(nsXULAtoms::image == tag.get()) ||
|
(nsXULAtoms::image == tag.get()) ||
|
||||||
(nsXULAtoms::grippy == tag.get()) ||
|
(nsXULAtoms::grippy == tag.get()) ||
|
||||||
(nsXULAtoms::splitter == tag.get()) ||
|
(nsXULAtoms::splitter == tag.get()) ||
|
||||||
@@ -2603,6 +2627,7 @@ nsCSSFrameConstructor::ConstructDocElementFrame(nsIPresShell* aPresShell,
|
|||||||
aParentFrame,
|
aParentFrame,
|
||||||
nsLayoutAtoms::scrolledContentPseudo,
|
nsLayoutAtoms::scrolledContentPseudo,
|
||||||
document,
|
document,
|
||||||
|
PR_FALSE,
|
||||||
scrollFrame,
|
scrollFrame,
|
||||||
newContext,
|
newContext,
|
||||||
newScrollFrame);
|
newScrollFrame);
|
||||||
@@ -2837,7 +2862,15 @@ nsCSSFrameConstructor::ConstructRootFrame(nsIPresShell* aPresShell,
|
|||||||
nsIAtom* rootPseudo;
|
nsIAtom* rootPseudo;
|
||||||
|
|
||||||
if (!isPaginated) {
|
if (!isPaginated) {
|
||||||
|
PRInt32 nameSpaceID;
|
||||||
|
if (NS_SUCCEEDED(aDocElement->GetNameSpaceID(nameSpaceID)) &&
|
||||||
|
nameSpaceID == nsXULAtoms::nameSpaceID)
|
||||||
|
{
|
||||||
|
NS_NewRootBoxFrame(aPresShell, &rootFrame);
|
||||||
|
} else {
|
||||||
NS_NewRootFrame(aPresShell, &rootFrame);
|
NS_NewRootFrame(aPresShell, &rootFrame);
|
||||||
|
}
|
||||||
|
|
||||||
rootPseudo = nsLayoutAtoms::canvasPseudo;
|
rootPseudo = nsLayoutAtoms::canvasPseudo;
|
||||||
mDocElementContainingBlock = rootFrame;
|
mDocElementContainingBlock = rootFrame;
|
||||||
} else {
|
} else {
|
||||||
@@ -2868,6 +2901,8 @@ nsCSSFrameConstructor::ConstructRootFrame(nsIPresShell* aPresShell,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//isScrollable = PR_FALSE;
|
||||||
|
|
||||||
// As long as the webshell doesn't prohibit it, and the device supports
|
// As long as the webshell doesn't prohibit it, and the device supports
|
||||||
// it, create a scroll frame that will act as the scolling mechanism for
|
// it, create a scroll frame that will act as the scolling mechanism for
|
||||||
// the viewport.
|
// the viewport.
|
||||||
@@ -2941,6 +2976,7 @@ nsCSSFrameConstructor::ConstructRootFrame(nsIPresShell* aPresShell,
|
|||||||
viewportFrame,
|
viewportFrame,
|
||||||
rootPseudo,
|
rootPseudo,
|
||||||
document,
|
document,
|
||||||
|
PR_TRUE,
|
||||||
newFrame,
|
newFrame,
|
||||||
rootPseudoStyle,
|
rootPseudoStyle,
|
||||||
newScrollableFrame);
|
newScrollableFrame);
|
||||||
@@ -4656,7 +4692,7 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
else if (aTag == nsXULAtoms::button) {
|
else if (aTag == nsXULAtoms::button) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewXULButtonFrame(aPresShell, &newFrame);
|
rv = NS_NewButtonBoxFrame(aPresShell, &newFrame);
|
||||||
|
|
||||||
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
||||||
aStyleContext->GetStyleData(eStyleStruct_Display);
|
aStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
@@ -4679,15 +4715,18 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
} // End of BUTTON CONSTRUCTION logic
|
} // End of BUTTON CONSTRUCTION logic
|
||||||
|
|
||||||
// TITLED BUTTON CONSTRUCTION
|
// TITLED BUTTON CONSTRUCTION
|
||||||
else if (aTag == nsXULAtoms::titledbutton ||
|
else if (aTag == nsXULAtoms::titledbutton) {
|
||||||
aTag == nsXULAtoms::image) {
|
|
||||||
|
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewTitledButtonFrame(aPresShell, &newFrame);
|
rv = NS_NewTitledButtonFrame(aPresShell, &newFrame);
|
||||||
}
|
}
|
||||||
// End of TITLED BUTTON CONSTRUCTION logic
|
// End of TITLED BUTTON CONSTRUCTION logic
|
||||||
|
else if (aTag == nsXULAtoms::image) {
|
||||||
|
processChildren = PR_TRUE;
|
||||||
|
isReplaced = PR_TRUE;
|
||||||
|
rv = NS_NewImageBoxFrame(aPresShell, &newFrame);
|
||||||
|
}
|
||||||
else if (aTag == nsXULAtoms::spring) {
|
else if (aTag == nsXULAtoms::spring) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
@@ -4699,7 +4738,7 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
else if (aTag == nsXULAtoms::text) {
|
else if (aTag == nsXULAtoms::text) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewXULTextFrame(aPresShell, &newFrame);
|
rv = NS_NewTextBoxFrame(aPresShell, &newFrame);
|
||||||
}
|
}
|
||||||
// End of TEXT CONSTRUCTION logic
|
// End of TEXT CONSTRUCTION logic
|
||||||
|
|
||||||
@@ -4737,6 +4776,89 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewMenuPopupFrame(aPresShell, &newFrame);
|
rv = NS_NewMenuPopupFrame(aPresShell, &newFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
// ------- Begin Grid ---------
|
||||||
|
else if (aTag == nsXULAtoms::grid) {
|
||||||
|
processChildren = PR_TRUE;
|
||||||
|
isReplaced = PR_TRUE;
|
||||||
|
rv = NS_NewGridFrame(aPresShell, &newFrame);
|
||||||
|
|
||||||
|
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
||||||
|
aStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
|
|
||||||
|
// Boxes can scroll.
|
||||||
|
if (IsScrollable(aPresContext, display)) {
|
||||||
|
|
||||||
|
// set the top to be the newly created scrollframe
|
||||||
|
BuildScrollFrame(aPresShell, aPresContext, aState, aContent, aStyleContext, newFrame, aParentFrame,
|
||||||
|
topFrame, aStyleContext);
|
||||||
|
|
||||||
|
// we have a scrollframe so the parent becomes the scroll frame.
|
||||||
|
newFrame->GetParent(&aParentFrame);
|
||||||
|
|
||||||
|
primaryFrameSet = PR_TRUE;
|
||||||
|
|
||||||
|
frameHasBeenInitialized = PR_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
} //------- End Grid ------
|
||||||
|
|
||||||
|
// ------- Begin Rows/Columns ---------
|
||||||
|
else if (aTag == nsXULAtoms::rows || aTag == nsXULAtoms::columns) {
|
||||||
|
processChildren = PR_TRUE;
|
||||||
|
isReplaced = PR_TRUE;
|
||||||
|
PRBool isHorizontal = (aTag == nsXULAtoms::columns);
|
||||||
|
rv = NS_NewTempleFrame(aPresShell, &newFrame, isHorizontal);
|
||||||
|
|
||||||
|
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
||||||
|
aStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
|
|
||||||
|
// Boxes can scroll.
|
||||||
|
if (IsScrollable(aPresContext, display)) {
|
||||||
|
|
||||||
|
// set the top to be the newly created scrollframe
|
||||||
|
BuildScrollFrame(aPresShell, aPresContext, aState, aContent, aStyleContext, newFrame, aParentFrame,
|
||||||
|
topFrame, aStyleContext);
|
||||||
|
|
||||||
|
// we have a scrollframe so the parent becomes the scroll frame.
|
||||||
|
newFrame->GetParent(&aParentFrame);
|
||||||
|
|
||||||
|
primaryFrameSet = PR_TRUE;
|
||||||
|
|
||||||
|
frameHasBeenInitialized = PR_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
} //------- End Grid ------
|
||||||
|
|
||||||
|
// ------- Begin Row/Column ---------
|
||||||
|
else if (aTag == nsXULAtoms::row || aTag == nsXULAtoms::column) {
|
||||||
|
processChildren = PR_TRUE;
|
||||||
|
isReplaced = PR_TRUE;
|
||||||
|
PRBool isHorizontal = (aTag == nsXULAtoms::row);
|
||||||
|
rv = NS_NewObeliskFrame(aPresShell, &newFrame, isHorizontal);
|
||||||
|
|
||||||
|
const nsStyleDisplay* display = (const nsStyleDisplay*)
|
||||||
|
aStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
|
|
||||||
|
// Boxes can scroll.
|
||||||
|
if (IsScrollable(aPresContext, display)) {
|
||||||
|
|
||||||
|
// set the top to be the newly created scrollframe
|
||||||
|
BuildScrollFrame(aPresShell, aPresContext, aState, aContent, aStyleContext, newFrame, aParentFrame,
|
||||||
|
topFrame, aStyleContext);
|
||||||
|
|
||||||
|
// we have a scrollframe so the parent becomes the scroll frame.
|
||||||
|
newFrame->GetParent(&aParentFrame);
|
||||||
|
|
||||||
|
primaryFrameSet = PR_TRUE;
|
||||||
|
|
||||||
|
frameHasBeenInitialized = PR_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
} //------- End Grid ------
|
||||||
|
*/
|
||||||
else if (aTag == nsXULAtoms::title) {
|
else if (aTag == nsXULAtoms::title) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
@@ -4949,7 +5071,7 @@ nsCSSFrameConstructor::ConstructXULFrame(nsIPresShell* aPresShell,
|
|||||||
aTag == nsXULAtoms::radio) {
|
aTag == nsXULAtoms::radio) {
|
||||||
processChildren = PR_TRUE;
|
processChildren = PR_TRUE;
|
||||||
isReplaced = PR_TRUE;
|
isReplaced = PR_TRUE;
|
||||||
rv = NS_NewXULCheckboxFrame(aPresShell, &newFrame);
|
rv = NS_NewCheckBoxFrame(aPresShell, &newFrame);
|
||||||
}
|
}
|
||||||
// End of XULCHECKBOX CONSTRUCTION logic
|
// End of XULCHECKBOX CONSTRUCTION logic
|
||||||
|
|
||||||
@@ -5123,6 +5245,7 @@ nsCSSFrameConstructor::BeginBuildingScrollFrame(nsIPresShell* aPresShell,
|
|||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsIAtom* aScrolledPseudo,
|
nsIAtom* aScrolledPseudo,
|
||||||
nsIDocument* aDocument,
|
nsIDocument* aDocument,
|
||||||
|
PRBool aIsRoot,
|
||||||
nsIFrame*& aNewFrame,
|
nsIFrame*& aNewFrame,
|
||||||
nsCOMPtr<nsIStyleContext>& aScrolledChildStyle,
|
nsCOMPtr<nsIStyleContext>& aScrolledChildStyle,
|
||||||
nsIFrame*& aScrollableFrame)
|
nsIFrame*& aScrollableFrame)
|
||||||
@@ -5140,7 +5263,7 @@ nsCSSFrameConstructor::BeginBuildingScrollFrame(nsIPresShell* aPresShell,
|
|||||||
if (isGfx) {
|
if (isGfx) {
|
||||||
|
|
||||||
BuildGfxScrollFrame(aPresShell, aPresContext, aState, aContent, aDocument, aParentFrame,
|
BuildGfxScrollFrame(aPresShell, aPresContext, aState, aContent, aDocument, aParentFrame,
|
||||||
contentStyle, gfxScrollFrame, anonymousItems);
|
contentStyle, aIsRoot, gfxScrollFrame, anonymousItems);
|
||||||
|
|
||||||
scrollFrame = anonymousItems.childList;
|
scrollFrame = anonymousItems.childList;
|
||||||
parentFrame = gfxScrollFrame;
|
parentFrame = gfxScrollFrame;
|
||||||
@@ -5283,6 +5406,7 @@ nsCSSFrameConstructor::BuildScrollFrame (nsIPresShell* aPresShell,
|
|||||||
aParentFrame,
|
aParentFrame,
|
||||||
nsLayoutAtoms::scrolledContentPseudo,
|
nsLayoutAtoms::scrolledContentPseudo,
|
||||||
document,
|
document,
|
||||||
|
PR_FALSE,
|
||||||
aNewFrame,
|
aNewFrame,
|
||||||
scrolledContentStyle,
|
scrolledContentStyle,
|
||||||
scrollFrame);
|
scrollFrame);
|
||||||
@@ -5317,10 +5441,11 @@ nsCSSFrameConstructor::BuildGfxScrollFrame (nsIPresShell* aPresShell,
|
|||||||
nsIDocument* aDocument,
|
nsIDocument* aDocument,
|
||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsIStyleContext* aStyleContext,
|
nsIStyleContext* aStyleContext,
|
||||||
|
PRBool aIsRoot,
|
||||||
nsIFrame*& aNewFrame,
|
nsIFrame*& aNewFrame,
|
||||||
nsFrameItems& aAnonymousFrames)
|
nsFrameItems& aAnonymousFrames)
|
||||||
{
|
{
|
||||||
NS_NewGfxScrollFrame(aPresShell, &aNewFrame,aDocument);
|
NS_NewGfxScrollFrame(aPresShell, &aNewFrame, aDocument, aIsRoot);
|
||||||
|
|
||||||
InitAndRestoreFrame(aPresContext, aState, aContent,
|
InitAndRestoreFrame(aPresContext, aState, aContent,
|
||||||
aParentFrame, aStyleContext, nsnull, aNewFrame);
|
aParentFrame, aStyleContext, nsnull, aNewFrame);
|
||||||
@@ -7074,6 +7199,28 @@ nsCSSFrameConstructor::ContentInserted(nsIPresContext* aPresContext,
|
|||||||
} else {
|
} else {
|
||||||
// Find the frame that precedes the insertion point.
|
// Find the frame that precedes the insertion point.
|
||||||
nsIFrame* prevSibling = FindPreviousSibling(shell, aContainer, aIndexInContainer);
|
nsIFrame* prevSibling = FindPreviousSibling(shell, aContainer, aIndexInContainer);
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (prevSibling) {
|
||||||
|
nsIFrame* parent;
|
||||||
|
prevSibling->GetParent(&parent);
|
||||||
|
nsIFrame* first;
|
||||||
|
parent->FirstChild(aPresContext, nsnull, &first);
|
||||||
|
PRBool found = PR_FALSE;
|
||||||
|
while(first)
|
||||||
|
{
|
||||||
|
if (first == prevSibling) {
|
||||||
|
found = PR_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
first->GetNextSibling(&first);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_ASSERTION(found,"Error sibling not in parent!!!!!");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
nsIFrame* nextSibling = nsnull;
|
nsIFrame* nextSibling = nsnull;
|
||||||
PRBool isAppend = PR_FALSE;
|
PRBool isAppend = PR_FALSE;
|
||||||
|
|
||||||
|
|||||||
@@ -646,6 +646,7 @@ protected:
|
|||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsIAtom* aScrolledPseudo,
|
nsIAtom* aScrolledPseudo,
|
||||||
nsIDocument* aDocument,
|
nsIDocument* aDocument,
|
||||||
|
PRBool aIsRoot,
|
||||||
nsIFrame*& aNewFrame,
|
nsIFrame*& aNewFrame,
|
||||||
nsCOMPtr<nsIStyleContext>& aScrolledChildStyle,
|
nsCOMPtr<nsIStyleContext>& aScrolledChildStyle,
|
||||||
nsIFrame*& aScrollableFrame);
|
nsIFrame*& aScrollableFrame);
|
||||||
@@ -671,6 +672,7 @@ protected:
|
|||||||
nsIDocument* aDocument,
|
nsIDocument* aDocument,
|
||||||
nsIFrame* aParentFrame,
|
nsIFrame* aParentFrame,
|
||||||
nsIStyleContext* aStyleContext,
|
nsIStyleContext* aStyleContext,
|
||||||
|
PRBool aIsRoot,
|
||||||
nsIFrame*& aNewFrame,
|
nsIFrame*& aNewFrame,
|
||||||
nsFrameItems& aAnonymousFrames);
|
nsFrameItems& aAnonymousFrames);
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -30,11 +30,21 @@ MODULE = layout
|
|||||||
LIBRARY_NAME = raptorxulbase_s
|
LIBRARY_NAME = raptorxulbase_s
|
||||||
|
|
||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
nsXULButtonFrame.cpp \
|
nsImageBoxFrame.cpp \
|
||||||
|
nsRootBoxFrame.cpp \
|
||||||
|
nsBox.cpp \
|
||||||
|
nsBoxLayoutState.cpp \
|
||||||
|
nsBoxToBlockAdaptor.cpp \
|
||||||
|
nsButtonBoxFrame.cpp \
|
||||||
|
nsCheckBoxFrame.cpp \
|
||||||
|
nsContainerBox.cpp \
|
||||||
|
nsLeafBoxFrame.cpp \
|
||||||
|
nsSprocketLayout.cpp \
|
||||||
|
nsBoxLayout.cpp \
|
||||||
|
nsStackLayout.cpp \
|
||||||
|
nsTextBoxFrame.cpp \
|
||||||
nsStackFrame.cpp \
|
nsStackFrame.cpp \
|
||||||
nsSpringFrame.cpp \
|
nsSpringFrame.cpp \
|
||||||
nsXULLeafFrame.cpp \
|
|
||||||
nsXULTextFrame.cpp \
|
|
||||||
nsTitledBoxFrame.cpp \
|
nsTitledBoxFrame.cpp \
|
||||||
nsTitleFrame.cpp \
|
nsTitleFrame.cpp \
|
||||||
nsFrameNavigator.cpp \
|
nsFrameNavigator.cpp \
|
||||||
@@ -72,7 +82,6 @@ CPPSRCS = \
|
|||||||
nsMenuDismissalListener.cpp \
|
nsMenuDismissalListener.cpp \
|
||||||
nsPopupSetFrame.cpp \
|
nsPopupSetFrame.cpp \
|
||||||
nsRepeatService.cpp \
|
nsRepeatService.cpp \
|
||||||
nsXULCheckboxFrame.cpp \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
include $(topsrcdir)/config/config.mk
|
include $(topsrcdir)/config/config.mk
|
||||||
|
|||||||
@@ -28,24 +28,35 @@ REQUIRES=xpcom raptor pref
|
|||||||
DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN
|
DEFINES=-D_IMPL_NS_HTML -DWIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
CPPSRCS= \
|
CPPSRCS= \
|
||||||
nsXULButtonFrame.cpp \
|
nsImageBoxFrame.cpp \
|
||||||
nsSpringFrame.cpp \
|
nsRootBoxFrame.cpp \
|
||||||
nsXULLeafFrame.cpp \
|
nsStackLayout.cpp \
|
||||||
nsXULTextFrame.cpp \
|
nsSplitterFrame.cpp \
|
||||||
nsTitleFrame.cpp \
|
nsTitleFrame.cpp \
|
||||||
|
nsButtonBoxFrame.cpp \
|
||||||
|
nsSpringFrame.cpp \
|
||||||
|
nsSliderFrame.cpp \
|
||||||
|
nsProgressMeterFrame.cpp \
|
||||||
|
nsTitledButtonFrame.cpp \
|
||||||
|
nsCheckBoxFrame.cpp \
|
||||||
nsTitledBoxFrame.cpp \
|
nsTitledBoxFrame.cpp \
|
||||||
|
nsBox.cpp \
|
||||||
|
nsContainerBox.cpp \
|
||||||
|
nsBoxFrame.cpp \
|
||||||
|
nsBoxLayoutState.cpp \
|
||||||
|
nsBoxToBlockAdaptor.cpp \
|
||||||
|
nsSprocketLayout.cpp \
|
||||||
|
nsBoxLayout.cpp \
|
||||||
|
nsLeafBoxFrame.cpp \
|
||||||
|
nsTextBoxFrame.cpp \
|
||||||
nsFrameNavigator.cpp \
|
nsFrameNavigator.cpp \
|
||||||
nsRepeatService.cpp \
|
nsRepeatService.cpp \
|
||||||
nsToolbarDragListener.cpp \
|
nsToolbarDragListener.cpp \
|
||||||
nsToolbarItemFrame.cpp \
|
nsToolbarItemFrame.cpp \
|
||||||
nsSplitterFrame.cpp \
|
|
||||||
nsGrippyFrame.cpp \
|
nsGrippyFrame.cpp \
|
||||||
nsTabFrame.cpp \
|
nsTabFrame.cpp \
|
||||||
nsStackFrame.cpp \
|
nsStackFrame.cpp \
|
||||||
nsDeckFrame.cpp \
|
nsDeckFrame.cpp \
|
||||||
nsBoxFrame.cpp \
|
|
||||||
nsProgressMeterFrame.cpp \
|
|
||||||
nsTitledButtonFrame.cpp \
|
|
||||||
nsToolboxFrame.cpp \
|
nsToolboxFrame.cpp \
|
||||||
nsToolbarFrame.cpp \
|
nsToolbarFrame.cpp \
|
||||||
nsTreeOuterFrame.cpp \
|
nsTreeOuterFrame.cpp \
|
||||||
@@ -59,7 +70,6 @@ CPPSRCS= \
|
|||||||
nsSpinnerFrame.cpp \
|
nsSpinnerFrame.cpp \
|
||||||
nsScrollbarFrame.cpp \
|
nsScrollbarFrame.cpp \
|
||||||
nsScrollbarButtonFrame.cpp \
|
nsScrollbarButtonFrame.cpp \
|
||||||
nsSliderFrame.cpp \
|
|
||||||
nsColorPickerFrame.cpp \
|
nsColorPickerFrame.cpp \
|
||||||
nsStdColorPicker.cpp \
|
nsStdColorPicker.cpp \
|
||||||
nsFontPickerFrame.cpp \
|
nsFontPickerFrame.cpp \
|
||||||
@@ -70,30 +80,43 @@ CPPSRCS= \
|
|||||||
nsMenuListener.cpp \
|
nsMenuListener.cpp \
|
||||||
nsMenuDismissalListener.cpp \
|
nsMenuDismissalListener.cpp \
|
||||||
nsPopupSetFrame.cpp \
|
nsPopupSetFrame.cpp \
|
||||||
nsXULCheckboxFrame.cpp \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
CPP_OBJS= \
|
CPP_OBJS= \
|
||||||
.\$(OBJDIR)\nsXULButtonFrame.obj \
|
.\$(OBJDIR)\nsImageBoxFrame.obj \
|
||||||
.\$(OBJDIR)\nsSpringFrame.obj \
|
.\$(OBJDIR)\nsRootBoxFrame.obj \
|
||||||
.\$(OBJDIR)\nsXULLeafFrame.obj \
|
.\$(OBJDIR)\nsStackLayout.obj \
|
||||||
.\$(OBJDIR)\nsXULTextFrame.obj \
|
.\$(OBJDIR)\nsToolboxFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsToolbarFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsPopupSetFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsMenuBarFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsMenuFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsSplitterFrame.obj \
|
||||||
.\$(OBJDIR)\nsTitleFrame.obj \
|
.\$(OBJDIR)\nsTitleFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsButtonBoxFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsSpringFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsSliderFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsProgressMeterFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsCheckBoxFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsTitledButtonFrame.obj \
|
||||||
.\$(OBJDIR)\nsTitledBoxFrame.obj \
|
.\$(OBJDIR)\nsTitledBoxFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsBox.obj \
|
||||||
|
.\$(OBJDIR)\nsContainerBox.obj \
|
||||||
|
.\$(OBJDIR)\nsBoxFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsBoxLayoutState.obj \
|
||||||
|
.\$(OBJDIR)\nsBoxToBlockAdaptor.obj \
|
||||||
|
.\$(OBJDIR)\nsSprocketLayout.obj \
|
||||||
|
.\$(OBJDIR)\nsBoxLayout.obj \
|
||||||
|
.\$(OBJDIR)\nsLeafBoxFrame.obj \
|
||||||
|
.\$(OBJDIR)\nsTextBoxFrame.obj \
|
||||||
.\$(OBJDIR)\nsFrameNavigator.obj \
|
.\$(OBJDIR)\nsFrameNavigator.obj \
|
||||||
.\$(OBJDIR)\nsRepeatService.obj \
|
.\$(OBJDIR)\nsRepeatService.obj \
|
||||||
.\$(OBJDIR)\nsToolbarDragListener.obj \
|
.\$(OBJDIR)\nsToolbarDragListener.obj \
|
||||||
.\$(OBJDIR)\nsToolbarItemFrame.obj \
|
.\$(OBJDIR)\nsToolbarItemFrame.obj \
|
||||||
.\$(OBJDIR)\nsGrippyFrame.obj \
|
.\$(OBJDIR)\nsGrippyFrame.obj \
|
||||||
.\$(OBJDIR)\nsSplitterFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsTabFrame.obj \
|
.\$(OBJDIR)\nsTabFrame.obj \
|
||||||
.\$(OBJDIR)\nsDeckFrame.obj \
|
.\$(OBJDIR)\nsDeckFrame.obj \
|
||||||
.\$(OBJDIR)\nsStackFrame.obj \
|
.\$(OBJDIR)\nsStackFrame.obj \
|
||||||
.\$(OBJDIR)\nsBoxFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsProgressMeterFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsTitledButtonFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsToolboxFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsToolbarFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsTreeOuterFrame.obj \
|
.\$(OBJDIR)\nsTreeOuterFrame.obj \
|
||||||
.\$(OBJDIR)\nsTreeFrame.obj \
|
.\$(OBJDIR)\nsTreeFrame.obj \
|
||||||
.\$(OBJDIR)\nsTreeRowFrame.obj \
|
.\$(OBJDIR)\nsTreeRowFrame.obj \
|
||||||
@@ -105,18 +128,13 @@ CPP_OBJS= \
|
|||||||
.\$(OBJDIR)\nsSpinnerFrame.obj \
|
.\$(OBJDIR)\nsSpinnerFrame.obj \
|
||||||
.\$(OBJDIR)\nsScrollbarFrame.obj \
|
.\$(OBJDIR)\nsScrollbarFrame.obj \
|
||||||
.\$(OBJDIR)\nsScrollbarButtonFrame.obj \
|
.\$(OBJDIR)\nsScrollbarButtonFrame.obj \
|
||||||
.\$(OBJDIR)\nsSliderFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsColorPickerFrame.obj \
|
.\$(OBJDIR)\nsColorPickerFrame.obj \
|
||||||
.\$(OBJDIR)\nsStdColorPicker.obj \
|
.\$(OBJDIR)\nsStdColorPicker.obj \
|
||||||
.\$(OBJDIR)\nsFontPickerFrame.obj \
|
.\$(OBJDIR)\nsFontPickerFrame.obj \
|
||||||
.\$(OBJDIR)\nsMenuPopupFrame.obj \
|
.\$(OBJDIR)\nsMenuPopupFrame.obj \
|
||||||
.\$(OBJDIR)\nsMenuFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsMenuBarFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsMenuBarListener.obj \
|
.\$(OBJDIR)\nsMenuBarListener.obj \
|
||||||
.\$(OBJDIR)\nsMenuListener.obj \
|
.\$(OBJDIR)\nsMenuListener.obj \
|
||||||
.\$(OBJDIR)\nsMenuDismissalListener.obj \
|
.\$(OBJDIR)\nsMenuDismissalListener.obj \
|
||||||
.\$(OBJDIR)\nsPopupSetFrame.obj \
|
|
||||||
.\$(OBJDIR)\nsXULCheckboxFrame.obj \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
|
|||||||
1025
layout/xul/base/src/nsBox.cpp
Normal file
1025
layout/xul/base/src/nsBox.cpp
Normal file
File diff suppressed because it is too large
Load Diff
120
layout/xul/base/src/nsBox.h
Normal file
120
layout/xul/base/src/nsBox.h
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Author:
|
||||||
|
* Eric D Vaughan
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsBox_h___
|
||||||
|
#define nsBox_h___
|
||||||
|
|
||||||
|
#include "nsIBox.h"
|
||||||
|
|
||||||
|
class nsBox : public nsIBox {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
NS_IMETHOD GetChildBox(nsIBox** aBox);
|
||||||
|
NS_IMETHOD GetNextBox(nsIBox** aBox);
|
||||||
|
NS_IMETHOD SetNextBox(nsIBox* aBox);
|
||||||
|
NS_IMETHOD GetParentBox(nsIBox** aParent);
|
||||||
|
NS_IMETHOD SetParentBox(nsIBox* aParent);
|
||||||
|
NS_IMETHOD IsDirty(PRBool& aIsDirty);
|
||||||
|
NS_IMETHOD HasDirtyChildren(PRBool& aIsDirty);
|
||||||
|
NS_IMETHOD MarkDirty(nsBoxLayoutState& aState);
|
||||||
|
NS_IMETHOD MarkDirtyChildren(nsBoxLayoutState& aState);
|
||||||
|
NS_IMETHOD SetDebug(nsBoxLayoutState& aState, PRBool aDebug);
|
||||||
|
NS_IMETHOD SetBounds(nsBoxLayoutState& aBoxLayoutState, const nsRect& aRect);
|
||||||
|
NS_IMETHOD GetBounds(nsRect& aRect);
|
||||||
|
NS_IMETHOD GetBorderAndPadding(nsMargin& aBorderAndPadding);
|
||||||
|
NS_IMETHOD GetBorder(nsMargin& aBorderAndPadding);
|
||||||
|
NS_IMETHOD GetPadding(nsMargin& aBorderAndPadding);
|
||||||
|
|
||||||
|
NS_IMETHOD GetMargin(nsMargin& aMargin);
|
||||||
|
NS_IMETHOD SetLayoutManager(nsIBoxLayout* aLayout);
|
||||||
|
NS_IMETHOD GetLayoutManager(nsIBoxLayout** aLayout);
|
||||||
|
NS_IMETHOD GetContentRect(nsRect& aContentRect);
|
||||||
|
NS_IMETHOD GetClientRect(nsRect& aContentRect);
|
||||||
|
NS_IMETHOD GetVAlign(Valignment& aAlign);
|
||||||
|
NS_IMETHOD GetHAlign(Halignment& aAlign);
|
||||||
|
NS_IMETHOD GetInset(nsMargin& aInset);
|
||||||
|
NS_IMETHOD GetOrientation(PRBool& aIsHorizontal);
|
||||||
|
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetFlex(nsBoxLayoutState& aBoxLayoutState, nscoord& aFlex);
|
||||||
|
NS_IMETHOD GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
NS_IMETHOD IsCollapsed(nsBoxLayoutState& aBoxLayoutState, PRBool& aCollapsed);
|
||||||
|
NS_IMETHOD Collapse(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD UnCollapse(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD Redraw(nsBoxLayoutState& aState, const nsRect* aRect = nsnull, PRBool aImmediate = PR_FALSE);
|
||||||
|
NS_IMETHOD NeedsRecalc();
|
||||||
|
NS_IMETHOD GetDebugBoxAt(const nsPoint& aPoint, nsIBox** aBox);
|
||||||
|
NS_IMETHOD GetDebug(PRBool& aDebug);
|
||||||
|
|
||||||
|
nsBox(nsIPresShell* aShell);
|
||||||
|
|
||||||
|
virtual nsresult SyncLayout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
|
||||||
|
virtual PRBool DoesNeedRecalc(const nsSize& aSize);
|
||||||
|
virtual PRBool DoesNeedRecalc(nscoord aCoord);
|
||||||
|
virtual void SizeNeedsRecalc(nsSize& aSize);
|
||||||
|
virtual void CoordNeedsRecalc(nscoord& aCoord);
|
||||||
|
|
||||||
|
virtual void AddBorderAndPadding(nsSize& aSize);
|
||||||
|
virtual void AddInset(nsSize& aSize);
|
||||||
|
virtual void AddMargin(nsSize& aSize);
|
||||||
|
|
||||||
|
static void AddBorderAndPadding(nsIBox* aBox, nsSize& aSize);
|
||||||
|
static void AddInset(nsIBox* aBox, nsSize& aSize);
|
||||||
|
static void AddMargin(nsIBox* aChild, nsSize& aSize);
|
||||||
|
static void AddMargin(nsSize& aSize, const nsMargin& aMargin);
|
||||||
|
|
||||||
|
static nsresult UnCollapseChild(nsBoxLayoutState& aState, nsIBox* aFrame);
|
||||||
|
static nsresult CollapseChild(nsBoxLayoutState& aState, nsIFrame* aFrame, PRBool aHide);
|
||||||
|
|
||||||
|
static void BoundsCheck(nsSize& aMinSize, nsSize& aPrefSize, nsSize& aMaxSize);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual PRBool GetWasCollapsed(nsBoxLayoutState& aState);
|
||||||
|
virtual void SetWasCollapsed(nsBoxLayoutState& aState, PRBool aWas);
|
||||||
|
|
||||||
|
enum eMouseThrough {
|
||||||
|
never,
|
||||||
|
sometimes,
|
||||||
|
always
|
||||||
|
};
|
||||||
|
|
||||||
|
eMouseThrough mMouseThrough;
|
||||||
|
private:
|
||||||
|
|
||||||
|
nsIBox* mNextChild;
|
||||||
|
nsIBox* mParentBox;
|
||||||
|
//nscoord mX;
|
||||||
|
//nscoord mY;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -33,8 +33,8 @@
|
|||||||
|
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "nsHTMLContainerFrame.h"
|
#include "nsHTMLContainerFrame.h"
|
||||||
#include "nsIBox.h"
|
#include "nsContainerBox.h"
|
||||||
#include "nsISpaceManager.h"
|
class nsBoxLayoutState;
|
||||||
class nsBoxFrameInner;
|
class nsBoxFrameInner;
|
||||||
class nsBoxDebugInner;
|
class nsBoxDebugInner;
|
||||||
|
|
||||||
@@ -47,23 +47,6 @@ class nsHTMLInfo;
|
|||||||
#define NS_FRAME_BOX_NEEDS_RECALC 0x0004
|
#define NS_FRAME_BOX_NEEDS_RECALC 0x0004
|
||||||
#define NS_FRAME_IS_BOX 0x0008
|
#define NS_FRAME_IS_BOX 0x0008
|
||||||
|
|
||||||
class nsCalculatedBoxInfo : public nsBoxInfo {
|
|
||||||
public:
|
|
||||||
nsSize calculatedSize;
|
|
||||||
PRInt16 mFlags;
|
|
||||||
nsCalculatedBoxInfo* next;
|
|
||||||
nsIFrame* frame;
|
|
||||||
|
|
||||||
virtual void Recycle(nsIPresShell* aShell);
|
|
||||||
};
|
|
||||||
|
|
||||||
class nsInfoList
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual nsCalculatedBoxInfo* GetFirst()=0;
|
|
||||||
virtual nsCalculatedBoxInfo* GetLast()=0;
|
|
||||||
virtual PRInt32 GetCount()=0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// flags from box
|
// flags from box
|
||||||
#define NS_STATE_IS_HORIZONTAL 0x00400000
|
#define NS_STATE_IS_HORIZONTAL 0x00400000
|
||||||
@@ -72,8 +55,9 @@ public:
|
|||||||
#define NS_STATE_CURRENTLY_IN_DEBUG 0x02000000
|
#define NS_STATE_CURRENTLY_IN_DEBUG 0x02000000
|
||||||
#define NS_STATE_SET_TO_DEBUG 0x04000000
|
#define NS_STATE_SET_TO_DEBUG 0x04000000
|
||||||
#define NS_STATE_DEBUG_WAS_SET 0x08000000
|
#define NS_STATE_DEBUG_WAS_SET 0x08000000
|
||||||
|
#define NS_STATE_IS_COLLAPSED 0x10000000
|
||||||
|
|
||||||
class nsBoxFrame : public nsHTMLContainerFrame, public nsIBox
|
class nsBoxFrame : public nsHTMLContainerFrame, public nsContainerBox
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -81,7 +65,29 @@ public:
|
|||||||
// gets the rect inside our border and debug border. If you wish to paint inside a box
|
// gets the rect inside our border and debug border. If you wish to paint inside a box
|
||||||
// call this method to get the rect so you don't draw on the debug border or outer border.
|
// call this method to get the rect so you don't draw on the debug border or outer border.
|
||||||
|
|
||||||
virtual void GetInnerRect(nsRect& aInner);
|
// ------ nsISupports --------
|
||||||
|
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
// ------ nsIBox -------------
|
||||||
|
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetFlex(nsBoxLayoutState& aBoxLayoutState, nscoord& aFlex);
|
||||||
|
NS_IMETHOD GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
NS_IMETHOD SetDebug(nsBoxLayoutState& aBoxLayoutState, PRBool aDebug);
|
||||||
|
NS_IMETHOD GetFrame(nsIFrame** aFrame);
|
||||||
|
NS_IMETHOD GetVAlign(Valignment& aAlign);
|
||||||
|
NS_IMETHOD GetHAlign(Halignment& aAlign);
|
||||||
|
NS_IMETHOD NeedsRecalc();
|
||||||
|
NS_IMETHOD GetInset(nsMargin& aInset);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD GetDebug(PRBool& aDebug);
|
||||||
|
|
||||||
|
// ----- child and sibling operations ---
|
||||||
|
|
||||||
|
// ----- public methods -------
|
||||||
|
|
||||||
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
const nsPoint& aPoint,
|
const nsPoint& aPoint,
|
||||||
@@ -93,9 +99,6 @@ public:
|
|||||||
PRInt32& aCursor);
|
PRInt32& aCursor);
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
|
||||||
nsDidReflowStatus aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild);
|
NS_IMETHOD ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild);
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
||||||
@@ -146,37 +149,22 @@ public:
|
|||||||
|
|
||||||
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
||||||
|
|
||||||
|
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
||||||
|
nsDidReflowStatus aStatus);
|
||||||
|
|
||||||
virtual PRBool IsHorizontal() const;
|
virtual PRBool IsHorizontal() const;
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef(void);
|
|
||||||
NS_IMETHOD_(nsrefcnt) Release(void);
|
|
||||||
|
|
||||||
virtual ~nsBoxFrame();
|
virtual ~nsBoxFrame();
|
||||||
|
|
||||||
virtual void GetChildBoxInfo(PRInt32 aIndex, nsBoxInfo& aSize);
|
virtual nsresult GetContentOf(nsIContent** aContent);
|
||||||
|
|
||||||
// nsIBox methods
|
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
|
||||||
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
|
|
||||||
NS_IMETHOD InvalidateCache(nsIFrame* aChild);
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug);
|
|
||||||
|
|
||||||
enum Halignment {
|
|
||||||
hAlign_Left,
|
|
||||||
hAlign_Right,
|
|
||||||
hAlign_Center
|
|
||||||
};
|
|
||||||
|
|
||||||
enum Valignment {
|
|
||||||
vAlign_Top,
|
|
||||||
vAlign_Middle,
|
|
||||||
vAlign_BaseLine,
|
|
||||||
vAlign_Bottom
|
|
||||||
};
|
|
||||||
protected:
|
protected:
|
||||||
nsBoxFrame(nsIPresShell* aPresShell, PRBool aIsRoot = PR_FALSE);
|
nsBoxFrame(nsIPresShell* aPresShell, PRBool aIsRoot = PR_FALSE);
|
||||||
|
|
||||||
|
virtual void PropagateDebug(nsBoxLayoutState& aState);
|
||||||
|
|
||||||
|
|
||||||
// Paint one child frame
|
// Paint one child frame
|
||||||
virtual void PaintChild(nsIPresContext* aPresContext,
|
virtual void PaintChild(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -189,36 +177,14 @@ protected:
|
|||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsFramePaintLayer aWhichLayer);
|
nsFramePaintLayer aWhichLayer);
|
||||||
|
|
||||||
|
|
||||||
virtual void GetRedefinedMinPrefMax(nsIPresContext* aPresContext, nsIFrame* aFrame, nsCalculatedBoxInfo& aSize);
|
|
||||||
virtual nsresult GetChildBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsIFrame* aFrame, nsCalculatedBoxInfo& aSize);
|
|
||||||
virtual void ComputeChildsNextPosition( nsCalculatedBoxInfo* aInfo, nscoord& aCurX, nscoord& aCurY, nscoord& aNextX, nscoord& aNextY, const nsSize& aCurrentChildSize, const nsRect& aBoxRect, nscoord aMaxAscent);
|
|
||||||
virtual nsresult PlaceChildren(nsIPresContext* aPresContext, nsRect& boxRect);
|
|
||||||
virtual void ChildResized(nsIFrame* aFrame, nsHTMLReflowMetrics& aDesiredSize, nsRect& aRect, nscoord& aMaxAscent, nsCalculatedBoxInfo& aInfo, PRBool*& aResized, PRInt32 aInfoCount, nscoord& aChangedIndex, PRBool& aFinished, nscoord aIndex, nsString& aReason);
|
|
||||||
|
|
||||||
virtual void LayoutChildrenInRect(nsRect& aSize, nscoord& aMaxAscent);
|
|
||||||
virtual void AddChildSize(nsBoxInfo& aInfo, nsBoxInfo& aChildInfo);
|
|
||||||
virtual void BoundsCheck(const nsBoxInfo& aBoxInfo, nsRect& aRect);
|
|
||||||
virtual void InvalidateChildren();
|
|
||||||
virtual void AddSize(const nsSize& a, nsSize& b, PRBool largest);
|
|
||||||
|
|
||||||
virtual PRIntn GetSkipSides() const { return 0; }
|
virtual PRIntn GetSkipSides() const { return 0; }
|
||||||
|
|
||||||
virtual void GetInset(nsMargin& margin);
|
|
||||||
virtual void CollapseChild(nsIPresContext* aPresContext, nsIFrame* frame, PRBool hide);
|
|
||||||
|
|
||||||
nsresult GenerateDirtyReflowCommand(nsIPresContext* aPresContext,
|
|
||||||
nsIPresShell& aPresShell);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual PRBool GetInitialOrientation(PRBool& aIsHorizontal);
|
virtual PRBool GetInitialOrientation(PRBool& aIsHorizontal);
|
||||||
virtual PRBool GetInitialHAlignment(Halignment& aHalign);
|
virtual PRBool GetInitialHAlignment(Halignment& aHalign);
|
||||||
virtual PRBool GetInitialVAlignment(Valignment& aValign);
|
virtual PRBool GetInitialVAlignment(Valignment& aValign);
|
||||||
virtual PRBool GetInitialAutoStretch(PRBool& aStretch);
|
virtual PRBool GetInitialAutoStretch(PRBool& aStretch);
|
||||||
virtual PRBool GetDefaultFlex(PRInt32& aFlex);
|
|
||||||
|
|
||||||
virtual nsInfoList* GetInfoList();
|
|
||||||
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
381
layout/xul/base/src/nsBoxLayoutState.cpp
Normal file
381
layout/xul/base/src/nsBoxLayoutState.cpp
Normal file
@@ -0,0 +1,381 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Eric Vaughan
|
||||||
|
// Netscape Communications
|
||||||
|
//
|
||||||
|
// See documentation in associated header file
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
#include "nsIReflowCommand.h"
|
||||||
|
#include "nsBoxFrame.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
#include "nsXULAtoms.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
|
||||||
|
nsBoxLayoutState::nsBoxLayoutState(nsIPresContext* aPresContext):mPresContext(aPresContext), mReflowState(nsnull)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
nsBoxLayoutState::nsBoxLayoutState(const nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
mPresContext = aState.mPresContext;
|
||||||
|
mType = aState.mType;
|
||||||
|
mReflowState = aState.mReflowState;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsBoxLayoutState::nsBoxLayoutState(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState):mReflowState(&aReflowState),mPresContext(aPresContext),mType(Dirty)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsBoxLayoutState::HandleReflow(nsIBox* aRootBox, PRBool aCoelesce)
|
||||||
|
{
|
||||||
|
switch(mReflowState->reason)
|
||||||
|
{
|
||||||
|
case eReflowReason_Incremental:
|
||||||
|
{
|
||||||
|
nsIReflowCommand::ReflowType type;
|
||||||
|
mReflowState->reflowCommand->GetType(type);
|
||||||
|
|
||||||
|
// atempt to coelesce style changes and reflows
|
||||||
|
// see if the target is a box
|
||||||
|
/*
|
||||||
|
PRBool isAdaptor = PR_FALSE;
|
||||||
|
nsIBox* box = GetTargetBox(mReflowState->reflowCommand, isAdaptor);
|
||||||
|
// if it is mark it dirty. Generating a dirty reflow targeted at us unless on is already
|
||||||
|
// done.
|
||||||
|
if (box && box != aRootBox) {
|
||||||
|
if (type == nsIReflowCommand::StyleChanged) {
|
||||||
|
// could be a visiblity change need to dirty
|
||||||
|
// parent so it gets redrawn.
|
||||||
|
nsIBox* parent;
|
||||||
|
box->GetParentBox(&parent);
|
||||||
|
parent->MarkDirty(*this);
|
||||||
|
DirtyAllChildren(*this, box);
|
||||||
|
} else
|
||||||
|
box->MarkDirty(*this);
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ok if the target was not a box. Then unwind it down
|
||||||
|
if (UnWind(mReflowState->reflowCommand, aRootBox, aCoelesce)) {
|
||||||
|
mType = Dirty;
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // fall into dirty
|
||||||
|
|
||||||
|
case eReflowReason_Dirty:
|
||||||
|
mType = Dirty;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// if the a resize reflow then it doesn't need to be reflowed. Only if the size is different
|
||||||
|
// from the new size would we actually do a reflow
|
||||||
|
case eReflowReason_Resize:
|
||||||
|
mType = Resize;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// if its an initial reflow we must place the child.
|
||||||
|
// otherwise we might think it was already placed when it wasn't
|
||||||
|
case eReflowReason_Initial:
|
||||||
|
mType = Initial;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
mType = Dirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsBoxLayoutState::UnWind(nsIReflowCommand* aCommand, nsIBox* aBox, PRBool aCoelesce)
|
||||||
|
{
|
||||||
|
// if incremental unwindow the chain
|
||||||
|
nsIFrame* incrementalChild = nsnull;
|
||||||
|
nsIBox* lastBox = nsnull;
|
||||||
|
nsIFrame* target = nsnull;
|
||||||
|
aCommand->GetTarget(target);
|
||||||
|
nsIReflowCommand::ReflowType type;
|
||||||
|
mReflowState->reflowCommand->GetType(type);
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
aCommand->GetNext(incrementalChild, PR_FALSE);
|
||||||
|
if (incrementalChild == nsnull)
|
||||||
|
return PR_FALSE;
|
||||||
|
|
||||||
|
// get the box for the given incrementalChild. If adaptor is true then
|
||||||
|
// it is some wrapped HTML frame.
|
||||||
|
PRBool isAdaptor = PR_FALSE;
|
||||||
|
nsIBox* ibox = GetBoxForFrame(incrementalChild, isAdaptor);
|
||||||
|
if (ibox) {
|
||||||
|
nsFrameState state;
|
||||||
|
incrementalChild->GetFrameState(&state);
|
||||||
|
state &= ~NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||||
|
incrementalChild->SetFrameState(state);
|
||||||
|
|
||||||
|
// ok we got a box is it the target?
|
||||||
|
if (incrementalChild == target) {
|
||||||
|
|
||||||
|
if (!aCoelesce) {
|
||||||
|
nsFrameState state;
|
||||||
|
nsIFrame* frame;
|
||||||
|
aBox->GetFrame(&frame);
|
||||||
|
frame->GetFrameState(&state);
|
||||||
|
state |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||||
|
frame->SetFrameState(state);
|
||||||
|
}
|
||||||
|
// the target is a box?
|
||||||
|
// mark it dirty generating a new reflow command targeted
|
||||||
|
// at us and coelesce out this one.
|
||||||
|
ibox->MarkDirty(*this);
|
||||||
|
|
||||||
|
if (type == nsIReflowCommand::StyleChanged) {
|
||||||
|
// could be a visiblity change need to dirty
|
||||||
|
// parent so it gets redrawn.
|
||||||
|
nsIBox* parent;
|
||||||
|
ibox->GetParentBox(&parent);
|
||||||
|
parent->MarkDirty(*this);
|
||||||
|
//DirtyAllChildren(*this, box);
|
||||||
|
}
|
||||||
|
|
||||||
|
// yes we coelesed
|
||||||
|
return aCoelesce ? PR_TRUE : PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// was the child html?
|
||||||
|
if (isAdaptor) {
|
||||||
|
// the target is deep inside html we will have to honor this one.
|
||||||
|
// mark us as dirty so we don't post
|
||||||
|
// a dirty reflow
|
||||||
|
nsFrameState state;
|
||||||
|
nsIFrame* frame;
|
||||||
|
aBox->GetFrame(&frame);
|
||||||
|
frame->GetFrameState(&state);
|
||||||
|
state |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||||
|
frame->SetFrameState(state);
|
||||||
|
|
||||||
|
incrementalChild->GetFrameState(&state);
|
||||||
|
state &= ~NS_FRAME_IS_DIRTY;
|
||||||
|
incrementalChild->SetFrameState(state);
|
||||||
|
|
||||||
|
// mark the adaptor dirty
|
||||||
|
ibox->MarkDirty(*this);
|
||||||
|
|
||||||
|
// we are done and we did not coelesce
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
NS_ERROR("This should not happen! We should always get a box");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
aCommand->GetNext(incrementalChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void
|
||||||
|
nsBoxLayoutState::UnWind(nsIReflowCommand* aCommand, nsIBox* aBox)
|
||||||
|
{
|
||||||
|
|
||||||
|
nsFrameState state;
|
||||||
|
nsIFrame* frame;
|
||||||
|
aBox->GetFrame(&frame);
|
||||||
|
frame->GetFrameState(&state);
|
||||||
|
state |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||||
|
frame->SetFrameState(state);
|
||||||
|
|
||||||
|
// if incremental unwindow the chain
|
||||||
|
nsIFrame* incrementalChild = nsnull;
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
aCommand->GetNext(incrementalChild, PR_FALSE);
|
||||||
|
if (incrementalChild == nsnull)
|
||||||
|
break;
|
||||||
|
|
||||||
|
nsIFrame* target = nsnull;
|
||||||
|
aCommand->GetTarget(target);
|
||||||
|
|
||||||
|
PRBool isAdaptor = PR_FALSE;
|
||||||
|
nsIBox* ibox = GetBoxForFrame(incrementalChild, isAdaptor);
|
||||||
|
if (ibox) {
|
||||||
|
if (incrementalChild == target || isAdaptor) {
|
||||||
|
ibox->MarkDirty(*this);
|
||||||
|
if (isAdaptor)
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
ibox->MarkDirtyChildren(*this);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
aCommand->GetNext(incrementalChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
nsIBox*
|
||||||
|
nsBoxLayoutState::GetTargetBox(nsIReflowCommand* mCommand, PRBool& aIsAdaptor)
|
||||||
|
{
|
||||||
|
nsIFrame* target = nsnull;
|
||||||
|
mReflowState->reflowCommand->GetTarget(target);
|
||||||
|
return GetBoxForFrame(target, aIsAdaptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIBox*
|
||||||
|
nsBoxLayoutState::GetBoxForFrame(nsIFrame* aFrame, PRBool& aIsAdaptor)
|
||||||
|
{
|
||||||
|
if (aFrame == nsnull)
|
||||||
|
return nsnull;
|
||||||
|
|
||||||
|
nsIBox* ibox = nsnull;
|
||||||
|
if (NS_FAILED(aFrame->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox))) {
|
||||||
|
aIsAdaptor = PR_TRUE;
|
||||||
|
|
||||||
|
// if we hit a non box. Find the box in out last container
|
||||||
|
// and clear its cache.
|
||||||
|
nsIFrame* parent = nsnull;
|
||||||
|
aFrame->GetParent(&parent);
|
||||||
|
nsIBox* parentBox = nsnull;
|
||||||
|
if (NS_FAILED(parent->QueryInterface(NS_GET_IID(nsIBox), (void**)&parentBox)))
|
||||||
|
return nsnull;
|
||||||
|
|
||||||
|
if (parentBox) {
|
||||||
|
nsIBox* start = nsnull;
|
||||||
|
parentBox->GetChildBox(&start);
|
||||||
|
while (start) {
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
start->GetFrame(&frame);
|
||||||
|
if (frame == aFrame) {
|
||||||
|
ibox = start;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
start->GetNextBox(&start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ibox;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsBoxLayoutState::DirtyAllChildren(nsBoxLayoutState& aState, nsIBox* aBox)
|
||||||
|
{
|
||||||
|
aBox->MarkDirty(aState);
|
||||||
|
|
||||||
|
nsIBox* first = nsnull;
|
||||||
|
aBox->GetChildBox(&first);
|
||||||
|
if (first)
|
||||||
|
aBox->MarkDirtyChildren(aState);
|
||||||
|
|
||||||
|
while(first)
|
||||||
|
{
|
||||||
|
DirtyAllChildren(aState, first);
|
||||||
|
first->GetNextBox(&first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void*
|
||||||
|
nsBoxLayoutState::Allocate(size_t sz, nsIPresShell* aPresShell)
|
||||||
|
{
|
||||||
|
// Check the recycle list first.
|
||||||
|
void* result = nsnull;
|
||||||
|
aPresShell->AllocateFrame(sz, &result);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
nsCRT::zero(result, sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overridden to prevent the global delete from being called, since the memory
|
||||||
|
// came out of an nsIArena instead of the global delete operator's heap.
|
||||||
|
void
|
||||||
|
nsBoxLayoutState::Free(void* aPtr, size_t sz)
|
||||||
|
{
|
||||||
|
// Don't let the memory be freed, since it will be recycled
|
||||||
|
// instead. Don't call the global operator delete.
|
||||||
|
|
||||||
|
// Stash the size of the object in the first four bytes of the
|
||||||
|
// freed up memory. The Destroy method can then use this information
|
||||||
|
// to recycle the object.
|
||||||
|
size_t* szPtr = (size_t*)aPtr;
|
||||||
|
*szPtr = sz;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsBoxLayoutState::RecycleFreedMemory(nsIPresShell* aShell, void* aMem)
|
||||||
|
{
|
||||||
|
size_t* sz = (size_t*)aMem;
|
||||||
|
aShell->FreeFrame(*sz, aMem);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsBoxLayoutState::GetPresShell(nsIPresShell** aShell)
|
||||||
|
{
|
||||||
|
return mPresContext->GetShell(aShell);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsBoxLayoutState::PushStackMemory()
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIPresShell> shell;
|
||||||
|
mPresContext->GetShell(getter_AddRefs(shell));
|
||||||
|
return shell->PushStackMemory();
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsBoxLayoutState::PopStackMemory()
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIPresShell> shell;
|
||||||
|
mPresContext->GetShell(getter_AddRefs(shell));
|
||||||
|
|
||||||
|
return shell->PopStackMemory();
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsBoxLayoutState::AllocateStackMemory(size_t aSize, void** aResult)
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIPresShell> shell;
|
||||||
|
mPresContext->GetShell(getter_AddRefs(shell));
|
||||||
|
|
||||||
|
return shell->AllocateStackMemory(aSize, aResult);
|
||||||
|
}
|
||||||
|
|
||||||
87
layout/xul/base/src/nsBoxLayoutState.h
Normal file
87
layout/xul/base/src/nsBoxLayoutState.h
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
Author:
|
||||||
|
Eric D Vaughan
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef nsBoxLayoutState_h___
|
||||||
|
#define nsBoxLayoutState_h___
|
||||||
|
|
||||||
|
#include "nsIFrame.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIPresShell.h"
|
||||||
|
|
||||||
|
class nsReflowState;
|
||||||
|
class nsCalculatedBoxInfo;
|
||||||
|
struct nsHTMLReflowMetrics;
|
||||||
|
class nsString;
|
||||||
|
class nsIBox;
|
||||||
|
class nsIReflowCommand;
|
||||||
|
|
||||||
|
class nsBoxLayoutState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum eBoxLayoutReason {
|
||||||
|
Dirty,
|
||||||
|
Resize,
|
||||||
|
Initial
|
||||||
|
};
|
||||||
|
|
||||||
|
nsBoxLayoutState(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState);
|
||||||
|
nsBoxLayoutState(nsIPresContext* aPresContext);
|
||||||
|
nsBoxLayoutState(const nsBoxLayoutState& aState);
|
||||||
|
|
||||||
|
virtual PRBool HandleReflow(nsIBox* aRootBox, PRBool aCoalesce);
|
||||||
|
|
||||||
|
virtual nsIPresContext* GetPresContext() { return mPresContext; }
|
||||||
|
virtual nsresult GetPresShell(nsIPresShell** aShell);
|
||||||
|
|
||||||
|
virtual eBoxLayoutReason GetLayoutReason() { return mType; }
|
||||||
|
virtual void SetLayoutReason(eBoxLayoutReason aReason) { mType = aReason; }
|
||||||
|
virtual const nsHTMLReflowState* GetReflowState() { return mReflowState; }
|
||||||
|
|
||||||
|
static void* Allocate(size_t sz, nsIPresShell* aPresShell);
|
||||||
|
static void Free(void* aPtr, size_t sz);
|
||||||
|
static void RecycleFreedMemory(nsIPresShell* aPresShell, void* mem);
|
||||||
|
|
||||||
|
nsresult PushStackMemory();
|
||||||
|
nsresult PopStackMemory();
|
||||||
|
nsresult AllocateStackMemory(size_t aSize, void** aResult);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void DirtyAllChildren(nsBoxLayoutState& aState, nsIBox* aBox);
|
||||||
|
PRBool UnWind(nsIReflowCommand* aCommand, nsIBox* aRootBox, PRBool aCoalesce);
|
||||||
|
nsIBox* GetTargetBox(nsIReflowCommand* mCommand, PRBool& aIsAdaptor);
|
||||||
|
nsIBox* GetBoxForFrame(nsIFrame* aFrame, PRBool& aIsAdaptor);
|
||||||
|
|
||||||
|
nsIPresContext* mPresContext;
|
||||||
|
const nsHTMLReflowState* mReflowState;
|
||||||
|
eBoxLayoutReason mType;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
806
layout/xul/base/src/nsBoxToBlockAdaptor.cpp
Normal file
806
layout/xul/base/src/nsBoxToBlockAdaptor.cpp
Normal file
@@ -0,0 +1,806 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Eric Vaughan
|
||||||
|
// Netscape Communications
|
||||||
|
//
|
||||||
|
// See documentation in associated header file
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
#include "nsBoxFrame.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsHTMLIIDs.h"
|
||||||
|
#include "nsUnitConversion.h"
|
||||||
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
#include "nsXULAtoms.h"
|
||||||
|
#include "nsIReflowCommand.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsSpaceManager.h"
|
||||||
|
#include "nsHTMLParts.h"
|
||||||
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsIView.h"
|
||||||
|
#include "nsIPresShell.h"
|
||||||
|
#include "nsGenericHTMLElement.h"
|
||||||
|
#include "nsFrameNavigator.h"
|
||||||
|
#include "nsCSSRendering.h"
|
||||||
|
#include "nsISelfScrollingFrame.h"
|
||||||
|
#include "nsIPref.h"
|
||||||
|
#include "nsIServiceManager.h"
|
||||||
|
#include "nsBoxToBlockAdaptor.h"
|
||||||
|
#include "nsILineIterator.h"
|
||||||
|
#include "nsIFontMetrics.h"
|
||||||
|
|
||||||
|
nsBoxToBlockAdaptor::nsBoxToBlockAdaptor(nsIPresShell* aPresShell, nsIFrame* aFrame):nsBox(aPresShell)
|
||||||
|
{
|
||||||
|
NS_INIT_ISUPPORTS();
|
||||||
|
|
||||||
|
mFrame = aFrame;
|
||||||
|
mSpaceManager = nsnull;
|
||||||
|
mWasCollapsed = PR_FALSE;
|
||||||
|
NeedsRecalc();
|
||||||
|
}
|
||||||
|
|
||||||
|
void*
|
||||||
|
nsBoxToBlockAdaptor::operator new(size_t sz, nsIPresShell* aPresShell)
|
||||||
|
{
|
||||||
|
return nsBoxLayoutState::Allocate(sz,aPresShell);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::Recycle(nsIPresShell* aPresShell)
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
nsBoxLayoutState::RecycleFreedMemory(aPresShell, this);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::GetFrame(nsIFrame** aFrame)
|
||||||
|
{
|
||||||
|
*aFrame = mFrame;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overridden to prevent the global delete from being called, since the memory
|
||||||
|
// came out of an nsIArena instead of the global delete operator's heap.
|
||||||
|
void
|
||||||
|
nsBoxToBlockAdaptor::operator delete(void* aPtr, size_t sz)
|
||||||
|
{
|
||||||
|
nsBoxLayoutState::Free(aPtr, sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsBoxToBlockAdaptor::~nsBoxToBlockAdaptor()
|
||||||
|
{
|
||||||
|
if (mSpaceManager)
|
||||||
|
NS_RELEASE(mSpaceManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::NeedsRecalc()
|
||||||
|
{
|
||||||
|
nsIBox* parent;
|
||||||
|
GetParentBox(&parent);
|
||||||
|
nsIFrame* frame;
|
||||||
|
if (parent) {
|
||||||
|
parent->GetFrame(&frame);
|
||||||
|
nsFrameState frameState = 0;
|
||||||
|
frame->GetFrameState(&frameState);
|
||||||
|
}
|
||||||
|
|
||||||
|
mMinWidth = -1;
|
||||||
|
mPrefNeedsRecalc = PR_TRUE;
|
||||||
|
SizeNeedsRecalc(mMinSize);
|
||||||
|
SizeNeedsRecalc(mMaxSize);
|
||||||
|
CoordNeedsRecalc(mFlex);
|
||||||
|
CoordNeedsRecalc(mAscent);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!mPrefNeedsRecalc) {
|
||||||
|
aSize = mPrefSize;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
// see if anything is defined in css. If pref size is competely
|
||||||
|
// defined in css we are golden. We do nothing. But is its not
|
||||||
|
// in css we will have to reflow the child.
|
||||||
|
nsSize pref(0,0);
|
||||||
|
|
||||||
|
PRBool completelyRedefined = nsIBox::AddCSSPrefSize(aBoxLayoutState, this, mPrefSize);
|
||||||
|
|
||||||
|
if (!completelyRedefined) {
|
||||||
|
const nsHTMLReflowState* reflowState = aBoxLayoutState.GetReflowState();
|
||||||
|
if (reflowState) {
|
||||||
|
nsIPresContext* presContext = aBoxLayoutState.GetPresContext();
|
||||||
|
nsReflowStatus status = NS_FRAME_COMPLETE;
|
||||||
|
nsHTMLReflowMetrics desiredSize(nsnull);
|
||||||
|
|
||||||
|
PRBool isDirty = PR_FALSE;
|
||||||
|
IsDirty(isDirty);
|
||||||
|
|
||||||
|
//nsRect oldRect;
|
||||||
|
// mFrame->GetRect(oldRect);
|
||||||
|
|
||||||
|
rv = Reflow(presContext,
|
||||||
|
desiredSize,
|
||||||
|
*reflowState,
|
||||||
|
status,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NS_INTRINSICSIZE,
|
||||||
|
NS_INTRINSICSIZE,
|
||||||
|
PR_FALSE);
|
||||||
|
|
||||||
|
nsFrameState frameState = 0;
|
||||||
|
mFrame->GetFrameState(&frameState);
|
||||||
|
frameState |= NS_FRAME_IS_DIRTY;
|
||||||
|
mFrame->SetFrameState(frameState);
|
||||||
|
//mFrame->SetRect(presContext, oldRect);
|
||||||
|
|
||||||
|
mPrefSize.width = desiredSize.width;
|
||||||
|
mPrefSize.height = desiredSize.height;
|
||||||
|
mAscent = desiredSize.ascent;
|
||||||
|
|
||||||
|
nsMargin m(0,0,0,0);
|
||||||
|
GetInset(m);
|
||||||
|
mAscent += m.top;
|
||||||
|
|
||||||
|
// ok the sizes might be bigger than our css preferred size.
|
||||||
|
// check it.
|
||||||
|
AddInset(mPrefSize);
|
||||||
|
|
||||||
|
nsIBox::AddCSSPrefSize(aBoxLayoutState, this, mPrefSize);
|
||||||
|
mPrefNeedsRecalc = PR_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aSize = mPrefSize;
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
if (!DoesNeedRecalc(mMinSize)) {
|
||||||
|
aSize = mMinSize;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
mMinSize.width = 0;
|
||||||
|
mMinSize.height = 0;
|
||||||
|
|
||||||
|
AddBorderAndPadding(mMinSize);
|
||||||
|
AddInset(mMinSize);
|
||||||
|
|
||||||
|
if (mMinWidth != -1)
|
||||||
|
mMinSize.width = mMinWidth;
|
||||||
|
|
||||||
|
nsIBox::AddCSSMinSize(aBoxLayoutState, this, mMinSize);
|
||||||
|
|
||||||
|
aSize = mMinSize;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
if (!DoesNeedRecalc(mMaxSize)) {
|
||||||
|
aSize = mMaxSize;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult rv = nsBox::GetMaxSize(aBoxLayoutState, mMaxSize);
|
||||||
|
aSize = mMaxSize;
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::GetFlex(nsBoxLayoutState& aBoxLayoutState, nscoord& aFlex)
|
||||||
|
{
|
||||||
|
if (!DoesNeedRecalc(mFlex)) {
|
||||||
|
aFlex = mFlex;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
mFlex = 0;
|
||||||
|
nsBox::GetFlex(aBoxLayoutState, mFlex);
|
||||||
|
|
||||||
|
aFlex = mFlex;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent)
|
||||||
|
{
|
||||||
|
if (!DoesNeedRecalc(mAscent)) {
|
||||||
|
aAscent = mAscent;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsSize size;
|
||||||
|
GetPrefSize(aBoxLayoutState, size);
|
||||||
|
|
||||||
|
aAscent = mAscent;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsBoxToBlockAdaptor::IsCollapsed(nsBoxLayoutState& aBoxLayoutState, PRBool& aCollapsed)
|
||||||
|
{
|
||||||
|
return nsBox::IsCollapsed(aBoxLayoutState, aCollapsed);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsBoxToBlockAdaptor::Layout(nsBoxLayoutState& aBoxLayoutState)
|
||||||
|
{
|
||||||
|
nsRect ourRect(0,0,0,0);
|
||||||
|
GetBounds(ourRect);
|
||||||
|
|
||||||
|
const nsHTMLReflowState* reflowState = aBoxLayoutState.GetReflowState();
|
||||||
|
nsIPresContext* presContext = aBoxLayoutState.GetPresContext();
|
||||||
|
nsReflowStatus status = NS_FRAME_COMPLETE;
|
||||||
|
nsHTMLReflowMetrics desiredSize(nsnull);
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (reflowState) {
|
||||||
|
|
||||||
|
// nsRect oldRect;
|
||||||
|
// mFrame->GetRect(oldRect);
|
||||||
|
|
||||||
|
rv = Reflow(presContext,
|
||||||
|
desiredSize,
|
||||||
|
*reflowState,
|
||||||
|
status,
|
||||||
|
ourRect.x,
|
||||||
|
ourRect.y,
|
||||||
|
ourRect.width,
|
||||||
|
ourRect.height);
|
||||||
|
|
||||||
|
mAscent = desiredSize.ascent;
|
||||||
|
|
||||||
|
PRBool isCollapsed = PR_FALSE;
|
||||||
|
IsCollapsed(aBoxLayoutState, isCollapsed);
|
||||||
|
// if (!isCollapsed) {
|
||||||
|
mFrame->SizeTo(presContext, desiredSize.width, desiredSize.height);
|
||||||
|
// } else {
|
||||||
|
// mFrame->SetRect(presContext, oldRect);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
SyncLayout(aBoxLayoutState);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsBoxToBlockAdaptor::Reflow(nsIPresContext* aPresContext,
|
||||||
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
|
const nsHTMLReflowState& aReflowState,
|
||||||
|
nsReflowStatus& aStatus,
|
||||||
|
nscoord aX,
|
||||||
|
nscoord aY,
|
||||||
|
nscoord aWidth,
|
||||||
|
nscoord aHeight,
|
||||||
|
PRBool aMoveFrame)
|
||||||
|
{
|
||||||
|
|
||||||
|
//printf("width=%d, height=%d\n", aWidth, aHeight);
|
||||||
|
|
||||||
|
nsIBox* parent;
|
||||||
|
GetParentBox(&parent);
|
||||||
|
nsIFrame* frame;
|
||||||
|
parent->GetFrame(&frame);
|
||||||
|
nsFrameState frameState = 0;
|
||||||
|
frame->GetFrameState(&frameState);
|
||||||
|
|
||||||
|
// if (frameState & NS_STATE_CURRENTLY_IN_DEBUG)
|
||||||
|
// printf("In debug\n");
|
||||||
|
|
||||||
|
if (mSpaceManager == nsnull) {
|
||||||
|
mSpaceManager = new nsSpaceManager(mFrame);
|
||||||
|
NS_ADDREF(mSpaceManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modify the reflow state and set the space manager
|
||||||
|
nsHTMLReflowState& nonConstState = (nsHTMLReflowState&)aReflowState;
|
||||||
|
nonConstState.mSpaceManager = mSpaceManager;
|
||||||
|
|
||||||
|
// Clear the spacemanager's regions.
|
||||||
|
mSpaceManager->ClearRegions();
|
||||||
|
|
||||||
|
|
||||||
|
aStatus = NS_FRAME_COMPLETE;
|
||||||
|
PRBool needsReflow = PR_FALSE;
|
||||||
|
|
||||||
|
// get our frame its size and the reflow state
|
||||||
|
|
||||||
|
nsReflowReason reason = aReflowState.reason;
|
||||||
|
|
||||||
|
nsFrameState childState;
|
||||||
|
mFrame->GetFrameState(&childState);
|
||||||
|
// childState |= NS_BLOCK_SPACE_MGR;
|
||||||
|
// mFrame->SetFrameState(childState);
|
||||||
|
|
||||||
|
|
||||||
|
if (childState & NS_FRAME_FIRST_REFLOW) {
|
||||||
|
if (reason != eReflowReason_Initial)
|
||||||
|
{
|
||||||
|
// if incremental then make sure we send a initial reflow first.
|
||||||
|
if (reason == eReflowReason_Incremental) {
|
||||||
|
nsHTMLReflowState state(aReflowState);
|
||||||
|
state.reason = eReflowReason_Initial;
|
||||||
|
state.reflowCommand = nsnull;
|
||||||
|
Reflow(aPresContext, aDesiredSize, state, aStatus, aX, aY, aWidth, aHeight, aMoveFrame);
|
||||||
|
} else {
|
||||||
|
// convert to initial if not incremental.
|
||||||
|
reason = eReflowReason_Initial;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else if (reason == eReflowReason_Initial) {
|
||||||
|
reason = eReflowReason_Resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle or different types of reflow
|
||||||
|
switch(reason)
|
||||||
|
{
|
||||||
|
// if the child we are reflowing is the child we popped off the incremental
|
||||||
|
// reflow chain then we need to reflow it no matter what.
|
||||||
|
// if its not the child we got from the reflow chain then this child needs reflow
|
||||||
|
// because as a side effect of the incremental child changing aize andit needs to be resized.
|
||||||
|
// This will happen with a lot when a box that contains 2 children with different flexabilities
|
||||||
|
// if on child gets bigger the other is affected because it is proprotional to the first.
|
||||||
|
// so it might need to be resized. But we don't need to reflow it. If it is already the
|
||||||
|
// needed size then we will do nothing.
|
||||||
|
case eReflowReason_Incremental: {
|
||||||
|
|
||||||
|
// if incremental see if the next child in the chain is the child. If so then
|
||||||
|
// we will just let it go down. If not then convert it to a dirty. It will get converted back when
|
||||||
|
// needed in the case just below this one.
|
||||||
|
nsIFrame* incrementalChild = nsnull;
|
||||||
|
aReflowState.reflowCommand->GetNext(incrementalChild, PR_FALSE);
|
||||||
|
if (incrementalChild == nsnull)
|
||||||
|
aReflowState.reflowCommand->GetTarget(incrementalChild);
|
||||||
|
|
||||||
|
if (incrementalChild == mFrame) {
|
||||||
|
needsReflow = PR_TRUE;
|
||||||
|
aReflowState.reflowCommand->GetNext(incrementalChild);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fall into dirty
|
||||||
|
}
|
||||||
|
|
||||||
|
// if its dirty then see if the child we want to reflow is dirty. If it is then
|
||||||
|
// mark it as needing to be reflowed.
|
||||||
|
case eReflowReason_Dirty: {
|
||||||
|
// only frames that implement nsIBox seem to be able to handle a reason of Dirty. For everyone else
|
||||||
|
// send down a resize.
|
||||||
|
reason = eReflowReason_Resize;
|
||||||
|
|
||||||
|
// get the frame state to see if it needs reflow
|
||||||
|
needsReflow = (childState & NS_FRAME_IS_DIRTY) || (childState & NS_FRAME_HAS_DIRTY_CHILDREN);
|
||||||
|
|
||||||
|
} break;
|
||||||
|
|
||||||
|
// if the a resize reflow then it doesn't need to be reflowed. Only if the size is different
|
||||||
|
// from the new size would we actually do a reflow
|
||||||
|
case eReflowReason_Resize:
|
||||||
|
needsReflow = PR_FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// if its an initial reflow we must place the child.
|
||||||
|
// otherwise we might think it was already placed when it wasn't
|
||||||
|
case eReflowReason_Initial:
|
||||||
|
aMoveFrame = PR_TRUE;
|
||||||
|
needsReflow = PR_TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
needsReflow = PR_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//nsMargin margin(0,0,0,0);
|
||||||
|
// GetMargin(margin);
|
||||||
|
|
||||||
|
// if we don't need a reflow then
|
||||||
|
// lets see if we are already that size. Yes? then don't even reflow. We are done.
|
||||||
|
if (!needsReflow) {
|
||||||
|
|
||||||
|
if (aWidth != NS_INTRINSICSIZE && aHeight != NS_INTRINSICSIZE) {
|
||||||
|
|
||||||
|
// if the new calculated size has a 0 width or a 0 height
|
||||||
|
if ((mLastSize.width == 0 || mLastSize.height == 0) && (aWidth == 0 || aHeight == 0)) {
|
||||||
|
needsReflow = PR_FALSE;
|
||||||
|
aDesiredSize.width = aWidth;
|
||||||
|
aDesiredSize.height = aHeight;
|
||||||
|
mFrame->SizeTo(aPresContext, aDesiredSize.width, aDesiredSize.height);
|
||||||
|
} else {
|
||||||
|
aDesiredSize.width = mLastSize.width;
|
||||||
|
aDesiredSize.height = mLastSize.height;
|
||||||
|
|
||||||
|
// remove the margin. The rect of our child does not include it but our calculated size does.
|
||||||
|
nscoord calcWidth = aWidth;
|
||||||
|
nscoord calcHeight = aHeight;
|
||||||
|
// don't reflow if we are already the right size
|
||||||
|
if (mLastSize.width == calcWidth && mLastSize.height == calcHeight)
|
||||||
|
needsReflow = PR_FALSE;
|
||||||
|
else
|
||||||
|
needsReflow = PR_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// if the width or height are intrinsic alway reflow because
|
||||||
|
// we don't know what it should be.
|
||||||
|
needsReflow = PR_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok now reflow the child into the springs calculated space
|
||||||
|
if (needsReflow) {
|
||||||
|
|
||||||
|
nsMargin border(0,0,0,0);
|
||||||
|
GetBorderAndPadding(border);
|
||||||
|
|
||||||
|
|
||||||
|
aDesiredSize.width = 0;
|
||||||
|
aDesiredSize.height = 0;
|
||||||
|
|
||||||
|
nsSize size(aWidth, aHeight);
|
||||||
|
|
||||||
|
// create a reflow state to tell our child to flow at the given size.
|
||||||
|
|
||||||
|
#ifdef DEBUG_REFLOW
|
||||||
|
|
||||||
|
char* reflowReasonString;
|
||||||
|
|
||||||
|
switch(reason)
|
||||||
|
{
|
||||||
|
case eReflowReason_Initial:
|
||||||
|
reflowReasonString = "initial";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case eReflowReason_Resize:
|
||||||
|
reflowReasonString = "resize";
|
||||||
|
break;
|
||||||
|
case eReflowReason_Dirty:
|
||||||
|
reflowReasonString = "dirty";
|
||||||
|
break;
|
||||||
|
case eReflowReason_StyleChange:
|
||||||
|
reflowReasonString = "stylechange";
|
||||||
|
break;
|
||||||
|
case eReflowReason_Incremental:
|
||||||
|
reflowReasonString = "incremental";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reflowReasonString = "unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddIndents();
|
||||||
|
nsFrame::ListTag(stdout, childFrame);
|
||||||
|
char ch[100];
|
||||||
|
aReason.ToCString(ch,100);
|
||||||
|
|
||||||
|
printf(" reason=%s %s",reflowReasonString,ch);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
nsHTMLReflowState reflowState(aPresContext, aReflowState, mFrame, nsSize(size.width, NS_INTRINSICSIZE));
|
||||||
|
reflowState.reason = reason;
|
||||||
|
|
||||||
|
if (size.height != NS_INTRINSICSIZE) {
|
||||||
|
size.height -= (border.top + border.bottom);
|
||||||
|
NS_ASSERTION(size.height >= 0,"Error top bottom border too large");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size.width != NS_INTRINSICSIZE) {
|
||||||
|
size.width -= (border.left + border.right);
|
||||||
|
NS_ASSERTION(size.height >= 0,"Error left right border too large");
|
||||||
|
}
|
||||||
|
|
||||||
|
reflowState.mComputedWidth = size.width;
|
||||||
|
reflowState.mComputedHeight = size.height;
|
||||||
|
#ifdef DEBUG_REFLOW
|
||||||
|
printf(" Size=(%d,%d)\n",reflowState.mComputedWidth, reflowState.mComputedHeight);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// place the child and reflow
|
||||||
|
mFrame->WillReflow(aPresContext);
|
||||||
|
|
||||||
|
// if (aMoveFrame) {
|
||||||
|
// PlaceChild(aPresContext, mFrame, aX + margin.left, aY + margin.top);
|
||||||
|
// }
|
||||||
|
|
||||||
|
mFrame->Reflow(aPresContext, aDesiredSize, reflowState, aStatus);
|
||||||
|
|
||||||
|
NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status");
|
||||||
|
|
||||||
|
nsFrameState kidState;
|
||||||
|
mFrame->GetFrameState(&kidState);
|
||||||
|
|
||||||
|
// printf("width: %d, height: %d\n", aDesiredSize.mCombinedArea.width, aDesiredSize.mCombinedArea.height);
|
||||||
|
|
||||||
|
// XXX EDV hack to fix bug in block
|
||||||
|
//if (reflowState.reason != eReflowReason_Initial) {
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (kidState & NS_FRAME_OUTSIDE_CHILDREN) {
|
||||||
|
printf("OutsideChildren width=%d, height=%d\n", aDesiredSize.mOverflowArea.width, aDesiredSize.mOverflowArea.height);
|
||||||
|
|
||||||
|
if (aDesiredSize.mOverflowArea.width > aWidth)
|
||||||
|
{
|
||||||
|
reflowState.mComputedWidth = aDesiredSize.mOverflowArea.width - (border.left + border.right);
|
||||||
|
reflowState.availableWidth = reflowState.mComputedWidth;
|
||||||
|
//Reflow(aPresContext, aDesiredSize, aReflowState, aStatus, aX, aY, aDesiredSize.mOverflowArea.width, aHeight, aMoveFrame);
|
||||||
|
mFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
|
||||||
|
mFrame->WillReflow(aPresContext);
|
||||||
|
mFrame->Reflow(aPresContext, aDesiredSize, reflowState, aStatus);
|
||||||
|
mFrame->GetFrameState(&kidState);
|
||||||
|
if (kidState & NS_FRAME_OUTSIDE_CHILDREN)
|
||||||
|
aDesiredSize.height = aDesiredSize.mOverflowArea.height;
|
||||||
|
} else {
|
||||||
|
aDesiredSize.height = aDesiredSize.mOverflowArea.height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (kidState & NS_FRAME_OUTSIDE_CHILDREN) {
|
||||||
|
//printf("OutsideChildren width=%d, height=%d\n", aDesiredSize.mOverflowArea.width, aDesiredSize.mOverflowArea.height);
|
||||||
|
aDesiredSize.width = aDesiredSize.mOverflowArea.width;
|
||||||
|
if (aDesiredSize.width <= aWidth)
|
||||||
|
aDesiredSize.height = aDesiredSize.mOverflowArea.height;
|
||||||
|
else {
|
||||||
|
if (aDesiredSize.width > aWidth)
|
||||||
|
{
|
||||||
|
reflowState.mComputedWidth = aDesiredSize.width - (border.left + border.right);
|
||||||
|
reflowState.availableWidth = reflowState.mComputedWidth;
|
||||||
|
reflowState.reason = eReflowReason_Resize;
|
||||||
|
reflowState.reflowCommand = nsnull;
|
||||||
|
mFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
|
||||||
|
mFrame->WillReflow(aPresContext);
|
||||||
|
mFrame->Reflow(aPresContext, aDesiredSize, reflowState, aStatus);
|
||||||
|
mFrame->GetFrameState(&kidState);
|
||||||
|
if (kidState & NS_FRAME_OUTSIDE_CHILDREN)
|
||||||
|
aDesiredSize.height = aDesiredSize.mOverflowArea.height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ok we need the max ascent of the items on the line. So to do this
|
||||||
|
// ask the block for its line iterator. Get the max ascent.
|
||||||
|
nsILineIterator* lines = nsnull;
|
||||||
|
if (NS_SUCCEEDED(mFrame->QueryInterface(NS_GET_IID(nsILineIterator), (void**)&lines)) && lines)
|
||||||
|
{
|
||||||
|
nsIFrame* firstFrame = nsnull;
|
||||||
|
PRInt32 framesOnLine;
|
||||||
|
nsRect lineBounds;
|
||||||
|
PRUint32 lineFlags;
|
||||||
|
lines->GetLine(0, &firstFrame, &framesOnLine, lineBounds, &lineFlags);
|
||||||
|
|
||||||
|
if (firstFrame) {
|
||||||
|
nsRect rect(0,0,0,0);
|
||||||
|
firstFrame->GetRect(rect);
|
||||||
|
|
||||||
|
const nsStyleFont* font;
|
||||||
|
firstFrame->GetStyleData(eStyleStruct_Font,
|
||||||
|
(const nsStyleStruct*&) font);
|
||||||
|
nsIRenderingContext& rc = *aReflowState.rendContext;
|
||||||
|
rc.SetFont(font->mFont);
|
||||||
|
nsIFontMetrics* fm;
|
||||||
|
nsresult rv = rc.GetFontMetrics(fm);
|
||||||
|
if (NS_SUCCEEDED(rv) && (nsnull != fm)) {
|
||||||
|
fm->GetMaxAscent(aDesiredSize.ascent);
|
||||||
|
NS_RELEASE(fm);
|
||||||
|
}
|
||||||
|
rv = NS_OK;
|
||||||
|
aDesiredSize.ascent += rect.y;
|
||||||
|
|
||||||
|
/*
|
||||||
|
nsHTMLReflowMetrics d(nsnull);
|
||||||
|
nsHTMLReflowState lineReflowState(aPresContext, reflowState, firstFrame, nsSize(NS_INTRINSICSIZE, NS_INTRINSICSIZE));
|
||||||
|
lineReflowState.mComputedWidth = rect.width - (lineReflowState.mComputedBorderPadding.left + lineReflowState.mComputedBorderPadding.right);
|
||||||
|
lineReflowState.mComputedHeight = NS_INTRINSICSIZE;
|
||||||
|
reason = eReflowReason_Resize;
|
||||||
|
firstFrame->WillReflow(aPresContext);
|
||||||
|
firstFrame->Reflow(aPresContext, d, lineReflowState, aStatus);
|
||||||
|
aDesiredSize.ascent = d.ascent + rect.y + border.top;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// look at the first child
|
||||||
|
/*
|
||||||
|
const nsStyleFont* font;
|
||||||
|
firstFrame->GetStyleData(eStyleStruct_Font,
|
||||||
|
(const nsStyleStruct*&) font);
|
||||||
|
nsIRenderingContext& rc = *aReflowState.mReflowState.rendContext;
|
||||||
|
rc.SetFont(font->mFont);
|
||||||
|
nsIFontMetrics* fm;
|
||||||
|
rv = rc.GetFontMetrics(fm);
|
||||||
|
if (NS_SUCCEEDED(rv) && (nsnull != fm)) {
|
||||||
|
fm->GetMaxAscent(aDesiredSize.ascent);
|
||||||
|
NS_RELEASE(fm);
|
||||||
|
}
|
||||||
|
rv = NS_OK;
|
||||||
|
|
||||||
|
|
||||||
|
// add top border and padding to the ascent
|
||||||
|
nsRect rect(0,0,0,0);
|
||||||
|
firstFrame->GetRect(&rect);
|
||||||
|
|
||||||
|
// now our max ascent is acent + the y offset of the the first child
|
||||||
|
aDesiredSize.ascent += rect.y;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
PRBool changedSize = PR_FALSE;
|
||||||
|
|
||||||
|
if (mLastSize.width != aDesiredSize.width || mLastSize.height != aDesiredSize.height)
|
||||||
|
changedSize = PR_TRUE;
|
||||||
|
|
||||||
|
// if the child got bigger then make sure the new size in our min max range
|
||||||
|
if (changedSize) {
|
||||||
|
|
||||||
|
// redraw if we changed size.
|
||||||
|
//aRedraw = PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsContainerFrame::FinishReflowChild(mFrame, aPresContext, aDesiredSize, aX, aY, NS_FRAME_NO_MOVE_FRAME);
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
if (aMoveFrame) {
|
||||||
|
PlaceChild(aPresContext, mFrame, aX + margin.left, aY + margin.top);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the margin back in. The child should add its border automatically
|
||||||
|
//aDesiredSize.height += (margin.top + margin.bottom);
|
||||||
|
//aDesiredSize.width += (margin.left + margin.right);
|
||||||
|
|
||||||
|
#ifdef DEBUG_REFLOW
|
||||||
|
if (aHeight != NS_INTRINSICSIZE && aDesiredSize.height != aHeight)
|
||||||
|
{
|
||||||
|
AddIndents();
|
||||||
|
printf("**** Child ");
|
||||||
|
nsFrame::ListTag(stdout, childFrame);
|
||||||
|
printf(" got taller!******\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
if (aWidth != NS_INTRINSICSIZE && aDesiredSize.width != aWidth)
|
||||||
|
{
|
||||||
|
AddIndents();
|
||||||
|
printf("**** Child ");
|
||||||
|
nsFrame::ListTag(stdout, childFrame);
|
||||||
|
printf(" got wider!******\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (aWidth == NS_INTRINSICSIZE)
|
||||||
|
aWidth = aDesiredSize.width;
|
||||||
|
|
||||||
|
if (aHeight == NS_INTRINSICSIZE)
|
||||||
|
aHeight = aDesiredSize.height;
|
||||||
|
|
||||||
|
mLastSize.width = aDesiredSize.width;
|
||||||
|
mLastSize.height = aDesiredSize.height;
|
||||||
|
|
||||||
|
if (aDesiredSize.width > aWidth && mMinWidth != aDesiredSize.width) {
|
||||||
|
mMinWidth = aDesiredSize.width;
|
||||||
|
SizeNeedsRecalc(mMinSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
nsBoxToBlockAdaptor::PlaceChild(nsIPresContext* aPresContext, nsIFrame* aFrame, nscoord aX, nscoord aY)
|
||||||
|
{
|
||||||
|
nsPoint curOrigin;
|
||||||
|
aFrame->GetOrigin(curOrigin);
|
||||||
|
|
||||||
|
// only if the origin changed
|
||||||
|
if ((curOrigin.x != aX) || (curOrigin.y != aY)) {
|
||||||
|
aFrame->MoveTo(aPresContext, aX, aY);
|
||||||
|
|
||||||
|
nsIView* view;
|
||||||
|
aFrame->GetView(aPresContext, &view);
|
||||||
|
if (view) {
|
||||||
|
nsContainerFrame::PositionFrameView(aPresContext, aFrame, view);
|
||||||
|
} else
|
||||||
|
nsContainerFrame::PositionChildViews(aPresContext, aFrame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void
|
||||||
|
nsBoxToBlockAdaptor::BuildReflowChain(nsIFrame* aFrame, nsIFrame* aTargetParent, const nsHTMLReflowState& aRoot, nsHTMLReflowState& aState)
|
||||||
|
{
|
||||||
|
nsIFrame* parent;
|
||||||
|
aFrame->GetParent(parent);
|
||||||
|
|
||||||
|
if (aFrame != aTargetParent)
|
||||||
|
{
|
||||||
|
BuildReflowChain(parent, aTargetFrame, aRoot, aState);
|
||||||
|
nsHTMLReflowState state(aPresContext, aRoot, aFrame, nsSize(NS_INTRINSICSIZE, NS_INTRINSICSIZE));
|
||||||
|
aRoot = state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
PRBool
|
||||||
|
nsBoxToBlockAdaptor::GetWasCollapsed(nsBoxLayoutState& aBoxLayoutState)
|
||||||
|
{
|
||||||
|
return mWasCollapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsBoxToBlockAdaptor::SetWasCollapsed(nsBoxLayoutState& aBoxLayoutState, PRBool aCollapsed)
|
||||||
|
{
|
||||||
|
mWasCollapsed = aCollapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP_(nsrefcnt)
|
||||||
|
nsBoxToBlockAdaptor::AddRef(void)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP_(nsrefcnt)
|
||||||
|
nsBoxToBlockAdaptor::Release(void)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// QueryInterface
|
||||||
|
//
|
||||||
|
NS_INTERFACE_MAP_BEGIN(nsBoxToBlockAdaptor)
|
||||||
|
NS_INTERFACE_MAP_ENTRY(nsIBoxToBlockAdaptor)
|
||||||
|
NS_INTERFACE_MAP_END_INHERITING(nsBox)
|
||||||
|
|
||||||
89
layout/xul/base/src/nsBoxToBlockAdaptor.h
Normal file
89
layout/xul/base/src/nsBoxToBlockAdaptor.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Author:
|
||||||
|
* Eric D Vaughan
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsBoxToBlockAdaptor_h___
|
||||||
|
#define nsBoxToBlockAdaptor_h___
|
||||||
|
|
||||||
|
#include "nsIBoxToBlockAdaptor.h"
|
||||||
|
#include "nsBox.h"
|
||||||
|
class nsSpaceManager;
|
||||||
|
|
||||||
|
class nsBoxToBlockAdaptor : public nsBox, nsIBoxToBlockAdaptor {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetFlex(nsBoxLayoutState& aBoxLayoutState, nscoord& aFlex);
|
||||||
|
NS_IMETHOD GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
NS_IMETHOD IsCollapsed(nsBoxLayoutState& aBoxLayoutState, PRBool& aCollapsed);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD GetFrame(nsIFrame** aFrame);
|
||||||
|
NS_IMETHOD NeedsRecalc();
|
||||||
|
|
||||||
|
NS_IMETHOD Recycle(nsIPresShell* aPresShell);
|
||||||
|
|
||||||
|
void* operator new(size_t sz, nsIPresShell* aPresShell);
|
||||||
|
void operator delete(void* aPtr, size_t sz);
|
||||||
|
|
||||||
|
|
||||||
|
nsBoxToBlockAdaptor(nsIPresShell* aShell, nsIFrame* aFrame);
|
||||||
|
~nsBoxToBlockAdaptor();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual PRBool GetWasCollapsed(nsBoxLayoutState& aState);
|
||||||
|
virtual void SetWasCollapsed(nsBoxLayoutState& aState, PRBool aWas);
|
||||||
|
|
||||||
|
virtual nsresult Reflow(nsIPresContext* aPresContext,
|
||||||
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
|
const nsHTMLReflowState& aReflowState,
|
||||||
|
nsReflowStatus& aStatus,
|
||||||
|
nscoord aX,
|
||||||
|
nscoord aY,
|
||||||
|
nscoord aWidth,
|
||||||
|
nscoord aHeight,
|
||||||
|
PRBool aMoveFrame = PR_TRUE);
|
||||||
|
|
||||||
|
virtual void PlaceChild(nsIPresContext* aPresContext, nsIFrame* aFrame, nscoord aX, nscoord aY);
|
||||||
|
|
||||||
|
nsIFrame* mFrame;
|
||||||
|
nsSize mPrefSize;
|
||||||
|
nsSize mMinSize;
|
||||||
|
nsSize mMaxSize;
|
||||||
|
nscoord mFlex;
|
||||||
|
nscoord mAscent;
|
||||||
|
PRBool mPrefNeedsRecalc;
|
||||||
|
nsSpaceManager* mSpaceManager;
|
||||||
|
nsSize mLastSize;
|
||||||
|
nscoord mMinWidth;
|
||||||
|
PRBool mWasCollapsed;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "nsXULButtonFrame.h"
|
#include "nsButtonBoxFrame.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsIDOMXULDocument.h"
|
#include "nsIDOMXULDocument.h"
|
||||||
@@ -36,13 +36,13 @@
|
|||||||
// Creates a new Button frame and returns it in |aNewFrame|
|
// Creates a new Button frame and returns it in |aNewFrame|
|
||||||
//
|
//
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewXULButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
NS_NewButtonBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsXULButtonFrame* it = new (aPresShell) nsXULButtonFrame(aPresShell);
|
nsButtonBoxFrame* it = new (aPresShell) nsButtonBoxFrame(aPresShell);
|
||||||
if (nsnull == it)
|
if (nsnull == it)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
@@ -52,11 +52,11 @@ NS_NewXULButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
|
|
||||||
} // NS_NewXULButtonFrame
|
} // NS_NewXULButtonFrame
|
||||||
|
|
||||||
nsXULButtonFrame::nsXULButtonFrame(nsIPresShell* aPresShell)
|
nsButtonBoxFrame::nsButtonBoxFrame(nsIPresShell* aPresShell)
|
||||||
:nsBoxFrame(aPresShell, PR_FALSE)
|
:nsBoxFrame(aPresShell, PR_FALSE)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
NS_IMETHODIMP nsXULButtonFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
NS_IMETHODIMP nsButtonBoxFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
const nsPoint& aPoint,
|
const nsPoint& aPoint,
|
||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
nsIFrame** aFrame)
|
nsIFrame** aFrame)
|
||||||
@@ -66,7 +66,7 @@ NS_IMETHODIMP nsXULButtonFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXULButtonFrame::HandleEvent(nsIPresContext* aPresContext,
|
nsButtonBoxFrame::HandleEvent(nsIPresContext* aPresContext,
|
||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus* aEventStatus)
|
nsEventStatus* aEventStatus)
|
||||||
{
|
{
|
||||||
@@ -89,7 +89,7 @@ nsXULButtonFrame::HandleEvent(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsXULButtonFrame::MouseClicked (nsIPresContext* aPresContext)
|
nsButtonBoxFrame::MouseClicked (nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// Execute the oncommand event handler.
|
// Execute the oncommand event handler.
|
||||||
nsEventStatus status = nsEventStatus_eIgnore;
|
nsEventStatus status = nsEventStatus_eIgnore;
|
||||||
@@ -21,17 +21,17 @@
|
|||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
#ifndef nsXULButtonFrame_h___
|
#ifndef nsButtonBoxFrame_h___
|
||||||
#define nsXULButtonFrame_h___
|
#define nsButtonBoxFrame_h___
|
||||||
|
|
||||||
#include "nsBoxFrame.h"
|
#include "nsBoxFrame.h"
|
||||||
|
|
||||||
class nsXULButtonFrame : public nsBoxFrame
|
class nsButtonBoxFrame : public nsBoxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
friend nsresult NS_NewXULButtonFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
friend nsresult NS_NewButtonBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
nsXULButtonFrame(nsIPresShell* aPresShell);
|
nsButtonBoxFrame(nsIPresShell* aPresShell);
|
||||||
|
|
||||||
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
const nsPoint& aPoint,
|
const nsPoint& aPoint,
|
||||||
@@ -45,6 +45,6 @@ public:
|
|||||||
virtual void MouseClicked (nsIPresContext* aPresContext);
|
virtual void MouseClicked (nsIPresContext* aPresContext);
|
||||||
|
|
||||||
|
|
||||||
}; // class nsXULButtonFrame
|
}; // class nsButtonBoxFrame
|
||||||
|
|
||||||
#endif /* nsXULButtonFrame_h___ */
|
#endif /* nsButtonBoxFrame_h___ */
|
||||||
@@ -17,12 +17,10 @@
|
|||||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
* Rights Reserved.
|
* Rights Reserved.
|
||||||
*
|
*
|
||||||
* Original Author: David W. Hyatt (hyatt@netscape.com)
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "nsXULCheckboxFrame.h"
|
#include "nsCheckBoxFrame.h"
|
||||||
#include "nsIDOMXULCheckboxElement.h"
|
#include "nsIDOMXULCheckboxElement.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsIDOMXULRadioElement.h"
|
#include "nsIDOMXULRadioElement.h"
|
||||||
@@ -34,27 +32,31 @@
|
|||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// NS_NewXULCheckboxFrame
|
// NS_NewCheckBoxFrame
|
||||||
//
|
//
|
||||||
// Creates a new checkbox frame and returns it in |aNewFrame|
|
// Creates a new checkbox frame and returns it in |aNewFrame|
|
||||||
//
|
//
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewXULCheckboxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
NS_NewCheckBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsXULCheckboxFrame* it = new (aPresShell) nsXULCheckboxFrame(aPresShell);
|
nsCheckBoxFrame* it = new (aPresShell) nsCheckBoxFrame (aPresShell);
|
||||||
if (nsnull == it)
|
if (nsnull == it)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
// it->SetFlags(aFlags);
|
|
||||||
*aNewFrame = it;
|
*aNewFrame = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
} // NS_NewXULCheckboxFrame
|
} // NS_NewCheckBoxFrame
|
||||||
|
|
||||||
nsXULCheckboxFrame::nsXULCheckboxFrame(nsIPresShell* aPresShell)
|
PRIntn nsCheckBoxFrame::GetDefaultAlignment()
|
||||||
:nsXULButtonFrame(aPresShell)
|
{
|
||||||
{}
|
return NS_SIDE_LEFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsCheckBoxFrame::nsCheckBoxFrame(nsIPresShell* aPresShell):nsButtonBoxFrame(aPresShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -17,22 +17,23 @@
|
|||||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
* Rights Reserved.
|
* Rights Reserved.
|
||||||
*
|
*
|
||||||
* Original Author: David W. Hyatt (hyatt@netscape.com)
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
#ifndef nsXULCheckboxFrame_h___
|
#ifndef nsCheckBoxFrame_h___
|
||||||
#define nsXULCheckboxFrame_h___
|
#define nsCheckBoxFrame_h___
|
||||||
|
|
||||||
#include "nsXULButtonFrame.h"
|
#include "nsButtonBoxFrame.h"
|
||||||
|
|
||||||
class nsXULCheckboxFrame : public nsXULButtonFrame
|
class nsCheckBoxFrame : public nsButtonBoxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsXULCheckboxFrame(nsIPresShell* aPresShell);
|
|
||||||
|
|
||||||
friend nsresult NS_NewXULCheckboxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
friend nsresult NS_NewCheckBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
}; // class nsXULCheckboxFrame
|
PRIntn GetDefaultAlignment();
|
||||||
|
|
||||||
#endif /* nsXULCheckboxFrame_h___ */
|
nsCheckBoxFrame(nsIPresShell* aPresShell);
|
||||||
|
|
||||||
|
}; // class nsCheckBoxFrame
|
||||||
|
|
||||||
|
#endif /* nsCheckBoxFrame_h___ */
|
||||||
@@ -36,6 +36,7 @@
|
|||||||
#include "nsIServiceManager.h"
|
#include "nsIServiceManager.h"
|
||||||
#include "nsStdColorPicker.h"
|
#include "nsStdColorPicker.h"
|
||||||
#include "nsColorPickerCID.h"
|
#include "nsColorPickerCID.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
//
|
//
|
||||||
// NS_NewColorPickerFrame
|
// NS_NewColorPickerFrame
|
||||||
//
|
//
|
||||||
@@ -48,7 +49,7 @@ NS_NewColorPickerFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame)
|
|||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsColorPickerFrame* it = new (aPresShell) nsColorPickerFrame;
|
nsColorPickerFrame* it = new (aPresShell) nsColorPickerFrame (aPresShell);
|
||||||
if ( !it )
|
if ( !it )
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
*aNewFrame = it;
|
*aNewFrame = it;
|
||||||
@@ -60,10 +61,6 @@ NS_NewColorPickerFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame)
|
|||||||
//
|
//
|
||||||
// nsColorPickerFrame cntr
|
// nsColorPickerFrame cntr
|
||||||
//
|
//
|
||||||
nsColorPickerFrame::nsColorPickerFrame()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
nsColorPickerFrame::~nsColorPickerFrame()
|
nsColorPickerFrame::~nsColorPickerFrame()
|
||||||
{
|
{
|
||||||
@@ -192,6 +189,28 @@ nsColorPickerFrame::Paint(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsColorPickerFrame::GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
float p2t;
|
||||||
|
|
||||||
|
nsIPresContext* presContext = aBoxLayoutState.GetPresContext();
|
||||||
|
|
||||||
|
presContext->GetScaledPixelsToTwips(&p2t);
|
||||||
|
|
||||||
|
nsSize pixelSize(0,0);
|
||||||
|
mColorPicker->GetSize(&pixelSize.width, &pixelSize.height);
|
||||||
|
|
||||||
|
aSize.width = nscoord(pixelSize.width * p2t);
|
||||||
|
aSize.height = nscoord(pixelSize.height * p2t);
|
||||||
|
|
||||||
|
AddBorderAndPadding(aSize);
|
||||||
|
AddInset(aSize);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
//
|
//
|
||||||
// GetDesiredSize
|
// GetDesiredSize
|
||||||
//
|
//
|
||||||
@@ -202,34 +221,6 @@ nsColorPickerFrame::GetDesiredSize(nsIPresContext* aPresContext,
|
|||||||
const nsHTMLReflowState& aReflowState,
|
const nsHTMLReflowState& aReflowState,
|
||||||
nsHTMLReflowMetrics& aDesiredSize)
|
nsHTMLReflowMetrics& aDesiredSize)
|
||||||
{
|
{
|
||||||
float p2t;
|
|
||||||
|
|
||||||
aPresContext->GetScaledPixelsToTwips(&p2t);
|
|
||||||
|
|
||||||
|
|
||||||
// if the width is set use it
|
|
||||||
if (NS_INTRINSICSIZE != aReflowState.mComputedWidth)
|
|
||||||
aDesiredSize.width = aReflowState.mComputedWidth;
|
|
||||||
else
|
|
||||||
aDesiredSize.width = -1;
|
|
||||||
|
|
||||||
// if the height is set use it
|
|
||||||
if (NS_INTRINSICSIZE != aReflowState.mComputedHeight)
|
|
||||||
aDesiredSize.height = aReflowState.mComputedHeight;
|
|
||||||
else
|
|
||||||
aDesiredSize.height = -1;
|
|
||||||
|
|
||||||
mColorPicker->SetSize((aDesiredSize.width == -1) ? -1 : PRInt32(aDesiredSize.width/p2t),
|
|
||||||
(aDesiredSize.height == -1) ? -1 : PRInt32(aDesiredSize.height/p2t));
|
|
||||||
|
|
||||||
|
|
||||||
int width, height;
|
|
||||||
|
|
||||||
mColorPicker->GetSize(&width, &height);
|
|
||||||
|
|
||||||
aDesiredSize.width = nscoord(width * p2t);
|
|
||||||
aDesiredSize.height = nscoord(height * p2t);
|
|
||||||
aDesiredSize.ascent = nscoord(height * p2t);
|
|
||||||
aDesiredSize.descent = 0;
|
|
||||||
|
|
||||||
} // GetDesiredSize
|
} // GetDesiredSize
|
||||||
|
*/
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
#define nsColorPickerFrame_h__
|
#define nsColorPickerFrame_h__
|
||||||
|
|
||||||
|
|
||||||
#include "nsLeafFrame.h"
|
#include "nsLeafBoxFrame.h"
|
||||||
#include "prtypes.h"
|
#include "prtypes.h"
|
||||||
#include "nsIAtom.h"
|
#include "nsIAtom.h"
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
@@ -40,12 +40,15 @@ class nsString;
|
|||||||
nsresult NS_NewColorPickerFrame(nsIPresShell* aPresShell, nsIFrame** aResult) ;
|
nsresult NS_NewColorPickerFrame(nsIPresShell* aPresShell, nsIFrame** aResult) ;
|
||||||
|
|
||||||
|
|
||||||
class nsColorPickerFrame : public nsLeafFrame
|
class nsColorPickerFrame : public nsLeafBoxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsColorPickerFrame();
|
nsColorPickerFrame(nsIPresShell* aShell):nsLeafBoxFrame(aShell) {}
|
||||||
virtual ~nsColorPickerFrame();
|
virtual ~nsColorPickerFrame();
|
||||||
|
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
nsIFrame* aParent,
|
nsIFrame* aParent,
|
||||||
@@ -72,10 +75,6 @@ public:
|
|||||||
nsFramePaintLayer aWhichLayer);
|
nsFramePaintLayer aWhichLayer);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void GetDesiredSize(nsIPresContext* aPresContext,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize) ;
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
nsIColorPicker *mColorPicker;
|
nsIColorPicker *mColorPicker;
|
||||||
|
|||||||
536
layout/xul/base/src/nsContainerBox.cpp
Normal file
536
layout/xul/base/src/nsContainerBox.cpp
Normal file
@@ -0,0 +1,536 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Pierre Phaneuf <pp@ludusdesign.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Eric Vaughan
|
||||||
|
// Netscape Communications
|
||||||
|
//
|
||||||
|
// See documentation in associated header file
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
#include "nsBox.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsIView.h"
|
||||||
|
#include "nsIPresShell.h"
|
||||||
|
#include "nsHTMLContainerFrame.h"
|
||||||
|
#include "nsBoxToBlockAdaptor.h"
|
||||||
|
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
#include "nsBoxFrame.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsHTMLIIDs.h"
|
||||||
|
#include "nsUnitConversion.h"
|
||||||
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
#include "nsXULAtoms.h"
|
||||||
|
#include "nsIReflowCommand.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsSpaceManager.h"
|
||||||
|
#include "nsHTMLParts.h"
|
||||||
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsIView.h"
|
||||||
|
#include "nsIPresShell.h"
|
||||||
|
#include "nsGenericHTMLElement.h"
|
||||||
|
#include "nsFrameNavigator.h"
|
||||||
|
#include "nsCSSRendering.h"
|
||||||
|
#include "nsISelfScrollingFrame.h"
|
||||||
|
#include "nsIPref.h"
|
||||||
|
#include "nsIServiceManager.h"
|
||||||
|
|
||||||
|
#include "nsContainerBox.h"
|
||||||
|
|
||||||
|
nsContainerBox::nsContainerBox(nsIPresShell* aShell):nsBox(aShell)
|
||||||
|
{
|
||||||
|
mFirstChild = nsnull;
|
||||||
|
mLastChild = nsnull;
|
||||||
|
mChildCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsContainerBox::GetChildBox(nsIBox** aBox)
|
||||||
|
{
|
||||||
|
*aBox = mFirstChild;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32
|
||||||
|
nsContainerBox::GetChildCount()
|
||||||
|
{
|
||||||
|
return mChildCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32
|
||||||
|
nsContainerBox::CreateBoxList(nsIPresShell* aPresShell, nsIFrame* aFrameList, nsIBox*& aFirst, nsIBox*& aLast)
|
||||||
|
{
|
||||||
|
PRInt32 count = 0;
|
||||||
|
if (aFrameList) {
|
||||||
|
nsIBox* ibox = nsnull;
|
||||||
|
if (NS_SUCCEEDED(aFrameList->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox)
|
||||||
|
aFirst = ibox;
|
||||||
|
else
|
||||||
|
aFirst = new (aPresShell) nsBoxToBlockAdaptor(aPresShell, aFrameList);
|
||||||
|
|
||||||
|
aFirst->SetParentBox(this);
|
||||||
|
|
||||||
|
count++;
|
||||||
|
aLast = aFirst;
|
||||||
|
aFrameList->GetNextSibling(&aFrameList);
|
||||||
|
nsIBox* last = aLast;
|
||||||
|
|
||||||
|
while(aFrameList) {
|
||||||
|
|
||||||
|
if (NS_SUCCEEDED(aFrameList->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox)
|
||||||
|
aLast = ibox;
|
||||||
|
else
|
||||||
|
aLast = new (aPresShell) nsBoxToBlockAdaptor(aPresShell, aFrameList);
|
||||||
|
|
||||||
|
aLast->SetParentBox(this);
|
||||||
|
|
||||||
|
last->SetNextBox(aLast);
|
||||||
|
last = aLast;
|
||||||
|
aFrameList->GetNextSibling(&aFrameList);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIBox*
|
||||||
|
nsContainerBox::GetPrevious(nsIFrame* aFrame)
|
||||||
|
{
|
||||||
|
if (aFrame == nsnull)
|
||||||
|
return nsnull;
|
||||||
|
|
||||||
|
// find the frame to remove
|
||||||
|
nsIBox* box = mFirstChild;
|
||||||
|
nsIBox* prev = nsnull;
|
||||||
|
while (box)
|
||||||
|
{
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
box->GetFrame(&frame);
|
||||||
|
if (frame == aFrame) {
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev = box;
|
||||||
|
box->GetNextBox(&box);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIBox*
|
||||||
|
nsContainerBox::GetBox(nsIFrame* aFrame)
|
||||||
|
{
|
||||||
|
if (aFrame == nsnull)
|
||||||
|
return nsnull;
|
||||||
|
|
||||||
|
// recycle adaptors
|
||||||
|
// nsIBox* ibox = nsnull;
|
||||||
|
|
||||||
|
// if (NS_SUCCEEDED(aFrame->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox)
|
||||||
|
// return ibox;
|
||||||
|
|
||||||
|
// find the frame to remove
|
||||||
|
nsIBox* box = mFirstChild;
|
||||||
|
while (box)
|
||||||
|
{
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
box->GetFrame(&frame);
|
||||||
|
|
||||||
|
if (frame == aFrame) {
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
box->GetNextBox(&box);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIBox*
|
||||||
|
nsContainerBox::GetBoxAt(PRInt32 aIndex)
|
||||||
|
{
|
||||||
|
// find the frame to remove
|
||||||
|
nsIBox* child = mFirstChild;
|
||||||
|
PRInt32 count = 0;
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
if (count == aIndex) {
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
|
||||||
|
child->GetNextBox(&child);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32
|
||||||
|
nsContainerBox::GetIndexOf(nsIBox* aBox)
|
||||||
|
{
|
||||||
|
// find the frame to remove
|
||||||
|
nsIBox* child = mFirstChild;
|
||||||
|
PRInt32 count = 0;
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
if (aBox == child) {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
child->GetNextBox(&child);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::Remove(nsIPresShell* aShell, nsIFrame* aFrame)
|
||||||
|
{
|
||||||
|
// get the info before the frame
|
||||||
|
nsIBox* prevBox = GetPrevious(aFrame);
|
||||||
|
RemoveAfter(aShell, prevBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::Insert(nsIPresShell* aShell, nsIFrame* aPrevFrame, nsIFrame* aFrameList)
|
||||||
|
{
|
||||||
|
nsIBox* prevBox = GetBox(aPrevFrame);
|
||||||
|
//NS_ASSERTION(aPrevFrame == nsnull || prevBox,"Error! The previous frame given is not in our list!");
|
||||||
|
|
||||||
|
// find the frame before this one
|
||||||
|
// if no previous frame then we are inserting in front
|
||||||
|
if (prevBox == nsnull) {
|
||||||
|
// prepend them
|
||||||
|
Prepend(aShell, aFrameList);
|
||||||
|
} else {
|
||||||
|
// insert insert after previous info
|
||||||
|
InsertAfter(aShell, prevBox, aFrameList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::RemoveAfter(nsIPresShell* aPresShell, nsIBox* aPrevious)
|
||||||
|
{
|
||||||
|
nsIBox* toDelete = nsnull;
|
||||||
|
|
||||||
|
if (aPrevious == nsnull)
|
||||||
|
{
|
||||||
|
NS_ASSERTION(mFirstChild,"Can't find first child");
|
||||||
|
toDelete = mFirstChild;
|
||||||
|
if (mLastChild == mFirstChild) {
|
||||||
|
nsIBox* next = nsnull;
|
||||||
|
mFirstChild->GetNextBox(&next);
|
||||||
|
mLastChild = next;
|
||||||
|
}
|
||||||
|
mFirstChild->GetNextBox(&mFirstChild);
|
||||||
|
} else {
|
||||||
|
aPrevious->GetNextBox(&toDelete);
|
||||||
|
NS_ASSERTION(toDelete,"Can't find child to delete");
|
||||||
|
|
||||||
|
nsIBox* next = nsnull;
|
||||||
|
toDelete->GetNextBox(&next);
|
||||||
|
aPrevious->SetNextBox(next);
|
||||||
|
|
||||||
|
if (mLastChild == toDelete)
|
||||||
|
mLastChild = aPrevious;
|
||||||
|
}
|
||||||
|
|
||||||
|
// recycle adaptors
|
||||||
|
nsIBoxToBlockAdaptor* adaptor = nsnull;
|
||||||
|
|
||||||
|
if (NS_SUCCEEDED(toDelete->QueryInterface(NS_GET_IID(nsIBoxToBlockAdaptor), (void**)&adaptor)) && adaptor)
|
||||||
|
adaptor->Recycle(aPresShell);
|
||||||
|
|
||||||
|
mChildCount--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::ClearChildren(nsIPresShell* aShell)
|
||||||
|
{
|
||||||
|
nsIBox* box = mFirstChild;
|
||||||
|
while(box) {
|
||||||
|
nsIBox* it = box;
|
||||||
|
box->GetNextBox(&box);
|
||||||
|
// recycle adaptors
|
||||||
|
nsIBoxToBlockAdaptor* adaptor = nsnull;
|
||||||
|
|
||||||
|
if (NS_SUCCEEDED(it->QueryInterface(NS_GET_IID(nsIBoxToBlockAdaptor), (void**)&adaptor)) && adaptor)
|
||||||
|
adaptor->Recycle(aShell);
|
||||||
|
}
|
||||||
|
|
||||||
|
mFirstChild= nsnull;
|
||||||
|
mLastChild= nsnull;
|
||||||
|
mChildCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::Prepend(nsIPresShell* aPresShell, nsIFrame* aList)
|
||||||
|
{
|
||||||
|
nsIBox* first;
|
||||||
|
nsIBox* last;
|
||||||
|
mChildCount += CreateBoxList(aPresShell, aList, first, last);
|
||||||
|
if (!mFirstChild)
|
||||||
|
mFirstChild= mLastChild= first;
|
||||||
|
else {
|
||||||
|
last->SetNextBox(mFirstChild);
|
||||||
|
mFirstChild= first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::Append(nsIPresShell* aPresShell, nsIFrame* aList)
|
||||||
|
{
|
||||||
|
nsIBox* first;
|
||||||
|
nsIBox* last;
|
||||||
|
mChildCount += CreateBoxList(aPresShell, aList, first, last);
|
||||||
|
if (!mFirstChild)
|
||||||
|
mFirstChild= first;
|
||||||
|
else
|
||||||
|
mLastChild->SetNextBox(first);
|
||||||
|
|
||||||
|
mLastChild= last;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::InsertAfter(nsIPresShell* aPresShell, nsIBox* aPrev, nsIFrame* aList)
|
||||||
|
{
|
||||||
|
nsIBox* first = nsnull;
|
||||||
|
nsIBox* last = nsnull;
|
||||||
|
mChildCount += CreateBoxList(aPresShell, aList, first, last);
|
||||||
|
nsIBox* next = nsnull;
|
||||||
|
aPrev->GetNextBox(&next);
|
||||||
|
last->SetNextBox(next);
|
||||||
|
aPrev->SetNextBox(first);
|
||||||
|
if (aPrev == mLastChild)
|
||||||
|
mLastChild = last;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::InitChildren(nsIPresShell* aPresShell, nsIFrame* aList)
|
||||||
|
{
|
||||||
|
ClearChildren(aPresShell);
|
||||||
|
mChildCount += CreateBoxList(aPresShell, aList, mFirstChild, mLastChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::SetDebugOnChildList(nsBoxLayoutState& aState, nsIBox* aChild, PRBool aDebug)
|
||||||
|
{
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
GetChildBox(&child);
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
child->SetDebug(aState, aDebug);
|
||||||
|
child->GetNextBox(&child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsContainerBox::SanityCheck(nsFrameList& aFrameList)
|
||||||
|
{
|
||||||
|
// make sure the length match
|
||||||
|
PRInt32 length = aFrameList.GetLength();
|
||||||
|
NS_ASSERTION(length == mChildCount,"nsBox::ERROR!! Box info list count does not match frame count!!");
|
||||||
|
|
||||||
|
// make sure last makes sense
|
||||||
|
nsIBox* next = nsnull;
|
||||||
|
NS_ASSERTION(mLastChild == nsnull || (NS_SUCCEEDED(mLastChild->GetNextBox(&next)) && next == nsnull),"nsBox::ERROR!! The last child is not really the last!!!");
|
||||||
|
nsIFrame* child = aFrameList.FirstChild();
|
||||||
|
nsIBox* box = mFirstChild;
|
||||||
|
PRInt32 count = 0;
|
||||||
|
while(box)
|
||||||
|
{
|
||||||
|
NS_ASSERTION(count <= mChildCount,"too many children!!!");
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
nsIBox* parent = nsnull;
|
||||||
|
NS_ASSERTION(NS_SUCCEEDED(box->GetFrame(&frame)) && frame == child,"nsBox::ERROR!! box info list and child info lists don't match!!!");
|
||||||
|
NS_ASSERTION(NS_SUCCEEDED(box->GetParentBox(&parent)) && parent == this,"nsBox::ERROR!! parent's don't match!!!");
|
||||||
|
box->GetNextBox(&box);
|
||||||
|
child->GetNextSibling(&child);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsContainerBox::GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
aSize.width = 0;
|
||||||
|
aSize.height = 0;
|
||||||
|
|
||||||
|
// if the size was not completely redefined in CSS then ask our children
|
||||||
|
if (!nsIBox::AddCSSPrefSize(aBoxLayoutState, this, aSize))
|
||||||
|
{
|
||||||
|
aSize.width = 0;
|
||||||
|
aSize.height = 0;
|
||||||
|
|
||||||
|
if (mLayoutManager) {
|
||||||
|
rv = mLayoutManager->GetPrefSize(this, aBoxLayoutState, aSize);
|
||||||
|
nsIBox::AddCSSPrefSize(aBoxLayoutState, this, aSize);
|
||||||
|
} else
|
||||||
|
rv = nsBox::GetPrefSize(aBoxLayoutState, aSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsSize minSize(0,0);
|
||||||
|
nsSize maxSize(0,0);
|
||||||
|
GetMinSize(aBoxLayoutState, minSize);
|
||||||
|
GetMaxSize(aBoxLayoutState, maxSize);
|
||||||
|
|
||||||
|
BoundsCheck(minSize, aSize, maxSize);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsContainerBox::GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
aSize.width = 0;
|
||||||
|
aSize.height = 0;
|
||||||
|
|
||||||
|
// if the size was not completely redefined in CSS then ask our children
|
||||||
|
if (!nsIBox::AddCSSMinSize(aBoxLayoutState, this, aSize))
|
||||||
|
{
|
||||||
|
aSize.width = 0;
|
||||||
|
aSize.height = 0;
|
||||||
|
|
||||||
|
if (mLayoutManager) {
|
||||||
|
rv = mLayoutManager->GetMinSize(this, aBoxLayoutState, aSize);
|
||||||
|
nsIBox::AddCSSMinSize(aBoxLayoutState, this, aSize);
|
||||||
|
} else {
|
||||||
|
rv = nsBox::GetMinSize(aBoxLayoutState, aSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsContainerBox::GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
aSize.width = NS_INTRINSICSIZE;
|
||||||
|
aSize.height = NS_INTRINSICSIZE;
|
||||||
|
|
||||||
|
// if the size was not completely redefined in CSS then ask our children
|
||||||
|
if (!nsIBox::AddCSSMaxSize(aBoxLayoutState, this, aSize))
|
||||||
|
{
|
||||||
|
aSize.width = NS_INTRINSICSIZE;
|
||||||
|
aSize.height = NS_INTRINSICSIZE;
|
||||||
|
|
||||||
|
if (mLayoutManager) {
|
||||||
|
rv = mLayoutManager->GetMaxSize(this, aBoxLayoutState, aSize);
|
||||||
|
nsIBox::AddCSSMaxSize(aBoxLayoutState, this, aSize);
|
||||||
|
} else {
|
||||||
|
rv = nsBox::GetMaxSize(aBoxLayoutState, aSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsContainerBox::GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent)
|
||||||
|
{
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
aAscent = 0;
|
||||||
|
if (mLayoutManager)
|
||||||
|
rv = mLayoutManager->GetAscent(this, aBoxLayoutState, aAscent);
|
||||||
|
else
|
||||||
|
rv = nsBox::GetAscent(aBoxLayoutState, aAscent);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsContainerBox::Layout(nsBoxLayoutState& aBoxLayoutState)
|
||||||
|
{
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
|
||||||
|
if (mLayoutManager)
|
||||||
|
rv = mLayoutManager->Layout(this, aBoxLayoutState);
|
||||||
|
|
||||||
|
nsBox::Layout(aBoxLayoutState);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsContainerBox::SetLayoutManager(nsIBoxLayout* aLayout)
|
||||||
|
{
|
||||||
|
mLayoutManager = aLayout;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsContainerBox::GetLayoutManager(nsIBoxLayout** aLayout)
|
||||||
|
{
|
||||||
|
*aLayout = mLayoutManager;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsContainerBox::LayoutChildAt(nsBoxLayoutState& aState, nsIBox* aBox, const nsRect& aRect)
|
||||||
|
{
|
||||||
|
// get the current rect
|
||||||
|
nsRect oldRect(0,0,0,0);
|
||||||
|
aBox->GetBounds(oldRect);
|
||||||
|
aBox->SetBounds(aState, aRect);
|
||||||
|
|
||||||
|
PRBool dirty = PR_FALSE;
|
||||||
|
PRBool dirtyChildren = PR_FALSE;
|
||||||
|
aBox->IsDirty(dirty);
|
||||||
|
aBox->HasDirtyChildren(dirtyChildren);
|
||||||
|
|
||||||
|
PRBool layout = PR_TRUE;
|
||||||
|
if (!(dirty || dirtyChildren) && aState.GetLayoutReason() != nsBoxLayoutState::Initial)
|
||||||
|
layout = PR_FALSE;
|
||||||
|
|
||||||
|
if (layout || (oldRect.width != aRect.width || oldRect.height != aRect.height)) {
|
||||||
|
return aBox->Layout(aState);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
77
layout/xul/base/src/nsContainerBox.h
Normal file
77
layout/xul/base/src/nsContainerBox.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Author:
|
||||||
|
* Eric D Vaughan
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsContainerBox_h___
|
||||||
|
#define nsContainerBox_h___
|
||||||
|
|
||||||
|
#include "nsBox.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsIBoxLayout.h"
|
||||||
|
|
||||||
|
class nsContainerBox : public nsBox {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
NS_IMETHOD GetChildBox(nsIBox** aBox);
|
||||||
|
|
||||||
|
nsContainerBox(nsIPresShell* aShell);
|
||||||
|
|
||||||
|
NS_IMETHOD SetLayoutManager(nsIBoxLayout* aLayout);
|
||||||
|
NS_IMETHOD GetLayoutManager(nsIBoxLayout** aLayout);
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
|
||||||
|
virtual nsIBox* GetBoxAt(PRInt32 aIndex);
|
||||||
|
virtual nsIBox* GetBox(nsIFrame* aFrame);
|
||||||
|
virtual PRInt32 GetIndexOf(nsIBox* aBox);
|
||||||
|
virtual PRInt32 GetChildCount();
|
||||||
|
virtual void ClearChildren(nsIPresShell* aShell);
|
||||||
|
virtual PRInt32 CreateBoxList(nsIPresShell* aShell, nsIFrame* aList, nsIBox*& first, nsIBox*& last);
|
||||||
|
virtual void RemoveAfter(nsIPresShell* aShell, nsIBox* aPrev);
|
||||||
|
virtual void Remove(nsIPresShell* aShell, nsIFrame* aChild);
|
||||||
|
virtual void Prepend(nsIPresShell* aShell, nsIFrame* aList);
|
||||||
|
virtual void Append(nsIPresShell* aShell, nsIFrame* aList);
|
||||||
|
virtual void Insert(nsIPresShell* aShell, nsIFrame* aPrevFrame, nsIFrame* aList);
|
||||||
|
virtual void InsertAfter(nsIPresShell* aShell, nsIBox* aPrev, nsIFrame* aList);
|
||||||
|
virtual void InitChildren(nsIPresShell* aShell, nsIFrame* aList);
|
||||||
|
virtual nsIBox* GetPrevious(nsIFrame* aChild);
|
||||||
|
virtual void SanityCheck(nsFrameList& aFrameList);
|
||||||
|
virtual void SetDebugOnChildList(nsBoxLayoutState& aState, nsIBox* aChild, PRBool aDebug);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual nsresult LayoutChildAt(nsBoxLayoutState& aState, nsIBox* aBox, const nsRect& aRect);
|
||||||
|
|
||||||
|
nsIBox* mFirstChild;
|
||||||
|
nsIBox* mLastChild;
|
||||||
|
PRInt32 mChildCount;
|
||||||
|
nsCOMPtr<nsIBoxLayout> mLayoutManager;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -43,7 +43,8 @@
|
|||||||
#include "nsStyleChangeList.h"
|
#include "nsStyleChangeList.h"
|
||||||
#include "nsCSSRendering.h"
|
#include "nsCSSRendering.h"
|
||||||
#include "nsIViewManager.h"
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
#include "nsStackLayout.h"
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewDeckFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
NS_NewDeckFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
||||||
@@ -56,14 +57,21 @@ NS_NewDeckFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
if (nsnull == it)
|
if (nsnull == it)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
|
||||||
*aNewFrame = it;
|
*aNewFrame = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
} // NS_NewDeckFrame
|
} // NS_NewDeckFrame
|
||||||
|
|
||||||
|
|
||||||
nsDeckFrame::nsDeckFrame(nsIPresShell* aPresShell):nsStackFrame(aPresShell)
|
nsCOMPtr<nsIBoxLayout> nsDeckFrame::gLayout = nsnull;
|
||||||
|
|
||||||
|
nsDeckFrame::nsDeckFrame(nsIPresShell* aPresShell):nsBoxFrame(aPresShell)
|
||||||
{
|
{
|
||||||
|
if (!gLayout)
|
||||||
|
gLayout = new nsStackLayout(aPresShell);
|
||||||
|
|
||||||
|
SetLayoutManager(gLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
@@ -73,49 +81,14 @@ nsDeckFrame::AttributeChanged(nsIPresContext* aPresContext,
|
|||||||
nsIAtom* aAttribute,
|
nsIAtom* aAttribute,
|
||||||
PRInt32 aHint)
|
PRInt32 aHint)
|
||||||
{
|
{
|
||||||
nsresult rv = nsStackFrame::AttributeChanged(aPresContext, aChild,
|
nsresult rv = nsBoxFrame::AttributeChanged(aPresContext, aChild,
|
||||||
aNameSpaceID, aAttribute, aHint);
|
aNameSpaceID, aAttribute, aHint);
|
||||||
|
|
||||||
|
|
||||||
// if the index changed hide the old element and make the now element visible
|
// if the index changed hide the old element and make the now element visible
|
||||||
if (aAttribute == nsHTMLAtoms::index) {
|
if (aAttribute == nsHTMLAtoms::index) {
|
||||||
|
nsBoxLayoutState state(aPresContext);
|
||||||
Invalidate(aPresContext, nsRect(0,0,mRect.width,mRect.height), PR_FALSE);
|
MarkDirty(state);
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
// get the index attribute
|
|
||||||
nsAutoString value;
|
|
||||||
if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, nsHTMLAtoms::index, value))
|
|
||||||
{
|
|
||||||
PRInt32 error;
|
|
||||||
|
|
||||||
// convert it to an integer
|
|
||||||
index = value.ToInteger(&error);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsIFrame* childFrame = mFrames.FirstChild();
|
|
||||||
nscoord count = 0;
|
|
||||||
while (nsnull != childFrame)
|
|
||||||
{
|
|
||||||
// make collapsed children not show up
|
|
||||||
if (index != count)
|
|
||||||
CollapseChild(aPresContext, childFrame, PR_TRUE);
|
|
||||||
else
|
|
||||||
CollapseChild(aPresContext, childFrame, PR_FALSE);
|
|
||||||
|
|
||||||
rv = childFrame->GetNextSibling(&childFrame);
|
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (NS_OK != rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
@@ -154,11 +127,11 @@ nsDeckFrame::Paint(nsIPresContext* aPresContext,
|
|||||||
// if a tab is hidden all its children are too.
|
// if a tab is hidden all its children are too.
|
||||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
||||||
mStyleContext->GetStyleData(eStyleStruct_Display);
|
mStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
if (!disp->IsVisibleOrCollapsed())
|
if (!disp->mVisible)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) {
|
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) {
|
||||||
if (disp->IsVisibleOrCollapsed() && mRect.width && mRect.height) {
|
if (disp->IsVisible() && mRect.width && mRect.height) {
|
||||||
// Paint our background and border
|
// Paint our background and border
|
||||||
PRIntn skipSides = GetSkipSides();
|
PRIntn skipSides = GetSkipSides();
|
||||||
const nsStyleColor* color = (const nsStyleColor*)
|
const nsStyleColor* color = (const nsStyleColor*)
|
||||||
@@ -189,41 +162,30 @@ NS_IMETHODIMP nsDeckFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
nsIFrame** aFrame)
|
nsIFrame** aFrame)
|
||||||
{
|
{
|
||||||
|
// if it is not inside us fail
|
||||||
// If it's not in this frame, then it's not going to be in any
|
|
||||||
// children (since there cannot be overflowing children).
|
|
||||||
if (!mRect.Contains(aPoint)) {
|
if (!mRect.Contains(aPoint)) {
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if its not in our child just return us.
|
||||||
|
*aFrame = this;
|
||||||
|
|
||||||
// get the selected frame and see if the point is in it.
|
// get the selected frame and see if the point is in it.
|
||||||
nsIFrame* selectedFrame = GetSelectedFrame();
|
nsIFrame* selectedFrame = GetSelectedFrame();
|
||||||
|
nsPoint tmp;
|
||||||
|
tmp.MoveTo(aPoint.x - mRect.x, aPoint.y - mRect.y);
|
||||||
|
|
||||||
if (nsnull != selectedFrame)
|
if (nsnull != selectedFrame)
|
||||||
{
|
{
|
||||||
// adjust the point
|
return selectedFrame->GetFrameForPoint(aPresContext, tmp, aWhichLayer, aFrame);
|
||||||
nsPoint p = aPoint;
|
|
||||||
p.x -= mRect.x;
|
|
||||||
p.y -= mRect.y;
|
|
||||||
return selectedFrame->GetFrameForPoint(aPresContext, p, aWhichLayer, aFrame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aWhichLayer == NS_FRAME_PAINT_LAYER_BACKGROUND) {
|
|
||||||
// if its not in our child just return us.
|
|
||||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
|
||||||
mStyleContext->GetStyleData(eStyleStruct_Display);
|
|
||||||
if (disp->IsVisible()) {
|
|
||||||
*aFrame = this;
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDeckFrame::DidReflow(nsIPresContext* aPresContext,
|
nsDeckFrame::Layout(nsBoxLayoutState& aState)
|
||||||
nsDidReflowStatus aStatus)
|
|
||||||
{
|
{
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
|
||||||
@@ -237,21 +199,34 @@ nsDeckFrame::DidReflow(nsIPresContext* aPresContext,
|
|||||||
index = value.ToInteger(&error);
|
index = value.ToInteger(&error);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult rv = nsBoxFrame::DidReflow(aPresContext, aStatus);
|
nsIBox* box = nsnull;
|
||||||
NS_ASSERTION(rv == NS_OK,"DidReflow failed");
|
GetChildBox(&box);
|
||||||
|
|
||||||
nsIFrame* childFrame = mFrames.FirstChild();
|
|
||||||
nscoord count = 0;
|
nscoord count = 0;
|
||||||
while (nsnull != childFrame)
|
while (nsnull != box)
|
||||||
|
{
|
||||||
|
// make collapsed children not show up
|
||||||
|
if (index == count)
|
||||||
|
box->UnCollapse(aState);
|
||||||
|
|
||||||
|
nsresult rv2 = box->GetNextBox(&box);
|
||||||
|
NS_ASSERTION(rv2 == NS_OK,"failed to get next child");
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult rv = nsBoxFrame::Layout(aState);
|
||||||
|
|
||||||
|
GetChildBox(&box);
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
while (nsnull != box)
|
||||||
{
|
{
|
||||||
// make collapsed children not show up
|
// make collapsed children not show up
|
||||||
if (index != count)
|
if (index != count)
|
||||||
CollapseChild(aPresContext, childFrame, PR_TRUE);
|
box->Collapse(aState);
|
||||||
else
|
|
||||||
CollapseChild(aPresContext, childFrame, PR_FALSE);
|
|
||||||
|
|
||||||
rv = childFrame->GetNextSibling(&childFrame);
|
nsresult rv2 = box->GetNextBox(&box);
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
NS_ASSERTION(rv2 == NS_OK,"failed to get next child");
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,9 +31,9 @@
|
|||||||
#ifndef nsDeckFrame_h___
|
#ifndef nsDeckFrame_h___
|
||||||
#define nsDeckFrame_h___
|
#define nsDeckFrame_h___
|
||||||
|
|
||||||
#include "nsStackFrame.h"
|
#include "nsBoxFrame.h"
|
||||||
|
|
||||||
class nsDeckFrame : public nsStackFrame
|
class nsDeckFrame : public nsBoxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -47,8 +47,7 @@ public:
|
|||||||
nsIAtom* aAttribute,
|
nsIAtom* aAttribute,
|
||||||
PRInt32 aHint);
|
PRInt32 aHint);
|
||||||
|
|
||||||
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
NS_IMETHOD Layout(nsBoxLayoutState& aState);
|
||||||
nsDidReflowStatus aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -75,6 +74,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
static nsCOMPtr<nsIBoxLayout> gLayout;
|
||||||
nsIFrame* mSelected;
|
nsIFrame* mSelected;
|
||||||
|
|
||||||
}; // class nsDeckFrame
|
}; // class nsDeckFrame
|
||||||
|
|||||||
@@ -30,10 +30,14 @@
|
|||||||
#include "nsFrameNavigator.h"
|
#include "nsFrameNavigator.h"
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
|
#include "nsIBox.h"
|
||||||
|
|
||||||
nsIAtom*
|
nsIAtom*
|
||||||
nsFrameNavigator::GetTag(nsIFrame* frame)
|
nsFrameNavigator::GetTag(nsIBox* aBox)
|
||||||
{
|
{
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
aBox->GetFrame(&frame);
|
||||||
|
|
||||||
nsCOMPtr<nsIContent> content;
|
nsCOMPtr<nsIContent> content;
|
||||||
frame->GetContent(getter_AddRefs(content));
|
frame->GetContent(getter_AddRefs(content));
|
||||||
if (content) {
|
if (content) {
|
||||||
@@ -45,11 +49,11 @@ nsFrameNavigator::GetTag(nsIFrame* frame)
|
|||||||
return nsnull;
|
return nsnull;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIFrame*
|
nsIBox*
|
||||||
nsFrameNavigator::GetChildBeforeAfter(nsIPresContext* aPresContext, nsIFrame* start, PRBool before)
|
nsFrameNavigator::GetChildBeforeAfter(nsIPresContext* aPresContext, nsIBox* start, PRBool before)
|
||||||
{
|
{
|
||||||
nsIFrame* parent = nsnull;
|
nsIBox* parent = nsnull;
|
||||||
start->GetParent(&parent);
|
start->GetParentBox(&parent);
|
||||||
PRInt32 index = IndexOf(aPresContext, parent,start);
|
PRInt32 index = IndexOf(aPresContext, parent,start);
|
||||||
PRInt32 count = CountFrames(aPresContext, parent);
|
PRInt32 count = CountFrames(aPresContext, parent);
|
||||||
|
|
||||||
@@ -72,18 +76,18 @@ nsFrameNavigator::GetChildBeforeAfter(nsIPresContext* aPresContext, nsIFrame* st
|
|||||||
}
|
}
|
||||||
|
|
||||||
PRInt32
|
PRInt32
|
||||||
nsFrameNavigator::IndexOf(nsIPresContext* aPresContext, nsIFrame* parent, nsIFrame* child)
|
nsFrameNavigator::IndexOf(nsIPresContext* aPresContext, nsIBox* parent, nsIBox* child)
|
||||||
{
|
{
|
||||||
PRInt32 count = 0;
|
PRInt32 count = 0;
|
||||||
|
|
||||||
nsIFrame* childFrame;
|
nsIBox* box = nsnull;
|
||||||
parent->FirstChild(aPresContext, nsnull, &childFrame);
|
parent->GetChildBox(&box);
|
||||||
while (nsnull != childFrame)
|
while (nsnull != box)
|
||||||
{
|
{
|
||||||
if (childFrame == child)
|
if (box == child)
|
||||||
return count;
|
return count;
|
||||||
|
|
||||||
nsresult rv = childFrame->GetNextSibling(&childFrame);
|
nsresult rv = box->GetNextBox(&box);
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
@@ -92,15 +96,15 @@ nsFrameNavigator::IndexOf(nsIPresContext* aPresContext, nsIFrame* parent, nsIFra
|
|||||||
}
|
}
|
||||||
|
|
||||||
PRInt32
|
PRInt32
|
||||||
nsFrameNavigator::CountFrames(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
nsFrameNavigator::CountFrames(nsIPresContext* aPresContext, nsIBox* aBox)
|
||||||
{
|
{
|
||||||
PRInt32 count = 0;
|
PRInt32 count = 0;
|
||||||
|
|
||||||
nsIFrame* childFrame;
|
nsIBox* box;
|
||||||
aFrame->FirstChild(aPresContext, nsnull, &childFrame);
|
aBox->GetChildBox(&box);
|
||||||
while (nsnull != childFrame)
|
while (nsnull != box)
|
||||||
{
|
{
|
||||||
nsresult rv = childFrame->GetNextSibling(&childFrame);
|
nsresult rv = box->GetNextBox(&box);
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
@@ -108,19 +112,19 @@ nsFrameNavigator::CountFrames(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsIFrame*
|
nsIBox*
|
||||||
nsFrameNavigator::GetChildAt(nsIPresContext* aPresContext, nsIFrame* parent, PRInt32 index)
|
nsFrameNavigator::GetChildAt(nsIPresContext* aPresContext, nsIBox* parent, PRInt32 index)
|
||||||
{
|
{
|
||||||
PRInt32 count = 0;
|
PRInt32 count = 0;
|
||||||
|
|
||||||
nsIFrame* childFrame;
|
nsIBox* box;
|
||||||
parent->FirstChild(aPresContext, nsnull, &childFrame);
|
parent->GetChildBox(&box);
|
||||||
while (nsnull != childFrame)
|
while (nsnull != box)
|
||||||
{
|
{
|
||||||
if (count == index)
|
if (count == index)
|
||||||
return childFrame;
|
return box;
|
||||||
|
|
||||||
nsresult rv = childFrame->GetNextSibling(&childFrame);
|
nsresult rv = box->GetNextBox(&box);
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,16 +31,17 @@
|
|||||||
#define nsGrippyFrame_h___
|
#define nsGrippyFrame_h___
|
||||||
|
|
||||||
#include "nsIFrame.h"
|
#include "nsIFrame.h"
|
||||||
|
class nsIBox;
|
||||||
|
|
||||||
class nsFrameNavigator
|
class nsFrameNavigator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static nsIFrame* GetChildBeforeAfter(nsIPresContext* aPresContext, nsIFrame* start, PRBool before);
|
static nsIBox* GetChildBeforeAfter(nsIPresContext* aPresContext, nsIBox* start, PRBool before);
|
||||||
static nsIFrame* GetChildAt(nsIPresContext* aPresContext, nsIFrame* parent, PRInt32 index);
|
static nsIBox* GetChildAt(nsIPresContext* aPresContext, nsIBox* parent, PRInt32 index);
|
||||||
static PRInt32 IndexOf(nsIPresContext* aPresContext, nsIFrame* parent, nsIFrame* child);
|
static PRInt32 IndexOf(nsIPresContext* aPresContext, nsIBox* parent, nsIBox* child);
|
||||||
static PRInt32 CountFrames(nsIPresContext* aPresContext, nsIFrame* aFrame);
|
static PRInt32 CountFrames(nsIPresContext* aPresContext, nsIBox* aFrame);
|
||||||
static nsIAtom* GetTag(nsIFrame* frame);
|
static nsIAtom* GetTag(nsIBox* frame);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ NS_NewGrippyFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsGrippyFrame* it = new (aPresShell) nsGrippyFrame;
|
nsGrippyFrame* it = new (aPresShell) nsGrippyFrame (aPresShell);
|
||||||
if (nsnull == it)
|
if (nsnull == it)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ NS_NewGrippyFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
|
|
||||||
} // NS_NewGrippyFrame
|
} // NS_NewGrippyFrame
|
||||||
|
|
||||||
nsGrippyFrame::nsGrippyFrame():mCollapsed(PR_FALSE)
|
nsGrippyFrame::nsGrippyFrame(nsIPresShell* aShell):nsTitledButtonFrame(aShell),mCollapsed(PR_FALSE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public:
|
|||||||
static nsIFrame* GetChildAt(nsIPresContext* aPresContext, nsIFrame* parent, PRInt32 index);
|
static nsIFrame* GetChildAt(nsIPresContext* aPresContext, nsIFrame* parent, PRInt32 index);
|
||||||
static PRInt32 IndexOf(nsIPresContext* aPresContext, nsIFrame* parent, nsIFrame* child);
|
static PRInt32 IndexOf(nsIPresContext* aPresContext, nsIFrame* parent, nsIFrame* child);
|
||||||
static PRInt32 CountFrames(nsIPresContext* aPresContext, nsIFrame* aFrame);
|
static PRInt32 CountFrames(nsIPresContext* aPresContext, nsIFrame* aFrame);
|
||||||
nsGrippyFrame();
|
nsGrippyFrame(nsIPresShell* aShell);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void MouseClicked(nsIPresContext* aPresContext);
|
virtual void MouseClicked(nsIPresContext* aPresContext);
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ public:
|
|||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
nsIFrame* aChildList);
|
nsIFrame* aChildList);
|
||||||
|
|
||||||
|
NS_IMETHOD GetBorderAndPadding(nsMargin& aBorderAndPadding);
|
||||||
|
|
||||||
|
|
||||||
NS_METHOD Paint(nsIPresContext* aPresContext,
|
NS_METHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
@@ -81,11 +84,6 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
virtual PRBool GetInitialOrientation(PRBool& aHorizontal) { aHorizontal = PR_FALSE; return PR_TRUE; }
|
virtual PRBool GetInitialOrientation(PRBool& aHorizontal) { aHorizontal = PR_FALSE; return PR_TRUE; }
|
||||||
|
|
||||||
nsIFrame* GetTitleFrame(nsIPresContext* aPresContext, nsRect& aRect);
|
nsIFrame* GetTitleFrame(nsIPresContext* aPresContext, nsRect& aRect);
|
||||||
@@ -322,27 +320,10 @@ nsTitledBoxFrame::GetContentFrame(nsIPresContext* aPresContext)
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsTitledBoxFrame::Reflow(nsIPresContext* aPresContext,
|
nsTitledBoxFrame::GetBorderAndPadding(nsMargin& aBorderAndPadding)
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
{
|
||||||
if (aReflowState.mComputedBorderPadding.top != 0)
|
aBorderAndPadding.SizeTo(0,0,0,0);
|
||||||
{
|
return NS_OK;
|
||||||
nsHTMLReflowState newState(aReflowState);
|
|
||||||
|
|
||||||
if (newState.mComputedHeight != NS_INTRINSICSIZE)
|
|
||||||
newState.mComputedHeight += aReflowState.mComputedBorderPadding.top;
|
|
||||||
|
|
||||||
// remove the border from border padding
|
|
||||||
((nsMargin&)newState.mComputedBorderPadding).top = 0;
|
|
||||||
((nsMargin&)newState.mComputedPadding).top = 0;
|
|
||||||
|
|
||||||
// reflow us again with the correct values.
|
|
||||||
return Reflow(aPresContext, aDesiredSize, newState, aStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
return nsBoxFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -31,27 +31,15 @@
|
|||||||
#ifndef nsIBox_h___
|
#ifndef nsIBox_h___
|
||||||
#define nsIBox_h___
|
#define nsIBox_h___
|
||||||
|
|
||||||
class nsIPresContext;
|
#include "nsISupports.h"
|
||||||
class nsIFrame;
|
#include "nsIBoxLayout.h"
|
||||||
struct nsHTMLReflowState;
|
|
||||||
class nsBoxInfo;
|
|
||||||
|
|
||||||
// {02A560C0-01BF-11d3-B35C-00A0CC3C1CDE}
|
class nsBoxLayoutState;
|
||||||
#define NS_IBOX_IID { 0x2a560c0, 0x1bf, 0x11d3, { 0xb3, 0x5c, 0x0, 0xa0, 0xcc, 0x3c, 0x1c, 0xde } }
|
struct nsRect;
|
||||||
|
struct nsSize;
|
||||||
|
|
||||||
class nsBoxInfo {
|
// {162F6B5A-F926-11d3-BA06-001083023C1E}
|
||||||
public:
|
#define NS_IBOX_IID { 0x162f6b5a, 0xf926, 0x11d3, { 0xba, 0x6, 0x0, 0x10, 0x83, 0x2, 0x3c, 0x1e } }
|
||||||
nsSize prefSize;
|
|
||||||
nsSize minSize;
|
|
||||||
nsSize maxSize;
|
|
||||||
PRInt32 flex;
|
|
||||||
nscoord ascent;
|
|
||||||
|
|
||||||
nsBoxInfo();
|
|
||||||
virtual void Clear();
|
|
||||||
virtual ~nsBoxInfo();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class nsIBox : public nsISupports {
|
class nsIBox : public nsISupports {
|
||||||
|
|
||||||
@@ -59,19 +47,63 @@ public:
|
|||||||
|
|
||||||
static const nsIID& GetIID() { static nsIID iid = NS_IBOX_IID; return iid; }
|
static const nsIID& GetIID() { static nsIID iid = NS_IBOX_IID; return iid; }
|
||||||
|
|
||||||
/** Get the layout information object for this box. It will contains things like flexiblity,
|
enum Halignment {
|
||||||
* preferred, min, max sizes.
|
hAlign_Left,
|
||||||
*/
|
hAlign_Right,
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)=0;
|
hAlign_Center
|
||||||
|
};
|
||||||
|
|
||||||
/** clear any cached layout info about our children. If the child is specifically specified
|
enum Valignment {
|
||||||
* then only clear cached layout information for that specific child. If the child is not
|
vAlign_Top,
|
||||||
* then clear all childrens cached information.
|
vAlign_Middle,
|
||||||
*/
|
vAlign_BaseLine,
|
||||||
NS_IMETHOD InvalidateCache(nsIFrame* aChild)=0;
|
vAlign_Bottom
|
||||||
|
};
|
||||||
|
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)=0;
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)=0;
|
||||||
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)=0;
|
||||||
|
NS_IMETHOD GetFlex(nsBoxLayoutState& aBoxLayoutState, nscoord& aFlex)=0;
|
||||||
|
NS_IMETHOD GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent)=0;
|
||||||
|
NS_IMETHOD IsCollapsed(nsBoxLayoutState& aBoxLayoutState, PRBool& aCollapsed)=0;
|
||||||
|
NS_IMETHOD Collapse(nsBoxLayoutState& aBoxLayoutState)=0;
|
||||||
|
NS_IMETHOD UnCollapse(nsBoxLayoutState& aBoxLayoutState)=0;
|
||||||
|
NS_IMETHOD SetBounds(nsBoxLayoutState& aBoxLayoutState, const nsRect& aRect)=0;
|
||||||
|
NS_IMETHOD GetBounds(nsRect& aRect)=0;
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState)=0;
|
||||||
|
NS_IMETHOD IsDirty(PRBool& aIsDirty)=0;
|
||||||
|
NS_IMETHOD HasDirtyChildren(PRBool& aIsDirty)=0;
|
||||||
|
NS_IMETHOD MarkDirty(nsBoxLayoutState& aState)=0;
|
||||||
|
NS_IMETHOD MarkDirtyChildren(nsBoxLayoutState& aState)=0;
|
||||||
|
NS_IMETHOD SetDebug(nsBoxLayoutState& aState, PRBool aDebug)=0;
|
||||||
|
NS_IMETHOD GetDebug(PRBool& aDebug)=0;
|
||||||
|
NS_IMETHOD GetChildBox(nsIBox** aBox)=0;
|
||||||
|
NS_IMETHOD GetNextBox(nsIBox** aBox)=0;
|
||||||
|
NS_IMETHOD SetNextBox(nsIBox* aBox)=0;
|
||||||
|
NS_IMETHOD GetParentBox(nsIBox** aParent)=0;
|
||||||
|
NS_IMETHOD SetParentBox(nsIBox* aParent)=0;
|
||||||
|
NS_IMETHOD GetFrame(nsIFrame** aFrame)=0;
|
||||||
|
NS_IMETHOD GetBorderAndPadding(nsMargin& aBorderAndPadding)=0;
|
||||||
|
NS_IMETHOD GetBorder(nsMargin& aBorderAndPadding)=0;
|
||||||
|
NS_IMETHOD GetPadding(nsMargin& aBorderAndPadding)=0;
|
||||||
|
NS_IMETHOD GetInset(nsMargin& aInset)=0;
|
||||||
|
NS_IMETHOD GetMargin(nsMargin& aMargin)=0;
|
||||||
|
NS_IMETHOD SetLayoutManager(nsIBoxLayout* aLayout)=0;
|
||||||
|
NS_IMETHOD GetLayoutManager(nsIBoxLayout** aLayout)=0;
|
||||||
|
NS_IMETHOD GetContentRect(nsRect& aContentRect) = 0;
|
||||||
|
NS_IMETHOD GetClientRect(nsRect& aContentRect) = 0;
|
||||||
|
NS_IMETHOD GetVAlign(Valignment& aAlign) = 0;
|
||||||
|
NS_IMETHOD GetHAlign(Halignment& aAlign) = 0;
|
||||||
|
NS_IMETHOD GetOrientation(PRBool& aIsHorizontal)=0;
|
||||||
|
NS_IMETHOD Redraw(nsBoxLayoutState& aState, const nsRect* aRect = nsnull, PRBool aImmediate = PR_FALSE)=0;
|
||||||
|
NS_IMETHOD NeedsRecalc()=0;
|
||||||
|
NS_IMETHOD GetDebugBoxAt(const nsPoint& aPoint, nsIBox** aBox)=0;
|
||||||
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug)=0;
|
static PRBool AddCSSPrefSize(nsBoxLayoutState& aState, nsIBox* aBox, nsSize& aSize);
|
||||||
|
static PRBool AddCSSMinSize(nsBoxLayoutState& aState, nsIBox* aBox, nsSize& aSize);
|
||||||
|
static PRBool AddCSSMaxSize(nsBoxLayoutState& aState, nsIBox* aBox, nsSize& aSize);
|
||||||
|
static PRBool AddCSSFlex(nsBoxLayoutState& aState, nsIBox* aBox, nscoord& aFlex);
|
||||||
|
static PRBool AddCSSCollapsed(nsBoxLayoutState& aState, nsIBox* aBox, PRBool& aCollapsed);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
447
layout/xul/base/src/nsImageBoxFrame.cpp
Normal file
447
layout/xul/base/src/nsImageBoxFrame.cpp
Normal file
@@ -0,0 +1,447 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Eric Vaughan
|
||||||
|
// Netscape Communications
|
||||||
|
//
|
||||||
|
// See documentation in associated header file
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "nsImageBoxFrame.h"
|
||||||
|
#include "nsIDeviceContext.h"
|
||||||
|
#include "nsIFontMetrics.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
#include "nsXULAtoms.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsStyleConsts.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsButtonFrameRenderer.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
|
#include "nsHTMLParts.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
#include "nsLeafFrame.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIRenderingContext.h"
|
||||||
|
#include "nsIPresShell.h"
|
||||||
|
#include "nsHTMLIIDs.h"
|
||||||
|
#include "nsIImage.h"
|
||||||
|
#include "nsIWidget.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
#include "nsIHTMLAttributes.h"
|
||||||
|
#include "nsIDocument.h"
|
||||||
|
#include "nsIHTMLDocument.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsStyleConsts.h"
|
||||||
|
#include "nsImageMap.h"
|
||||||
|
#include "nsILinkHandler.h"
|
||||||
|
#include "nsIURL.h"
|
||||||
|
#include "nsIView.h"
|
||||||
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsHTMLContainerFrame.h"
|
||||||
|
#include "prprf.h"
|
||||||
|
#include "nsISizeOfHandler.h"
|
||||||
|
#include "nsIFontMetrics.h"
|
||||||
|
#include "nsCSSRendering.h"
|
||||||
|
#include "nsIDOMHTMLImageElement.h"
|
||||||
|
#include "nsIDeviceContext.h"
|
||||||
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsTextFragment.h"
|
||||||
|
#include "nsIDOMHTMLMapElement.h"
|
||||||
|
#include "nsIStyleSet.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
|
#include "nsFormControlHelper.h"
|
||||||
|
|
||||||
|
#define ONLOAD_CALLED_TOO_EARLY 1
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
nsImageBoxFrame::UpdateImageFrame(nsIPresContext* aPresContext,
|
||||||
|
nsHTMLImageLoader* aLoader,
|
||||||
|
nsIFrame* aFrame,
|
||||||
|
void* aClosure,
|
||||||
|
PRUint32 aStatus)
|
||||||
|
{
|
||||||
|
if (NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE & aStatus) {
|
||||||
|
nsImageBoxFrame* us = (nsImageBoxFrame*)aFrame;
|
||||||
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
us->MarkDirty(state);
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// NS_NewToolbarFrame
|
||||||
|
//
|
||||||
|
// Creates a new Toolbar frame and returns it in |aNewFrame|
|
||||||
|
//
|
||||||
|
nsresult
|
||||||
|
NS_NewImageBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
||||||
|
if (nsnull == aNewFrame) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
nsImageBoxFrame* it = new (aPresShell) nsImageBoxFrame (aPresShell);
|
||||||
|
if (nsnull == it)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
*aNewFrame = it;
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
} // NS_NewTitledButtonFrame
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::AttributeChanged(nsIPresContext* aPresContext,
|
||||||
|
nsIContent* aChild,
|
||||||
|
PRInt32 aNameSpaceID,
|
||||||
|
nsIAtom* aAttribute,
|
||||||
|
PRInt32 aHint)
|
||||||
|
{
|
||||||
|
PRBool aResize;
|
||||||
|
PRBool aRedraw;
|
||||||
|
UpdateAttributes(aPresContext, aAttribute, aResize, aRedraw);
|
||||||
|
|
||||||
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
|
||||||
|
if (aResize) {
|
||||||
|
MarkDirty(state);
|
||||||
|
} else if (aRedraw) {
|
||||||
|
Redraw(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsImageBoxFrame::nsImageBoxFrame(nsIPresShell* aShell):nsLeafBoxFrame(aShell)
|
||||||
|
{
|
||||||
|
mSizeFrozen = PR_FALSE;
|
||||||
|
mHasImage = PR_FALSE;
|
||||||
|
NeedsRecalc();
|
||||||
|
}
|
||||||
|
|
||||||
|
nsImageBoxFrame::~nsImageBoxFrame()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::NeedsRecalc()
|
||||||
|
{
|
||||||
|
SizeNeedsRecalc(mImageSize);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_METHOD
|
||||||
|
nsImageBoxFrame::Destroy(nsIPresContext* aPresContext)
|
||||||
|
{
|
||||||
|
// Release image loader first so that it's refcnt can go to zero
|
||||||
|
mImageLoader.StopAllLoadImages(aPresContext);
|
||||||
|
|
||||||
|
return nsLeafBoxFrame::Destroy(aPresContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::Init(nsIPresContext* aPresContext,
|
||||||
|
nsIContent* aContent,
|
||||||
|
nsIFrame* aParent,
|
||||||
|
nsIStyleContext* aContext,
|
||||||
|
nsIFrame* aPrevInFlow)
|
||||||
|
{
|
||||||
|
nsresult rv = nsLeafBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
||||||
|
|
||||||
|
mHasImage = PR_FALSE;
|
||||||
|
|
||||||
|
// Always set the image loader's base URL, because someone may
|
||||||
|
// decide to change a button _without_ an image to have an image
|
||||||
|
// later.
|
||||||
|
nsIURI* baseURL = nsnull;
|
||||||
|
nsIHTMLContent* htmlContent;
|
||||||
|
if (NS_SUCCEEDED(mContent->QueryInterface(kIHTMLContentIID, (void**)&htmlContent))) {
|
||||||
|
htmlContent->GetBaseURL(baseURL);
|
||||||
|
NS_RELEASE(htmlContent);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nsIDocument* doc;
|
||||||
|
if (NS_SUCCEEDED(mContent->GetDocument(doc))) {
|
||||||
|
doc->GetBaseURL(baseURL);
|
||||||
|
NS_RELEASE(doc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the image loader. Make sure the source is correct so
|
||||||
|
// that UpdateAttributes doesn't double start an image load.
|
||||||
|
nsAutoString src;
|
||||||
|
GetImageSource(src);
|
||||||
|
if (!src.Equals("")) {
|
||||||
|
mHasImage = PR_TRUE;
|
||||||
|
}
|
||||||
|
mImageLoader.Init(this, UpdateImageFrame, nsnull, baseURL, src);
|
||||||
|
NS_IF_RELEASE(baseURL);
|
||||||
|
|
||||||
|
PRBool a,b;
|
||||||
|
UpdateAttributes(aPresContext, nsnull, a, b);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsImageBoxFrame::GetImageSource(nsString& aResult)
|
||||||
|
{
|
||||||
|
// get the new image src
|
||||||
|
mContent->GetAttribute(kNameSpaceID_None, nsHTMLAtoms::src, aResult);
|
||||||
|
|
||||||
|
// if the new image is empty
|
||||||
|
if (aResult.Equals("")) {
|
||||||
|
// get the list-style-image
|
||||||
|
const nsStyleList* myList =
|
||||||
|
(const nsStyleList*)mStyleContext->GetStyleData(eStyleStruct_List);
|
||||||
|
|
||||||
|
if (myList->mListStyleImage.Length() > 0) {
|
||||||
|
aResult = myList->mListStyleImage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsImageBoxFrame::UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttribute, PRBool& aResize, PRBool& aRedraw)
|
||||||
|
{
|
||||||
|
aResize = PR_FALSE;
|
||||||
|
aRedraw = PR_FALSE;
|
||||||
|
|
||||||
|
if (aAttribute == nsnull || aAttribute == nsHTMLAtoms::src) {
|
||||||
|
UpdateImage(aPresContext, aResize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsImageBoxFrame::UpdateImage(nsIPresContext* aPresContext, PRBool& aResize)
|
||||||
|
{
|
||||||
|
aResize = PR_FALSE;
|
||||||
|
|
||||||
|
// see if the source changed
|
||||||
|
// get the old image src
|
||||||
|
nsAutoString oldSrc ="";
|
||||||
|
mImageLoader.GetURLSpec(oldSrc);
|
||||||
|
|
||||||
|
// get the new image src
|
||||||
|
nsAutoString src;
|
||||||
|
GetImageSource(src);
|
||||||
|
|
||||||
|
// see if the images are different
|
||||||
|
if (!oldSrc.Equals(src)) {
|
||||||
|
|
||||||
|
if (!src.Equals("")) {
|
||||||
|
mSizeFrozen = PR_FALSE;
|
||||||
|
mHasImage = PR_TRUE;
|
||||||
|
} else {
|
||||||
|
mSizeFrozen = PR_TRUE;
|
||||||
|
mHasImage = PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
mImageLoader.UpdateURLSpec(aPresContext, src);
|
||||||
|
|
||||||
|
aResize = PR_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::Paint(nsIPresContext* aPresContext,
|
||||||
|
nsIRenderingContext& aRenderingContext,
|
||||||
|
const nsRect& aDirtyRect,
|
||||||
|
nsFramePaintLayer aWhichLayer)
|
||||||
|
{
|
||||||
|
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
||||||
|
mStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
|
if (!disp->IsVisible())
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
nsresult rv = nsLeafBoxFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||||
|
|
||||||
|
nsRect rect (0,0, mRect.width, mRect.height);
|
||||||
|
PaintImage(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::PaintImage(nsIPresContext* aPresContext,
|
||||||
|
nsIRenderingContext& aRenderingContext,
|
||||||
|
const nsRect& aDirtyRect,
|
||||||
|
nsFramePaintLayer aWhichLayer)
|
||||||
|
{
|
||||||
|
if ((0 == mRect.width) || (0 == mRect.height)) {
|
||||||
|
// Do not render when given a zero area. This avoids some useless
|
||||||
|
// scaling work while we wait for our image dimensions to arrive
|
||||||
|
// asynchronously.
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsRect rect;
|
||||||
|
GetClientRect(rect);
|
||||||
|
|
||||||
|
// don't draw if the image is not dirty
|
||||||
|
if (!mHasImage || !aDirtyRect.Intersects(rect))
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
if (NS_FRAME_PAINT_LAYER_FOREGROUND != aWhichLayer)
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIImage> image ( dont_AddRef(mImageLoader.GetImage()) );
|
||||||
|
if ( !image ) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Now render the image into our content area (the area inside the
|
||||||
|
// borders and padding)
|
||||||
|
aRenderingContext.DrawImage(image, rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// DidSetStyleContext
|
||||||
|
//
|
||||||
|
// When the style context changes, make sure that all of our image is up to date.
|
||||||
|
//
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame :: DidSetStyleContext( nsIPresContext* aPresContext )
|
||||||
|
{
|
||||||
|
// if list-style-image change we want to change the image
|
||||||
|
PRBool aResize;
|
||||||
|
UpdateImage(aPresContext, aResize);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
} // DidSetStyleContext
|
||||||
|
|
||||||
|
void
|
||||||
|
nsImageBoxFrame::GetImageSize(nsIPresContext* aPresContext)
|
||||||
|
{
|
||||||
|
nsSize s(0,0);
|
||||||
|
nsHTMLReflowMetrics desiredSize(&s);
|
||||||
|
const PRInt32 kDefaultSize = 0;
|
||||||
|
float p2t;
|
||||||
|
aPresContext->GetScaledPixelsToTwips(&p2t);
|
||||||
|
const PRInt32 kDefaultSizeInTwips = NSIntPixelsToTwips(kDefaultSize, p2t);
|
||||||
|
|
||||||
|
// not calculated? Get the intrinsic size
|
||||||
|
if (mHasImage) {
|
||||||
|
// get the size of the image and set the desired size
|
||||||
|
if (mSizeFrozen) {
|
||||||
|
mImageSize.width = kDefaultSizeInTwips;
|
||||||
|
mImageSize.height = kDefaultSizeInTwips;
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// Ask the image loader for the *intrinsic* image size
|
||||||
|
mImageLoader.GetDesiredSize(aPresContext, nsnull, desiredSize);
|
||||||
|
|
||||||
|
if (desiredSize.width == 1 || desiredSize.height == 1)
|
||||||
|
{
|
||||||
|
mImageSize.width = kDefaultSizeInTwips;
|
||||||
|
mImageSize.height = kDefaultSizeInTwips;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mImageSize.width = desiredSize.width;
|
||||||
|
mImageSize.height = desiredSize.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ok return our dimensions
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::Layout(nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
return nsLeafBoxFrame::Layout(aState);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ok return our dimensions
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::GetPrefSize(nsBoxLayoutState& aState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
if (DoesNeedRecalc(mImageSize)) {
|
||||||
|
CacheImageSize(aState);
|
||||||
|
}
|
||||||
|
|
||||||
|
aSize = mImageSize;
|
||||||
|
AddBorderAndPadding(aSize);
|
||||||
|
AddInset(aSize);
|
||||||
|
nsIBox::AddCSSPrefSize(aState, this, aSize);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ok return our dimensions
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::GetMinSize(nsBoxLayoutState& aState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
if (DoesNeedRecalc(mImageSize)) {
|
||||||
|
CacheImageSize(aState);
|
||||||
|
}
|
||||||
|
|
||||||
|
aSize = mImageSize;
|
||||||
|
AddBorderAndPadding(aSize);
|
||||||
|
AddInset(aSize);
|
||||||
|
nsIBox::AddCSSMinSize(aState, this, aSize);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::GetAscent(nsBoxLayoutState& aState, nscoord& aCoord)
|
||||||
|
{
|
||||||
|
nsSize size(0,0);
|
||||||
|
GetPrefSize(aState, size);
|
||||||
|
aCoord = size.height;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ok return our dimensions
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
nsImageBoxFrame::CacheImageSize(nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
nsIPresContext* presContext = aState.GetPresContext();
|
||||||
|
GetImageSize(presContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImageBoxFrame::GetFrameName(nsString& aResult) const
|
||||||
|
{
|
||||||
|
aResult = "ImageBox";
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
102
layout/xul/base/src/nsImageBoxFrame.h
Normal file
102
layout/xul/base/src/nsImageBoxFrame.h
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
#ifndef nsImageBoxFrame_h___
|
||||||
|
#define nsImageBoxFrame_h___
|
||||||
|
|
||||||
|
#include "nsHTMLImageLoader.h"
|
||||||
|
#include "nsLeafBoxFrame.h"
|
||||||
|
|
||||||
|
class nsImageBoxFrame : public nsLeafBoxFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// nsIBox
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD NeedsRecalc();
|
||||||
|
|
||||||
|
friend nsresult NS_NewImageBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
|
// nsIBox frame interface
|
||||||
|
|
||||||
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
||||||
|
nsIContent* aContent,
|
||||||
|
nsIFrame* aParent,
|
||||||
|
nsIStyleContext* aContext,
|
||||||
|
nsIFrame* asPrevInFlow);
|
||||||
|
|
||||||
|
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
|
||||||
|
nsIContent* aChild,
|
||||||
|
PRInt32 aNameSpaceID,
|
||||||
|
nsIAtom* aAttribute,
|
||||||
|
PRInt32 aHint);
|
||||||
|
|
||||||
|
NS_IMETHOD DidSetStyleContext (nsIPresContext* aPresContext);
|
||||||
|
|
||||||
|
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
|
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
||||||
|
|
||||||
|
virtual void UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttribute, PRBool& aResize, PRBool& aRedraw);
|
||||||
|
virtual void UpdateImage(nsIPresContext* aPresContext, PRBool& aResize);
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
||||||
|
nsIRenderingContext& aRenderingContext,
|
||||||
|
const nsRect& aDirtyRect,
|
||||||
|
nsFramePaintLayer aWhichLayer);
|
||||||
|
|
||||||
|
~nsImageBoxFrame();
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void CacheImageSize(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHOD PaintImage(nsIPresContext* aPresContext,
|
||||||
|
nsIRenderingContext& aRenderingContext,
|
||||||
|
const nsRect& aDirtyRect,
|
||||||
|
nsFramePaintLayer aWhichLayer);
|
||||||
|
|
||||||
|
nsImageBoxFrame(nsIPresShell* aShell);
|
||||||
|
|
||||||
|
static nsresult UpdateImageFrame(nsIPresContext* aPresContext,
|
||||||
|
nsHTMLImageLoader* aLoader,
|
||||||
|
nsIFrame* aFrame,
|
||||||
|
void* aClosure,
|
||||||
|
PRUint32 aStatus);
|
||||||
|
|
||||||
|
void GetImageSource(nsString& aResult);
|
||||||
|
|
||||||
|
virtual void GetImageSize(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
nsHTMLImageLoader mImageLoader;
|
||||||
|
PRBool mSizeFrozen;
|
||||||
|
nsSize mImageSize;
|
||||||
|
PRBool mHasImage;
|
||||||
|
|
||||||
|
}; // class nsImageBoxFrame
|
||||||
|
|
||||||
|
#endif /* nsImageBoxFrame_h___ */
|
||||||
246
layout/xul/base/src/nsLeafBoxFrame.cpp
Normal file
246
layout/xul/base/src/nsLeafBoxFrame.cpp
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Eric Vaughan
|
||||||
|
// Netscape Communications
|
||||||
|
//
|
||||||
|
// See documentation in associated header file
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "nsLeafBoxFrame.h"
|
||||||
|
#include "nsBoxFrame.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsIDeviceContext.h"
|
||||||
|
#include "nsIFontMetrics.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
#include "nsXULAtoms.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIRenderingContext.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// NS_NewToolbarFrame
|
||||||
|
//
|
||||||
|
// Creates a new Toolbar frame and returns it in |aNewFrame|
|
||||||
|
//
|
||||||
|
nsresult
|
||||||
|
NS_NewLeafBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
||||||
|
if (nsnull == aNewFrame) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
nsLeafBoxFrame* it = new (aPresShell) nsLeafBoxFrame(aPresShell);
|
||||||
|
if (nsnull == it)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
// it->SetFlags(aFlags);
|
||||||
|
*aNewFrame = it;
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
} // NS_NewTextFrame
|
||||||
|
|
||||||
|
nsLeafBoxFrame::nsLeafBoxFrame(nsIPresShell* aShell):nsBox(aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize us. This is a good time to get the alignment of the box
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLeafBoxFrame::Init(nsIPresContext* aPresContext,
|
||||||
|
nsIContent* aContent,
|
||||||
|
nsIFrame* aParent,
|
||||||
|
nsIStyleContext* aContext,
|
||||||
|
nsIFrame* aPrevInFlow)
|
||||||
|
{
|
||||||
|
nsresult rv = nsLeafFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
||||||
|
|
||||||
|
mMouseThrough = sometimes;
|
||||||
|
|
||||||
|
if (mContent) {
|
||||||
|
nsAutoString value;
|
||||||
|
if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(kNameSpaceID_None, nsXULAtoms::mousethrough, value)) {
|
||||||
|
if (value.EqualsIgnoreCase("never"))
|
||||||
|
mMouseThrough = never;
|
||||||
|
else if (value.EqualsIgnoreCase("always"))
|
||||||
|
mMouseThrough = always;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLeafBoxFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
|
const nsPoint& aPoint,
|
||||||
|
nsFramePaintLayer aWhichLayer,
|
||||||
|
nsIFrame** aFrame)
|
||||||
|
{
|
||||||
|
if (!mRect.Contains(aPoint))
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
if (mMouseThrough != never)
|
||||||
|
{
|
||||||
|
*aFrame = this;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLeafBoxFrame::GetFrame(nsIFrame** aFrame)
|
||||||
|
{
|
||||||
|
*aFrame = this;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLeafBoxFrame::DidReflow(nsIPresContext* aPresContext,
|
||||||
|
nsDidReflowStatus aStatus)
|
||||||
|
{
|
||||||
|
PRBool isDirty = mState & NS_FRAME_IS_DIRTY;
|
||||||
|
PRBool hasDirtyChildren = mState & NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||||
|
nsresult rv = nsFrame::DidReflow(aPresContext, aStatus);
|
||||||
|
if (isDirty)
|
||||||
|
mState |= NS_FRAME_IS_DIRTY;
|
||||||
|
|
||||||
|
if (hasDirtyChildren)
|
||||||
|
mState |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLeafBoxFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
|
const nsHTMLReflowState& aReflowState,
|
||||||
|
nsReflowStatus& aStatus)
|
||||||
|
{
|
||||||
|
NS_ASSERTION(aReflowState.mComputedWidth >=0 && aReflowState.mComputedHeight >= 0, "Computed Size < 0");
|
||||||
|
|
||||||
|
aStatus = NS_FRAME_COMPLETE;
|
||||||
|
|
||||||
|
// create the layout state
|
||||||
|
nsBoxLayoutState state(aPresContext, aReflowState);
|
||||||
|
|
||||||
|
state.HandleReflow(this, PR_FALSE);
|
||||||
|
|
||||||
|
nsSize computedSize(aReflowState.mComputedWidth,aReflowState.mComputedHeight);
|
||||||
|
|
||||||
|
nsMargin m;
|
||||||
|
GetBorderAndPadding(m);
|
||||||
|
|
||||||
|
// this happens sometimes. So lets handle it gracefully.
|
||||||
|
if (aReflowState.mComputedHeight == 0) {
|
||||||
|
nsSize minSize(0,0);
|
||||||
|
GetMinSize(state, minSize);
|
||||||
|
computedSize.height = minSize.height - m.top - m.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we are told to layout intrinic then get our preferred size.
|
||||||
|
if (computedSize.width == NS_INTRINSICSIZE || computedSize.height == NS_INTRINSICSIZE) {
|
||||||
|
nsSize prefSize;
|
||||||
|
nsSize minSize;
|
||||||
|
nsSize maxSize;
|
||||||
|
GetPrefSize(state, prefSize);
|
||||||
|
GetMinSize(state, minSize);
|
||||||
|
GetMaxSize(state, maxSize);
|
||||||
|
BoundsCheck(minSize, prefSize, maxSize);
|
||||||
|
|
||||||
|
// get our desiredSize
|
||||||
|
if (aReflowState.mComputedWidth == NS_INTRINSICSIZE)
|
||||||
|
computedSize.width = prefSize.width - m.left - m.right;
|
||||||
|
|
||||||
|
if (aReflowState.mComputedHeight == NS_INTRINSICSIZE || aReflowState.mComputedHeight == 0)
|
||||||
|
computedSize.height = prefSize.height - m.top - m.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsRect r(0,0,computedSize.width, computedSize.height);
|
||||||
|
r.Inflate(m);
|
||||||
|
r.x = mRect.x;
|
||||||
|
r.y = mRect.y;
|
||||||
|
|
||||||
|
SetBounds(state, r);
|
||||||
|
|
||||||
|
// layout our children
|
||||||
|
Layout(state);
|
||||||
|
|
||||||
|
// ok our child could have gotten bigger. So lets get its bounds
|
||||||
|
GetBounds(r);
|
||||||
|
|
||||||
|
// get the ascent
|
||||||
|
nscoord ascent;
|
||||||
|
GetAscent(state, ascent);
|
||||||
|
|
||||||
|
aDesiredSize.width = r.width;
|
||||||
|
aDesiredSize.height = r.height;
|
||||||
|
aDesiredSize.ascent = ascent;
|
||||||
|
aDesiredSize.descent = 0;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLeafBoxFrame::GetFrameName(nsString& aResult) const
|
||||||
|
{
|
||||||
|
aResult = "LeafBox";
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP_(nsrefcnt)
|
||||||
|
nsLeafBoxFrame::AddRef(void)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP_(nsrefcnt)
|
||||||
|
nsLeafBoxFrame::Release(void)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsLeafBoxFrame::ContentChanged(nsIPresContext* aPresContext,
|
||||||
|
nsIContent* aChild,
|
||||||
|
nsISupports* aSubContent)
|
||||||
|
{
|
||||||
|
NeedsRecalc();
|
||||||
|
return nsLeafFrame::ContentChanged(aPresContext, aChild, aSubContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_INTERFACE_MAP_BEGIN(nsLeafBoxFrame)
|
||||||
|
NS_INTERFACE_MAP_ENTRY(nsIBox)
|
||||||
|
#ifdef NS_DEBUG
|
||||||
|
NS_INTERFACE_MAP_ENTRY(nsIFrameDebug)
|
||||||
|
#endif
|
||||||
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIBox)
|
||||||
|
NS_INTERFACE_MAP_END_INHERITING(nsLeafFrame)
|
||||||
@@ -19,27 +19,24 @@
|
|||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
#ifndef nsXULLeafFrame_h___
|
#ifndef nsLeafBoxFrame_h___
|
||||||
#define nsXULLeafFrame_h___
|
#define nsLeafBoxFrame_h___
|
||||||
|
|
||||||
#include "nsLeafFrame.h"
|
#include "nsLeafFrame.h"
|
||||||
#include "nsIBox.h"
|
#include "nsBox.h"
|
||||||
|
|
||||||
class nsAccessKeyInfo;
|
class nsAccessKeyInfo;
|
||||||
|
|
||||||
class nsXULLeafFrame : public nsLeafFrame, public nsIBox
|
class nsLeafBoxFrame : public nsLeafFrame, public nsBox
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
friend nsresult NS_NewXULLeafFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
friend nsresult NS_NewLeafBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
// nsIBox frame interface
|
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
|
||||||
NS_IMETHOD InvalidateCache(nsIFrame* aChild);
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug) { return NS_OK; }
|
|
||||||
|
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
// nsIBox frame interface
|
||||||
|
NS_IMETHOD GetFrame(nsIFrame** aFrame);
|
||||||
|
|
||||||
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
||||||
|
|
||||||
@@ -53,18 +50,30 @@ public:
|
|||||||
nsIContent* aChild,
|
nsIContent* aChild,
|
||||||
nsISupports* aSubContent);
|
nsISupports* aSubContent);
|
||||||
|
|
||||||
|
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
||||||
|
nsDidReflowStatus aStatus);
|
||||||
|
|
||||||
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
||||||
|
nsIContent* aContent,
|
||||||
|
nsIFrame* aParent,
|
||||||
|
nsIStyleContext* aContext,
|
||||||
|
nsIFrame* asPrevInFlow);
|
||||||
|
|
||||||
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
|
const nsPoint& aPoint,
|
||||||
|
nsFramePaintLayer aWhichLayer,
|
||||||
|
nsIFrame** aFrame);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual void GetDesiredSize(nsIPresContext* aPresContext,
|
virtual void GetDesiredSize(nsIPresContext* aPresContext,
|
||||||
const nsHTMLReflowState& aReflowState,
|
const nsHTMLReflowState& aReflowState,
|
||||||
nsHTMLReflowMetrics& aDesiredSize);
|
nsHTMLReflowMetrics& aDesiredSize) {}
|
||||||
|
|
||||||
|
nsLeafBoxFrame(nsIPresShell* aShell);
|
||||||
nsXULLeafFrame() {}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
}; // class nsXULLeafFrame
|
}; // class nsLeafBoxFrame
|
||||||
|
|
||||||
#endif /* nsXULLeafFrame_h___ */
|
#endif /* nsLeafBoxFrame_h___ */
|
||||||
@@ -55,6 +55,7 @@
|
|||||||
#include "nsILookAndFeel.h"
|
#include "nsILookAndFeel.h"
|
||||||
#include "nsIComponentManager.h"
|
#include "nsIComponentManager.h"
|
||||||
#include "nsWidgetsCID.h"
|
#include "nsWidgetsCID.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
#define NS_MENU_POPUP_LIST_INDEX (NS_AREA_FRAME_ABSOLUTE_LIST_INDEX + 1)
|
#define NS_MENU_POPUP_LIST_INDEX (NS_AREA_FRAME_ABSOLUTE_LIST_INDEX + 1)
|
||||||
|
|
||||||
@@ -220,9 +221,10 @@ nsMenuFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
nsIFrame** aFrame)
|
nsIFrame** aFrame)
|
||||||
{
|
{
|
||||||
if (!mRect.Contains(aPoint)) {
|
// if it is not inside us or not in the layer in which we paint, fail
|
||||||
|
if (!mRect.Contains(aPoint))
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
|
||||||
nsresult result = nsBoxFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame);
|
nsresult result = nsBoxFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame);
|
||||||
if ((result != NS_OK) || (*aFrame == this)) {
|
if ((result != NS_OK) || (*aFrame == this)) {
|
||||||
return result;
|
return result;
|
||||||
@@ -665,6 +667,53 @@ nsMenuFrame::GetMenuChildrenElement(nsIContent** aResult)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMenuFrame::Layout(nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
nsRect contentRect;
|
||||||
|
GetContentRect(contentRect);
|
||||||
|
|
||||||
|
// lay us out
|
||||||
|
nsresult rv = nsBoxFrame::Layout(aState);
|
||||||
|
|
||||||
|
// layout the popup. First we need to get it.
|
||||||
|
nsIFrame* popupChild = mPopupFrames.FirstChild();
|
||||||
|
|
||||||
|
if (popupChild) {
|
||||||
|
nsCOMPtr<nsIDOMXULMenuListElement> menulist = do_QueryInterface(mContent);
|
||||||
|
|
||||||
|
nsIBox* ibox = nsnull;
|
||||||
|
nsresult rv2 = popupChild->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox);
|
||||||
|
NS_ASSERTION(NS_SUCCEEDED(rv2) && ibox,"popupChild is not box!!");
|
||||||
|
|
||||||
|
// then get its preferred size
|
||||||
|
nsSize prefSize(0,0);
|
||||||
|
nsSize minSize(0,0);
|
||||||
|
nsSize maxSize(0,0);
|
||||||
|
|
||||||
|
ibox->GetPrefSize(aState, prefSize);
|
||||||
|
ibox->GetMinSize(aState, minSize);
|
||||||
|
ibox->GetMaxSize(aState, maxSize);
|
||||||
|
|
||||||
|
BoundsCheck(minSize, prefSize, maxSize);
|
||||||
|
|
||||||
|
AddMargin(ibox, prefSize);
|
||||||
|
|
||||||
|
if (menulist && prefSize.width < contentRect.width)
|
||||||
|
prefSize.width = contentRect.width;
|
||||||
|
|
||||||
|
// lay it out
|
||||||
|
LayoutChildAt(aState, ibox, nsRect(0,0,prefSize.width, prefSize.height));
|
||||||
|
}
|
||||||
|
|
||||||
|
SyncLayout(aState);
|
||||||
|
|
||||||
|
LayoutFinished(aState);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Replaced by Layout
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsMenuFrame::Reflow(nsIPresContext* aPresContext,
|
nsMenuFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
@@ -777,9 +826,10 @@ nsMenuFrame::Reflow(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsMenuFrame::SetDebug(nsIPresContext* aPresContext, PRBool aDebug)
|
nsMenuFrame::SetDebug(nsBoxLayoutState& aState, PRBool aDebug)
|
||||||
{
|
{
|
||||||
// see if our state matches the given debug state
|
// see if our state matches the given debug state
|
||||||
PRBool debugSet = mState & NS_STATE_CURRENTLY_IN_DEBUG;
|
PRBool debugSet = mState & NS_STATE_CURRENTLY_IN_DEBUG;
|
||||||
@@ -788,15 +838,15 @@ nsMenuFrame::SetDebug(nsIPresContext* aPresContext, PRBool aDebug)
|
|||||||
// if it doesn't then tell each child below us the new debug state
|
// if it doesn't then tell each child below us the new debug state
|
||||||
if (debugChanged)
|
if (debugChanged)
|
||||||
{
|
{
|
||||||
nsBoxFrame::SetDebug(aPresContext, aDebug);
|
nsBoxFrame::SetDebug(aState, aDebug);
|
||||||
SetDebug(aPresContext, mPopupFrames.FirstChild(), aDebug);
|
SetDebug(aState, mPopupFrames.FirstChild(), aDebug);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsMenuFrame::SetDebug(nsIPresContext* aPresContext, nsIFrame* aList, PRBool aDebug)
|
nsMenuFrame::SetDebug(nsBoxLayoutState& aState, nsIFrame* aList, PRBool aDebug)
|
||||||
{
|
{
|
||||||
if (!aList)
|
if (!aList)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
@@ -804,7 +854,7 @@ nsMenuFrame::SetDebug(nsIPresContext* aPresContext, nsIFrame* aList, PRBool aDeb
|
|||||||
while (aList) {
|
while (aList) {
|
||||||
nsIBox* ibox = nsnull;
|
nsIBox* ibox = nsnull;
|
||||||
if (NS_SUCCEEDED(aList->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox) {
|
if (NS_SUCCEEDED(aList->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox) {
|
||||||
ibox->SetDebug(aPresContext, aDebug);
|
ibox->SetDebug(aState, aDebug);
|
||||||
}
|
}
|
||||||
|
|
||||||
aList->GetNextSibling(&aList);
|
aList->GetNextSibling(&aList);
|
||||||
@@ -814,13 +864,9 @@ nsMenuFrame::SetDebug(nsIPresContext* aPresContext, nsIFrame* aList, PRBool aDeb
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
void
|
||||||
nsMenuFrame::DidReflow(nsIPresContext* aPresContext,
|
nsMenuFrame::LayoutFinished(nsBoxLayoutState& aState)
|
||||||
nsDidReflowStatus aStatus)
|
|
||||||
{
|
{
|
||||||
nsresult rv;
|
|
||||||
rv = nsBoxFrame::DidReflow(aPresContext, aStatus);
|
|
||||||
|
|
||||||
// Sync up the view.
|
// Sync up the view.
|
||||||
nsIFrame* frame = mPopupFrames.FirstChild();
|
nsIFrame* frame = mPopupFrames.FirstChild();
|
||||||
nsMenuPopupFrame* menuPopup = (nsMenuPopupFrame*)frame;
|
nsMenuPopupFrame* menuPopup = (nsMenuPopupFrame*)frame;
|
||||||
@@ -849,10 +895,10 @@ nsMenuFrame::DidReflow(nsIPresContext* aPresContext,
|
|||||||
popupAlign = "topleft";
|
popupAlign = "topleft";
|
||||||
}
|
}
|
||||||
|
|
||||||
menuPopup->SyncViewWithFrame(aPresContext, popupAnchor, popupAlign, this, -1, -1);
|
nsIPresContext* presContext = aState.GetPresContext();
|
||||||
|
menuPopup->SyncViewWithFrame(presContext, popupAnchor, popupAlign, this, -1, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
@@ -1088,6 +1134,12 @@ nsMenuFrame::UpdateMenuSpecialState(nsIPresContext* aPresContext) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMenuFrame::CreateAnonymousContent(nsIPresContext* aPresContext, nsISupportsArray& aAnonymousChildren)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsMenuFrame::BuildAcceleratorText(nsString& aAccelString)
|
nsMenuFrame::BuildAcceleratorText(nsString& aAccelString)
|
||||||
{
|
{
|
||||||
@@ -1295,7 +1347,8 @@ nsMenuFrame::RemoveFrame(nsIPresContext* aPresContext,
|
|||||||
if (mPopupFrames.ContainsFrame(aOldFrame)) {
|
if (mPopupFrames.ContainsFrame(aOldFrame)) {
|
||||||
// Go ahead and remove this frame.
|
// Go ahead and remove this frame.
|
||||||
mPopupFrames.DestroyFrame(aPresContext, aOldFrame);
|
mPopupFrames.DestroyFrame(aPresContext, aOldFrame);
|
||||||
rv = GenerateDirtyReflowCommand(aPresContext, aPresShell);
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
rv = MarkDirtyChildren(state);
|
||||||
} else {
|
} else {
|
||||||
rv = nsBoxFrame::RemoveFrame(aPresContext, aPresShell, aListName, aOldFrame);
|
rv = nsBoxFrame::RemoveFrame(aPresContext, aPresShell, aListName, aOldFrame);
|
||||||
}
|
}
|
||||||
@@ -1319,8 +1372,9 @@ nsMenuFrame::InsertFrames(nsIPresContext* aPresContext,
|
|||||||
frameChild->GetTag(*getter_AddRefs(tag));
|
frameChild->GetTag(*getter_AddRefs(tag));
|
||||||
if (tag && tag.get() == nsXULAtoms::menupopup) {
|
if (tag && tag.get() == nsXULAtoms::menupopup) {
|
||||||
mPopupFrames.InsertFrames(nsnull, nsnull, aFrameList);
|
mPopupFrames.InsertFrames(nsnull, nsnull, aFrameList);
|
||||||
SetDebug(aPresContext, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
nsBoxLayoutState state(aPresContext);
|
||||||
rv = GenerateDirtyReflowCommand(aPresContext, aPresShell);
|
SetDebug(state, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
||||||
|
rv = MarkDirtyChildren(state);
|
||||||
} else {
|
} else {
|
||||||
rv = nsBoxFrame::InsertFrames(aPresContext, aPresShell, aListName, aPrevFrame, aFrameList);
|
rv = nsBoxFrame::InsertFrames(aPresContext, aPresShell, aListName, aPrevFrame, aFrameList);
|
||||||
}
|
}
|
||||||
@@ -1346,8 +1400,9 @@ nsMenuFrame::AppendFrames(nsIPresContext* aPresContext,
|
|||||||
frameChild->GetTag(*getter_AddRefs(tag));
|
frameChild->GetTag(*getter_AddRefs(tag));
|
||||||
if (tag && tag.get() == nsXULAtoms::menupopup) {
|
if (tag && tag.get() == nsXULAtoms::menupopup) {
|
||||||
mPopupFrames.AppendFrames(nsnull, aFrameList);
|
mPopupFrames.AppendFrames(nsnull, aFrameList);
|
||||||
SetDebug(aPresContext, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
nsBoxLayoutState state(aPresContext);
|
||||||
rv = GenerateDirtyReflowCommand(aPresContext, aPresShell);
|
SetDebug(state, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
||||||
|
rv = MarkDirtyChildren(state);
|
||||||
} else {
|
} else {
|
||||||
rv = nsBoxFrame::AppendFrames(aPresContext, aPresShell, aListName, aFrameList);
|
rv = nsBoxFrame::AppendFrames(aPresContext, aPresShell, aListName, aFrameList);
|
||||||
}
|
}
|
||||||
@@ -1370,14 +1425,69 @@ nsMenuFrame::UpdateDismissalListener(nsIMenuParent* aMenuParent)
|
|||||||
nsMenuFrame::mDismissalListener->SetCurrentMenuParent(aMenuParent);
|
nsMenuFrame::mDismissalListener->SetCurrentMenuParent(aMenuParent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsMenuFrame::GetPrefSize(nsBoxLayoutState& aState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
aSize.width = 0;
|
||||||
|
aSize.height = 0;
|
||||||
|
nsresult rv = nsBoxFrame::GetPrefSize(aState, aSize);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMXULMenuListElement> menulist(do_QueryInterface(mContent));
|
||||||
|
if (menulist) {
|
||||||
|
nsCOMPtr<nsIDOMElement> element;
|
||||||
|
menulist->GetSelectedItem(getter_AddRefs(element));
|
||||||
|
if (!element) {
|
||||||
|
nsAutoString value;
|
||||||
|
menulist->GetValue(value);
|
||||||
|
if (value == "") {
|
||||||
|
nsCOMPtr<nsIContent> child;
|
||||||
|
GetMenuChildrenElement(getter_AddRefs(child));
|
||||||
|
if (child) {
|
||||||
|
PRInt32 count;
|
||||||
|
child->ChildCount(count);
|
||||||
|
if (count > 0) {
|
||||||
|
nsCOMPtr<nsIContent> item;
|
||||||
|
child->ChildAt(0, *getter_AddRefs(item));
|
||||||
|
nsCOMPtr<nsIDOMElement> selectedElement(do_QueryInterface(item));
|
||||||
|
if (selectedElement)
|
||||||
|
menulist->SetSelectedItem(selectedElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsSize tmpSize(-1,0);
|
||||||
|
nsIBox::AddCSSPrefSize(aState, this, tmpSize);
|
||||||
|
nscoord flex;
|
||||||
|
GetFlex(aState, flex);
|
||||||
|
|
||||||
|
if (tmpSize.width == -1 && flex==0) {
|
||||||
|
nsIFrame* frame = mPopupFrames.FirstChild();
|
||||||
|
if (!frame) {
|
||||||
|
MarkAsGenerated();
|
||||||
|
frame = mPopupFrames.FirstChild();
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIBox* ibox = nsnull;
|
||||||
|
nsresult rv2 = frame->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox);
|
||||||
|
NS_ASSERTION(NS_SUCCEEDED(rv2) && ibox,"popupChild is not box!!");
|
||||||
|
|
||||||
|
ibox->GetPrefSize(aState, tmpSize);
|
||||||
|
aSize.width = tmpSize.width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Need to figure out what this does.
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsMenuFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)
|
nsMenuFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)
|
||||||
{
|
{
|
||||||
nsresult rv = nsBoxFrame::GetBoxInfo(aPresContext, aReflowState, aSize);
|
nsresult rv = nsBoxFrame::GetBoxInfo(aPresContext, aReflowState, aSize);
|
||||||
nsCOMPtr<nsIDOMXULMenuListElement> menulist(do_QueryInterface(mContent));
|
nsCOMPtr<nsIDOMXULMenuListElement> menulist(do_QueryInterface(mContent));
|
||||||
if (menulist) {
|
if (menulist) {
|
||||||
nsCalculatedBoxInfo boxInfo;
|
nsCalculatedBoxInfo boxInfo(this);
|
||||||
boxInfo.frame = this;
|
|
||||||
boxInfo.prefSize.width = NS_UNCONSTRAINEDSIZE;
|
boxInfo.prefSize.width = NS_UNCONSTRAINEDSIZE;
|
||||||
boxInfo.prefSize.height = NS_UNCONSTRAINEDSIZE;
|
boxInfo.prefSize.height = NS_UNCONSTRAINEDSIZE;
|
||||||
boxInfo.flex = 0;
|
boxInfo.flex = 0;
|
||||||
@@ -1392,8 +1502,7 @@ nsMenuFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& a
|
|||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIBox> box(do_QueryInterface(frame));
|
nsCOMPtr<nsIBox> box(do_QueryInterface(frame));
|
||||||
nsCalculatedBoxInfo childInfo;
|
nsCalculatedBoxInfo childInfo(frame);
|
||||||
childInfo.frame = frame;
|
|
||||||
box->GetBoxInfo(aPresContext, aReflowState, childInfo);
|
box->GetBoxInfo(aPresContext, aReflowState, childInfo);
|
||||||
GetRedefinedMinPrefMax(aPresContext, this, childInfo);
|
GetRedefinedMinPrefMax(aPresContext, this, childInfo);
|
||||||
aSize.prefSize.width = childInfo.prefSize.width;
|
aSize.prefSize.width = childInfo.prefSize.width;
|
||||||
@@ -1406,4 +1515,5 @@ nsMenuFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& a
|
|||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,13 @@ public:
|
|||||||
|
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
// nsIBox
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
|
||||||
|
// The nsIAnonymousContentCreator interface
|
||||||
|
NS_IMETHOD CreateAnonymousContent(nsIPresContext* aPresContext, nsISupportsArray& aAnonymousItems);
|
||||||
|
|
||||||
// The nsITimerCallback interface
|
// The nsITimerCallback interface
|
||||||
NS_IMETHOD_(void) Notify(nsITimer *timer);
|
NS_IMETHOD_(void) Notify(nsITimer *timer);
|
||||||
|
|
||||||
@@ -68,7 +75,7 @@ public:
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow);
|
nsIFrame* aPrevInFlow);
|
||||||
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug);
|
NS_IMETHOD SetDebug(nsBoxLayoutState& aState, PRBool aDebug);
|
||||||
|
|
||||||
NS_IMETHOD IsActive(PRBool& aResult) { aResult = PR_TRUE; return NS_OK; };
|
NS_IMETHOD IsActive(PRBool& aResult) { aResult = PR_TRUE; return NS_OK; };
|
||||||
|
|
||||||
@@ -95,14 +102,6 @@ public:
|
|||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus* aEventStatus);
|
nsEventStatus* aEventStatus);
|
||||||
|
|
||||||
// Reflow methods
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
|
||||||
nsDidReflowStatus aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD AppendFrames(nsIPresContext* aPresContext,
|
NS_IMETHOD AppendFrames(nsIPresContext* aPresContext,
|
||||||
nsIPresShell& aPresShell,
|
nsIPresShell& aPresShell,
|
||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
@@ -161,6 +160,9 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
virtual void LayoutFinished(nsBoxLayoutState& aState);
|
||||||
|
|
||||||
static void UpdateDismissalListener(nsIMenuParent* aMenuParent);
|
static void UpdateDismissalListener(nsIMenuParent* aMenuParent);
|
||||||
void UpdateMenuType(nsIPresContext* aPresContext);
|
void UpdateMenuType(nsIPresContext* aPresContext);
|
||||||
void UpdateMenuSpecialState(nsIPresContext* aPresContext);
|
void UpdateMenuSpecialState(nsIPresContext* aPresContext);
|
||||||
@@ -185,10 +187,9 @@ protected:
|
|||||||
PRInt32 aNameSpaceID,
|
PRInt32 aNameSpaceID,
|
||||||
nsIAtom* aAttribute,
|
nsIAtom* aAttribute,
|
||||||
PRInt32 aHint);
|
PRInt32 aHint);
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsresult SetDebug(nsIPresContext* aPresContext, nsIFrame* aList, PRBool aDebug);
|
nsresult SetDebug(nsBoxLayoutState& aState, nsIFrame* aList, PRBool aDebug);
|
||||||
|
|
||||||
nsFrameList mPopupFrames;
|
nsFrameList mPopupFrames;
|
||||||
PRPackedBool mIsMenu; // Whether or not we can even have children or not.
|
PRPackedBool mIsMenu; // Whether or not we can even have children or not.
|
||||||
|
|||||||
@@ -103,7 +103,10 @@ public:
|
|||||||
|
|
||||||
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext, const nsPoint& aPoint, nsFramePaintLayer aWhichLayer, nsIFrame** aFrame);
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
|
const nsPoint& aPoint,
|
||||||
|
nsFramePaintLayer aWhichLayer,
|
||||||
|
nsIFrame** aFrame);
|
||||||
|
|
||||||
void GetViewOffset(nsIViewManager* aManager, nsIView* aView, nsPoint& aPoint);
|
void GetViewOffset(nsIViewManager* aManager, nsIView* aView, nsPoint& aPoint);
|
||||||
static void GetNearestEnclosingView(nsIPresContext* aPresContext, nsIFrame* aStartFrame, nsIView** aResult);
|
static void GetNearestEnclosingView(nsIPresContext* aPresContext, nsIFrame* aStartFrame, nsIView** aResult);
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
#include "nsIDOMElement.h"
|
#include "nsIDOMElement.h"
|
||||||
#include "nsISupportsArray.h"
|
#include "nsISupportsArray.h"
|
||||||
#include "nsIDOMText.h"
|
#include "nsIDOMText.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
#define NS_MENU_POPUP_LIST_INDEX (NS_AREA_FRAME_ABSOLUTE_LIST_INDEX + 1)
|
#define NS_MENU_POPUP_LIST_INDEX (NS_AREA_FRAME_ABSOLUTE_LIST_INDEX + 1)
|
||||||
|
|
||||||
@@ -198,6 +199,40 @@ nsPopupSetFrame::Destroy(nsIPresContext* aPresContext)
|
|||||||
return nsBoxFrame::Destroy(aPresContext);
|
return nsBoxFrame::Destroy(aPresContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsPopupSetFrame::Layout(nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
// lay us out
|
||||||
|
nsresult rv = nsBoxFrame::Layout(aState);
|
||||||
|
|
||||||
|
// layout the popup. First we need to get it.
|
||||||
|
nsIFrame* popupChild = GetActiveChild();
|
||||||
|
if (popupChild) {
|
||||||
|
nsIBox* ibox = nsnull;
|
||||||
|
nsresult rv2 = popupChild->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox);
|
||||||
|
NS_ASSERTION(NS_SUCCEEDED(rv2) && ibox,"popupChild is not box!!");
|
||||||
|
|
||||||
|
// then get its preferred size
|
||||||
|
nsSize prefSize(0,0);
|
||||||
|
nsSize minSize(0,0);
|
||||||
|
nsSize maxSize(0,0);
|
||||||
|
|
||||||
|
ibox->GetPrefSize(aState, prefSize);
|
||||||
|
ibox->GetMinSize(aState, minSize);
|
||||||
|
ibox->GetMaxSize(aState, maxSize);
|
||||||
|
|
||||||
|
BoundsCheck(minSize, prefSize, maxSize);
|
||||||
|
|
||||||
|
// lay it out
|
||||||
|
LayoutChildAt(aState, ibox, nsRect(0,0,prefSize.width, prefSize.height));
|
||||||
|
}
|
||||||
|
|
||||||
|
SyncLayout(aState);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Replaced by layout
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsPopupSetFrame::Reflow(nsIPresContext* aPresContext,
|
nsPopupSetFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
@@ -283,9 +318,10 @@ nsPopupSetFrame::Reflow(nsIPresContext* aPresContext,
|
|||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsPopupSetFrame::SetDebug(nsIPresContext* aPresContext, PRBool aDebug)
|
nsPopupSetFrame::SetDebug(nsBoxLayoutState& aState, PRBool aDebug)
|
||||||
{
|
{
|
||||||
// see if our state matches the given debug state
|
// see if our state matches the given debug state
|
||||||
PRBool debugSet = mState & NS_STATE_CURRENTLY_IN_DEBUG;
|
PRBool debugSet = mState & NS_STATE_CURRENTLY_IN_DEBUG;
|
||||||
@@ -294,15 +330,15 @@ nsPopupSetFrame::SetDebug(nsIPresContext* aPresContext, PRBool aDebug)
|
|||||||
// if it doesn't then tell each child below us the new debug state
|
// if it doesn't then tell each child below us the new debug state
|
||||||
if (debugChanged)
|
if (debugChanged)
|
||||||
{
|
{
|
||||||
nsBoxFrame::SetDebug(aPresContext, aDebug);
|
nsBoxFrame::SetDebug(aState, aDebug);
|
||||||
SetDebug(aPresContext, mPopupFrames.FirstChild(), aDebug);
|
SetDebug(aState, mPopupFrames.FirstChild(), aDebug);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsPopupSetFrame::SetDebug(nsIPresContext* aPresContext, nsIFrame* aList, PRBool aDebug)
|
nsPopupSetFrame::SetDebug(nsBoxLayoutState& aState, nsIFrame* aList, PRBool aDebug)
|
||||||
{
|
{
|
||||||
if (!aList)
|
if (!aList)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
@@ -310,7 +346,7 @@ nsPopupSetFrame::SetDebug(nsIPresContext* aPresContext, nsIFrame* aList, PRBool
|
|||||||
while (aList) {
|
while (aList) {
|
||||||
nsIBox* ibox = nsnull;
|
nsIBox* ibox = nsnull;
|
||||||
if (NS_SUCCEEDED(aList->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox) {
|
if (NS_SUCCEEDED(aList->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox)) && ibox) {
|
||||||
ibox->SetDebug(aPresContext, aDebug);
|
ibox->SetDebug(aState, aDebug);
|
||||||
}
|
}
|
||||||
|
|
||||||
aList->GetNextSibling(&aList);
|
aList->GetNextSibling(&aList);
|
||||||
@@ -358,7 +394,8 @@ nsPopupSetFrame::RemoveFrame(nsIPresContext* aPresContext,
|
|||||||
if (mPopupFrames.ContainsFrame(aOldFrame)) {
|
if (mPopupFrames.ContainsFrame(aOldFrame)) {
|
||||||
// Go ahead and remove this frame.
|
// Go ahead and remove this frame.
|
||||||
mPopupFrames.DestroyFrame(aPresContext, aOldFrame);
|
mPopupFrames.DestroyFrame(aPresContext, aOldFrame);
|
||||||
rv = GenerateDirtyReflowCommand(aPresContext, aPresShell);
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
rv = MarkDirtyChildren(state);
|
||||||
} else {
|
} else {
|
||||||
rv = nsBoxFrame::RemoveFrame(aPresContext, aPresShell, aListName, aOldFrame);
|
rv = nsBoxFrame::RemoveFrame(aPresContext, aPresShell, aListName, aOldFrame);
|
||||||
}
|
}
|
||||||
@@ -381,8 +418,9 @@ nsPopupSetFrame::InsertFrames(nsIPresContext* aPresContext,
|
|||||||
frameChild->GetTag(*getter_AddRefs(tag));
|
frameChild->GetTag(*getter_AddRefs(tag));
|
||||||
if (tag && tag.get() == nsXULAtoms::popup) {
|
if (tag && tag.get() == nsXULAtoms::popup) {
|
||||||
mPopupFrames.InsertFrames(nsnull, nsnull, aFrameList);
|
mPopupFrames.InsertFrames(nsnull, nsnull, aFrameList);
|
||||||
SetDebug(aPresContext, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
nsBoxLayoutState state(aPresContext);
|
||||||
rv = GenerateDirtyReflowCommand(aPresContext, aPresShell);
|
SetDebug(state, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
||||||
|
rv = MarkDirtyChildren(state);
|
||||||
} else {
|
} else {
|
||||||
rv = nsBoxFrame::InsertFrames(aPresContext, aPresShell, aListName, aPrevFrame, aFrameList);
|
rv = nsBoxFrame::InsertFrames(aPresContext, aPresShell, aListName, aPrevFrame, aFrameList);
|
||||||
}
|
}
|
||||||
@@ -408,8 +446,9 @@ nsPopupSetFrame::AppendFrames(nsIPresContext* aPresContext,
|
|||||||
frameChild->GetTag(*getter_AddRefs(tag));
|
frameChild->GetTag(*getter_AddRefs(tag));
|
||||||
if (tag && tag.get() == nsXULAtoms::popup) {
|
if (tag && tag.get() == nsXULAtoms::popup) {
|
||||||
mPopupFrames.AppendFrames(nsnull, aFrameList);
|
mPopupFrames.AppendFrames(nsnull, aFrameList);
|
||||||
SetDebug(aPresContext, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
nsBoxLayoutState state(aPresContext);
|
||||||
rv = GenerateDirtyReflowCommand(aPresContext, aPresShell);
|
SetDebug(state, aFrameList, mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
||||||
|
rv = MarkDirtyChildren(state);
|
||||||
} else {
|
} else {
|
||||||
rv = nsBoxFrame::AppendFrames(aPresContext, aPresShell, aListName, aFrameList);
|
rv = nsBoxFrame::AppendFrames(aPresContext, aPresShell, aListName, aFrameList);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,9 @@ public:
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow);
|
nsIFrame* aPrevInFlow);
|
||||||
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug);
|
// nsIBox
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD SetDebug(nsBoxLayoutState& aState, PRBool aDebug);
|
||||||
|
|
||||||
// The following four methods are all overridden so that the menu children
|
// The following four methods are all overridden so that the menu children
|
||||||
// can be stored in a separate list (so that they don't impact reflow of the
|
// can be stored in a separate list (so that they don't impact reflow of the
|
||||||
@@ -71,10 +73,6 @@ public:
|
|||||||
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
// Reflow methods
|
// Reflow methods
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
||||||
nsDidReflowStatus aStatus);
|
nsDidReflowStatus aStatus);
|
||||||
|
|
||||||
@@ -123,7 +121,7 @@ protected:
|
|||||||
void UpdateDismissalListener(nsIMenuParent* aMenuParent);
|
void UpdateDismissalListener(nsIMenuParent* aMenuParent);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
nsresult SetDebug(nsIPresContext* aPresContext, nsIFrame* aList, PRBool aDebug);
|
nsresult SetDebug(nsBoxLayoutState& aState, nsIFrame* aList, PRBool aDebug);
|
||||||
|
|
||||||
nsFrameList mPopupFrames;
|
nsFrameList mPopupFrames;
|
||||||
nsIPresContext* mPresContext; // Our pres context.
|
nsIPresContext* mPresContext; // Our pres context.
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ nsRepeatService::GetInstance()
|
|||||||
{
|
{
|
||||||
if (!gInstance) {
|
if (!gInstance) {
|
||||||
gInstance = new nsRepeatService();
|
gInstance = new nsRepeatService();
|
||||||
gInstance->mRefCnt = 1;
|
NS_ADDREF(gInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
return gInstance;
|
return gInstance;
|
||||||
|
|||||||
261
layout/xul/base/src/nsRootBoxFrame.cpp
Normal file
261
layout/xul/base/src/nsRootBoxFrame.cpp
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is mozilla.org code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
#include "nsHTMLParts.h"
|
||||||
|
#include "nsContainerFrame.h"
|
||||||
|
#include "nsCSSRendering.h"
|
||||||
|
#include "nsIDocument.h"
|
||||||
|
#include "nsIReflowCommand.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsViewsCID.h"
|
||||||
|
#include "nsIView.h"
|
||||||
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsIWidget.h"
|
||||||
|
#include "nsHTMLIIDs.h"
|
||||||
|
#include "nsPageFrame.h"
|
||||||
|
#include "nsIRenderingContext.h"
|
||||||
|
#include "nsGUIEvent.h"
|
||||||
|
#include "nsDOMEvent.h"
|
||||||
|
#include "nsStyleConsts.h"
|
||||||
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
#include "nsIEventStateManager.h"
|
||||||
|
#include "nsIDeviceContext.h"
|
||||||
|
#include "nsIScrollableView.h"
|
||||||
|
#include "nsLayoutAtoms.h"
|
||||||
|
#include "nsIPresShell.h"
|
||||||
|
#include "nsBoxFrame.h"
|
||||||
|
#include "nsStackLayout.h"
|
||||||
|
|
||||||
|
// Interface IDs
|
||||||
|
static NS_DEFINE_IID(kScrollViewIID, NS_ISCROLLABLEVIEW_IID);
|
||||||
|
static NS_DEFINE_IID(kIFrameIID, NS_IFRAME_IID);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Root frame class.
|
||||||
|
*
|
||||||
|
* The root frame is the parent frame for the document element's frame.
|
||||||
|
* It only supports having a single child frame which must be an area
|
||||||
|
* frame
|
||||||
|
*/
|
||||||
|
class nsRootBoxFrame : public nsBoxFrame {
|
||||||
|
public:
|
||||||
|
|
||||||
|
friend nsresult NS_NewBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
|
nsRootBoxFrame(nsIPresShell* aShell);
|
||||||
|
|
||||||
|
NS_IMETHOD AppendFrames(nsIPresContext* aPresContext,
|
||||||
|
nsIPresShell& aPresShell,
|
||||||
|
nsIAtom* aListName,
|
||||||
|
nsIFrame* aFrameList);
|
||||||
|
NS_IMETHOD InsertFrames(nsIPresContext* aPresContext,
|
||||||
|
nsIPresShell& aPresShell,
|
||||||
|
nsIAtom* aListName,
|
||||||
|
nsIFrame* aPrevFrame,
|
||||||
|
nsIFrame* aFrameList);
|
||||||
|
NS_IMETHOD RemoveFrame(nsIPresContext* aPresContext,
|
||||||
|
nsIPresShell& aPresShell,
|
||||||
|
nsIAtom* aListName,
|
||||||
|
nsIFrame* aOldFrame);
|
||||||
|
|
||||||
|
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
||||||
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
|
const nsHTMLReflowState& aReflowState,
|
||||||
|
nsReflowStatus& aStatus);
|
||||||
|
NS_IMETHOD HandleEvent(nsIPresContext* aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus* aEventStatus);
|
||||||
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
|
const nsPoint& aPoint,
|
||||||
|
nsFramePaintLayer aWhichLayer,
|
||||||
|
nsIFrame** aFrame);
|
||||||
|
/**
|
||||||
|
* Get the "type" of the frame
|
||||||
|
*
|
||||||
|
* @see nsLayoutAtoms::rootFrame
|
||||||
|
*/
|
||||||
|
NS_IMETHOD GetFrameType(nsIAtom** aType) const;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
||||||
|
NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewRootBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
||||||
|
if (nsnull == aNewFrame) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
nsRootBoxFrame* it = new (aPresShell) nsRootBoxFrame (aPresShell);
|
||||||
|
if (nsnull == it) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
it->SetLayoutManager(new nsStackLayout(aPresShell));
|
||||||
|
*aNewFrame = it;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsRootBoxFrame::nsRootBoxFrame(nsIPresShell* aShell):nsBoxFrame(aShell, PR_TRUE)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::AppendFrames(nsIPresContext* aPresContext,
|
||||||
|
nsIPresShell& aPresShell,
|
||||||
|
nsIAtom* aListName,
|
||||||
|
nsIFrame* aFrameList)
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
NS_ASSERTION(!aListName, "unexpected child list name");
|
||||||
|
NS_PRECONDITION(mFrames.IsEmpty(), "already have a child frame");
|
||||||
|
if (aListName) {
|
||||||
|
// We only support unnamed principal child list
|
||||||
|
rv = NS_ERROR_INVALID_ARG;
|
||||||
|
|
||||||
|
} else if (!mFrames.IsEmpty()) {
|
||||||
|
// We only allow a single child frame
|
||||||
|
rv = NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
rv = nsBoxFrame::AppendFrames(aPresContext, aPresShell, aListName, aFrameList);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::InsertFrames(nsIPresContext* aPresContext,
|
||||||
|
nsIPresShell& aPresShell,
|
||||||
|
nsIAtom* aListName,
|
||||||
|
nsIFrame* aPrevFrame,
|
||||||
|
nsIFrame* aFrameList)
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
// Because we only support a single child frame inserting is the same
|
||||||
|
// as appending
|
||||||
|
NS_PRECONDITION(!aPrevFrame, "unexpected previous sibling frame");
|
||||||
|
if (aPrevFrame) {
|
||||||
|
rv = NS_ERROR_UNEXPECTED;
|
||||||
|
} else {
|
||||||
|
rv = AppendFrames(aPresContext, aPresShell, aListName, aFrameList);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::RemoveFrame(nsIPresContext* aPresContext,
|
||||||
|
nsIPresShell& aPresShell,
|
||||||
|
nsIAtom* aListName,
|
||||||
|
nsIFrame* aOldFrame)
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
NS_ASSERTION(!aListName, "unexpected child list name");
|
||||||
|
if (aListName) {
|
||||||
|
// We only support the unnamed principal child list
|
||||||
|
rv = NS_ERROR_INVALID_ARG;
|
||||||
|
|
||||||
|
} else if (aOldFrame == mFrames.FirstChild()) {
|
||||||
|
rv = nsBoxFrame::RemoveFrame(aPresContext, aPresShell, aListName, aOldFrame);
|
||||||
|
} else {
|
||||||
|
rv = NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
|
const nsHTMLReflowState& aReflowState,
|
||||||
|
nsReflowStatus& aStatus)
|
||||||
|
{
|
||||||
|
return nsBoxFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::HandleEvent(nsIPresContext* aPresContext,
|
||||||
|
nsGUIEvent* aEvent,
|
||||||
|
nsEventStatus* aEventStatus)
|
||||||
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aEventStatus);
|
||||||
|
if (nsEventStatus_eConsumeNoDefault == *aEventStatus) {
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aEvent->message == NS_MOUSE_LEFT_BUTTON_UP ||
|
||||||
|
aEvent->message == NS_MOUSE_MIDDLE_BUTTON_UP ||
|
||||||
|
aEvent->message == NS_MOUSE_RIGHT_BUTTON_UP) {
|
||||||
|
nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
|
const nsPoint& aPoint,
|
||||||
|
nsFramePaintLayer aWhichLayer,
|
||||||
|
nsIFrame** aFrame)
|
||||||
|
{
|
||||||
|
// this should act like a block, so we need to override
|
||||||
|
return nsBoxFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::GetFrameType(nsIAtom** aType) const
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(nsnull != aType, "null OUT parameter pointer");
|
||||||
|
*aType = nsLayoutAtoms::rootFrame;
|
||||||
|
NS_ADDREF(*aType);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::GetFrameName(nsString& aResult) const
|
||||||
|
{
|
||||||
|
return MakeFrameName("RootBox", aResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsRootBoxFrame::SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const
|
||||||
|
{
|
||||||
|
if (!aResult) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
*aResult = sizeof(*this);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -64,7 +64,7 @@ NS_NewScrollbarButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
|
|
||||||
|
|
||||||
nsScrollbarButtonFrame::nsScrollbarButtonFrame(nsIPresShell* aPresShell)
|
nsScrollbarButtonFrame::nsScrollbarButtonFrame(nsIPresShell* aPresShell)
|
||||||
:nsXULButtonFrame(aPresShell)
|
:nsButtonBoxFrame(aPresShell)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ nsScrollbarButtonFrame::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nsXULButtonFrame::QueryInterface(aIID, aInstancePtr);
|
return nsButtonBoxFrame::QueryInterface(aIID, aInstancePtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
@@ -91,7 +91,7 @@ nsScrollbarButtonFrame::HandleEvent(nsIPresContext* aPresContext,
|
|||||||
if (aEvent->message == NS_MOUSE_EXIT|| aEvent->message == NS_MOUSE_RIGHT_BUTTON_UP || aEvent->message == NS_MOUSE_LEFT_BUTTON_UP)
|
if (aEvent->message == NS_MOUSE_EXIT|| aEvent->message == NS_MOUSE_RIGHT_BUTTON_UP || aEvent->message == NS_MOUSE_LEFT_BUTTON_UP)
|
||||||
HandleRelease(aPresContext, aEvent, aEventStatus);
|
HandleRelease(aPresContext, aEvent, aEventStatus);
|
||||||
|
|
||||||
return nsXULButtonFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
return nsButtonBoxFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -245,5 +245,5 @@ nsScrollbarButtonFrame::Destroy(nsIPresContext* aPresContext)
|
|||||||
// Ensure our repeat service isn't going... it's possible that a scrollbar can disappear out
|
// Ensure our repeat service isn't going... it's possible that a scrollbar can disappear out
|
||||||
// from under you while you're in the process of scrolling.
|
// from under you while you're in the process of scrolling.
|
||||||
nsRepeatService::GetInstance()->Stop();
|
nsRepeatService::GetInstance()->Stop();
|
||||||
return nsXULButtonFrame::Destroy(aPresContext);
|
return nsButtonBoxFrame::Destroy(aPresContext);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,12 +30,12 @@
|
|||||||
#ifndef nsScrollbarButtonFrame_h___
|
#ifndef nsScrollbarButtonFrame_h___
|
||||||
#define nsScrollbarButtonFrame_h___
|
#define nsScrollbarButtonFrame_h___
|
||||||
|
|
||||||
#include "nsXULButtonFrame.h"
|
#include "nsButtonBoxFrame.h"
|
||||||
#include "nsITimerCallback.h"
|
#include "nsITimerCallback.h"
|
||||||
|
|
||||||
class nsSliderFrame;
|
class nsSliderFrame;
|
||||||
|
|
||||||
class nsScrollbarButtonFrame : public nsXULButtonFrame,
|
class nsScrollbarButtonFrame : public nsButtonBoxFrame,
|
||||||
public nsITimerCallback
|
public nsITimerCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
#include "nsIScrollableView.h"
|
#include "nsIScrollableView.h"
|
||||||
#include "nsRepeatService.h"
|
#include "nsRepeatService.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
#define DEBUG_SLIDER PR_FALSE
|
#define DEBUG_SLIDER PR_FALSE
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ NS_NewSliderFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame)
|
|||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsSliderFrame* it = new (aPresShell) nsSliderFrame();
|
nsSliderFrame* it = new (aPresShell) nsSliderFrame(aPresShell);
|
||||||
if (nsnull == it)
|
if (nsnull == it)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
@@ -77,8 +78,8 @@ NS_NewSliderFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame)
|
|||||||
|
|
||||||
} // NS_NewSliderFrame
|
} // NS_NewSliderFrame
|
||||||
|
|
||||||
nsSliderFrame::nsSliderFrame()
|
nsSliderFrame::nsSliderFrame(nsIPresShell* aPresShell):nsBoxFrame(aPresShell),
|
||||||
: mCurPos(0), mScrollbarListener(nsnull),mChange(0)
|
mCurPos(0), mScrollbarListener(nsnull),mChange(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +96,7 @@ nsSliderFrame::Init(nsIPresContext* aPresContext,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow)
|
nsIFrame* aPrevInFlow)
|
||||||
{
|
{
|
||||||
nsresult rv = nsHTMLContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
nsresult rv = nsBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
||||||
CreateViewForFrame(aPresContext,this,aContext,PR_TRUE);
|
CreateViewForFrame(aPresContext,this,aContext,PR_TRUE);
|
||||||
nsIView* view;
|
nsIView* view;
|
||||||
GetView(aPresContext, &view);
|
GetView(aPresContext, &view);
|
||||||
@@ -153,7 +154,7 @@ nsSliderFrame::AttributeChanged(nsIPresContext* aPresContext,
|
|||||||
nsIAtom* aAttribute,
|
nsIAtom* aAttribute,
|
||||||
PRInt32 aHint)
|
PRInt32 aHint)
|
||||||
{
|
{
|
||||||
nsresult rv = nsHTMLContainerFrame::AttributeChanged(aPresContext, aChild,
|
nsresult rv = nsBoxFrame::AttributeChanged(aPresContext, aChild,
|
||||||
aNameSpaceID, aAttribute, aHint);
|
aNameSpaceID, aAttribute, aHint);
|
||||||
// if the current position changes
|
// if the current position changes
|
||||||
if (aAttribute == nsXULAtoms::curpos) {
|
if (aAttribute == nsXULAtoms::curpos) {
|
||||||
@@ -164,7 +165,8 @@ nsSliderFrame::AttributeChanged(nsIPresContext* aPresContext,
|
|||||||
} else if (aAttribute == nsXULAtoms::maxpos) {
|
} else if (aAttribute == nsXULAtoms::maxpos) {
|
||||||
// bounds check it.
|
// bounds check it.
|
||||||
|
|
||||||
nsIContent* scrollbar = GetScrollBar();
|
nsIBox* scrollbarBox = GetScrollbar();
|
||||||
|
nsIContent* scrollbar = GetContentOf(scrollbarBox);
|
||||||
PRInt32 current = GetCurrentPosition(scrollbar);
|
PRInt32 current = GetCurrentPosition(scrollbar);
|
||||||
PRInt32 max = GetMaxPosition(scrollbar);
|
PRInt32 max = GetMaxPosition(scrollbar);
|
||||||
if (current < 0 || current > max)
|
if (current < 0 || current > max)
|
||||||
@@ -189,16 +191,8 @@ nsSliderFrame::AttributeChanged(nsIPresContext* aPresContext,
|
|||||||
nsCOMPtr<nsIPresShell> shell;
|
nsCOMPtr<nsIPresShell> shell;
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
|
|
||||||
/*
|
nsBoxLayoutState state(aPresContext);
|
||||||
nsCOMPtr<nsIReflowCommand> reflowCmd;
|
MarkDirtyChildren(state);
|
||||||
rv = NS_NewHTMLReflowCommand(getter_AddRefs(reflowCmd), this,
|
|
||||||
nsIReflowCommand::StyleChanged);
|
|
||||||
if (NS_SUCCEEDED(rv))
|
|
||||||
shell->AppendReflowCommand(reflowCmd);
|
|
||||||
*/
|
|
||||||
|
|
||||||
mState |= NS_FRAME_IS_DIRTY;
|
|
||||||
return mParent->ReflowDirtyChild(shell, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
@@ -211,12 +205,21 @@ nsSliderFrame::Paint(nsIPresContext* aPresContext,
|
|||||||
nsFramePaintLayer aWhichLayer)
|
nsFramePaintLayer aWhichLayer)
|
||||||
{
|
{
|
||||||
// if we are too small to have a thumb don't paint it.
|
// if we are too small to have a thumb don't paint it.
|
||||||
nsIFrame* thumbFrame = mFrames.FirstChild();
|
nsIBox* thumb;
|
||||||
NS_ASSERTION(thumbFrame,"Slider does not have a thumb!!!!");
|
GetChildBox(&thumb);
|
||||||
|
|
||||||
nsSize size(0,0);
|
NS_ASSERTION(thumb,"Slider does not have a thumb!!!!");
|
||||||
thumbFrame->GetSize(size);
|
|
||||||
if (mRect.width < size.width || mRect.height < size.height)
|
nsRect thumbRect;
|
||||||
|
thumb->GetBounds(thumbRect);
|
||||||
|
nsMargin m;
|
||||||
|
thumb->GetMargin(m);
|
||||||
|
thumbRect.Inflate(m);
|
||||||
|
|
||||||
|
nsRect rect;
|
||||||
|
GetClientRect(rect);
|
||||||
|
|
||||||
|
if (rect.width < thumbRect.width || rect.height < thumbRect.height)
|
||||||
{
|
{
|
||||||
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) {
|
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) {
|
||||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
||||||
@@ -236,92 +239,44 @@ nsSliderFrame::Paint(nsIPresContext* aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nsHTMLContainerFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
return nsBoxFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
nsSliderFrame::ReflowThumb(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus,
|
|
||||||
nsIFrame* thumbFrame,
|
|
||||||
nsSize available,
|
|
||||||
nsSize computed)
|
|
||||||
{
|
|
||||||
nsHTMLReflowState thumbReflowState(aPresContext, aReflowState,
|
|
||||||
thumbFrame, available);
|
|
||||||
|
|
||||||
// always give the thumb as much size as it needs
|
|
||||||
thumbReflowState.mComputedWidth = computed.width;
|
|
||||||
thumbReflowState.mComputedHeight = computed.height;
|
|
||||||
|
|
||||||
// subtract out the childs margin and border if computed
|
|
||||||
const nsStyleSpacing* spacing;
|
|
||||||
nsresult rv = thumbFrame->GetStyleData(eStyleStruct_Spacing,
|
|
||||||
(const nsStyleStruct*&) spacing);
|
|
||||||
|
|
||||||
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get spacing");
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
|
|
||||||
nsMargin margin(0,0,0,0);
|
|
||||||
spacing->GetMargin(margin);
|
|
||||||
nsMargin border(0,0,0,0);
|
|
||||||
spacing->GetBorderPadding(border);
|
|
||||||
nsMargin total = margin + border;
|
|
||||||
|
|
||||||
if (thumbReflowState.mComputedWidth != NS_INTRINSICSIZE)
|
|
||||||
thumbReflowState.mComputedWidth -= total.left + total.right;
|
|
||||||
|
|
||||||
if (thumbReflowState.mComputedHeight != NS_INTRINSICSIZE)
|
|
||||||
thumbReflowState.mComputedHeight -= total.top + total.bottom;
|
|
||||||
|
|
||||||
ReflowChild(thumbFrame, aPresContext, aDesiredSize, thumbReflowState,
|
|
||||||
0, 0, NS_FRAME_NO_MOVE_FRAME, aStatus);
|
|
||||||
thumbFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
|
|
||||||
|
|
||||||
// add the margin back in
|
|
||||||
aDesiredSize.width += margin.left + margin.right;
|
|
||||||
aDesiredSize.height += margin.top + margin.bottom;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRBool
|
|
||||||
nsSliderFrame::IsHorizontal(nsIContent* scrollbar)
|
|
||||||
{
|
|
||||||
PRBool isHorizontal = PR_TRUE;
|
|
||||||
nsAutoString value;
|
|
||||||
if (NS_CONTENT_ATTR_HAS_VALUE == scrollbar->GetAttribute(kNameSpaceID_None, nsHTMLAtoms::align, value))
|
|
||||||
{
|
|
||||||
if (value.Equals("vertical"))
|
|
||||||
isHorizontal = PR_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return isHorizontal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsSliderFrame::Reflow(nsIPresContext* aPresContext,
|
nsSliderFrame::Layout(nsBoxLayoutState& aBoxLayoutState)
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
{
|
||||||
nsIContent* scrollbar = GetScrollBar();
|
EnsureOrient();
|
||||||
|
|
||||||
PRBool isHorizontal = IsHorizontal(scrollbar);
|
if (mState & NS_STATE_DEBUG_WAS_SET) {
|
||||||
|
if (mState & NS_STATE_SET_TO_DEBUG)
|
||||||
|
SetDebug(aBoxLayoutState, PR_TRUE);
|
||||||
|
else
|
||||||
|
SetDebug(aBoxLayoutState, PR_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
// flow our thumb with our computed width and its intrinsic height
|
// get the content area inside our borders
|
||||||
nsIFrame* thumbFrame = mFrames.FirstChild();
|
nsRect clientRect(0,0,0,0);
|
||||||
NS_ASSERTION(thumbFrame,"Slider does not have a thumb!!!!");
|
GetClientRect(clientRect);
|
||||||
|
|
||||||
nsHTMLReflowMetrics thumbSize(nsnull);
|
// get the scrollbar
|
||||||
|
nsIBox* scrollbarBox = GetScrollbar();
|
||||||
|
nsIContent* scrollbar = GetContentOf(scrollbarBox);
|
||||||
|
PRBool isHorizontal = IsHorizontal();
|
||||||
|
|
||||||
nsSize availableSize(isHorizontal ? NS_INTRINSICSIZE: aReflowState.mComputedWidth, isHorizontal ? aReflowState.mComputedHeight : NS_INTRINSICSIZE);
|
// get the thumb should be our only child
|
||||||
nsSize computedSize(isHorizontal ? NS_INTRINSICSIZE: aReflowState.mComputedWidth, isHorizontal ? aReflowState.mComputedHeight : NS_INTRINSICSIZE);
|
nsIBox* thumbBox = nsnull;
|
||||||
|
GetChildBox(&thumbBox);
|
||||||
|
|
||||||
ReflowThumb(aPresContext, thumbSize, aReflowState, aStatus, thumbFrame, availableSize, computedSize);
|
NS_ASSERTION(thumbBox,"Slider does not have a thumb!!!!");
|
||||||
|
|
||||||
|
// get the thumb's pref size
|
||||||
|
nsSize thumbSize(0,0);
|
||||||
|
thumbBox->GetPrefSize(aBoxLayoutState, thumbSize);
|
||||||
|
|
||||||
|
if (isHorizontal)
|
||||||
|
thumbSize.height = clientRect.height;
|
||||||
|
else
|
||||||
|
thumbSize.width = clientRect.width;
|
||||||
|
|
||||||
// get our current position and max position from our content node
|
// get our current position and max position from our content node
|
||||||
PRInt32 curpospx = GetCurrentPosition(scrollbar);
|
PRInt32 curpospx = GetCurrentPosition(scrollbar);
|
||||||
@@ -332,11 +287,11 @@ nsSliderFrame::Reflow(nsIPresContext* aPresContext,
|
|||||||
else if (curpospx > maxpospx)
|
else if (curpospx > maxpospx)
|
||||||
curpospx = maxpospx;
|
curpospx = maxpospx;
|
||||||
|
|
||||||
// if the computed height we are given is intrinsic then set it to some default height
|
|
||||||
float p2t;
|
float p2t;
|
||||||
aPresContext->GetScaledPixelsToTwips(&p2t);
|
aBoxLayoutState.GetPresContext()->GetScaledPixelsToTwips(&p2t);
|
||||||
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
||||||
|
|
||||||
|
/*
|
||||||
if (aReflowState.mComputedHeight == NS_INTRINSICSIZE)
|
if (aReflowState.mComputedHeight == NS_INTRINSICSIZE)
|
||||||
aDesiredSize.height = isHorizontal ? thumbSize.height : 200*onePixel;
|
aDesiredSize.height = isHorizontal ? thumbSize.height : 200*onePixel;
|
||||||
else {
|
else {
|
||||||
@@ -353,75 +308,56 @@ nsSliderFrame::Reflow(nsIPresContext* aPresContext,
|
|||||||
// if (aDesiredSize.width < thumbSize.width)
|
// if (aDesiredSize.width < thumbSize.width)
|
||||||
// aDesiredSize.width = thumbSize.width;
|
// aDesiredSize.width = thumbSize.width;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// get max pos in twips
|
// get max pos in twips
|
||||||
nscoord maxpos = maxpospx*onePixel;
|
nscoord maxpos = maxpospx*onePixel;
|
||||||
|
|
||||||
// get our maxpos in twips. This is the space we have left over in the scrollbar
|
// get our maxpos in twips. This is the space we have left over in the scrollbar
|
||||||
// after the height of the thumb has been removed
|
// after the height of the thumb has been removed
|
||||||
nscoord& desiredcoord = isHorizontal ? aDesiredSize.width : aDesiredSize.height;
|
nscoord& desiredcoord = isHorizontal ? clientRect.width : clientRect.height;
|
||||||
nscoord& thumbcoord = isHorizontal ? thumbSize.width : thumbSize.height;
|
nscoord& thumbcoord = isHorizontal ? thumbSize.width : thumbSize.height;
|
||||||
|
|
||||||
nscoord ourmaxpos = desiredcoord;
|
nscoord ourmaxpos = desiredcoord;
|
||||||
|
|
||||||
mRatio = float(ourmaxpos)/float(maxpos + ourmaxpos);
|
mRatio = float(ourmaxpos)/float(maxpos + ourmaxpos);
|
||||||
|
|
||||||
nscoord thumbsize = nscoord(ourmaxpos * mRatio);
|
|
||||||
// if there is more room than the thumb need stretch the
|
// if there is more room than the thumb need stretch the
|
||||||
// thumb
|
// thumb
|
||||||
|
|
||||||
|
nscoord thumbsize = nscoord(ourmaxpos * mRatio);
|
||||||
|
|
||||||
if (thumbsize > thumbcoord) {
|
if (thumbsize > thumbcoord) {
|
||||||
|
nscoord flex = 0;
|
||||||
|
thumbBox->GetFlex(aBoxLayoutState, flex);
|
||||||
|
|
||||||
// if the thumb is flexible make the thumb bigger.
|
// if the thumb is flexible make the thumb bigger.
|
||||||
nsCOMPtr<nsIContent> content;
|
if (flex > 0) {
|
||||||
thumbFrame->GetContent(getter_AddRefs(content));
|
|
||||||
|
|
||||||
PRInt32 error;
|
|
||||||
nsAutoString value;
|
|
||||||
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttribute(kNameSpaceID_None, nsXULAtoms::flex, value))
|
|
||||||
{
|
|
||||||
value.Trim("%");
|
|
||||||
// convert to a percent.
|
|
||||||
if (value.ToFloat(&error) > 0.0) {
|
|
||||||
if (isHorizontal)
|
if (isHorizontal)
|
||||||
computedSize.width = thumbsize;
|
thumbSize.width = nscoord(ourmaxpos * mRatio);
|
||||||
else
|
else
|
||||||
computedSize.height = thumbsize;
|
thumbSize.height = nscoord(ourmaxpos * mRatio);
|
||||||
|
|
||||||
ReflowThumb(aPresContext, thumbSize, aReflowState, aStatus, thumbFrame, availableSize, computedSize);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ourmaxpos -= thumbcoord;
|
ourmaxpos -= thumbcoord;
|
||||||
mRatio = float(ourmaxpos)/float(maxpos);
|
mRatio = float(ourmaxpos)/float(maxpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get our border
|
|
||||||
const nsMargin& borderPadding = aReflowState.mComputedBorderPadding;
|
|
||||||
|
|
||||||
nscoord curpos = curpospx*onePixel;
|
nscoord curpos = curpospx*onePixel;
|
||||||
|
|
||||||
// set the thumbs y coord to be the current pos * the ratio.
|
// set the thumbs y coord to be the current pos * the ratio.
|
||||||
nscoord pos = nscoord(float(curpos)*mRatio);
|
nscoord pos = nscoord(float(curpos)*mRatio);
|
||||||
nsRect thumbRect(borderPadding.left, borderPadding.top, thumbSize.width, thumbSize.height);
|
nsRect thumbRect(clientRect.x, clientRect.y, thumbSize.width, thumbSize.height);
|
||||||
|
|
||||||
if (isHorizontal)
|
if (isHorizontal)
|
||||||
thumbRect.x += pos;
|
thumbRect.x += pos;
|
||||||
else
|
else
|
||||||
thumbRect.y += pos;
|
thumbRect.y += pos;
|
||||||
|
|
||||||
nsIView* view;
|
thumbBox->SetBounds(aBoxLayoutState, thumbRect);
|
||||||
thumbFrame->SetRect(aPresContext, thumbRect);
|
thumbBox->Layout(aBoxLayoutState);
|
||||||
thumbFrame->GetView(aPresContext, &view);
|
|
||||||
if (view) {
|
|
||||||
nsContainerFrame::SyncFrameViewAfterReflow(aPresContext, thumbFrame,
|
|
||||||
view, nsnull);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add in our border
|
SyncLayout(aBoxLayoutState);
|
||||||
aDesiredSize.width += borderPadding.left + borderPadding.right;
|
|
||||||
aDesiredSize.height += borderPadding.top + borderPadding.bottom;
|
|
||||||
|
|
||||||
aDesiredSize.ascent = aDesiredSize.height;
|
|
||||||
aDesiredSize.descent = 0;
|
|
||||||
|
|
||||||
if (DEBUG_SLIDER) {
|
if (DEBUG_SLIDER) {
|
||||||
PRInt32 c = GetCurrentPosition(scrollbar);
|
PRInt32 c = GetCurrentPosition(scrollbar);
|
||||||
@@ -438,9 +374,9 @@ nsSliderFrame::HandleEvent(nsIPresContext* aPresContext,
|
|||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus* aEventStatus)
|
nsEventStatus* aEventStatus)
|
||||||
{
|
{
|
||||||
nsIContent* scrollbar = GetScrollBar();
|
nsIBox* scrollbarBox = GetScrollbar();
|
||||||
|
nsIContent* scrollbar = GetContentOf(scrollbarBox);
|
||||||
PRBool isHorizontal = IsHorizontal(scrollbar);
|
PRBool isHorizontal = IsHorizontal();
|
||||||
|
|
||||||
if (isDraggingThumb(aPresContext))
|
if (isDraggingThumb(aPresContext))
|
||||||
{
|
{
|
||||||
@@ -536,8 +472,8 @@ nsSliderFrame::HandleEvent(nsIPresContext* aPresContext,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
nsIContent*
|
nsIBox*
|
||||||
nsSliderFrame::GetScrollBar()
|
nsSliderFrame::GetScrollbar()
|
||||||
{
|
{
|
||||||
// if we are in a scrollbar then return the scrollbar's content node
|
// if we are in a scrollbar then return the scrollbar's content node
|
||||||
// if we are not then return ours.
|
// if we are not then return ours.
|
||||||
@@ -545,11 +481,24 @@ nsSliderFrame::GetScrollBar()
|
|||||||
nsScrollbarButtonFrame::GetParentWithTag(nsXULAtoms::scrollbar, this, scrollbar);
|
nsScrollbarButtonFrame::GetParentWithTag(nsXULAtoms::scrollbar, this, scrollbar);
|
||||||
|
|
||||||
if (scrollbar == nsnull)
|
if (scrollbar == nsnull)
|
||||||
scrollbar = this;
|
return this;
|
||||||
|
|
||||||
nsCOMPtr<nsIContent> content;
|
nsIBox* ibox = nsnull;
|
||||||
scrollbar->GetContent(getter_AddRefs(content));
|
scrollbar->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox);
|
||||||
|
|
||||||
|
if (ibox == nsnull)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
return ibox;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIContent*
|
||||||
|
nsSliderFrame::GetContentOf(nsIBox* aBox)
|
||||||
|
{
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
aBox->GetFrame(&frame);
|
||||||
|
nsIContent* content = nsnull;
|
||||||
|
frame->GetContent(&content);
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -559,7 +508,8 @@ nsSliderFrame::PageUpDown(nsIFrame* aThumbFrame, nscoord change)
|
|||||||
// on a page up or down get our page increment. We get this by getting the scrollbar we are in and
|
// on a page up or down get our page increment. We get this by getting the scrollbar we are in and
|
||||||
// asking it for the current position and the page increment. If we are not in a scrollbar we will
|
// asking it for the current position and the page increment. If we are not in a scrollbar we will
|
||||||
// get the values from our own node.
|
// get the values from our own node.
|
||||||
nsIContent* scrollbar = GetScrollBar();
|
nsIBox* scrollbarBox = GetScrollbar();
|
||||||
|
nsIContent* scrollbar = GetContentOf(scrollbarBox);
|
||||||
|
|
||||||
if (mScrollbarListener)
|
if (mScrollbarListener)
|
||||||
mScrollbarListener->PagedUpDown(); // Let the listener decide our increment.
|
mScrollbarListener->PagedUpDown(); // Let the listener decide our increment.
|
||||||
@@ -573,9 +523,10 @@ nsSliderFrame::PageUpDown(nsIFrame* aThumbFrame, nscoord change)
|
|||||||
nsresult
|
nsresult
|
||||||
nsSliderFrame::CurrentPositionChanged(nsIPresContext* aPresContext)
|
nsSliderFrame::CurrentPositionChanged(nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
nsIContent* scrollbar = GetScrollBar();
|
nsIBox* scrollbarBox = GetScrollbar();
|
||||||
|
nsIContent* scrollbar = GetContentOf(scrollbarBox);
|
||||||
|
|
||||||
PRBool isHorizontal = IsHorizontal(scrollbar);
|
PRBool isHorizontal = IsHorizontal();
|
||||||
|
|
||||||
// get the current position
|
// get the current position
|
||||||
PRInt32 curpos = GetCurrentPosition(scrollbar);
|
PRInt32 curpos = GetCurrentPosition(scrollbar);
|
||||||
@@ -678,35 +629,12 @@ NS_IMETHODIMP nsSliderFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((! mRect.Contains(aPoint)) ||
|
if (!mRect.Contains(aPoint))
|
||||||
(aWhichLayer != NS_FRAME_PAINT_LAYER_FOREGROUND)) {
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
|
||||||
|
|
||||||
nsIFrame* thumbFrame = mFrames.FirstChild();
|
|
||||||
// XXX If thumbFrame always considers itself FOREGROUND, then it
|
|
||||||
// would be better to just call thumbFrame->GetFrameForPoint and
|
|
||||||
// return if it returns NS_OK.
|
|
||||||
nsRect thumbRect;
|
|
||||||
thumbFrame->GetRect(thumbRect);
|
|
||||||
|
|
||||||
nsPoint tmp;
|
if (NS_SUCCEEDED(nsBoxFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame)))
|
||||||
tmp.MoveTo(aPoint.x - mRect.x, aPoint.y - mRect.y);
|
|
||||||
|
|
||||||
if (thumbRect.Contains(tmp)) {
|
|
||||||
nsIStyleContext *tsc;
|
|
||||||
thumbFrame->GetStyleContext(&tsc);
|
|
||||||
if (tsc) {
|
|
||||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
|
||||||
tsc->GetStyleData(eStyleStruct_Display);
|
|
||||||
if (disp->IsVisible()) {
|
|
||||||
*aFrame = thumbFrame;
|
|
||||||
NS_RELEASE(tsc);
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
|
||||||
NS_RELEASE(tsc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// always return us (if visible)
|
// always return us (if visible)
|
||||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
||||||
@@ -717,8 +645,6 @@ NS_IMETHODIMP nsSliderFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
//return nsHTMLContainerFrame::GetFrameForPoint(aPresContext, aPoint, aFrame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -728,55 +654,19 @@ nsSliderFrame::SetInitialChildList(nsIPresContext* aPresContext,
|
|||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
nsIFrame* aChildList)
|
nsIFrame* aChildList)
|
||||||
{
|
{
|
||||||
nsresult r = nsHTMLContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList);
|
nsresult r = nsBoxFrame::SetInitialChildList(aPresContext, aListName, aChildList);
|
||||||
|
|
||||||
AddListener();
|
AddListener();
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsSliderFrame::RemoveFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIPresShell& aPresShell,
|
|
||||||
nsIAtom* aListName,
|
|
||||||
nsIFrame* aOldFrame)
|
|
||||||
{
|
|
||||||
// remove the child frame
|
|
||||||
nsresult rv = nsHTMLContainerFrame::RemoveFrame(aPresContext, aPresShell, aListName, aOldFrame);
|
|
||||||
mFrames.DestroyFrame(aPresContext, aOldFrame);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsSliderFrame::InsertFrames(nsIPresContext* aPresContext,
|
|
||||||
nsIPresShell& aPresShell,
|
|
||||||
nsIAtom* aListName,
|
|
||||||
nsIFrame* aPrevFrame,
|
|
||||||
nsIFrame* aFrameList)
|
|
||||||
{
|
|
||||||
mFrames.InsertFrames(nsnull, aPrevFrame, aFrameList);
|
|
||||||
return nsHTMLContainerFrame::InsertFrames(aPresContext, aPresShell, aListName, aPrevFrame, aFrameList);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsSliderFrame::AppendFrames(nsIPresContext* aPresContext,
|
|
||||||
nsIPresShell& aPresShell,
|
|
||||||
nsIAtom* aListName,
|
|
||||||
nsIFrame* aFrameList)
|
|
||||||
{
|
|
||||||
mFrames.AppendFrames(nsnull, aFrameList);
|
|
||||||
return nsHTMLContainerFrame::AppendFrames(aPresContext, aPresShell, aListName, aFrameList);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsSliderFrame::MouseDown(nsIDOMEvent* aMouseEvent)
|
nsSliderFrame::MouseDown(nsIDOMEvent* aMouseEvent)
|
||||||
{
|
{
|
||||||
//printf("Begin dragging\n");
|
//printf("Begin dragging\n");
|
||||||
|
|
||||||
nsIContent* scrollbar = GetScrollBar();
|
PRBool isHorizontal = IsHorizontal();
|
||||||
PRBool isHorizontal = IsHorizontal(scrollbar);
|
|
||||||
|
|
||||||
nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(aMouseEvent));
|
nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(aMouseEvent));
|
||||||
|
|
||||||
@@ -885,7 +775,7 @@ nsSliderFrame::RemoveListener()
|
|||||||
NS_INTERFACE_MAP_BEGIN(nsSliderFrame)
|
NS_INTERFACE_MAP_BEGIN(nsSliderFrame)
|
||||||
NS_INTERFACE_MAP_ENTRY(nsIDOMMouseListener)
|
NS_INTERFACE_MAP_ENTRY(nsIDOMMouseListener)
|
||||||
NS_INTERFACE_MAP_ENTRY(nsITimerCallback)
|
NS_INTERFACE_MAP_ENTRY(nsITimerCallback)
|
||||||
NS_INTERFACE_MAP_END_INHERITING(nsHTMLContainerFrame)
|
NS_INTERFACE_MAP_END_INHERITING(nsBoxFrame)
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP_(nsrefcnt)
|
NS_IMETHODIMP_(nsrefcnt)
|
||||||
@@ -905,8 +795,7 @@ nsSliderFrame::HandlePress(nsIPresContext* aPresContext,
|
|||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus* aEventStatus)
|
nsEventStatus* aEventStatus)
|
||||||
{
|
{
|
||||||
nsIContent* scrollbar = GetScrollBar();
|
PRBool isHorizontal = IsHorizontal();
|
||||||
PRBool isHorizontal = IsHorizontal(scrollbar);
|
|
||||||
|
|
||||||
nsIFrame* thumbFrame = mFrames.FirstChild();
|
nsIFrame* thumbFrame = mFrames.FirstChild();
|
||||||
nsRect thumbRect;
|
nsRect thumbRect;
|
||||||
@@ -969,7 +858,47 @@ nsSliderFrame::Destroy(nsIPresContext* aPresContext)
|
|||||||
RemoveListener(); // remove this line when 21571 is fixed properly
|
RemoveListener(); // remove this line when 21571 is fixed properly
|
||||||
|
|
||||||
// call base class Destroy()
|
// call base class Destroy()
|
||||||
return nsHTMLContainerFrame::Destroy(aPresContext);
|
return nsBoxFrame::Destroy(aPresContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsSliderFrame::GetPrefSize(nsBoxLayoutState& aState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
EnsureOrient();
|
||||||
|
return nsBoxFrame::GetPrefSize(aState, aSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsSliderFrame::GetMinSize(nsBoxLayoutState& aState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
EnsureOrient();
|
||||||
|
|
||||||
|
// our min size is just our borders and padding
|
||||||
|
return nsBox::GetMinSize(aState, aSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsSliderFrame::GetMaxSize(nsBoxLayoutState& aState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
EnsureOrient();
|
||||||
|
return nsBoxFrame::GetMaxSize(aState, aSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsSliderFrame::EnsureOrient()
|
||||||
|
{
|
||||||
|
nsIBox* scrollbarBox = GetScrollbar();
|
||||||
|
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
scrollbarBox->GetFrame(&frame);
|
||||||
|
nsFrameState state;
|
||||||
|
frame->GetFrameState(&state);
|
||||||
|
|
||||||
|
PRBool isHorizontal = state & NS_STATE_IS_HORIZONTAL;
|
||||||
|
if (isHorizontal)
|
||||||
|
mState |= NS_STATE_IS_HORIZONTAL;
|
||||||
|
else
|
||||||
|
mState &= ~NS_STATE_IS_HORIZONTAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -988,8 +917,7 @@ NS_IMETHODIMP_(void) nsSliderFrame::Notify(nsITimer *timer)
|
|||||||
nsRect thumbRect;
|
nsRect thumbRect;
|
||||||
thumbFrame->GetRect(thumbRect);
|
thumbFrame->GetRect(thumbRect);
|
||||||
|
|
||||||
nsIContent* scrollbar = GetScrollBar();
|
PRBool isHorizontal = IsHorizontal();
|
||||||
PRBool isHorizontal = IsHorizontal(scrollbar);
|
|
||||||
|
|
||||||
// see if the thumb has moved passed our original click point.
|
// see if the thumb has moved passed our original click point.
|
||||||
// if it has we want to stop.
|
// if it has we want to stop.
|
||||||
@@ -1018,3 +946,46 @@ NS_IMETHODIMP_(void) nsSliderFrame::Notify(nsITimer *timer)
|
|||||||
PageUpDown(thumbFrame, mChange);
|
PageUpDown(thumbFrame, mChange);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class nsThumbFrame : public nsTitledButtonFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
friend nsresult NS_NewThumbFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
|
NS_IMETHOD HandlePress(nsIPresContext* aPresContext,
|
||||||
|
nsGUIEvent * aEvent,
|
||||||
|
nsEventStatus* aEventStatus) { return NS_OK; }
|
||||||
|
|
||||||
|
NS_IMETHOD HandleMultiplePress(nsIPresContext* aPresContext,
|
||||||
|
nsGUIEvent * aEvent,
|
||||||
|
nsEventStatus* aEventStatus) { return NS_OK; }
|
||||||
|
|
||||||
|
NS_IMETHOD HandleDrag(nsIPresContext* aPresContext,
|
||||||
|
nsGUIEvent * aEvent,
|
||||||
|
nsEventStatus* aEventStatus) { return NS_OK; }
|
||||||
|
|
||||||
|
NS_IMETHOD HandleRelease(nsIPresContext* aPresContext,
|
||||||
|
nsGUIEvent * aEvent,
|
||||||
|
nsEventStatus* aEventStatus) { return NS_OK; }
|
||||||
|
|
||||||
|
nsThumbFrame(nsIPresShell* aPresShell):nsTitledButtonFrame(aPresShell) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
NS_NewThumbFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame)
|
||||||
|
{
|
||||||
|
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
||||||
|
if (nsnull == aNewFrame) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
nsThumbFrame* it = new (aPresShell) nsThumbFrame(aPresShell);
|
||||||
|
if (nsnull == it)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
*aNewFrame = it;
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
} // NS_NewSliderFrame
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
#define nsSliderFrame_h__
|
#define nsSliderFrame_h__
|
||||||
|
|
||||||
|
|
||||||
#include "nsHTMLContainerFrame.h"
|
#include "nsBoxFrame.h"
|
||||||
#include "prtypes.h"
|
#include "prtypes.h"
|
||||||
#include "nsIAtom.h"
|
#include "nsIAtom.h"
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
@@ -47,12 +47,12 @@ class nsITimer;
|
|||||||
nsresult NS_NewSliderFrame(nsIPresShell* aPresShell, nsIFrame** aResult) ;
|
nsresult NS_NewSliderFrame(nsIPresShell* aPresShell, nsIFrame** aResult) ;
|
||||||
|
|
||||||
|
|
||||||
class nsSliderFrame : public nsHTMLContainerFrame,
|
class nsSliderFrame : public nsBoxFrame,
|
||||||
public nsIDOMMouseListener,
|
public nsIDOMMouseListener,
|
||||||
public nsITimerCallback
|
public nsITimerCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsSliderFrame();
|
nsSliderFrame(nsIPresShell* aShell);
|
||||||
virtual ~nsSliderFrame();
|
virtual ~nsSliderFrame();
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@@ -61,6 +61,12 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// nsIBox
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
|
||||||
// nsIFrame overrides
|
// nsIFrame overrides
|
||||||
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
@@ -83,34 +89,15 @@ public:
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* asPrevInFlow);
|
nsIFrame* asPrevInFlow);
|
||||||
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD AppendFrames(nsIPresContext* aPresContext,
|
|
||||||
nsIPresShell& aPresShell,
|
|
||||||
nsIAtom* aListName,
|
|
||||||
nsIFrame* aFrameList);
|
|
||||||
|
|
||||||
NS_IMETHOD InsertFrames(nsIPresContext* aPresContext,
|
|
||||||
nsIPresShell& aPresShell,
|
|
||||||
nsIAtom* aListName,
|
|
||||||
nsIFrame* aPrevFrame,
|
|
||||||
nsIFrame* aFrameList);
|
|
||||||
|
|
||||||
NS_IMETHOD RemoveFrame(nsIPresContext* aPresContext,
|
|
||||||
nsIPresShell& aPresShell,
|
|
||||||
nsIAtom* aListName,
|
|
||||||
nsIFrame* aOldFrame);
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHOD HandleEvent(nsIPresContext* aPresContext,
|
NS_IMETHOD HandleEvent(nsIPresContext* aPresContext,
|
||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus* aEventStatus);
|
nsEventStatus* aEventStatus);
|
||||||
|
|
||||||
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
const nsPoint& aPoint, nsFramePaintLayer aWhichLayer, nsIFrame** aFrame);
|
const nsPoint& aPoint,
|
||||||
|
nsFramePaintLayer aWhichLayer,
|
||||||
|
nsIFrame** aFrame);
|
||||||
|
|
||||||
NS_IMETHOD SetInitialChildList(nsIPresContext* aPresContext,
|
NS_IMETHOD SetInitialChildList(nsIPresContext* aPresContext,
|
||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
@@ -171,7 +158,7 @@ public:
|
|||||||
static PRInt32 GetIncrement(nsIContent* content);
|
static PRInt32 GetIncrement(nsIContent* content);
|
||||||
static PRInt32 GetPageIncrement(nsIContent* content);
|
static PRInt32 GetPageIncrement(nsIContent* content);
|
||||||
static PRInt32 GetIntegerAttribute(nsIContent* content, nsIAtom* atom, PRInt32 defaultValue);
|
static PRInt32 GetIntegerAttribute(nsIContent* content, nsIAtom* atom, PRInt32 defaultValue);
|
||||||
static PRInt32 IsHorizontal(nsIContent* content);
|
void EnsureOrient();
|
||||||
|
|
||||||
void SetScrollbarListener(nsIScrollbarListener* aListener);
|
void SetScrollbarListener(nsIScrollbarListener* aListener);
|
||||||
|
|
||||||
@@ -196,20 +183,14 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual nsresult ReflowThumb(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus,
|
|
||||||
nsIFrame* thumbFrame,
|
|
||||||
nsSize available,
|
|
||||||
nsSize computed);
|
|
||||||
|
|
||||||
virtual PRIntn GetSkipSides() const { return 0; }
|
virtual PRIntn GetSkipSides() const { return 0; }
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
nsIContent* GetScrollBar();
|
nsIBox* GetScrollbar();
|
||||||
|
nsIContent* GetContentOf(nsIBox* aBox);
|
||||||
|
|
||||||
void PageUpDown(nsIFrame* aThumbFrame, nscoord change);
|
void PageUpDown(nsIFrame* aThumbFrame, nscoord change);
|
||||||
void SetCurrentPosition(nsIContent* scrollbar, nsIFrame* aThumbFrame, nscoord pos);
|
void SetCurrentPosition(nsIContent* scrollbar, nsIFrame* aThumbFrame, nscoord pos);
|
||||||
NS_IMETHOD DragThumb(nsIPresContext* aPresContext, PRBool aGrabMouseEvents);
|
NS_IMETHOD DragThumb(nsIPresContext* aPresContext, PRBool aGrabMouseEvents);
|
||||||
|
|||||||
@@ -50,8 +50,9 @@
|
|||||||
#include "nsIPresShell.h"
|
#include "nsIPresShell.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
#include "nsWidgetsCID.h"
|
#include "nsWidgetsCID.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
#define REAL_TIME_DRAG PR_FALSE
|
#define REAL_TIME_DRAG
|
||||||
|
|
||||||
|
|
||||||
const PRInt32 kMaxZ = 0x7fffffff; //XXX: Shouldn't there be a define somewhere for MaxInt for PRInt32
|
const PRInt32 kMaxZ = 0x7fffffff; //XXX: Shouldn't there be a define somewhere for MaxInt for PRInt32
|
||||||
@@ -63,7 +64,7 @@ public:
|
|||||||
nscoord max;
|
nscoord max;
|
||||||
nscoord current;
|
nscoord current;
|
||||||
nscoord changed;
|
nscoord changed;
|
||||||
nsIFrame* child;
|
nsIBox* child;
|
||||||
PRInt32 flex;
|
PRInt32 flex;
|
||||||
PRInt32 index;
|
PRInt32 index;
|
||||||
};
|
};
|
||||||
@@ -133,12 +134,13 @@ public:
|
|||||||
CollapseDirection GetCollapseDirection();
|
CollapseDirection GetCollapseDirection();
|
||||||
|
|
||||||
void MoveSplitterBy(nsIPresContext* aPresContext, nscoord aDiff);
|
void MoveSplitterBy(nsIPresContext* aPresContext, nscoord aDiff);
|
||||||
|
void EnsureOrient();
|
||||||
|
|
||||||
nsSplitterFrame* mOuter;
|
nsSplitterFrame* mOuter;
|
||||||
PRBool mDidDrag;
|
PRBool mDidDrag;
|
||||||
nscoord mDragStartPx;
|
nscoord mDragStartPx;
|
||||||
nscoord mCurrentPos;
|
nscoord mCurrentPos;
|
||||||
nsBoxFrame* mParentBox;
|
nsIBox* mParentBox;
|
||||||
PRBool mPressed;
|
PRBool mPressed;
|
||||||
nsSplitterInfo* mChildInfosBefore;
|
nsSplitterInfo* mChildInfosBefore;
|
||||||
nsSplitterInfo* mChildInfosAfter;
|
nsSplitterInfo* mChildInfosAfter;
|
||||||
@@ -148,6 +150,7 @@ public:
|
|||||||
nscoord mSplitterPos;
|
nscoord mSplitterPos;
|
||||||
nscoord mSplitterViewPos;
|
nscoord mSplitterViewPos;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -343,11 +346,11 @@ nsSplitterFrame::Init(nsIPresContext* aPresContext,
|
|||||||
nsIView* view;
|
nsIView* view;
|
||||||
GetView(aPresContext, &view);
|
GetView(aPresContext, &view);
|
||||||
|
|
||||||
// currently this only works on win32 and mac
|
#if defined(REAL_TIME_DRAG) || defined(XP_UNIX)
|
||||||
#ifdef XP_UNIX
|
|
||||||
view->SetContentTransparency(PR_TRUE);
|
view->SetContentTransparency(PR_TRUE);
|
||||||
view->SetZIndex(kMaxZ);
|
view->SetZIndex(kMaxZ);
|
||||||
#else
|
#else
|
||||||
|
// currently this only works on win32 and mac
|
||||||
static NS_DEFINE_CID(kCChildCID, NS_CHILD_CID);
|
static NS_DEFINE_CID(kCChildCID, NS_CHILD_CID);
|
||||||
nsCOMPtr<nsIViewManager> viewManager;
|
nsCOMPtr<nsIViewManager> viewManager;
|
||||||
view->GetViewManager(*getter_AddRefs(viewManager));
|
view->GetViewManager(*getter_AddRefs(viewManager));
|
||||||
@@ -359,12 +362,22 @@ nsSplitterFrame::Init(nsIPresContext* aPresContext,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
mInner->mState = nsSplitterFrameInner::Open;
|
mInner->mState = nsSplitterFrameInner::Open;
|
||||||
mInner->UpdateState();
|
|
||||||
mInner->AddListener(aPresContext);
|
mInner->AddListener(aPresContext);
|
||||||
|
mInner->mParentBox = nsnull;
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsSplitterFrame::Layout(nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
if (aState.GetLayoutReason() == nsBoxLayoutState::Initial) {
|
||||||
|
GetParentBox(&mInner->mParentBox);
|
||||||
|
mInner->UpdateState();
|
||||||
|
}
|
||||||
|
return nsBoxFrame::Layout(aState);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsSplitterFrame::GetInitialOrientation(PRBool& aIsHorizontal)
|
nsSplitterFrame::GetInitialOrientation(PRBool& aIsHorizontal)
|
||||||
{
|
{
|
||||||
@@ -428,8 +441,19 @@ NS_IMETHODIMP nsSplitterFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
// XXX It's probably better not to check visibility here, right?
|
// XXX It's probably better not to check visibility here, right?
|
||||||
*aFrame = this;
|
*aFrame = this;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
} else
|
} else {
|
||||||
return nsBoxFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame);
|
|
||||||
|
if (!mRect.Contains(aPoint))
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
nsresult rv = nsBoxFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame);
|
||||||
|
if (rv == NS_ERROR_FAILURE) {
|
||||||
|
*aFrame = this;
|
||||||
|
rv = NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
@@ -477,7 +501,6 @@ nsSplitterFrameInner::MouseDrag(nsIPresContext* aPresContext, nsGUIEvent* aEvent
|
|||||||
|
|
||||||
//printf("Dragging\n");
|
//printf("Dragging\n");
|
||||||
|
|
||||||
|
|
||||||
PRBool isHorizontal = !mOuter->IsHorizontal();
|
PRBool isHorizontal = !mOuter->IsHorizontal();
|
||||||
// convert coord to pixels
|
// convert coord to pixels
|
||||||
nscoord pos = isHorizontal ? aEvent->point.x : aEvent->point.y;
|
nscoord pos = isHorizontal ? aEvent->point.x : aEvent->point.y;
|
||||||
@@ -576,7 +599,7 @@ nsSplitterFrameInner::MouseDrag(nsIPresContext* aPresContext, nsGUIEvent* aEvent
|
|||||||
if (currentState != Dragging)
|
if (currentState != Dragging)
|
||||||
mOuter->mContent->SetAttribute(kNameSpaceID_None, nsXULAtoms::state, "dragging", PR_TRUE);
|
mOuter->mContent->SetAttribute(kNameSpaceID_None, nsXULAtoms::state, "dragging", PR_TRUE);
|
||||||
|
|
||||||
#if REAL_TIME_DRAG
|
#ifdef REAL_TIME_DRAG
|
||||||
AdjustChildren(aPresContext);
|
AdjustChildren(aPresContext);
|
||||||
#else
|
#else
|
||||||
MoveSplitterBy(aPresContext, pos);
|
MoveSplitterBy(aPresContext, pos);
|
||||||
@@ -702,14 +725,13 @@ nsSplitterFrameInner::MouseUp(nsIDOMEvent* aMouseEvent)
|
|||||||
nsresult
|
nsresult
|
||||||
nsSplitterFrameInner::MouseDown(nsIDOMEvent* aMouseEvent)
|
nsSplitterFrameInner::MouseDown(nsIDOMEvent* aMouseEvent)
|
||||||
{
|
{
|
||||||
|
nsBoxLayoutState state(mOuter->mPresContext);
|
||||||
mCurrentPos = 0;
|
mCurrentPos = 0;
|
||||||
mPressed = PR_TRUE;
|
mPressed = PR_TRUE;
|
||||||
|
|
||||||
mDidDrag = PR_FALSE;
|
mDidDrag = PR_FALSE;
|
||||||
|
|
||||||
nsIFrame* parent = nsnull;
|
mOuter->GetParentBox(&mParentBox);
|
||||||
mOuter->GetParent(&parent);
|
|
||||||
mParentBox = (nsBoxFrame*)parent;
|
|
||||||
|
|
||||||
// get our index
|
// get our index
|
||||||
nscoord childIndex = nsFrameNavigator::IndexOf(mOuter->mPresContext, mParentBox, mOuter);
|
nscoord childIndex = nsFrameNavigator::IndexOf(mOuter->mPresContext, mParentBox, mOuter);
|
||||||
@@ -721,13 +743,14 @@ nsSplitterFrameInner::MouseDown(nsIDOMEvent* aMouseEvent)
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRBool isHorizontal = mParentBox->IsHorizontal();
|
EnsureOrient();
|
||||||
|
PRBool isHorizontal = !mOuter->IsHorizontal();
|
||||||
|
|
||||||
ResizeType resizeBefore = GetResizeBefore();
|
ResizeType resizeBefore = GetResizeBefore();
|
||||||
ResizeType resizeAfter = GetResizeAfter();
|
ResizeType resizeAfter = GetResizeAfter();
|
||||||
|
|
||||||
delete mChildInfosBefore;
|
delete[] mChildInfosBefore;
|
||||||
delete mChildInfosAfter;
|
delete[] mChildInfosAfter;
|
||||||
|
|
||||||
mChildInfosBefore = new nsSplitterInfo[childCount];
|
mChildInfosBefore = new nsSplitterInfo[childCount];
|
||||||
mChildInfosAfter = new nsSplitterInfo[childCount];
|
mChildInfosAfter = new nsSplitterInfo[childCount];
|
||||||
@@ -737,11 +760,14 @@ nsSplitterFrameInner::MouseDown(nsIDOMEvent* aMouseEvent)
|
|||||||
mChildInfosBeforeCount = 0;
|
mChildInfosBeforeCount = 0;
|
||||||
mChildInfosAfterCount = 0;
|
mChildInfosAfterCount = 0;
|
||||||
|
|
||||||
nsIFrame* childFrame = nsnull;
|
nsIBox* childBox = nsnull;
|
||||||
mParentBox->FirstChild(mOuter->mPresContext, nsnull, &childFrame);
|
mParentBox->GetChildBox(&childBox);
|
||||||
|
|
||||||
while (nsnull != childFrame)
|
while (nsnull != childBox)
|
||||||
{
|
{
|
||||||
|
nsIFrame* childFrame = nsnull;
|
||||||
|
childBox->GetFrame(&childFrame);
|
||||||
|
|
||||||
nsCOMPtr<nsIContent> content;
|
nsCOMPtr<nsIContent> content;
|
||||||
childFrame->GetContent(getter_AddRefs(content));
|
childFrame->GetContent(getter_AddRefs(content));
|
||||||
nsIAtom* atom;
|
nsIAtom* atom;
|
||||||
@@ -749,41 +775,48 @@ nsSplitterFrameInner::MouseDown(nsIDOMEvent* aMouseEvent)
|
|||||||
|
|
||||||
// skip over any splitters
|
// skip over any splitters
|
||||||
if (atom != nsXULAtoms::splitter) {
|
if (atom != nsXULAtoms::splitter) {
|
||||||
nsBoxInfo info;
|
nsSize prefSize(0,0);
|
||||||
mParentBox->GetChildBoxInfo(count, info);
|
nsSize minSize(0,0);
|
||||||
|
nsSize maxSize(0,0);
|
||||||
|
nscoord flex = 0;
|
||||||
|
|
||||||
const nsStyleSpacing* spacing;
|
childBox->GetPrefSize(state, prefSize);
|
||||||
nsresult rv = childFrame->GetStyleData(eStyleStruct_Spacing,
|
childBox->GetMinSize(state, minSize);
|
||||||
(const nsStyleStruct*&) spacing);
|
childBox->GetMaxSize(state, maxSize);
|
||||||
|
nsBox::BoundsCheck(minSize, prefSize, maxSize);
|
||||||
|
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get spacing info");
|
mOuter->AddMargin(childBox, minSize);
|
||||||
|
mOuter->AddMargin(childBox, prefSize);
|
||||||
|
mOuter->AddMargin(childBox, maxSize);
|
||||||
|
|
||||||
|
childBox->GetFlex(state, flex);
|
||||||
|
|
||||||
nsMargin margin(0,0,0,0);
|
nsMargin margin(0,0,0,0);
|
||||||
spacing->GetMargin(margin);
|
childBox->GetMargin(margin);
|
||||||
nsRect r(0,0,0,0);
|
nsRect r(0,0,0,0);
|
||||||
childFrame->GetRect(r);
|
childBox->GetBounds(r);
|
||||||
r.Inflate(margin);
|
r.Inflate(margin);
|
||||||
|
|
||||||
if (count < childIndex) {
|
if (count < childIndex) {
|
||||||
mChildInfosBefore[mChildInfosBeforeCount].child = childFrame;
|
mChildInfosBefore[mChildInfosBeforeCount].child = childBox;
|
||||||
mChildInfosBefore[mChildInfosBeforeCount].min = isHorizontal ? info.minSize.width : info.minSize.height;
|
mChildInfosBefore[mChildInfosBeforeCount].min = isHorizontal ? minSize.width : minSize.height;
|
||||||
mChildInfosBefore[mChildInfosBeforeCount].max = isHorizontal ? info.maxSize.width : info.maxSize.height;
|
mChildInfosBefore[mChildInfosBeforeCount].max = isHorizontal ? maxSize.width : maxSize.height;
|
||||||
mChildInfosBefore[mChildInfosBeforeCount].current = isHorizontal ? r.width : r.height;
|
mChildInfosBefore[mChildInfosBeforeCount].current = isHorizontal ? r.width : r.height;
|
||||||
mChildInfosBefore[mChildInfosBeforeCount].flex = info.flex;
|
mChildInfosBefore[mChildInfosBeforeCount].flex = flex;
|
||||||
mChildInfosBefore[mChildInfosBeforeCount].index = count;
|
mChildInfosBefore[mChildInfosBeforeCount].index = count;
|
||||||
mChildInfosBeforeCount++;
|
mChildInfosBeforeCount++;
|
||||||
} else if (count > childIndex) {
|
} else if (count > childIndex) {
|
||||||
mChildInfosAfter[mChildInfosAfterCount].child = childFrame;
|
mChildInfosAfter[mChildInfosAfterCount].child = childBox;
|
||||||
mChildInfosAfter[mChildInfosAfterCount].min = isHorizontal ? info.minSize.width : info.minSize.height;
|
mChildInfosAfter[mChildInfosAfterCount].min = isHorizontal ? minSize.width : minSize.height;
|
||||||
mChildInfosAfter[mChildInfosAfterCount].max = isHorizontal ? info.maxSize.width : info.maxSize.height;
|
mChildInfosAfter[mChildInfosAfterCount].max = isHorizontal ? maxSize.width : maxSize.height;
|
||||||
mChildInfosAfter[mChildInfosAfterCount].current = isHorizontal ? r.width : r.height;
|
mChildInfosAfter[mChildInfosAfterCount].current = isHorizontal ? r.width : r.height;
|
||||||
mChildInfosAfter[mChildInfosAfterCount].flex = info.flex;
|
mChildInfosAfter[mChildInfosAfterCount].flex = flex;
|
||||||
mChildInfosAfter[mChildInfosAfterCount].index = count;
|
mChildInfosAfter[mChildInfosAfterCount].index = count;
|
||||||
mChildInfosAfterCount++;
|
mChildInfosAfterCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult rv = childFrame->GetNextSibling(&childFrame);
|
nsresult rv = childBox->GetNextBox(&childBox);
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
NS_ASSERTION(rv == NS_OK,"failed to get next child");
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
@@ -823,7 +856,7 @@ nsSplitterFrameInner::MouseDown(nsIDOMEvent* aMouseEvent)
|
|||||||
|
|
||||||
mDragStartPx = c;
|
mDragStartPx = c;
|
||||||
|
|
||||||
//printf("Pressed mDragStartPx=%d\n",mDragStartPx);
|
printf("Pressed mDragStartPx=%d\n",mDragStartPx);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@@ -896,14 +929,16 @@ nsSplitterFrameInner::UpdateState()
|
|||||||
|
|
||||||
CollapseDirection direction = GetCollapseDirection();
|
CollapseDirection direction = GetCollapseDirection();
|
||||||
if (direction != None) {
|
if (direction != None) {
|
||||||
nsIFrame* splitter = mOuter;
|
nsIBox* splitter = mOuter;
|
||||||
// Find the splitter's immediate sibling.
|
// Find the splitter's immediate sibling.
|
||||||
nsIFrame* splitterSibling =
|
nsIBox* splitterSibling =
|
||||||
nsFrameNavigator::GetChildBeforeAfter(mOuter->mPresContext, splitter,
|
nsFrameNavigator::GetChildBeforeAfter(mOuter->mPresContext, splitter,
|
||||||
(direction == Before));
|
(direction == Before));
|
||||||
if (splitterSibling) {
|
if (splitterSibling) {
|
||||||
|
nsIFrame* splitterSiblingFrame = nsnull;
|
||||||
|
splitterSibling->GetFrame(&splitterSiblingFrame);
|
||||||
nsCOMPtr<nsIContent> sibling;
|
nsCOMPtr<nsIContent> sibling;
|
||||||
if (NS_SUCCEEDED(splitterSibling->GetContent(getter_AddRefs(sibling)))
|
if (NS_SUCCEEDED(splitterSiblingFrame->GetContent(getter_AddRefs(sibling)))
|
||||||
&& sibling) {
|
&& sibling) {
|
||||||
if (mState == Collapsed) {
|
if (mState == Collapsed) {
|
||||||
// Collapsed -> Open
|
// Collapsed -> Open
|
||||||
@@ -921,45 +956,130 @@ nsSplitterFrameInner::UpdateState()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mState = newState;
|
mState = newState;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsSplitterFrameInner::EnsureOrient()
|
||||||
|
{
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
mParentBox->GetFrame(&frame);
|
||||||
|
nsFrameState state;
|
||||||
|
frame->GetFrameState(&state);
|
||||||
|
|
||||||
|
PRBool isHorizontal = !(state & NS_STATE_IS_HORIZONTAL);
|
||||||
|
if (isHorizontal)
|
||||||
|
mOuter->mState |= NS_STATE_IS_HORIZONTAL;
|
||||||
|
else
|
||||||
|
mOuter->mState &= ~NS_STATE_IS_HORIZONTAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsSplitterFrameInner::AdjustChildren(nsIPresContext* aPresContext)
|
nsSplitterFrameInner::AdjustChildren(nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
PRBool isHorizontal = mParentBox->IsHorizontal();
|
EnsureOrient();
|
||||||
|
PRBool isHorizontal = !mOuter->IsHorizontal();
|
||||||
|
|
||||||
AdjustChildren(aPresContext, mChildInfosBefore, mChildInfosBeforeCount, isHorizontal);
|
AdjustChildren(aPresContext, mChildInfosBefore, mChildInfosBeforeCount, isHorizontal);
|
||||||
AdjustChildren(aPresContext, mChildInfosAfter, mChildInfosAfterCount, isHorizontal);
|
AdjustChildren(aPresContext, mChildInfosAfter, mChildInfosAfterCount, isHorizontal);
|
||||||
|
|
||||||
|
|
||||||
|
// printf("----- Posting Dirty -----\n");
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef REAL_TIME_DRAG
|
||||||
|
// nsBoxLayoutState state(aPresContext);
|
||||||
|
// state.SetLayoutReason(nsBoxLayoutState::Resize);
|
||||||
|
//mParentBox->Layout(state);
|
||||||
|
/*
|
||||||
nsCOMPtr<nsIPresShell> shell;
|
nsCOMPtr<nsIPresShell> shell;
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
|
|
||||||
mOuter->mState |= NS_FRAME_IS_DIRTY;
|
shell->EnterReflowLock();
|
||||||
mOuter->mParent->ReflowDirtyChild(shell, mOuter->mParent);
|
shell->ProcessReflowCommands(PR_TRUE);
|
||||||
|
shell->ExitReflowLock(PR_FALSE);
|
||||||
|
*/
|
||||||
|
|
||||||
|
nsCOMPtr<nsIPresShell> shell;
|
||||||
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
|
nsIFrame* frame = nsnull;
|
||||||
|
mParentBox->GetFrame(&frame);
|
||||||
|
|
||||||
|
/*
|
||||||
|
shell->EnterReflowLock();
|
||||||
|
nsRect bounds;
|
||||||
|
mParentBox->GetBounds(bounds);
|
||||||
|
nsSize maxSize(bounds.width, bounds.height);
|
||||||
|
nsIRenderingContext* rcx = nsnull;
|
||||||
|
nsresult rv = shell->CreateRenderingContext(frame, &rcx);
|
||||||
|
nsHTMLReflowState reflowState(aPresContext, frame,
|
||||||
|
eReflowReason_Resize, rcx, maxSize);
|
||||||
|
nsBoxLayoutState state(aPresContext, reflowState);
|
||||||
|
mParentBox->Layout(state);
|
||||||
|
shell->ExitReflowLock(PR_TRUE);
|
||||||
|
*/
|
||||||
|
|
||||||
|
shell->FlushPendingNotifications();
|
||||||
|
|
||||||
|
nsCOMPtr<nsIViewManager> viewManager;
|
||||||
|
nsIView* view = nsnull;
|
||||||
|
frame->GetView(aPresContext, &view);
|
||||||
|
|
||||||
|
nsRect damageRect(0,0,0,0);
|
||||||
|
mParentBox->GetContentRect(damageRect);
|
||||||
|
|
||||||
|
if (view) {
|
||||||
|
view->GetViewManager(*getter_AddRefs(viewManager));
|
||||||
|
viewManager->UpdateView(view, damageRect, NS_VMREFRESH_IMMEDIATE);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
nsRect rect(damageRect);
|
||||||
|
nsPoint offset;
|
||||||
|
|
||||||
|
frame->GetOffsetFromView(aPresContext, offset, &view);
|
||||||
|
NS_ASSERTION(nsnull != view, "no view");
|
||||||
|
rect += offset;
|
||||||
|
view->GetViewManager(*getter_AddRefs(viewManager));
|
||||||
|
viewManager->UpdateView(view, rect, NS_VMREFRESH_IMMEDIATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
//mOuter->mState |= NS_FRAME_IS_DIRTY;
|
||||||
|
//mOuter->mParent->ReflowDirtyChild(shell, mOuter->mParent);
|
||||||
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
mOuter->MarkDirty(state);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsSplitterFrameInner::AdjustChildren(nsIPresContext* aPresContext, nsSplitterInfo* aChildInfos, PRInt32 aCount, PRBool aIsHorizontal)
|
nsSplitterFrameInner::AdjustChildren(nsIPresContext* aPresContext, nsSplitterInfo* aChildInfos, PRInt32 aCount, PRBool aIsHorizontal)
|
||||||
{
|
{
|
||||||
// printf("------- AdjustChildren------\n");
|
///printf("------- AdjustChildren------\n");
|
||||||
|
|
||||||
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIPresShell> shell;
|
||||||
|
state.GetPresShell(getter_AddRefs(shell));
|
||||||
|
|
||||||
|
float p2t;
|
||||||
|
aPresContext->GetScaledPixelsToTwips(&p2t);
|
||||||
|
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
||||||
|
|
||||||
for (int i=0; i < aCount; i++)
|
for (int i=0; i < aCount; i++)
|
||||||
{
|
{
|
||||||
nscoord pref = aChildInfos[i].changed;
|
nscoord pref = aChildInfos[i].changed;
|
||||||
nsIFrame* childFrame = aChildInfos[i].child;
|
nscoord current = aChildInfos[i].current;
|
||||||
nsresult rv;
|
nsIBox* childBox = aChildInfos[i].child;
|
||||||
|
PRInt32 index = aChildInfos[i].index;
|
||||||
|
|
||||||
const nsStyleSpacing* spacing;
|
//printf("current=%d, pref=%d", current/onePixel, pref/onePixel);
|
||||||
rv = childFrame->GetStyleData(eStyleStruct_Spacing,
|
|
||||||
(const nsStyleStruct*&) spacing);
|
|
||||||
|
|
||||||
NS_ASSERTION(rv == NS_OK,"failed to get spacing info");
|
if (current/onePixel == pref/onePixel)
|
||||||
|
continue;
|
||||||
|
|
||||||
nsMargin margin(0,0,0,0);
|
nsMargin margin(0,0,0,0);
|
||||||
spacing->GetMargin(margin);
|
childBox->GetMargin(margin);
|
||||||
nsMargin border(0,0,0,0);
|
|
||||||
spacing->GetBorderPadding(border);
|
|
||||||
margin += border;
|
|
||||||
|
|
||||||
nsIAtom* attribute;
|
nsIAtom* attribute;
|
||||||
|
|
||||||
@@ -971,9 +1091,8 @@ nsSplitterFrameInner::AdjustChildren(nsIPresContext* aPresContext, nsSplitterInf
|
|||||||
attribute = nsHTMLAtoms::height;
|
attribute = nsHTMLAtoms::height;
|
||||||
}
|
}
|
||||||
|
|
||||||
float p2t;
|
nsIFrame* childFrame = nsnull;
|
||||||
aPresContext->GetScaledPixelsToTwips(&p2t);
|
childBox->GetFrame(&childFrame);
|
||||||
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
|
||||||
|
|
||||||
nsCOMPtr<nsIContent> content;
|
nsCOMPtr<nsIContent> content;
|
||||||
childFrame->GetContent(getter_AddRefs(content));
|
childFrame->GetContent(getter_AddRefs(content));
|
||||||
@@ -981,10 +1100,17 @@ nsSplitterFrameInner::AdjustChildren(nsIPresContext* aPresContext, nsSplitterInf
|
|||||||
// set its preferred size.
|
// set its preferred size.
|
||||||
char ch[50];
|
char ch[50];
|
||||||
sprintf(ch,"%d",pref/onePixel);
|
sprintf(ch,"%d",pref/onePixel);
|
||||||
//printf("index=%d, pref=%s\n", i, ch);
|
|
||||||
content->SetAttribute(kNameSpaceID_None, attribute, ch, PR_FALSE);
|
content->SetAttribute(kNameSpaceID_None, attribute, ch, PR_FALSE);
|
||||||
mParentBox->InvalidateCache(childFrame);
|
#ifndef REAL_TIME_DRAG
|
||||||
|
childBox->MarkDirty(state);
|
||||||
|
#else
|
||||||
|
childBox->MarkDirty(state);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//printf("\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1068,7 +1194,9 @@ nsSplitterFrameInner::MoveSplitterBy(nsIPresContext* aPresContext, nscoord aDiff
|
|||||||
v->GetViewManager(*getter_AddRefs(vm));
|
v->GetViewManager(*getter_AddRefs(vm));
|
||||||
v->GetBounds(vr);
|
v->GetBounds(vr);
|
||||||
nsRect invalid;
|
nsRect invalid;
|
||||||
if (mParentBox->IsHorizontal()) {
|
EnsureOrient();
|
||||||
|
PRBool isHorizontal = !mOuter->IsHorizontal();
|
||||||
|
if (isHorizontal) {
|
||||||
mOuter->MoveTo(aPresContext, mSplitterPos + aDiff, r.y);
|
mOuter->MoveTo(aPresContext, mSplitterPos + aDiff, r.y);
|
||||||
vm->MoveViewTo(v, mSplitterViewPos + aDiff, vr.y);
|
vm->MoveViewTo(v, mSplitterViewPos + aDiff, vr.y);
|
||||||
invalid.UnionRect(r,mOuter->mRect);
|
invalid.UnionRect(r,mOuter->mRect);
|
||||||
@@ -1080,7 +1208,9 @@ nsSplitterFrameInner::MoveSplitterBy(nsIPresContext* aPresContext, nscoord aDiff
|
|||||||
|
|
||||||
// redraw immediately only what changed. This is animation so
|
// redraw immediately only what changed. This is animation so
|
||||||
// it must be immediate.
|
// it must be immediate.
|
||||||
mParentBox->Invalidate(aPresContext, invalid, PR_TRUE);
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
mParentBox->Redraw(state, &invalid, PR_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// nsIFrame overrides
|
// nsIFrame overrides
|
||||||
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
|
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
|
||||||
nsIContent* aChild,
|
nsIContent* aChild,
|
||||||
@@ -65,6 +66,7 @@ public:
|
|||||||
nsPoint& aPoint,
|
nsPoint& aPoint,
|
||||||
PRInt32& aCursor);
|
PRInt32& aCursor);
|
||||||
|
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
|
||||||
// nsIAnonymousContentCreator
|
// nsIAnonymousContentCreator
|
||||||
NS_IMETHOD CreateAnonymousContent(nsIPresContext* aPresContext,
|
NS_IMETHOD CreateAnonymousContent(nsIPresContext* aPresContext,
|
||||||
@@ -93,7 +95,10 @@ public:
|
|||||||
nsGUIEvent* aEvent,
|
nsGUIEvent* aEvent,
|
||||||
nsEventStatus* aEventStatus);
|
nsEventStatus* aEventStatus);
|
||||||
|
|
||||||
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext, const nsPoint& aPoint, nsFramePaintLayer aWhichLayer, nsIFrame** aFrame);
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
|
const nsPoint& aPoint,
|
||||||
|
nsFramePaintLayer aWhichLayer,
|
||||||
|
nsIFrame** aFrame);
|
||||||
|
|
||||||
virtual PRBool GetInitialOrientation(PRBool& aIsHorizontal);
|
virtual PRBool GetInitialOrientation(PRBool& aIsHorizontal);
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ NS_NewSpringFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsSpringFrame* it = new (aPresShell) nsSpringFrame;
|
nsSpringFrame* it = new (aPresShell) nsSpringFrame (aPresShell);
|
||||||
if (nsnull == it)
|
if (nsnull == it)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
@@ -51,22 +51,20 @@ NS_IMETHODIMP nsSpringFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
nsIFrame** aFrame)
|
nsIFrame** aFrame)
|
||||||
{
|
{
|
||||||
if (!mRect.Contains(aPoint)) {
|
if (!mRect.Contains(aPoint))
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
|
||||||
|
|
||||||
// always return us (if visible)
|
// see if it is in our border, padding, or inset
|
||||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
nsRect r(mRect);
|
||||||
mStyleContext->GetStyleData(eStyleStruct_Display);
|
nsMargin m;
|
||||||
if (disp->IsVisible()) {
|
GetInset(m);
|
||||||
|
r.Deflate(m);
|
||||||
|
GetBorderAndPadding(m);
|
||||||
|
r.Deflate(m);
|
||||||
|
if (!r.Contains(aPoint)) {
|
||||||
*aFrame = this;
|
*aFrame = this;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
/*
|
|
||||||
// clicks just go right through springs.
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,9 +31,10 @@
|
|||||||
#ifndef nsSpringFrame_h___
|
#ifndef nsSpringFrame_h___
|
||||||
#define nsSpringFrame_h___
|
#define nsSpringFrame_h___
|
||||||
|
|
||||||
#include "nsXULLeafFrame.h"
|
#include "nsLeafBoxFrame.h"
|
||||||
|
struct nsPoint;
|
||||||
|
|
||||||
class nsSpringFrame : public nsXULLeafFrame
|
class nsSpringFrame : public nsLeafBoxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -50,6 +51,8 @@ public:
|
|||||||
aResult = "Spring";
|
aResult = "Spring";
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsSpringFrame(nsIPresShell* aShell):nsLeafBoxFrame(aShell) {}
|
||||||
}; // class nsSpringFrame
|
}; // class nsSpringFrame
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1368
layout/xul/base/src/nsSprocketLayout.cpp
Normal file
1368
layout/xul/base/src/nsSprocketLayout.cpp
Normal file
File diff suppressed because it is too large
Load Diff
175
layout/xul/base/src/nsSprocketLayout.h
Normal file
175
layout/xul/base/src/nsSprocketLayout.h
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Author:
|
||||||
|
* Eric D Vaughan
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsSprocketLayout_h___
|
||||||
|
#define nsSprocketLayout_h___
|
||||||
|
|
||||||
|
#include "nsBoxLayout.h"
|
||||||
|
|
||||||
|
class nsBoxSize
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
nsBoxSize();
|
||||||
|
|
||||||
|
nscoord pref;
|
||||||
|
nscoord min;
|
||||||
|
nscoord max;
|
||||||
|
nscoord ascent;
|
||||||
|
nscoord flex;
|
||||||
|
nscoord left;
|
||||||
|
nscoord right;
|
||||||
|
PRBool collapsed;
|
||||||
|
|
||||||
|
nsBoxSize* next;
|
||||||
|
|
||||||
|
void Add(nsSize minSize,
|
||||||
|
nsSize prefSize,
|
||||||
|
nsSize maxSize,
|
||||||
|
nscoord ascent,
|
||||||
|
nscoord flex,
|
||||||
|
PRBool aIsHorizontal);
|
||||||
|
|
||||||
|
void Add(const nsMargin& aMargin, PRBool aIsHorizontal);
|
||||||
|
|
||||||
|
void* operator new(size_t sz, nsBoxLayoutState& aState);
|
||||||
|
void operator delete(void* aPtr, size_t sz);
|
||||||
|
};
|
||||||
|
|
||||||
|
class nsComputedBoxSize
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsComputedBoxSize();
|
||||||
|
|
||||||
|
nscoord size;
|
||||||
|
PRBool valid;
|
||||||
|
PRBool resized;
|
||||||
|
nsComputedBoxSize* next;
|
||||||
|
|
||||||
|
void* operator new(size_t sz, nsBoxLayoutState& aState);
|
||||||
|
void operator delete(void* aPtr, size_t sz);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define GET_WIDTH(size, isHorizontal) (isHorizontal ? size.width : size.height)
|
||||||
|
#define GET_HEIGHT(size, isHorizontal) (isHorizontal ? size.height : size.width)
|
||||||
|
#define GET_X(size, isHorizontal) (isHorizontal ? size.x : size.y)
|
||||||
|
#define GET_Y(size, isHorizontal) (isHorizontal ? size.y : size.x)
|
||||||
|
#define GET_COORD(aX, aY, isHorizontal) (isHorizontal ? aX : aY)
|
||||||
|
|
||||||
|
#define SET_WIDTH(size, coord, isHorizontal) if (isHorizontal) { (size).width = (coord); } else { (size).height = (coord); }
|
||||||
|
#define SET_HEIGHT(size, coord, isHorizontal) if (isHorizontal) { (size).height = (coord); } else { (size).width = (coord); }
|
||||||
|
#define SET_X(size, coord, isHorizontal) if (isHorizontal) { (size).x = (coord); } else { (size).y = (coord); }
|
||||||
|
#define SET_Y(size, coord, isHorizontal) if (isHorizontal) { (size).y = (coord); } else { (size).x = (coord); }
|
||||||
|
|
||||||
|
#define SET_COORD(aX, aY, coord, isHorizontal) if (isHorizontal) { aX = (coord); } else { aY = (coord); }
|
||||||
|
|
||||||
|
|
||||||
|
class nsBoxSizeList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual nsBoxSize* GetBoxSize(nsBoxLayoutState& aState)=0;
|
||||||
|
virtual nsBoxSizeList* GetFirst()=0;
|
||||||
|
virtual nsBoxSizeList* GetLast()=0;
|
||||||
|
virtual nsBoxSizeList* GetNext()=0;
|
||||||
|
virtual nsBoxSizeList* GetParent()=0;
|
||||||
|
virtual void SetParent(nsBoxSizeList* aParent)=0;
|
||||||
|
virtual void SetNext(nsIPresShell* aShell, nsBoxSizeList* aNext)=0;
|
||||||
|
virtual void Append(nsIPresShell* aShell, nsBoxSizeList* aChild)=0;
|
||||||
|
virtual void Clear(nsIPresShell* aShell)=0;
|
||||||
|
virtual PRInt32 GetCount()=0;
|
||||||
|
virtual void Desecrate()=0;
|
||||||
|
virtual void AddRef()=0;
|
||||||
|
virtual void Release(nsIPresShell* aShell)=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class nsSprocketLayout : public nsBoxLayout {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHOD Layout(nsIBox* aBox, nsBoxLayoutState& aState);
|
||||||
|
|
||||||
|
NS_IMETHOD GetPrefSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMaxSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetFlex(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nscoord& aFlex);
|
||||||
|
NS_IMETHOD GetAscent(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
NS_IMETHOD IsCollapsed(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, PRBool& aCollapsed);
|
||||||
|
|
||||||
|
nsSprocketLayout(nsIPresShell* aShell);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual PRBool IsHorizontal(nsIBox* aBox) const;
|
||||||
|
virtual void SetLargestSize(nsSize& aSize1, const nsSize& aSize2, PRBool aIsHorizontal);
|
||||||
|
virtual void SetSmallestSize(nsSize& aSize1, const nsSize& aSize2, PRBool aIsHorizontal);
|
||||||
|
virtual void AddLargestSize(nsSize& aSize, const nsSize& aSizeToAdd, PRBool aIsHorizontal);
|
||||||
|
virtual void AddSmallestSize(nsSize& aSize, const nsSize& aSizeToAdd, PRBool aIsHorizontal);
|
||||||
|
virtual void AddCoord(nscoord& aCoord, nscoord aCoordToAdd);
|
||||||
|
|
||||||
|
virtual void ComputeChildsNextPosition(nsIBox* aBox,
|
||||||
|
nsIBox* aChild,
|
||||||
|
nscoord& aCurX,
|
||||||
|
nscoord& aCurY,
|
||||||
|
nscoord& aNextX,
|
||||||
|
nscoord& aNextY,
|
||||||
|
const nsRect& aChildSize,
|
||||||
|
const nsRect& aContainingRect,
|
||||||
|
nscoord childAscent,
|
||||||
|
nscoord aMaxAscent);
|
||||||
|
|
||||||
|
virtual void ChildResized(nsIBox* aBox,
|
||||||
|
nsBoxLayoutState& aState,
|
||||||
|
nsIBox* aChild,
|
||||||
|
nsBoxSize* aChildBoxSize,
|
||||||
|
nsComputedBoxSize* aChildComputedBoxSize,
|
||||||
|
nsBoxSize* aBoxSizes,
|
||||||
|
nsComputedBoxSize* aComputedBoxSizes,
|
||||||
|
const nsRect& aChildLayoutRect,
|
||||||
|
nsRect& aChildActualRect,
|
||||||
|
nsRect& aContainingRect,
|
||||||
|
PRInt32 aFlexes,
|
||||||
|
PRBool& aFinished);
|
||||||
|
|
||||||
|
virtual void ComputeChildSizes(nsBoxLayoutState& aState,
|
||||||
|
nscoord& aGivenSize,
|
||||||
|
nsBoxSize* aBoxSizes,
|
||||||
|
nsComputedBoxSize* aComputedBoxSizes);
|
||||||
|
|
||||||
|
|
||||||
|
virtual void PopulateBoxSizes(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsBoxSize*& aBoxSizes, nsComputedBoxSize*& aComputedBoxSizes, nscoord& aMinSize, nscoord& aMaxSize, PRInt32& aFlexes);
|
||||||
|
|
||||||
|
virtual void InvalidateComputedSizes(nsComputedBoxSize* aComputedBoxSizes);
|
||||||
|
|
||||||
|
virtual PRBool GetDefaultFlex(PRInt32& aFlex);
|
||||||
|
|
||||||
|
virtual void GetFrameState(nsIBox* aBox, nsFrameState& aState);
|
||||||
|
virtual void SetFrameState(nsIBox* aBox, nsFrameState aState);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -43,7 +43,8 @@
|
|||||||
#include "nsStyleChangeList.h"
|
#include "nsStyleChangeList.h"
|
||||||
#include "nsCSSRendering.h"
|
#include "nsCSSRendering.h"
|
||||||
#include "nsIViewManager.h"
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
#include "nsStackLayout.h"
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewStackFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
NS_NewStackFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
||||||
@@ -59,108 +60,32 @@ NS_NewStackFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
*aNewFrame = it;
|
*aNewFrame = it;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
} // NS_NewDeckFrame
|
} // NS_NewStackFrame
|
||||||
|
|
||||||
|
nsCOMPtr<nsIBoxLayout> nsStackFrame::gLayout = nsnull;
|
||||||
|
|
||||||
nsStackFrame::nsStackFrame(nsIPresShell* aPresShell):nsBoxFrame(aPresShell)
|
nsStackFrame::nsStackFrame(nsIPresShell* aPresShell):nsBoxFrame(aPresShell)
|
||||||
{
|
{
|
||||||
|
if (!gLayout)
|
||||||
|
gLayout = new nsStackLayout(aPresShell);
|
||||||
|
|
||||||
|
SetLayoutManager(gLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsStackFrame::Init(nsIPresContext* aPresContext,
|
|
||||||
nsIContent* aContent,
|
|
||||||
nsIFrame* aParent,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIFrame* aPrevInFlow)
|
|
||||||
{
|
|
||||||
// Get the element's tag
|
|
||||||
nsresult rv = nsBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsStackFrame::AddChildSize(nsBoxInfo& aInfo, nsBoxInfo& aChildInfo)
|
|
||||||
{
|
|
||||||
// largest preferred size
|
|
||||||
if (aChildInfo.prefSize.width > aInfo.prefSize.width)
|
|
||||||
aInfo.prefSize.width = aChildInfo.prefSize.width;
|
|
||||||
|
|
||||||
if (aChildInfo.prefSize.height > aInfo.prefSize.height)
|
|
||||||
aInfo.prefSize.height = aChildInfo.prefSize.height;
|
|
||||||
|
|
||||||
// largest min size
|
|
||||||
if (aChildInfo.minSize.width > aInfo.minSize.width)
|
|
||||||
aInfo.minSize.width = aChildInfo.minSize.width;
|
|
||||||
|
|
||||||
if (aChildInfo.minSize.height > aInfo.minSize.height)
|
|
||||||
aInfo.minSize.height = aChildInfo.minSize.height;
|
|
||||||
|
|
||||||
// smallest max size
|
|
||||||
if (aChildInfo.maxSize.width < aInfo.maxSize.width)
|
|
||||||
aInfo.maxSize.width = aChildInfo.maxSize.width;
|
|
||||||
|
|
||||||
if (aChildInfo.maxSize.height < aInfo.maxSize.height)
|
|
||||||
aInfo.maxSize.height = aChildInfo.maxSize.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
nsStackFrame::ComputeChildsNextPosition(nsCalculatedBoxInfo* aInfo, nscoord& aCurX, nscoord& aCurY, nscoord& aNextX, nscoord& aNextY, const nsSize& aCurrentChildSize, const nsRect& aBoxRect, nscoord aMaxAscent)
|
|
||||||
{
|
|
||||||
// let everything layout on top of each other.
|
|
||||||
aCurX = aNextX = aBoxRect.x;
|
|
||||||
aCurY = aNextY = aBoxRect.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsStackFrame::ChildResized(nsIFrame* aFrame, nsHTMLReflowMetrics& aDesiredSize, nsRect& aRect, nscoord& aMaxAscent, nsCalculatedBoxInfo& aInfo, PRBool*& aResized, PRInt32 aInfoCount, nscoord& aChangedIndex, PRBool& aFinished, nscoord aIndex, nsString& aReason)
|
|
||||||
{
|
|
||||||
if (aDesiredSize.width > aRect.width) {
|
|
||||||
aRect.width = aDesiredSize.width;
|
|
||||||
InvalidateChildren();
|
|
||||||
LayoutChildrenInRect(aRect, aMaxAscent);
|
|
||||||
aReason = "child's width got bigger";
|
|
||||||
aChangedIndex = aIndex;
|
|
||||||
aFinished = PR_FALSE;
|
|
||||||
} else if (aDesiredSize.height > aRect.height) {
|
|
||||||
aRect.height = aDesiredSize.height;
|
|
||||||
InvalidateChildren();
|
|
||||||
LayoutChildrenInRect(aRect, aMaxAscent);
|
|
||||||
aReason = "child's height got bigger";
|
|
||||||
aChangedIndex = aIndex;
|
|
||||||
aFinished = PR_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsStackFrame::LayoutChildrenInRect(nsRect& aGivenSize, nscoord& aMaxAscent)
|
|
||||||
{
|
|
||||||
nsInfoList* list = GetInfoList();
|
|
||||||
nsCalculatedBoxInfo* info = list->GetFirst();
|
|
||||||
|
|
||||||
while(info) {
|
|
||||||
info->calculatedSize.width = aGivenSize.width;
|
|
||||||
info->calculatedSize.height = aGivenSize.height;
|
|
||||||
info->mFlags |= NS_FRAME_BOX_SIZE_VALID;
|
|
||||||
info = info->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
aMaxAscent = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsStackFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
nsStackFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
const nsPoint& aPoint,
|
const nsPoint& aPoint,
|
||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
nsIFrame** aFrame)
|
nsIFrame** aFrame)
|
||||||
{
|
{
|
||||||
|
return nsBoxFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame);
|
||||||
|
|
||||||
|
/*
|
||||||
nsRect r(mRect);
|
nsRect r(mRect);
|
||||||
|
|
||||||
// if it is not inside us or not in the layer in which we paint, fail
|
if (!r.Contains(aPoint))
|
||||||
if ((aWhichLayer != NS_FRAME_PAINT_LAYER_BACKGROUND) ||
|
|
||||||
(!r.Contains(aPoint))) {
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
|
||||||
|
|
||||||
// is it inside our border, padding, and debugborder or insets?
|
// is it inside our border, padding, and debugborder or insets?
|
||||||
nsMargin im(0,0,0,0);
|
nsMargin im(0,0,0,0);
|
||||||
@@ -209,6 +134,7 @@ nsStackFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
#ifdef NS_DEBUG
|
||||||
printf("\n------------");
|
printf("\n------------");
|
||||||
|
|
||||||
@@ -217,8 +143,9 @@ nsStackFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|||||||
printf("--------------\n");
|
printf("--------------\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -278,4 +205,3 @@ nsStackFrame::PaintChild(nsIPresContext* aPresContext,
|
|||||||
nsBoxFrame::PaintChild(aPresContext, aRenderingContext, aDirtyRect, aFrame, NS_FRAME_PAINT_LAYER_FOREGROUND);
|
nsBoxFrame::PaintChild(aPresContext, aRenderingContext, aDirtyRect, aFrame, NS_FRAME_PAINT_LAYER_FOREGROUND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
Eric D Vaughan
|
Eric D Vaughan
|
||||||
A frame that can have multiple children. Only one child may be displayed at one time. So the
|
A frame that can have multiple children. Only one child may be displayed at one time. So the
|
||||||
can be flipped though like a deck of cards.
|
can be flipped though like a Stack of cards.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
@@ -39,32 +39,12 @@ public:
|
|||||||
|
|
||||||
friend nsresult NS_NewStackFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
friend nsresult NS_NewStackFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
|
||||||
nsIContent* aContent,
|
|
||||||
nsIFrame* aParent,
|
|
||||||
nsIStyleContext* aContext,
|
|
||||||
nsIFrame* asPrevInFlow);
|
|
||||||
|
|
||||||
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
|
||||||
const nsPoint& aPoint,
|
|
||||||
nsFramePaintLayer aWhichLayer,
|
|
||||||
nsIFrame** aFrame);
|
|
||||||
|
|
||||||
NS_IMETHOD GetFrameName(nsString& aResult) const
|
NS_IMETHOD GetFrameName(nsString& aResult) const
|
||||||
{
|
{
|
||||||
aResult = "Stack";
|
aResult = "Stack";
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
nsStackFrame(nsIPresShell* aShell);
|
|
||||||
|
|
||||||
// Paint one child frame
|
// Paint one child frame
|
||||||
virtual void PaintChild(nsIPresContext* aPresContext,
|
virtual void PaintChild(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -76,10 +56,11 @@ protected:
|
|||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsFramePaintLayer aWhichLayer);
|
nsFramePaintLayer aWhichLayer);
|
||||||
virtual void ComputeChildsNextPosition( nsCalculatedBoxInfo* aInfo, nscoord& aCurX, nscoord& aCurY, nscoord& aNextX, nscoord& aNextY, const nsSize& aCurrentChildSize, const nsRect& aBoxRect, nscoord aMaxAscent);
|
|
||||||
virtual void ChildResized(nsIFrame* aFrame, nsHTMLReflowMetrics& aDesiredSize, nsRect& aRect, nscoord& aMaxAscent, nsCalculatedBoxInfo& aInfo, PRBool*& aResized, PRInt32 aInfoCount, nscoord& aChangedIndex, PRBool& aFinished, nscoord aIndex, nsString& aReason);
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
||||||
virtual void LayoutChildrenInRect(nsRect& aSize, nscoord& aMaxAscent);
|
const nsPoint& aPoint,
|
||||||
virtual void AddChildSize(nsBoxInfo& aInfo, nsBoxInfo& aChildInfo);
|
nsFramePaintLayer aWhichLayer,
|
||||||
|
nsIFrame** aFrame);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual nsresult GetStackedFrameForPoint(nsIPresContext* aPresContext,
|
virtual nsresult GetStackedFrameForPoint(nsIPresContext* aPresContext,
|
||||||
@@ -87,6 +68,14 @@ private:
|
|||||||
const nsRect& aRect,
|
const nsRect& aRect,
|
||||||
const nsPoint& aPoint,
|
const nsPoint& aPoint,
|
||||||
nsIFrame** aFrame);
|
nsIFrame** aFrame);
|
||||||
|
protected:
|
||||||
|
|
||||||
|
nsStackFrame(nsIPresShell* aPresShell);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
static nsCOMPtr<nsIBoxLayout> gLayout;
|
||||||
|
|
||||||
}; // class nsStackFrame
|
}; // class nsStackFrame
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
266
layout/xul/base/src/nsStackLayout.cpp
Normal file
266
layout/xul/base/src/nsStackLayout.cpp
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Eric Vaughan
|
||||||
|
// Netscape Communications
|
||||||
|
//
|
||||||
|
// See documentation in associated header file
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "nsStackLayout.h"
|
||||||
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsIPresContext.h"
|
||||||
|
#include "nsIContent.h"
|
||||||
|
#include "nsCOMPtr.h"
|
||||||
|
#include "nsHTMLIIDs.h"
|
||||||
|
#include "nsUnitConversion.h"
|
||||||
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsXULAtoms.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
#include "nsIReflowCommand.h"
|
||||||
|
#include "nsHTMLParts.h"
|
||||||
|
#include "nsIPresShell.h"
|
||||||
|
#include "nsStyleChangeList.h"
|
||||||
|
#include "nsCSSRendering.h"
|
||||||
|
#include "nsIViewManager.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
#include "nsIBox.h"
|
||||||
|
|
||||||
|
nsStackLayout::nsStackLayout(nsIPresShell* aPresShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsStackLayout::GetPrefSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
aSize.width = 0;
|
||||||
|
aSize.height = 0;
|
||||||
|
|
||||||
|
// run through all the children and get there min, max, and preferred sizes
|
||||||
|
// return us the size of the box
|
||||||
|
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
aBox->GetChildBox(&child);
|
||||||
|
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
// ignore collapsed children
|
||||||
|
PRBool isCollapsed = PR_FALSE;
|
||||||
|
child->IsCollapsed(aBoxLayoutState, isCollapsed);
|
||||||
|
|
||||||
|
if (!isCollapsed)
|
||||||
|
{
|
||||||
|
nsSize pref(0,0);
|
||||||
|
child->GetPrefSize(aBoxLayoutState, pref);
|
||||||
|
AddMargin(child, pref);
|
||||||
|
AddLargestSize(aSize, pref);
|
||||||
|
}
|
||||||
|
|
||||||
|
child->GetNextBox(&child);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now add our border and padding and insets
|
||||||
|
AddBorderAndPadding(aBox, aSize);
|
||||||
|
AddInset(aBox, aSize);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsStackLayout::GetMinSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
aSize.width = 0;
|
||||||
|
aSize.height = 0;
|
||||||
|
|
||||||
|
// run through all the children and get there min, max, and preferred sizes
|
||||||
|
// return us the size of the box
|
||||||
|
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
aBox->GetChildBox(&child);
|
||||||
|
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
// ignore collapsed children
|
||||||
|
PRBool isCollapsed = PR_FALSE;
|
||||||
|
aBox->IsCollapsed(aBoxLayoutState, isCollapsed);
|
||||||
|
|
||||||
|
if (!isCollapsed)
|
||||||
|
{
|
||||||
|
nsSize min(0,0);
|
||||||
|
child->GetMinSize(aBoxLayoutState, min);
|
||||||
|
AddMargin(child, min);
|
||||||
|
AddLargestSize(aSize, min);
|
||||||
|
}
|
||||||
|
|
||||||
|
child->GetNextBox(&child);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now add our border and padding and insets
|
||||||
|
AddBorderAndPadding(aBox, aSize);
|
||||||
|
AddInset(aBox,aSize);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsStackLayout::GetMaxSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
|
||||||
|
aSize.width = NS_INTRINSICSIZE;
|
||||||
|
aSize.height = NS_INTRINSICSIZE;
|
||||||
|
|
||||||
|
// run through all the children and get there min, max, and preferred sizes
|
||||||
|
// return us the size of the box
|
||||||
|
|
||||||
|
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
aBox->GetChildBox(&child);
|
||||||
|
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
// ignore collapsed children
|
||||||
|
PRBool isCollapsed = PR_FALSE;
|
||||||
|
aBox->IsCollapsed(aBoxLayoutState, isCollapsed);
|
||||||
|
|
||||||
|
if (!isCollapsed)
|
||||||
|
{
|
||||||
|
// if completely redefined don't even ask our child for its size.
|
||||||
|
nsSize max(NS_INTRINSICSIZE, NS_INTRINSICSIZE);
|
||||||
|
child->GetMaxSize(aBoxLayoutState, max);
|
||||||
|
|
||||||
|
AddMargin(child, max);
|
||||||
|
AddSmallestSize(aSize, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
child->GetNextBox(&child);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// now add our border and padding and insets
|
||||||
|
AddBorderAndPadding(aBox, aSize);
|
||||||
|
AddInset(aBox, aSize);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsStackLayout::GetAscent(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent)
|
||||||
|
{
|
||||||
|
aAscent = 0;
|
||||||
|
|
||||||
|
// run through all the children and get there min, max, and preferred sizes
|
||||||
|
// return us the size of the box
|
||||||
|
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
aBox->GetChildBox(&child);
|
||||||
|
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
// ignore collapsed children
|
||||||
|
PRBool isCollapsed = PR_FALSE;
|
||||||
|
aBox->IsCollapsed(aBoxLayoutState, isCollapsed);
|
||||||
|
|
||||||
|
if (!isCollapsed)
|
||||||
|
{
|
||||||
|
// if completely redefined don't even ask our child for its size.
|
||||||
|
nscoord ascent = 0;
|
||||||
|
child->GetAscent(aBoxLayoutState, ascent);
|
||||||
|
nsMargin margin;
|
||||||
|
child->GetMargin(margin);
|
||||||
|
ascent += margin.top + margin.bottom;
|
||||||
|
|
||||||
|
if (ascent > aAscent)
|
||||||
|
aAscent = ascent;
|
||||||
|
}
|
||||||
|
|
||||||
|
child->GetNextBox(&child);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsStackLayout::Layout(nsIBox* aBox, nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
nsRect clientRect;
|
||||||
|
aBox->GetClientRect(clientRect);
|
||||||
|
|
||||||
|
nsIBox* child = nsnull;
|
||||||
|
PRBool grow;
|
||||||
|
|
||||||
|
do {
|
||||||
|
aBox->GetChildBox(&child);
|
||||||
|
grow = PR_FALSE;
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
nsMargin margin;
|
||||||
|
child->GetMargin(margin);
|
||||||
|
nsRect childRect(clientRect);
|
||||||
|
childRect.Deflate(margin);
|
||||||
|
child->SetBounds(aState, childRect);
|
||||||
|
child->Layout(aState);
|
||||||
|
child->GetBounds(childRect);
|
||||||
|
childRect.Inflate(margin);
|
||||||
|
|
||||||
|
// did the child push back on us and get bigger?
|
||||||
|
if (childRect.width > clientRect.width) {
|
||||||
|
clientRect.width = childRect.width;
|
||||||
|
grow = PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (childRect.height > clientRect.height) {
|
||||||
|
clientRect.height = childRect.height;
|
||||||
|
grow = PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
child->GetNextBox(&child);
|
||||||
|
}
|
||||||
|
} while(grow);
|
||||||
|
|
||||||
|
// if some HTML inside us got bigger we need to force ourselves to
|
||||||
|
// get bigger
|
||||||
|
nsRect bounds;
|
||||||
|
aBox->GetBounds(bounds);
|
||||||
|
nsMargin bp;
|
||||||
|
aBox->GetBorderAndPadding(bp);
|
||||||
|
clientRect.Inflate(bp);
|
||||||
|
aBox->GetInset(bp);
|
||||||
|
clientRect.Inflate(bp);
|
||||||
|
|
||||||
|
if (clientRect.width > bounds.width || clientRect.height > bounds.height)
|
||||||
|
{
|
||||||
|
if (clientRect.width > bounds.width)
|
||||||
|
bounds.width = clientRect.width;
|
||||||
|
if (clientRect.height > bounds.height)
|
||||||
|
bounds.height = clientRect.height;
|
||||||
|
|
||||||
|
aBox->SetBounds(aState, bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
53
layout/xul/base/src/nsStackLayout.h
Normal file
53
layout/xul/base/src/nsStackLayout.h
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public
|
||||||
|
* License Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS
|
||||||
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||||
|
* implied. See the License for the specific language governing
|
||||||
|
* rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla Communicator client code.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Netscape Communications
|
||||||
|
* Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||||
|
* Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
Eric D Vaughan
|
||||||
|
A frame that can have multiple children. Only one child may be displayed at one time. So the
|
||||||
|
can be flipped though like a deck of cards.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef nsStackLayout_h___
|
||||||
|
#define nsStackLayout_h___
|
||||||
|
|
||||||
|
#include "nsBoxLayout.h"
|
||||||
|
|
||||||
|
class nsStackLayout : public nsBoxLayout
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
nsStackLayout(nsIPresShell* aShell);
|
||||||
|
|
||||||
|
NS_IMETHOD Layout(nsIBox* aBox, nsBoxLayoutState& aState);
|
||||||
|
|
||||||
|
NS_IMETHOD GetPrefSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMaxSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetAscent(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
}; // class nsStackLayout
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ NS_NewTabFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
} // NS_NewTabFrame
|
} // NS_NewTabFrame
|
||||||
|
|
||||||
nsTabFrame::nsTabFrame(nsIPresShell* aPresShell)
|
nsTabFrame::nsTabFrame(nsIPresShell* aPresShell)
|
||||||
:nsXULButtonFrame(aPresShell)
|
:nsButtonBoxFrame(aPresShell)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,11 +30,11 @@
|
|||||||
#ifndef nsTabFrame_h___
|
#ifndef nsTabFrame_h___
|
||||||
#define nsTabFrame_h___
|
#define nsTabFrame_h___
|
||||||
|
|
||||||
#include "nsXULButtonFrame.h"
|
#include "nsButtonBoxFrame.h"
|
||||||
|
|
||||||
class nsTabControlFrame;
|
class nsTabControlFrame;
|
||||||
|
|
||||||
class nsTabFrame : public nsXULButtonFrame
|
class nsTabFrame : public nsButtonBoxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
// See documentation in associated header file
|
// See documentation in associated header file
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "nsXULTextFrame.h"
|
#include "nsTextBoxFrame.h"
|
||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "nsIDeviceContext.h"
|
#include "nsIDeviceContext.h"
|
||||||
#include "nsIFontMetrics.h"
|
#include "nsIFontMetrics.h"
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
#define ELIPSIS "..."
|
#define ELIPSIS "..."
|
||||||
|
|
||||||
@@ -61,13 +62,13 @@ public:
|
|||||||
// Creates a new Toolbar frame and returns it in |aNewFrame|
|
// Creates a new Toolbar frame and returns it in |aNewFrame|
|
||||||
//
|
//
|
||||||
nsresult
|
nsresult
|
||||||
NS_NewXULTextFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
NS_NewTextBoxFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
||||||
{
|
{
|
||||||
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsXULTextFrame* it = new (aPresShell) nsXULTextFrame;
|
nsTextBoxFrame* it = new (aPresShell) nsTextBoxFrame (aPresShell);
|
||||||
if (nsnull == it)
|
if (nsnull == it)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
@@ -79,7 +80,7 @@ NS_NewXULTextFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXULTextFrame::AttributeChanged(nsIPresContext* aPresContext,
|
nsTextBoxFrame::AttributeChanged(nsIPresContext* aPresContext,
|
||||||
nsIContent* aChild,
|
nsIContent* aChild,
|
||||||
PRInt32 aNameSpaceID,
|
PRInt32 aNameSpaceID,
|
||||||
nsIAtom* aAttribute,
|
nsIAtom* aAttribute,
|
||||||
@@ -96,23 +97,23 @@ nsXULTextFrame::AttributeChanged(nsIPresContext* aPresContext,
|
|||||||
UpdateAccessUnderline();
|
UpdateAccessUnderline();
|
||||||
|
|
||||||
if (aResize) {
|
if (aResize) {
|
||||||
nsCOMPtr<nsIPresShell> shell;
|
nsBoxLayoutState state(aPresContext);
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
MarkDirty(state);
|
||||||
mState |= NS_FRAME_IS_DIRTY;
|
|
||||||
mParent->ReflowDirtyChild(shell, this);
|
|
||||||
} else if (aRedraw) {
|
} else if (aRedraw) {
|
||||||
Invalidate(aPresContext, nsRect(0,0,mRect.width, mRect.height), PR_FALSE);
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
Redraw(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsXULTextFrame::nsXULTextFrame():mCropType(CropRight),mTitle(""), mAccessKeyInfo(nsnull)
|
nsTextBoxFrame::nsTextBoxFrame(nsIPresShell* aShell):nsLeafBoxFrame(aShell),mTitle(""), mCropType(CropRight),mAccessKeyInfo(nsnull)
|
||||||
{
|
{
|
||||||
mState |= NS_STATE_NEED_LAYOUT;
|
mState |= NS_STATE_NEED_LAYOUT;
|
||||||
|
NeedsRecalc();
|
||||||
}
|
}
|
||||||
|
|
||||||
nsXULTextFrame::~nsXULTextFrame()
|
nsTextBoxFrame::~nsTextBoxFrame()
|
||||||
{
|
{
|
||||||
if (mAccessKeyInfo)
|
if (mAccessKeyInfo)
|
||||||
delete mAccessKeyInfo;
|
delete mAccessKeyInfo;
|
||||||
@@ -120,13 +121,13 @@ nsXULTextFrame::~nsXULTextFrame()
|
|||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXULTextFrame::Init(nsIPresContext* aPresContext,
|
nsTextBoxFrame::Init(nsIPresContext* aPresContext,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
nsIFrame* aParent,
|
nsIFrame* aParent,
|
||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow)
|
nsIFrame* aPrevInFlow)
|
||||||
{
|
{
|
||||||
nsresult rv = nsXULLeafFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
nsresult rv = nsLeafBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
||||||
|
|
||||||
PRBool a,b,c;
|
PRBool a,b,c;
|
||||||
UpdateAttributes(aPresContext, nsnull, a, b, c /* all */);
|
UpdateAttributes(aPresContext, nsnull, a, b, c /* all */);
|
||||||
@@ -139,7 +140,7 @@ nsXULTextFrame::Init(nsIPresContext* aPresContext,
|
|||||||
nsAutoString accesskey;
|
nsAutoString accesskey;
|
||||||
mContent->GetAttribute(kNameSpaceID_None, nsXULAtoms::accesskey,
|
mContent->GetAttribute(kNameSpaceID_None, nsXULAtoms::accesskey,
|
||||||
accesskey);
|
accesskey);
|
||||||
if (!accesskey.IsEmpty()) {
|
if (accesskey != "") {
|
||||||
if (!mAccessKeyInfo)
|
if (!mAccessKeyInfo)
|
||||||
mAccessKeyInfo = new nsAccessKeyInfo();
|
mAccessKeyInfo = new nsAccessKeyInfo();
|
||||||
|
|
||||||
@@ -168,7 +169,7 @@ nsXULTextFrame::Init(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsXULTextFrame::UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttribute, PRBool& aResize, PRBool& aRedraw, PRBool& aUpdateAccessUnderline)
|
nsTextBoxFrame::UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttribute, PRBool& aResize, PRBool& aRedraw, PRBool& aUpdateAccessUnderline)
|
||||||
{
|
{
|
||||||
aResize = PR_FALSE;
|
aResize = PR_FALSE;
|
||||||
aRedraw = PR_FALSE;
|
aRedraw = PR_FALSE;
|
||||||
@@ -222,14 +223,14 @@ nsXULTextFrame::UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttrib
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXULTextFrame::Paint(nsIPresContext* aPresContext,
|
nsTextBoxFrame::Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsFramePaintLayer aWhichLayer)
|
nsFramePaintLayer aWhichLayer)
|
||||||
{
|
{
|
||||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
||||||
mStyleContext->GetStyleData(eStyleStruct_Display);
|
mStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
if (!disp->IsVisibleOrCollapsed())
|
if (!disp->IsVisible())
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) {
|
if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) {
|
||||||
@@ -251,7 +252,7 @@ nsXULTextFrame::Paint(nsIPresContext* aPresContext,
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nsXULTextFrame::LayoutTitle(nsIPresContext* aPresContext,
|
nsTextBoxFrame::LayoutTitle(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
@@ -298,7 +299,7 @@ nsXULTextFrame::LayoutTitle(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXULTextFrame::PaintTitle(nsIPresContext* aPresContext,
|
nsTextBoxFrame::PaintTitle(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
@@ -364,7 +365,7 @@ nsXULTextFrame::PaintTitle(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsXULTextFrame::GetTextSize(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext,
|
nsTextBoxFrame::GetTextSize(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext,
|
||||||
const nsString& aString, nsSize& aSize, nscoord& aAscent)
|
const nsString& aString, nsSize& aSize, nscoord& aAscent)
|
||||||
{
|
{
|
||||||
const nsStyleFont* fontStyle = (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font);
|
const nsStyleFont* fontStyle = (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font);
|
||||||
@@ -381,7 +382,7 @@ nsXULTextFrame::GetTextSize(nsIPresContext* aPresContext, nsIRenderingContext& a
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsXULTextFrame::CalculateTitleForWidth(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, nscoord aWidth)
|
nsTextBoxFrame::CalculateTitleForWidth(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, nscoord aWidth)
|
||||||
{
|
{
|
||||||
if (mTitle.Length() == 0)
|
if (mTitle.Length() == 0)
|
||||||
return;
|
return;
|
||||||
@@ -534,13 +535,13 @@ nsXULTextFrame::CalculateTitleForWidth(nsIPresContext* aPresContext, nsIRenderin
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsXULTextFrame::UpdateAccessUnderline()
|
nsTextBoxFrame::UpdateAccessUnderline()
|
||||||
{
|
{
|
||||||
#ifndef XP_UNIX
|
#ifndef XP_UNIX
|
||||||
nsAutoString accesskey;
|
nsAutoString accesskey;
|
||||||
mContent->GetAttribute(kNameSpaceID_None, nsXULAtoms::accesskey,
|
mContent->GetAttribute(kNameSpaceID_None, nsXULAtoms::accesskey,
|
||||||
accesskey);
|
accesskey);
|
||||||
if (accesskey.IsEmpty()) {
|
if (accesskey == "") {
|
||||||
if (mAccessKeyInfo) {
|
if (mAccessKeyInfo) {
|
||||||
delete mAccessKeyInfo;
|
delete mAccessKeyInfo;
|
||||||
mAccessKeyInfo = nsnull;
|
mAccessKeyInfo = nsnull;
|
||||||
@@ -559,41 +560,95 @@ nsXULTextFrame::UpdateAccessUnderline()
|
|||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXULTextFrame::Reflow(nsIPresContext* aPresContext,
|
nsTextBoxFrame::Layout(nsBoxLayoutState& aBoxLayoutState)
|
||||||
nsHTMLReflowMetrics& aMetrics,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
{
|
||||||
mState |= NS_STATE_NEED_LAYOUT;
|
mState |= NS_STATE_NEED_LAYOUT;
|
||||||
|
|
||||||
return nsXULLeafFrame::Reflow(aPresContext, aMetrics, aReflowState, aStatus);
|
return nsLeafBoxFrame::Layout(aBoxLayoutState);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsTextBoxFrame::NeedsRecalc()
|
||||||
|
{
|
||||||
|
mNeedsRecalc = PR_TRUE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsTextBoxFrame::CalcTextSize(nsBoxLayoutState& aBoxLayoutState)
|
||||||
|
{
|
||||||
|
if (mNeedsRecalc)
|
||||||
|
{
|
||||||
|
nsSize size;
|
||||||
|
nscoord ascent = 0;
|
||||||
|
nsIPresContext* presContext = aBoxLayoutState.GetPresContext();
|
||||||
|
nsIRenderingContext* rendContext = aBoxLayoutState.GetReflowState()->rendContext;
|
||||||
|
if (rendContext) {
|
||||||
|
GetTextSize(presContext, *rendContext,
|
||||||
|
mTitle, size, mAscent);
|
||||||
|
mTextSize = size;
|
||||||
|
mNeedsRecalc = PR_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ok return our dimensions
|
* Ok return our dimensions
|
||||||
*/
|
*/
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXULTextFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)
|
nsTextBoxFrame::GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
{
|
{
|
||||||
// depending on the type of alignment add in the space for the text
|
CalcTextSize(aBoxLayoutState);
|
||||||
nsSize size;
|
|
||||||
nscoord ascent = 0;
|
|
||||||
GetTextSize(aPresContext, *aReflowState.rendContext,
|
|
||||||
mTitle, size, ascent);
|
|
||||||
|
|
||||||
aSize.ascent = ascent;
|
aSize = mTextSize;
|
||||||
aSize.prefSize = size;
|
|
||||||
aSize.minSize = size;
|
|
||||||
|
|
||||||
// if there is cropping our min width becomes 0
|
AddBorderAndPadding(aSize);
|
||||||
if (mCropType != CropNone)
|
AddInset(aSize);
|
||||||
aSize.minSize.width = 0;
|
nsIBox::AddCSSPrefSize(aBoxLayoutState, this, aSize);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ok return our dimensions
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsTextBoxFrame::GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
CalcTextSize(aBoxLayoutState);
|
||||||
|
|
||||||
|
aSize = mTextSize;
|
||||||
|
|
||||||
|
// if there is cropping our min width becomes our border and padding
|
||||||
|
if (mCropType != CropNone) {
|
||||||
|
aSize.width = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddBorderAndPadding(aSize);
|
||||||
|
AddInset(aSize);
|
||||||
|
nsIBox::AddCSSMinSize(aBoxLayoutState, this, aSize);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXULTextFrame::GetFrameName(nsString& aResult) const
|
nsTextBoxFrame::GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent)
|
||||||
|
{
|
||||||
|
CalcTextSize(aBoxLayoutState);
|
||||||
|
|
||||||
|
aAscent = mAscent;
|
||||||
|
|
||||||
|
nsMargin m(0,0,0,0);
|
||||||
|
GetBorderAndPadding(m);
|
||||||
|
aAscent += m.top;
|
||||||
|
GetInset(m);
|
||||||
|
aAscent += m.top;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsTextBoxFrame::GetFrameName(nsString& aResult) const
|
||||||
{
|
{
|
||||||
aResult = "Text[value=";
|
aResult = "Text[value=";
|
||||||
aResult += mTitle;
|
aResult += mTitle;
|
||||||
@@ -19,23 +19,27 @@
|
|||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
#ifndef nsXULTextFrame_h___
|
#ifndef nsTextBoxFrame_h___
|
||||||
#define nsXULTextFrame_h___
|
#define nsTextBoxFrame_h___
|
||||||
|
|
||||||
#include "nsXULLeafFrame.h"
|
#include "nsLeafBoxFrame.h"
|
||||||
|
|
||||||
class nsAccessKeyInfo;
|
class nsAccessKeyInfo;
|
||||||
|
|
||||||
class nsXULTextFrame : public nsXULLeafFrame
|
class nsTextBoxFrame : public nsLeafBoxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// nsIBox
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD NeedsRecalc();
|
||||||
|
|
||||||
enum CroppingStyle { CropNone, CropLeft, CropRight, CropCenter };
|
enum CroppingStyle { CropNone, CropLeft, CropRight, CropCenter };
|
||||||
|
|
||||||
friend nsresult NS_NewXULTextFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
friend nsresult NS_NewTextBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
// nsIBox frame interface
|
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
@@ -53,11 +57,6 @@ public:
|
|||||||
|
|
||||||
virtual void UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttribute, PRBool& aResize, PRBool& aRedraw, PRBool& aUpdateAccessUnderline);
|
virtual void UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttribute, PRBool& aResize, PRBool& aRedraw, PRBool& aUpdateAccessUnderline);
|
||||||
|
|
||||||
// nsIHTMLReflow overrides
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -65,7 +64,7 @@ public:
|
|||||||
nsFramePaintLayer aWhichLayer);
|
nsFramePaintLayer aWhichLayer);
|
||||||
|
|
||||||
|
|
||||||
~nsXULTextFrame();
|
~nsTextBoxFrame();
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void UpdateAccessUnderline();
|
void UpdateAccessUnderline();
|
||||||
@@ -82,8 +81,9 @@ protected:
|
|||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
const nsRect& aTextRect);
|
const nsRect& aTextRect);
|
||||||
|
|
||||||
|
virtual void CalcTextSize(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
|
||||||
nsXULTextFrame();
|
nsTextBoxFrame(nsIPresShell* aShell);
|
||||||
|
|
||||||
virtual void CalculateTitleForWidth(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, nscoord aWidth);
|
virtual void CalculateTitleForWidth(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, nscoord aWidth);
|
||||||
virtual void GetTextSize(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, const nsString& aString, nsSize& aSize, nscoord& aAscent);
|
virtual void GetTextSize(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, const nsString& aString, nsSize& aSize, nscoord& aAscent);
|
||||||
@@ -95,6 +95,9 @@ private:
|
|||||||
nsString mCroppedTitle;
|
nsString mCroppedTitle;
|
||||||
nscoord mTitleWidth;
|
nscoord mTitleWidth;
|
||||||
nsAccessKeyInfo* mAccessKeyInfo;
|
nsAccessKeyInfo* mAccessKeyInfo;
|
||||||
}; // class nsXULTextFrame
|
PRBool mNeedsRecalc;
|
||||||
|
nsSize mTextSize;
|
||||||
|
nscoord mAscent;
|
||||||
|
}; // class nsTextBoxFrame
|
||||||
|
|
||||||
#endif /* nsXULTextFrame_h___ */
|
#endif /* nsTextBoxFrame_h___ */
|
||||||
@@ -59,6 +59,9 @@ public:
|
|||||||
nsIAtom* aListName,
|
nsIAtom* aListName,
|
||||||
nsIFrame* aChildList);
|
nsIFrame* aChildList);
|
||||||
|
|
||||||
|
NS_IMETHOD GetBorderAndPadding(nsMargin& aBorderAndPadding);
|
||||||
|
|
||||||
|
|
||||||
NS_METHOD Paint(nsIPresContext* aPresContext,
|
NS_METHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
@@ -81,11 +84,6 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
virtual PRBool GetInitialOrientation(PRBool& aHorizontal) { aHorizontal = PR_FALSE; return PR_TRUE; }
|
virtual PRBool GetInitialOrientation(PRBool& aHorizontal) { aHorizontal = PR_FALSE; return PR_TRUE; }
|
||||||
|
|
||||||
nsIFrame* GetTitleFrame(nsIPresContext* aPresContext, nsRect& aRect);
|
nsIFrame* GetTitleFrame(nsIPresContext* aPresContext, nsRect& aRect);
|
||||||
@@ -322,27 +320,10 @@ nsTitledBoxFrame::GetContentFrame(nsIPresContext* aPresContext)
|
|||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsTitledBoxFrame::Reflow(nsIPresContext* aPresContext,
|
nsTitledBoxFrame::GetBorderAndPadding(nsMargin& aBorderAndPadding)
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
{
|
||||||
if (aReflowState.mComputedBorderPadding.top != 0)
|
aBorderAndPadding.SizeTo(0,0,0,0);
|
||||||
{
|
return NS_OK;
|
||||||
nsHTMLReflowState newState(aReflowState);
|
|
||||||
|
|
||||||
if (newState.mComputedHeight != NS_INTRINSICSIZE)
|
|
||||||
newState.mComputedHeight += aReflowState.mComputedBorderPadding.top;
|
|
||||||
|
|
||||||
// remove the border from border padding
|
|
||||||
((nsMargin&)newState.mComputedBorderPadding).top = 0;
|
|
||||||
((nsMargin&)newState.mComputedPadding).top = 0;
|
|
||||||
|
|
||||||
// reflow us again with the correct values.
|
|
||||||
return Reflow(aPresContext, aDesiredSize, newState, aStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
return nsBoxFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
#include "nsCOMPtr.h"
|
#include "nsCOMPtr.h"
|
||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
#include "nsButtonFrameRenderer.h"
|
#include "nsButtonFrameRenderer.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
#include "nsHTMLParts.h"
|
#include "nsHTMLParts.h"
|
||||||
#include "nsString.h"
|
#include "nsString.h"
|
||||||
@@ -71,6 +72,7 @@
|
|||||||
#include "nsIDOMHTMLMapElement.h"
|
#include "nsIDOMHTMLMapElement.h"
|
||||||
#include "nsIStyleSet.h"
|
#include "nsIStyleSet.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
#include "nsFormControlHelper.h"
|
#include "nsFormControlHelper.h"
|
||||||
|
|
||||||
@@ -130,6 +132,11 @@ nsTitledButtonFrame::UpdateImageFrame(nsIPresContext* aPresContext,
|
|||||||
PRUint32 aStatus)
|
PRUint32 aStatus)
|
||||||
{
|
{
|
||||||
if (NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE & aStatus) {
|
if (NS_IMAGE_LOAD_STATUS_SIZE_AVAILABLE & aStatus) {
|
||||||
|
nsTitledButtonFrame* us = (nsTitledButtonFrame*)aFrame;
|
||||||
|
nsBoxLayoutState state(aPresContext);
|
||||||
|
us->MarkDirty(state);
|
||||||
|
|
||||||
|
/*
|
||||||
// Now that the size is available, trigger a content-changed reflow
|
// Now that the size is available, trigger a content-changed reflow
|
||||||
nsIContent* content = nsnull;
|
nsIContent* content = nsnull;
|
||||||
aFrame->GetContent(&content);
|
aFrame->GetContent(&content);
|
||||||
@@ -142,6 +149,7 @@ nsTitledButtonFrame::UpdateImageFrame(nsIPresContext* aPresContext,
|
|||||||
}
|
}
|
||||||
NS_RELEASE(content);
|
NS_RELEASE(content);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@@ -158,7 +166,7 @@ NS_NewTitledButtonFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|||||||
if (nsnull == aNewFrame) {
|
if (nsnull == aNewFrame) {
|
||||||
return NS_ERROR_NULL_POINTER;
|
return NS_ERROR_NULL_POINTER;
|
||||||
}
|
}
|
||||||
nsTitledButtonFrame* it = new (aPresShell) nsTitledButtonFrame;
|
nsTitledButtonFrame* it = new (aPresShell) nsTitledButtonFrame (aPresShell);
|
||||||
if (nsnull == it)
|
if (nsnull == it)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
@@ -187,10 +195,8 @@ nsTitledButtonFrame::AttributeChanged(nsIPresContext* aPresContext,
|
|||||||
UpdateAccessUnderline();
|
UpdateAccessUnderline();
|
||||||
|
|
||||||
if (aResize) {
|
if (aResize) {
|
||||||
nsCOMPtr<nsIPresShell> shell;
|
nsBoxLayoutState state(aPresContext);
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
MarkDirty(state);
|
||||||
mState |= NS_FRAME_IS_DIRTY;
|
|
||||||
mParent->ReflowDirtyChild(shell, this);
|
|
||||||
} else if (aRedraw) {
|
} else if (aRedraw) {
|
||||||
mRenderer->Redraw(aPresContext);
|
mRenderer->Redraw(aPresContext);
|
||||||
}
|
}
|
||||||
@@ -210,7 +216,10 @@ nsTitledButtonFrame::AttributeChanged(nsIPresContext* aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsTitledButtonFrame::nsTitledButtonFrame()
|
nsTitledButtonFrame::nsTitledButtonFrame(nsIPresShell* aShell):nsLeafBoxFrame(aShell),
|
||||||
|
mPrefSize(0,0),
|
||||||
|
mMinSize(0,0),
|
||||||
|
mAscent(0)
|
||||||
{
|
{
|
||||||
mTitle = "";
|
mTitle = "";
|
||||||
mAlign = GetDefaultAlignment();
|
mAlign = GetDefaultAlignment();
|
||||||
@@ -220,6 +229,7 @@ nsTitledButtonFrame::nsTitledButtonFrame()
|
|||||||
mHasImage = PR_FALSE;
|
mHasImage = PR_FALSE;
|
||||||
mHasOnceBeenInMixedState = PR_FALSE;
|
mHasOnceBeenInMixedState = PR_FALSE;
|
||||||
mRenderer = new nsTitledButtonRenderer();
|
mRenderer = new nsTitledButtonRenderer();
|
||||||
|
NeedsRecalc();
|
||||||
}
|
}
|
||||||
|
|
||||||
nsTitledButtonFrame::~nsTitledButtonFrame()
|
nsTitledButtonFrame::~nsTitledButtonFrame()
|
||||||
@@ -227,13 +237,21 @@ nsTitledButtonFrame::~nsTitledButtonFrame()
|
|||||||
delete mRenderer;
|
delete mRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsTitledButtonFrame::NeedsRecalc()
|
||||||
|
{
|
||||||
|
mNeedsRecalc = PR_TRUE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_METHOD
|
NS_METHOD
|
||||||
nsTitledButtonFrame::Destroy(nsIPresContext* aPresContext)
|
nsTitledButtonFrame::Destroy(nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
// Release image loader first so that it's refcnt can go to zero
|
// Release image loader first so that it's refcnt can go to zero
|
||||||
mImageLoader.StopAllLoadImages(aPresContext);
|
mImageLoader.StopAllLoadImages(aPresContext);
|
||||||
|
|
||||||
return nsXULLeafFrame::Destroy(aPresContext);
|
return nsLeafBoxFrame::Destroy(aPresContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -244,7 +262,7 @@ nsTitledButtonFrame::Init(nsIPresContext* aPresContext,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow)
|
nsIFrame* aPrevInFlow)
|
||||||
{
|
{
|
||||||
nsresult rv = nsXULLeafFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
nsresult rv = nsLeafBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
||||||
|
|
||||||
mRenderer->SetNameSpace(kNameSpaceID_None);
|
mRenderer->SetNameSpace(kNameSpaceID_None);
|
||||||
mRenderer->SetFrame(this,aPresContext);
|
mRenderer->SetFrame(this,aPresContext);
|
||||||
@@ -938,21 +956,6 @@ nsTitledButtonFrame::PaintImage(nsIPresContext* aPresContext,
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsTitledButtonFrame::Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aMetrics,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
mNeedsLayout = PR_TRUE;
|
|
||||||
nsresult result = nsXULLeafFrame::Reflow(aPresContext, aMetrics, aReflowState, aStatus);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct nsTitleRecessedBorder : public nsStyleSpacing {
|
struct nsTitleRecessedBorder : public nsStyleSpacing {
|
||||||
nsTitleRecessedBorder(nscoord aBorderWidth)
|
nsTitleRecessedBorder(nscoord aBorderWidth)
|
||||||
: nsStyleSpacing()
|
: nsStyleSpacing()
|
||||||
@@ -1204,7 +1207,7 @@ nsTitledButtonFrame::HandleEvent(nsIPresContext* aPresContext,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nsXULLeafFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
return nsLeafBoxFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1388,22 +1391,79 @@ nsTitledButtonFrame::GetImageSize(nsIPresContext* aPresContext)
|
|||||||
* Ok return our dimensions
|
* Ok return our dimensions
|
||||||
*/
|
*/
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsTitledButtonFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)
|
nsTitledButtonFrame::Layout(nsBoxLayoutState& aState)
|
||||||
{
|
{
|
||||||
GetImageSize(aPresContext);
|
mNeedsLayout = PR_TRUE;
|
||||||
|
return nsLeafBoxFrame::Layout(aState);
|
||||||
|
}
|
||||||
|
|
||||||
aSize.minSize.width = mImageRect.width;
|
/**
|
||||||
aSize.minSize.height = mImageRect.height;
|
* Ok return our dimensions
|
||||||
aSize.prefSize.width = mImageRect.width;
|
*/
|
||||||
aSize.prefSize.height = mImageRect.height;
|
NS_IMETHODIMP
|
||||||
|
nsTitledButtonFrame::GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
if (mNeedsRecalc) {
|
||||||
|
CacheSizes(aBoxLayoutState);
|
||||||
|
}
|
||||||
|
|
||||||
|
aSize = mPrefSize;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ok return our dimensions
|
||||||
|
*/
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsTitledButtonFrame::GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
||||||
|
{
|
||||||
|
if (mNeedsRecalc) {
|
||||||
|
CacheSizes(aBoxLayoutState);
|
||||||
|
}
|
||||||
|
|
||||||
|
aSize = mMinSize;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsTitledButtonFrame::GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aCoord)
|
||||||
|
{
|
||||||
|
if (mNeedsRecalc) {
|
||||||
|
CacheSizes(aBoxLayoutState);
|
||||||
|
}
|
||||||
|
|
||||||
|
aCoord = mAscent;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ok return our dimensions
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
nsTitledButtonFrame::CacheSizes(nsBoxLayoutState& aBoxLayoutState)
|
||||||
|
{
|
||||||
|
nsIPresContext* presContext = aBoxLayoutState.GetPresContext();
|
||||||
|
const nsHTMLReflowState* state = aBoxLayoutState.GetReflowState();
|
||||||
|
if (!state)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nsIRenderingContext* rendContext = state->rendContext;
|
||||||
|
|
||||||
|
GetImageSize(presContext);
|
||||||
|
|
||||||
|
mMinSize.width = mImageRect.width;
|
||||||
|
mMinSize.height = mImageRect.height;
|
||||||
|
mPrefSize.width = mImageRect.width;
|
||||||
|
mPrefSize.height = mImageRect.height;
|
||||||
|
|
||||||
// depending on the type of alignment add in the space for the text
|
// depending on the type of alignment add in the space for the text
|
||||||
nsSize size;
|
nsSize size;
|
||||||
nscoord ascent = 0;
|
nscoord ascent = 0;
|
||||||
GetTextSize(aPresContext, *aReflowState.rendContext,
|
|
||||||
|
GetTextSize(presContext, *rendContext,
|
||||||
mTitle, size, ascent);
|
mTitle, size, ascent);
|
||||||
|
|
||||||
aSize.ascent = ascent;
|
mAscent = ascent;
|
||||||
|
|
||||||
switch (mAlign) {
|
switch (mAlign) {
|
||||||
case NS_SIDE_TOP:
|
case NS_SIDE_TOP:
|
||||||
@@ -1411,59 +1471,81 @@ nsTitledButtonFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflow
|
|||||||
|
|
||||||
// if we have an image add the image to our min size
|
// if we have an image add the image to our min size
|
||||||
if (mHasImage)
|
if (mHasImage)
|
||||||
aSize.minSize.width = aSize.prefSize.width;
|
mMinSize.width = mPrefSize.width;
|
||||||
|
|
||||||
// if we are not cropped then our min size also includes the text.
|
// if we are not cropped then our min size also includes the text.
|
||||||
if (mCropType == CropNone)
|
if (mCropType == CropNone)
|
||||||
aSize.minSize.width = PR_MAX(size.width, aSize.minSize.width);
|
mMinSize.width = PR_MAX(size.width, mMinSize.width);
|
||||||
|
|
||||||
if (size.width > aSize.prefSize.width)
|
if (size.width > mPrefSize.width)
|
||||||
aSize.prefSize.width = size.width;
|
mPrefSize.width = size.width;
|
||||||
|
|
||||||
if (mTitle.Length() > 0) {
|
if (mTitle.Length() > 0) {
|
||||||
aSize.prefSize.height += size.height;
|
mPrefSize.height += size.height;
|
||||||
if (mHasImage)
|
if (mHasImage)
|
||||||
aSize.prefSize.height += mSpacing;
|
mPrefSize.height += mSpacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
aSize.minSize.height = aSize.prefSize.height;
|
mMinSize.height = mPrefSize.height;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case NS_SIDE_LEFT:
|
case NS_SIDE_LEFT:
|
||||||
case NS_SIDE_RIGHT:
|
case NS_SIDE_RIGHT:
|
||||||
if (size.height > aSize.prefSize.height)
|
if (size.height > mPrefSize.height)
|
||||||
aSize.prefSize.height = size.height;
|
mPrefSize.height = size.height;
|
||||||
|
|
||||||
if (mHasImage)
|
if (mHasImage)
|
||||||
aSize.minSize.width = aSize.prefSize.width;
|
mMinSize.width = mPrefSize.width;
|
||||||
|
|
||||||
// if we are not cropped then our min size also includes the text.
|
// if we are not cropped then our min size also includes the text.
|
||||||
if (mCropType == CropNone)
|
if (mCropType == CropNone)
|
||||||
aSize.minSize.width += size.width;
|
mMinSize.width += size.width;
|
||||||
|
|
||||||
if (mTitle.Length() > 0) {
|
if (mTitle.Length() > 0) {
|
||||||
aSize.prefSize.width += size.width;
|
mPrefSize.width += size.width;
|
||||||
|
|
||||||
if (mHasImage) {
|
if (mHasImage) {
|
||||||
aSize.prefSize.width += mSpacing;
|
mPrefSize.width += mSpacing;
|
||||||
aSize.minSize.width += mSpacing;
|
mMinSize.width += mSpacing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nscoord oldHeight = mPrefSize.height;
|
||||||
|
|
||||||
nsMargin focusBorder = mRenderer->GetAddedButtonBorderAndPadding();
|
nsMargin focusBorder = mRenderer->GetAddedButtonBorderAndPadding();
|
||||||
|
|
||||||
aSize.prefSize.width += focusBorder.left + focusBorder.right;
|
mPrefSize.width += focusBorder.left + focusBorder.right;
|
||||||
aSize.prefSize.height += focusBorder.top + focusBorder.bottom;
|
mPrefSize.height += focusBorder.top + focusBorder.bottom;
|
||||||
|
|
||||||
aSize.minSize.width += focusBorder.left + focusBorder.right;
|
mMinSize.width += focusBorder.left + focusBorder.right;
|
||||||
aSize.minSize.height += focusBorder.top + focusBorder.bottom;
|
mMinSize.height += focusBorder.top + focusBorder.bottom;
|
||||||
|
|
||||||
ascent += focusBorder.top;
|
|
||||||
|
|
||||||
return NS_OK;
|
AddBorderAndPadding(mPrefSize);
|
||||||
|
AddInset(mPrefSize);
|
||||||
|
nsIBox::AddCSSPrefSize(aBoxLayoutState, this, mPrefSize);
|
||||||
|
|
||||||
|
AddBorderAndPadding(mMinSize);
|
||||||
|
AddInset(mMinSize);
|
||||||
|
nsIBox::AddCSSMinSize(aBoxLayoutState, this, mMinSize);
|
||||||
|
|
||||||
|
if (mPrefSize.width < mMinSize.width)
|
||||||
|
mPrefSize.width = mMinSize.width;
|
||||||
|
|
||||||
|
if (mPrefSize.height < mMinSize.height)
|
||||||
|
mPrefSize.height = mMinSize.height;
|
||||||
|
|
||||||
|
nsMargin m(0,0,0,0);
|
||||||
|
GetBorderAndPadding(m);
|
||||||
|
mAscent += m.top;
|
||||||
|
GetInset(m);
|
||||||
|
mAscent += m.top;
|
||||||
|
mAscent += focusBorder.top;
|
||||||
|
|
||||||
|
mNeedsRecalc = PR_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
|||||||
@@ -23,23 +23,28 @@
|
|||||||
#define nsTitledButtonFrame_h___
|
#define nsTitledButtonFrame_h___
|
||||||
|
|
||||||
#include "nsHTMLImageLoader.h"
|
#include "nsHTMLImageLoader.h"
|
||||||
#include "nsXULLeafFrame.h"
|
#include "nsLeafBoxFrame.h"
|
||||||
|
|
||||||
class nsIPopUpMenu;
|
class nsIPopUpMenu;
|
||||||
class nsTitledButtonRenderer;
|
class nsTitledButtonRenderer;
|
||||||
|
|
||||||
class nsTitledButtonFrame : public nsXULLeafFrame
|
class nsTitledButtonFrame : public nsLeafBoxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// nsIBox
|
||||||
|
NS_IMETHOD GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
|
||||||
|
NS_IMETHOD GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent);
|
||||||
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
NS_IMETHOD NeedsRecalc();
|
||||||
|
|
||||||
|
// our methods
|
||||||
enum CroppingStyle { CropNone, CropLeft, CropRight, CropCenter };
|
enum CroppingStyle { CropNone, CropLeft, CropRight, CropCenter };
|
||||||
|
|
||||||
friend nsresult NS_NewTitledButtonFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
friend nsresult NS_NewTitledButtonFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
// nsIBox frame interface
|
// nsIBox frame interface
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
|
||||||
|
|
||||||
NS_IMETHOD SetDebug(nsIPresContext* aPresContext, PRBool aDebug) { return NS_OK; }
|
|
||||||
|
|
||||||
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
@@ -67,11 +72,6 @@ public:
|
|||||||
virtual void UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttribute, PRBool& aResize, PRBool& aRedraw, PRBool& aUpdateAccessUnderline);
|
virtual void UpdateAttributes(nsIPresContext* aPresContext, nsIAtom* aAttribute, PRBool& aResize, PRBool& aRedraw, PRBool& aUpdateAccessUnderline);
|
||||||
virtual void UpdateImage(nsIPresContext* aPresContext, PRBool& aResize);
|
virtual void UpdateImage(nsIPresContext* aPresContext, PRBool& aResize);
|
||||||
|
|
||||||
// nsIHTMLReflow overrides
|
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
@@ -86,6 +86,8 @@ public:
|
|||||||
~nsTitledButtonFrame();
|
~nsTitledButtonFrame();
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
void CacheSizes(nsBoxLayoutState& aBoxLayoutState);
|
||||||
|
|
||||||
enum CheckState { eUnset, eOff, eOn, eMixed } ;
|
enum CheckState { eUnset, eOff, eOn, eMixed } ;
|
||||||
|
|
||||||
CheckState GetCurrentCheckState();
|
CheckState GetCurrentCheckState();
|
||||||
@@ -124,7 +126,7 @@ protected:
|
|||||||
PRUint32& aMaxFit,
|
PRUint32& aMaxFit,
|
||||||
nsIRenderingContext& aContext);
|
nsIRenderingContext& aContext);
|
||||||
|
|
||||||
nsTitledButtonFrame();
|
nsTitledButtonFrame(nsIPresShell* aShell);
|
||||||
|
|
||||||
virtual void CalculateTitleForWidth(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, nscoord aWidth);
|
virtual void CalculateTitleForWidth(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, nscoord aWidth);
|
||||||
|
|
||||||
@@ -170,6 +172,12 @@ private:
|
|||||||
PRInt32 mAccesskeyIndex;
|
PRInt32 mAccesskeyIndex;
|
||||||
nscoord mBeforeWidth, mAccessWidth, mAccessUnderlineSize, mAccessOffset;
|
nscoord mBeforeWidth, mAccessWidth, mAccessUnderlineSize, mAccessOffset;
|
||||||
|
|
||||||
|
nsSize mPrefSize;
|
||||||
|
nsSize mMinSize;
|
||||||
|
nscoord mAscent;
|
||||||
|
PRBool mNeedsRecalc;
|
||||||
|
|
||||||
|
|
||||||
// nsIPopUpMenu * mPopUpMenu;
|
// nsIPopUpMenu * mPopUpMenu;
|
||||||
// PRBool mMenuIsPoppedUp;
|
// PRBool mMenuIsPoppedUp;
|
||||||
|
|
||||||
|
|||||||
@@ -284,39 +284,6 @@ nsToolbarFrame :: Paint ( nsIPresContext* aPresContext,
|
|||||||
} // Paint
|
} // Paint
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
//
|
|
||||||
// GetFrameForPoint
|
|
||||||
//
|
|
||||||
// Override to process events in our own frame
|
|
||||||
//
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsToolbarFrame :: GetFrameForPoint ( nsIPresContext* aPresContext,
|
|
||||||
const nsPoint& aPoint,
|
|
||||||
nsFramePaintLayer aWhichLayer,
|
|
||||||
nsIFrame** aFrame)
|
|
||||||
{
|
|
||||||
nsresult retVal = nsHTMLContainerFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame);
|
|
||||||
|
|
||||||
if (! mRect.Contains(aPoint)) {
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returning NS_OK means that we tell the frame finding code that we have something
|
|
||||||
// and to stop looking elsewhere for a frame.
|
|
||||||
if ( aFrame && *aFrame == this )
|
|
||||||
retVal = NS_OK;
|
|
||||||
else if ( retVal != NS_OK ) {
|
|
||||||
*aFrame = this;
|
|
||||||
retVal = NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
|
|
||||||
} // GetFrameForPoint
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// HandleEvent
|
// HandleEvent
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -73,13 +73,6 @@ public:
|
|||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsFramePaintLayer aWhichLayer);
|
nsFramePaintLayer aWhichLayer);
|
||||||
|
|
||||||
// nsFrame overrides
|
|
||||||
#if 0
|
|
||||||
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
|
||||||
const nsPoint& aPoint, // Overridden to capture events
|
|
||||||
nsFramePaintLayer aWhichLayer,
|
|
||||||
nsIFrame** aFrame);
|
|
||||||
#endif
|
|
||||||
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
|
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
|
||||||
nsIContent* aChild,
|
nsIContent* aChild,
|
||||||
PRInt32 aNameSpaceID,
|
PRInt32 aNameSpaceID,
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
#include "nsIPresContext.h"
|
#include "nsIPresContext.h"
|
||||||
#include "nsIWidget.h"
|
#include "nsIWidget.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
|
#include "nsBoxLayoutState.h"
|
||||||
|
|
||||||
#include "nsIServiceManager.h"
|
#include "nsIServiceManager.h"
|
||||||
#include "nsWidgetsCID.h"
|
#include "nsWidgetsCID.h"
|
||||||
@@ -103,7 +104,7 @@ nsToolboxFrame :: nsToolboxFrame (nsIPresShell* aShell):nsBoxFrame(aShell)
|
|||||||
mGrippyHilighted(kNoGrippyHilighted),
|
mGrippyHilighted(kNoGrippyHilighted),
|
||||||
kCollapsedAtom(dont_AddRef( NS_NewAtom("collapsed"))),
|
kCollapsedAtom(dont_AddRef( NS_NewAtom("collapsed"))),
|
||||||
kHiddenAtom(dont_AddRef( NS_NewAtom("hidden"))),
|
kHiddenAtom(dont_AddRef( NS_NewAtom("hidden"))),
|
||||||
mDragListenerDelegate(nsnull)
|
mDragListenerDelegate(nsnull), mNeedsCalc(PR_TRUE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,6 +204,8 @@ nsToolboxFrame::Init(nsIPresContext* aPresContext,
|
|||||||
nsIStyleContext* aContext,
|
nsIStyleContext* aContext,
|
||||||
nsIFrame* aPrevInFlow)
|
nsIFrame* aPrevInFlow)
|
||||||
{
|
{
|
||||||
|
mPresContext = aPresContext;
|
||||||
|
|
||||||
nsresult rv = nsBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
nsresult rv = nsBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
||||||
UpdateStyles(aPresContext);
|
UpdateStyles(aPresContext);
|
||||||
|
|
||||||
@@ -313,39 +316,67 @@ nsToolboxFrame :: DrawGrippy ( nsIPresContext* aPresContext, nsIRenderingContex
|
|||||||
|
|
||||||
} // DrawGrippy
|
} // DrawGrippy
|
||||||
|
|
||||||
|
/*
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsToolboxFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)
|
nsToolboxFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)
|
||||||
{
|
{
|
||||||
CalculateGrippies(aPresContext);
|
CalculateGrippies(aPresContext);
|
||||||
return nsBoxFrame::GetBoxInfo(aPresContext, aReflowState, aSize);
|
return nsBoxFrame::GetBoxInfo(aPresContext, aReflowState, aSize);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsToolboxFrame :: Reflow(nsIPresContext* aPresContext,
|
nsToolboxFrame::NeedsRecalc()
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
{
|
||||||
nsresult errCode = nsBoxFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
nsresult rv = nsBoxFrame::NeedsRecalc();
|
||||||
errCode = ReflowGrippies(aPresContext, aDesiredSize, aReflowState, aStatus);
|
mNeedsCalc = PR_TRUE;
|
||||||
return errCode;
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
} // Reflow
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsToolboxFrame::GetInset(nsMargin& aMargin)
|
||||||
|
{
|
||||||
|
if (mNeedsCalc)
|
||||||
|
{
|
||||||
|
CalculateGrippies(mPresContext);
|
||||||
|
mNeedsCalc = PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsBoxFrame::GetInset(aMargin);
|
||||||
|
aMargin += mInset;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsToolboxFrame::Layout(nsBoxLayoutState& aState)
|
||||||
|
{
|
||||||
|
// lay us out
|
||||||
|
nsresult rv = nsBoxFrame::Layout(aState);
|
||||||
|
LayoutGrippies(aState);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
// After we have been flowed this should be flowed to place the grippies at there
|
// After we have been flowed this should be flowed to place the grippies at there
|
||||||
// physical locations.
|
// physical locations.
|
||||||
nsresult
|
nsresult
|
||||||
nsToolboxFrame::ReflowGrippies(nsIPresContext* aPresContext,
|
nsToolboxFrame::LayoutGrippies(nsBoxLayoutState& aState)
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
{
|
||||||
// get the rect we can place the grippies in. This is inside our borders and debug rect.
|
// get the rect we can place the grippies in. This is inside our borders and debug rect.
|
||||||
nsRect innerRect(0,0,0,0);
|
nsRect ourRect(0,0,0,0);
|
||||||
GetInnerRect(innerRect);
|
GetRect(ourRect);
|
||||||
|
ourRect.x = 0;
|
||||||
|
ourRect.y = 0;
|
||||||
|
|
||||||
|
nsRect innerRect(ourRect);
|
||||||
|
nsMargin border(0,0,0,0);
|
||||||
|
GetBorderAndPadding(border);
|
||||||
|
innerRect.Deflate(border);
|
||||||
|
|
||||||
|
nsIPresContext* presContext = aState.GetPresContext();
|
||||||
float p2t;
|
float p2t;
|
||||||
aPresContext->GetScaledPixelsToTwips(&p2t);
|
presContext->GetScaledPixelsToTwips(&p2t);
|
||||||
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
||||||
nscoord grippyWidth = kGrippyWidthInPixels * onePixel; // remember to leave room for the grippy on the right
|
nscoord grippyWidth = kGrippyWidthInPixels * onePixel; // remember to leave room for the grippy on the right
|
||||||
nscoord collapsedGrippyHeight = kCollapsedGrippyHeightInPixels * onePixel;
|
nscoord collapsedGrippyHeight = kCollapsedGrippyHeightInPixels * onePixel;
|
||||||
@@ -356,14 +387,19 @@ nsToolboxFrame::ReflowGrippies(nsIPresContext* aPresContext,
|
|||||||
// iterate over all visible toolbar frames, moving the associated grippy
|
// iterate over all visible toolbar frames, moving the associated grippy
|
||||||
// next to the toolbar
|
// next to the toolbar
|
||||||
mNumToolbars = 0;
|
mNumToolbars = 0;
|
||||||
nsIFrame* childFrame = mFrames.FirstChild();
|
nsIBox* childBox;
|
||||||
while ( childFrame ) {
|
GetChildBox(&childBox);
|
||||||
|
|
||||||
|
while ( childBox ) {
|
||||||
// get the childs rect and figure out the grippy size
|
// get the childs rect and figure out the grippy size
|
||||||
|
nsIFrame* childFrame = nsnull;
|
||||||
|
childBox->GetFrame(&childFrame);
|
||||||
|
|
||||||
nsCOMPtr<nsIContent> childContent;
|
nsCOMPtr<nsIContent> childContent;
|
||||||
childFrame->GetContent(getter_AddRefs(childContent));
|
childFrame->GetContent(getter_AddRefs(childContent));
|
||||||
|
|
||||||
nsRect grippyRect;
|
nsRect grippyRect;
|
||||||
childFrame->GetRect(grippyRect);
|
childBox->GetBounds(grippyRect);
|
||||||
|
|
||||||
if ( isHorz ) {
|
if ( isHorz ) {
|
||||||
grippyRect.y = innerRect.y;
|
grippyRect.y = innerRect.y;
|
||||||
@@ -380,7 +416,7 @@ nsToolboxFrame::ReflowGrippies(nsIPresContext* aPresContext,
|
|||||||
// Set the location of the grippy to the left...
|
// Set the location of the grippy to the left...
|
||||||
grippyInfo->SetBounds(grippyRect);
|
grippyInfo->SetBounds(grippyRect);
|
||||||
|
|
||||||
errCode = childFrame->GetNextSibling(&childFrame);
|
errCode = childBox->GetNextBox(&childBox);
|
||||||
NS_ASSERTION(errCode == NS_OK, "failed to get next child");
|
NS_ASSERTION(errCode == NS_OK, "failed to get next child");
|
||||||
mNumToolbars++;
|
mNumToolbars++;
|
||||||
}
|
}
|
||||||
@@ -393,9 +429,9 @@ nsToolboxFrame::ReflowGrippies(nsIPresContext* aPresContext,
|
|||||||
// horzontal toolbox our height is our width. Thats why we just use
|
// horzontal toolbox our height is our width. Thats why we just use
|
||||||
// height here on both x and y coords.
|
// height here on both x and y coords.
|
||||||
if ( isHorz )
|
if ( isHorz )
|
||||||
currGrippy->mBoundingRect.x = aDesiredSize.width - collapsedGrippyHeight;
|
currGrippy->mBoundingRect.x = ourRect.width - collapsedGrippyHeight;
|
||||||
else
|
else
|
||||||
currGrippy->mBoundingRect.y = aDesiredSize.height - collapsedGrippyHeight;
|
currGrippy->mBoundingRect.y = ourRect.height - collapsedGrippyHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,6 +443,7 @@ nsToolboxFrame::ReflowGrippies(nsIPresContext* aPresContext,
|
|||||||
void
|
void
|
||||||
nsToolboxFrame::CalculateGrippies(nsIPresContext* aPresContext)
|
nsToolboxFrame::CalculateGrippies(nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
|
|
||||||
// compute amount (in twips) each toolbar will be offset from the right because of
|
// compute amount (in twips) each toolbar will be offset from the right because of
|
||||||
// the grippy
|
// the grippy
|
||||||
float p2t;
|
float p2t;
|
||||||
@@ -562,52 +599,6 @@ nsToolboxFrame :: ClearGrippyList ( nsVoidArray & inList )
|
|||||||
} // ClearGrippyList
|
} // ClearGrippyList
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// GetInset
|
|
||||||
//
|
|
||||||
// Our Reflow() method computes a margin for the grippies and for collased grippies (if
|
|
||||||
// any). Return this pre-computed margin when asked by the box.
|
|
||||||
//
|
|
||||||
void
|
|
||||||
nsToolboxFrame::GetInset(nsMargin& margin)
|
|
||||||
{
|
|
||||||
nsBoxFrame::GetInset(margin);
|
|
||||||
margin += mInset;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
//
|
|
||||||
// GetFrameForPoint
|
|
||||||
//
|
|
||||||
// Override to process events in our own frame
|
|
||||||
//
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsToolboxFrame :: GetFrameForPoint(nsIPresContext* aPresContext,
|
|
||||||
const nsPoint& aPoint,
|
|
||||||
nsFramePaintLayer aWhichLayer,
|
|
||||||
nsIFrame** aFrame)
|
|
||||||
{
|
|
||||||
nsresult retVal = nsHTMLContainerFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame);
|
|
||||||
|
|
||||||
if (! mRect.Contains(aPoint)) {
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returning NS_OK means that we tell the frame finding code that we have something
|
|
||||||
// and to stop looking elsewhere for a frame.
|
|
||||||
if ( aFrame && *aFrame == this )
|
|
||||||
retVal = NS_OK;
|
|
||||||
else if ( retVal != NS_OK ) {
|
|
||||||
*aFrame = this;
|
|
||||||
retVal = NS_OK;
|
|
||||||
}
|
|
||||||
return retVal;
|
|
||||||
|
|
||||||
} // GetFrameForPoint
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// HandleEvent
|
// HandleEvent
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -58,14 +58,12 @@ class nsToolboxFrame : public nsBoxFrame
|
|||||||
public:
|
public:
|
||||||
friend nsresult NS_NewToolboxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
friend nsresult NS_NewToolboxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
|
||||||
|
|
||||||
// nsIHTMLReflow overrides
|
// nsIBox
|
||||||
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
NS_IMETHOD Layout(nsBoxLayoutState& aBoxLayoutState);
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
NS_IMETHOD GetInset(nsMargin& aInset);
|
||||||
const nsHTMLReflowState& aReflowState,
|
NS_IMETHOD NeedsRecalc();
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
NS_IMETHOD GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize);
|
|
||||||
|
|
||||||
|
// nsIFrame
|
||||||
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
@@ -85,14 +83,6 @@ public:
|
|||||||
NS_IMETHOD SetAdditionalStyleContext(PRInt32 aIndex,
|
NS_IMETHOD SetAdditionalStyleContext(PRInt32 aIndex,
|
||||||
nsIStyleContext* aStyleContext);
|
nsIStyleContext* aStyleContext);
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Overridden to capture events
|
|
||||||
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
|
||||||
const nsPoint& aPoint,
|
|
||||||
nsFramePaintLayer aWhichLayer,
|
|
||||||
nsIFrame** aFrame);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*BEGIN implementations of dragevent handler interface*/
|
/*BEGIN implementations of dragevent handler interface*/
|
||||||
virtual nsresult HandleEvent(nsIDOMEvent* aEvent);
|
virtual nsresult HandleEvent(nsIDOMEvent* aEvent);
|
||||||
virtual nsresult DragEnter(nsIDOMEvent* aDragEvent);
|
virtual nsresult DragEnter(nsIDOMEvent* aDragEvent);
|
||||||
@@ -135,10 +125,7 @@ protected:
|
|||||||
|
|
||||||
virtual void UpdateStyles(nsIPresContext* aPresContext);
|
virtual void UpdateStyles(nsIPresContext* aPresContext);
|
||||||
virtual void CalculateGrippies(nsIPresContext* aPresContext);
|
virtual void CalculateGrippies(nsIPresContext* aPresContext);
|
||||||
virtual nsresult ReflowGrippies(nsIPresContext* aPresContext,
|
virtual nsresult LayoutGrippies(nsBoxLayoutState& aBoxLayoutState);
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus);
|
|
||||||
|
|
||||||
|
|
||||||
void RefreshStyleContext(nsIPresContext* aPresContext,
|
void RefreshStyleContext(nsIPresContext* aPresContext,
|
||||||
@@ -167,7 +154,6 @@ protected:
|
|||||||
nsCOMPtr<nsIStyleContext> mGrippyRolloverStyle;
|
nsCOMPtr<nsIStyleContext> mGrippyRolloverStyle;
|
||||||
|
|
||||||
nsMargin mInset;
|
nsMargin mInset;
|
||||||
virtual void GetInset(nsMargin& margin);
|
|
||||||
|
|
||||||
unsigned long mSumOfToolbarHeights;
|
unsigned long mSumOfToolbarHeights;
|
||||||
nsVoidArray mGrippies; // list of all active grippies
|
nsVoidArray mGrippies; // list of all active grippies
|
||||||
@@ -186,6 +172,7 @@ protected:
|
|||||||
// nsISupports interface
|
// nsISupports interface
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
|
||||||
// nsIDOMEventListener interface
|
// nsIDOMEventListener interface
|
||||||
virtual nsresult HandleEvent(nsIDOMEvent* aEvent)
|
virtual nsresult HandleEvent(nsIDOMEvent* aEvent)
|
||||||
{
|
{
|
||||||
@@ -235,6 +222,8 @@ protected:
|
|||||||
nsToolboxFrame ( const nsToolboxFrame& aFrame ) ; // DO NOT IMPLEMENT
|
nsToolboxFrame ( const nsToolboxFrame& aFrame ) ; // DO NOT IMPLEMENT
|
||||||
nsToolboxFrame& operator= ( const nsToolboxFrame& aFrame ) ; // DO NOT IMPLEMENT
|
nsToolboxFrame& operator= ( const nsToolboxFrame& aFrame ) ; // DO NOT IMPLEMENT
|
||||||
|
|
||||||
|
PRBool mNeedsCalc;
|
||||||
|
nsIPresContext* mPresContext;
|
||||||
}; // class nsToolboxFrame
|
}; // class nsToolboxFrame
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,211 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Netscape Public
|
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
|
||||||
* except in compliance with the License. You may obtain a copy of
|
|
||||||
* the License at http://www.mozilla.org/NPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS
|
|
||||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
||||||
* implied. See the License for the specific language governing
|
|
||||||
* rights and limitations under the License.
|
|
||||||
*
|
|
||||||
* The Original Code is Mozilla Communicator client code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is Netscape Communications
|
|
||||||
* Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
||||||
* Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
*/
|
|
||||||
|
|
||||||
//
|
|
||||||
// Eric Vaughan
|
|
||||||
// Netscape Communications
|
|
||||||
//
|
|
||||||
// See documentation in associated header file
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "nsXULLeafFrame.h"
|
|
||||||
#include "nsCOMPtr.h"
|
|
||||||
#include "nsIDeviceContext.h"
|
|
||||||
#include "nsIFontMetrics.h"
|
|
||||||
#include "nsHTMLAtoms.h"
|
|
||||||
#include "nsXULAtoms.h"
|
|
||||||
#include "nsIPresContext.h"
|
|
||||||
#include "nsIRenderingContext.h"
|
|
||||||
#include "nsIStyleContext.h"
|
|
||||||
#include "nsIContent.h"
|
|
||||||
#include "nsINameSpaceManager.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// NS_NewToolbarFrame
|
|
||||||
//
|
|
||||||
// Creates a new Toolbar frame and returns it in |aNewFrame|
|
|
||||||
//
|
|
||||||
nsresult
|
|
||||||
NS_NewXULLeafFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
|
|
||||||
{
|
|
||||||
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
|
||||||
if (nsnull == aNewFrame) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
nsXULLeafFrame* it = new (aPresShell) nsXULLeafFrame;
|
|
||||||
if (nsnull == it)
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
// it->SetFlags(aFlags);
|
|
||||||
*aNewFrame = it;
|
|
||||||
return NS_OK;
|
|
||||||
|
|
||||||
} // NS_NewTextFrame
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXULLeafFrame::Reflow(nsIPresContext* aPresContext,
|
|
||||||
nsHTMLReflowMetrics& aMetrics,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsReflowStatus& aStatus)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (eReflowReason_Incremental == aReflowState.reason) {
|
|
||||||
nsIFrame* targetFrame;
|
|
||||||
|
|
||||||
// See if it's targeted at us
|
|
||||||
aReflowState.reflowCommand->GetTarget(targetFrame);
|
|
||||||
if (this == targetFrame) {
|
|
||||||
Invalidate(aPresContext, nsRect(0,0,mRect.width,mRect.height), PR_FALSE);
|
|
||||||
}
|
|
||||||
} else if (eReflowReason_Dirty == aReflowState.reason) {
|
|
||||||
Invalidate(aPresContext, nsRect(0,0,mRect.width,mRect.height), PR_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
nsresult result = nsLeafFrame::Reflow(aPresContext, aMetrics, aReflowState, aStatus);
|
|
||||||
|
|
||||||
if (aReflowState.mComputedWidth != NS_INTRINSICSIZE)
|
|
||||||
NS_ASSERTION(aMetrics.width == aReflowState.mComputedWidth + aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right,
|
|
||||||
"Text width is wrong!!!");
|
|
||||||
|
|
||||||
if (aReflowState.mComputedHeight != NS_INTRINSICSIZE)
|
|
||||||
NS_ASSERTION(aMetrics.height == aReflowState.mComputedHeight + aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom,
|
|
||||||
"Text height is wrong!!!");
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nsXULLeafFrame::GetDesiredSize(nsIPresContext* aPresContext,
|
|
||||||
const nsHTMLReflowState& aReflowState,
|
|
||||||
nsHTMLReflowMetrics& aDesiredSize)
|
|
||||||
{
|
|
||||||
// get our info object.
|
|
||||||
nsBoxInfo info;
|
|
||||||
info.Clear();
|
|
||||||
|
|
||||||
GetBoxInfo(aPresContext, aReflowState, info);
|
|
||||||
|
|
||||||
// size is our preferred unless calculated.
|
|
||||||
aDesiredSize.width = info.prefSize.width;
|
|
||||||
aDesiredSize.height = info.prefSize.height;
|
|
||||||
|
|
||||||
// if either the width or the height was not computed use our intrinsic size
|
|
||||||
if (aReflowState.mComputedWidth != NS_INTRINSICSIZE)
|
|
||||||
aDesiredSize.width = aReflowState.mComputedWidth;
|
|
||||||
|
|
||||||
if (aReflowState.mComputedHeight != NS_INTRINSICSIZE) {
|
|
||||||
aDesiredSize.height = aReflowState.mComputedHeight;
|
|
||||||
nscoord descent = info.prefSize.height - info.ascent;
|
|
||||||
aDesiredSize.ascent = aDesiredSize.height - descent;
|
|
||||||
if (aDesiredSize.ascent < 0)
|
|
||||||
aDesiredSize.ascent = 0;
|
|
||||||
} else {
|
|
||||||
aDesiredSize.ascent = info.ascent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXULLeafFrame::InvalidateCache(nsIFrame* aChild)
|
|
||||||
{
|
|
||||||
// we don't cache any information
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ok return our dimensions
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXULLeafFrame::GetBoxInfo(nsIPresContext* aPresContext, const nsHTMLReflowState& aReflowState, nsBoxInfo& aSize)
|
|
||||||
{
|
|
||||||
aSize.prefSize.width = 0;
|
|
||||||
aSize.prefSize.height = 0;
|
|
||||||
aSize.minSize.width = 0;
|
|
||||||
aSize.minSize.height = 0;
|
|
||||||
aSize.maxSize.width = NS_INTRINSICSIZE;
|
|
||||||
aSize.maxSize.height = NS_INTRINSICSIZE;
|
|
||||||
aSize.ascent = 0;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We can be a nsIBox
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXULLeafFrame::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|
||||||
{
|
|
||||||
if (NULL == aInstancePtr) {
|
|
||||||
return NS_ERROR_NULL_POINTER;
|
|
||||||
}
|
|
||||||
|
|
||||||
*aInstancePtr = NULL;
|
|
||||||
|
|
||||||
if (aIID.Equals(NS_GET_IID(nsIBox))) {
|
|
||||||
*aInstancePtr = (void*)(nsIBox*) this;
|
|
||||||
NS_ADDREF_THIS();
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nsLeafFrame::QueryInterface(aIID, aInstancePtr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We are a frame and we do not maintain a ref count
|
|
||||||
*/
|
|
||||||
NS_IMETHODIMP_(nsrefcnt)
|
|
||||||
nsXULLeafFrame::AddRef(void)
|
|
||||||
{
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP_(nsrefcnt)
|
|
||||||
nsXULLeafFrame::Release(void)
|
|
||||||
{
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXULLeafFrame::GetFrameName(nsString& aResult) const
|
|
||||||
{
|
|
||||||
aResult = "Leaf";
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
|
||||||
nsXULLeafFrame::ContentChanged(nsIPresContext* aPresContext,
|
|
||||||
nsIContent* aChild,
|
|
||||||
nsISupports* aSubContent)
|
|
||||||
{
|
|
||||||
nsCOMPtr<nsIPresShell> shell;
|
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
|
||||||
mState |= NS_FRAME_IS_DIRTY;
|
|
||||||
return mParent->ReflowDirtyChild(shell, this);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -97,6 +97,7 @@ XUL_ATOM(crop, "crop")
|
|||||||
|
|
||||||
XUL_ATOM(mode, "mode")
|
XUL_ATOM(mode, "mode")
|
||||||
XUL_ATOM(box, "box")
|
XUL_ATOM(box, "box")
|
||||||
|
XUL_ATOM(mousethrough, "mousethrough")
|
||||||
XUL_ATOM(flex, "flex")
|
XUL_ATOM(flex, "flex")
|
||||||
XUL_ATOM(spring, "spring")
|
XUL_ATOM(spring, "spring")
|
||||||
XUL_ATOM(orient, "orient")
|
XUL_ATOM(orient, "orient")
|
||||||
@@ -130,6 +131,13 @@ XUL_ATOM(resizeafter, "resizeafter")
|
|||||||
XUL_ATOM(state, "state")
|
XUL_ATOM(state, "state")
|
||||||
XUL_ATOM(debug, "debug")
|
XUL_ATOM(debug, "debug")
|
||||||
|
|
||||||
|
// grid
|
||||||
|
XUL_ATOM(grid, "grid")
|
||||||
|
XUL_ATOM(rows, "rows")
|
||||||
|
XUL_ATOM(columns, "columns")
|
||||||
|
XUL_ATOM(row, "row")
|
||||||
|
XUL_ATOM(column, "column")
|
||||||
|
|
||||||
// toolbar & toolbar d&d atoms
|
// toolbar & toolbar d&d atoms
|
||||||
XUL_ATOM(ddDropLocation, "dd-droplocation")
|
XUL_ATOM(ddDropLocation, "dd-droplocation")
|
||||||
XUL_ATOM(ddDropLocationCoord, "dd-droplocationcoord")
|
XUL_ATOM(ddDropLocationCoord, "dd-droplocationcoord")
|
||||||
|
|||||||
@@ -54,9 +54,7 @@
|
|||||||
|
|
||||||
<!-- instructions -->
|
<!-- instructions -->
|
||||||
<deck id="prattle">
|
<deck id="prattle">
|
||||||
<box orient="vertical" id="selection">
|
<html id="intro" flex="1">&introgeneral.label;</html>
|
||||||
<html>&introgeneral.label;</html>
|
|
||||||
</box>
|
|
||||||
<box orient="vertical" id="manager">
|
<box orient="vertical" id="manager">
|
||||||
<html class="label" style="width: 200px;">&pmTextA.label;</html>
|
<html class="label" style="width: 200px;">&pmTextA.label;</html>
|
||||||
<spring flex="1"/>
|
<spring flex="1"/>
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ box[type="largeheader"] > toolbar > .circle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* profile selection dialog */
|
/* profile selection dialog */
|
||||||
deck#prattle {
|
html#intro {
|
||||||
max-width: 17em;
|
width: 17em;
|
||||||
}
|
}
|
||||||
|
|
||||||
box#managebuttons > button {
|
box#managebuttons > button {
|
||||||
|
|||||||
@@ -24,8 +24,6 @@
|
|||||||
splitter#sidebar-splitter {
|
splitter#sidebar-splitter {
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
min-width: 8px;
|
|
||||||
max-width: 8px;
|
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
border: none;
|
border: none;
|
||||||
background-color: #003366;
|
background-color: #003366;
|
||||||
@@ -68,7 +66,6 @@ box#sidebar-box {
|
|||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
width: 162px;
|
width: 162px;
|
||||||
min-height: 1px;
|
min-height: 1px;
|
||||||
min-width: 1px;
|
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
border: none;
|
border: none;
|
||||||
border-bottom: 8px solid #003366;
|
border-bottom: 8px solid #003366;
|
||||||
@@ -151,3 +148,7 @@ box#sidebar-panels-bottom > box.texttab + box.texttab {
|
|||||||
*[hidden="true"] {
|
*[hidden="true"] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
box#title-box {
|
||||||
|
min-width: 10px;
|
||||||
|
}
|
||||||
|
|||||||
@@ -535,28 +535,51 @@ grippy:hover:active{
|
|||||||
background-color: #99CCFF;
|
background-color: #99CCFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
box[align="vertical"]>splitter grippy {
|
box[orient="vertical"]>splitter grippy {
|
||||||
/* a horizontal splitter */
|
/* a horizontal splitter */
|
||||||
min-width: 60px;
|
width: 60px;
|
||||||
max-height: 4px;
|
height:8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
box[align="horizontal"]>splitter grippy {
|
box>splitter grippy {
|
||||||
/* a vertical splitter */
|
/* a vertical splitter */
|
||||||
max-width: 4px;
|
width: 8px;
|
||||||
min-height: 60px;
|
height: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
window[orient="vertical"]>splitter grippy {
|
||||||
|
/* a horizontal splitter */
|
||||||
|
width: 8px;
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
window>splitter grippy {
|
||||||
|
/* a vertical splitter */
|
||||||
|
width: 8px;
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
box[orient="vertical"]>splitter {
|
||||||
|
/* a vertical splitter */
|
||||||
|
cursor: n-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
window[orient="vertical"]>splitter {
|
||||||
|
/* a vertical splitter */
|
||||||
|
cursor: n-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for backwards compatibility */
|
||||||
|
box[align="vertical"]>splitter grippy {
|
||||||
|
/* a horizontal splitter */
|
||||||
|
width: 60px;
|
||||||
|
height: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
window[align="vertical"]>splitter grippy {
|
window[align="vertical"]>splitter grippy {
|
||||||
/* a horizontal splitter */
|
/* a horizontal splitter */
|
||||||
min-width: 60px;
|
width: 60px;
|
||||||
max-height: 4px;
|
height: 8px;
|
||||||
}
|
|
||||||
|
|
||||||
window[align="horizontal"]>splitter grippy {
|
|
||||||
/* a vertical splitter */
|
|
||||||
max-width: 4px;
|
|
||||||
min-height: 60px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
box[align="vertical"]>splitter {
|
box[align="vertical"]>splitter {
|
||||||
@@ -596,7 +619,7 @@ splitter.gray-horizontal-splitter grippy:active {
|
|||||||
|
|
||||||
splitter.gray-horizontal-splitter #begincap {
|
splitter.gray-horizontal-splitter #begincap {
|
||||||
min-width: 8px;
|
min-width: 8px;
|
||||||
max-width: 8px;
|
width: 8px;
|
||||||
background-image: url("chrome://global/skin/gray-bottomleft.gif");
|
background-image: url("chrome://global/skin/gray-bottomleft.gif");
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: 0% 100%;
|
background-position: 0% 100%;
|
||||||
@@ -604,10 +627,34 @@ splitter.gray-horizontal-splitter #begincap {
|
|||||||
|
|
||||||
splitter.gray-horizontal-splitter #endcap {
|
splitter.gray-horizontal-splitter #endcap {
|
||||||
min-width: 8px;
|
min-width: 8px;
|
||||||
max-width: 8px;
|
width: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****** Progress Meter ********/
|
||||||
|
|
||||||
|
progressmeter[align="horizontal"] {
|
||||||
|
height: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
box.progress-bar {
|
||||||
|
background-color : #9999cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
box.progress-remainder {
|
||||||
|
background-color: #999999;
|
||||||
|
}
|
||||||
|
|
||||||
|
progressmeter[mode="undetermined"] > .internal-box
|
||||||
|
{
|
||||||
|
background-image: url(chrome://global/skin/progressmeter-busy.gif);
|
||||||
|
}
|
||||||
|
|
||||||
|
progressmeter[mode="undetermined"] > .internal-box > stack > progressbar
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
/********* Box ********/
|
/********* Box ********/
|
||||||
|
|
||||||
box
|
box
|
||||||
@@ -660,6 +707,7 @@ menubar {
|
|||||||
|
|
||||||
menu {
|
menu {
|
||||||
color: black;
|
color: black;
|
||||||
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
menu[disabled="true"] {
|
menu[disabled="true"] {
|
||||||
@@ -668,6 +716,7 @@ menu[disabled="true"] {
|
|||||||
|
|
||||||
menuitem {
|
menuitem {
|
||||||
color: black;
|
color: black;
|
||||||
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
menuitem[disabled="true"] {
|
menuitem[disabled="true"] {
|
||||||
@@ -808,7 +857,6 @@ popup > menuitem[menuactive="true"][disabled="true"] {
|
|||||||
.menu-right {
|
.menu-right {
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
border: 0px;
|
border: 0px;
|
||||||
width: 10px;
|
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
@@ -819,7 +867,6 @@ popup > menuitem[menuactive="true"][disabled="true"] {
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
border: 0px;
|
border: 0px;
|
||||||
width: 13px;
|
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
@@ -888,6 +935,80 @@ menu[menuactive="true"] > .menu-right {
|
|||||||
list-style-image: url("chrome://global/skin/menu-arrow-hover.gif");
|
list-style-image: url("chrome://global/skin/menu-arrow-hover.gif");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
menulist, menubutton {
|
||||||
|
padding: 1px 0px 1px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
menulist > .menu-text,
|
||||||
|
menubutton > .menu-text {
|
||||||
|
padding-left: 4px;
|
||||||
|
padding-right: 4px;
|
||||||
|
border: 1px inset #CCCCCC;
|
||||||
|
}
|
||||||
|
|
||||||
|
menubutton > .menu-button {
|
||||||
|
border: 1px outset #CCCCCC;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
menubutton > .menu-button:active {
|
||||||
|
border: 1px inset #CCCCCC;
|
||||||
|
padding: 3px 1px 1px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
menubutton > .menu-dropmarker,
|
||||||
|
menulist > .menu-dropmarker {
|
||||||
|
border: 1px outset #CCCCCC;
|
||||||
|
list-style-image: url("chrome://global/skin/scroll-down.gif");
|
||||||
|
padding: 0px 2px 0px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
menubutton[open="true"] > .menu-dropmarker,
|
||||||
|
menulist[open="true"] > .menu-dropmarker {
|
||||||
|
border: 1px inset #CCCCCC;
|
||||||
|
padding: 1px 1px -1px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
menubutton menupopup, menulist menupopup {
|
||||||
|
border: 1px outset #CCCCCC;
|
||||||
|
}
|
||||||
|
|
||||||
|
menulist[editable="true"] {
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
menulist[editable="true"] > .menu-text {
|
||||||
|
border-left: none;
|
||||||
|
border-top: 1px inset #CCCCCC;
|
||||||
|
border-right: 1px inset #CCCCCC;
|
||||||
|
border-bottom: 1px inset #CCCCCC;
|
||||||
|
margin: 0px 2px 0px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
menulist[editable="true"] > .menu-dropmarker {
|
||||||
|
border: 1px outset #CCCCCC;
|
||||||
|
}
|
||||||
|
|
||||||
|
menulist[editable="true"][open="true"] > .menu-dropmarker {
|
||||||
|
border: 1px inset #CCCCCC;
|
||||||
|
}
|
||||||
|
|
||||||
|
menulist[editable="true"] > .menu-icon {
|
||||||
|
list-style-image: url("chrome://bookmarks/skin/bookmark-item.gif");
|
||||||
|
background-color: white;
|
||||||
|
padding: 1px;
|
||||||
|
border-left: 1px inset #CCCCCC;
|
||||||
|
border-top: 1px inset #CCCCCC;
|
||||||
|
border-right: none;
|
||||||
|
border-bottom: 1px inset #CCCCCC;
|
||||||
|
}
|
||||||
|
|
||||||
|
menulist menupopup > menuseparator {
|
||||||
|
border-bottom: 2px groove #CCCCCC;
|
||||||
|
}
|
||||||
|
|
||||||
/******** Rules for menus on the standard toolbars ***************/
|
/******** Rules for menus on the standard toolbars ***************/
|
||||||
|
|
||||||
menu.standard {
|
menu.standard {
|
||||||
|
|||||||
@@ -44,8 +44,6 @@ template {
|
|||||||
|
|
||||||
window {
|
window {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************
|
/**********************************
|
||||||
|
|||||||
@@ -48,9 +48,9 @@
|
|||||||
</binding>
|
</binding>
|
||||||
|
|
||||||
<binding name="menus">
|
<binding name="menus">
|
||||||
<content excludes="template,observes,menupopup">
|
<content autostretch="never" excludes="template,observes,menupopup">
|
||||||
<xul:image class="menu-left"/>
|
<xul:image class="menu-left"/>
|
||||||
<xul:titledbutton class="menu-text" flex="1" align="left" inherits="value,accesskey,crop" crop="right"/>
|
<xul:text class="menu-text" flex="1" align="left" inherits="value,accesskey,crop" crop="right"/>
|
||||||
<xul:text class="menu-accel" inherits="acceltext:value"/>
|
<xul:text class="menu-accel" inherits="acceltext:value"/>
|
||||||
<xul:image class="menu-right"/>
|
<xul:image class="menu-right"/>
|
||||||
</content>
|
</content>
|
||||||
|
|||||||
Reference in New Issue
Block a user