IDEA-212693 vcs: show navigatable links in annotations popup
[idea/community.git] / platform / vcs-impl / src / git4idea / annotate / AnnotationTooltipBuilder.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package git4idea.annotate;
3
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkHtmlRenderer;
6 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
7 import com.intellij.util.containers.Convertor;
8 import com.intellij.vcsUtil.VcsUtil;
9 import com.intellij.xml.util.XmlStringUtil;
10 import org.jetbrains.annotations.NotNull;
11 import org.jetbrains.annotations.Nullable;
12
13 public class AnnotationTooltipBuilder {
14   @NotNull private final Project myProject;
15   private final boolean myAsHtml;
16
17   private final StringBuilder sb = new StringBuilder();
18
19   public AnnotationTooltipBuilder(@NotNull Project project, boolean asHtml) {
20     myProject = project;
21     myAsHtml = asHtml;
22   }
23
24   private void append(@NotNull String text) {
25     sb.append(myAsHtml ? XmlStringUtil.escapeString(text) : text);
26   }
27
28   private void appendRaw(@NotNull String text) {
29     sb.append(text);
30   }
31
32   public void appendRevisionLine(@NotNull VcsRevisionNumber revisionNumber,
33                                  @Nullable Convertor<? super VcsRevisionNumber, String> linkBuilder) {
34     appendNewline();
35     append("commit ");
36
37     String link = myAsHtml && linkBuilder != null ? linkBuilder.convert(revisionNumber) : null;
38     if (link != null) {
39       appendRaw(link);
40     }
41     else {
42       append(revisionNumber.asString());
43     }
44   }
45
46   public void appendLine(@NotNull String content) {
47     appendNewline();
48     append(content);
49   }
50
51   public void appendCommitMessageBlock(@NotNull String message) {
52     append("\n\n");
53     appendTextWithLinks(message);
54   }
55
56   public void appendTextWithLinks(@NotNull String message) {
57     if (myAsHtml) {
58       appendRaw(IssueLinkHtmlRenderer.formatTextWithLinks(myProject, message));
59     }
60     else {
61       append(VcsUtil.trimCommitMessageToSaneSize(message));
62     }
63   }
64
65   private void appendNewline() {
66     if (sb.length() != 0) append("\n");
67   }
68
69   @Override
70   public String toString() {
71     return sb.toString();
72   }
73
74   @NotNull
75   public static String buildSimpleTooltip(@NotNull Project project,
76                                           boolean asHtml,
77                                           @NotNull String prefix,
78                                           @NotNull String revision,
79                                           @Nullable String commitMessage) {
80     AnnotationTooltipBuilder builder = new AnnotationTooltipBuilder(project, asHtml);
81     builder.append(prefix);
82     builder.append(" ");
83     builder.append(revision);
84     if (commitMessage != null) {
85       builder.append(": ");
86       builder.appendTextWithLinks(commitMessage);
87     }
88     return builder.toString();
89   }
90 }