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 }; |