2001-09-28 20:14:13 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
1999-03-27 01:35:55 +00:00
|
|
|
*
|
2001-09-28 20:14:13 +00:00
|
|
|
* 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/
|
1999-03-27 01:35:55 +00:00
|
|
|
*
|
2001-09-28 20:14:13 +00:00
|
|
|
* 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.
|
1999-03-27 01:35:55 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Mozilla Communicator client code.
|
|
|
|
*
|
2001-09-28 20:14:13 +00:00
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
1999-11-06 03:40:37 +00:00
|
|
|
*
|
2001-09-28 20:14:13 +00:00
|
|
|
* Contributor(s):
|
2000-02-02 22:24:56 +00:00
|
|
|
* Pierre Phaneuf <pp@ludusdesign.com>
|
2001-09-28 20:14:13 +00:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
* use your version of this file under the terms of the NPL, indicate your
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
* the terms of any one of the NPL, the GPL or the LGPL.
|
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
1999-03-27 01:35:55 +00:00
|
|
|
|
|
|
|
//
|
|
|
|
// Eric Vaughan
|
|
|
|
// Netscape Communications
|
|
|
|
//
|
|
|
|
// See documentation in associated header file
|
|
|
|
//
|
|
|
|
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
// How boxes layout
|
|
|
|
// ----------------
|
|
|
|
// Boxes layout a bit differently than html. html does a bottom up layout. Where boxes do a top down.
|
|
|
|
// 1) First thing a box does it goes out and askes each child for its min, max, and preferred sizes.
|
|
|
|
// 2) It then adds them up to determine its size.
|
|
|
|
// 3) If the box was asked to layout it self intrinically it will layout its children at their preferred size
|
|
|
|
// otherwise it will layout the child at the size it was told to. It will squeeze or stretch its children if
|
|
|
|
// Necessary.
|
|
|
|
//
|
|
|
|
// However there is a catch. Some html components like block frames can not determine their preferred size.
|
|
|
|
// this is their size if they were layed out intrinsically. So the box will flow the child to determine this can
|
|
|
|
// cache the value.
|
|
|
|
|
|
|
|
// Boxes and Incremental Reflow
|
|
|
|
// ----------------------------
|
|
|
|
// Boxes layout out top down by adding up their childrens min, max, and preferred sizes. Only problem is if a incremental
|
|
|
|
// reflow occurs. The preferred size of a child deep in the hierarchy could change. And this could change
|
|
|
|
// any number of syblings around the box. Basically any children in the reflow chain must have their caches cleared
|
2000-03-31 07:02:06 +00:00
|
|
|
// so when asked for there current size they can relayout themselves.
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
#include "nsBoxLayoutState.h"
|
1999-03-27 01:35:55 +00:00
|
|
|
#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"
|
1999-03-30 04:05:49 +00:00
|
|
|
#include "nsIReflowCommand.h"
|
1999-05-09 21:46:24 +00:00
|
|
|
#include "nsIContent.h"
|
1999-07-02 05:28:32 +00:00
|
|
|
#include "nsSpaceManager.h"
|
|
|
|
#include "nsHTMLParts.h"
|
1999-06-30 22:17:43 +00:00
|
|
|
#include "nsIViewManager.h"
|
2000-01-14 10:34:27 +00:00
|
|
|
#include "nsIView.h"
|
1999-08-19 03:51:25 +00:00
|
|
|
#include "nsIPresShell.h"
|
1999-09-05 20:46:59 +00:00
|
|
|
#include "nsFrameNavigator.h"
|
1999-09-10 00:57:01 +00:00
|
|
|
#include "nsCSSRendering.h"
|
2000-02-14 01:42:09 +00:00
|
|
|
#include "nsIPref.h"
|
2000-03-02 07:13:02 +00:00
|
|
|
#include "nsIServiceManager.h"
|
2000-03-31 07:02:06 +00:00
|
|
|
#include "nsBoxToBlockAdaptor.h"
|
|
|
|
#include "nsIBoxLayout.h"
|
|
|
|
#include "nsSprocketLayout.h"
|
2000-05-22 09:15:54 +00:00
|
|
|
#include "nsIDocument.h"
|
|
|
|
#include "nsIBindingManager.h"
|
|
|
|
#include "nsIScrollableFrame.h"
|
2000-06-22 00:48:49 +00:00
|
|
|
#include "nsWidgetsCID.h"
|
2000-06-28 22:19:54 +00:00
|
|
|
#include "nsLayoutAtoms.h"
|
|
|
|
#include "nsViewsCID.h"
|
|
|
|
#include "nsIScrollableView.h"
|
2000-09-01 00:59:09 +00:00
|
|
|
#include "nsHTMLContainerFrame.h"
|
2001-07-16 02:40:48 +00:00
|
|
|
#include "nsIWidget.h"
|
2000-06-22 00:48:49 +00:00
|
|
|
|
|
|
|
static NS_DEFINE_IID(kWidgetCID, NS_CHILD_CID);
|
2000-06-28 22:19:54 +00:00
|
|
|
static NS_DEFINE_IID(kCChildCID, NS_CHILD_CID);
|
1999-05-09 21:46:24 +00:00
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
//define DEBUG_REDRAW
|
2000-05-15 04:12:31 +00:00
|
|
|
|
1999-08-27 06:06:39 +00:00
|
|
|
#define DEBUG_SPRING_SIZE 8
|
|
|
|
#define DEBUG_BORDER_SIZE 2
|
|
|
|
#define COIL_SIZE 8
|
|
|
|
|
2000-02-16 23:00:52 +00:00
|
|
|
//#define TEST_SANITY
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-08-23 11:02:19 +00:00
|
|
|
#ifdef DEBUG_rods
|
2000-08-24 13:19:57 +00:00
|
|
|
//#define DO_NOISY_REFLOW
|
2000-08-23 11:02:19 +00:00
|
|
|
#endif
|
|
|
|
|
1999-09-10 00:57:01 +00:00
|
|
|
/**
|
|
|
|
* The boxes private implementation
|
|
|
|
*/
|
|
|
|
class nsBoxFrameInner
|
|
|
|
{
|
|
|
|
public:
|
2000-03-02 03:01:30 +00:00
|
|
|
nsBoxFrameInner(nsIPresShell* aPresShell, nsBoxFrame* aThis)
|
1999-09-10 00:57:01 +00:00
|
|
|
{
|
|
|
|
mOuter = aThis;
|
|
|
|
}
|
|
|
|
|
|
|
|
~nsBoxFrameInner()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
//----- Sibling/Child ----
|
|
|
|
|
|
|
|
nsresult SetDebug(nsIPresContext* aPresContext, PRBool aDebug);
|
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
void Recycle(nsIPresShell* aPresShell);
|
|
|
|
|
|
|
|
// Overloaded new operator. Initializes the memory to 0 and relies on an arena
|
|
|
|
// (which comes from the presShell) to perform the allocation.
|
|
|
|
void* operator new(size_t sz, nsIPresShell* aPresShell);
|
|
|
|
|
|
|
|
// 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.
|
|
|
|
// XXX Would like to make this private some day, but our UNIX compilers can't
|
|
|
|
// deal with it.
|
|
|
|
void operator delete(void* aPtr, size_t sz);
|
|
|
|
|
|
|
|
// helper methods
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-02-16 23:00:52 +00:00
|
|
|
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
void TranslateEventCoords(nsIPresContext* aPresContext,
|
|
|
|
const nsPoint& aPoint,
|
|
|
|
nsPoint& aResult);
|
|
|
|
|
|
|
|
static PRBool AdjustTargetToScope(nsIFrame* aParent, nsIFrame*& aTargetFrame);
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
PRBool GetInitialDebug(PRBool& aDebug);
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
void GetDebugPref(nsIPresContext* aPresContext);
|
2000-02-16 23:00:52 +00:00
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
/*
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult PaintDebug(nsIBox* aBox,
|
|
|
|
nsIPresContext* aPresContext,
|
|
|
|
nsIRenderingContext& aRenderingContext,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
nsFramePaintLayer aWhichLayer);
|
2000-05-15 04:12:31 +00:00
|
|
|
*/
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult DisplayDebugInfoFor(nsIBox* aBox,
|
|
|
|
nsIPresContext* aPresContext,
|
|
|
|
nsPoint& aPoint,
|
|
|
|
PRInt32& aCursor);
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult GetFrameSizeWithMargin(nsIBox* aBox, nsSize& aSize);
|
|
|
|
|
|
|
|
void GetDebugBorder(nsMargin& aInset);
|
|
|
|
void GetDebugPadding(nsMargin& aInset);
|
|
|
|
void GetDebugMargin(nsMargin& aInset);
|
|
|
|
void PixelMarginToTwips(nsIPresContext* aPresContext, nsMargin& aMarginPixels);
|
|
|
|
|
|
|
|
void GetValue(nsIPresContext* aPresContext, const nsSize& a, const nsSize& b, char* value);
|
|
|
|
void GetValue(nsIPresContext* aPresContext, PRInt32 a, PRInt32 b, char* value);
|
2001-09-18 21:47:32 +00:00
|
|
|
void DrawSpacer(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, PRBool aHorizontal, PRInt32 flex, nscoord x, nscoord y, nscoord size, nscoord spacerSize);
|
2000-03-31 07:02:06 +00:00
|
|
|
void DrawLine(nsIRenderingContext& aRenderingContext, PRBool aHorizontal, nscoord x1, nscoord y1, nscoord x2, nscoord y2);
|
|
|
|
void FillRect(nsIRenderingContext& aRenderingContext, PRBool aHorizontal, nscoord x, nscoord y, nscoord width, nscoord height);
|
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
void CacheAttributes();
|
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
nsIBox* GetBoxForFrame(nsIFrame* aFrame, PRBool& aIsAdaptor);
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrame::Halignment GetHAlign();
|
|
|
|
nsBoxFrame::Valignment GetVAlign();
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
// instance variables.
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrame* mOuter;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
nsBoxFrame::Valignment mValign;
|
|
|
|
nsBoxFrame::Halignment mHalign;
|
2000-06-23 05:15:04 +00:00
|
|
|
|
|
|
|
PRBool mAttributesCached;
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
nsIPresContext* mPresContext;
|
|
|
|
|
|
|
|
static PRBool gDebug;
|
|
|
|
static nsIBox* mDebugChild;
|
|
|
|
|
1999-08-27 06:06:39 +00:00
|
|
|
};
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PRBool nsBoxFrameInner::gDebug = PR_FALSE;
|
|
|
|
nsIBox* nsBoxFrameInner::mDebugChild = nsnull;
|
|
|
|
|
1999-03-27 01:35:55 +00:00
|
|
|
nsresult
|
2001-03-06 02:27:50 +00:00
|
|
|
NS_NewBoxFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRBool aIsRoot, nsIBoxLayout* aLayoutManager)
|
1999-03-27 01:35:55 +00:00
|
|
|
{
|
1999-05-11 22:03:29 +00:00
|
|
|
NS_PRECONDITION(aNewFrame, "null OUT ptr");
|
|
|
|
if (nsnull == aNewFrame) {
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
2001-03-06 02:27:50 +00:00
|
|
|
nsBoxFrame* it = new (aPresShell) nsBoxFrame(aPresShell, aIsRoot, aLayoutManager);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
1999-03-27 01:35:55 +00:00
|
|
|
if (nsnull == it)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
1999-05-11 22:03:29 +00:00
|
|
|
*aNewFrame = it;
|
2000-04-05 00:19:00 +00:00
|
|
|
|
1999-03-27 01:35:55 +00:00
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
} // NS_NewBoxFrame
|
|
|
|
|
2001-03-06 02:27:50 +00:00
|
|
|
nsBoxFrame::nsBoxFrame(nsIPresShell* aPresShell, PRBool aIsRoot, nsIBoxLayout* aLayoutManager)
|
|
|
|
:nsContainerBox(aPresShell)
|
1999-03-27 01:35:55 +00:00
|
|
|
{
|
2000-03-02 03:01:30 +00:00
|
|
|
mInner = new (aPresShell) nsBoxFrameInner(aPresShell, this);
|
1999-08-27 06:06:39 +00:00
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
mInner->mAttributesCached = PR_FALSE;
|
|
|
|
|
2001-03-06 02:27:50 +00:00
|
|
|
mState |= NS_STATE_IS_HORIZONTAL;
|
2000-02-14 01:42:09 +00:00
|
|
|
mState |= NS_STATE_AUTO_STRETCH;
|
2000-02-16 23:00:52 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (aIsRoot)
|
2000-03-02 03:01:30 +00:00
|
|
|
mState |= NS_STATE_IS_ROOT;
|
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
mInner->mValign = nsBoxFrame::vAlign_Top;
|
|
|
|
mInner->mHalign = nsBoxFrame::hAlign_Left;
|
2001-09-25 22:17:00 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NeedsRecalc();
|
|
|
|
|
2000-04-05 00:19:00 +00:00
|
|
|
// if no layout manager specified us the static sprocket layout
|
|
|
|
nsCOMPtr<nsIBoxLayout> layout = aLayoutManager;
|
|
|
|
|
|
|
|
if (layout == nsnull) {
|
|
|
|
NS_NewSprocketLayout(aPresShell, layout);
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
SetLayoutManager(layout);
|
|
|
|
|
2000-04-05 00:19:00 +00:00
|
|
|
NeedsRecalc();
|
2001-09-25 22:17:00 +00:00
|
|
|
|
1999-08-27 06:06:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
nsBoxFrame::~nsBoxFrame()
|
|
|
|
{
|
2000-03-02 03:01:30 +00:00
|
|
|
NS_ASSERTION(mInner == nsnull,"Error Destroy was never called on this Frame!!!");
|
1999-03-27 01:35:55 +00:00
|
|
|
}
|
|
|
|
|
2001-10-09 21:02:29 +00:00
|
|
|
NS_IMETHODIMP nsBoxFrame::SetParent(const nsIFrame* aParent)
|
|
|
|
{
|
2001-10-12 01:33:41 +00:00
|
|
|
nsresult rv = nsContainerFrame::SetParent(aParent);
|
|
|
|
|
2001-10-09 21:02:29 +00:00
|
|
|
// our box parent can only be a box. Make sure its a box and set it
|
|
|
|
// if its not a box then its nsnull
|
|
|
|
|
|
|
|
// cast away const so we can call QueryInterface.
|
|
|
|
nsIFrame* parent = (nsIFrame*)aParent;
|
|
|
|
|
|
|
|
// don't use com ptr. Frames don't support ADDREF or RELEASE;
|
|
|
|
nsIBox* boxParent = nsnull;
|
|
|
|
|
|
|
|
if (parent)
|
|
|
|
parent->QueryInterface(NS_GET_IID(nsIBox), (void**)&boxParent);
|
|
|
|
|
2001-10-12 01:33:41 +00:00
|
|
|
nsBox::SetParentBox(boxParent);
|
|
|
|
|
|
|
|
return rv;
|
2001-10-09 21:02:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
NS_IMETHODIMP
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrame::GetVAlign(Valignment& aAlign)
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
aAlign = mInner->mValign;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetHAlign(Halignment& aAlign)
|
|
|
|
{
|
|
|
|
aAlign = mInner->mHalign;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
1999-12-02 01:07:27 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::SetInitialChildList(nsIPresContext* aPresContext,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aChildList)
|
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
SanityCheck(mFrames);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
|
|
|
aPresContext->GetShell(getter_AddRefs(shell));
|
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
nsresult r = nsContainerFrame::SetInitialChildList(aPresContext, aListName, aChildList);
|
2000-03-31 07:02:06 +00:00
|
|
|
if (r == NS_OK) {
|
|
|
|
// initialize our list of infos.
|
2000-04-18 00:17:00 +00:00
|
|
|
nsBoxLayoutState state(shell);
|
|
|
|
InitChildren(state, aChildList);
|
2001-09-25 22:17:00 +00:00
|
|
|
CheckFrameOrder();
|
2000-03-31 07:02:06 +00:00
|
|
|
} else {
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("Warning add child failed!!\n");
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
SanityCheck(mFrames);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PRBool
|
|
|
|
nsBoxFrame::IsHorizontal() const
|
1999-11-18 21:05:43 +00:00
|
|
|
{
|
2000-02-14 01:42:09 +00:00
|
|
|
return mState & NS_STATE_IS_HORIZONTAL;
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
2001-08-15 04:09:41 +00:00
|
|
|
PRBool
|
|
|
|
nsBoxFrame::IsNormalDirection() const
|
|
|
|
{
|
|
|
|
return mState & NS_STATE_IS_DIRECTION_NORMAL;
|
|
|
|
}
|
2000-03-31 07:02:06 +00:00
|
|
|
|
1999-05-09 21:46:24 +00:00
|
|
|
/**
|
|
|
|
* Initialize us. This is a good time to get the alignment of the box
|
|
|
|
*/
|
1999-03-27 01:35:55 +00:00
|
|
|
NS_IMETHODIMP
|
1999-11-24 06:03:41 +00:00
|
|
|
nsBoxFrame::Init(nsIPresContext* aPresContext,
|
1999-03-27 01:35:55 +00:00
|
|
|
nsIContent* aContent,
|
|
|
|
nsIFrame* aParent,
|
|
|
|
nsIStyleContext* aContext,
|
|
|
|
nsIFrame* aPrevInFlow)
|
|
|
|
{
|
2001-10-09 21:02:29 +00:00
|
|
|
SetParent(aParent);
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
mInner->mPresContext = aPresContext;
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
nsresult rv = nsContainerFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
|
2000-01-08 02:18:14 +00:00
|
|
|
|
2000-06-22 00:48:49 +00:00
|
|
|
// see if we need a widget. Get our parent. Querty interface the parent we are given.
|
|
|
|
nsCOMPtr<nsIBox> parent (do_QueryInterface(aParent));
|
|
|
|
|
|
|
|
if (parent) {
|
|
|
|
PRBool needsWidget = PR_FALSE;
|
|
|
|
parent->ChildrenMustHaveWidgets(needsWidget);
|
|
|
|
if (needsWidget) {
|
|
|
|
nsIView* view = nsnull;
|
|
|
|
GetView(aPresContext, &view);
|
|
|
|
|
|
|
|
if (!view) {
|
2000-08-12 19:44:11 +00:00
|
|
|
nsHTMLContainerFrame::CreateViewForFrame(aPresContext,this,mStyleContext,nsnull,PR_TRUE);
|
2000-06-22 00:48:49 +00:00
|
|
|
GetView(aPresContext, &view);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIWidget* widget;
|
|
|
|
view->GetWidget(widget);
|
|
|
|
|
|
|
|
if (!widget)
|
|
|
|
view->CreateWidget(kWidgetCID);
|
|
|
|
}
|
|
|
|
}
|
2000-04-05 00:19:00 +00:00
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
mInner->CacheAttributes();
|
2000-03-02 03:01:30 +00:00
|
|
|
|
|
|
|
// if we are root and this
|
|
|
|
if (mState & NS_STATE_IS_ROOT)
|
2000-03-31 07:02:06 +00:00
|
|
|
mInner->GetDebugPref(aPresContext);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
mMouseThrough = unset;
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
if (mContent) {
|
|
|
|
nsAutoString value;
|
2001-08-17 08:14:14 +00:00
|
|
|
if (NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttr(kNameSpaceID_None, nsXULAtoms::mousethrough, value)) {
|
2000-03-31 07:02:06 +00:00
|
|
|
if (value.EqualsIgnoreCase("never"))
|
|
|
|
mMouseThrough = never;
|
|
|
|
else if (value.EqualsIgnoreCase("always"))
|
|
|
|
mMouseThrough = always;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
2000-02-14 01:42:09 +00:00
|
|
|
}
|
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
void
|
|
|
|
nsBoxFrameInner::CacheAttributes()
|
|
|
|
{
|
|
|
|
/*
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("Caching: ");
|
2000-06-23 05:15:04 +00:00
|
|
|
mOuter->DumpBox(stdout);
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("\n");
|
2000-06-23 05:15:04 +00:00
|
|
|
*/
|
|
|
|
|
2001-08-04 06:21:59 +00:00
|
|
|
mValign = nsBoxFrame::vAlign_Top;
|
2000-06-23 05:15:04 +00:00
|
|
|
mHalign = nsBoxFrame::hAlign_Left;
|
|
|
|
|
|
|
|
PRBool orient = PR_FALSE;
|
|
|
|
mOuter->GetInitialOrientation(orient);
|
|
|
|
if (orient)
|
2001-08-02 00:09:27 +00:00
|
|
|
mOuter->mState |= NS_STATE_IS_HORIZONTAL;
|
|
|
|
else
|
|
|
|
mOuter->mState &= ~NS_STATE_IS_HORIZONTAL;
|
2000-06-23 05:15:04 +00:00
|
|
|
|
2001-08-15 04:09:41 +00:00
|
|
|
PRBool normal = PR_TRUE;
|
|
|
|
mOuter->GetInitialDirection(normal);
|
|
|
|
if (normal)
|
|
|
|
mOuter->mState |= NS_STATE_IS_DIRECTION_NORMAL;
|
|
|
|
else
|
|
|
|
mOuter->mState &= ~NS_STATE_IS_DIRECTION_NORMAL;
|
|
|
|
|
2001-08-02 00:09:27 +00:00
|
|
|
mOuter->GetInitialVAlignment(mValign);
|
|
|
|
mOuter->GetInitialHAlignment(mHalign);
|
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
PRBool equalSize = PR_FALSE;
|
|
|
|
mOuter->GetInitialEqualSize(equalSize);
|
|
|
|
if (equalSize)
|
|
|
|
mOuter->mState |= NS_STATE_EQUAL_SIZE;
|
|
|
|
else
|
|
|
|
mOuter->mState &= ~NS_STATE_EQUAL_SIZE;
|
|
|
|
|
|
|
|
PRBool autostretch = mOuter->mState & NS_STATE_AUTO_STRETCH;
|
|
|
|
mOuter->GetInitialAutoStretch(autostretch);
|
|
|
|
if (autostretch)
|
|
|
|
mOuter->mState |= NS_STATE_AUTO_STRETCH;
|
|
|
|
else
|
|
|
|
mOuter->mState &= ~NS_STATE_AUTO_STRETCH;
|
|
|
|
|
|
|
|
|
|
|
|
PRBool debug = mOuter->mState & NS_STATE_SET_TO_DEBUG;
|
|
|
|
PRBool debugSet = GetInitialDebug(debug);
|
|
|
|
if (debugSet) {
|
|
|
|
mOuter->mState |= NS_STATE_DEBUG_WAS_SET;
|
|
|
|
if (debug)
|
|
|
|
mOuter->mState |= NS_STATE_SET_TO_DEBUG;
|
|
|
|
else
|
|
|
|
mOuter->mState &= ~NS_STATE_SET_TO_DEBUG;
|
|
|
|
} else {
|
|
|
|
mOuter->mState &= ~NS_STATE_DEBUG_WAS_SET;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
PRBool
|
|
|
|
nsBoxFrameInner::GetInitialDebug(PRBool& aDebug)
|
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
nsAutoString value;
|
2000-03-02 03:01:30 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content;
|
2000-03-31 07:02:06 +00:00
|
|
|
mOuter->GetContentOf(getter_AddRefs(content));
|
|
|
|
|
|
|
|
if (!content)
|
|
|
|
return PR_FALSE;
|
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2001-08-17 08:14:14 +00:00
|
|
|
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttr(kNameSpaceID_None, nsXULAtoms::debug, value)) {
|
2000-03-02 03:01:30 +00:00
|
|
|
if (value.EqualsIgnoreCase("true")) {
|
|
|
|
aDebug = PR_TRUE;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("false")) {
|
|
|
|
aDebug = PR_FALSE;
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
PRBool
|
|
|
|
nsBoxFrame::GetInitialHAlignment(nsBoxFrame::Halignment& aHalign)
|
|
|
|
{
|
Landing changes Vidur made while the tree was closed for beta1 work, here's a list of the changes. r=me
[1] Cutting down the size of content. Made nsIJSScriptObject inherit from nsIScriptObjectOwner
[2] Cutting down the size of content. Made nsITextContent inherit from nsIContent.
[3] Cutting down the size of content. Moved implementation of nsIDOMReceiver to nsListenerManager. This is not true aggregation since it isn't transitive, but it's OK for now. It will be necessary for nsListenerManager to have a reference to its content in the future anyway, so the transitivity could be done.
dom/public/nsDOMPropEnums.h,v - bug 12559
dom/public/nsIJSScriptObject.h,v - [1]
dom/public/html/MANIFEST,v - bug 12559
dom/public/html/Makefile.in,v - bug 12559
dom/public/html/makefile.win,v - bug 12559
dom/public/html/nsIDOMHTMLInputElement.h,v - bug 17544
dom/public/idl/html/HTMLAnchorElement.idl,v - bug 12559
dom/public/idl/html/HTMLAreaElement.idl,v - bug 12559
dom/public/idl/html/HTMLInputElement.idl,v - bug 17544
dom/src/base/nsGlobalWindow.cpp,v - bug 30700
dom/src/base/nsGlobalWindow.h,v - [1]
dom/src/base/nsLocation.cpp,v - [1]
dom/src/html/nsJSHTMLAnchorElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLAreaElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLInputElement.cpp,v - bug 17544
layout/base/public/nsIDocument.h,v - bug 27953
layout/base/public/nsITextContent.h,v - [2]
layout/base/src/nsCommentNode.cpp,v - [2]
layout/base/src/nsDocument.cpp,v - bug 27953
layout/base/src/nsDocument.h,v - bug 27953
layout/base/src/nsDocumentViewer.cpp,v - bug 27953
layout/base/src/nsGenericDOMDataNode.cpp,v - [3]
layout/base/src/nsGenericDOMDataNode.h,v - [3]
layout/base/src/nsGenericElement.cpp,v - [3]
layout/base/src/nsGenericElement.h,v - [3]
layout/base/src/nsNameSpaceManager.cpp,v - bug 7834
layout/base/src/nsStyleContext.cpp,v - outline property shouldn't reflow
layout/base/src/nsTextNode.cpp,v - [2]
layout/events/src/nsEventListenerManager.cpp,v - [3]
layout/events/src/nsEventListenerManager.h,v - [3]
layout/html/base/src/nsGfxScrollFrame.cpp,v - nsString->nsAutoString
layout/html/content/src/nsAttributeContent.cpp,v - [2]
layout/html/content/src/nsHTMLAnchorElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAppletElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBodyElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLButtonElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDirectoryElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDivElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLEmbedElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFieldSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFormElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadingElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHtmlElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLImageElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInputElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInsElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIsIndexElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLIElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLabelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLayerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLegendElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLinkElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMapElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMenuElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMetaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLModElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLObjectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParagraphElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParamElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLPreElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLQuoteElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLScriptElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSelectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpacerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpanElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLStyleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCaptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCellElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableRowElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableSectionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTextAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTitleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLUListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLWBRElement.cpp,v - [1][3]
layout/html/document/src/nsHTMLDocument.cpp,v - bug 27953
layout/html/document/src/nsHTMLDocument.h,v - bug 27953
layout/xml/content/src/nsXMLCDATASection.cpp,v - [1][2]
layout/xml/content/src/nsXMLDocumentType.cpp,v - [1][2]
layout/xml/content/src/nsXMLElement.h,v - [1][2]
layout/xml/content/src/nsXMLEntity.cpp,v - [1][2]
layout/xml/content/src/nsXMLNotation.cpp,v - [1][2]
layout/xml/content/src/nsXMLProcessingInstruction.cpp,v - [1][2]
layout/xul/base/src/nsBoxFrame.cpp,v - nsString->nsAutoString
layout/xul/base/src/nsSliderFrame.cpp,v - nsString->nsAutoString
netwerk/protocol/http/src/nsHTTPRequest.cpp,v - nsString->nsAutoString
rdf/content/src/nsXULDocument.cpp,v - bug 27953
rdf/content/src/nsXULDocument.h,v - bug 27953
rdf/content/src/nsXULElement.h,v - [1]
xpcom/base/IIDS.h,v - bug 12559
2000-03-17 13:27:00 +00:00
|
|
|
nsAutoString value;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content;
|
2000-03-31 07:02:06 +00:00
|
|
|
GetContentOf(getter_AddRefs(content));
|
|
|
|
if (!content)
|
|
|
|
return PR_FALSE;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2001-08-17 08:14:14 +00:00
|
|
|
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttr(kNameSpaceID_None, nsHTMLAtoms::align, value)) {
|
2001-08-02 00:09:27 +00:00
|
|
|
// XXXdwh Everything inside this if statement is deprecated code.
|
|
|
|
if (value.EqualsIgnoreCase("left")) {
|
|
|
|
aHalign = nsBoxFrame::hAlign_Left;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("right")) {
|
|
|
|
aHalign = nsBoxFrame::hAlign_Right;
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
}
|
2001-08-02 00:09:27 +00:00
|
|
|
|
|
|
|
// Now that the deprecated stuff is out of the way, we move on to check the appropriate
|
|
|
|
// attribute. For horizontal boxes, we are checking the PACK attribute. For vertical boxes
|
|
|
|
// we are checking the ALIGN attribute.
|
|
|
|
nsresult res;
|
|
|
|
if (IsHorizontal())
|
2001-08-17 08:14:14 +00:00
|
|
|
res = content->GetAttr(kNameSpaceID_None, nsXULAtoms::pack, value);
|
|
|
|
else res = content->GetAttr(kNameSpaceID_None, nsHTMLAtoms::align, value);
|
2001-08-02 00:09:27 +00:00
|
|
|
if (res == NS_CONTENT_ATTR_HAS_VALUE) {
|
|
|
|
if (value.EqualsIgnoreCase("start")) {
|
|
|
|
aHalign = nsBoxFrame::hAlign_Left;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("center")) {
|
|
|
|
aHalign = nsBoxFrame::hAlign_Center;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("end")) {
|
|
|
|
aHalign = nsBoxFrame::hAlign_Right;
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2001-08-02 00:09:27 +00:00
|
|
|
// The attr was present but had a nonsensical value. Revert to the default.
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
2000-02-14 01:42:09 +00:00
|
|
|
|
2001-08-02 00:09:27 +00:00
|
|
|
// Now that we've checked for the attribute it's time to check CSS. For
|
|
|
|
// horizontal boxes we're checking PACK. For vertical boxes we are checking
|
|
|
|
// ALIGN.
|
|
|
|
const nsStyleXUL* boxInfo = (const nsStyleXUL*)mStyleContext->GetStyleData(eStyleStruct_XUL);
|
|
|
|
if (IsHorizontal()) {
|
|
|
|
switch (boxInfo->mBoxPack) {
|
|
|
|
case NS_STYLE_BOX_PACK_START:
|
|
|
|
aHalign = nsBoxFrame::hAlign_Left;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_PACK_CENTER:
|
|
|
|
aHalign = nsBoxFrame::hAlign_Center;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_PACK_END:
|
|
|
|
aHalign = nsBoxFrame::hAlign_Right;
|
|
|
|
return PR_TRUE;
|
|
|
|
default: // Nonsensical value. Just bail.
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
switch (boxInfo->mBoxAlign) {
|
|
|
|
case NS_STYLE_BOX_ALIGN_START:
|
|
|
|
aHalign = nsBoxFrame::hAlign_Left;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_ALIGN_CENTER:
|
|
|
|
aHalign = nsBoxFrame::hAlign_Center;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_ALIGN_END:
|
|
|
|
aHalign = nsBoxFrame::hAlign_Right;
|
|
|
|
return PR_TRUE;
|
|
|
|
default: // Nonsensical value. Just bail.
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
2000-02-14 01:42:09 +00:00
|
|
|
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
nsBoxFrame::GetInitialVAlignment(nsBoxFrame::Valignment& aValign)
|
|
|
|
{
|
|
|
|
|
Landing changes Vidur made while the tree was closed for beta1 work, here's a list of the changes. r=me
[1] Cutting down the size of content. Made nsIJSScriptObject inherit from nsIScriptObjectOwner
[2] Cutting down the size of content. Made nsITextContent inherit from nsIContent.
[3] Cutting down the size of content. Moved implementation of nsIDOMReceiver to nsListenerManager. This is not true aggregation since it isn't transitive, but it's OK for now. It will be necessary for nsListenerManager to have a reference to its content in the future anyway, so the transitivity could be done.
dom/public/nsDOMPropEnums.h,v - bug 12559
dom/public/nsIJSScriptObject.h,v - [1]
dom/public/html/MANIFEST,v - bug 12559
dom/public/html/Makefile.in,v - bug 12559
dom/public/html/makefile.win,v - bug 12559
dom/public/html/nsIDOMHTMLInputElement.h,v - bug 17544
dom/public/idl/html/HTMLAnchorElement.idl,v - bug 12559
dom/public/idl/html/HTMLAreaElement.idl,v - bug 12559
dom/public/idl/html/HTMLInputElement.idl,v - bug 17544
dom/src/base/nsGlobalWindow.cpp,v - bug 30700
dom/src/base/nsGlobalWindow.h,v - [1]
dom/src/base/nsLocation.cpp,v - [1]
dom/src/html/nsJSHTMLAnchorElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLAreaElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLInputElement.cpp,v - bug 17544
layout/base/public/nsIDocument.h,v - bug 27953
layout/base/public/nsITextContent.h,v - [2]
layout/base/src/nsCommentNode.cpp,v - [2]
layout/base/src/nsDocument.cpp,v - bug 27953
layout/base/src/nsDocument.h,v - bug 27953
layout/base/src/nsDocumentViewer.cpp,v - bug 27953
layout/base/src/nsGenericDOMDataNode.cpp,v - [3]
layout/base/src/nsGenericDOMDataNode.h,v - [3]
layout/base/src/nsGenericElement.cpp,v - [3]
layout/base/src/nsGenericElement.h,v - [3]
layout/base/src/nsNameSpaceManager.cpp,v - bug 7834
layout/base/src/nsStyleContext.cpp,v - outline property shouldn't reflow
layout/base/src/nsTextNode.cpp,v - [2]
layout/events/src/nsEventListenerManager.cpp,v - [3]
layout/events/src/nsEventListenerManager.h,v - [3]
layout/html/base/src/nsGfxScrollFrame.cpp,v - nsString->nsAutoString
layout/html/content/src/nsAttributeContent.cpp,v - [2]
layout/html/content/src/nsHTMLAnchorElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAppletElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBodyElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLButtonElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDirectoryElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDivElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLEmbedElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFieldSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFormElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadingElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHtmlElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLImageElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInputElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInsElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIsIndexElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLIElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLabelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLayerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLegendElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLinkElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMapElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMenuElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMetaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLModElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLObjectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParagraphElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParamElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLPreElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLQuoteElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLScriptElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSelectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpacerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpanElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLStyleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCaptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCellElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableRowElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableSectionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTextAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTitleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLUListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLWBRElement.cpp,v - [1][3]
layout/html/document/src/nsHTMLDocument.cpp,v - bug 27953
layout/html/document/src/nsHTMLDocument.h,v - bug 27953
layout/xml/content/src/nsXMLCDATASection.cpp,v - [1][2]
layout/xml/content/src/nsXMLDocumentType.cpp,v - [1][2]
layout/xml/content/src/nsXMLElement.h,v - [1][2]
layout/xml/content/src/nsXMLEntity.cpp,v - [1][2]
layout/xml/content/src/nsXMLNotation.cpp,v - [1][2]
layout/xml/content/src/nsXMLProcessingInstruction.cpp,v - [1][2]
layout/xul/base/src/nsBoxFrame.cpp,v - nsString->nsAutoString
layout/xul/base/src/nsSliderFrame.cpp,v - nsString->nsAutoString
netwerk/protocol/http/src/nsHTTPRequest.cpp,v - nsString->nsAutoString
rdf/content/src/nsXULDocument.cpp,v - bug 27953
rdf/content/src/nsXULDocument.h,v - bug 27953
rdf/content/src/nsXULElement.h,v - [1]
xpcom/base/IIDS.h,v - bug 12559
2000-03-17 13:27:00 +00:00
|
|
|
nsAutoString value;
|
2000-02-14 01:42:09 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content;
|
2000-03-31 07:02:06 +00:00
|
|
|
GetContentOf(getter_AddRefs(content));
|
|
|
|
if (!content)
|
|
|
|
return PR_FALSE;
|
2000-02-14 01:42:09 +00:00
|
|
|
|
2001-08-17 08:14:14 +00:00
|
|
|
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttr(kNameSpaceID_None, nsHTMLAtoms::valign, value)) {
|
2001-08-02 00:09:27 +00:00
|
|
|
if (value.EqualsIgnoreCase("top")) {
|
|
|
|
aValign = nsBoxFrame::vAlign_Top;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("baseline")) {
|
|
|
|
aValign = nsBoxFrame::vAlign_BaseLine;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("middle")) {
|
|
|
|
aValign = nsBoxFrame::vAlign_Middle;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("bottom")) {
|
|
|
|
aValign = nsBoxFrame::vAlign_Bottom;
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
}
|
|
|
|
|
2001-08-02 00:09:27 +00:00
|
|
|
// Now that the deprecated stuff is out of the way, we move on to check the appropriate
|
|
|
|
// attribute. For horizontal boxes, we are checking the ALIGN attribute. For vertical boxes
|
|
|
|
// we are checking the PACK attribute.
|
|
|
|
nsresult res;
|
|
|
|
if (IsHorizontal())
|
2001-08-17 08:14:14 +00:00
|
|
|
res = content->GetAttr(kNameSpaceID_None, nsHTMLAtoms::align, value);
|
|
|
|
else res = content->GetAttr(kNameSpaceID_None, nsXULAtoms::pack, value);
|
2001-08-02 00:09:27 +00:00
|
|
|
if (res == NS_CONTENT_ATTR_HAS_VALUE) {
|
|
|
|
if (value.EqualsIgnoreCase("start")) {
|
|
|
|
aValign = nsBoxFrame::vAlign_Top;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("center")) {
|
|
|
|
aValign = nsBoxFrame::vAlign_Middle;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("baseline")) {
|
|
|
|
aValign = nsBoxFrame::vAlign_BaseLine;
|
|
|
|
return PR_TRUE;
|
|
|
|
} else if (value.EqualsIgnoreCase("end")) {
|
|
|
|
aValign = nsBoxFrame::vAlign_Bottom;
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
|
|
|
// The attr was present but had a nonsensical value. Revert to the default.
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now that we've checked for the attribute it's time to check CSS. For
|
|
|
|
// horizontal boxes we're checking ALIGN. For vertical boxes we are checking
|
|
|
|
// PACK.
|
|
|
|
const nsStyleXUL* boxInfo = (const nsStyleXUL*)mStyleContext->GetStyleData(eStyleStruct_XUL);
|
|
|
|
if (IsHorizontal()) {
|
|
|
|
switch (boxInfo->mBoxAlign) {
|
|
|
|
case NS_STYLE_BOX_ALIGN_START:
|
|
|
|
aValign = nsBoxFrame::vAlign_Top;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_ALIGN_CENTER:
|
|
|
|
aValign = nsBoxFrame::vAlign_Middle;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_ALIGN_BASELINE:
|
|
|
|
aValign = nsBoxFrame::vAlign_BaseLine;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_ALIGN_END:
|
|
|
|
aValign = nsBoxFrame::vAlign_Bottom;
|
|
|
|
return PR_TRUE;
|
|
|
|
default: // Nonsensical value. Just bail.
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
switch (boxInfo->mBoxPack) {
|
|
|
|
case NS_STYLE_BOX_PACK_START:
|
|
|
|
aValign = nsBoxFrame::vAlign_Top;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_PACK_CENTER:
|
|
|
|
aValign = nsBoxFrame::vAlign_Middle;
|
|
|
|
return PR_TRUE;
|
|
|
|
case NS_STYLE_BOX_PACK_END:
|
|
|
|
aValign = nsBoxFrame::vAlign_Bottom;
|
|
|
|
return PR_TRUE;
|
|
|
|
default: // Nonsensical value. Just bail.
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
2000-02-14 01:42:09 +00:00
|
|
|
|
|
|
|
return PR_FALSE;
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
/* Returns true if it was set.
|
1999-11-18 21:05:43 +00:00
|
|
|
*/
|
2001-03-06 02:27:50 +00:00
|
|
|
void
|
2000-02-14 01:42:09 +00:00
|
|
|
nsBoxFrame::GetInitialOrientation(PRBool& aIsHorizontal)
|
1999-11-18 21:05:43 +00:00
|
|
|
{
|
|
|
|
// see if we are a vertical or horizontal box.
|
Landing changes Vidur made while the tree was closed for beta1 work, here's a list of the changes. r=me
[1] Cutting down the size of content. Made nsIJSScriptObject inherit from nsIScriptObjectOwner
[2] Cutting down the size of content. Made nsITextContent inherit from nsIContent.
[3] Cutting down the size of content. Moved implementation of nsIDOMReceiver to nsListenerManager. This is not true aggregation since it isn't transitive, but it's OK for now. It will be necessary for nsListenerManager to have a reference to its content in the future anyway, so the transitivity could be done.
dom/public/nsDOMPropEnums.h,v - bug 12559
dom/public/nsIJSScriptObject.h,v - [1]
dom/public/html/MANIFEST,v - bug 12559
dom/public/html/Makefile.in,v - bug 12559
dom/public/html/makefile.win,v - bug 12559
dom/public/html/nsIDOMHTMLInputElement.h,v - bug 17544
dom/public/idl/html/HTMLAnchorElement.idl,v - bug 12559
dom/public/idl/html/HTMLAreaElement.idl,v - bug 12559
dom/public/idl/html/HTMLInputElement.idl,v - bug 17544
dom/src/base/nsGlobalWindow.cpp,v - bug 30700
dom/src/base/nsGlobalWindow.h,v - [1]
dom/src/base/nsLocation.cpp,v - [1]
dom/src/html/nsJSHTMLAnchorElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLAreaElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLInputElement.cpp,v - bug 17544
layout/base/public/nsIDocument.h,v - bug 27953
layout/base/public/nsITextContent.h,v - [2]
layout/base/src/nsCommentNode.cpp,v - [2]
layout/base/src/nsDocument.cpp,v - bug 27953
layout/base/src/nsDocument.h,v - bug 27953
layout/base/src/nsDocumentViewer.cpp,v - bug 27953
layout/base/src/nsGenericDOMDataNode.cpp,v - [3]
layout/base/src/nsGenericDOMDataNode.h,v - [3]
layout/base/src/nsGenericElement.cpp,v - [3]
layout/base/src/nsGenericElement.h,v - [3]
layout/base/src/nsNameSpaceManager.cpp,v - bug 7834
layout/base/src/nsStyleContext.cpp,v - outline property shouldn't reflow
layout/base/src/nsTextNode.cpp,v - [2]
layout/events/src/nsEventListenerManager.cpp,v - [3]
layout/events/src/nsEventListenerManager.h,v - [3]
layout/html/base/src/nsGfxScrollFrame.cpp,v - nsString->nsAutoString
layout/html/content/src/nsAttributeContent.cpp,v - [2]
layout/html/content/src/nsHTMLAnchorElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAppletElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBodyElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLButtonElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDirectoryElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDivElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLEmbedElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFieldSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFormElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadingElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHtmlElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLImageElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInputElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInsElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIsIndexElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLIElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLabelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLayerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLegendElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLinkElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMapElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMenuElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMetaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLModElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLObjectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParagraphElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParamElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLPreElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLQuoteElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLScriptElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSelectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpacerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpanElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLStyleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCaptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCellElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableRowElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableSectionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTextAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTitleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLUListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLWBRElement.cpp,v - [1][3]
layout/html/document/src/nsHTMLDocument.cpp,v - bug 27953
layout/html/document/src/nsHTMLDocument.h,v - bug 27953
layout/xml/content/src/nsXMLCDATASection.cpp,v - [1][2]
layout/xml/content/src/nsXMLDocumentType.cpp,v - [1][2]
layout/xml/content/src/nsXMLElement.h,v - [1][2]
layout/xml/content/src/nsXMLEntity.cpp,v - [1][2]
layout/xml/content/src/nsXMLNotation.cpp,v - [1][2]
layout/xml/content/src/nsXMLProcessingInstruction.cpp,v - [1][2]
layout/xul/base/src/nsBoxFrame.cpp,v - nsString->nsAutoString
layout/xul/base/src/nsSliderFrame.cpp,v - nsString->nsAutoString
netwerk/protocol/http/src/nsHTTPRequest.cpp,v - nsString->nsAutoString
rdf/content/src/nsXULDocument.cpp,v - bug 27953
rdf/content/src/nsXULDocument.h,v - bug 27953
rdf/content/src/nsXULElement.h,v - [1]
xpcom/base/IIDS.h,v - bug 12559
2000-03-17 13:27:00 +00:00
|
|
|
nsAutoString value;
|
1999-10-12 00:16:06 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content;
|
2000-03-31 07:02:06 +00:00
|
|
|
GetContentOf(getter_AddRefs(content));
|
|
|
|
|
|
|
|
if (!content)
|
2001-03-06 02:27:50 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
// Check the style system first.
|
|
|
|
const nsStyleXUL* boxInfo;
|
|
|
|
GetStyleData(eStyleStruct_XUL,
|
|
|
|
(const nsStyleStruct*&)boxInfo);
|
|
|
|
if (boxInfo->mBoxOrient == NS_STYLE_BOX_ORIENT_HORIZONTAL)
|
|
|
|
aIsHorizontal = PR_TRUE;
|
|
|
|
else
|
|
|
|
aIsHorizontal = PR_FALSE;
|
|
|
|
|
|
|
|
// Now see if we have an attribute. The attribute overrides
|
|
|
|
// the style system value.
|
2001-08-17 08:14:14 +00:00
|
|
|
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttr(kNameSpaceID_None, nsXULAtoms::orient, value)) {
|
2001-03-06 02:27:50 +00:00
|
|
|
if (value.EqualsIgnoreCase("vertical"))
|
|
|
|
aIsHorizontal = PR_FALSE;
|
|
|
|
else if (value.EqualsIgnoreCase("horizontal"))
|
|
|
|
aIsHorizontal = PR_TRUE;
|
|
|
|
}
|
2000-02-14 01:42:09 +00:00
|
|
|
}
|
|
|
|
|
2001-08-15 04:09:41 +00:00
|
|
|
void
|
|
|
|
nsBoxFrame::GetInitialDirection(PRBool& aIsNormal)
|
|
|
|
{
|
|
|
|
nsAutoString value;
|
|
|
|
nsCOMPtr<nsIContent> content;
|
|
|
|
GetContentOf(getter_AddRefs(content));
|
|
|
|
|
|
|
|
if (!content)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (IsHorizontal()) {
|
|
|
|
// For horizontal boxes only, we initialize our value based off the CSS 'direction' property.
|
|
|
|
// This means that BiDI users will end up with horizontally inverted chrome.
|
|
|
|
const nsStyleVisibility* vis;
|
|
|
|
GetStyleData(eStyleStruct_Visibility,
|
|
|
|
(const nsStyleStruct*&)vis);
|
|
|
|
aIsNormal = (vis->mDirection == NS_STYLE_DIRECTION_LTR); // If text runs RTL then so do we.
|
|
|
|
}
|
|
|
|
else
|
|
|
|
aIsNormal = PR_TRUE; // Assume a normal direction in the vertical case.
|
|
|
|
|
|
|
|
// Now check the style system to see if we should invert aIsNormal.
|
|
|
|
const nsStyleXUL* boxInfo;
|
|
|
|
GetStyleData(eStyleStruct_XUL,
|
|
|
|
(const nsStyleStruct*&)boxInfo);
|
|
|
|
if (boxInfo->mBoxDirection == NS_STYLE_BOX_DIRECTION_REVERSE)
|
|
|
|
aIsNormal = !aIsNormal; // Invert our direction.
|
|
|
|
|
|
|
|
// Now see if we have an attribute. The attribute overrides
|
|
|
|
// the style system value.
|
2001-08-17 08:14:14 +00:00
|
|
|
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttr(kNameSpaceID_None, nsXULAtoms::dir, value)) {
|
2001-08-15 04:09:41 +00:00
|
|
|
if (value.EqualsIgnoreCase("reverse"))
|
|
|
|
aIsNormal = !aIsNormal; // Invert our direction.
|
2001-08-15 04:24:37 +00:00
|
|
|
else if (value.EqualsIgnoreCase("ltr"))
|
|
|
|
aIsNormal = PR_TRUE;
|
|
|
|
else if (value.EqualsIgnoreCase("rtl"))
|
|
|
|
aIsNormal = PR_FALSE;
|
2001-08-15 04:09:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
/* Returns true if it was set.
|
|
|
|
*/
|
|
|
|
PRBool
|
|
|
|
nsBoxFrame::GetInitialEqualSize(PRBool& aEqualSize)
|
|
|
|
{
|
|
|
|
// see if we are a vertical or horizontal box.
|
|
|
|
nsAutoString value;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content;
|
|
|
|
GetContentOf(getter_AddRefs(content));
|
|
|
|
|
|
|
|
if (!content)
|
|
|
|
return PR_FALSE;
|
|
|
|
|
2001-08-17 08:14:14 +00:00
|
|
|
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttr(kNameSpaceID_None, nsXULAtoms::equalsize, value))
|
2000-06-23 05:15:04 +00:00
|
|
|
{
|
|
|
|
if (value.EqualsIgnoreCase("always")) {
|
|
|
|
aEqualSize = PR_TRUE;
|
|
|
|
return PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return PR_FALSE;
|
|
|
|
}
|
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
/* Returns true if it was set.
|
|
|
|
*/
|
|
|
|
PRBool
|
|
|
|
nsBoxFrame::GetInitialAutoStretch(PRBool& aStretch)
|
|
|
|
{
|
Landing changes Vidur made while the tree was closed for beta1 work, here's a list of the changes. r=me
[1] Cutting down the size of content. Made nsIJSScriptObject inherit from nsIScriptObjectOwner
[2] Cutting down the size of content. Made nsITextContent inherit from nsIContent.
[3] Cutting down the size of content. Moved implementation of nsIDOMReceiver to nsListenerManager. This is not true aggregation since it isn't transitive, but it's OK for now. It will be necessary for nsListenerManager to have a reference to its content in the future anyway, so the transitivity could be done.
dom/public/nsDOMPropEnums.h,v - bug 12559
dom/public/nsIJSScriptObject.h,v - [1]
dom/public/html/MANIFEST,v - bug 12559
dom/public/html/Makefile.in,v - bug 12559
dom/public/html/makefile.win,v - bug 12559
dom/public/html/nsIDOMHTMLInputElement.h,v - bug 17544
dom/public/idl/html/HTMLAnchorElement.idl,v - bug 12559
dom/public/idl/html/HTMLAreaElement.idl,v - bug 12559
dom/public/idl/html/HTMLInputElement.idl,v - bug 17544
dom/src/base/nsGlobalWindow.cpp,v - bug 30700
dom/src/base/nsGlobalWindow.h,v - [1]
dom/src/base/nsLocation.cpp,v - [1]
dom/src/html/nsJSHTMLAnchorElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLAreaElement.cpp,v - bug 12559
dom/src/html/nsJSHTMLInputElement.cpp,v - bug 17544
layout/base/public/nsIDocument.h,v - bug 27953
layout/base/public/nsITextContent.h,v - [2]
layout/base/src/nsCommentNode.cpp,v - [2]
layout/base/src/nsDocument.cpp,v - bug 27953
layout/base/src/nsDocument.h,v - bug 27953
layout/base/src/nsDocumentViewer.cpp,v - bug 27953
layout/base/src/nsGenericDOMDataNode.cpp,v - [3]
layout/base/src/nsGenericDOMDataNode.h,v - [3]
layout/base/src/nsGenericElement.cpp,v - [3]
layout/base/src/nsGenericElement.h,v - [3]
layout/base/src/nsNameSpaceManager.cpp,v - bug 7834
layout/base/src/nsStyleContext.cpp,v - outline property shouldn't reflow
layout/base/src/nsTextNode.cpp,v - [2]
layout/events/src/nsEventListenerManager.cpp,v - [3]
layout/events/src/nsEventListenerManager.h,v - [3]
layout/html/base/src/nsGfxScrollFrame.cpp,v - nsString->nsAutoString
layout/html/content/src/nsAttributeContent.cpp,v - [2]
layout/html/content/src/nsHTMLAnchorElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAppletElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBaseFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLBodyElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLButtonElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDirectoryElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLDivElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLEmbedElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFieldSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFontElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFormElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLFrameSetElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHRElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHeadingElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLHtmlElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIFrameElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLImageElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInputElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLInsElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLIsIndexElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLIElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLabelElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLayerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLegendElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLLinkElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMapElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMenuElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLMetaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLModElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLObjectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLOptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParagraphElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLParamElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLPreElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLQuoteElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLScriptElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSelectElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpacerElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLSpanElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLStyleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCaptionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableCellElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableColGroupElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableRowElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTableSectionElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTextAreaElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLTitleElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLUListElement.cpp,v - [1][3]
layout/html/content/src/nsHTMLWBRElement.cpp,v - [1][3]
layout/html/document/src/nsHTMLDocument.cpp,v - bug 27953
layout/html/document/src/nsHTMLDocument.h,v - bug 27953
layout/xml/content/src/nsXMLCDATASection.cpp,v - [1][2]
layout/xml/content/src/nsXMLDocumentType.cpp,v - [1][2]
layout/xml/content/src/nsXMLElement.h,v - [1][2]
layout/xml/content/src/nsXMLEntity.cpp,v - [1][2]
layout/xml/content/src/nsXMLNotation.cpp,v - [1][2]
layout/xml/content/src/nsXMLProcessingInstruction.cpp,v - [1][2]
layout/xul/base/src/nsBoxFrame.cpp,v - nsString->nsAutoString
layout/xul/base/src/nsSliderFrame.cpp,v - nsString->nsAutoString
netwerk/protocol/http/src/nsHTTPRequest.cpp,v - nsString->nsAutoString
rdf/content/src/nsXULDocument.cpp,v - bug 27953
rdf/content/src/nsXULDocument.h,v - bug 27953
rdf/content/src/nsXULElement.h,v - [1]
xpcom/base/IIDS.h,v - bug 12559
2000-03-17 13:27:00 +00:00
|
|
|
nsAutoString value;
|
2000-02-14 01:42:09 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content;
|
2000-03-31 07:02:06 +00:00
|
|
|
GetContentOf(getter_AddRefs(content));
|
|
|
|
|
|
|
|
if (!content)
|
|
|
|
return PR_FALSE;
|
107642 - XUL syntax/cleanup landing. Fixes 94470, 96008, 96019, 76800, 102637, 80399, 108303, and removes over a thousand unnecessary or nonsensical attributes. Also fixes 108302, 102366, 102367, 105815. r=sspitzer,cmanske on appropriate parts sr=ben
2001-11-03 04:17:02 +00:00
|
|
|
|
|
|
|
// Check the align attribute.
|
|
|
|
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttr(kNameSpaceID_None, nsHTMLAtoms::align, value)) {
|
|
|
|
aStretch = value.EqualsIgnoreCase("stretch");
|
|
|
|
return PR_TRUE;
|
2001-08-02 00:09:27 +00:00
|
|
|
}
|
2000-02-14 01:42:09 +00:00
|
|
|
|
107642 - XUL syntax/cleanup landing. Fixes 94470, 96008, 96019, 76800, 102637, 80399, 108303, and removes over a thousand unnecessary or nonsensical attributes. Also fixes 108302, 102366, 102367, 105815. r=sspitzer,cmanske on appropriate parts sr=ben
2001-11-03 04:17:02 +00:00
|
|
|
// Check the CSS box-align property.
|
|
|
|
const nsStyleXUL* boxInfo;
|
|
|
|
GetStyleData(eStyleStruct_XUL, (const nsStyleStruct*&)boxInfo);
|
|
|
|
aStretch = (boxInfo->mBoxAlign == NS_STYLE_BOX_ALIGN_STRETCH);
|
2001-08-02 00:09:27 +00:00
|
|
|
|
|
|
|
return PR_TRUE;
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
1999-07-02 05:28:32 +00:00
|
|
|
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild)
|
|
|
|
{
|
2000-04-18 00:17:00 +00:00
|
|
|
nsCOMPtr<nsIPresContext> context;
|
|
|
|
aPresShell->GetPresContext(getter_AddRefs(context));
|
|
|
|
nsBoxLayoutState state(context);
|
|
|
|
return RelayoutDirtyChild(state, this);
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::DidReflow(nsIPresContext* aPresContext,
|
|
|
|
nsDidReflowStatus aStatus)
|
1999-09-10 00:57:01 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
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;
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (hasDirtyChildren)
|
|
|
|
mState |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
return rv;
|
1999-09-10 00:57:01 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2000-08-23 11:02:19 +00:00
|
|
|
#ifdef DO_NOISY_REFLOW
|
|
|
|
static int myCounter = 0;
|
|
|
|
static void printSize(char * aDesc, nscoord aSize)
|
|
|
|
{
|
2000-10-28 22:17:53 +00:00
|
|
|
printf(" %s: ", aDesc);
|
2000-08-23 11:02:19 +00:00
|
|
|
if (aSize == NS_UNCONSTRAINEDSIZE) {
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("UC");
|
2000-08-23 11:02:19 +00:00
|
|
|
} else {
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("%d", aSize);
|
2000-08-23 11:02:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::Reflow(nsIPresContext* aPresContext,
|
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
const nsHTMLReflowState& aReflowState,
|
|
|
|
nsReflowStatus& aStatus)
|
1999-03-27 01:35:55 +00:00
|
|
|
{
|
2000-04-21 14:59:47 +00:00
|
|
|
DO_GLOBAL_REFLOW_COUNT("nsBoxFrame", aReflowState.reason);
|
1999-03-27 01:35:55 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_ASSERTION(aReflowState.mComputedWidth >=0 && aReflowState.mComputedHeight >= 0, "Computed Size < 0");
|
1999-04-12 21:48:21 +00:00
|
|
|
|
2000-08-23 11:02:19 +00:00
|
|
|
#ifdef DO_NOISY_REFLOW
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("\n-------------Starting BoxFrame Reflow ----------------------------\n");
|
|
|
|
printf("%p ** nsBF::Reflow %d R: ", this, myCounter++);
|
2000-08-23 11:02:19 +00:00
|
|
|
switch (aReflowState.reason) {
|
|
|
|
case eReflowReason_Initial:
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("Ini");break;
|
2000-08-23 11:02:19 +00:00
|
|
|
case eReflowReason_Incremental:
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("Inc");break;
|
2000-08-23 11:02:19 +00:00
|
|
|
case eReflowReason_Resize:
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("Rsz");break;
|
2000-08-23 11:02:19 +00:00
|
|
|
case eReflowReason_StyleChange:
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("Sty");break;
|
2000-08-23 11:02:19 +00:00
|
|
|
case eReflowReason_Dirty:
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("Drt ");
|
2000-08-23 11:02:19 +00:00
|
|
|
break;
|
2000-10-28 22:17:53 +00:00
|
|
|
default:printf("<unknown>%d", aReflowState.reason);break;
|
2000-08-23 11:02:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
printSize("AW", aReflowState.availableWidth);
|
|
|
|
printSize("AH", aReflowState.availableHeight);
|
|
|
|
printSize("CW", aReflowState.mComputedWidth);
|
|
|
|
printSize("CH", aReflowState.mComputedHeight);
|
|
|
|
|
2000-10-28 22:17:53 +00:00
|
|
|
printf(" *\n");
|
2000-08-23 11:02:19 +00:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
aStatus = NS_FRAME_COMPLETE;
|
1999-04-12 21:48:21 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
// create the layout state
|
2000-04-03 03:55:38 +00:00
|
|
|
nsBoxLayoutState state(aPresContext, aReflowState, aDesiredSize);
|
1999-04-12 21:48:21 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
// coelesce reflows if we are root.
|
2000-04-25 07:10:48 +00:00
|
|
|
state.HandleReflow(this);
|
2000-04-05 23:02:29 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsSize computedSize(aReflowState.mComputedWidth,aReflowState.mComputedHeight);
|
1999-09-13 20:24:20 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsMargin m;
|
|
|
|
m = aReflowState.mComputedBorderPadding;
|
1999-09-13 20:24:20 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
//GetBorderAndPadding(m);
|
1999-08-30 22:32:25 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
// 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;
|
|
|
|
}
|
1999-09-13 20:24:20 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsSize prefSize(0,0);
|
1999-09-13 20:24:20 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
// if we are told to layout intrinic then get our preferred size.
|
|
|
|
if (computedSize.width == NS_INTRINSICSIZE || computedSize.height == NS_INTRINSICSIZE) {
|
2000-04-05 00:19:00 +00:00
|
|
|
nsSize minSize(0,0);
|
|
|
|
nsSize maxSize(0,0);
|
2000-03-31 07:02:06 +00:00
|
|
|
GetPrefSize(state, prefSize);
|
|
|
|
GetMinSize(state, minSize);
|
|
|
|
GetMaxSize(state, maxSize);
|
|
|
|
BoundsCheck(minSize, prefSize, maxSize);
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
// get our desiredSize
|
2000-08-17 20:08:44 +00:00
|
|
|
if (aReflowState.mComputedWidth == NS_INTRINSICSIZE) {
|
2000-08-24 13:19:57 +00:00
|
|
|
computedSize.width = prefSize.width;
|
2000-08-17 20:08:44 +00:00
|
|
|
} else {
|
|
|
|
computedSize.width += m.left + m.right;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-08-17 20:08:44 +00:00
|
|
|
if (aReflowState.mComputedHeight == NS_INTRINSICSIZE) {
|
2000-08-24 13:19:57 +00:00
|
|
|
computedSize.height = prefSize.height;
|
2000-08-17 20:08:44 +00:00
|
|
|
} else {
|
|
|
|
computedSize.height += m.top + m.bottom;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-10-07 00:49:08 +00:00
|
|
|
// handle reflow state min and max sizes
|
|
|
|
|
|
|
|
if (computedSize.width > aReflowState.mComputedMaxWidth)
|
|
|
|
computedSize.width = aReflowState.mComputedMaxWidth;
|
|
|
|
|
|
|
|
if (computedSize.height > aReflowState.mComputedMaxHeight)
|
|
|
|
computedSize.height = aReflowState.mComputedMaxHeight;
|
|
|
|
|
|
|
|
if (computedSize.width < aReflowState.mComputedMinWidth)
|
|
|
|
computedSize.width = aReflowState.mComputedMinWidth;
|
|
|
|
|
|
|
|
if (computedSize.height < aReflowState.mComputedMinHeight)
|
|
|
|
computedSize.height = aReflowState.mComputedMinHeight;
|
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
nsRect r(mRect.x, mRect.y, computedSize.width, computedSize.height);
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
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 = r.height;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
// getting the ascent could be a lot of work. Don't get it if
|
|
|
|
// we are the root. The viewport doesn't care about it.
|
|
|
|
if (!(mState & NS_STATE_IS_ROOT))
|
|
|
|
GetAscent(state, ascent);
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
aDesiredSize.width = r.width;
|
|
|
|
aDesiredSize.height = r.height;
|
|
|
|
aDesiredSize.ascent = ascent;
|
|
|
|
aDesiredSize.descent = 0;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-04-05 00:19:00 +00:00
|
|
|
// max sure the max element size reflects
|
|
|
|
// our min width
|
2000-06-23 02:28:01 +00:00
|
|
|
nsSize* maxElementSize = nsnull;
|
|
|
|
state.GetMaxElementSize(&maxElementSize);
|
|
|
|
if (maxElementSize)
|
2000-04-05 00:19:00 +00:00
|
|
|
{
|
|
|
|
nsSize minSize(0,0);
|
2000-06-23 02:28:01 +00:00
|
|
|
GetMinSize(state, minSize);
|
2000-08-17 20:08:44 +00:00
|
|
|
|
|
|
|
if (mRect.width > minSize.width) {
|
|
|
|
if (aReflowState.mComputedWidth == NS_INTRINSICSIZE) {
|
|
|
|
maxElementSize->width = minSize.width;
|
|
|
|
} else {
|
|
|
|
maxElementSize->width = mRect.width;
|
|
|
|
}
|
|
|
|
} else {
|
2000-06-23 02:28:01 +00:00
|
|
|
maxElementSize->width = mRect.width;
|
2000-08-17 20:08:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (mRect.height > minSize.height) {
|
|
|
|
if (aReflowState.mComputedHeight == NS_INTRINSICSIZE) {
|
|
|
|
maxElementSize->height = minSize.height;
|
|
|
|
} else {
|
|
|
|
maxElementSize->height = mRect.height;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
maxElementSize->height = mRect.height;
|
|
|
|
}
|
2000-04-05 00:19:00 +00:00
|
|
|
}
|
2000-08-23 11:02:19 +00:00
|
|
|
#ifdef DO_NOISY_REFLOW
|
|
|
|
{
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("%p ** nsBF(done) W:%d H:%d ", this, aDesiredSize.width, aDesiredSize.height);
|
2000-08-23 11:02:19 +00:00
|
|
|
|
|
|
|
if (maxElementSize) {
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("MW:%d MH:%d\n", maxElementSize->width, maxElementSize->height);
|
2000-08-23 11:02:19 +00:00
|
|
|
} else {
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("MW:? MH:?\n");
|
2000-08-23 11:02:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
#endif
|
2000-04-05 00:19:00 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
1999-04-12 21:48:21 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetPrefSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
1999-03-27 01:35:55 +00:00
|
|
|
{
|
2000-06-06 01:25:03 +00:00
|
|
|
if (!DoesNeedRecalc(mPrefSize)) {
|
|
|
|
aSize = mPrefSize;
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
2000-02-25 04:18:34 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PropagateDebug(aBoxLayoutState);
|
1999-03-27 01:35:55 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult rv = NS_OK;
|
2000-06-06 01:25:03 +00:00
|
|
|
rv = nsContainerBox::GetPrefSize(aBoxLayoutState, mPrefSize);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-06-06 01:25:03 +00:00
|
|
|
aSize = mPrefSize;
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
1999-10-21 20:17:51 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetAscent(nsBoxLayoutState& aBoxLayoutState, nscoord& aAscent)
|
|
|
|
{
|
2000-06-06 01:25:03 +00:00
|
|
|
if (!DoesNeedRecalc(mAscent)) {
|
|
|
|
aAscent = mAscent;
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
1999-07-23 23:30:17 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PropagateDebug(aBoxLayoutState);
|
1999-07-23 23:30:17 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult rv = NS_OK;
|
2000-06-06 01:25:03 +00:00
|
|
|
rv = nsContainerBox::GetAscent(aBoxLayoutState, mAscent);
|
1999-07-23 23:30:17 +00:00
|
|
|
|
2000-06-06 01:25:03 +00:00
|
|
|
aAscent = mAscent;
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
1999-07-23 23:30:17 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetMinSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
|
|
|
{
|
2000-06-06 01:25:03 +00:00
|
|
|
if (!DoesNeedRecalc(mMinSize)) {
|
|
|
|
aSize = mMinSize;
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
1999-07-23 23:30:17 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PropagateDebug(aBoxLayoutState);
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult rv = NS_OK;
|
2000-02-10 21:36:28 +00:00
|
|
|
|
2000-06-06 01:25:03 +00:00
|
|
|
mMinSize.SizeTo(0,0);
|
|
|
|
rv = nsContainerBox::GetMinSize(aBoxLayoutState, mMinSize);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
2000-06-06 01:25:03 +00:00
|
|
|
aSize = mMinSize;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
return rv;
|
|
|
|
}
|
1999-07-23 23:30:17 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetMaxSize(nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
|
|
|
|
{
|
2000-06-06 01:25:03 +00:00
|
|
|
if (!DoesNeedRecalc(mMaxSize)) {
|
|
|
|
aSize = mMaxSize;
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
1999-07-23 23:30:17 +00:00
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
/*
|
|
|
|
// @@@ hack to fix bug in xbl where it won't set flex -EDV
|
|
|
|
if ((mState & NS_FRAME_FIRST_REFLOW) && !mInner->mAttributesCached) {
|
|
|
|
mInner->CacheAttributes();
|
|
|
|
mInner->mAttributesCached = PR_TRUE;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PropagateDebug(aBoxLayoutState);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult rv = NS_OK;
|
1999-07-23 00:11:21 +00:00
|
|
|
|
2000-06-06 01:25:03 +00:00
|
|
|
mMaxSize.SizeTo(0,0);
|
|
|
|
nsContainerBox::GetMaxSize(aBoxLayoutState, mMaxSize);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
2000-06-06 01:25:03 +00:00
|
|
|
aSize = mMaxSize;
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
return rv;
|
1999-03-27 01:35:55 +00:00
|
|
|
}
|
|
|
|
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
NS_IMETHODIMP
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrame::GetFlex(nsBoxLayoutState& aBoxLayoutState, nscoord& aFlex)
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
{
|
2000-06-06 01:25:03 +00:00
|
|
|
if (!DoesNeedRecalc(mFlex)) {
|
|
|
|
aFlex = mFlex;
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult rv = NS_OK;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-06-06 01:25:03 +00:00
|
|
|
mFlex = 0;
|
|
|
|
rv = nsContainerBox::GetFlex(aBoxLayoutState, mFlex);
|
|
|
|
aFlex = mFlex;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
return rv;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
|
|
|
void
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrame::PropagateDebug(nsBoxLayoutState& aState)
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
// propagate debug information
|
|
|
|
if (mState & NS_STATE_DEBUG_WAS_SET) {
|
|
|
|
if (mState & NS_STATE_SET_TO_DEBUG)
|
|
|
|
SetDebug(aState, PR_TRUE);
|
|
|
|
else
|
|
|
|
SetDebug(aState, PR_FALSE);
|
|
|
|
} else if (mState & NS_STATE_IS_ROOT) {
|
|
|
|
SetDebug(aState, nsBoxFrameInner::gDebug);
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
}
|
|
|
|
|
1999-03-27 01:35:55 +00:00
|
|
|
NS_IMETHODIMP
|
2000-07-07 22:24:06 +00:00
|
|
|
nsBoxFrame::BeginLayout(nsBoxLayoutState& aState)
|
1999-03-27 01:35:55 +00:00
|
|
|
{
|
2000-06-23 05:15:04 +00:00
|
|
|
|
2000-07-07 22:24:06 +00:00
|
|
|
nsresult rv = nsContainerBox::BeginLayout(aState);
|
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
// mark ourselves as dirty so no child under us
|
|
|
|
// can post an incremental layout.
|
|
|
|
mState |= NS_FRAME_HAS_DIRTY_CHILDREN;
|
2000-03-31 07:02:06 +00:00
|
|
|
PropagateDebug(aState);
|
2000-07-07 22:24:06 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
return rv;
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-07-07 22:24:06 +00:00
|
|
|
/**
|
|
|
|
* If subclassing please subclass this method not layout.
|
|
|
|
* layout will call this method.
|
|
|
|
*/
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::DoLayout(nsBoxLayoutState& aState)
|
|
|
|
{
|
|
|
|
return nsContainerBox::DoLayout(aState);
|
|
|
|
}
|
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
nsBoxFrame::Valignment
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
nsBoxFrameInner::GetVAlign()
|
|
|
|
{
|
|
|
|
return mValign;
|
|
|
|
}
|
|
|
|
|
2000-02-14 01:42:09 +00:00
|
|
|
nsBoxFrame::Halignment
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
nsBoxFrameInner::GetHAlign()
|
|
|
|
{
|
|
|
|
return mHalign;
|
|
|
|
}
|
|
|
|
|
2000-02-17 04:10:02 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::Destroy(nsIPresContext* aPresContext)
|
|
|
|
{
|
|
|
|
// if we are root remove 1 from the debug count.
|
2000-03-02 03:01:30 +00:00
|
|
|
if (mState & NS_STATE_IS_ROOT)
|
2000-03-31 07:02:06 +00:00
|
|
|
mInner->GetDebugPref(aPresContext);
|
2000-04-18 00:17:00 +00:00
|
|
|
|
|
|
|
SetLayoutManager(nsnull);
|
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
// recycle the Inner via the shell's arena.
|
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
|
|
|
aPresContext->GetShell(getter_AddRefs(shell));
|
|
|
|
mInner->Recycle(shell);
|
|
|
|
mInner = nsnull;
|
2000-02-17 04:10:02 +00:00
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
return nsContainerFrame::Destroy(aPresContext);
|
2000-02-17 04:10:02 +00:00
|
|
|
}
|
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
NS_IMETHODIMP
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrame::SetDebug(nsBoxLayoutState& aState, PRBool aDebug)
|
2000-03-02 03:01:30 +00:00
|
|
|
{
|
|
|
|
// see if our state matches the given debug state
|
|
|
|
PRBool debugSet = mState & NS_STATE_CURRENTLY_IN_DEBUG;
|
|
|
|
PRBool debugChanged = (!aDebug && debugSet) || (aDebug && !debugSet);
|
|
|
|
|
|
|
|
// if it doesn't then tell each child below us the new debug state
|
|
|
|
if (debugChanged)
|
|
|
|
{
|
|
|
|
if (aDebug) {
|
|
|
|
mState |= NS_STATE_CURRENTLY_IN_DEBUG;
|
|
|
|
} else {
|
|
|
|
mState &= ~NS_STATE_CURRENTLY_IN_DEBUG;
|
|
|
|
}
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
SetDebugOnChildList(aState, mFirstChild, aDebug);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NeedsRecalc();
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::NeedsRecalc()
|
2000-03-02 03:01:30 +00:00
|
|
|
{
|
2000-04-18 00:17:00 +00:00
|
|
|
if (mInner) {
|
2000-06-06 01:25:03 +00:00
|
|
|
SizeNeedsRecalc(mPrefSize);
|
|
|
|
SizeNeedsRecalc(mMinSize);
|
|
|
|
SizeNeedsRecalc(mMaxSize);
|
|
|
|
CoordNeedsRecalc(mFlex);
|
|
|
|
CoordNeedsRecalc(mAscent);
|
2000-04-18 00:17:00 +00:00
|
|
|
}
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::RemoveFrame(nsIPresContext* aPresContext,
|
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aOldFrame)
|
|
|
|
{
|
|
|
|
SanityCheck(mFrames);
|
|
|
|
|
|
|
|
// remove child from our info list
|
2000-04-18 00:17:00 +00:00
|
|
|
nsBoxLayoutState state(aPresContext);
|
|
|
|
Remove(state, aOldFrame);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
// remove the child frame
|
|
|
|
mFrames.DestroyFrame(aPresContext, aOldFrame);
|
|
|
|
|
|
|
|
SanityCheck(mFrames);
|
|
|
|
|
|
|
|
// mark us dirty and generate a reflow command
|
|
|
|
MarkDirtyChildren(state);
|
|
|
|
MarkDirty(state);
|
|
|
|
return NS_OK;
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
1999-05-09 21:46:24 +00:00
|
|
|
NS_IMETHODIMP
|
1999-11-24 06:03:41 +00:00
|
|
|
nsBoxFrame::InsertFrames(nsIPresContext* aPresContext,
|
1999-05-09 21:46:24 +00:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aPrevFrame,
|
|
|
|
nsIFrame* aFrameList)
|
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
SanityCheck(mFrames);
|
|
|
|
|
|
|
|
nsIBox* prevBox = GetBox(aPrevFrame);
|
|
|
|
if (prevBox == nsnull && aPrevFrame != nsnull) {
|
2001-05-23 03:23:31 +00:00
|
|
|
printf("Warning prev sibling is not in our list!!!\n");
|
2000-03-31 07:02:06 +00:00
|
|
|
aPrevFrame = nsnull;
|
|
|
|
}
|
1999-11-18 21:05:43 +00:00
|
|
|
|
1999-12-02 01:07:27 +00:00
|
|
|
// insert the frames to our info list
|
2000-04-18 00:17:00 +00:00
|
|
|
nsBoxLayoutState state(aPresContext);
|
|
|
|
Insert(state, aPrevFrame, aFrameList);
|
2001-09-25 22:17:00 +00:00
|
|
|
|
1999-12-02 01:07:27 +00:00
|
|
|
// insert the frames in out regular frame list
|
2000-02-16 23:00:52 +00:00
|
|
|
mFrames.InsertFrames(this, aPrevFrame, aFrameList);
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
// if we are in debug make sure our children are in debug as well.
|
|
|
|
if (mState & NS_STATE_CURRENTLY_IN_DEBUG)
|
2000-03-31 07:02:06 +00:00
|
|
|
SetDebugOnChildList(state, mFirstChild, PR_TRUE);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2001-09-25 22:17:00 +00:00
|
|
|
CheckFrameOrder();
|
2000-03-31 07:02:06 +00:00
|
|
|
SanityCheck(mFrames);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
1999-11-18 21:05:43 +00:00
|
|
|
// mark us dirty and generate a reflow command
|
2000-03-31 07:02:06 +00:00
|
|
|
MarkDirtyChildren(state);
|
|
|
|
MarkDirty(state);
|
|
|
|
return NS_OK;
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
1999-05-09 21:46:24 +00:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
1999-11-24 06:03:41 +00:00
|
|
|
nsBoxFrame::AppendFrames(nsIPresContext* aPresContext,
|
1999-05-09 21:46:24 +00:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aFrameList)
|
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
SanityCheck(mFrames);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
|
|
|
// append them after
|
2000-04-18 00:17:00 +00:00
|
|
|
nsBoxLayoutState state(aPresContext);
|
|
|
|
Append(state,aFrameList);
|
1999-05-18 04:06:52 +00:00
|
|
|
|
1999-12-02 01:07:27 +00:00
|
|
|
// append in regular frames
|
2000-02-16 23:00:52 +00:00
|
|
|
mFrames.AppendFrames(this, aFrameList);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
// if we are in debug make sure our children are in debug as well.
|
|
|
|
if (mState & NS_STATE_CURRENTLY_IN_DEBUG)
|
2000-03-31 07:02:06 +00:00
|
|
|
SetDebugOnChildList(state, mFirstChild, PR_TRUE);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2001-09-25 22:17:00 +00:00
|
|
|
CheckFrameOrder();
|
2000-03-31 07:02:06 +00:00
|
|
|
SanityCheck(mFrames);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
MarkDirtyChildren(state);
|
|
|
|
MarkDirty(state);
|
|
|
|
return NS_OK;
|
1999-05-09 21:46:24 +00:00
|
|
|
}
|
|
|
|
|
1999-03-27 01:35:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
1999-05-09 21:46:24 +00:00
|
|
|
nsBoxFrame::AttributeChanged(nsIPresContext* aPresContext,
|
|
|
|
nsIContent* aChild,
|
1999-10-15 23:16:45 +00:00
|
|
|
PRInt32 aNameSpaceID,
|
1999-05-09 21:46:24 +00:00
|
|
|
nsIAtom* aAttribute,
|
2001-08-25 02:01:08 +00:00
|
|
|
PRInt32 aModType,
|
1999-05-09 21:46:24 +00:00
|
|
|
PRInt32 aHint)
|
1999-03-27 01:35:55 +00:00
|
|
|
{
|
2000-09-01 00:59:09 +00:00
|
|
|
nsresult rv = nsContainerFrame::AttributeChanged(aPresContext, aChild,
|
2001-08-25 02:01:08 +00:00
|
|
|
aNameSpaceID, aAttribute, aModType, aHint);
|
1999-05-09 21:46:24 +00:00
|
|
|
|
2001-09-25 22:17:00 +00:00
|
|
|
if (aAttribute == nsXULAtoms::ordinal) {
|
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
|
|
|
aPresContext->GetShell(getter_AddRefs(shell));
|
|
|
|
nsBoxLayoutState state(shell);
|
|
|
|
|
|
|
|
nsIBox* parent;
|
|
|
|
GetParentBox(&parent);
|
|
|
|
parent->RelayoutChildAtOrdinal(state, this);
|
|
|
|
nsIFrame* parentFrame;
|
|
|
|
parent->GetFrame(&parentFrame);
|
|
|
|
nsBoxFrame* parentBoxFrame = (nsBoxFrame*) parentFrame;
|
|
|
|
if (parentBoxFrame)
|
|
|
|
parentBoxFrame->CheckFrameOrder();
|
|
|
|
parent->MarkDirty(state);
|
|
|
|
} else if (aAttribute == nsHTMLAtoms::width ||
|
2000-02-25 04:18:34 +00:00
|
|
|
aAttribute == nsHTMLAtoms::height ||
|
|
|
|
aAttribute == nsHTMLAtoms::align ||
|
|
|
|
aAttribute == nsHTMLAtoms::valign ||
|
2000-09-01 01:38:04 +00:00
|
|
|
aAttribute == nsHTMLAtoms::left ||
|
|
|
|
aAttribute == nsHTMLAtoms::top ||
|
2000-02-25 04:18:34 +00:00
|
|
|
aAttribute == nsXULAtoms::flex ||
|
|
|
|
aAttribute == nsXULAtoms::orient ||
|
2001-09-19 01:56:03 +00:00
|
|
|
aAttribute == nsXULAtoms::pack ||
|
2001-08-15 06:06:54 +00:00
|
|
|
aAttribute == nsXULAtoms::dir ||
|
107642 - XUL syntax/cleanup landing. Fixes 94470, 96008, 96019, 76800, 102637, 80399, 108303, and removes over a thousand unnecessary or nonsensical attributes. Also fixes 108302, 102366, 102367, 105815. r=sspitzer,cmanske on appropriate parts sr=ben
2001-11-03 04:17:02 +00:00
|
|
|
aAttribute == nsXULAtoms::equalsize) {
|
2000-02-25 04:18:34 +00:00
|
|
|
|
2001-09-19 01:56:03 +00:00
|
|
|
if (aAttribute == nsXULAtoms::orient || aAttribute == nsXULAtoms::dir ||
|
|
|
|
aAttribute == nsXULAtoms::debug || aAttribute == nsHTMLAtoms::align ||
|
|
|
|
aAttribute == nsHTMLAtoms::valign || aAttribute == nsXULAtoms::pack) {
|
2001-08-04 06:21:59 +00:00
|
|
|
mInner->mValign = nsBoxFrame::vAlign_Top;
|
2000-02-25 04:18:34 +00:00
|
|
|
mInner->mHalign = nsBoxFrame::hAlign_Left;
|
|
|
|
|
2001-03-06 02:27:50 +00:00
|
|
|
PRBool orient = PR_TRUE;
|
2000-02-25 04:18:34 +00:00
|
|
|
GetInitialOrientation(orient);
|
|
|
|
if (orient)
|
2001-03-06 02:27:50 +00:00
|
|
|
mState |= NS_STATE_IS_HORIZONTAL;
|
|
|
|
else
|
|
|
|
mState &= ~NS_STATE_IS_HORIZONTAL;
|
2001-08-02 00:09:27 +00:00
|
|
|
|
2001-08-15 04:09:41 +00:00
|
|
|
PRBool normal = PR_TRUE;
|
|
|
|
GetInitialDirection(normal);
|
|
|
|
if (normal)
|
|
|
|
mState |= NS_STATE_IS_DIRECTION_NORMAL;
|
|
|
|
else
|
|
|
|
mState &= ~NS_STATE_IS_DIRECTION_NORMAL;
|
|
|
|
|
2001-08-02 00:09:27 +00:00
|
|
|
GetInitialVAlignment(mInner->mValign);
|
|
|
|
GetInitialHAlignment(mInner->mHalign);
|
|
|
|
|
2000-06-23 05:15:04 +00:00
|
|
|
PRBool equalSize = PR_FALSE;
|
|
|
|
GetInitialEqualSize(equalSize);
|
|
|
|
if (equalSize)
|
|
|
|
mState |= NS_STATE_EQUAL_SIZE;
|
|
|
|
else
|
|
|
|
mState &= ~NS_STATE_EQUAL_SIZE;
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PRBool debug = mState & NS_STATE_SET_TO_DEBUG;
|
|
|
|
PRBool debugSet = mInner->GetInitialDebug(debug);
|
|
|
|
if (debugSet) {
|
|
|
|
mState |= NS_STATE_DEBUG_WAS_SET;
|
|
|
|
if (debug)
|
|
|
|
mState |= NS_STATE_SET_TO_DEBUG;
|
|
|
|
else
|
|
|
|
mState &= ~NS_STATE_SET_TO_DEBUG;
|
|
|
|
} else {
|
|
|
|
mState &= ~NS_STATE_DEBUG_WAS_SET;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PRBool autostretch = mState & NS_STATE_AUTO_STRETCH;
|
|
|
|
GetInitialAutoStretch(autostretch);
|
|
|
|
if (autostretch)
|
|
|
|
mState |= NS_STATE_AUTO_STRETCH;
|
|
|
|
else
|
|
|
|
mState &= ~NS_STATE_AUTO_STRETCH;
|
|
|
|
}
|
2000-02-14 01:42:09 +00:00
|
|
|
|
2001-09-06 01:07:40 +00:00
|
|
|
if (aAttribute == nsHTMLAtoms::left || aAttribute == nsHTMLAtoms::top)
|
|
|
|
mState &= ~NS_STATE_STACK_NOT_POSITIONED;
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
|
|
|
aPresContext->GetShell(getter_AddRefs(shell));
|
|
|
|
nsBoxLayoutState state(aPresContext);
|
|
|
|
MarkDirty(state);
|
|
|
|
}
|
|
|
|
|
1999-03-27 01:35:55 +00:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetInset(nsMargin& margin)
|
1999-07-23 00:11:21 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
margin.SizeTo(0,0,0,0);
|
|
|
|
|
|
|
|
if (mState & NS_STATE_CURRENTLY_IN_DEBUG) {
|
|
|
|
nsMargin debugMargin(0,0,0,0);
|
|
|
|
nsMargin debugBorder(0,0,0,0);
|
|
|
|
nsMargin debugPadding(0,0,0,0);
|
|
|
|
mInner->GetDebugBorder(debugBorder);
|
|
|
|
mInner->PixelMarginToTwips(mInner->mPresContext, debugBorder);
|
|
|
|
mInner->GetDebugMargin(debugMargin);
|
|
|
|
mInner->PixelMarginToTwips(mInner->mPresContext, debugMargin);
|
|
|
|
mInner->GetDebugMargin(debugPadding);
|
|
|
|
mInner->PixelMarginToTwips(mInner->mPresContext, debugPadding);
|
|
|
|
margin += debugBorder;
|
|
|
|
margin += debugMargin;
|
|
|
|
margin += debugPadding;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
1999-05-09 21:46:24 +00:00
|
|
|
}
|
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
#ifdef DEBUG_COELESCED
|
2000-04-25 07:10:48 +00:00
|
|
|
static PRInt32 StyleCoelesced = 0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
PRBool
|
|
|
|
nsBoxFrame::HasStyleChange()
|
|
|
|
{
|
|
|
|
return mState & NS_STATE_STYLE_CHANGE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
nsBoxFrame::SetStyleChangeFlag(PRBool aDirty)
|
|
|
|
{
|
2000-05-15 04:12:31 +00:00
|
|
|
nsBox::SetStyleChangeFlag(aDirty);
|
|
|
|
|
2000-04-25 07:10:48 +00:00
|
|
|
if (aDirty)
|
2000-05-15 04:12:31 +00:00
|
|
|
mState |= (NS_STATE_STYLE_CHANGE);
|
2000-04-25 07:10:48 +00:00
|
|
|
else
|
|
|
|
mState &= ~NS_STATE_STYLE_CHANGE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsBoxFrame::SyncLayout(nsBoxLayoutState& aState)
|
|
|
|
{
|
|
|
|
nsresult rv = nsBox::SyncLayout(aState);
|
|
|
|
mState &= ~(NS_STATE_STYLE_CHANGE);
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2001-09-25 22:17:00 +00:00
|
|
|
void
|
|
|
|
nsBoxFrame::CheckFrameOrder()
|
|
|
|
{
|
|
|
|
if (mOrderBoxes) {
|
|
|
|
// synchronize the frame order with the box order by simply walking
|
|
|
|
// the box list and linking each frame as its box is linked
|
|
|
|
nsIBox* box = mFirstChild;
|
|
|
|
nsIFrame* frame1;
|
|
|
|
box->GetFrame(&frame1);
|
|
|
|
|
|
|
|
nsIBox* box2;
|
|
|
|
nsIFrame* frame;
|
|
|
|
nsIFrame* frame2;
|
|
|
|
while (box) {
|
|
|
|
box->GetNextBox(&box2);
|
|
|
|
box->GetFrame(&frame);
|
|
|
|
if (box2)
|
|
|
|
box2->GetFrame(&frame2);
|
|
|
|
else
|
|
|
|
frame2 = nsnull;
|
|
|
|
frame->SetNextSibling(frame2);
|
|
|
|
box = box2;
|
|
|
|
}
|
|
|
|
|
|
|
|
mFrames.SetFrames(frame1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
void
|
|
|
|
nsBoxFrameInner::GetDebugPref(nsIPresContext* aPresContext)
|
|
|
|
{
|
|
|
|
gDebug = PR_FALSE;
|
2000-09-13 23:57:52 +00:00
|
|
|
nsCOMPtr<nsIPref> pref(do_GetService(NS_PREF_CONTRACTID));
|
2000-03-31 07:02:06 +00:00
|
|
|
if (pref) {
|
|
|
|
pref->GetBoolPref("xul.debug.box", &gDebug);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
NS_IMETHODIMP
|
2001-09-19 12:35:19 +00:00
|
|
|
nsBoxFrame::Paint(nsIPresContext* aPresContext,
|
|
|
|
nsIRenderingContext& aRenderingContext,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
nsFramePaintLayer aWhichLayer,
|
|
|
|
PRUint32 aFlags)
|
2000-09-01 00:59:09 +00:00
|
|
|
{
|
2001-05-31 22:19:43 +00:00
|
|
|
const nsStyleVisibility* vis =
|
|
|
|
(const nsStyleVisibility*)mStyleContext->GetStyleData(eStyleStruct_Visibility);
|
2000-09-01 00:59:09 +00:00
|
|
|
|
2001-05-31 22:19:43 +00:00
|
|
|
// if collapsed nothing is drawn
|
|
|
|
if (vis->mVisible == NS_STYLE_VISIBILITY_COLLAPSE)
|
|
|
|
return NS_OK;
|
2000-09-01 00:59:09 +00:00
|
|
|
|
|
|
|
if (NS_FRAME_IS_UNFLOWABLE & mState) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2001-04-25 19:52:49 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIAtom> frameType;
|
|
|
|
GetFrameType(getter_AddRefs(frameType));
|
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) {
|
2001-05-31 22:19:43 +00:00
|
|
|
if (vis->IsVisible() && mRect.width && mRect.height) {
|
2000-09-01 00:59:09 +00:00
|
|
|
// Paint our background and border
|
|
|
|
PRIntn skipSides = GetSkipSides();
|
2001-05-31 22:19:43 +00:00
|
|
|
const nsStyleBackground* color = (const nsStyleBackground*)
|
|
|
|
mStyleContext->GetStyleData(eStyleStruct_Background);
|
2001-02-07 09:57:26 +00:00
|
|
|
const nsStyleBorder* border = (const nsStyleBorder*)
|
|
|
|
mStyleContext->GetStyleData(eStyleStruct_Border);
|
|
|
|
const nsStyleOutline* outline = (const nsStyleOutline*)
|
|
|
|
mStyleContext->GetStyleData(eStyleStruct_Outline);
|
2000-09-01 00:59:09 +00:00
|
|
|
|
|
|
|
nsRect rect(0, 0, mRect.width, mRect.height);
|
|
|
|
nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this,
|
2001-02-07 09:57:26 +00:00
|
|
|
aDirtyRect, rect, *color, *border, 0, 0);
|
2000-09-01 00:59:09 +00:00
|
|
|
nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this,
|
2001-02-07 09:57:26 +00:00
|
|
|
aDirtyRect, rect, *border, mStyleContext, skipSides);
|
2000-09-01 00:59:09 +00:00
|
|
|
nsCSSRendering::PaintOutline(aPresContext, aRenderingContext, this,
|
2001-02-07 09:57:26 +00:00
|
|
|
aDirtyRect, rect, *border, *outline, mStyleContext, 0);
|
2000-09-01 00:59:09 +00:00
|
|
|
|
|
|
|
// The sole purpose of this is to trigger display
|
|
|
|
// of the selection window for Named Anchors,
|
|
|
|
// which don't have any children and normally don't
|
|
|
|
// have any size, but in Editor we use CSS to display
|
|
|
|
// an image to represent this "hidden" element.
|
|
|
|
if (!mFrames.FirstChild())
|
|
|
|
{
|
|
|
|
nsFrame::Paint(aPresContext,
|
|
|
|
aRenderingContext, aDirtyRect, aWhichLayer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-04-25 19:52:49 +00:00
|
|
|
if (frameType.get() == nsLayoutAtoms::rootFrame) {
|
|
|
|
// We are wrapping the root frame of a XUL document. We
|
|
|
|
// need to check the pres shell to find out if painting is locked
|
|
|
|
// down (because we're still in the early stages of document
|
|
|
|
// and frame construction. If painting is locked down, then we
|
|
|
|
// do not paint our children.
|
|
|
|
PRBool paintingSuppressed = PR_FALSE;
|
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
|
|
|
aPresContext->GetShell(getter_AddRefs(shell));
|
|
|
|
shell->IsPaintingSuppressed(&paintingSuppressed);
|
|
|
|
if (paintingSuppressed)
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
// Now paint the kids. Note that child elements have the opportunity to
|
|
|
|
// override the visibility property and display even if their parent is
|
|
|
|
// hidden
|
|
|
|
|
|
|
|
PaintChildren(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
|
|
|
|
|
|
|
// see if we have to draw a selection frame around this container
|
|
|
|
return nsFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Redefined to handle collapsed as well as removing unneeded crap having to
|
|
|
|
* do with frame state and overlapping that only applied to HTML not XUL
|
|
|
|
*/
|
1999-09-10 00:57:01 +00:00
|
|
|
void
|
1999-11-24 06:03:41 +00:00
|
|
|
nsBoxFrame::PaintChild(nsIPresContext* aPresContext,
|
2001-09-19 12:35:19 +00:00
|
|
|
nsIRenderingContext& aRenderingContext,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
nsIFrame* aFrame,
|
|
|
|
nsFramePaintLayer aWhichLayer,
|
|
|
|
PRUint32 aFlags)
|
1999-09-10 00:57:01 +00:00
|
|
|
{
|
2001-05-31 22:19:43 +00:00
|
|
|
const nsStyleVisibility* vis;
|
|
|
|
aFrame->GetStyleData(eStyleStruct_Visibility, ((const nsStyleStruct *&)vis));
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
// if collapsed don't paint the child.
|
2001-05-31 22:19:43 +00:00
|
|
|
if (vis->mVisible == NS_STYLE_VISIBILITY_COLLAPSE)
|
2000-09-01 00:59:09 +00:00
|
|
|
return;
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
nsIView *pView;
|
|
|
|
aFrame->GetView(aPresContext, &pView);
|
|
|
|
if (nsnull == pView) {
|
|
|
|
nsRect kidRect;
|
|
|
|
aFrame->GetRect(kidRect);
|
|
|
|
|
|
|
|
nsRect damageArea;
|
|
|
|
PRBool overlap;
|
|
|
|
// Compute the intersection of the dirty rect and the childs
|
|
|
|
// rect (both are in our coordinate space). This limits the
|
|
|
|
// damageArea to just the portion that intersects the childs
|
|
|
|
// rect.
|
|
|
|
overlap = damageArea.IntersectRect(aDirtyRect, kidRect);
|
|
|
|
|
|
|
|
if (overlap) {
|
|
|
|
// Translate damage area into the kids coordinate
|
|
|
|
// system. Translate rendering context into the kids
|
|
|
|
// coordinate system.
|
|
|
|
damageArea.x -= kidRect.x;
|
|
|
|
damageArea.y -= kidRect.y;
|
|
|
|
aRenderingContext.Translate(kidRect.x, kidRect.y);
|
|
|
|
|
|
|
|
// Paint the kid
|
|
|
|
aFrame->Paint(aPresContext, aRenderingContext, damageArea, aWhichLayer);
|
|
|
|
// don't use PushState and PopState, because they're slow
|
|
|
|
aRenderingContext.Translate(-kidRect.x, -kidRect.y);
|
|
|
|
}
|
|
|
|
}
|
1999-09-10 00:57:01 +00:00
|
|
|
}
|
|
|
|
|
2000-02-25 04:18:34 +00:00
|
|
|
void
|
|
|
|
nsBoxFrame::PaintChildren(nsIPresContext* aPresContext,
|
2001-09-19 12:35:19 +00:00
|
|
|
nsIRenderingContext& aRenderingContext,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
nsFramePaintLayer aWhichLayer,
|
|
|
|
PRUint32 aFlags)
|
2000-02-25 04:18:34 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
nsMargin debugBorder;
|
|
|
|
nsMargin debugMargin;
|
|
|
|
nsMargin debugPadding;
|
|
|
|
nsMargin border;
|
|
|
|
nscoord onePixel;
|
|
|
|
nsRect inner;
|
|
|
|
|
2000-04-25 07:10:48 +00:00
|
|
|
GetBorder(border);
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (mState & NS_STATE_CURRENTLY_IN_DEBUG)
|
|
|
|
{
|
|
|
|
PRBool isHorizontal = IsHorizontal();
|
|
|
|
|
|
|
|
float p2t;
|
|
|
|
aPresContext->GetScaledPixelsToTwips(&p2t);
|
|
|
|
onePixel = NSIntPixelsToTwips(1, p2t);
|
|
|
|
|
|
|
|
mInner->GetDebugBorder(debugBorder);
|
|
|
|
mInner->PixelMarginToTwips(aPresContext, debugBorder);
|
|
|
|
|
|
|
|
mInner->GetDebugMargin(debugMargin);
|
|
|
|
mInner->PixelMarginToTwips(aPresContext, debugMargin);
|
|
|
|
|
|
|
|
mInner->GetDebugPadding(debugPadding);
|
|
|
|
mInner->PixelMarginToTwips(aPresContext, debugPadding);
|
|
|
|
|
|
|
|
GetContentRect(inner);
|
|
|
|
inner.Deflate(debugMargin);
|
|
|
|
inner.Deflate(border);
|
2000-04-25 07:10:48 +00:00
|
|
|
//nsRect borderRect(inner);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
nscolor color;
|
|
|
|
if (isHorizontal) {
|
|
|
|
color = NS_RGB(0,0,255);
|
|
|
|
} else {
|
|
|
|
color = NS_RGB(255,0,0);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRenderingContext.SetColor(color);
|
|
|
|
|
|
|
|
//left
|
|
|
|
nsRect r(inner);
|
|
|
|
r.width = debugBorder.left;
|
|
|
|
aRenderingContext.FillRect(r);
|
|
|
|
|
|
|
|
// top
|
|
|
|
r = inner;
|
|
|
|
r.height = debugBorder.top;
|
|
|
|
aRenderingContext.FillRect(r);
|
|
|
|
|
|
|
|
//right
|
|
|
|
r = inner;
|
|
|
|
r.x = r.x + r.width - debugBorder.right;
|
|
|
|
r.width = debugBorder.right;
|
|
|
|
aRenderingContext.FillRect(r);
|
|
|
|
|
|
|
|
//bottom
|
|
|
|
r = inner;
|
|
|
|
r.y = r.y + r.height - debugBorder.bottom;
|
|
|
|
r.height = debugBorder.bottom;
|
|
|
|
aRenderingContext.FillRect(r);
|
2000-05-15 04:12:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
// if we have dirty children or we are dirty
|
|
|
|
// place a green border around us.
|
|
|
|
PRBool dirty = PR_FALSE;
|
|
|
|
IsDirty(dirty);
|
|
|
|
PRBool dirtyc = PR_FALSE;
|
|
|
|
HasDirtyChildren(dirtyc);
|
|
|
|
|
|
|
|
if (dirty || dirtyc) {
|
|
|
|
IsDirty(dirty);
|
|
|
|
HasDirtyChildren(dirty);
|
|
|
|
|
|
|
|
nsRect dirtyr(inner);
|
|
|
|
aRenderingContext.SetColor(NS_RGB(0,255,0));
|
|
|
|
aRenderingContext.DrawRect(dirtyr);
|
|
|
|
aRenderingContext.SetColor(color);
|
|
|
|
}
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-02-25 04:18:34 +00:00
|
|
|
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
|
|
|
mStyleContext->GetStyleData(eStyleStruct_Display);
|
|
|
|
|
|
|
|
// Child elements have the opportunity to override the visibility property
|
|
|
|
// of their parent and display even if the parent is hidden
|
|
|
|
PRBool clipState;
|
|
|
|
|
|
|
|
nsRect r(0,0,mRect.width, mRect.height);
|
|
|
|
PRBool hasClipped = PR_FALSE;
|
|
|
|
|
|
|
|
// If overflow is hidden then set the clip rect so that children
|
|
|
|
// don't leak out of us
|
|
|
|
if (NS_STYLE_OVERFLOW_HIDDEN == disp->mOverflow) {
|
|
|
|
nsMargin im(0,0,0,0);
|
|
|
|
GetInset(im);
|
|
|
|
r.Deflate(im);
|
|
|
|
r.Deflate(border);
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsIBox* kid = nsnull;
|
|
|
|
GetChildBox(&kid);
|
2000-02-25 04:18:34 +00:00
|
|
|
while (nsnull != kid) {
|
2000-03-31 07:02:06 +00:00
|
|
|
nsIFrame* frame = nsnull;
|
|
|
|
kid->GetFrame(&frame);
|
|
|
|
|
2000-02-25 04:18:34 +00:00
|
|
|
if (!hasClipped && NS_STYLE_OVERFLOW_HIDDEN == disp->mOverflow) {
|
|
|
|
// if we haven't already clipped and we should
|
|
|
|
// check to see if the child is in out bounds. If not then
|
|
|
|
// we begin clipping.
|
|
|
|
nsRect cr(0,0,0,0);
|
2000-03-31 07:02:06 +00:00
|
|
|
kid->GetBounds(cr);
|
2000-02-25 04:18:34 +00:00
|
|
|
|
|
|
|
// if our rect does not contain the childs then begin clipping
|
|
|
|
if (!r.Contains(cr)) {
|
|
|
|
aRenderingContext.PushState();
|
|
|
|
aRenderingContext.SetClipRect(r,
|
|
|
|
nsClipCombine_kIntersect, clipState);
|
|
|
|
hasClipped = PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PaintChild(aPresContext, aRenderingContext, aDirtyRect, frame, aWhichLayer);
|
|
|
|
|
|
|
|
kid->GetNextBox(&kid);
|
2000-02-25 04:18:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (hasClipped) {
|
|
|
|
aRenderingContext.PopState(clipState);
|
|
|
|
}
|
1999-09-14 22:17:19 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (mState & NS_STATE_CURRENTLY_IN_DEBUG)
|
|
|
|
{
|
|
|
|
GetContentRect(r);
|
1999-08-27 06:06:39 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (NS_STYLE_OVERFLOW_HIDDEN == disp->mOverflow) {
|
|
|
|
mInner->GetDebugMargin(debugMargin);
|
|
|
|
mInner->PixelMarginToTwips(aPresContext, debugMargin);
|
|
|
|
r.Deflate(debugMargin);
|
|
|
|
}
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
hasClipped = PR_FALSE;
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
GetChildBox(&kid);
|
|
|
|
while (nsnull != kid) {
|
|
|
|
if (!hasClipped && NS_STYLE_OVERFLOW_HIDDEN == disp->mOverflow) {
|
|
|
|
// if we haven't already clipped and we should
|
|
|
|
// check to see if the child is in out bounds. If not then
|
|
|
|
// we begin clipping.
|
|
|
|
nsRect cr(0,0,0,0);
|
|
|
|
kid->GetBounds(cr);
|
|
|
|
|
|
|
|
// if our rect does not contain the childs then begin clipping
|
|
|
|
if (!r.Contains(cr)) {
|
|
|
|
aRenderingContext.PushState();
|
|
|
|
aRenderingContext.SetClipRect(r,
|
|
|
|
nsClipCombine_kIntersect, clipState);
|
|
|
|
hasClipped = PR_TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PRBool isHorizontal = IsHorizontal();
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2001-09-18 21:47:32 +00:00
|
|
|
nscoord x, y, borderSize, spacerSize;
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsRect cr(0,0,0,0);
|
|
|
|
kid->GetBounds(cr);
|
|
|
|
nsMargin margin;
|
|
|
|
kid->GetMargin(margin);
|
|
|
|
cr.Inflate(margin);
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
if (isHorizontal)
|
1999-09-10 00:57:01 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
cr.y = inner.y;
|
|
|
|
x = cr.x;
|
|
|
|
y = cr.y + onePixel;
|
2001-09-18 21:47:32 +00:00
|
|
|
spacerSize = debugBorder.top - onePixel*4;
|
1999-08-27 06:06:39 +00:00
|
|
|
} else {
|
2000-03-31 07:02:06 +00:00
|
|
|
cr.x = inner.x;
|
|
|
|
x = cr.y;
|
|
|
|
y = cr.x + onePixel;
|
2001-09-18 21:47:32 +00:00
|
|
|
spacerSize = debugBorder.left - onePixel*4;
|
1999-09-10 00:57:01 +00:00
|
|
|
}
|
1999-08-27 06:06:39 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxLayoutState state(aPresContext);
|
|
|
|
nscoord flex = 0;
|
|
|
|
kid->GetFlex(state, flex);
|
1999-08-27 06:06:39 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
PRBool isCollapsed = PR_FALSE;
|
|
|
|
kid->IsCollapsed(state, isCollapsed);
|
1999-08-27 06:06:39 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (!isCollapsed) {
|
|
|
|
aRenderingContext.SetColor(NS_RGB(255,255,255));
|
1999-08-27 06:06:39 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (isHorizontal)
|
|
|
|
borderSize = cr.width;
|
|
|
|
else
|
|
|
|
borderSize = cr.height;
|
|
|
|
|
2001-09-18 21:47:32 +00:00
|
|
|
mInner->DrawSpacer(aPresContext, aRenderingContext, isHorizontal, flex, x, y, borderSize, spacerSize);
|
1999-08-27 06:06:39 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
kid->GetNextBox(&kid);
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (hasClipped) {
|
|
|
|
aRenderingContext.PopState(clipState);
|
1999-09-10 00:57:01 +00:00
|
|
|
}
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
1999-07-23 00:11:21 +00:00
|
|
|
}
|
|
|
|
|
1999-05-09 21:46:24 +00:00
|
|
|
NS_IMETHODIMP_(nsrefcnt)
|
|
|
|
nsBoxFrame::AddRef(void)
|
1999-03-27 01:35:55 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP_(nsrefcnt)
|
|
|
|
nsBoxFrame::Release(void)
|
1999-05-09 21:46:24 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
1999-05-09 21:46:24 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_INTERFACE_MAP_BEGIN(nsBoxFrame)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIBox)
|
|
|
|
#ifdef NS_DEBUG
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIFrameDebug)
|
|
|
|
#endif
|
|
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIBox)
|
2000-09-01 00:59:09 +00:00
|
|
|
NS_INTERFACE_MAP_END_INHERITING(nsContainerFrame)
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetFrame(nsIFrame** aFrame)
|
1999-07-23 00:11:21 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
*aFrame = this;
|
|
|
|
return NS_OK;
|
1999-07-23 00:11:21 +00:00
|
|
|
}
|
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
void
|
|
|
|
nsBoxFrame::GetBoxName(nsAutoString& aName)
|
|
|
|
{
|
2001-09-15 00:45:54 +00:00
|
|
|
#ifdef DEBUG
|
2000-05-15 04:12:31 +00:00
|
|
|
GetFrameName(aName);
|
2001-09-15 00:45:54 +00:00
|
|
|
#endif
|
2000-05-15 04:12:31 +00:00
|
|
|
}
|
|
|
|
|
2001-09-15 00:45:54 +00:00
|
|
|
#ifdef DEBUG
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
2001-11-14 01:33:42 +00:00
|
|
|
nsBoxFrame::GetFrameName(nsAString& aResult) const
|
2000-03-31 07:02:06 +00:00
|
|
|
{
|
2001-11-14 01:33:42 +00:00
|
|
|
return MakeFrameName(NS_LITERAL_STRING("Box"), aResult);
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
2001-09-15 00:45:54 +00:00
|
|
|
#endif
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetDebug(PRBool& aDebug)
|
|
|
|
{
|
|
|
|
aDebug = (mState & NS_STATE_CURRENTLY_IN_DEBUG);
|
|
|
|
return NS_OK;
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
1999-09-10 00:57:01 +00:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
1999-10-26 04:44:41 +00:00
|
|
|
nsBoxFrame::GetFrameForPoint(nsIPresContext* aPresContext,
|
|
|
|
const nsPoint& aPoint,
|
2000-03-31 07:02:06 +00:00
|
|
|
nsFramePaintLayer aWhichLayer,
|
1999-09-10 00:57:01 +00:00
|
|
|
nsIFrame** aFrame)
|
|
|
|
{
|
2000-05-15 04:12:31 +00:00
|
|
|
|
|
|
|
if ((aWhichLayer != NS_FRAME_PAINT_LAYER_FOREGROUND))
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (!mRect.Contains(aPoint))
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2001-05-31 22:19:43 +00:00
|
|
|
const nsStyleVisibility* vis =
|
|
|
|
(const nsStyleVisibility*)mStyleContext->GetStyleData(eStyleStruct_Visibility);
|
|
|
|
if (vis->mVisible == NS_STYLE_VISIBILITY_COLLAPSE)
|
2000-05-15 04:12:31 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsIView* view = nsnull;
|
|
|
|
GetView(aPresContext, &view);
|
|
|
|
|
|
|
|
// get the debug frame.
|
|
|
|
if (view || (mState & NS_STATE_IS_ROOT))
|
|
|
|
{
|
|
|
|
nsIBox* box = nsnull;
|
|
|
|
if (NS_SUCCEEDED(GetDebugBoxAt(aPoint, &box)) && box)
|
|
|
|
{
|
|
|
|
PRBool isDebug = PR_FALSE;
|
|
|
|
box->GetDebug(isDebug);
|
|
|
|
if (isDebug) {
|
|
|
|
nsIFrame* frame = nsnull;
|
|
|
|
box->GetFrame(&frame);
|
|
|
|
*aFrame = frame;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
nsIFrame *kid, *hit = nsnull;
|
|
|
|
nsPoint tmp;
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
FirstChild(aPresContext, nsnull, &kid);
|
2000-03-31 07:02:06 +00:00
|
|
|
*aFrame = nsnull;
|
|
|
|
tmp.MoveTo(aPoint.x - mRect.x, aPoint.y - mRect.y);
|
2000-04-18 00:17:00 +00:00
|
|
|
while (nsnull != kid) {
|
|
|
|
// have we hit a child before
|
|
|
|
PRBool haveKid = (hit != nsnull);
|
|
|
|
nsresult rv = kid->GetFrameForPoint(aPresContext, tmp, aWhichLayer, &hit);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (NS_SUCCEEDED(rv) && hit) {
|
2000-04-18 00:17:00 +00:00
|
|
|
if (!haveKid)
|
|
|
|
*aFrame = hit;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// if the kid had a child before see if this child has mouse
|
|
|
|
// though.
|
|
|
|
PRBool isAdaptor = PR_FALSE;
|
|
|
|
nsCOMPtr<nsIBox> box = mInner->GetBoxForFrame(hit, isAdaptor);
|
|
|
|
if (box) {
|
|
|
|
PRBool mouseThrough = PR_FALSE;
|
|
|
|
box->GetMouseThrough(mouseThrough);
|
|
|
|
// if the child says it can never mouse though ignore it.
|
|
|
|
if (!mouseThrough)
|
|
|
|
*aFrame = hit;
|
|
|
|
}
|
|
|
|
}
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
kid->GetNextSibling(&kid);
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
if (*aFrame) {
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
2000-04-18 00:17:00 +00:00
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
// if no kids were hit then select us
|
2001-05-31 22:19:43 +00:00
|
|
|
if (vis->IsVisible()) {
|
2000-04-18 00:17:00 +00:00
|
|
|
*aFrame = this;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2000-04-12 02:59:26 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
nsIBox*
|
|
|
|
nsBoxFrameInner::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;
|
|
|
|
}
|
2000-04-12 02:59:26 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
start->GetNextBox(&start);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ibox;
|
|
|
|
}
|
2000-04-12 02:59:26 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
/*
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsBoxFrame::GetMouseThrough(PRBool& aMouseThrough)
|
|
|
|
{
|
|
|
|
const nsStyleColor* color = (const nsStyleColor*)
|
|
|
|
mStyleContext->GetStyleData(eStyleStruct_Color);
|
|
|
|
PRBool transparentBG = NS_STYLE_BG_COLOR_TRANSPARENT ==
|
|
|
|
(color->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT);
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
if (!transparentBG)
|
|
|
|
aMouseThrough = never;
|
|
|
|
else
|
|
|
|
return nsBox::GetMouseThrough(aMouseThrough);
|
2000-04-11 23:55:15 +00:00
|
|
|
|
2000-04-18 00:17:00 +00:00
|
|
|
return NS_OK;
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
2000-04-18 00:17:00 +00:00
|
|
|
*/
|
|
|
|
|
1999-10-20 00:46:21 +00:00
|
|
|
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
|
1999-10-12 00:16:06 +00:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
1999-11-24 06:03:41 +00:00
|
|
|
nsBoxFrame::GetCursor(nsIPresContext* aPresContext,
|
1999-10-12 00:16:06 +00:00
|
|
|
nsPoint& aPoint,
|
|
|
|
PRInt32& aCursor)
|
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
/*
|
|
|
|
#ifdef NS_DEBUG
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("Get Cursor: ");
|
2000-03-31 07:02:06 +00:00
|
|
|
nsFrame::ListTag(stdout, this);
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("\n");
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
#endif
|
|
|
|
*/
|
|
|
|
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
nsPoint newPoint;
|
|
|
|
mInner->TranslateEventCoords(aPresContext, aPoint, newPoint);
|
|
|
|
|
|
|
|
// if we are in debug and we are in the debug area
|
|
|
|
// return our own cursor and dump the debug information.
|
2000-03-02 03:01:30 +00:00
|
|
|
if (mState & NS_STATE_CURRENTLY_IN_DEBUG)
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult rv = mInner->DisplayDebugInfoFor(this, aPresContext, newPoint, aCursor);
|
|
|
|
if (rv == NS_OK)
|
|
|
|
return rv;
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
}
|
2000-03-31 07:02:06 +00:00
|
|
|
|
2000-09-01 00:59:09 +00:00
|
|
|
nsresult rv = nsContainerFrame::GetCursor(aPresContext, aPoint, aCursor);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
return rv;
|
1999-10-12 00:16:06 +00:00
|
|
|
}
|
|
|
|
|
2000-05-22 09:15:54 +00:00
|
|
|
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-09 22:02:40 +00:00
|
|
|
//XXX the event come's in in view relative coords, but really should
|
|
|
|
//be in frame relative coords by the time it hits our frame.
|
|
|
|
|
|
|
|
// Translate an point that is relative to our view (or a containing
|
|
|
|
// view) into a localized pixel coordinate that is relative to the
|
|
|
|
// content area of this frame (inside the border+padding).
|
|
|
|
void
|
|
|
|
nsBoxFrameInner::TranslateEventCoords(nsIPresContext* aPresContext,
|
|
|
|
const nsPoint& aPoint,
|
|
|
|
nsPoint& aResult)
|
|
|
|
{
|
|
|
|
nscoord x = aPoint.x;
|
|
|
|
nscoord y = aPoint.y;
|
|
|
|
|
|
|
|
// If we have a view then the event coordinates are already relative
|
|
|
|
// to this frame; otherwise we have to adjust the coordinates
|
|
|
|
// appropriately.
|
|
|
|
nsIView* view;
|
|
|
|
mOuter->GetView(aPresContext, &view);
|
|
|
|
if (nsnull == view) {
|
|
|
|
nsPoint offset;
|
|
|
|
mOuter->GetOffsetFromView(aPresContext, offset, &view);
|
|
|
|
if (nsnull != view) {
|
|
|
|
x -= offset.x;
|
|
|
|
y -= offset.y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
aResult.x = x;
|
|
|
|
aResult.y = y;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-10-12 00:16:06 +00:00
|
|
|
nsresult
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrame::GetContentOf(nsIContent** aContent)
|
1999-10-12 00:16:06 +00:00
|
|
|
{
|
|
|
|
// If we don't have a content node find a parent that does.
|
2000-03-31 07:02:06 +00:00
|
|
|
nsIFrame* frame;
|
|
|
|
GetFrame(&frame);
|
|
|
|
|
|
|
|
while(frame != nsnull) {
|
|
|
|
|
|
|
|
frame->GetContent(aContent);
|
1999-10-12 00:16:06 +00:00
|
|
|
if (*aContent != nsnull)
|
|
|
|
return NS_OK;
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
frame->GetParent(&frame);
|
1999-10-12 00:16:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
|
1999-10-12 00:16:06 +00:00
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
void*
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::operator new(size_t sz, nsIPresShell* aPresShell)
|
2000-03-02 03:01:30 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
return nsBoxLayoutState::Allocate(sz,aPresShell);
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::Recycle(nsIPresShell* aPresShell)
|
2000-03-02 03:01:30 +00:00
|
|
|
{
|
2000-04-18 00:17:00 +00:00
|
|
|
nsBoxLayoutState state(aPresShell);
|
|
|
|
mOuter->ClearChildren(state);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
delete this;
|
|
|
|
nsBoxLayoutState::RecycleFreedMemory(aPresShell, this);
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
// 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
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::operator delete(void* aPtr, size_t sz)
|
2000-03-02 03:01:30 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxLayoutState::Free(aPtr, sz);
|
2000-03-02 03:01:30 +00:00
|
|
|
}
|
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
/*
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
nsresult
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::PaintDebug(nsIBox* aBox,
|
|
|
|
nsIPresContext* aPresContext,
|
|
|
|
nsIRenderingContext& aRenderingContext,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
nsFramePaintLayer aWhichLayer)
|
|
|
|
|
2000-03-02 03:01:30 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
PRBool isHorizontal = mOuter->IsHorizontal();
|
|
|
|
|
|
|
|
float p2t;
|
|
|
|
aPresContext->GetScaledPixelsToTwips(&p2t);
|
|
|
|
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsMargin debugBorder(0,0,0,0);
|
|
|
|
nsMargin debugMargin(0,0,0,0);
|
|
|
|
nsMargin debugPadding(0,0,0,0);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
GetDebugBorder(debugBorder);
|
|
|
|
PixelMarginToTwips(aPresContext, debugBorder);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
GetDebugMargin(debugMargin);
|
|
|
|
PixelMarginToTwips(aPresContext, debugMargin);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
GetDebugPadding(debugPadding);
|
|
|
|
PixelMarginToTwips(aPresContext, debugPadding);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsRect inner(0,0,0,0);
|
|
|
|
aBox->GetContentRect(inner);
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
inner.Deflate(debugMargin);
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-04-25 07:10:48 +00:00
|
|
|
//nsRect borderRect(inner);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
nscolor color;
|
|
|
|
if (isHorizontal) {
|
|
|
|
color = NS_RGB(0,0,255);
|
|
|
|
} else {
|
|
|
|
color = NS_RGB(255,0,0);
|
|
|
|
}
|
|
|
|
|
|
|
|
//left
|
|
|
|
aRenderingContext.SetColor(color);
|
|
|
|
nsRect r(inner);
|
|
|
|
r.width = debugBorder.left;
|
|
|
|
aRenderingContext.FillRect(r);
|
|
|
|
|
|
|
|
// top
|
|
|
|
r = inner;
|
|
|
|
r.height = debugBorder.top;
|
|
|
|
aRenderingContext.FillRect(r);
|
|
|
|
|
|
|
|
//right
|
|
|
|
r = inner;
|
|
|
|
r.x = r.x + r.width - debugBorder.right;
|
|
|
|
r.width = debugBorder.right;
|
|
|
|
aRenderingContext.FillRect(r);
|
|
|
|
|
|
|
|
//bottom
|
|
|
|
r = inner;
|
|
|
|
r.y = r.y + r.height - debugBorder.bottom;
|
|
|
|
r.height = debugBorder.bottom;
|
|
|
|
aRenderingContext.FillRect(r);
|
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
// if we have dirty children or we are dirty
|
|
|
|
// place a green border around us.
|
|
|
|
PRBool dirty = PR_FALSE;
|
|
|
|
mOuter->IsDirty(dirty);
|
|
|
|
PRBool dirtyc = PR_FALSE;
|
|
|
|
mOuter->HasDirtyChildren(dirty);
|
|
|
|
|
|
|
|
if (dirty || dirtyc) {
|
|
|
|
nsRect dirtyr(inner);
|
|
|
|
aRenderingContext.SetColor(NS_RGB(0,255,0));
|
|
|
|
aRenderingContext.DrawRect(dirtyr);
|
|
|
|
}
|
|
|
|
|
2001-09-18 21:47:32 +00:00
|
|
|
// paint the spacers.
|
|
|
|
nscoord x, y, borderSize, spacerSize;
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
aRenderingContext.SetColor(NS_RGB(255,255,255));
|
|
|
|
|
|
|
|
if (isHorizontal)
|
|
|
|
{
|
|
|
|
x = inner.x;
|
|
|
|
y = inner.y + onePixel;
|
|
|
|
x += debugBorder.left;
|
2001-09-18 21:47:32 +00:00
|
|
|
spacerSize = debugBorder.top - onePixel*4;
|
2000-03-31 07:02:06 +00:00
|
|
|
} else {
|
|
|
|
x = inner.y;
|
|
|
|
y = inner.x + onePixel;
|
|
|
|
x += debugBorder.top;
|
2001-09-18 21:47:32 +00:00
|
|
|
spacerSize = debugBorder.left - onePixel*4;
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
nsIBox* box = nsnull;
|
|
|
|
aBox->GetChildBox(&box);
|
|
|
|
nsBoxLayoutState state(aPresContext);
|
|
|
|
|
|
|
|
while (box) {
|
|
|
|
nsSize size;
|
|
|
|
GetFrameSizeWithMargin(box, size);
|
|
|
|
PRBool isCollapsed = PR_FALSE;
|
|
|
|
box->IsCollapsed(state, isCollapsed);
|
|
|
|
|
|
|
|
if (!isCollapsed) {
|
|
|
|
if (isHorizontal)
|
|
|
|
borderSize = size.width;
|
|
|
|
else
|
|
|
|
borderSize = size.height;
|
|
|
|
|
2000-05-15 04:12:31 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
nscoord flex = 0;
|
|
|
|
box->GetFlex(state, flex);
|
|
|
|
|
2001-09-18 21:47:32 +00:00
|
|
|
DrawSpacer(aPresContext, aRenderingContext, isHorizontal, flex, x, y, borderSize, spacerSize);
|
2000-03-31 07:02:06 +00:00
|
|
|
x += borderSize;
|
|
|
|
}
|
|
|
|
box->GetNextBox(&box);
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
2000-05-15 04:12:31 +00:00
|
|
|
*/
|
2000-03-31 07:02:06 +00:00
|
|
|
|
1999-11-18 21:05:43 +00:00
|
|
|
void
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::DrawLine(nsIRenderingContext& aRenderingContext, PRBool aHorizontal, nscoord x1, nscoord y1, nscoord x2, nscoord y2)
|
1999-11-18 21:05:43 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
if (aHorizontal)
|
|
|
|
aRenderingContext.DrawLine(x1,y1,x2,y2);
|
|
|
|
else
|
|
|
|
aRenderingContext.DrawLine(y1,x1,y2,x2);
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
void
|
|
|
|
nsBoxFrameInner::FillRect(nsIRenderingContext& aRenderingContext, PRBool aHorizontal, nscoord x, nscoord y, nscoord width, nscoord height)
|
1999-11-18 21:05:43 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
if (aHorizontal)
|
|
|
|
aRenderingContext.FillRect(x,y,width,height);
|
|
|
|
else
|
|
|
|
aRenderingContext.FillRect(y,x,height,width);
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
void
|
2001-09-18 21:47:32 +00:00
|
|
|
nsBoxFrameInner::DrawSpacer(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, PRBool aHorizontal, PRInt32 flex, nscoord x, nscoord y, nscoord size, nscoord spacerSize)
|
2000-03-31 07:02:06 +00:00
|
|
|
{
|
|
|
|
float p2t;
|
|
|
|
aPresContext->GetScaledPixelsToTwips(&p2t);
|
|
|
|
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
// if we do draw the coils
|
|
|
|
int distance = 0;
|
|
|
|
int center = 0;
|
|
|
|
int offset = 0;
|
|
|
|
int coilSize = COIL_SIZE*onePixel;
|
2001-09-18 21:47:32 +00:00
|
|
|
int halfSpacer = spacerSize/2;
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
distance = size;
|
2001-09-18 21:47:32 +00:00
|
|
|
center = y + halfSpacer;
|
2000-03-31 07:02:06 +00:00
|
|
|
offset = x;
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
int coils = distance/coilSize;
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
int halfCoilSize = coilSize/2;
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (flex == 0) {
|
2001-09-18 21:47:32 +00:00
|
|
|
DrawLine(aRenderingContext, aHorizontal, x,y + spacerSize/2, x + size, y + spacerSize/2);
|
2000-03-31 07:02:06 +00:00
|
|
|
} else {
|
|
|
|
for (int i=0; i < coils; i++)
|
|
|
|
{
|
2001-09-18 21:47:32 +00:00
|
|
|
DrawLine(aRenderingContext, aHorizontal, offset, center+halfSpacer, offset+halfCoilSize, center-halfSpacer);
|
|
|
|
DrawLine(aRenderingContext, aHorizontal, offset+halfCoilSize, center-halfSpacer, offset+coilSize, center+halfSpacer);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
offset += coilSize;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-09-18 21:47:32 +00:00
|
|
|
FillRect(aRenderingContext, aHorizontal, x + size - spacerSize/2, y, spacerSize/2, spacerSize);
|
|
|
|
FillRect(aRenderingContext, aHorizontal, x, y, spacerSize/2, spacerSize);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2001-09-18 21:47:32 +00:00
|
|
|
//DrawKnob(aPresContext, aRenderingContext, x + size - spacerSize, y, spacerSize);
|
1999-12-02 01:07:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::GetDebugBorder(nsMargin& aInset)
|
1999-12-02 01:07:27 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
aInset.SizeTo(2,2,2,2);
|
|
|
|
|
|
|
|
if (mOuter->IsHorizontal())
|
|
|
|
aInset.top = 10;
|
|
|
|
else
|
|
|
|
aInset.left = 10;
|
1999-12-02 01:07:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::GetDebugMargin(nsMargin& aInset)
|
1999-12-02 01:07:27 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
aInset.SizeTo(2,2,2,2);
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::GetDebugPadding(nsMargin& aPadding)
|
1999-11-18 21:05:43 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
aPadding.SizeTo(2,2,2,2);
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
nsBoxFrameInner::PixelMarginToTwips(nsIPresContext* aPresContext, nsMargin& aMarginPixels)
|
1999-11-18 21:05:43 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
float p2t;
|
|
|
|
aPresContext->GetScaledPixelsToTwips(&p2t);
|
|
|
|
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
|
|
|
|
aMarginPixels.left *= onePixel;
|
|
|
|
aMarginPixels.right *= onePixel;
|
|
|
|
aMarginPixels.top *= onePixel;
|
|
|
|
aMarginPixels.bottom *= onePixel;
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
|
1999-11-18 21:05:43 +00:00
|
|
|
void
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::GetValue(nsIPresContext* aPresContext, const nsSize& a, const nsSize& b, char* ch)
|
1999-11-18 21:05:43 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
float p2t;
|
|
|
|
aPresContext->GetScaledPixelsToTwips(&p2t);
|
|
|
|
|
|
|
|
char width[100];
|
|
|
|
char height[100];
|
|
|
|
|
|
|
|
if (a.width == NS_INTRINSICSIZE)
|
|
|
|
sprintf(width,"%s","INF");
|
|
|
|
else
|
|
|
|
sprintf(width,"%d", nscoord(a.width/*/p2t*/));
|
|
|
|
|
|
|
|
if (a.height == NS_INTRINSICSIZE)
|
|
|
|
sprintf(height,"%s","INF");
|
1999-12-02 01:07:27 +00:00
|
|
|
else
|
2000-03-31 07:02:06 +00:00
|
|
|
sprintf(height,"%d", nscoord(a.height/*/p2t*/));
|
1999-12-02 01:07:27 +00:00
|
|
|
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
sprintf(ch, "(%s%s, %s%s)", width, (b.width != NS_INTRINSICSIZE ? "[SET]" : ""),
|
|
|
|
height, (b.height != NS_INTRINSICSIZE ? "[SET]" : ""));
|
1999-12-02 01:07:27 +00:00
|
|
|
|
1999-11-18 21:05:43 +00:00
|
|
|
}
|
|
|
|
|
1999-12-02 01:07:27 +00:00
|
|
|
void
|
2000-03-31 07:02:06 +00:00
|
|
|
nsBoxFrameInner::GetValue(nsIPresContext* aPresContext, PRInt32 a, PRInt32 b, char* ch)
|
1999-12-02 01:07:27 +00:00
|
|
|
{
|
2000-03-31 07:02:06 +00:00
|
|
|
if (a == NS_INTRINSICSIZE)
|
|
|
|
sprintf(ch, "%d[SET]", b);
|
|
|
|
else
|
|
|
|
sprintf(ch, "%d", a);
|
1999-12-02 01:07:27 +00:00
|
|
|
}
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult
|
|
|
|
nsBoxFrameInner::DisplayDebugInfoFor(nsIBox* aBox,
|
|
|
|
nsIPresContext* aPresContext,
|
|
|
|
nsPoint& aPoint,
|
|
|
|
PRInt32& aCursor)
|
|
|
|
{
|
|
|
|
nsBoxLayoutState state(aPresContext);
|
|
|
|
|
|
|
|
nscoord x = aPoint.x;
|
|
|
|
nscoord y = aPoint.y;
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsIFrame* ourFrame = nsnull;
|
|
|
|
aBox->GetFrame(&ourFrame);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
// get the area inside our border but not our debug margins.
|
|
|
|
nsRect insideBorder;
|
|
|
|
aBox->GetContentRect(insideBorder);
|
|
|
|
nsMargin border(0,0,0,0);
|
|
|
|
aBox->GetBorderAndPadding(border);
|
|
|
|
insideBorder.Deflate(border);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
PRBool isHorizontal = mOuter->IsHorizontal();
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
if (!insideBorder.Contains(nsPoint(x,y)))
|
|
|
|
return NS_ERROR_FAILURE;
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-10-28 22:17:53 +00:00
|
|
|
//printf("%%%%%% inside box %%%%%%%\n");
|
2000-02-14 01:42:09 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
int count = 0;
|
|
|
|
nsIBox* child = nsnull;
|
|
|
|
aBox->GetChildBox(&child);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsMargin m;
|
|
|
|
nsMargin m2;
|
|
|
|
GetDebugBorder(m);
|
|
|
|
PixelMarginToTwips(aPresContext, m);
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
GetDebugMargin(m2);
|
|
|
|
PixelMarginToTwips(aPresContext, m2);
|
|
|
|
|
|
|
|
m += m2;
|
|
|
|
|
|
|
|
if ((isHorizontal && y < insideBorder.y + m.top) ||
|
|
|
|
(!isHorizontal && x < insideBorder.x + m.left)) {
|
2000-10-28 22:17:53 +00:00
|
|
|
//printf("**** inside debug border *******\n");
|
2000-03-31 07:02:06 +00:00
|
|
|
while (child)
|
|
|
|
{
|
|
|
|
nsRect r;
|
|
|
|
child->GetBounds(r);
|
|
|
|
nsIFrame* childFrame = nsnull;
|
|
|
|
child->GetFrame(&childFrame);
|
|
|
|
|
2001-09-18 21:47:32 +00:00
|
|
|
// if we are not in the child. But in the spacer above the child.
|
2000-03-31 07:02:06 +00:00
|
|
|
if ((isHorizontal && x >= r.x && x < r.x + r.width) ||
|
|
|
|
(!isHorizontal && y >= r.y && y < r.y + r.height)) {
|
|
|
|
aCursor = NS_STYLE_CURSOR_POINTER;
|
|
|
|
// found it but we already showed it.
|
|
|
|
if (mDebugChild == child)
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content;
|
|
|
|
ourFrame->GetContent(getter_AddRefs(content));
|
1999-12-02 01:07:27 +00:00
|
|
|
|
2000-06-02 22:15:09 +00:00
|
|
|
if (content) {
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("---------------\n");
|
2000-06-02 22:15:09 +00:00
|
|
|
mOuter->DumpBox(stdout);
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("\n");
|
2000-03-31 07:02:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
childFrame->GetContent(getter_AddRefs(content));
|
|
|
|
|
|
|
|
if (content) {
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("child #%d: ", count);
|
2000-06-02 22:15:09 +00:00
|
|
|
child->DumpBox(stdout);
|
2000-10-28 22:17:53 +00:00
|
|
|
printf("\n");
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
mDebugChild = child;
|
|
|
|
|
|
|
|
nsSize prefSizeCSS(NS_INTRINSICSIZE, NS_INTRINSICSIZE);
|
|
|
|
nsSize minSizeCSS (NS_INTRINSICSIZE, NS_INTRINSICSIZE);
|
|
|
|
nsSize maxSizeCSS (NS_INTRINSICSIZE, NS_INTRINSICSIZE);
|
|
|
|
nscoord flexCSS = NS_INTRINSICSIZE;
|
|
|
|
|
|
|
|
nsSize prefSize(0, 0);
|
|
|
|
nsSize minSize (0, 0);
|
|
|
|
nsSize maxSize (NS_INTRINSICSIZE, NS_INTRINSICSIZE);
|
|
|
|
nscoord flexSize = 0;
|
2001-01-11 01:56:27 +00:00
|
|
|
nscoord ascentSize = 0;
|
1999-12-02 01:07:27 +00:00
|
|
|
|
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsIBox::AddCSSPrefSize(state, child, prefSizeCSS);
|
|
|
|
nsIBox::AddCSSMinSize (state, child, minSizeCSS);
|
|
|
|
nsIBox::AddCSSMaxSize (state, child, maxSizeCSS);
|
|
|
|
nsIBox::AddCSSFlex (state, child, flexCSS);
|
|
|
|
|
|
|
|
child->GetPrefSize(state, prefSize);
|
|
|
|
child->GetMinSize(state, minSize);
|
|
|
|
child->GetMaxSize(state, maxSize);
|
|
|
|
child->GetFlex(state, flexSize);
|
2001-01-11 01:56:27 +00:00
|
|
|
child->GetAscent(state, ascentSize);
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
char min[100];
|
|
|
|
char pref[100];
|
|
|
|
char max[100];
|
|
|
|
char calc[100];
|
|
|
|
char flex[100];
|
2001-01-11 01:56:27 +00:00
|
|
|
char ascent[100];
|
2000-03-31 07:02:06 +00:00
|
|
|
|
|
|
|
nsSize actualSize;
|
|
|
|
GetFrameSizeWithMargin(child, actualSize);
|
|
|
|
nsSize actualSizeCSS (NS_INTRINSICSIZE, NS_INTRINSICSIZE);
|
|
|
|
|
|
|
|
GetValue(aPresContext, minSize, minSizeCSS, min);
|
|
|
|
GetValue(aPresContext, prefSize, prefSizeCSS, pref);
|
|
|
|
GetValue(aPresContext, maxSize, maxSizeCSS, max);
|
|
|
|
GetValue(aPresContext, actualSize, actualSizeCSS, calc);
|
|
|
|
GetValue(aPresContext, flexSize, flexCSS, flex);
|
2001-01-11 01:56:27 +00:00
|
|
|
GetValue(aPresContext, ascentSize, NS_INTRINSICSIZE, ascent);
|
1999-11-18 21:05:43 +00:00
|
|
|
|
|
|
|
|
2001-01-11 01:56:27 +00:00
|
|
|
printf("min%s, pref%s, max%s, actual%s, flex=%s, ascent=%s\n\n",
|
2000-03-31 07:02:06 +00:00
|
|
|
min,
|
|
|
|
pref,
|
|
|
|
max,
|
|
|
|
calc,
|
2001-01-11 01:56:27 +00:00
|
|
|
flex,
|
|
|
|
ascent
|
2000-10-28 22:17:53 +00:00
|
|
|
);
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
1999-11-18 21:05:43 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
child->GetNextBox(&child);
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
}
|
1999-09-10 00:57:01 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
mDebugChild = nsnull;
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2000-03-02 03:01:30 +00:00
|
|
|
|
2000-03-31 07:02:06 +00:00
|
|
|
nsresult
|
|
|
|
nsBoxFrameInner::GetFrameSizeWithMargin(nsIBox* aBox, nsSize& aSize)
|
|
|
|
{
|
|
|
|
nsRect rect(0,0,0,0);
|
|
|
|
aBox->GetBounds(rect);
|
|
|
|
nsMargin margin(0,0,0,0);
|
|
|
|
aBox->GetMargin(margin);
|
|
|
|
rect.Inflate(margin);
|
|
|
|
aSize.width = rect.width;
|
|
|
|
aSize.height = rect.height;
|
|
|
|
return NS_OK;
|
2000-04-02 07:17:25 +00:00
|
|
|
}
|
2000-06-28 22:19:54 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Boxed don't support fixed positionioning of their children.
|
|
|
|
*/
|
|
|
|
nsresult
|
|
|
|
nsBoxFrame::CreateViewForFrame(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame* aFrame,
|
|
|
|
nsIStyleContext* aStyleContext,
|
|
|
|
PRBool aForce)
|
|
|
|
{
|
|
|
|
nsIView* view;
|
|
|
|
aFrame->GetView(aPresContext, &view);
|
|
|
|
// If we don't yet have a view, see if we need a view
|
|
|
|
if (nsnull == view) {
|
|
|
|
PRInt32 zIndex = 0;
|
|
|
|
PRBool autoZIndex = PR_FALSE;
|
|
|
|
PRBool fixedBackgroundAttachment = PR_FALSE;
|
|
|
|
|
2001-05-31 22:19:43 +00:00
|
|
|
const nsStyleBackground* bg = (const nsStyleBackground*)
|
|
|
|
aStyleContext->GetStyleData(eStyleStruct_Background);
|
|
|
|
const nsStyleVisibility* vis = (const nsStyleVisibility*)
|
|
|
|
aStyleContext->GetStyleData(eStyleStruct_Visibility);
|
2000-06-28 22:19:54 +00:00
|
|
|
|
2001-05-31 22:19:43 +00:00
|
|
|
if (vis->mOpacity != 1.0f) {
|
2000-06-28 22:19:54 +00:00
|
|
|
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
|
2001-05-31 22:19:43 +00:00
|
|
|
("nsBoxFrame::CreateViewForFrame: frame=%p opacity=%g",
|
|
|
|
aFrame, vis->mOpacity));
|
2000-06-28 22:19:54 +00:00
|
|
|
aForce = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// See if the frame has a fixed background attachment
|
2001-05-31 22:19:43 +00:00
|
|
|
if (NS_STYLE_BG_ATTACHMENT_FIXED == bg->mBackgroundAttachment) {
|
2000-06-28 22:19:54 +00:00
|
|
|
aForce = PR_TRUE;
|
|
|
|
fixedBackgroundAttachment = PR_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// See if the frame is a scrolled frame
|
|
|
|
if (!aForce) {
|
|
|
|
nsIAtom* pseudoTag;
|
|
|
|
aStyleContext->GetPseudoType(pseudoTag);
|
|
|
|
if (pseudoTag == nsLayoutAtoms::scrolledContentPseudo) {
|
|
|
|
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
|
2001-05-31 22:19:43 +00:00
|
|
|
("nsBoxFrame::CreateViewForFrame: scrolled frame=%p", aFrame));
|
2000-06-28 22:19:54 +00:00
|
|
|
aForce = PR_TRUE;
|
|
|
|
}
|
|
|
|
NS_IF_RELEASE(pseudoTag);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aForce) {
|
|
|
|
// Create a view
|
|
|
|
nsIFrame* parent;
|
|
|
|
|
|
|
|
aFrame->GetParentWithView(aPresContext, &parent);
|
|
|
|
NS_ASSERTION(parent, "GetParentWithView failed");
|
|
|
|
nsIView* parentView;
|
|
|
|
|
|
|
|
parent->GetView(aPresContext, &parentView);
|
|
|
|
NS_ASSERTION(parentView, "no parent with view");
|
|
|
|
|
|
|
|
// Create a view
|
|
|
|
static NS_DEFINE_IID(kViewCID, NS_VIEW_CID);
|
|
|
|
|
|
|
|
nsresult result = nsComponentManager::CreateInstance(kViewCID,
|
|
|
|
nsnull,
|
2001-01-04 20:44:42 +00:00
|
|
|
NS_GET_IID(nsIView),
|
2000-06-28 22:19:54 +00:00
|
|
|
(void **)&view);
|
|
|
|
if (NS_OK == result) {
|
|
|
|
nsIViewManager* viewManager;
|
|
|
|
parentView->GetViewManager(viewManager);
|
|
|
|
NS_ASSERTION(nsnull != viewManager, "null view manager");
|
|
|
|
|
|
|
|
// Initialize the view
|
|
|
|
nsRect bounds;
|
|
|
|
aFrame->GetRect(bounds);
|
|
|
|
view->Init(viewManager, bounds, parentView);
|
|
|
|
|
|
|
|
// If the frame has a fixed background attachment, then indicate that the
|
|
|
|
// view's contents should be repainted and not bitblt'd
|
|
|
|
if (fixedBackgroundAttachment) {
|
2001-12-01 14:31:45 +00:00
|
|
|
viewManager->SetViewBitBltEnabled(view, PR_FALSE);
|
2000-06-28 22:19:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Insert the view into the view hierarchy. If the parent view is a
|
|
|
|
// scrolling view we need to do this differently
|
|
|
|
nsIScrollableView* scrollingView;
|
2001-01-04 20:44:42 +00:00
|
|
|
if (NS_SUCCEEDED(parentView->QueryInterface(NS_GET_IID(nsIScrollableView), (void**)&scrollingView))) {
|
2000-06-28 22:19:54 +00:00
|
|
|
scrollingView->SetScrolledView(view);
|
|
|
|
} else {
|
2001-12-01 14:31:45 +00:00
|
|
|
viewManager->SetViewZIndex(view, autoZIndex, zIndex);
|
|
|
|
// XXX put view last in document order until we can do better
|
|
|
|
viewManager->InsertChild(parentView, view, nsnull, PR_TRUE);
|
2000-06-28 22:19:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// See if the view should be hidden
|
|
|
|
PRBool viewIsVisible = PR_TRUE;
|
2001-05-31 22:19:43 +00:00
|
|
|
PRBool viewHasTransparentContent = (bg->mBackgroundFlags &
|
2000-06-28 22:19:54 +00:00
|
|
|
NS_STYLE_BG_COLOR_TRANSPARENT) == NS_STYLE_BG_COLOR_TRANSPARENT;
|
|
|
|
|
2001-05-31 22:19:43 +00:00
|
|
|
if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) {
|
2000-06-28 22:19:54 +00:00
|
|
|
viewIsVisible = PR_FALSE;
|
|
|
|
}
|
2001-05-31 22:19:43 +00:00
|
|
|
else if (NS_STYLE_VISIBILITY_HIDDEN == vis->mVisible) {
|
2000-06-28 22:19:54 +00:00
|
|
|
// If it has a widget, hide the view because the widget can't deal with it
|
|
|
|
nsIWidget* widget = nsnull;
|
|
|
|
view->GetWidget(widget);
|
|
|
|
if (widget) {
|
|
|
|
viewIsVisible = PR_FALSE;
|
|
|
|
NS_RELEASE(widget);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// If it's a container element, then leave the view visible, but
|
|
|
|
// mark it as having transparent content. The reason we need to
|
|
|
|
// do this is that child elements can override their parent's
|
|
|
|
// hidden visibility and be visible anyway.
|
|
|
|
//
|
|
|
|
// Because this function is called before processing the content
|
|
|
|
// object's child elements, we can't tell if it's a leaf by looking
|
|
|
|
// at whether the frame has any child frames
|
|
|
|
nsCOMPtr<nsIContent> content;
|
|
|
|
PRBool result = PR_FALSE;
|
|
|
|
|
|
|
|
aFrame->GetContent(getter_AddRefs(content));
|
|
|
|
if (content) {
|
|
|
|
content->CanContainChildren(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (result) {
|
|
|
|
// The view needs to be visible, but marked as having transparent
|
|
|
|
// content
|
|
|
|
viewHasTransparentContent = PR_TRUE;
|
|
|
|
} else {
|
|
|
|
// Go ahead and hide the view
|
|
|
|
viewIsVisible = PR_FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (viewIsVisible) {
|
|
|
|
if (viewHasTransparentContent) {
|
|
|
|
viewManager->SetViewContentTransparency(view, PR_TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
2001-12-01 14:31:45 +00:00
|
|
|
viewManager->SetViewVisibility(view, nsViewVisibility_kHide);
|
2000-06-28 22:19:54 +00:00
|
|
|
}
|
|
|
|
|
2001-05-31 22:19:43 +00:00
|
|
|
viewManager->SetViewOpacity(view, vis->mOpacity);
|
2000-06-28 22:19:54 +00:00
|
|
|
NS_RELEASE(viewManager);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remember our view
|
|
|
|
aFrame->SetView(aPresContext, view);
|
|
|
|
|
|
|
|
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
|
|
|
|
("nsBoxFrame::CreateViewForFrame: frame=%p view=%p",
|
|
|
|
aFrame));
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2001-10-09 21:02:29 +00:00
|
|
|
|
|
|
|
|