From 2f8cb951b750f0d1c1a69ad4cb38f00d85bc04c1 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 28 Jun 2016 01:04:05 +0300 Subject: [PATCH] sort editor top-bottom components and make breadcrumbs the last --- .../intellij/ui/EditorNotificationPanel.java | 10 ++++++-- .../fileEditor/impl/EditorComposite.java | 24 +++++++++++++++---- .../breadcrumbs/BreadcrumbsXmlWrapper.java | 17 +++++++------ .../xml/breadcrumbs/BreadcrumbsComponent.java | 22 +++++++++++++---- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/EditorNotificationPanel.java b/platform/platform-api/src/com/intellij/ui/EditorNotificationPanel.java index c80b65ab94a4..64790b58a9b7 100644 --- a/platform/platform-api/src/com/intellij/ui/EditorNotificationPanel.java +++ b/platform/platform-api/src/com/intellij/ui/EditorNotificationPanel.java @@ -28,6 +28,7 @@ import com.intellij.openapi.editor.colors.EditorColors; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Iconable; +import com.intellij.openapi.util.Weighted; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiFile; import com.intellij.ui.components.panels.HorizontalLayout; @@ -50,7 +51,7 @@ import java.util.List; /** * @author Dmitry Avdeev */ -public class EditorNotificationPanel extends JPanel implements IntentionActionProvider { +public class EditorNotificationPanel extends JPanel implements IntentionActionProvider, Weighted { protected final JLabel myLabel = new JLabel(); protected final JLabel myGearLabel = new JLabel(); protected final JPanel myLinksPanel = new NonOpaquePanel(new HorizontalLayout(JBUI.scale(5))); @@ -123,7 +124,12 @@ public class EditorNotificationPanel extends JPanel implements IntentionActionPr MyIntentionAction action = new MyIntentionAction(); return action.getOptions().isEmpty() ? null : action; } - + + @Override + public double getWeight() { + return 0; + } + private class MyIntentionAction extends AbstractEmptyIntentionAction implements IntentionActionWithOptions, Iconable { private final List myOptions = new ArrayList(); diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java index f7193dfe616c..7b960ddc0d07 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorComposite.java @@ -30,10 +30,7 @@ import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager; import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory; import com.intellij.openapi.project.DumbService; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.NullUtils; -import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.FocusWatcher; import com.intellij.ui.JBColor; @@ -42,6 +39,7 @@ import com.intellij.ui.SideBorder; import com.intellij.ui.TabbedPaneWrapper; import com.intellij.ui.components.JBPanelWithEmptyText; import com.intellij.ui.components.panels.NonOpaquePanel; +import com.intellij.ui.components.panels.Wrapper; import com.intellij.ui.tabs.UiDecorator; import com.intellij.util.ArrayUtil; import com.intellij.util.ObjectUtils; @@ -326,11 +324,27 @@ public abstract class EditorComposite implements Disposable { else { NonOpaquePanel wrapper = new NonOpaquePanel(component); wrapper.setBorder(createTopBottomSideBorder(top)); - container.add(wrapper); + container.add(wrapper, calcComponentInsertionIndex(component, container)); } container.revalidate(); } + private static int calcComponentInsertionIndex(@NotNull JComponent newComponent, @NotNull JComponent container) { + for (int i = 0, max = container.getComponentCount(); i < max; i++) { + Component childWrapper = container.getComponent(i); + Component childComponent = childWrapper instanceof Wrapper ? ((Wrapper)childWrapper).getTargetComponent() : childWrapper; + boolean weighted1 = newComponent instanceof Weighted; + boolean weighted2 = childComponent instanceof Weighted; + if (!weighted2) continue; + if (!weighted1) return i; + + double w1 = ((Weighted)newComponent).getWeight(); + double w2 = ((Weighted)childComponent).getWeight(); + if (w1 < w2) return i; + } + return -1; + } + public void setDisplayName(@NotNull FileEditor editor, @NotNull String name) { int index = ContainerUtil.indexOfIdentity(ContainerUtil.immutableList(myEditors), editor); assert index != -1; diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java index 7c1ed056f91c..8c128335b111 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java @@ -51,6 +51,8 @@ import com.intellij.psi.*; import com.intellij.ui.Gray; import com.intellij.util.BitUtil; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.ui.JBEmptyBorder; +import com.intellij.util.ui.JBUI; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.UiNotifyConnector; import com.intellij.util.ui.update.Update; @@ -62,7 +64,10 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.PriorityQueue; /** * @author spleaner @@ -76,7 +81,6 @@ public class BreadcrumbsXmlWrapper implements BreadcrumbsItemListener BREADCRUMBS_COMPONENT_KEY = new Key("BREADCRUMBS_KEY"); @@ -198,12 +202,7 @@ public class BreadcrumbsXmlWrapper implements BreadcrumbsItemListener extends JComponent implements Disposable { +public class BreadcrumbsComponent extends JComponent implements Disposable, Weighted { private static final Logger LOG = Logger.getInstance("#com.intellij.xml.breadcrumbs.BreadcrumbsComponent"); private static final Painter DEFAULT_PAINTER = new DefaultPainter(new ButtonSettings()); @@ -337,8 +340,12 @@ public class BreadcrumbsComponent extends JComponent @Override public Dimension getPreferredSize() { - final Graphics2D g2 = (Graphics2D)getGraphics(); - return new Dimension(Integer.MAX_VALUE, g2 != null ? DEFAULT_PAINTER.getSize("DUMMY", g2.getFontMetrics(), Integer.MAX_VALUE).height + 1 : 1); + Border border = getBorder(); + Graphics2D g2 = (Graphics2D)getGraphics(); + Dimension dim = new Dimension(Integer.MAX_VALUE, g2 != null ? DEFAULT_PAINTER.getSize("DUMMY", g2.getFontMetrics(), Integer.MAX_VALUE).height + 1 : 1); + Insets insets = border != null ? border.getBorderInsets(this) : JBUI.emptyInsets(); + dim.height += insets.top + insets.bottom; + return dim; } @Override @@ -354,6 +361,11 @@ public class BreadcrumbsComponent extends JComponent myListeners = null; } + @Override + public double getWeight() { + return Double.MAX_VALUE; + } + private static class PagedImage { private final int myPageWidth; private int myPage; @@ -709,13 +721,13 @@ public class BreadcrumbsComponent extends JComponent final int width = c.getWidth(); if (bg != null) { g2.setColor(bg); - g2.fillRoundRect(offset + 2, 1, width - 4, height - 3, ROUND_VALUE, ROUND_VALUE); + g2.fillRoundRect(offset + 2, 2, width - 4, height - 3, ROUND_VALUE, ROUND_VALUE); } final Color borderColor = s.getBorderColor(c); if (borderColor != null) { g2.setColor(borderColor); - g2.drawRoundRect(offset + 2, 1, width - 4, height - 3, ROUND_VALUE, ROUND_VALUE); + g2.drawRoundRect(offset + 2, 2, width - 4, height - 3, ROUND_VALUE, ROUND_VALUE); } final Color textColor = s.getForegroundColor(c);