diff --git a/layout/html/base/src/nsScrollFrame.cpp b/layout/html/base/src/nsScrollFrame.cpp index a6831eb6fc7..16ce7a0c509 100644 --- a/layout/html/base/src/nsScrollFrame.cpp +++ b/layout/html/base/src/nsScrollFrame.cpp @@ -34,6 +34,7 @@ #include "nsScrollFrame.h" #include "nsLayoutAtoms.h" #include "nsIWebShell.h" +#include "nsIBox.h" static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID); @@ -577,7 +578,16 @@ nsScrollFrame::Reflow(nsIPresContext& aPresContext, // Reflow the child and get its desired size. Let it be as high as it // wants PRBool unconstrainedWidth = (NS_UNCONSTRAINEDSIZE == scrollAreaSize.width); - nsSize kidReflowSize(scrollAreaSize.width, NS_UNCONSTRAINEDSIZE); + + nscoord theHeight; + nsIBox* box; + nsresult result = kidFrame->QueryInterface(kIBoxIID, (void**)&box); + if (NS_SUCCEEDED(result)) + theHeight = scrollAreaSize.height; + else + theHeight = NS_INTRINSICSIZE; + + nsSize kidReflowSize(scrollAreaSize.width, theHeight); nsHTMLReflowState kidReflowState(aPresContext, aReflowState, kidFrame, kidReflowSize); nsHTMLReflowMetrics kidDesiredSize(aDesiredSize.maxElementSize); @@ -589,7 +599,7 @@ nsScrollFrame::Reflow(nsIPresContext& aPresContext, aReflowState.mComputedPadding.left - aReflowState.mComputedPadding.right; } - kidReflowState.mComputedHeight = NS_AUTOHEIGHT; + kidReflowState.mComputedHeight = theHeight; ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState, aStatus); diff --git a/layout/xul/base/src/nsBoxFrame.cpp b/layout/xul/base/src/nsBoxFrame.cpp index 47fba4d2c26..7e1df99ab59 100644 --- a/layout/xul/base/src/nsBoxFrame.cpp +++ b/layout/xul/base/src/nsBoxFrame.cpp @@ -55,6 +55,7 @@ public: void DrawVerticalSpring( nsIPresContext& aPresContext, nsIRenderingContext& aRenderingContext, nscoord x, nscoord y, nscoord size, nscoord springSize); void DrawKnob( nsIPresContext& aPresContext, nsIRenderingContext& aRenderingContext, nscoord x, nscoord y, nscoord springSize); void AddInDebugInset( nsIPresContext& aPresContext, PRBool aIsHorizontal, nsMargin& inset); + void CollapseChild(nsIFrame* frame); // XXX for the moment we can only handle 100 children. // Should use a dynamic array. @@ -191,6 +192,20 @@ nsBoxFrame::GetRedefinedMinPrefMax(nsIFrame* aFrame, nsCalculatedBoxInfo& aSize) // convert to a percent. aSize.flex = value.ToFloat(&error)/float(100.0); } + + if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttribute(kNameSpaceID_None, nsHTMLAtoms::width, value)) + { + value.Trim("%"); + // convert to a percent. + aSize.prefSize.width = value.ToInteger(&error); + } + + if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttribute(kNameSpaceID_None, nsHTMLAtoms::height, value)) + { + value.Trim("%"); + // convert to a percent. + aSize.prefSize.height = value.ToInteger(&error); + } } /** @@ -705,29 +720,38 @@ nsBoxFrame::ChildResized(nsHTMLReflowMetrics& aDesiredSize, nsRect& aRect, nsCal } -/* void -nsBoxFrameImpl::CollapseChildren(nsIFrame* frame) +nsBoxFrameImpl::CollapseChild(nsIFrame* frame) { - nscoord count = 0; - while (nsnull != frame) - { nsRect rect(0,0,0,0); - childFrame->SetRect(nsRect(0,0,0,0)); - // make the view really small as well - nsIView* view = nsnull; - childFrame->GetView(&view); + frame->GetRect(rect); + if (rect.width > 0 || rect.height > 0) { + // shrink the frame + frame->SizeTo(0,0); - if (view) { - view->SetDimensions(0,0,PR_FALSE); + // shrink the view + nsIView* view = nsnull; + frame->GetView(&view); + + // if we find a view stop right here. All views under it + // will be clipped. + if (view) { + view->SetDimensions(0,0,PR_FALSE); + return; + } + + // collapse the child + nsIFrame* child = nsnull; + frame->FirstChild(nsnull, &child); + + while (nsnull != child) + { + CollapseChild(child); + nsresult rv = child->GetNextSibling(&child); + NS_ASSERTION(rv == NS_OK,"failed to get next child"); + } } - - CollapseChildren(childFrame); - rv = childFrame->GetNextSibling(&childFrame); - NS_ASSERTION(rv == NS_OK,"failed to get next child"); - } } -*/ /** @@ -749,17 +773,7 @@ nsBoxFrame::PlaceChildren(nsRect& boxRect) // make collapsed children not show up if (mSprings[count].collapsed) { - childFrame->SetRect(nsRect(0,0,0,0)); - - // make the view really small as well - nsIView* view = nsnull; - childFrame->GetView(&view); - - if (view) { - nsCOMPtr vm; - view->GetViewManager(*getter_AddRefs(vm)); - vm->ResizeView(view, 0,0); - } + mImpl->CollapseChild(childFrame); } else { const nsStyleSpacing* spacing; rv = childFrame->GetStyleData(eStyleStruct_Spacing, @@ -1229,6 +1243,56 @@ nsBoxFrame::LayoutChildrenInRect(nsRect& size) } } +/** + * Ok if we want to resize a child we will know the actual size in pixels we want it to be. + * This is not the preferred size. But they only way we can change a child is my manipulating its + * preferred size. So give the actual pixel size this return method will return figure out the preferred + * size and set it. + */ +void +nsBoxFrame::ResizeChildTo(nscoord aChildIndex, nscoord aNewSize) +{ + // get all the variables we need + nscoord min = GET_WIDTH(mSprings[aChildIndex].minSize); + nscoord max = GET_WIDTH(mSprings[aChildIndex].maxSize); + nscoord c = GET_WIDTH(mSprings[aChildIndex].calculatedSize); + nscoord pref = GET_WIDTH(mSprings[aChildIndex].prefSize); + float flex = mSprings[aChildIndex].flex; + float stretchFactor = float(c-pref)/flex; + + // check bounds + if (aNewSize < min) + aNewSize = min; + else if (aNewSize > max) + aNewSize = max; + + // determine the new pref size + pref = aNewSize - NSToIntFloor(flex/stretchFactor); + + // find the child at the index + nsIFrame* childFrame = mFrames.FirstChild(); + nscoord count = 0; + while (nsnull != childFrame) + { + if (count == aChildIndex) + break; + + nsresult rv; + rv = childFrame->GetNextSibling(&childFrame); + NS_ASSERTION(rv == NS_OK,"failed to get next child"); + count++; + } + + nsCOMPtr content; + childFrame->GetContent(getter_AddRefs(content)); + + + // set its preferred size. + char ch[50]; + sprintf(ch,"%d",pref); + content->SetAttribute(kNameSpaceID_None, nsHTMLAtoms::width, ch, PR_TRUE); +} + // Marks the frame as dirty and generates an incremental reflow // command targeted at this frame nsresult diff --git a/layout/xul/base/src/nsBoxFrame.h b/layout/xul/base/src/nsBoxFrame.h index 9683cd46984..bfebbd78648 100644 --- a/layout/xul/base/src/nsBoxFrame.h +++ b/layout/xul/base/src/nsBoxFrame.h @@ -107,7 +107,9 @@ public: NS_IMETHOD GetFrameName(nsString& aResult) const; - PRBool IsHorizontal() const { return mHorizontal; } + virtual PRBool IsHorizontal() const { return mHorizontal; } + + virtual void ResizeChildTo(nscoord aChildIndex, nscoord aNewSize); NS_IMETHOD_(nsrefcnt) AddRef(void); diff --git a/layout/xul/base/src/nsGrippyFrame.cpp b/layout/xul/base/src/nsGrippyFrame.cpp index 4f1ffed25a8..06d9a64311f 100644 --- a/layout/xul/base/src/nsGrippyFrame.cpp +++ b/layout/xul/base/src/nsGrippyFrame.cpp @@ -36,10 +36,16 @@ #include "nsHTMLAtoms.h" #include "nsXULAtoms.h" #include "nsIReflowCommand.h" -#include "nsSliderFrame.h" +//#include "nsSliderFrame.h" #include "nsIDOMElement.h" #include "nsIDOMDocument.h" #include "nsDocument.h" +#include "nsHTMLParts.h" +#include "nsIPresShell.h" +#include "nsIView.h" +#include "nsIViewManager.h" +#include "nsHTMLContainerFrame.h" + // // NS_NewToolbarFrame @@ -65,7 +71,6 @@ NS_NewGrippyFrame ( nsIFrame** aNewFrame ) nsGrippyFrame::nsGrippyFrame():mCollapsed(PR_FALSE) { } - void nsGrippyFrame::MouseClicked(nsIPresContext& aPresContext) { @@ -113,8 +118,21 @@ nsGrippyFrame::MouseClicked(nsIPresContext& aPresContext) mCollapsedChild->SetAttribute(kNameSpaceID_None, nsHTMLAtoms::style, style, PR_TRUE); mCollapsed = !mCollapsed; + + /* + nsCOMPtr shell; + aPresContext.GetShell(getter_AddRefs(shell)); + + nsCOMPtr reflowCmd; + nsresult rv = NS_NewHTMLReflowCommand(getter_AddRefs(reflowCmd), this, + nsIReflowCommand::StyleChanged); + if (NS_SUCCEEDED(rv)) + shell->AppendReflowCommand(reflowCmd); + */ } + + nsIFrame* nsGrippyFrame::GetChildBeforeAfter(nsIFrame* start, PRBool before) { diff --git a/layout/xul/base/src/nsGrippyFrame.h b/layout/xul/base/src/nsGrippyFrame.h index db0a524c0c6..dfcd12db018 100644 --- a/layout/xul/base/src/nsGrippyFrame.h +++ b/layout/xul/base/src/nsGrippyFrame.h @@ -44,15 +44,17 @@ public: static nsIFrame* GetChildAt(nsIFrame* parent, PRInt32 index); static PRInt32 IndexOf(nsIFrame* parent, nsIFrame* child); static PRInt32 CountFrames(nsIFrame* aFrame); - nsGrippyFrame(); + nsGrippyFrame(); protected: virtual void MouseClicked(nsIPresContext& aPresContext); + +private: + PRBool mCollapsed; nsString mCollapsedChildStyle; nsCOMPtr mCollapsedChild; - - + PRBool mDidDrag; }; // class nsTabFrame