This is an automated email from the ASF dual-hosted git repository. ebakke pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push: new 56b82d2f2b Copy FlatLAF label positioning improvements into the Windows LAF. 56b82d2f2b is described below commit 56b82d2f2b62f8b6e1ecde0a73e126e90a88f44d Author: Eirik Bakke <eba...@ultorg.com> AuthorDate: Wed Aug 11 14:27:48 2021 +0200 Copy FlatLAF label positioning improvements into the Windows LAF. This commit copies the previously committed improvements in FlatEditorTabCellRenderer/FlatEditorTabDisplayerUI into the WinFlatEditorTabCellRenderer/WinFlatEditorTabDisplayerUI classes, which were originally copied from the former. (At some point we might want to move the FlatLAF tab control implementations into o.n.swing.tabcontrol so the code can be shared, but they have some dependencies on FlatLAF-specific UI scaling utilities and so on.) --- .../plaf/WinFlatEditorTabCellRenderer.java | 35 +++++++++++----------- .../plaf/WinFlatEditorTabDisplayerUI.java | 15 ++++------ .../tabcontrol/plaf/WinFlatViewTabDisplayerUI.java | 11 ++++--- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatEditorTabCellRenderer.java b/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatEditorTabCellRenderer.java index 24fed97c16..5d5f6f6217 100644 --- a/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatEditorTabCellRenderer.java +++ b/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatEditorTabCellRenderer.java @@ -21,13 +21,14 @@ package org.netbeans.swing.tabcontrol.plaf; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; -import java.awt.FontMetrics; +import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Polygon; import java.awt.Rectangle; +import java.awt.font.FontRenderContext; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.UIManager; @@ -99,25 +100,23 @@ class WinFlatEditorTabCellRenderer extends AbstractTabCellRenderer { } @Override - protected int getCaptionYAdjustment() { - // Workaround for a issue in AbstractTabCellRenderer.paintIconAndText(Graphics), - // which uses font height (which includes font descent) to calculate Y-coordinate - // when available height is equal to font height (availH <= txtH), - // but HtmlRenderer.renderString() expects Y-coordinate at baseline. - // So the text is painted vertically out of center. - // - // This seems to be no issue with other LAFs because they seem to use - // TabPainter insets differently and the available height is larger than - // the font height (availH > txtH), in which case 3 pixels are removed from - // the Y-coordinate to avoid that the text is painted vertically out of center. - - FontMetrics fm = getFontMetrics(getFont()); - int txtH = fm.getHeight(); + protected int getCaptionYPosition(Graphics g) { + Font font = getFont(); + FontRenderContext frc = (g instanceof Graphics2D) + ? ((Graphics2D) g).getFontRenderContext() + : g.getFontMetrics(font).getFontRenderContext(); + /* Don't rely on FontMetrics.getAscent() to get the ascent; it can return values much bigger + than the actual, visual size of the letters. Use the actual height of a flat-topped + upper-case letter instead. */ + double txtVisualAscent = font.createGlyphVector(frc, "H") + .getVisualBounds().getHeight(); Insets ins = getInsets(); int availH = getHeight() - (ins.top + ins.bottom); - // Ad hoc adjustment for the Windows LAF. - int yAdjustment = -1; - return ((availH <= txtH) ? -fm.getDescent() : -1) + yAdjustment; + final int effectiveIconYAdjustment = 1 + getIconYAdjustment(); + + // Center the visual ascent portion of the text vertically with respect to the icon. + return ins.top + (int) Math.round((availH + txtVisualAscent) / 2) + + effectiveIconYAdjustment; } @Override diff --git a/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatEditorTabDisplayerUI.java b/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatEditorTabDisplayerUI.java index 81b59e28bb..2d0242c2bb 100644 --- a/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatEditorTabDisplayerUI.java +++ b/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatEditorTabDisplayerUI.java @@ -66,15 +66,12 @@ public class WinFlatEditorTabDisplayerUI extends BasicScrollingTabDisplayerUI { @Override public Dimension getPreferredSize(JComponent c) { - int prefHeight; - Graphics g = BasicScrollingTabDisplayerUI.getOffscreenGraphics(); - if (g != null) { - FontMetrics fm = g.getFontMetrics(displayer.getFont()); - Insets ins = getTabAreaInsets(); - prefHeight = fm.getHeight() + ins.top + ins.bottom - + tabInsets.top + tabInsets.bottom; - } else - prefHeight = UIScale.scale(28); + Graphics g = BasicScrollingTabDisplayerUI.getOffscreenGraphics(c); + FontMetrics fm = g.getFontMetrics(displayer.getFont()); + Insets ins = getTabAreaInsets(); + // Standard icons are 16 pixels tall, so always allocate space for them. + int prefHeight = Math.max(fm.getHeight(), 16) + ins.top + ins.bottom + + tabInsets.top + tabInsets.bottom; return new Dimension(displayer.getWidth(), prefHeight); } diff --git a/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatViewTabDisplayerUI.java b/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatViewTabDisplayerUI.java index c4c67215af..3e09d0da87 100644 --- a/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatViewTabDisplayerUI.java +++ b/platform/o.n.swing.tabcontrol/src/org/netbeans/swing/tabcontrol/plaf/WinFlatViewTabDisplayerUI.java @@ -188,16 +188,19 @@ public class WinFlatViewTabDisplayerUI extends AbstractViewTabDisplayerUI { // paint text int txtX = x + txtLeftPad; - int txtY = y + tabInsets.top + fm.getAscent(); int availH = height - tabInsets.top - tabInsets.bottom; - if (availH > fm.getHeight()) { - txtY += (availH - fm.getHeight()) / 2; - } int style = HtmlRenderer.STYLE_TRUNCATE; if (!isSelected(index)) { // center text of unselected tabs txtX = Math.max(x + 1, x + ((width - realTxtWidth) / 2)); } + + /* Keep the txtY calculation the same as for WinFlatEditorTabCellRenderer, with an offset that + makes the text in view tabs and editor tabs always line up. */ + double txtVisualAscent = getTxtFont().createGlyphVector(fm.getFontRenderContext(), "H") + .getVisualBounds().getHeight(); + int txtY = tabInsets.top + (int) Math.round((availH + txtVisualAscent) / 2) + 1; + HtmlRenderer.renderString(text, g, txtX, txtY, availTxtWidth, height, getTxtFont(), c, style, true); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists