From 155cde50b64bd7cf8f2587b3416347bc8b2a053e Mon Sep 17 00:00:00 2001 From: graann Date: Wed, 30 May 2018 14:25:11 +0300 Subject: [PATCH] Incorrect close button position (#IDEA-192960) --- .../wm/impl/content/ContentTabLabel.java | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentTabLabel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentTabLabel.java index 065889d805e3..87efed59a0de 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentTabLabel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentTabLabel.java @@ -42,6 +42,7 @@ class ContentTabLabel extends BaseLabel { private final List additionalIcons = new ArrayList<>(); private String txt = null; + private int iconWithInsetsWidth; private final AdditionalIcon closeTabIcon = new AdditionalIcon(closeIcon) { private static final String ACTION_NAME = "Close tab"; @@ -140,16 +141,18 @@ class ContentTabLabel extends BaseLabel { @Override public void setText(String text) { txt = text; - int iconWidth = updateAndGetInsetsWidth(); + updateText(); + } + private void updateText() { FontMetrics fm = getFontMetrics(getFont()); - int textWidth = SwingUtilities2.stringWidth(this, fm, text); - int prefWidth = iconWidth + textWidth; + int textWidth = SwingUtilities2.stringWidth(this, fm, txt); + int prefWidth = iconWithInsetsWidth + textWidth; int maxWidth = getMaximumSize().width; if(prefWidth > maxWidth) { - int offset = maxWidth - iconWidth; + int offset = maxWidth - iconWithInsetsWidth; String s = SwingUtilities2.clipString(this, fm, txt, offset); super.setText(s); return; @@ -241,34 +244,42 @@ class ContentTabLabel extends BaseLabel { updateTextAndIcon(myContent, isSelected()); } + @Override public Dimension getPreferredSize() { final Dimension size = super.getPreferredSize(); - int x = 0; + int iconWidth = 0; Map> map = additionalIcons.stream().filter(icon -> icon.getAvailable()).collect(Collectors.groupingBy(icon -> icon.getAfterText())); + int right = DEFAULT_HORIZONTAL_INSET; + int left = DEFAULT_HORIZONTAL_INSET; + if (map.get(false) != null) { - x = ICONS_GAP; + iconWidth = ICONS_GAP; for (AdditionalIcon icon : map.get(false)) { - icon.setX(x); - x += icon.getIconWidth() + ICONS_GAP; + icon.setX(iconWidth); + iconWidth += icon.getIconWidth() + ICONS_GAP; } - x = 0; + left = iconWidth; + iconWidth = 0; } - x += size.width; - if (map.get(true) != null) { + right = ICONS_GAP + 4; + for (AdditionalIcon icon : map.get(true)) { - icon.setX(x + ICONS_GAP - getInsets().right); - x += icon.getIconWidth() + ICONS_GAP; + icon.setX(iconWidth + size.width + ICONS_GAP - right); + iconWidth += icon.getIconWidth() + ICONS_GAP; } } - return new Dimension(x, size.height); + setBorder(JBUI.Borders.empty(0, left, 0, right)); + iconWithInsetsWidth = iconWidth + right + left; + + return new Dimension(iconWidth + size.width, size.height); } private int updateAndGetInsetsWidth() {