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