diff -r 5563905417bb -r d1626c1471cf javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TabPaneSkin.java --- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TabPaneSkin.java Wed Jan 02 13:05:34 2013 +0100 +++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TabPaneSkin.java Wed Jan 02 23:45:45 2013 +0100 @@ -61,7 +61,9 @@ import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; +import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; +import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.scene.transform.Rotate; import javafx.util.Duration; @@ -919,6 +921,10 @@ updateGraphicRotation(); + final int padding = 1; + final Rectangle keyboardFocus = new Rectangle(); + keyboardFocus.getStyleClass().add("focus-indicator"); + inner = new StackPane() { @Override protected void layoutChildren() { Side tabPosition = getSkinnable().getSide(); @@ -929,8 +935,11 @@ double w = getWidth() - paddingLeft + paddingRight; double h = getHeight() - paddingTop + paddingBottom; - double labelWidth = snapSize(label.prefWidth(-1)); - double labelHeight = snapSize(label.prefHeight(-1)); + double prefLabelWidth = snapSize(label.prefWidth(-1)); + double prefLabelHeight = snapSize(label.prefHeight(-1)); + + double labelAreaWidth = prefLabelWidth; + double labelAreaHeight = prefLabelHeight; double closeBtnWidth = showCloseButton() ? snapSize(closeBtn.prefWidth(-1)) : 0; double closeBtnHeight = showCloseButton() ? snapSize(closeBtn.prefHeight(-1)) : 0; double minWidth = snapSize(getSkinnable().getTabMinWidth()); @@ -938,38 +947,51 @@ double minHeight = snapSize(getSkinnable().getTabMinHeight()); double maxHeight = snapSize(getSkinnable().getTabMaxHeight()); - double childrenWidth = labelWidth + closeBtnWidth; - double childrenHeight = Math.max(labelHeight, closeBtnHeight); + double childrenWidth = labelAreaWidth + closeBtnWidth; + double childrenHeight = Math.max(labelAreaHeight, closeBtnHeight); + double labelWidth = prefLabelWidth; + double labelHeight = prefLabelHeight; + if (childrenWidth > maxWidth && maxWidth != Double.MAX_VALUE) { + labelAreaWidth = maxWidth - closeBtnWidth; labelWidth = maxWidth - closeBtnWidth; } else if (childrenWidth < minWidth) { - labelWidth = minWidth - closeBtnWidth; + labelAreaWidth = minWidth - closeBtnWidth; } if (childrenHeight > maxHeight && maxHeight != Double.MAX_VALUE) { + labelAreaHeight = maxHeight; labelHeight = maxHeight; } else if (childrenHeight < minHeight) { - labelHeight = minHeight; + labelAreaHeight = minHeight; } if (animating) { - if (prefWidth.getValue() < labelWidth) { - labelWidth = prefWidth.getValue(); + if (prefWidth.getValue() < labelAreaWidth) { + labelAreaWidth = prefWidth.getValue(); } closeBtn.setVisible(false); } else { closeBtn.setVisible(showCloseButton()); } + label.resize(labelWidth, labelHeight); - + + double labelStartX = paddingLeft; double closeBtnStartX = (maxWidth != Double.MAX_VALUE ? maxWidth : w) - paddingRight - closeBtnWidth; - positionInArea(label, labelStartX, paddingTop, labelWidth, h, + positionInArea(label, labelStartX, paddingTop, labelAreaWidth, h, /*baseline ignored*/0, HPos.CENTER, VPos.CENTER); + keyboardFocus.setX(label.getLayoutX() - padding); + keyboardFocus.setY(label.getLayoutY() - padding); + keyboardFocus.setWidth(label.getWidth() + padding*2); + keyboardFocus.setHeight(label.getHeight() + padding*2); + + if (closeBtn.isVisible()) { closeBtn.resize(closeBtnWidth, closeBtnHeight); positionInArea(closeBtn, closeBtnStartX, paddingTop, closeBtnWidth, h, @@ -979,7 +1001,7 @@ }; inner.getStyleClass().add("tab-container"); inner.setRotate(getSkinnable().getSide().equals(Side.BOTTOM) ? 180.0F : 0.0F); - inner.getChildren().addAll(label, closeBtn); + inner.getChildren().addAll(label, keyboardFocus, closeBtn); getChildren().addAll(inner); diff -r 5563905417bb -r d1626c1471cf javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css --- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css Wed Jan 02 13:05:34 2013 +0100 +++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css Wed Jan 02 23:45:45 2013 +0100 @@ -2631,6 +2631,16 @@ -fx-background-radius: 5 5 0 0, 4 4 0 0; } +.tab-pane > .tab-header-area > .headers-region > .tab .focus-indicator { + -fx-fill: transparent; +} + +.tab-pane:focused > .tab-header-area > .headers-region > .tab:selected .focus-indicator { + -fx-stroke: -fx-focus-color; + -fx-stroke-width: 1; + -fx-stroke-dash-array: 5 3; +} + .tab-pane > .tab-header-area > .headers-region > .tab:disabled { -fx-opacity: -fx-disabled-opacity; }