nsMathMLmtableFrame.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #ifndef nsMathMLmtableFrame_h___
  6. #define nsMathMLmtableFrame_h___
  7. #include "mozilla/Attributes.h"
  8. #include "nsMathMLContainerFrame.h"
  9. #include "nsBlockFrame.h"
  10. #include "nsTableWrapperFrame.h"
  11. #include "nsTableRowFrame.h"
  12. #include "nsTableCellFrame.h"
  13. //
  14. // <mtable> -- table or matrix
  15. //
  16. class nsMathMLmtableWrapperFrame : public nsTableWrapperFrame,
  17. public nsMathMLFrame
  18. {
  19. public:
  20. friend nsContainerFrame*
  21. NS_NewMathMLmtableOuterFrame(nsIPresShell* aPresShell,
  22. nsStyleContext* aContext);
  23. NS_DECL_QUERYFRAME
  24. NS_DECL_FRAMEARENA_HELPERS
  25. // overloaded nsTableWrapperFrame methods
  26. virtual void
  27. Reflow(nsPresContext* aPresContext,
  28. ReflowOutput& aDesiredSize,
  29. const ReflowInput& aReflowInput,
  30. nsReflowStatus& aStatus) override;
  31. virtual nsresult
  32. AttributeChanged(int32_t aNameSpaceID,
  33. nsIAtom* aAttribute,
  34. int32_t aModType) override;
  35. virtual bool IsFrameOfType(uint32_t aFlags) const override
  36. {
  37. return nsTableWrapperFrame::IsFrameOfType(aFlags & ~(nsIFrame::eMathML));
  38. }
  39. protected:
  40. explicit nsMathMLmtableWrapperFrame(nsStyleContext* aContext)
  41. : nsTableWrapperFrame(aContext) {}
  42. virtual ~nsMathMLmtableWrapperFrame();
  43. // helper to find the row frame at a given index, positive or negative, e.g.,
  44. // 1..n means the first row down to the last row, -1..-n means the last row
  45. // up to the first row. Used for alignments that are relative to a given row
  46. nsIFrame*
  47. GetRowFrameAt(int32_t aRowIndex);
  48. }; // class nsMathMLmtableWrapperFrame
  49. // --------------
  50. class nsMathMLmtableFrame : public nsTableFrame
  51. {
  52. public:
  53. NS_DECL_QUERYFRAME_TARGET(nsMathMLmtableFrame)
  54. NS_DECL_QUERYFRAME
  55. NS_DECL_FRAMEARENA_HELPERS
  56. friend nsContainerFrame*
  57. NS_NewMathMLmtableFrame(nsIPresShell* aPresShell,
  58. nsStyleContext* aContext);
  59. // Overloaded nsTableFrame methods
  60. virtual void
  61. SetInitialChildList(ChildListID aListID,
  62. nsFrameList& aChildList) override;
  63. virtual void
  64. AppendFrames(ChildListID aListID,
  65. nsFrameList& aFrameList) override
  66. {
  67. nsTableFrame::AppendFrames(aListID, aFrameList);
  68. RestyleTable();
  69. }
  70. virtual void
  71. InsertFrames(ChildListID aListID,
  72. nsIFrame* aPrevFrame,
  73. nsFrameList& aFrameList) override
  74. {
  75. nsTableFrame::InsertFrames(aListID, aPrevFrame, aFrameList);
  76. RestyleTable();
  77. }
  78. virtual void
  79. RemoveFrame(ChildListID aListID, nsIFrame* aOldFrame) override
  80. {
  81. nsTableFrame::RemoveFrame(aListID, aOldFrame);
  82. RestyleTable();
  83. }
  84. virtual bool IsFrameOfType(uint32_t aFlags) const override
  85. {
  86. return nsTableFrame::IsFrameOfType(aFlags & ~(nsIFrame::eMathML));
  87. }
  88. // helper to restyle and reflow the table when a row is changed -- since MathML
  89. // attributes are inter-dependent and row/colspan can affect the table, it is
  90. // safer (albeit grossly suboptimal) to just relayout the whole thing.
  91. void RestyleTable();
  92. /** helper to get the column spacing style value */
  93. nscoord GetColSpacing(int32_t aColIndex) override;
  94. /** Sums the combined cell spacing between the columns aStartColIndex to
  95. * aEndColIndex.
  96. */
  97. nscoord GetColSpacing(int32_t aStartColIndex,
  98. int32_t aEndColIndex) override;
  99. /** helper to get the row spacing style value */
  100. nscoord GetRowSpacing(int32_t aRowIndex) override;
  101. /** Sums the combined cell spacing between the rows aStartRowIndex to
  102. * aEndRowIndex.
  103. */
  104. nscoord GetRowSpacing(int32_t aStartRowIndex,
  105. int32_t aEndRowIndex) override;
  106. void SetColSpacingArray(const nsTArray<nscoord>& aColSpacing)
  107. {
  108. mColSpacing = aColSpacing;
  109. }
  110. void SetRowSpacingArray(const nsTArray<nscoord>& aRowSpacing)
  111. {
  112. mRowSpacing = aRowSpacing;
  113. }
  114. void SetFrameSpacing(nscoord aSpacingX, nscoord aSpacingY)
  115. {
  116. mFrameSpacingX = aSpacingX;
  117. mFrameSpacingY = aSpacingY;
  118. }
  119. /** Determines whether the placement of table cells is determined by CSS
  120. * spacing based on padding and border-spacing, or one based upon the
  121. * rowspacing, columnspacing and framespacing attributes. The second
  122. * approach is used if the user specifies at least one of those attributes.
  123. */
  124. void SetUseCSSSpacing();
  125. bool GetUseCSSSpacing() { return mUseCSSSpacing; }
  126. protected:
  127. explicit nsMathMLmtableFrame(nsStyleContext* aContext)
  128. : nsTableFrame(aContext) {}
  129. virtual ~nsMathMLmtableFrame();
  130. private:
  131. nsTArray<nscoord> mColSpacing;
  132. nsTArray<nscoord> mRowSpacing;
  133. nscoord mFrameSpacingX;
  134. nscoord mFrameSpacingY;
  135. bool mUseCSSSpacing;
  136. }; // class nsMathMLmtableFrame
  137. // --------------
  138. class nsMathMLmtrFrame : public nsTableRowFrame
  139. {
  140. public:
  141. NS_DECL_FRAMEARENA_HELPERS
  142. friend nsContainerFrame*
  143. NS_NewMathMLmtrFrame(nsIPresShell* aPresShell,
  144. nsStyleContext* aContext);
  145. // overloaded nsTableRowFrame methods
  146. virtual nsresult
  147. AttributeChanged(int32_t aNameSpaceID,
  148. nsIAtom* aAttribute,
  149. int32_t aModType) override;
  150. virtual void
  151. AppendFrames(ChildListID aListID,
  152. nsFrameList& aFrameList) override
  153. {
  154. nsTableRowFrame::AppendFrames(aListID, aFrameList);
  155. RestyleTable();
  156. }
  157. virtual void
  158. InsertFrames(ChildListID aListID,
  159. nsIFrame* aPrevFrame,
  160. nsFrameList& aFrameList) override
  161. {
  162. nsTableRowFrame::InsertFrames(aListID, aPrevFrame, aFrameList);
  163. RestyleTable();
  164. }
  165. virtual void
  166. RemoveFrame(ChildListID aListID, nsIFrame* aOldFrame) override
  167. {
  168. nsTableRowFrame::RemoveFrame(aListID, aOldFrame);
  169. RestyleTable();
  170. }
  171. virtual bool IsFrameOfType(uint32_t aFlags) const override
  172. {
  173. return nsTableRowFrame::IsFrameOfType(aFlags & ~(nsIFrame::eMathML));
  174. }
  175. // helper to restyle and reflow the table -- @see nsMathMLmtableFrame.
  176. void RestyleTable()
  177. {
  178. nsTableFrame* tableFrame = GetTableFrame();
  179. if (tableFrame && tableFrame->IsFrameOfType(nsIFrame::eMathML)) {
  180. // relayout the table
  181. ((nsMathMLmtableFrame*)tableFrame)->RestyleTable();
  182. }
  183. }
  184. protected:
  185. explicit nsMathMLmtrFrame(nsStyleContext* aContext)
  186. : nsTableRowFrame(aContext) {}
  187. virtual ~nsMathMLmtrFrame();
  188. }; // class nsMathMLmtrFrame
  189. // --------------
  190. class nsMathMLmtdFrame : public nsTableCellFrame
  191. {
  192. public:
  193. NS_DECL_FRAMEARENA_HELPERS
  194. friend nsContainerFrame*
  195. NS_NewMathMLmtdFrame(nsIPresShell* aPresShell,
  196. nsStyleContext* aContext,
  197. nsTableFrame* aTableFrame);
  198. // overloaded nsTableCellFrame methods
  199. virtual void Init(nsIContent* aContent,
  200. nsContainerFrame* aParent,
  201. nsIFrame* aPrevInFlow) override;
  202. virtual nsresult
  203. AttributeChanged(int32_t aNameSpaceID,
  204. nsIAtom* aAttribute,
  205. int32_t aModType) override;
  206. virtual uint8_t GetVerticalAlign() const override;
  207. virtual nsresult ProcessBorders(nsTableFrame* aFrame,
  208. nsDisplayListBuilder* aBuilder,
  209. const nsDisplayListSet& aLists) override;
  210. virtual bool IsFrameOfType(uint32_t aFlags) const override
  211. {
  212. return nsTableCellFrame::IsFrameOfType(aFlags & ~(nsIFrame::eMathML));
  213. }
  214. virtual LogicalMargin GetBorderWidth(WritingMode aWM) const override;
  215. virtual nsMargin GetBorderOverflow() override;
  216. protected:
  217. nsMathMLmtdFrame(nsStyleContext* aContext, nsTableFrame* aTableFrame)
  218. : nsTableCellFrame(aContext, aTableFrame) {}
  219. virtual ~nsMathMLmtdFrame();
  220. }; // class nsMathMLmtdFrame
  221. // --------------
  222. class nsMathMLmtdInnerFrame : public nsBlockFrame,
  223. public nsMathMLFrame
  224. {
  225. public:
  226. friend nsContainerFrame*
  227. NS_NewMathMLmtdInnerFrame(nsIPresShell* aPresShell,
  228. nsStyleContext* aContext);
  229. NS_DECL_QUERYFRAME
  230. NS_DECL_FRAMEARENA_HELPERS
  231. // Overloaded nsIMathMLFrame methods
  232. NS_IMETHOD
  233. UpdatePresentationDataFromChildAt(int32_t aFirstIndex,
  234. int32_t aLastIndex,
  235. uint32_t aFlagsValues,
  236. uint32_t aFlagsToUpdate) override
  237. {
  238. nsMathMLContainerFrame::PropagatePresentationDataFromChildAt(this,
  239. aFirstIndex, aLastIndex, aFlagsValues, aFlagsToUpdate);
  240. return NS_OK;
  241. }
  242. virtual void
  243. Reflow(nsPresContext* aPresContext,
  244. ReflowOutput& aDesiredSize,
  245. const ReflowInput& aReflowInput,
  246. nsReflowStatus& aStatus) override;
  247. virtual bool IsFrameOfType(uint32_t aFlags) const override
  248. {
  249. return nsBlockFrame::IsFrameOfType(aFlags &
  250. ~(nsIFrame::eMathML | nsIFrame::eExcludesIgnorableWhitespace));
  251. }
  252. virtual const nsStyleText* StyleTextForLineLayout() override;
  253. virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) override;
  254. bool
  255. IsMrowLike() override
  256. {
  257. return mFrames.FirstChild() !=
  258. mFrames.LastChild() ||
  259. !mFrames.FirstChild();
  260. }
  261. protected:
  262. explicit nsMathMLmtdInnerFrame(nsStyleContext* aContext);
  263. virtual ~nsMathMLmtdInnerFrame();
  264. nsStyleText* mUniqueStyleText;
  265. }; // class nsMathMLmtdInnerFrame
  266. #endif /* nsMathMLmtableFrame_h___ */