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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists