nsTableCellFrame* nsTableCellFrame::GetNextCell() const { nsIFrame* childFrame = GetNextSibling(); while (childFrame) { if (IS_TABLE_CELL(childFrame->GetType())) { return (nsTableCellFrame*)childFrame; } childFrame = childFrame->GetNextSibling(); } return nsnull; }
NS_IMETHODIMP nsMathMLmtrFrame::AttributeChanged(PRInt32 aNameSpaceID, nsIAtom* aAttribute, PRInt32 aModType) { // Attributes specific to <mtr>: // groupalign : Not yet supported. // rowalign : Fully specified in mathml.css, and so HasAttributeDependentStyle() will // pick it up and nsCSSFrameConstructor will issue a PostRestyleEvent(). // columnalign : Need an explicit re-style call. if (aAttribute == nsGkAtoms::rowalign_) { // unset any -moz attribute that we may have set earlier, and re-sync mContent->UnsetAttr(kNameSpaceID_None, nsGkAtoms::MOZrowalign, PR_FALSE); MapRowAttributesIntoCSS(nsTableFrame::GetTableFrame(this), this); // That's all - see comment above. return NS_OK; } if (aAttribute != nsGkAtoms::columnalign_) return NS_OK; // Clear any cached columnalign's nsValueList for this row DeleteProperty(aAttribute); // Clear any internal -moz attribute that we may have set earlier // in our cells and re-sync their columnalign attribute nsTableFrame* tableFrame = nsTableFrame::GetTableFrame(this); nsIFrame* cellFrame = GetFirstChild(nsnull); for ( ; cellFrame; cellFrame = cellFrame->GetNextSibling()) { if (IS_TABLE_CELL(cellFrame->GetType())) { cellFrame->GetContent()-> UnsetAttr(kNameSpaceID_None, nsGkAtoms::MOZcolumnalign, PR_FALSE); MapColAttributesIntoCSS(tableFrame, this, cellFrame); } } // Explicitly request a re-resolve and reflow in our subtree to pick up any changes PresContext()->PresShell()->FrameConstructor()-> PostRestyleEvent(mContent, eReStyle_Self, nsChangeHint_ReflowFrame); return NS_OK; }
// map all attribues within a table -- requires the indices of rows and cells. // so it can only happen after they are made ready by the table base class. static void MapAllAttributesIntoCSS(nsIFrame* aTableFrame) { // mtable is simple and only has one (pseudo) row-group nsIFrame* rgFrame = aTableFrame->GetFirstChild(nsnull); if (!rgFrame || rgFrame->GetType() != nsGkAtoms::tableRowGroupFrame) return; nsIFrame* rowFrame = rgFrame->GetFirstChild(nsnull); for ( ; rowFrame; rowFrame = rowFrame->GetNextSibling()) { DEBUG_VERIFY_THAT_FRAME_IS(rowFrame, TABLE_ROW); if (rowFrame->GetType() == nsGkAtoms::tableRowFrame) { MapRowAttributesIntoCSS(aTableFrame, rowFrame); nsIFrame* cellFrame = rowFrame->GetFirstChild(nsnull); for ( ; cellFrame; cellFrame = cellFrame->GetNextSibling()) { DEBUG_VERIFY_THAT_FRAME_IS(cellFrame, TABLE_CELL); if (IS_TABLE_CELL(cellFrame->GetType())) { MapColAttributesIntoCSS(aTableFrame, rowFrame, cellFrame); } } } } }
NS_IMETHODIMP nsMathMLmtableOuterFrame::AttributeChanged(PRInt32 aNameSpaceID, nsIAtom* aAttribute, PRInt32 aModType) { // Attributes specific to <mtable>: // frame : in mathml.css // framespacing : not yet supported // groupalign : not yet supported // equalrows : not yet supported // equalcolumns : not yet supported // displaystyle : here // align : in reflow // rowalign : here // rowlines : here // rowspacing : not yet supported // columnalign : here // columnlines : here // columnspacing : not yet supported // mtable is simple and only has one (pseudo) row-group inside our inner-table nsIFrame* tableFrame = mFrames.FirstChild(); if (!tableFrame || tableFrame->GetType() != nsGkAtoms::tableFrame) return NS_OK; nsIFrame* rgFrame = tableFrame->GetFirstChild(nsnull); if (!rgFrame || rgFrame->GetType() != nsGkAtoms::tableRowGroupFrame) return NS_OK; // align - just need to issue a dirty (resize) reflow command if (aAttribute == nsGkAtoms::align) { PresContext()->PresShell()-> FrameNeedsReflow(this, nsIPresShell::eResize, NS_FRAME_IS_DIRTY); return NS_OK; } // displaystyle - may seem innocuous, but it is actually very harsh -- // like changing an unit. Blow away and recompute all our automatic // presentational data, and issue a style-changed reflow request if (aAttribute == nsGkAtoms::displaystyle_) { nsMathMLContainerFrame::RebuildAutomaticDataForChildren(mParent); // Need to reflow the parent, not us, because this can actually // affect siblings. PresContext()->PresShell()-> FrameNeedsReflow(mParent, nsIPresShell::eStyleChange, NS_FRAME_IS_DIRTY); return NS_OK; } // ...and the other attributes affect rows or columns in one way or another nsIAtom* MOZrowAtom = nsnull; nsIAtom* MOZcolAtom = nsnull; if (aAttribute == nsGkAtoms::rowalign_) MOZrowAtom = nsGkAtoms::MOZrowalign; else if (aAttribute == nsGkAtoms::rowlines_) MOZrowAtom = nsGkAtoms::MOZrowline; else if (aAttribute == nsGkAtoms::columnalign_) MOZcolAtom = nsGkAtoms::MOZcolumnalign; else if (aAttribute == nsGkAtoms::columnlines_) MOZcolAtom = nsGkAtoms::MOZcolumnline; if (!MOZrowAtom && !MOZcolAtom) return NS_OK; // clear any cached nsValueList for this table tableFrame->DeleteProperty(aAttribute); // unset any -moz attribute that we may have set earlier, and re-sync nsIFrame* rowFrame = rgFrame->GetFirstChild(nsnull); for ( ; rowFrame; rowFrame = rowFrame->GetNextSibling()) { if (rowFrame->GetType() == nsGkAtoms::tableRowFrame) { if (MOZrowAtom) { // let rows do the work rowFrame->GetContent()->UnsetAttr(kNameSpaceID_None, MOZrowAtom, PR_FALSE); MapRowAttributesIntoCSS(tableFrame, rowFrame); } else { // let cells do the work nsIFrame* cellFrame = rowFrame->GetFirstChild(nsnull); for ( ; cellFrame; cellFrame = cellFrame->GetNextSibling()) { if (IS_TABLE_CELL(cellFrame->GetType())) { cellFrame->GetContent()->UnsetAttr(kNameSpaceID_None, MOZcolAtom, PR_FALSE); MapColAttributesIntoCSS(tableFrame, rowFrame, cellFrame); } } } } } // Explicitly request a re-resolve and reflow in our subtree to pick up any changes PresContext()->PresShell()->FrameConstructor()-> PostRestyleEvent(mContent, eReStyle_Self, nsChangeHint_ReflowFrame); return NS_OK; }