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