From 1993ff8239392bf4a949e41d983e306e8c9ca337 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 19 Oct 2012 15:41:04 +0400 Subject: [PATCH] IDEA-89505 Git branches: for the multi-repository case display current branch of each repository more evidently Draw branch name near repository name, aligned to the right and grayed. Override getListElementRenderer & createItemComponent: create a second label to display the branch name, and align it to the right. --- .../intellij/ui/GroupedElementsRenderer.java | 21 ++- .../popup/list/GroupedItemsListRenderer.java | 162 +++++++++--------- .../git4idea/ui/branch/GitBranchPopup.java | 106 ++++++++++-- 3 files changed, 188 insertions(+), 101 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java b/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java index 314dfbbc0fc1..3aada3aa9206 100644 --- a/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java +++ b/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java @@ -63,24 +63,33 @@ public abstract class GroupedElementsRenderer { myComponent.setBorder(getSelectedBorder()); setSelected(myComponent); setSelected(myTextLabel); - if (UIUtil.isUnderNimbusLookAndFeel()) { - myTextLabel.setOpaque(true); - } } else { myComponent.setBorder(getBorder()); setDeselected(myComponent); setDeselected(myTextLabel); - if (UIUtil.isUnderGTKLookAndFeel() || UIUtil.isUnderNimbusLookAndFeel()) { - myTextLabel.setOpaque(false); - } } + adjustOpacity(myTextLabel, isSelected); + myRendererComponent.setPrefereedWidth(preferredForcedWidth); return myRendererComponent; } + protected static void adjustOpacity(JComponent component, boolean selected) { + if (selected) { + if (UIUtil.isUnderNimbusLookAndFeel()) { + component.setOpaque(true); + } + } + else { + if (UIUtil.isUnderGTKLookAndFeel() || UIUtil.isUnderNimbusLookAndFeel()) { + component.setOpaque(false); + } + } + } + protected final void setSelected(JComponent aComponent) { aComponent.setBackground(getSelectionBackground()); aComponent.setForeground(getSelectionForeground()); diff --git a/platform/platform-impl/src/com/intellij/ui/popup/list/GroupedItemsListRenderer.java b/platform/platform-impl/src/com/intellij/ui/popup/list/GroupedItemsListRenderer.java index bdcad53c2eb9..5863a5481a92 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/list/GroupedItemsListRenderer.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/list/GroupedItemsListRenderer.java @@ -1,79 +1,83 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.ui.popup.list; - -import com.intellij.openapi.ui.popup.ListItemDescriptor; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.ui.ErrorLabel; -import com.intellij.ui.GroupedElementsRenderer; -import com.intellij.ui.components.panels.OpaquePanel; - -import javax.swing.*; -import java.awt.*; - -public class GroupedItemsListRenderer extends GroupedElementsRenderer.List implements ListCellRenderer { - - - protected ListItemDescriptor myDescriptor; - - protected JLabel myNextStepLabel; - - public JLabel getNextStepLabel() { - return myNextStepLabel; - } - - - public GroupedItemsListRenderer(ListItemDescriptor descriptor) { - myDescriptor = descriptor; - } - - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - String caption = myDescriptor.getCaptionAboveOf(value); - boolean hasSeparator = myDescriptor.hasSeparatorAboveOf(value); - if (index == 0 && StringUtil.isEmptyOrSpaces(caption)) hasSeparator = false; - - final JComponent result = configureComponent(myDescriptor.getTextFor(value), myDescriptor.getTooltipFor(value), - myDescriptor.getIconFor(value), myDescriptor.getIconFor(value), isSelected, hasSeparator, - caption, -1); - - customizeComponent(list, value, isSelected); - return result; - } - - - protected JComponent createItemComponent() { - JPanel result = new OpaquePanel(new BorderLayout(4, 4), Color.white); - - myTextLabel = new ErrorLabel(); - myTextLabel.setOpaque(true); - myTextLabel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); - - myNextStepLabel = new JLabel(); - myNextStepLabel.setOpaque(true); - - result.add(myTextLabel, BorderLayout.CENTER); - result.add(myNextStepLabel, BorderLayout.EAST); - - result.setBorder(getDefaultItemComponentBorder()); - - return result; - } - - protected void customizeComponent(JList list, Object value, boolean isSelected) { - } - - -} +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ui.popup.list; + +import com.intellij.openapi.ui.popup.ListItemDescriptor; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.ui.ErrorLabel; +import com.intellij.ui.GroupedElementsRenderer; +import com.intellij.ui.components.panels.OpaquePanel; + +import javax.swing.*; +import java.awt.*; + +public class GroupedItemsListRenderer extends GroupedElementsRenderer.List implements ListCellRenderer { + + + protected ListItemDescriptor myDescriptor; + + protected JLabel myNextStepLabel; + + public JLabel getNextStepLabel() { + return myNextStepLabel; + } + + + public GroupedItemsListRenderer(ListItemDescriptor descriptor) { + myDescriptor = descriptor; + } + + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + String caption = myDescriptor.getCaptionAboveOf(value); + boolean hasSeparator = myDescriptor.hasSeparatorAboveOf(value); + if (index == 0 && StringUtil.isEmptyOrSpaces(caption)) hasSeparator = false; + + final JComponent result = configureComponent(myDescriptor.getTextFor(value), myDescriptor.getTooltipFor(value), + myDescriptor.getIconFor(value), myDescriptor.getIconFor(value), isSelected, hasSeparator, + caption, -1); + + customizeComponent(list, value, isSelected); + return result; + } + + + protected JComponent createItemComponent() { + myTextLabel = new ErrorLabel(); + myTextLabel.setOpaque(true); + myTextLabel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); + + return layoutComponent(myTextLabel); + } + + protected final JComponent layoutComponent(JComponent middleItemComponent) { + JPanel result = new OpaquePanel(new BorderLayout(4, 4), Color.white); + + myNextStepLabel = new JLabel(); + myNextStepLabel.setOpaque(true); + + result.add(middleItemComponent, BorderLayout.CENTER); + result.add(myNextStepLabel, BorderLayout.EAST); + + result.setBorder(getDefaultItemComponentBorder()); + + return result; + } + + protected void customizeComponent(JList list, Object value, boolean isSelected) { + } + + +} diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java index 24da0baed9f4..738d604d1256 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java @@ -28,10 +28,14 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.util.Condition; +import com.intellij.ui.ErrorLabel; +import com.intellij.ui.components.panels.OpaquePanel; import com.intellij.ui.popup.PopupFactoryImpl; import com.intellij.ui.popup.WizardPopup; import com.intellij.ui.popup.list.ListPopupImpl; +import com.intellij.ui.popup.list.PopupListElementRenderer; import com.intellij.util.PlatformIcons; +import com.intellij.util.ui.UIUtil; import git4idea.GitUtil; import git4idea.GitVcs; import git4idea.config.GitVcsSettings; @@ -43,6 +47,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.HyperlinkEvent; +import java.awt.*; import java.util.List; /** @@ -113,22 +118,8 @@ class GitBranchPopup { return false; } }; - myPopup = new PopupFactoryImpl.ActionGroupPopup( - title, createActions(), - SimpleDataContext.getProjectContext(project), - false, false, false, true, null, -1, preselectActionCondition, null) { - @Override - protected WizardPopup createPopup(WizardPopup parent, PopupStep step, Object parentValue) { - WizardPopup popup = super.createPopup(parent, step, parentValue); - if (parentValue instanceof PopupFactoryImpl.ActionItem) { - AnAction action = ((PopupFactoryImpl.ActionItem)parentValue).getAction(); - if (action instanceof RootAction) { - popup.setAdText(((RootAction)action).getCaption()); - } - } - return popup; - } - }; + + myPopup = new GitBranchActionGroupPopup(title, project, preselectActionCondition); initBranchSyncPolicyIfNotInitialized(); setCurrentBranchInfo(); @@ -287,6 +278,89 @@ class GitBranchPopup { return "Current branch in " + GitUIUtil.getShortRepositoryName(myRepository) + ": " + GitBranchUiUtil.getDisplayableBranchText(myRepository); } + + @NotNull + public String getBranch() { + return GitBranchUiUtil.getBranchNameOrRev(myRepository); + } } + private class GitBranchActionGroupPopup extends PopupFactoryImpl.ActionGroupPopup { + public GitBranchActionGroupPopup(@NotNull String title, @NotNull Project project, + @NotNull Condition preselectActionCondition) { + super(title, GitBranchPopup.this.createActions(), SimpleDataContext.getProjectContext(project), false, false, false, true, null, -1, + preselectActionCondition, null); + } + + @Override + protected WizardPopup createPopup(WizardPopup parent, PopupStep step, Object parentValue) { + WizardPopup popup = super.createPopup(parent, step, parentValue); + RootAction rootAction = getRootAction(parentValue); + if (rootAction != null) { + popup.setAdText((rootAction).getCaption()); + } + return popup; + } + + @Nullable + private RootAction getRootAction(Object value) { + if (value instanceof PopupFactoryImpl.ActionItem) { + AnAction action = ((PopupFactoryImpl.ActionItem)value).getAction(); + if (action instanceof RootAction) { + return (RootAction)action; + } + } + return null; + } + + @Override + protected ListCellRenderer getListElementRenderer() { + return new PopupListElementRenderer(this) { + + private ErrorLabel myBranchLabel; + + @Override + protected void customizeComponent(JList list, Object value, boolean isSelected) { + super.customizeComponent(list, value, isSelected); + + RootAction rootAction = getRootAction(value); + if (rootAction != null) { + myBranchLabel.setVisible(true); + myBranchLabel.setText(String.format("[%s]", rootAction.getBranch())); + + if (isSelected) { + setSelected(myBranchLabel); + } + else { + myBranchLabel.setBackground(getBackground()); + myBranchLabel.setForeground(Color.gray); // different foreground than for other elements + } + + adjustOpacity(myBranchLabel, isSelected); + } + else { + myBranchLabel.setVisible(false); + } + } + + @Override + protected JComponent createItemComponent() { + myTextLabel = new ErrorLabel(); + myTextLabel.setOpaque(true); + myTextLabel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); + + myBranchLabel = new ErrorLabel(); + myBranchLabel.setOpaque(true); + myBranchLabel.setBorder(BorderFactory.createEmptyBorder(1, UIUtil.DEFAULT_HGAP, 1, 1)); + + JPanel compoundPanel = new OpaquePanel(new BorderLayout(), Color.white); + compoundPanel.add(myTextLabel, BorderLayout.CENTER); + compoundPanel.add(myBranchLabel, BorderLayout.EAST); + + return layoutComponent(compoundPanel); + } + + }; + } + } }