use of com.android.utils.HtmlBuilder in project android by JetBrains.
the class RenderProblem method createPlain.
@NotNull
public static RenderProblem createPlain(@NotNull HighlightSeverity severity, @NotNull String message, @NotNull Project project, @NotNull HtmlLinkManager linkManager, @Nullable Throwable throwable) {
Html problem = new Html(severity, ourNextOrdinal++);
HtmlBuilder builder = problem.getHtmlBuilder();
builder.add(message);
if (throwable != null) {
String url = linkManager.createRunnableLink(new ShowExceptionFix(project, throwable));
builder.add(" (").addLink("Details", url).add(")");
problem.throwable(throwable);
if (message.equals(throwable.getMessage())) {
problem.myIsDefaultHtml = true;
}
}
return problem;
}
use of com.android.utils.HtmlBuilder in project android by JetBrains.
the class ViewLoader method checkModified.
/** Checks that the given class has not been edited since the last compilation (and if it has, logs a warning to the user) */
private void checkModified(@NotNull String fqcn) {
if (DumbService.getInstance(myModule.getProject()).isDumb()) {
// If the index is not ready, we can not check the modified time since it requires accessing the PSI
return;
}
if (myModuleClassLoader != null && myModuleClassLoader.isSourceModified(fqcn, myCredential) && !myRecentlyModifiedClasses.contains(fqcn)) {
assert myLogger != null;
myRecentlyModifiedClasses.add(fqcn);
RenderProblem.Html problem = RenderProblem.create(WARNING);
HtmlBuilder builder = problem.getHtmlBuilder();
String className = fqcn.substring(fqcn.lastIndexOf('.') + 1);
builder.addLink("The " + className + " custom view has been edited more recently than the last build: ", "Build", " the project.", myLogger.getLinkManager().createBuildProjectUrl());
myLogger.addMessage(problem);
}
}
use of com.android.utils.HtmlBuilder in project android by JetBrains.
the class AndroidJavaDocRenderer method renderAttributeDoc.
@NotNull
private static String renderAttributeDoc(@NotNull Module module, @Nullable Configuration configuration, @NotNull String name) {
AttributeDefinition def = ResolutionUtils.getAttributeDefinition(module, configuration, name);
String doc = (def == null) ? null : def.getDocValue(null);
HtmlBuilder builder = new HtmlBuilder();
builder.openHtmlBody();
builder.beginBold();
builder.add(name);
builder.endBold();
int api = ResolutionUtils.getOriginalApiLevel(name, module.getProject());
if (api >= 0) {
builder.add(" (Added in API level ");
builder.add(String.valueOf(api));
builder.add(")");
}
builder.addHtml("<br/>");
if (!StringUtil.isEmpty(doc)) {
builder.addHtml(doc);
builder.addHtml("<br/>");
}
builder.addHtml("<hr/>");
builder.closeHtmlBody();
return builder.getHtml();
}
use of com.android.utils.HtmlBuilder in project android by JetBrains.
the class CreateResourceDirectoryDialogBase method setupDeviceConfigurationPanel.
protected DeviceConfiguratorPanel setupDeviceConfigurationPanel(final JComboBox resourceTypeComboBox, final JTextField directoryNameTextField, final JBLabel errorLabel) {
return new DeviceConfiguratorPanel() {
@Override
public void applyEditors() {
try {
doApplyEditors();
final FolderConfiguration config = this.getConfiguration();
final ResourceFolderType selectedResourceType = (ResourceFolderType) resourceTypeComboBox.getSelectedItem();
directoryNameTextField.setText(selectedResourceType != null ? config.getFolderName(selectedResourceType) : "");
errorLabel.setText("");
} catch (InvalidOptionValueException e) {
errorLabel.setText(new HtmlBuilder().openHtmlBody().coloredText(JBColor.RED, e.getMessage()).closeHtmlBody().getHtml());
directoryNameTextField.setText("");
}
setOKActionEnabled(directoryNameTextField.getText().length() > 0);
}
};
}
use of com.android.utils.HtmlBuilder in project android by JetBrains.
the class LintNotificationPanel method updateExplanation.
private void updateExplanation(@Nullable IssueData selected) {
// We have the capability to show markup text here, e.g.
// myExplanationPane.setContentType(UIUtil.HTML_MIME)
// and then use an HtmlBuilder to populate it with for
// example issue.getExplanation(HTML). However, the builtin
// HTML formatter ends up using a bunch of weird fonts etc
// so the dialog just ends up looking tacky.
String headerFontColor = HtmlBuilderHelper.getHeaderFontColor();
HtmlBuilder builder = new HtmlBuilder();
builder.openHtmlBody();
if (selected != null) {
builder.addHeading("Message: ", headerFontColor);
builder.add(selected.message).newline();
// Look for quick fixes
AndroidLintInspectionBase inspection = selected.inspection;
AndroidLintQuickFix[] quickFixes = inspection.getQuickFixes(selected.startElement, selected.endElement, selected.message);
IntentionAction[] intentions = inspection.getIntentions(selected.startElement, selected.endElement);
builder.addHeading("Suggested Fixes:", headerFontColor).newline();
builder.beginList();
for (final AndroidLintQuickFix fix : quickFixes) {
builder.listItem();
builder.addLink(fix.getName(), myLinkManager.createRunnableLink(() -> {
myPopup.cancel();
// TODO: Pull in editor context?
WriteCommandAction.runWriteCommandAction(selected.startElement.getProject(), () -> {
fix.apply(selected.startElement, selected.endElement, AndroidQuickfixContexts.BatchContext.getInstance());
});
}));
}
for (final IntentionAction fix : intentions) {
builder.listItem();
builder.addLink(fix.getText(), myLinkManager.createRunnableLink(() -> {
NlModel model = myScreenView.getModel();
Editor editor = PsiEditorUtil.Service.getInstance().findEditorByPsiElement(selected.startElement);
if (editor != null) {
editor.getCaretModel().getCurrentCaret().moveToOffset(selected.startElement.getTextOffset());
myPopup.cancel();
WriteCommandAction.runWriteCommandAction(model.getProject(), () -> {
fix.invoke(model.getProject(), editor, model.getFile());
});
}
}));
}
final SuppressLintIntentionAction suppress = new SuppressLintIntentionAction(selected.issue, selected.startElement);
builder.listItem();
builder.addLink(suppress.getText(), myLinkManager.createRunnableLink(() -> {
myPopup.cancel();
WriteCommandAction.runWriteCommandAction(selected.startElement.getProject(), () -> {
suppress.invoke(selected.startElement.getProject(), null, myScreenView.getModel().getFile());
});
}));
builder.endList();
Issue issue = selected.issue;
builder.addHeading("Priority: ", headerFontColor);
builder.addHtml(String.format("%1$d / 10", issue.getPriority()));
builder.newline();
builder.addHeading("Category: ", headerFontColor);
builder.add(issue.getCategory().getFullName());
builder.newline();
builder.addHeading("Severity: ", headerFontColor);
builder.beginSpan();
// Use converted level instead of *default* severity such that we match any user configured overrides
HighlightDisplayLevel level = selected.level;
builder.add(StringUtil.capitalize(level.getName().toLowerCase(Locale.US)));
builder.endSpan();
builder.newline();
builder.addHeading("Explanation: ", headerFontColor);
String description = issue.getBriefDescription(HTML);
builder.addHtml(description);
if (!description.isEmpty() && Character.isLetter(description.charAt(description.length() - 1))) {
builder.addHtml(".");
}
builder.newline();
String explanationHtml = issue.getExplanation(HTML);
builder.addHtml(explanationHtml);
List<String> moreInfo = issue.getMoreInfo();
builder.newline();
int count = moreInfo.size();
if (count > 1) {
builder.addHeading("More Info: ", headerFontColor);
builder.beginList();
}
for (String uri : moreInfo) {
if (count > 1) {
builder.listItem();
}
builder.addLink(uri, uri);
}
if (count > 1) {
builder.endList();
}
builder.newline();
}
builder.closeHtmlBody();
try {
myExplanationPane.read(new StringReader(builder.getHtml()), null);
HtmlBuilderHelper.fixFontStyles(myExplanationPane);
myExplanationPane.setCaretPosition(0);
} catch (IOException ignore) {
// can't happen for internal string reading
}
}
Aggregations