From df5e9e211e2af12bb99429a572f1a0005f7165ca Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Tue, 2 Oct 2018 23:54:12 +0300 Subject: [PATCH] IDEA-196056 Plugins: fix "Plugins" button base line --- .../components/breadcrumbs/Breadcrumbs.java | 5 +- .../plugins/PluginManagerConfigurableNew.java | 10 +++- .../ide/plugins/newui/TabHeaderComponent.java | 16 +++-- .../openapi/options/newEditor/Banner.java | 9 +++ .../options/newEditor/SimpleBanner.java | 59 ++++++++++++++++++- .../newEditor/SingleSettingEditor.java | 8 ++- 6 files changed, 97 insertions(+), 10 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/components/breadcrumbs/Breadcrumbs.java b/platform/platform-api/src/com/intellij/ui/components/breadcrumbs/Breadcrumbs.java index a5bbc4af82bc..461498d330c8 100644 --- a/platform/platform-api/src/com/intellij/ui/components/breadcrumbs/Breadcrumbs.java +++ b/platform/platform-api/src/com/intellij/ui/components/breadcrumbs/Breadcrumbs.java @@ -120,8 +120,9 @@ public class Breadcrumbs extends JBPanelWithEmptyText { repaint(); } - public int getBaseline() { - return views.isEmpty() ? 0 : views.get(0).getBaseline(); + @Override + public int getBaseline(int width, int height) { + return views.isEmpty() ? -1 : views.get(0).getBaseline(); } @Override diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNew.java b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNew.java index 55510952f0c2..182b8623867f 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNew.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManagerConfigurableNew.java @@ -35,6 +35,7 @@ import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.components.JBTextField; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.labels.LinkListener; +import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.HttpRequests; @@ -287,7 +288,14 @@ public class PluginManagerConfigurableNew myCardPanel.select(Pair.create(descriptor, label != null && currentTab == UPDATES_TAB), true); myPluginsModel.detailPanel.backTabIndex = currentTab; - myTopController.setLeftComponent(backButton); + NonOpaquePanel buttonPanel = new NonOpaquePanel(backButton) { + @Override + public int getBaseline(int width, int height) { + return backButton.getBaseline(width, height); + } + }; + buttonPanel.setBorder(JBUI.Borders.empty(0, 3)); + myTopController.setLeftComponent(buttonPanel); myTabHeaderComponent.clearSelection(); }; diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/TabHeaderComponent.java b/platform/platform-impl/src/com/intellij/ide/plugins/newui/TabHeaderComponent.java index 8dec52800067..b3aa73b64254 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/newui/TabHeaderComponent.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/TabHeaderComponent.java @@ -219,13 +219,9 @@ public class TabHeaderComponent extends JComponent { super.paintComponent(g); calculateSize(); - FontMetrics fm = getFontMetrics(getFont()); int x = getStartX(); int height = getHeight(); - int tabTitleY = fm.getAscent() + (height - fm.getHeight()) / 2; - if (myBreadcrumbs != null) { - tabTitleY = myBaselineY + myBreadcrumbs.getBaseline(); - } + int tabTitleY = getBaseline(-1, -1); for (int i = 0, size = myTabs.size(); i < size; i++) { if (mySelectionTab == i || myHoverTab == i) { @@ -241,6 +237,16 @@ public class TabHeaderComponent extends JComponent { } } + @Override + public int getBaseline(int width, int height) { + FontMetrics fm = getFontMetrics(getFont()); + int tabTitleY = fm.getAscent() + (getHeight() - fm.getHeight()) / 2; + if (myBreadcrumbs != null) { + tabTitleY = myBaselineY + Math.max(myBreadcrumbs.getBaseline(-1, -1), 0); + } + return tabTitleY; + } + @Override public void setBounds(int x, int y, int width, int height) { myBaselineY = y; diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/Banner.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/Banner.java index 9b185a464fe7..ec8522fb30a5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/Banner.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/Banner.java @@ -79,4 +79,13 @@ final class Banner extends SimpleBanner { super.setLeftComponent(component); myBreadcrumbs.setVisible(component == null); } + + @Override + void updateProgressBorder() { + } + + @Override + Component getBaselineTemplate() { + return myBreadcrumbs; + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SimpleBanner.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SimpleBanner.java index 5f2edf3444c7..849ea92e31a7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SimpleBanner.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SimpleBanner.java @@ -4,6 +4,7 @@ package com.intellij.openapi.options.newEditor; import com.intellij.ui.AnimatedIcon; import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.util.ui.EmptyIcon; +import com.intellij.util.ui.JBUI; import javax.swing.*; import java.awt.*; @@ -15,17 +16,63 @@ class SimpleBanner extends JPanel { private final AnimatedIcon.Default myAnimatedIcon = new AnimatedIcon.Default(); private boolean myShowProgress; - protected final JPanel myLeftPanel = new NonOpaquePanel(new FlowLayout(FlowLayout.CENTER, 0, 0)); + protected final JPanel myLeftPanel; protected final JLabel myProgress = new JLabel(EmptyIcon.ICON_16); protected Component myLeftComponent; protected Component myCenterComponent; SimpleBanner() { super(new BorderLayout(10, 0)); + myLeftPanel = new NonOpaquePanel(new FlowLayout(FlowLayout.CENTER, 0, 0) { + @Override + public Dimension preferredLayoutSize(Container target) { + return getPreferredLeftPanelSize(super.preferredLayoutSize(target)); + } + + @Override + public void layoutContainer(Container target) { + super.layoutContainer(target); + baselineLayout(); + } + }); myLeftPanel.add(myProgress); add(BorderLayout.WEST, myLeftPanel); } + Dimension getPreferredLeftPanelSize(Dimension size) { + return size; + } + + private void baselineLayout() { + Component template = getBaselineTemplate(); + if (template == null) { + return; + } + + int baseline = template.getBaseline(template.getWidth(), template.getHeight()); + if (baseline == -1) { + return; + } + + int components = myLeftPanel.getComponentCount(); + for (int i = 0; i < components; i++) { + Component component = myLeftPanel.getComponent(i); + if (component == template) { + continue; + } + + int y; + if (component == myProgress) { + y = (int)(JBUI.scale(1.5f) + (template.getHeight() - component.getHeight()) / 2f); + } + else { + y = baseline - component.getBaseline(component.getWidth(), component.getHeight()); + } + + component.setLocation(component.getX(), y); + } + } + void setLeftComponent(Component component) { if (myLeftComponent != null) { myLeftPanel.remove(myLeftComponent); @@ -35,6 +82,7 @@ class SimpleBanner extends JPanel { myLeftComponent = component; myLeftPanel.add(component, 0); } + updateProgressBorder(); } void setCenterComponent(Component component) { @@ -52,9 +100,18 @@ class SimpleBanner extends JPanel { void showProgress(boolean start) { myShowProgress = start; myProgress.setIcon(start ? myAnimatedIcon : EmptyIcon.ICON_16); + updateProgressBorder(); + } + + void updateProgressBorder() { + myProgress.setBorder(myLeftPanel.getComponentCount() == 1 ? JBUI.Borders.emptyLeft(10) : null); } boolean canShow() { return myLeftComponent != null || myCenterComponent != null || myShowProgress; } + + Component getBaselineTemplate() { + return myCenterComponent; + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SingleSettingEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SingleSettingEditor.java index f33f9399be6b..97e8f59456e3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SingleSettingEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SingleSettingEditor.java @@ -3,6 +3,7 @@ package com.intellij.openapi.options.newEditor; import com.intellij.openapi.Disposable; import com.intellij.openapi.options.Configurable; +import com.intellij.util.ui.JBUI; import java.awt.*; import java.util.HashMap; @@ -12,7 +13,12 @@ import java.util.Map; * @author Alexander Lobas */ public class SingleSettingEditor extends ConfigurableEditor { - private final SimpleBanner myBanner = new SimpleBanner(); + private final SimpleBanner myBanner = new SimpleBanner() { + @Override + Dimension getPreferredLeftPanelSize(Dimension size) { + return new Dimension(size.width, JBUI.scale(35)); + } + }; private final Map myControllers = new HashMap<>(); private ConfigurableController myLastController;