<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>I think we need to be very careful in adjusting preferred size
      based on scrollbar visibility.</p>
    <p>ScrollPane's are used to avoid putting pressure on the
      surrounding layout.  It's preferred size will often be ignored in
      most layouts because its preferred size is the size of its
      content, which is likely too large too fit (otherwise why use a
      ScrollPane). When a ScrollPane's bounds become smaller, it must be
      careful not to change its minimum space requirements, as that
      would be counter to its purpose.<br>
    </p>
    <p>However, even changing its preferred size when space is getting
      tighter may affect layouts in a way you really want to avoid. 
      BorderPane is one of many layouts, and even though what we're
      seeing may seem like a bug, changing this behavior may have
      consequences.  What if the ScrollPane is in a VBox with two
      elements set to Priority.ALWAYS, one being the ScrollPane?  When
      space gets tighter, changing the preferred size to allow for a
      scroll bar is going to make the layout jump a bit, because it will
      take away a bit of extra space from the other element with
      Priority.ALWAYS.  VBox uses the preferred sizes of all children as
      a starting point, and shrinks them to be smaller to fit --
      changing the starting point (the preferred size) suddenly to make
      room for a scroll bar is not going to be smooth.</p>
    <p>I suspect in a lot of layouts the values for viewport
      width/height will be set, as using the content as its preferred
      size for a ScrollPane seems like a bad choice to begin with.  In
      the VBox example, the preferred size would be so large when there
      is a lot of content that it would swallow most of the extra space
      from any other nodes set to Priority.ALWAYS.  Two ScrollPane's
      above each other would not be equal sized, as their preferred
      starting sizes would be based on their contents... it would look
      weird without setting viewport size hints.</p>
    <p>I could imagine that there could be a different scroll bar
      policy, one where room is always reserved for scrollbars, but they
      still display only when needed.  This way, the ScrollPane, if it
      can be displayed at its preferred size, would have sufficient room
      for a horizontal scrollbar, and when it's horizontal size gets
      squished, it can display it without needing to adjust its minimum
      or preferred sizes. If there isn't enough room, it would pretty
      much function as before, where the scrollbar overlays content when
      it does need to be displayed -- that's unavoidable.<br>
    </p>
    <p>There's also a similar issue:
      <a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8095135">https://bugs.openjdk.org/browse/JDK-8095135</a><br>
    </p>
    <p>--John<br>
    </p>
    <div class="moz-cite-prefix">On 01/05/2023 22:18, Andy Goryachev
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:DM5PR1001MB2172D6AEB286FDFF0A7B0B21E56E9@DM5PR1001MB2172.namprd10.prod.outlook.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <style>@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
        {font-family:"Yu Gothic";
        panose-1:2 11 4 0 0 0 0 0 0 0;}@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}@font-face
        {font-family:"Times New Roman \(Body CS\)";
        panose-1:2 11 6 4 2 2 2 2 2 4;}@font-face
        {font-family:"\@Yu Gothic";
        panose-1:2 11 4 0 0 0 0 0 0 0;}@font-face
        {font-family:"Helvetica Neue";
        panose-1:2 0 5 3 0 0 0 2 0 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Courier New";
        color:windowtext;}p.p1, li.p1, div.p1
        {mso-style-name:p1;
        margin:0in;
        font-size:10.0pt;
        font-family:"Helvetica Neue";}span.s1
        {mso-style-name:s1;
        color:#DCA10D;}.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}div.WordSection1
        {page:WordSection1;}</style>
      <div class="WordSection1">
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New"">I
            think your diagnosis is right though: sometimes the layout
            is not triggered when a property is changed,<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New"">the
            recent bug like that is
            <o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
        <p class="p1"><span class="s1"><a
              href="https://bugs.openjdk.org/browse/JDK-8307117"
              moz-do-not-send="true">JDK-8307117</a></span> TextArea:
          wrapText property ignored when changing font<o:p></o:p></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New"">I
            wonder if some kind of a generic unit test could be
            developed to identify such cases.<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New"">-andy<o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:11.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
        <div style="border:none;border-top:solid #B5C4DF
          1.0pt;padding:3.0pt 0in 0in 0in">
          <p class="MsoNormal" style="margin-bottom:12.0pt"><b><span
                style="font-size:12.0pt;color:black">From:
              </span></b><span style="font-size:12.0pt;color:black">Nir
              Lisker <a class="moz-txt-link-rfc2396E" href="mailto:nlisker@gmail.com"><nlisker@gmail.com></a><br>
              <b>Date: </b>Monday, May 1, 2023 at 13:09<br>
              <b>To: </b>Andy Goryachev
              <a class="moz-txt-link-rfc2396E" href="mailto:andy.goryachev@oracle.com"><andy.goryachev@oracle.com></a><br>
              <b>Cc: </b>openjfx-dev <a class="moz-txt-link-rfc2396E" href="mailto:openjfx-dev@openjdk.org"><openjfx-dev@openjdk.org></a><br>
              <b>Subject: </b>[External] : Re: JDK-8199934:
              ScrollPaneSkin incorrectly lays out its scrollbars<o:p></o:p></span></p>
        </div>
        <div>
          <div>
            <p class="MsoNormal"><span style="font-size:11.0pt">If I
                knew what the fix was I would have. Right now I'm not
                sure anymore what the correct behavior should be even.<o:p></o:p></span></p>
          </div>
          <p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
          <div>
            <div>
              <p class="MsoNormal"><span style="font-size:11.0pt">On
                  Mon, May 1, 2023 at 10:44 PM Andy Goryachev <<a
                    href="mailto:andy.goryachev@oracle.com"
                    moz-do-not-send="true" class="moz-txt-link-freetext">andy.goryachev@oracle.com</a>>
                  wrote:<o:p></o:p></span></p>
            </div>
            <blockquote style="border:none;border-left:solid #CCCCCC
              1.0pt;padding:0in 0in 0in
              6.0pt;margin-left:4.8pt;margin-right:0in">
              <div>
                <div>
                  <div>
                    <p class="MsoNormal"
                      style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New"">Nir, would
                        you like to submit a pull request?</span><span
                        style="font-size:11.0pt"><o:p></o:p></span></p>
                    <p class="MsoNormal"
                      style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New""> </span><span
                        style="font-size:11.0pt"><o:p></o:p></span></p>
                    <p class="MsoNormal"
                      style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New"">Thank you</span><span
                        style="font-size:11.0pt"><o:p></o:p></span></p>
                    <p class="MsoNormal"
                      style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New"">-andy</span><span
                        style="font-size:11.0pt"><o:p></o:p></span></p>
                    <p class="MsoNormal"
                      style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
style="font-size:11.0pt;font-family:"Courier New""> </span><span
                        style="font-size:11.0pt"><o:p></o:p></span></p>
                    <div style="border:none;border-top:solid #B5C4DF
                      1.0pt;padding:3.0pt 0in 0in 0in">
                      <p class="MsoNormal"
                        style="mso-margin-top-alt:auto;margin-bottom:12.0pt"><b><span
                            style="font-size:12.0pt;color:black">From:
                          </span></b><span
                          style="font-size:12.0pt;color:black">openjfx-dev
                          <<a
                            href="mailto:openjfx-dev-retn@openjdk.org"
                            target="_blank" moz-do-not-send="true"
                            class="moz-txt-link-freetext">openjfx-dev-retn@openjdk.org</a>>
                          on behalf of Nir Lisker <<a
                            href="mailto:nlisker@gmail.com"
                            target="_blank" moz-do-not-send="true"
                            class="moz-txt-link-freetext">nlisker@gmail.com</a>><br>
                          <b>Date: </b>Sunday, April 30, 2023 at 10:04<br>
                          <b>To: </b>openjfx-dev <<a
                            href="mailto:openjfx-dev@openjdk.org"
                            target="_blank" moz-do-not-send="true"
                            class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a>><br>
                          <b>Subject: </b>JDK-8199934: ScrollPaneSkin
                          incorrectly lays out its scrollbars</span><span
                          style="font-size:11.0pt"><o:p></o:p></span></p>
                    </div>
                    <div>
                      <p class="MsoNormal"
                        style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                          style="font-size:11.0pt">Hi,<o:p></o:p></span></p>
                      <div>
                        <p class="MsoNormal"
                          style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                            style="font-size:11.0pt"> <o:p></o:p></span></p>
                      </div>
                      <div>
                        <p class="MsoNormal"
                          style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                            style="font-size:11.0pt">I took a quick jab
                            at this issue [1]. Using the reproducer in
                            the ticket, launch and resize the stage
                            vertically so that the buttons at the bottom
                            are only partially visible.<o:p></o:p></span></p>
                      </div>
                      <div>
                        <p class="MsoNormal"
                          style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                            style="font-size:11.0pt"> <o:p></o:p></span></p>
                      </div>
                      <div>
                        <p class="MsoNormal"
                          style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                            style="font-size:11.0pt">The current
                            behavior is as follows:<o:p></o:p></span></p>
                      </div>
                      <div>
                        <p class="MsoNormal"
                          style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                            style="font-size:11.0pt">When the scrollbar
                            is not needed, toggling to the AS_NEEDED
                            policy reallocates the scrollbar space for
                            the buttons (they move up).<o:p></o:p></span></p>
                      </div>
                      <div>
                        <p class="MsoNormal"
                          style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                            style="font-size:11.0pt">When the scrollbar
                            is needed, toggling to the AS_NEEDED policy
                            still reallocates space, and the scrollbar
                            takes away space from the content node. This
                            is wrong.<o:p></o:p></span></p>
                      </div>
                      <div>
                        <p class="MsoNormal"
                          style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                            style="font-size:11.0pt"> <o:p></o:p></span></p>
                      </div>
                      <p class="MsoNormal"
                        style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                          style="font-size:11.0pt">I modified the method
                          'computeHsbSizeHint' to<o:p></o:p></span></p>
                      <div>
                        <p class="MsoNormal"
                          style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                            style="font-size:11.0pt"> <o:p></o:p></span></p>
                        <div>
                          <p class="MsoNormal"
                            style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                              style="font-size:11.0pt">private double
                              computeHsbSizeHint(ScrollPane sp) {<br>
                                  return determineHorizontalSBVisible()
                              ?
                              hsb.prefHeight(ScrollBar.USE_COMPUTED_SIZE)
                              : 0;<br>
                              }<o:p></o:p></span></p>
                        </div>
                        <div>
                          <p class="MsoNormal"
                            style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                              style="font-size:11.0pt"> <o:p></o:p></span></p>
                        </div>
                        <div>
                          <p class="MsoNormal"
                            style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                              style="font-size:11.0pt">Now the policy
                              toggling behavior is correct both when the
                              scrollbar is needed and when it's not -
                              the space is reallocated not at the
                              expense of the content. However, enlarging
                              the stage horizontally while AS_NEEDED is
                              selected does not reallocate the space
                              (you need to toggle the policies). I'm
                              guessing there's a missing call to
                              layoutChildren during this resizing.<o:p></o:p></span></p>
                        </div>
                        <div>
                          <p class="MsoNormal"
                            style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                              style="font-size:11.0pt"> <o:p></o:p></span></p>
                        </div>
                        <div>
                          <p class="MsoNormal"
                            style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                              style="font-size:11.0pt">Does anyone have
                              any input here?<o:p></o:p></span></p>
                          <div>
                            <p class="MsoNormal"
                              style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                                style="font-size:11.0pt"> <o:p></o:p></span></p>
                          </div>
                          <div>
                            <p class="MsoNormal"
                              style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                                style="font-size:11.0pt">Thanks,<o:p></o:p></span></p>
                          </div>
                          <div>
                            <p class="MsoNormal"
                              style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                                style="font-size:11.0pt">Nir<o:p></o:p></span></p>
                          </div>
                          <div>
                            <p class="MsoNormal"
                              style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                                style="font-size:11.0pt"> <o:p></o:p></span></p>
                          </div>
                          <div>
                            <p class="MsoNormal"
                              style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                                style="font-size:11.0pt">[1]
                                <a
                                  href="https://bugs.openjdk.org/browse/JDK-8199934"
                                  target="_blank" moz-do-not-send="true"
                                  class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8199934</a><o:p></o:p></span></p>
                          </div>
                          <div>
                            <p class="MsoNormal"
                              style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span
                                style="font-size:11.0pt"> <o:p></o:p></span></p>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </blockquote>
          </div>
        </div>
      </div>
    </blockquote>
  </body>
</html>