diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/ui/BranchActionUtil.java b/platform/dvcs-impl/src/com/intellij/dvcs/ui/BranchActionUtil.java new file mode 100644 index 000000000000..20be1cc9c0b2 --- /dev/null +++ b/platform/dvcs-impl/src/com/intellij/dvcs/ui/BranchActionUtil.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2016 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.dvcs.ui; + +import java.util.Comparator; +import java.util.List; + +public class BranchActionUtil { + public static final Comparator FAVOURITE_BRANCH_COMPARATOR = (o1, o2) -> { + if (o1.isFavourite() ^ o2.isFavourite()) return o1.isFavourite() ? -1 : 1; + return 0; + }; + + public static int getNumOfFavourites(List branchActions) { + return (int)branchActions.stream().filter(BranchActionGroup::isFavourite).count(); + } +} diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java index 703847b58217..e7a1574cbd7a 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopup.java @@ -18,6 +18,7 @@ package git4idea.ui.branch; import com.intellij.dvcs.DvcsUtil; import com.intellij.dvcs.branch.DvcsBranchPopup; import com.intellij.dvcs.repo.AbstractRepositoryManager; +import com.intellij.dvcs.ui.BranchActionGroup; import com.intellij.dvcs.ui.RootAction; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.DefaultActionGroup; @@ -37,6 +38,8 @@ import java.util.Objects; import static com.intellij.dvcs.branch.DvcsBranchPopup.MyMoreIndex.*; import static com.intellij.dvcs.ui.BranchActionGroupPopup.addMoreActionIfNeeded; +import static com.intellij.dvcs.ui.BranchActionUtil.FAVOURITE_BRANCH_COMPARATOR; +import static com.intellij.dvcs.ui.BranchActionUtil.getNumOfFavourites; import static java.util.stream.Collectors.toList; /** @@ -111,18 +114,24 @@ class GitBranchPopup extends DvcsBranchPopup { popupGroup.addAll(createRepositoriesActions()); popupGroup.addSeparator("Common Local Branches"); - List localBranchActions = + List localBranchActions = myMultiRootBranchConfig.getLocalBranchNames().stream().map(l -> createLocalBranchActions(allRepositories, l)).filter(Objects::nonNull) .collect(toList()); - addMoreActionIfNeeded(localBranchActions, MAX_BRANCH_NUM); - popupGroup.addAll(localBranchActions); + int numOfFavourites = getNumOfFavourites(localBranchActions); + List localBranchPresentationList = + localBranchActions.stream().sorted(FAVOURITE_BRANCH_COMPARATOR).collect(toList()); + addMoreActionIfNeeded(localBranchPresentationList, numOfFavourites > MAX_BRANCH_NUM ? numOfFavourites : MAX_BRANCH_NUM); + popupGroup.addAll(localBranchPresentationList); popupGroup.addSeparator("Common Remote Branches"); - List remoteBranchActions = + List remoteBranchActions = ((GitMultiRootBranchConfig)myMultiRootBranchConfig).getRemoteBranches().stream() .map(r -> new GitBranchPopupActions.RemoteBranchActions(myProject, allRepositories, r, myCurrentRepository)).collect(toList()); - addMoreActionIfNeeded(remoteBranchActions, MAX_BRANCH_NUM); - popupGroup.addAll(remoteBranchActions); + numOfFavourites = getNumOfFavourites(remoteBranchActions); + List remoteBranchPresentationList = + remoteBranchActions.stream().sorted(FAVOURITE_BRANCH_COMPARATOR).collect(toList()); + addMoreActionIfNeeded(remoteBranchPresentationList, numOfFavourites > MAX_BRANCH_NUM ? numOfFavourites : MAX_BRANCH_NUM); + popupGroup.addAll(remoteBranchPresentationList); } @Nullable diff --git a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java index baafdd12481c..f07151e30103 100644 --- a/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java +++ b/plugins/git4idea/src/git4idea/ui/branch/GitBranchPopupActions.java @@ -41,6 +41,8 @@ import java.util.stream.Collectors; import static com.intellij.dvcs.branch.DvcsBranchPopup.MyMoreIndex.MAX_BRANCH_NUM; import static com.intellij.dvcs.ui.BranchActionGroupPopup.addMoreActionIfNeeded; +import static com.intellij.dvcs.ui.BranchActionUtil.FAVOURITE_BRANCH_COMPARATOR; +import static com.intellij.dvcs.ui.BranchActionUtil.getNumOfFavourites; import static git4idea.GitStatisticsCollectorKt.reportUsage; import static git4idea.branch.GitBranchType.GIT_LOCAL; import static git4idea.branch.GitBranchType.GIT_REMOTE; @@ -71,19 +73,25 @@ class GitBranchPopupActions { } popupGroup.addSeparator("Local Branches" + repoInfo); - List localBranchActions = + List localBranchActions = myRepository.getBranches().getLocalBranches().stream().sorted().filter(l -> !l.equals(myRepository.getCurrentBranch())) .map(l -> new LocalBranchActions(myProject, repositoryList, l.getName(), myRepository)).collect( Collectors.toList()); - addMoreActionIfNeeded(localBranchActions, MAX_BRANCH_NUM); - popupGroup.addAll(localBranchActions); + int numOfFavourites = getNumOfFavourites(localBranchActions); + List localBranchPresentationList = + localBranchActions.stream().sorted(FAVOURITE_BRANCH_COMPARATOR).collect(Collectors.toList()); + addMoreActionIfNeeded(localBranchPresentationList, numOfFavourites > MAX_BRANCH_NUM ? numOfFavourites : MAX_BRANCH_NUM); + popupGroup.addAll(localBranchPresentationList); popupGroup.addSeparator("Remote Branches" + repoInfo); - List remoteBranchActions = myRepository.getBranches().getRemoteBranches().stream().sorted() + List remoteBranchActions = myRepository.getBranches().getRemoteBranches().stream().sorted() .map(r -> new RemoteBranchActions(myProject, repositoryList, r.getName(), myRepository)) .collect(Collectors.toList()); - addMoreActionIfNeeded(remoteBranchActions, MAX_BRANCH_NUM); - popupGroup.addAll(remoteBranchActions); + numOfFavourites = getNumOfFavourites(remoteBranchActions); + List remoteBranchPresentationList = + remoteBranchActions.stream().sorted(FAVOURITE_BRANCH_COMPARATOR).collect(Collectors.toList()); + addMoreActionIfNeeded(remoteBranchPresentationList, numOfFavourites > MAX_BRANCH_NUM ? numOfFavourites : MAX_BRANCH_NUM); + popupGroup.addAll(remoteBranchPresentationList); return popupGroup; }