package zielu.gittoolbox.ui; import com.google.common.collect.Iterables; import com.intellij.openapi.components.ServiceManager; import git4idea.repo.GitRepository; import git4idea.util.GitUIUtil; import java.util.Map; import java.util.Map.Entry; import jodd.util.StringBand; import zielu.gittoolbox.GitToolBoxConfig; import zielu.gittoolbox.ResBundle; import zielu.gittoolbox.status.GitAheadBehindCount; import zielu.gittoolbox.status.RevListCount; import zielu.gittoolbox.status.Status; import zielu.gittoolbox.util.GtUtil; import zielu.gittoolbox.util.Html; public class StatusMessages { public static StatusMessages getInstance() { return ServiceManager.getService(StatusMessages.class); } private StatusPresenter presenter() { return GitToolBoxConfig.getInstance().getPresenter(); } public String behindStatus(RevListCount behindCount) { switch (behindCount.status()) { case Success: { if (behindCount.value() > 0) { return presenter().behindStatus(behindCount.value()); } else { return ResBundle.getString("message.up.to.date"); } } default: { return commonStatus(behindCount.status()); } } } public String aheadBehindStatus(GitAheadBehindCount count) { switch (count.status()) { case Success: { if (count.isNotZero()) { return presenter().aheadBehindStatus(count.ahead.value(), count.behind.value()); } else { return ResBundle.getString("message.up.to.date"); } } default: { return commonStatus(count.status()); } } } private String commonStatus(Status status) { switch (status) { case Cancel: { return ResBundle.getString("message.cancelled"); } case Failure: { return ResBundle.getString("message.failure"); } case NoRemote: { return ResBundle.getString("message.no.remote"); } default: { return ResBundle.getString("message.unknown"); } } } private String repoNamePrefix(GitRepository repository) { return GitUIUtil.code(GtUtil.name(repository) + ": "); } private StringBand prepareSingleLineMessage(GitRepository repository, RevListCount status, boolean forceRepoName) { StringBand message = new StringBand(); if (forceRepoName) { message.append(repoNamePrefix(repository)); } message.append(behindStatus(status)); return message; } private StringBand prepareMultiLineMessage(Map<GitRepository, RevListCount> statuses) { StringBand result = new StringBand(); boolean first = true; for (Entry<GitRepository, RevListCount> status : statuses.entrySet()) { if (!first) { result.append(Html.br); } else { first = false; } result.append(repoNamePrefix(status.getKey())) .append(behindStatus(status.getValue())); } return result; } public String prepareBehindMessage(Map<GitRepository, RevListCount> statuses) { return prepareBehindMessage(statuses, false); } public String prepareBehindMessage(Map<GitRepository, RevListCount> statuses, boolean forceRepoNames) { StringBand message = new StringBand(); if (statuses.size() == 1) { Entry<GitRepository, RevListCount> entry = Iterables.getOnlyElement(statuses.entrySet()); message.append(prepareSingleLineMessage(entry.getKey(), entry.getValue(), forceRepoNames)); } else { message.append(prepareMultiLineMessage(statuses)); } return message.toString(); } }