From 4366741d317caad860539e5b9575b307ef8dbdce Mon Sep 17 00:00:00 2001 From: troy Date: Wed, 22 Apr 1998 23:28:39 +0000 Subject: [PATCH] Starting to pay attention to CSS positioning properties --- layout/html/base/src/nsAbsoluteFrame.cpp | 155 ++++++++++++++++------- layout/html/base/src/nsAbsoluteFrame.h | 5 +- 2 files changed, 116 insertions(+), 44 deletions(-) diff --git a/layout/html/base/src/nsAbsoluteFrame.cpp b/layout/html/base/src/nsAbsoluteFrame.cpp index 8d4dfb4839ab..49c42bca78e5 100644 --- a/layout/html/base/src/nsAbsoluteFrame.cpp +++ b/layout/html/base/src/nsAbsoluteFrame.cpp @@ -15,12 +15,21 @@ * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ -#include "nsAbsoluteFrame.h" #include "nsIContent.h" #include "nsIContentDelegate.h" -#include "nsViewsCID.h" +#include "nsIPresContext.h" +#include "nsIPtr.h" +#include "nsIStyleContext.h" #include "nsIView.h" #include "nsIViewManager.h" +#include "nsAbsoluteFrame.h" +#include "nsBodyFrame.h" +#include "nsStyleConsts.h" +#include "nsViewsCID.h" + +static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID); + +NS_DEF_PTR(nsIStyleContext); nsresult AbsoluteFrame::NewFrame(nsIFrame** aInstancePtrResult, @@ -52,6 +61,39 @@ AbsoluteFrame::~AbsoluteFrame() { } +nsIView* AbsoluteFrame::CreateView(const nsRect& aRect) +{ + nsIFrame* parent; + nsIView* parentView; + nsIView* view; + + // Create a view for the frame and position it + // XXX This isn't correct. We should look for a containing frame that is absolutely + // positioned and use its local coordinate system, or the root content frame + GetParentWithView(parent); + parent->GetView(parentView); + static NS_DEFINE_IID(kViewCID, NS_VIEW_CID); + static NS_DEFINE_IID(kIViewIID, NS_IVIEW_IID); + + nsresult result = NSRepository::CreateInstance(kViewCID, + nsnull, + kIViewIID, + (void **)&view); + if (NS_OK == result) { + nsIViewManager* viewManager = parentView->GetViewManager(); + + // Initialize the view + NS_ASSERTION(nsnull != viewManager, "null view manager"); + + view->Init(viewManager, aRect, parentView); + viewManager->InsertChild(parentView, view, 0); + + NS_RELEASE(viewManager); + } + NS_RELEASE(parentView); + return view; +} + NS_METHOD AbsoluteFrame::ResizeReflow(nsIPresContext* aPresContext, nsReflowMetrics& aDesiredSize, const nsSize& aMaxSize, @@ -60,60 +102,87 @@ NS_METHOD AbsoluteFrame::ResizeReflow(nsIPresContext* aPresContext, { // Have we created the absolutely positioned item yet? if (nsnull == mFrame) { - // Create the absolutely positioned item as a pseudo-frame child. We'll - // also create a view - nsIContentDelegate* delegate = mContent->GetDelegate(aPresContext); + // If the content object is a container then wrap it in a body pseudo-frame + if (mContent->CanContainChildren()) { + nsBodyFrame::NewFrame(&mFrame, mContent, mIndexInParent, this); - mFrame= delegate->CreateFrame(aPresContext, mContent, mIndexInParent, this); - NS_RELEASE(delegate); + // Resolve style for the pseudo-frame. We can't use our style context + nsIStyleContextPtr styleContext = aPresContext->ResolveStyleContextFor(mContent, this); + mFrame->SetStyleContext(styleContext); - // Set the style context for the frame - mFrame->SetStyleContext(mStyleContext); + } else { + // Create the absolutely positioned item as a pseudo-frame child. We'll + // also create a view + nsIContentDelegate* delegate = mContent->GetDelegate(aPresContext); + + mFrame= delegate->CreateFrame(aPresContext, mContent, mIndexInParent, this); + NS_RELEASE(delegate); + + // Set the style context for the frame + mFrame->SetStyleContext(mStyleContext); + } + +#if 0 + // Get the containing block + nsIFrame* containingBlock = GetContainingBlock(); + + // Determine the view's rect + nsRect rect; + + ComputeViews +#endif + + // Compute the offset and size for the view based on the position properties + nsStylePosition* position = (nsStylePosition*)mStyleContext->GetData(kStylePositionSID); + nsRect rect; + + if (NS_STYLE_POSITION_VALUE_AUTO == position->mLeftOffsetFlags) { + rect.x = 0; + + // Left offset should be automatically computed + if (NS_STYLE_POSITION_VALUE_AUTO == position->mWidthFlags) { + // When all three properties are 'auto' the width is the same as the + // width of the containing block + rect.width = 3500; // XXX Fix me + } else { + rect.width = position->mWidth; + // rect.x = containingRect->width - rect.width; + } + } else { + rect.x = position->mLeftOffset; + // rect.width = containingRect->width - rect.x; + } + + // Create a view for the frame + nsIView* view = CreateView(rect); + mFrame->SetView(view); + NS_RELEASE(view); // Resize reflow the anchored item into the available space mFrame->ResizeReflow(aPresContext, aDesiredSize, aMaxSize, nsnull, aStatus); mFrame->SizeTo(aDesiredSize.width, aDesiredSize.height); - - // Create a view for the frame and position it - // XXX This isn't correct. We should look for a containing frame that is absolutely - // positioned and use its local coordinate system, or the root content frame - nsIFrame* parent; - nsIView* parentView; - nsIView* view; - - GetParentWithView(parent); - parent->GetView(parentView); - static NS_DEFINE_IID(kViewCID, NS_VIEW_CID); - static NS_DEFINE_IID(kIViewIID, NS_IVIEW_IID); - - nsresult result = NSRepository::CreateInstance(kViewCID, - nsnull, - kIViewIID, - (void **)&view); - if (NS_OK == result) { - nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height); - nsIViewManager* viewManager = parentView->GetViewManager(); - - // Initialize the view - NS_ASSERTION(nsnull != viewManager, "null view manager"); - - view->Init(viewManager, rect, parentView); - viewManager->InsertChild(parentView, view, 0); - - NS_RELEASE(viewManager); - mFrame->SetView(view); - NS_RELEASE(view); - } - NS_RELEASE(parentView); } // Return our desired size as (0, 0) return nsFrame::ResizeReflow(aPresContext, aDesiredSize, aMaxSize, aMaxElementSize, aStatus); } -NS_METHOD AbsoluteFrame::ListTag(FILE* out) const +NS_METHOD AbsoluteFrame::List(FILE* out, PRInt32 aIndent) const { + // Indent + for (PRInt32 i = aIndent; --i >= 0; ) fputs(" ", out); + + // Output the tag fputs("*absolute", out); - fprintf(out, "(%d)@%p", mIndexInParent, this); + fprintf(out, "(%d)@%p ", mIndexInParent, this); + + // Output the rect + out << mRect; + + // List the absolutely positioned frame + fputs("<\n", out); + mFrame->List(out, aIndent + 1); + fputs(">\n", out); + return NS_OK; } diff --git a/layout/html/base/src/nsAbsoluteFrame.h b/layout/html/base/src/nsAbsoluteFrame.h index 0f6edfa14c9c..ea11df3f0c14 100644 --- a/layout/html/base/src/nsAbsoluteFrame.h +++ b/layout/html/base/src/nsAbsoluteFrame.h @@ -39,7 +39,8 @@ public: const nsSize& aMaxSize, nsSize* aMaxElementSize, ReflowStatus& aStatus); - NS_IMETHOD ListTag(FILE* out = stdout) const; + + NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const; protected: nsIFrame* mFrame; // the actual absolutely positioned frame @@ -51,6 +52,8 @@ protected: nsIFrame* aParent); virtual ~AbsoluteFrame(); + + nsIView* CreateView(const nsRect& aRect); }; #endif /* nsAbsoluteFrame_h___ */