blob: 1513bb451aa228d647cf3681fe76efe8c303259b [file] [log] [blame]
package com.intellij.webcore.packaging;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogBuilder;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.HyperlinkAdapter;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.ui.SwingHelper;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
/**
* @author yole
*/
public class PackagesNotificationPanel {
private final Project myProject;
private final JEditorPane myHtmlViewer;
private final Map<String, Runnable> myLinkHandlers = new HashMap<String, Runnable>();
private String myErrorTitle;
private String myErrorDescription;
public PackagesNotificationPanel(@NotNull Project project) {
myProject = project;
myHtmlViewer = SwingHelper.createHtmlViewer(true, null, null, null);
myHtmlViewer.setVisible(false);
myHtmlViewer.addHyperlinkListener(new HyperlinkAdapter() {
@Override
protected void hyperlinkActivated(HyperlinkEvent e) {
final Runnable handler = myLinkHandlers.get(e.getDescription());
if (handler != null) {
handler.run();
}
else if (myErrorTitle != null && myErrorDescription != null) {
showError(myProject, myErrorTitle, myErrorDescription);
}
}
});
}
public static void showError(@NotNull Project project, @NotNull String title, @NotNull String description) {
doShowError(title, description, new DialogBuilder(project));
}
public static void showError(@NotNull Component owner, @NotNull String title, @NotNull String description) {
doShowError(title, description, new DialogBuilder(owner));
}
private static void doShowError(String title, String description, DialogBuilder builder) {
builder.setTitle(title);
final JTextArea textArea = new JTextArea();
textArea.setEditable(false);
textArea.setText(description);
textArea.setWrapStyleWord(false);
textArea.setLineWrap(true);
final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(textArea);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
final JPanel panel = new JPanel(new BorderLayout(10, 0));
panel.setPreferredSize(new Dimension(600, 400));
panel.add(scrollPane, BorderLayout.CENTER);
panel.add(new JBLabel("Details:", Messages.getErrorIcon(), SwingConstants.LEFT), BorderLayout.NORTH);
builder.setCenterPanel(panel);
builder.setButtonsAlignment(SwingConstants.CENTER);
builder.addOkAction();
builder.show();
}
public void showResult(String packageName, @Nullable String errorDescription) {
if (StringUtil.isEmpty(errorDescription)) {
String message = "Package installed successfully";
if (packageName != null) {
message = "Package '" + packageName + "' installed successfully";
}
showSuccess(message);
}
else {
String title = "Failed to install packages";
if (packageName != null) {
title = "Failed to install package '" + packageName + "'";
}
String firstLine = "Error occurred when installing package '" + packageName + "'. ";
showError(firstLine + "<a href=\"xxx\">Details...</a>",
title,
firstLine + errorDescription);
}
}
public void addLinkHandler(String key, Runnable handler) {
myLinkHandlers.put(key, handler);
}
public void removeAllLinkHandlers() {
myLinkHandlers.clear();
}
public JComponent getComponent() {
return myHtmlViewer;
}
public void showSuccess(String text) {
showContent(text, MessageType.INFO.getPopupBackground());
}
private void showContent(@NotNull String text, @NotNull Color background) {
String htmlText = text.startsWith("<html>") ? text : UIUtil.toHtml(text);
myHtmlViewer.setText(htmlText);
myHtmlViewer.setBackground(background);
setVisibleEditorPane(true);
myErrorTitle = null;
myErrorDescription = null;
}
public void showError(String text, final String detailsTitle, final String detailsDescription) {
showContent(text, MessageType.ERROR.getPopupBackground());
myErrorTitle = detailsTitle;
myErrorDescription = detailsDescription;
}
public void showWarning(String text) {
showContent(text, MessageType.WARNING.getPopupBackground());
}
public void hide() {
setVisibleEditorPane(false);
}
private void setVisibleEditorPane(boolean visible) {
boolean oldVisible = myHtmlViewer.isVisible();
myHtmlViewer.setVisible(visible);
if (oldVisible != visible) {
myHtmlViewer.revalidate();
myHtmlViewer.repaint();
}
}
public boolean hasLinkHandler(String key) {
return myLinkHandlers.containsKey(key);
}
public void removeLinkHandler(String key) {
myLinkHandlers.remove(key);
}
}