diff --git a/layout/mathml/base/src/nsMathMLmtableFrame.cpp b/layout/mathml/base/src/nsMathMLmtableFrame.cpp new file mode 100644 index 000000000000..03a4703f36e3 --- /dev/null +++ b/layout/mathml/base/src/nsMathMLmtableFrame.cpp @@ -0,0 +1,179 @@ +/* + * The contents of this file are subject to the Mozilla 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/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +#include "nsCOMPtr.h" +#include "nsHTMLParts.h" +#include "nsIHTMLContent.h" +#include "nsFrame.h" +#include "nsAreaFrame.h" +#include "nsLineLayout.h" +#include "nsHTMLIIDs.h" +#include "nsIPresContext.h" +#include "nsHTMLAtoms.h" +#include "nsUnitConversion.h" +#include "nsIStyleContext.h" +#include "nsStyleConsts.h" +#include "nsStyleChangeList.h" +#include "nsINameSpaceManager.h" +#include "nsIRenderingContext.h" +#include "nsIFontMetrics.h" +#include "nsStyleUtil.h" + +#include "nsMathMLmtableFrame.h" + +// +// -- table or matrix - implementation +// + +// -------- +// implementation of nsMathMLmtableOuterFrame + +nsresult +NS_NewMathMLmtableOuterFrame (nsIPresShell* aPresShell, nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmtableOuterFrame* it = new (aPresShell) nsMathMLmtableOuterFrame; + if (!it) + return NS_ERROR_OUT_OF_MEMORY; + + *aNewFrame = it; + return NS_OK; + +} + +nsMathMLmtableOuterFrame::nsMathMLmtableOuterFrame() + :nsTableOuterFrame() +{ +} + +nsMathMLmtableOuterFrame::~nsMathMLmtableOuterFrame() +{ +} + +NS_INTERFACE_MAP_BEGIN(nsMathMLmtableOuterFrame) + NS_INTERFACE_MAP_ENTRY(nsIMathMLFrame) +NS_INTERFACE_MAP_END_INHERITING(nsTableOuterFrame) + +NS_IMETHODIMP_(nsrefcnt) +nsMathMLmtableOuterFrame::AddRef(void) +{ + return NS_OK; +} + +NS_IMETHODIMP_(nsrefcnt) +nsMathMLmtableOuterFrame::Release(void) +{ + return NS_OK; +} + +NS_IMETHODIMP +nsMathMLmtableOuterFrame::Init(nsIPresContext* aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow) +{ + nsresult rv = nsTableOuterFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow); + + return rv; +} + +NS_IMETHODIMP +nsMathMLmtableOuterFrame::Reflow(nsIPresContext* aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) +{ + // we want to return a table that is centered about the axis + nsresult rv = nsTableOuterFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); + + nsStyleFont font; + mStyleContext->GetStyle(eStyleStruct_Font, font); + nsCOMPtr fm; + aPresContext->GetMetricsFor(font.mFont, getter_AddRefs(fm)); + + nscoord axisHeight; + GetAxisHeight(fm, axisHeight); + + // center about the axis + aDesiredSize.ascent = aDesiredSize.height/2 + axisHeight; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; + + // just make-up a bounding metrics + mBoundingMetrics.Clear(); + mBoundingMetrics.ascent = aDesiredSize.ascent; + mBoundingMetrics.descent = aDesiredSize.descent; + mBoundingMetrics.width = aDesiredSize.width; + mBoundingMetrics.leftBearing = 0; + mBoundingMetrics.rightBearing = aDesiredSize.width; + + aDesiredSize.mBoundingMetrics = mBoundingMetrics; + return rv; +} + +// -------- +// implementation of nsMathMLmtdFrame + +nsresult +NS_NewMathMLmtdFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) +{ + NS_PRECONDITION(aNewFrame, "null OUT ptr"); + if (nsnull == aNewFrame) { + return NS_ERROR_NULL_POINTER; + } + nsMathMLmtdFrame* it = new (aPresShell) nsMathMLmtdFrame; + if (nsnull == it) { + return NS_ERROR_OUT_OF_MEMORY; + } +// XXX RBS - what about mFlags ? +// it->SetFlags(NS_AREA_WRAP_SIZE); ? + *aNewFrame = it; + return NS_OK; +} + +nsMathMLmtdFrame::nsMathMLmtdFrame() +{ +} + +nsMathMLmtdFrame::~nsMathMLmtdFrame() +{ +} + +NS_IMETHODIMP +nsMathMLmtdFrame::Reflow(nsIPresContext* aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus) + +{ + nsresult rv = NS_OK; + + // Let the base class do the reflow + rv = nsAreaFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); + + // more about and later + // ... + + return rv; +} diff --git a/layout/mathml/base/src/nsMathMLmtableFrame.h b/layout/mathml/base/src/nsMathMLmtableFrame.h new file mode 100644 index 000000000000..ede966b11421 --- /dev/null +++ b/layout/mathml/base/src/nsMathMLmtableFrame.h @@ -0,0 +1,199 @@ +/* + * The contents of this file are subject to the Mozilla 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/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is Mozilla MathML Project. + * + * The Initial Developer of the Original Code is The University Of + * Queensland. Portions created by The University Of Queensland are + * Copyright (C) 1999 The University Of Queensland. All Rights Reserved. + * + * Contributor(s): + * Roger B. Sidje + */ + +#ifndef nsMathMLmtableFrame_h___ +#define nsMathMLmtableFrame_h___ + +#include "nsCOMPtr.h" +#include "nsTableOuterFrame.h" +#include "nsMathMLContainerFrame.h" + +// +// -- table or matrix +// + +class nsMathMLmtableOuterFrame : public nsTableOuterFrame, + public nsIMathMLFrame +{ +public: + friend nsresult NS_NewMathMLmtableOuterFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame); + + NS_DECL_ISUPPORTS + + // nsIMathMLFrame methods -- see documentation in nsIMathMLFrame.h + + NS_IMETHOD + GetBoundingMetrics(nsBoundingMetrics& aBoundingMetrics) + { + aBoundingMetrics = mBoundingMetrics; + return NS_OK; + } + + NS_IMETHOD + SetBoundingMetrics(const nsBoundingMetrics& aBoundingMetrics) + { + mBoundingMetrics = aBoundingMetrics; + return NS_OK; + } + + NS_IMETHOD + GetReference(nsPoint& aReference) + { + aReference = mReference; + return NS_OK; + } + + NS_IMETHOD + SetReference(const nsPoint& aReference) + { + mReference = aReference; + return NS_OK; + } + + NS_IMETHOD + Stretch(nsIPresContext* aPresContext, + nsIRenderingContext& aRenderingContext, + nsStretchDirection aStretchDirection, + nsBoundingMetrics& aContainerSize, + nsHTMLReflowMetrics& aDesiredStretchSize) + { + return NS_OK; + } + + NS_IMETHOD + Place(nsIPresContext* aPresContext, + nsIRenderingContext& aRenderingContext, + PRBool aPlaceOrigin, + nsHTMLReflowMetrics& aDesiredSize) + { + return NS_OK; + } + + NS_IMETHOD + EmbellishOperator() + { + return NS_OK; + } + + NS_IMETHOD + GetEmbellishData(nsEmbellishData& aEmbellishData) + { + aEmbellishData = mEmbellishData; + return NS_OK; + } + + NS_IMETHOD + SetEmbellishData(const nsEmbellishData& aEmbellishData) + { + mEmbellishData = aEmbellishData; + return NS_OK; + } + + NS_IMETHOD + GetPresentationData(nsPresentationData& aPresentationData) + { + aPresentationData = mPresentationData; + return NS_OK; + } + + NS_IMETHOD + SetPresentationData(const nsPresentationData& aPresentationData) + { + mPresentationData = aPresentationData; + return NS_OK; + } + + NS_IMETHOD + UpdatePresentationData(PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle, + PRBool aCompressed) + { + return NS_OK; + } + + NS_IMETHOD + UpdatePresentationDataFromChildAt(PRInt32 aIndex, + PRInt32 aScriptLevelIncrement, + PRBool aDisplayStyle, + PRBool aCompressed) + { + return NS_OK; + } + + NS_IMETHOD + Init(nsIPresContext* aPresContext, + nsIContent* aContent, + nsIFrame* aParent, + nsIStyleContext* aContext, + nsIFrame* aPrevInFlow); + + NS_IMETHOD + Reflow(nsIPresContext* aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + + static void + GetAxisHeight (nsIFontMetrics *fm, + nscoord& axisHeight) + { + fm->GetXHeight (axisHeight); + axisHeight = NSToCoordRound (250.000f/430.556f * axisHeight); + } + +protected: + nsMathMLmtableOuterFrame(); + virtual ~nsMathMLmtableOuterFrame(); + + // information about the presentation policy of the frame + nsPresentationData mPresentationData; + + // information about a container that is an embellished operator + nsEmbellishData mEmbellishData; + + // Metrics that _exactly_ enclose the text of the frame + nsBoundingMetrics mBoundingMetrics; + + // Reference point of the frame: mReference.y is the baseline + nsPoint mReference; +}; // class nsMathMLmtableOuterFrame + + +// -------------- + +class nsMathMLmtdFrame : public nsAreaFrame { +public: + friend nsresult NS_NewMathMLmtdFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame); + + NS_IMETHOD + Reflow(nsIPresContext* aPresContext, + nsHTMLReflowMetrics& aDesiredSize, + const nsHTMLReflowState& aReflowState, + nsReflowStatus& aStatus); + +protected: + nsMathMLmtdFrame(); + virtual ~nsMathMLmtdFrame(); + + virtual PRIntn GetSkipSides() const { return 0; } +}; // class nsMathMLmtdFrame + +#endif /* nsMathMLmtableFrame_h___ */