modules/javafx.controls/src/main/java/javafx/scene/control/skin/ComboBoxPopupControl.java

Print this page




 396 
 397     private Point2D getPrefPopupPosition() {
 398         return com.sun.javafx.util.Utils.pointRelativeTo(getSkinnable(), getPopupContent(), HPos.CENTER, VPos.BOTTOM, 0, 0, true);
 399     }
 400 
 401     private void positionAndShowPopup() {
 402         final PopupControl _popup = getPopup();
 403         _popup.getScene().setNodeOrientation(getSkinnable().getEffectiveNodeOrientation());
 404 
 405 
 406         final Node popupContent = getPopupContent();
 407         sizePopup();
 408 
 409         Point2D p = getPrefPopupPosition();
 410 
 411         popupNeedsReconfiguring = true;
 412         reconfigurePopup();
 413 
 414         final ComboBoxBase<T> comboBoxBase = getSkinnable();
 415         _popup.show(comboBoxBase.getScene().getWindow(),
 416                 snapPosition(p.getX()),
 417                 snapPosition(p.getY()));
 418 
 419         popupContent.requestFocus();
 420 
 421         // second call to sizePopup here to enable proper sizing _after_ the popup
 422         // has been displayed. See RT-37622 for more detail.
 423         sizePopup();
 424     }
 425 
 426     private void sizePopup() {
 427         final Node popupContent = getPopupContent();
 428 
 429         if (popupContent instanceof Region) {
 430             // snap to pixel
 431             final Region r = (Region) popupContent;
 432 
 433             // 0 is used here for the width due to RT-46097
 434             double prefHeight = snapSize(r.prefHeight(0));
 435             double minHeight = snapSize(r.minHeight(0));
 436             double maxHeight = snapSize(r.maxHeight(0));
 437             double h = snapSize(Math.min(Math.max(prefHeight, minHeight), Math.max(minHeight, maxHeight)));
 438 
 439             double prefWidth = snapSize(r.prefWidth(h));
 440             double minWidth = snapSize(r.minWidth(h));
 441             double maxWidth = snapSize(r.maxWidth(h));
 442             double w = snapSize(Math.min(Math.max(prefWidth, minWidth), Math.max(minWidth, maxWidth)));
 443 
 444             popupContent.resize(w, h);
 445         } else {
 446             popupContent.autosize();
 447         }
 448     }
 449 
 450     private void createPopup() {
 451         popup = new PopupControl() {
 452             @Override public Styleable getStyleableParent() {
 453                 return ComboBoxPopupControl.this.getSkinnable();
 454             }
 455             {
 456                 setSkin(new Skin<Skinnable>() {
 457                     @Override public Skinnable getSkinnable() { return ComboBoxPopupControl.this.getSkinnable(); }
 458                     @Override public Node getNode() { return getPopupContent(); }
 459                     @Override public void dispose() { }
 460                 });
 461             }
 462         };




 396 
 397     private Point2D getPrefPopupPosition() {
 398         return com.sun.javafx.util.Utils.pointRelativeTo(getSkinnable(), getPopupContent(), HPos.CENTER, VPos.BOTTOM, 0, 0, true);
 399     }
 400 
 401     private void positionAndShowPopup() {
 402         final PopupControl _popup = getPopup();
 403         _popup.getScene().setNodeOrientation(getSkinnable().getEffectiveNodeOrientation());
 404 
 405 
 406         final Node popupContent = getPopupContent();
 407         sizePopup();
 408 
 409         Point2D p = getPrefPopupPosition();
 410 
 411         popupNeedsReconfiguring = true;
 412         reconfigurePopup();
 413 
 414         final ComboBoxBase<T> comboBoxBase = getSkinnable();
 415         _popup.show(comboBoxBase.getScene().getWindow(),
 416                 snapPositionX(p.getX()),
 417                 snapPositionY(p.getY()));
 418 
 419         popupContent.requestFocus();
 420 
 421         // second call to sizePopup here to enable proper sizing _after_ the popup
 422         // has been displayed. See RT-37622 for more detail.
 423         sizePopup();
 424     }
 425 
 426     private void sizePopup() {
 427         final Node popupContent = getPopupContent();
 428 
 429         if (popupContent instanceof Region) {
 430             // snap to pixel
 431             final Region r = (Region) popupContent;
 432 
 433             // 0 is used here for the width due to RT-46097
 434             double prefHeight = snapSizeY(r.prefHeight(0));
 435             double minHeight = snapSizeY(r.minHeight(0));
 436             double maxHeight = snapSizeY(r.maxHeight(0));
 437             double h = snapSizeY(Math.min(Math.max(prefHeight, minHeight), Math.max(minHeight, maxHeight)));
 438 
 439             double prefWidth = snapSizeX(r.prefWidth(h));
 440             double minWidth = snapSizeX(r.minWidth(h));
 441             double maxWidth = snapSizeX(r.maxWidth(h));
 442             double w = snapSizeX(Math.min(Math.max(prefWidth, minWidth), Math.max(minWidth, maxWidth)));
 443 
 444             popupContent.resize(w, h);
 445         } else {
 446             popupContent.autosize();
 447         }
 448     }
 449 
 450     private void createPopup() {
 451         popup = new PopupControl() {
 452             @Override public Styleable getStyleableParent() {
 453                 return ComboBoxPopupControl.this.getSkinnable();
 454             }
 455             {
 456                 setSkin(new Skin<Skinnable>() {
 457                     @Override public Skinnable getSkinnable() { return ComboBoxPopupControl.this.getSkinnable(); }
 458                     @Override public Node getNode() { return getPopupContent(); }
 459                     @Override public void dispose() { }
 460                 });
 461             }
 462         };