void RenderScrollbar::updateScrollbarParts(bool destroy) { updateScrollbarPart(ScrollbarBGPart, destroy); updateScrollbarPart(BackButtonStartPart, destroy); updateScrollbarPart(ForwardButtonStartPart, destroy); updateScrollbarPart(BackTrackPart, destroy); updateScrollbarPart(ThumbPart, destroy); updateScrollbarPart(ForwardTrackPart, destroy); updateScrollbarPart(BackButtonEndPart, destroy); updateScrollbarPart(ForwardButtonEndPart, destroy); updateScrollbarPart(TrackBGPart, destroy); if (destroy) return; // See if the scrollbar's thickness changed. If so, we need to mark our owning object as needing a layout. bool isHorizontal = orientation() == HorizontalScrollbar; int oldThickness = isHorizontal ? height() : width(); int newThickness = 0; RenderScrollbarPart* part = m_parts.get(ScrollbarBGPart); if (part) { part->layout(); newThickness = isHorizontal ? part->height() : part->width(); } if (newThickness != oldThickness) { setFrameRect(IntRect(x(), y(), isHorizontal ? width() : newThickness, isHorizontal ? newThickness : height())); owningRenderer()->setChildNeedsLayout(true); } }
int RenderScrollbar::minimumThumbLength() { RenderScrollbarPart* partRenderer = m_parts.get(ThumbPart); if (!partRenderer) return 0; partRenderer->layout(); return orientation() == HorizontalScrollbar ? partRenderer->width() : partRenderer->height(); }
IntRect RenderScrollbar::buttonRect(ScrollbarPart partType) { RenderScrollbarPart* partRenderer = m_parts.get(partType); if (!partRenderer) return IntRect(); partRenderer->layout(); bool isHorizontal = orientation() == HorizontalScrollbar; if (partType == BackButtonStartPart) return IntRect(x(), y(), isHorizontal ? partRenderer->width() : width(), isHorizontal ? height() : partRenderer->height()); if (partType == ForwardButtonEndPart) return IntRect(isHorizontal ? x() + width() - partRenderer->width() : x(), isHorizontal ? y() : y() + height() - partRenderer->height(), isHorizontal ? partRenderer->width() : width(), isHorizontal ? height() : partRenderer->height()); if (partType == ForwardButtonStartPart) { IntRect previousButton = buttonRect(BackButtonStartPart); return IntRect(isHorizontal ? x() + previousButton.width() : x(), isHorizontal ? y() : y() + previousButton.height(), isHorizontal ? partRenderer->width() : width(), isHorizontal ? height() : partRenderer->height()); } IntRect followingButton = buttonRect(ForwardButtonEndPart); return IntRect(isHorizontal ? x() + width() - followingButton.width() - partRenderer->width() : x(), isHorizontal ? y() : y() + height() - followingButton.height() - partRenderer->height(), isHorizontal ? partRenderer->width() : width(), isHorizontal ? height() : partRenderer->height()); }
RenderScrollbar::RenderScrollbar(ScrollbarClient* client, ScrollbarOrientation orientation, RenderBox* renderer, Frame* owningFrame) : Scrollbar(client, orientation, RegularScrollbar, RenderScrollbarTheme::renderScrollbarTheme()) , m_owner(renderer) , m_owningFrame(owningFrame) { // FIXME: We need to do this because RenderScrollbar::styleChanged is called as soon as the scrollbar is created. // Update the scrollbar size. updateScrollbarPart(ScrollbarBGPart); RenderScrollbarPart* part = m_parts.get(ScrollbarBGPart); if (!part) return; part->layout(); setFrameRect(IntRect(0, 0, part->width(), part->height())); }