void NetListView::FrameResized(float width, float height) { BListView::FrameResized(width, height); //Ensure the bevel on the right is drawn properly if(width < oldWidth) oldWidth = width; PushState(); BRect invalRect(oldWidth, 0, oldWidth, height); ConvertFromParent(&invalRect); BRegion lineRegion(invalRect); ConstrainClippingRegion(&lineRegion); Draw(invalRect); oldWidth = width; PopState(); //Do word wrapping BFont curFont; GetFont(&curFont); float itemWidth = Bounds().Width(); float wrapWidth = (itemWidth - 6)/curFont.Size(); for(int itemNum = 0; itemNum < CountItems(); itemNum++) { NetListItem* item = (NetListItem*)(Items()[itemNum]); item->SetWidth(itemWidth); item->CalcWordWrap(wrapWidth); } //DoForEach(UpdateItem, (void*)this); Invalidate(); BListView::FrameResized(width, height); }
void RasterShapeIntervals::getIncludedIntervals(int y1, int y2, SegmentList& result) const { ASSERT(y2 >= y1); IntRect lineRect(bounds().x(), y1, bounds().width(), y2 - y1); Region lineRegion(lineRect); lineRegion.intersect(m_region); if (lineRegion.isEmpty()) return; const Vector<IntRect>& lineRects = lineRegion.rects(); ASSERT(lineRects.size() > 0); Region segmentsRegion(lineRect); Region intervalsRegion; // The loop below uses Regions to compute the intersection of the horizontal // shape intervals that fall within the line's box. int currentLineY = lineRects[0].y(); int currentLineMaxY = lineRects[0].maxY(); for (unsigned i = 0; i < lineRects.size(); ++i) { int lineY = lineRects[i].y(); ASSERT(lineY >= currentLineY); if (lineY > currentLineMaxY) { // We've encountered a vertical gap in lineRects, there are no included intervals. return; } if (lineY > currentLineY) { currentLineY = lineY; currentLineMaxY = lineRects[i].maxY(); segmentsRegion.intersect(intervalsRegion); intervalsRegion = Region(); } else currentLineMaxY = std::max<int>(currentLineMaxY, lineRects[i].maxY()); intervalsRegion.unite(Region(alignedRect(lineRects[i], y1, y2))); } if (!intervalsRegion.isEmpty()) segmentsRegion.intersect(intervalsRegion); const Vector<IntRect>& segmentRects = segmentsRegion.rects(); for (unsigned i = 0; i < segmentRects.size(); ++i) result.append(LineSegment(segmentRects[i].x(), segmentRects[i].maxX())); }
bool RasterShapeIntervals::firstIncludedIntervalY(int minY, const IntSize& minSize, LayoutUnit& result) const { for (int y = minY; y <= bounds().maxY() - minSize.height(); y++) { Region lineRegion(IntRect(bounds().x(), y, bounds().width(), minSize.height())); lineRegion.intersect(m_region); if (lineRegion.isEmpty()) continue; const Vector<IntRect>& lineRects = lineRegion.rects(); ASSERT(lineRects.size() > 0); for (unsigned i = 0; i < lineRects.size(); i++) { IntRect rect = lineRects[i]; if (rect.width() >= minSize.width() && lineRegion.contains(Region(IntRect(IntPoint(rect.x(), y), minSize)))) { result = y; return true; } } } return false; }
void RasterShapeIntervals::getExcludedIntervals(int y1, int y2, SegmentList& result) const { ASSERT(y2 >= y1); IntRect lineRect(bounds().x(), y1, bounds().width(), y2 - y1); Region lineRegion(lineRect); lineRegion.intersect(m_region); if (lineRegion.isEmpty()) return; const Vector<IntRect>& lineRects = lineRegion.rects(); ASSERT(lineRects.size() > 0); Region segmentsRegion; for (unsigned i = 0; i < lineRects.size(); i++) segmentsRegion.unite(Region(alignedRect(lineRects[i], y1, y2))); const Vector<IntRect>& segmentRects = segmentsRegion.rects(); for (unsigned i = 0; i < segmentRects.size(); i++) result.append(LineSegment(segmentRects[i].x(), segmentRects[i].maxX() + 1)); }