diff -r 4272317a42ad modules/javafx.web/src/main/java/com/sun/javafx/webkit/theme/ScrollBarWidget.java --- a/modules/javafx.web/src/main/java/com/sun/javafx/webkit/theme/ScrollBarWidget.java Mon Dec 12 16:25:29 2016 -0800 +++ b/modules/javafx.web/src/main/java/com/sun/javafx/webkit/theme/ScrollBarWidget.java Fri Dec 16 09:25:22 2016 +0000 @@ -80,6 +80,7 @@ return; } int thickness = (int) testSB.prefWidth(-1); + System.err.println("thickness:" + testSB.prefWidth(-1) + ", this.thickness:" + this.prefWidth(-1)); if (thickness != 0 && ScrollBarTheme.getThickness() != thickness) { ScrollBarTheme.setThickness(thickness); } diff -r 4272317a42ad modules/javafx.web/src/main/native/Source/WebCore/platform/java/ScrollbarThemeJava.cpp --- a/modules/javafx.web/src/main/native/Source/WebCore/platform/java/ScrollbarThemeJava.cpp Mon Dec 12 16:25:29 2016 -0800 +++ b/modules/javafx.web/src/main/native/Source/WebCore/platform/java/ScrollbarThemeJava.cpp Fri Dec 16 09:25:22 2016 +0000 @@ -23,13 +23,7 @@ namespace WebCore { - -ScrollbarTheme* ScrollbarTheme::nativeTheme() -{ - static ScrollbarTheme *s_sharedInstance = new ScrollbarThemeJava(); - return s_sharedInstance; -} - +namespace { jclass getJScrollBarThemeClass() { static JGClass jScrollbarThemeClass( @@ -39,7 +33,7 @@ return jScrollbarThemeClass; } -JLObject getJScrollBarTheme(Scrollbar& sb) //XXX: ScrollbarThemeClient replaced by Scrollbar, double recheck +JLObject getJScrollBarTheme(Scrollbar& sb) { FrameView* fv = sb.root(); if (!fv) { @@ -64,42 +58,80 @@ return jScrollbarTheme; } +void createScrollbarWidgetIfNeeded(Scrollbar& scrollbar) { +} +} + +ScrollbarTheme* ScrollbarTheme::nativeTheme() +{ + static ScrollbarTheme *s_sharedInstance = new ScrollbarThemeJava(); + return s_sharedInstance; +} + +ScrollbarThemeJava::ScrollbarThemeJava() +{ +} + +ScrollbarThemeJava::~ScrollbarThemeJava() +{ +} + +void ScrollbarThemeJava::themeChanged() +{ +} + +bool ScrollbarThemeJava::hasThumb(Scrollbar& scrollbar) +{ + return thumbLength(scrollbar) > 0; +} + bool ScrollbarThemeJava::paint(Scrollbar& scrollbar, GraphicsContext& gc, const IntRect& damageRect) { // platformContext() returns 0 when printing if (gc.paintingDisabled() || !gc.platformContext()) { return true; } + + if (!scrollbar.enabled()) { + return true; + } + JLObject jtheme = getJScrollBarTheme(scrollbar); if (!jtheme) { - return false; + return true; } + JNIEnv* env = WebCore_GetJavaEnv(); - static jmethodID mid = env->GetMethodID( getJScrollBarThemeClass(), "createWidget", "(JIIIIII)Lcom/sun/webkit/graphics/Ref;"); ASSERT(mid); - - RefPtr widgetRef = RQRef::create( env->CallObjectMethod( - jtheme, - mid, - ptr_to_jlong(&scrollbar), - (jint)scrollbar.width(), - (jint)scrollbar.height(), - (jint)scrollbar.orientation(), - (jint)scrollbar.value(), - (jint)scrollbar.visibleSize(), - (jint)scrollbar.totalSize())); - ASSERT(widgetRef.get()); + // Will create FX side ScrollBarWidget only if needed. + // There is cache which has ScrollBarWidget with native + // Scrollbar instance pointer as a key. + // It will also adjusts ScrollBarWidget's position/size according + // to the paiting need. + // FIXME-java: Pool can be removed and ScrollBarWidget creation can + // be moved to registerScrollbar. + RefPtr scrollbarWidget = RQRef::create( env->CallObjectMethod( + jtheme, + mid, + ptr_to_jlong(&scrollbar), + (jint)scrollbar.width(), + (jint)scrollbar.height(), + (jint)scrollbar.orientation(), + (jint)scrollbar.value(), + (jint)scrollbar.visibleSize(), + (jint)scrollbar.totalSize())); + ASSERT(scrollbarWidget.get()); CheckAndClearException(env); // widgetRef will go into rq's inner refs vector. gc.platformContext()->rq().freeSpace(28) << (jint)com_sun_webkit_graphics_GraphicsDecoder_DRAWSCROLLBAR << RQRef::create(jtheme) - << widgetRef + << scrollbarWidget << (jint)scrollbar.x() << (jint)scrollbar.y() << (jint)scrollbar.pressedPart() @@ -108,147 +140,63 @@ return false; } -ScrollbarPart ScrollbarThemeJava::hitTest(Scrollbar& scrollbar, const IntPoint& pos) -{ - JLObject jtheme = getJScrollBarTheme(scrollbar); - if (!jtheme) { - return (ScrollbarPart)0; - } - JNIEnv* env = WebCore_GetJavaEnv(); - - static jmethodID mid = env->GetMethodID( - getJScrollBarThemeClass(), - "hitTest", - "(IIIIIIII)I"); - ASSERT(mid); - - IntPoint p = scrollbar.convertFromContainingWindow(pos); - int part = env->CallIntMethod( - jtheme, - mid, - (jint)scrollbar.width(), - (jint)scrollbar.height(), - (jint)scrollbar.orientation(), - (jint)scrollbar.value(), - (jint)scrollbar.visibleSize(), - (jint)scrollbar.totalSize(), - (jint)p.x(), - (jint)p.y()); - CheckAndClearException(env); - - return (ScrollbarPart)part; -} - void ScrollbarThemeJava::invalidatePart(Scrollbar& scrollbar, ScrollbarPart) { // FIXME: Do more precise invalidation. scrollbar.invalidate(); } -int ScrollbarThemeJava::thumbPosition(Scrollbar& scrollbar) +IntRect ScrollbarThemeJava::backButtonRect(Scrollbar& scrollbar, ScrollbarPart part, bool) { - JLObject jtheme = getJScrollBarTheme(scrollbar); - if (!jtheme) { - return 0; - } - JNIEnv* env = WebCore_GetJavaEnv(); + // Windows just has single arrows. + if (part == BackButtonEndPart) + return IntRect(); - static jmethodID mid = env->GetMethodID( - getJScrollBarThemeClass(), - "getThumbPosition", - "(IIIIII)I"); - ASSERT(mid); + // Our desired rect is essentially 17x17. - int pos = env->CallIntMethod( - jtheme, - mid, - (jint)scrollbar.width(), - (jint)scrollbar.height(), - (jint)scrollbar.orientation(), - (jint)scrollbar.value(), - (jint)scrollbar.visibleSize(), - (jint)scrollbar.totalSize()); - CheckAndClearException(env); - - return pos; + // Our actual rect will shrink to half the available space when + // we have < 34 pixels left. This allows the scrollbar + // to scale down and function even at tiny sizes. + int thickness = scrollbarThickness(); + if (scrollbar.orientation() == HorizontalScrollbar) + return IntRect(scrollbar.x(), scrollbar.y(), + scrollbar.width() < 2 * thickness ? scrollbar.width() / 2 : thickness, thickness); + return IntRect(scrollbar.x(), scrollbar.y(), + thickness, scrollbar.height() < 2 * thickness ? scrollbar.height() / 2 : thickness); } -int ScrollbarThemeJava::thumbLength(Scrollbar& scrollbar) +IntRect ScrollbarThemeJava::forwardButtonRect(Scrollbar& scrollbar, ScrollbarPart part, bool) { - JLObject jtheme = getJScrollBarTheme(scrollbar); - if (!jtheme) { - return 0; + // Windows just has single arrows. + if (part == ForwardButtonStartPart) + return IntRect(); + + // Our desired rect is essentially 17x17. + + // Our actual rect will shrink to half the available space when + // we have < 34 pixels left. This allows the scrollbar + // to scale down and function even at tiny sizes. + int thickness = scrollbarThickness(); + if (scrollbar.orientation() == HorizontalScrollbar) { + int w = scrollbar.width() < 2 * thickness ? scrollbar.width() / 2 : thickness; + return IntRect(scrollbar.x() + scrollbar.width() - w, scrollbar.y(), w, thickness); } - JNIEnv* env = WebCore_GetJavaEnv(); - static jmethodID mid = env->GetMethodID( - getJScrollBarThemeClass(), - "getThumbLength", - "(IIIIII)I"); - ASSERT(mid); - - int len = env->CallIntMethod( - jtheme, - mid, - (jint)scrollbar.width(), - (jint)scrollbar.height(), - (jint)scrollbar.orientation(), - (jint)scrollbar.value(), - (jint)scrollbar.visibleSize(), - (jint)scrollbar.totalSize()); - CheckAndClearException(env); - - return len; + int h = scrollbar.height() < 2 * thickness ? scrollbar.height() / 2 : thickness; + return IntRect(scrollbar.x(), scrollbar.y() + scrollbar.height() - h, thickness, h); } -int ScrollbarThemeJava::trackPosition(Scrollbar& scrollbar) +IntRect ScrollbarThemeJava::trackRect(Scrollbar& scrollbar, bool) { - JLObject jtheme = getJScrollBarTheme(scrollbar); - if (!jtheme) { - return 0; + int thickness = scrollbarThickness(); + if (scrollbar.orientation() == HorizontalScrollbar) { + if (scrollbar.width() < 2 * thickness) + return IntRect(); + return IntRect(scrollbar.x() + thickness, scrollbar.y(), scrollbar.width() - 2 * thickness, thickness); } - JNIEnv* env = WebCore_GetJavaEnv(); - - static jmethodID mid = env->GetMethodID( - getJScrollBarThemeClass(), - "getTrackPosition", - "(III)I"); - ASSERT(mid); - - int pos = env->CallIntMethod( - jtheme, - mid, - (jint)scrollbar.width(), - (jint)scrollbar.height(), - (jint)scrollbar.orientation()); - CheckAndClearException(env); - - return pos; -} - -int ScrollbarThemeJava::trackLength(Scrollbar& scrollbar) -{ - JLObject jtheme = getJScrollBarTheme(scrollbar); - if (!jtheme) { - return 0; - } - JNIEnv* env = WebCore_GetJavaEnv(); - - static jmethodID mid = env->GetMethodID( - getJScrollBarThemeClass(), - "getTrackLength", - "(III)I"); - ASSERT(mid); - - int len = env->CallIntMethod( - jtheme, - mid, - (jint)scrollbar.width(), - (jint)scrollbar.height(), - (jint)scrollbar.orientation()); - CheckAndClearException(env); - - return len; + if (scrollbar.height() < 2 * thickness) + return IntRect(); + return IntRect(scrollbar.x(), scrollbar.y() + thickness, thickness, scrollbar.height() - 2 * thickness); } int ScrollbarThemeJava::scrollbarThickness(ScrollbarControlSize controlSize) @@ -269,5 +217,12 @@ return thickness; } + +void ScrollbarThemeJava::registerScrollbar(Scrollbar& scrollbar) { +} + +void ScrollbarThemeJava::unregisterScrollbar(Scrollbar& scrollbar) { +} + } //namespace WebCore diff -r 4272317a42ad modules/javafx.web/src/main/native/Source/WebCore/platform/java/ScrollbarThemeJava.h --- a/modules/javafx.web/src/main/native/Source/WebCore/platform/java/ScrollbarThemeJava.h Mon Dec 12 16:25:29 2016 -0800 +++ b/modules/javafx.web/src/main/native/Source/WebCore/platform/java/ScrollbarThemeJava.h Fri Dec 16 09:25:22 2016 +0000 @@ -6,24 +6,39 @@ #define ScrollbarThemeJava_h #include "JavaEnv.h" -#include "ScrollbarTheme.h" +#include "ScrollbarThemeComposite.h" namespace WebCore { -class ScrollbarThemeJava : public ScrollbarTheme { +class ScrollbarThemeJava : public ScrollbarThemeComposite { public: - virtual bool paint(Scrollbar&, GraphicsContext&, const IntRect& /*damageRect*/); + ScrollbarThemeJava(); + virtual ~ScrollbarThemeJava(); - virtual ScrollbarPart hitTest(Scrollbar&, const IntPoint&); + int scrollbarThickness(ScrollbarControlSize = RegularScrollbar) override; - virtual void invalidatePart(Scrollbar&, ScrollbarPart); + void themeChanged() override; - virtual int thumbPosition(Scrollbar&); - virtual int thumbLength(Scrollbar&); - virtual int trackPosition(Scrollbar&); - virtual int trackLength(Scrollbar&); + IntRect backButtonRect(Scrollbar&, ScrollbarPart, bool painting = false) override; + IntRect forwardButtonRect(Scrollbar&, ScrollbarPart, bool painting = false) override; + IntRect trackRect(Scrollbar&, bool painting = false) override; - virtual int scrollbarThickness(ScrollbarControlSize = RegularScrollbar); +protected: + void invalidatePart(Scrollbar& scrollbar, ScrollbarPart) override; + bool paint(Scrollbar&, GraphicsContext&, const IntRect& /*damageRect*/) override; + bool hasButtons(Scrollbar&) override { return true; } + bool hasThumb(Scrollbar&) override; + + void registerScrollbar(Scrollbar&) override; + void unregisterScrollbar(Scrollbar&) override; + +#if 0 + void paintTrackBackground(GraphicsContext&, Scrollbar&, const IntRect&) override; + void paintTrackPiece(GraphicsContext&, Scrollbar&, const IntRect&, ScrollbarPart) override; + void paintButton(GraphicsContext&, Scrollbar&, const IntRect&, ScrollbarPart) override; + void paintThumb(GraphicsContext&, Scrollbar&, const IntRect&) override; +#endif +private: }; }