package com.intellij.webcore.packaging;
import com.intellij.openapi.ui.MessageType;
import com.intellij.ui.HyperlinkAdapter;
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 JEditorPane myHtmlViewer;
private final Map<String, Runnable> myLinkHandlers = new HashMap<>();
private String myErrorTitle;
private PackageManagementService.ErrorDescription myErrorDescription;
public PackagesNotificationPanel() {
myHtmlViewer = SwingHelper.createHtmlViewer(true, null, null, null);
myHtmlViewer.setVisible(false);
myHtmlViewer.setOpaque(true);
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(myErrorTitle, myErrorDescription);
}
}
});
}
public static void showError(@NotNull String title, @NotNull PackageManagementService.ErrorDescription description) {
final PackagingErrorDialog dialog = new PackagingErrorDialog(title, description);
dialog.show();
}
public void showResult(String packageName, @Nullable PackageManagementService.ErrorDescription errorDescription) {
if (errorDescription == null) {
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, 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 PackageManagementService.ErrorDescription errorDescription) {
showContent(text, MessageType.ERROR.getPopupBackground());
myErrorTitle = detailsTitle;
myErrorDescription = errorDescription;
}
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);
}
}