already_AddRefed<Element> ListBoxObject::GetItemAtIndex(int32_t index) { nsCOMPtr<nsIDOMElement> el; GetItemAtIndex(index, getter_AddRefs(el)); nsCOMPtr<Element> ret(do_QueryInterface(el)); return ret.forget(); }
nscoord nsListBoxBodyFrame::ComputeIntrinsicWidth(nsBoxLayoutState& aBoxLayoutState) { if (mStringWidth != -1) return mStringWidth; nscoord largestWidth = 0; PRInt32 index = 0; nsCOMPtr<nsIDOMElement> firstRowEl; GetItemAtIndex(index, getter_AddRefs(firstRowEl)); nsCOMPtr<nsIContent> firstRowContent(do_QueryInterface(firstRowEl)); if (firstRowContent) { nsRefPtr<nsStyleContext> styleContext; nsPresContext *presContext = aBoxLayoutState.PresContext(); styleContext = presContext->StyleSet()-> ResolveStyleFor(firstRowContent->AsElement(), nsnull); nscoord width = 0; nsMargin margin(0,0,0,0); if (styleContext->GetStylePadding()->GetPadding(margin)) width += margin.LeftRight(); width += styleContext->GetStyleBorder()->GetActualBorder().LeftRight(); if (styleContext->GetStyleMargin()->GetMargin(margin)) width += margin.LeftRight(); ChildIterator iter, last; PRUint32 i = 0; for (ChildIterator::Init(mContent, &iter, &last); iter != last && i < 100; ++iter, ++i) { nsIContent *child = (*iter); if (child->Tag() == nsGkAtoms::listitem) { nsRenderingContext* rendContext = aBoxLayoutState.GetRenderingContext(); if (rendContext) { nsAutoString value; PRUint32 textCount = child->GetChildCount(); for (PRUint32 j = 0; j < textCount; ++j) { nsIContent* text = child->GetChildAt(j); if (text && text->IsNodeOfType(nsINode::eTEXT)) { text->AppendTextTo(value); } } nsRefPtr<nsFontMetrics> fm; nsLayoutUtils::GetFontMetricsForStyleContext(styleContext, getter_AddRefs(fm)); rendContext->SetFont(fm); nscoord textWidth = nsLayoutUtils::GetStringWidth(this, rendContext, value.get(), value.Length()); textWidth += width; if (textWidth > largestWidth) largestWidth = textWidth; } } } } mStringWidth = largestWidth; return mStringWidth; }
nscoord nsListBoxBodyFrame::ComputeIntrinsicWidth(nsBoxLayoutState& aBoxLayoutState) { if (mStringWidth != -1) return mStringWidth; nscoord largestWidth = 0; PRInt32 index = 0; nsCOMPtr<nsIDOMElement> firstRowEl; GetItemAtIndex(index, getter_AddRefs(firstRowEl)); nsCOMPtr<nsIContent> firstRowContent(do_QueryInterface(firstRowEl)); if (firstRowContent) { nsRefPtr<nsStyleContext> styleContext; nsPresContext *presContext = aBoxLayoutState.PresContext(); styleContext = presContext->StyleSet()-> ResolveStyleFor(firstRowContent, nsnull); nscoord width = 0; nsMargin margin(0,0,0,0); if (styleContext->GetStylePadding()->GetPadding(margin)) width += margin.LeftRight(); width += styleContext->GetStyleBorder()->GetBorder().LeftRight(); if (styleContext->GetStyleMargin()->GetMargin(margin)) width += margin.LeftRight(); nsIContent* listbox = mContent->GetBindingParent(); NS_ENSURE_TRUE(listbox, largestWidth); PRUint32 childCount = listbox->GetChildCount(); for (PRUint32 i = 0; i < childCount && i < 100; ++i) { nsIContent *child = listbox->GetChildAt(i); if (child->Tag() == nsGkAtoms::listitem) { nsIRenderingContext* rendContext = aBoxLayoutState.GetRenderingContext(); if (rendContext) { nsAutoString value; PRUint32 textCount = child->GetChildCount(); for (PRUint32 j = 0; j < textCount; ++j) { nsIContent* text = child->GetChildAt(j); if (text && text->IsNodeOfType(nsINode::eTEXT)) { text->AppendTextTo(value); } } nsLayoutUtils::SetFontFromStyle(rendContext, styleContext); nscoord textWidth = nsLayoutUtils::GetStringWidth(this, rendContext, value.get(), value.Length()); textWidth += width; if (textWidth > largestWidth) largestWidth = textWidth; } } } } mStringWidth = largestWidth; return mStringWidth; }