// // Get the nsIBox for the next visible listitem after aBox, and if none // exists, create one. // nsIBox* nsListBoxBodyFrame::GetNextItemBox(nsIBox* aBox, PRInt32 aOffset, bool* aCreated) { if (aCreated) *aCreated = false; nsIFrame* result = aBox->GetNextSibling(); if (!result || result == mLinkupFrame || mRowsToPrepend > 0) { // No result found. See if there's a content node that wants a frame. nsIContent* prevContent = aBox->GetContent(); nsIContent* parentContent = prevContent->GetParent(); PRInt32 i = parentContent->IndexOf(prevContent); PRUint32 childCount = parentContent->GetChildCount(); if (((PRUint32)i + aOffset + 1) < childCount) { // There is a content node that wants a frame. nsIContent *nextContent = parentContent->GetChildAt(i + aOffset + 1); nsIFrame* existingFrame; if (!IsListItemChild(this, nextContent, &existingFrame)) { return GetNextItemBox(aBox, ++aOffset, aCreated); } if (!existingFrame) { // Either append the new frame, or insert it after the current frame bool isAppend = result != mLinkupFrame && mRowsToPrepend <= 0; nsIFrame* prevFrame = isAppend ? nsnull : aBox; nsPresContext* presContext = PresContext(); nsCSSFrameConstructor* fc = presContext->PresShell()->FrameConstructor(); fc->CreateListBoxContent(presContext, this, prevFrame, nextContent, &result, isAppend, false, nsnull); if (result) { if (aCreated) *aCreated = true; } else return GetNextItemBox(aBox, ++aOffset, aCreated); } else { result = existingFrame; } mLinkupFrame = nsnull; } } if (!result) return nsnull; mBottomFrame = result; NS_ASSERTION(!result->IsBoxFrame() || result->GetParent() == this, "returning frame that is not in childlist"); return result->IsBoxFrame() ? result : nsnull; }
// // Get the nsIBox for the next visible listitem after aBox, and if none // exists, create one. // nsIBox* nsListBoxBodyFrame::GetNextItemBox(nsIBox* aBox, PRInt32 aOffset, PRBool* aCreated) { if (aCreated) *aCreated = PR_FALSE; nsIFrame* result = aBox->GetNextSibling(); if (!result || result == mLinkupFrame || mRowsToPrepend > 0) { // No result found. See if there's a content node that wants a frame. nsIContent* prevContent = aBox->GetContent(); nsIContent* parentContent = prevContent->GetParent(); PRInt32 i = parentContent->IndexOf(prevContent); PRUint32 childCount = parentContent->GetChildCount(); if (((PRUint32)i + aOffset + 1) < childCount) { // There is a content node that wants a frame. nsIContent *nextContent = parentContent->GetChildAt(i + aOffset + 1); // Either append the new frame, or insert it after the current frame PRBool isAppend = result != mLinkupFrame && mRowsToPrepend <= 0; nsIFrame* prevFrame = isAppend ? nsnull : aBox; nsPresContext* presContext = PresContext(); nsCSSFrameConstructor* fc = presContext->PresShell()->FrameConstructor(); fc->CreateListBoxContent(presContext, this, prevFrame, nextContent, &result, isAppend, PR_FALSE, nsnull); if (result) { if (aCreated) *aCreated = PR_TRUE; } else return GetNextItemBox(aBox, ++aOffset, aCreated); mLinkupFrame = nsnull; } } if (!result) return nsnull; mBottomFrame = result; return result->IsBoxFrame() ? result : nsnull; }
void nsListBoxBodyFrame::CreateRows() { // Get our client rect. nsRect clientRect; GetClientRect(clientRect); // Get the starting y position and the remaining available // height. nscoord availableHeight = GetAvailableHeight(); if (availableHeight <= 0) { bool fixed = (GetFixedRowSize() != -1); if (fixed) availableHeight = 10; else return; } // get the first tree box. If there isn't one create one. bool created = false; nsIBox* box = GetFirstItemBox(0, &created); nscoord rowHeight = GetRowHeightAppUnits(); while (box) { if (created && mRowsToPrepend > 0) --mRowsToPrepend; // if the row height is 0 then fail. Wait until someone // laid out and sets the row height. if (rowHeight == 0) return; availableHeight -= rowHeight; // should we continue? Is the enought height? if (!ContinueReflow(availableHeight)) break; // get the next tree box. Create one if needed. box = GetNextItemBox(box, 0, &created); } mRowsToPrepend = 0; mLinkupFrame = nsnull; }