Merge of lombok-intellij-plugin:.=>community/plugins/lombok
[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.util.NlsSafe;
6 import com.intellij.openapi.vcs.VcsBundle;
7 import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkHtmlRenderer;
8 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
9 import com.intellij.util.containers.Convertor;
10 import com.intellij.vcsUtil.VcsUtil;
11 import com.intellij.xml.util.XmlStringUtil;
12 import org.jetbrains.annotations.Nls;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15
16 public class AnnotationTooltipBuilder {
17   @NotNull private final Project myProject;
18   private final boolean myAsHtml;
19
20   private final @Nls StringBuilder sb = new StringBuilder();
21
22   public AnnotationTooltipBuilder(@NotNull Project project, boolean asHtml) {
23     myProject = project;
24     myAsHtml = asHtml;
25   }
26
27   private void append(@NotNull @Nls String text) {
28     sb.append(myAsHtml ? XmlStringUtil.escapeString(text) : text);
29   }
30
31   private void appendRaw(@NotNull @Nls String text) {
32     sb.append(text);
33   }
34
35   public void appendRevisionLine(@NotNull VcsRevisionNumber revisionNumber,
36                                  @Nullable Convertor<? super VcsRevisionNumber, String> linkBuilder) {
37     appendNewline();
38
39     String revision;
40     if (myAsHtml) {
41       revision = linkBuilder != null ? linkBuilder.convert(revisionNumber) : null;
42       if (revision == null) {
43         revision = XmlStringUtil.escapeString(revisionNumber.asString());
44       }
45     }
46     else {
47       revision = revisionNumber.asString();
48     }
49     appendRaw(VcsBundle.message("commit.description.tooltip.commit", revision));
50   }
51
52   public void appendLine(@NotNull @Nls String content) {
53     appendNewline();
54     append(content);
55   }
56
57   public void appendCommitMessageBlock(@NotNull @Nls String message) {
58     append("\n\n");
59     appendTextWithLinks(message);
60   }
61
62   public void appendTextWithLinks(@NotNull @Nls String message) {
63     if (myAsHtml) {
64       appendRaw(IssueLinkHtmlRenderer.formatTextWithLinks(myProject, message));
65     }
66     else {
67       append(VcsUtil.trimCommitMessageToSaneSize(message));
68     }
69   }
70
71   private void appendNewline() {
72     if (sb.length() != 0) append("\n");
73   }
74
75   @Nls
76   @Override
77   public String toString() {
78     return sb.toString();
79   }
80
81   @Nls
82   @NotNull
83   public static String buildSimpleTooltip(@NotNull Project project,
84                                           boolean asHtml,
85                                           @NotNull @Nls String prefix,
86                                           @NotNull @NlsSafe String revision,
87                                           @Nullable @Nls String commitMessage) {
88     AnnotationTooltipBuilder builder = new AnnotationTooltipBuilder(project, asHtml);
89     builder.append(prefix);
90     builder.append(" ");
91     builder.append(revision);
92     if (commitMessage != null) {
93       builder.append(": ");
94       builder.appendTextWithLinks(commitMessage);
95     }
96     return builder.toString();
97   }
98 }