|
|
|
|
@ -16,19 +16,20 @@
|
|
|
|
|
import net.java.sip.communicator.impl.gui.*;
|
|
|
|
|
import net.java.sip.communicator.impl.gui.lookandfeel.*;
|
|
|
|
|
import net.java.sip.communicator.impl.gui.utils.*;
|
|
|
|
|
import net.java.sip.communicator.service.resources.*;
|
|
|
|
|
import net.java.sip.communicator.util.*;
|
|
|
|
|
import net.java.sip.communicator.util.skin.*;
|
|
|
|
|
import net.java.sip.communicator.util.swing.*;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The <tt>MessageDialog</tt> is a <tt>JDialog</tt> that contains a question
|
|
|
|
|
* message, two buttons to confirm or cancel the question and a check box that
|
|
|
|
|
* allows user to choose to not be questioned any more over this subject.
|
|
|
|
|
* <p>
|
|
|
|
|
* The message and the name of the "OK" button could be configured.
|
|
|
|
|
* Implements a <tt>JDialog</tt> which displays an error message and,
|
|
|
|
|
* optionally, a <tt>Throwable</tt> stack trace. <tt>ErrorDialog</tt> has an OK
|
|
|
|
|
* button which dismisses the message and a link to display the
|
|
|
|
|
* <tt>Throwable</tt> stack trace upon request if available.
|
|
|
|
|
*
|
|
|
|
|
* @author Yana Stamcheva
|
|
|
|
|
* @author Adam Netocny
|
|
|
|
|
* @author Lyubomir Marinov
|
|
|
|
|
*/
|
|
|
|
|
public class ErrorDialog
|
|
|
|
|
extends SIPCommDialog
|
|
|
|
|
@ -38,18 +39,22 @@ public class ErrorDialog
|
|
|
|
|
{
|
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
|
|
|
|
|
|
private final Logger logger = Logger.getLogger(ErrorDialog.class);
|
|
|
|
|
/**
|
|
|
|
|
* The <tt>Logger</tt> used by the <tt>ErrorDialog</tt> class and its
|
|
|
|
|
* instances for logging output.
|
|
|
|
|
*/
|
|
|
|
|
private static final Logger logger = Logger.getLogger(ErrorDialog.class);
|
|
|
|
|
|
|
|
|
|
private JButton okButton = new JButton(
|
|
|
|
|
GuiActivator.getResources().getI18NString("service.gui.OK"));
|
|
|
|
|
private JButton okButton
|
|
|
|
|
= new JButton(
|
|
|
|
|
GuiActivator.getResources().getI18NString("service.gui.OK"));
|
|
|
|
|
|
|
|
|
|
private JLabel iconLabel = new JLabel(new ImageIcon(ImageLoader
|
|
|
|
|
.getImage(ImageLoader.ERROR_ICON)));
|
|
|
|
|
private JLabel iconLabel
|
|
|
|
|
= new JLabel(
|
|
|
|
|
new ImageIcon(ImageLoader.getImage(ImageLoader.ERROR_ICON)));
|
|
|
|
|
|
|
|
|
|
private StyledHTMLEditorPane htmlMsgEditorPane = new StyledHTMLEditorPane();
|
|
|
|
|
|
|
|
|
|
private JEditorPane messageArea = new JEditorPane();
|
|
|
|
|
|
|
|
|
|
private JTextArea stackTraceTextArea = new JTextArea();
|
|
|
|
|
|
|
|
|
|
private JScrollPane stackTraceScrollPane = new JScrollPane();
|
|
|
|
|
@ -66,16 +71,26 @@ public class ErrorDialog
|
|
|
|
|
= new TransparentPanel(new BorderLayout(10, 10));
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Set visible or hide the details of the error.
|
|
|
|
|
* By default, this boolean is set to true, beacause while initialization it
|
|
|
|
|
* will be reversed and set to false.
|
|
|
|
|
* The indicator which determines whether the details of the error are
|
|
|
|
|
* currently shown.
|
|
|
|
|
* <p>
|
|
|
|
|
* The indicator is initially set to <tt>true</tt> because the constructor
|
|
|
|
|
* {@link #ErrorDialog(Frame, String, String, Throwable)} calls
|
|
|
|
|
* {@link #showOrHideDetails()} and thus <tt>ErrorDialog</tt> defaults to
|
|
|
|
|
* not showing the details of the error.
|
|
|
|
|
* </p>
|
|
|
|
|
*/
|
|
|
|
|
private boolean isDetailsShowed = true;
|
|
|
|
|
private boolean detailsShown = true;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The type of <tt>ErrorDialog</tt> which displays a warning instead of an
|
|
|
|
|
* error.
|
|
|
|
|
*/
|
|
|
|
|
public static final int WARNING = 1;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Type of this dialog.
|
|
|
|
|
* The type of this <tt>ErrorDialog</tt> (e.g. {@link #WARNING}). The
|
|
|
|
|
* default <tt>ErrorDialog</tt> displays an error.
|
|
|
|
|
*/
|
|
|
|
|
private int type = 0;
|
|
|
|
|
|
|
|
|
|
@ -90,8 +105,8 @@ public class ErrorDialog
|
|
|
|
|
private static final int MAX_MSG_PANE_HEIGHT = 800;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates an instance of <tt>MessageDialog</tt> by specifying the
|
|
|
|
|
* owner window and the message to be displayed.
|
|
|
|
|
* Initializes a new <tt>ErrorDialog</tt> with a specific owner
|
|
|
|
|
* <tt>Frame</tt>, title and message to be displayed.
|
|
|
|
|
*
|
|
|
|
|
* @param owner the dialog owner
|
|
|
|
|
* @param title the title of the dialog
|
|
|
|
|
@ -116,18 +131,29 @@ public ErrorDialog( Frame owner,
|
|
|
|
|
|
|
|
|
|
this.infoMessagePanel.setLayout(new BorderLayout());
|
|
|
|
|
|
|
|
|
|
this.messageArea.setOpaque(false);
|
|
|
|
|
this.messageArea.setEditable(false);
|
|
|
|
|
this.messageArea.setContentType("text/html");
|
|
|
|
|
messageArea.setText("<html><body><p align=\"left\" >"+message+"</p></body></html>");
|
|
|
|
|
|
|
|
|
|
JEditorPane messageArea = new JEditorPane();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Make JEditorPane respect our default font because we will be using it
|
|
|
|
|
* to just display text.
|
|
|
|
|
*/
|
|
|
|
|
messageArea.putClientProperty(
|
|
|
|
|
JEditorPane.HONOR_DISPLAY_PROPERTIES,
|
|
|
|
|
true);
|
|
|
|
|
|
|
|
|
|
messageArea.setOpaque(false);
|
|
|
|
|
messageArea.setEditable(false);
|
|
|
|
|
messageArea.setContentType("text/html");
|
|
|
|
|
messageArea.setText(
|
|
|
|
|
"<html><body><p align=\"left\" >"+message+"</p></body></html>");
|
|
|
|
|
//try to reevaluate the preferred size of the message pane.
|
|
|
|
|
//(this is definitely not a neat way to do it ... but it works).
|
|
|
|
|
this.messageArea.setSize(
|
|
|
|
|
new Dimension(MAX_MSG_PANE_WIDTH, MAX_MSG_PANE_HEIGHT));
|
|
|
|
|
int height = this.messageArea.getPreferredSize().height;
|
|
|
|
|
this.messageArea.setPreferredSize(
|
|
|
|
|
new Dimension(MAX_MSG_PANE_WIDTH, height));
|
|
|
|
|
messageArea.setSize(
|
|
|
|
|
new Dimension(MAX_MSG_PANE_WIDTH, MAX_MSG_PANE_HEIGHT));
|
|
|
|
|
messageArea.setPreferredSize(
|
|
|
|
|
new Dimension(
|
|
|
|
|
MAX_MSG_PANE_WIDTH,
|
|
|
|
|
messageArea.getPreferredSize().height));
|
|
|
|
|
|
|
|
|
|
this.infoMessagePanel.add(messageArea, BorderLayout.CENTER);
|
|
|
|
|
|
|
|
|
|
@ -135,8 +161,10 @@ public ErrorDialog( Frame owner,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates an instance of <tt>MessageDialog</tt> by specifying the
|
|
|
|
|
* owner window and the message to be displayed.
|
|
|
|
|
* Initializes a new <tt>ErrorDialog</tt> with a specific owner
|
|
|
|
|
* <tt>Frame</tt>, title, error message to be displayed and the
|
|
|
|
|
* <tt>Throwable</tt> associated with the error.
|
|
|
|
|
*
|
|
|
|
|
* @param owner the dialog owner
|
|
|
|
|
* @param title the title of the dialog
|
|
|
|
|
* @param message the message to be displayed
|
|
|
|
|
@ -156,7 +184,7 @@ public ErrorDialog( Frame owner,
|
|
|
|
|
|
|
|
|
|
this.htmlMsgEditorPane.addHyperlinkListener(this);
|
|
|
|
|
|
|
|
|
|
displayOrHideDetails();
|
|
|
|
|
showOrHideDetails();
|
|
|
|
|
|
|
|
|
|
this.infoMessagePanel.add(htmlMsgEditorPane, BorderLayout.SOUTH);
|
|
|
|
|
|
|
|
|
|
@ -181,8 +209,8 @@ public ErrorDialog( Frame owner,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates an instance of <tt>MessageDialog</tt> by specifying the
|
|
|
|
|
* owner window and the message to be displayed.
|
|
|
|
|
* Initializes a new <tt>ErrorDialog</tt> with a specific owner
|
|
|
|
|
* <tt>Frame</tt>, title and message to be displayed and of a specific type.
|
|
|
|
|
*
|
|
|
|
|
* @param owner the dialog owner
|
|
|
|
|
* @param title the title of the error dialog
|
|
|
|
|
@ -230,18 +258,18 @@ private void init()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function show (if previously hided) or hide (if previously showed) the details of the error.
|
|
|
|
|
* Function called when the "more" link is clicked.
|
|
|
|
|
* Shows if previously hidden or hides if previously shown the details of
|
|
|
|
|
* the error. Called when the "more" link is clicked.
|
|
|
|
|
*/
|
|
|
|
|
public void displayOrHideDetails()
|
|
|
|
|
public void showOrHideDetails()
|
|
|
|
|
{
|
|
|
|
|
String startDivTag = "<div id=\"message\">";
|
|
|
|
|
String endDivTag = "</div>";
|
|
|
|
|
String msgString;
|
|
|
|
|
|
|
|
|
|
isDetailsShowed = !isDetailsShowed;
|
|
|
|
|
detailsShown = !detailsShown;
|
|
|
|
|
|
|
|
|
|
if(isDetailsShowed)
|
|
|
|
|
if(detailsShown)
|
|
|
|
|
{
|
|
|
|
|
msgString = startDivTag
|
|
|
|
|
+ " <p align=\"right\"><a href=\"\"><< Hide info</a></p>"
|
|
|
|
|
@ -260,7 +288,7 @@ public void displayOrHideDetails()
|
|
|
|
|
|
|
|
|
|
this.messagePanel.revalidate();
|
|
|
|
|
this.messagePanel.repaint();
|
|
|
|
|
// restore default values for prefered size,
|
|
|
|
|
// restore default values for preferred size,
|
|
|
|
|
// as we have resized its components let it calculate
|
|
|
|
|
// that size
|
|
|
|
|
setPreferredSize(null);
|
|
|
|
|
@ -318,9 +346,7 @@ protected void close(boolean isEscaped)
|
|
|
|
|
public void hyperlinkUpdate(HyperlinkEvent e)
|
|
|
|
|
{
|
|
|
|
|
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
|
|
|
|
|
{
|
|
|
|
|
displayOrHideDetails();
|
|
|
|
|
}
|
|
|
|
|
showOrHideDetails();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -328,15 +354,11 @@ public void hyperlinkUpdate(HyperlinkEvent e)
|
|
|
|
|
*/
|
|
|
|
|
public void loadSkin()
|
|
|
|
|
{
|
|
|
|
|
if(type == WARNING)
|
|
|
|
|
{
|
|
|
|
|
iconLabel.setIcon(new ImageIcon(ImageLoader
|
|
|
|
|
.getImage(ImageLoader.WARNING_ICON)));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
iconLabel.setIcon(new ImageIcon(ImageLoader
|
|
|
|
|
.getImage(ImageLoader.ERROR_ICON)));
|
|
|
|
|
}
|
|
|
|
|
ImageID icon
|
|
|
|
|
= (type == WARNING)
|
|
|
|
|
? ImageLoader.WARNING_ICON
|
|
|
|
|
: ImageLoader.ERROR_ICON;
|
|
|
|
|
|
|
|
|
|
iconLabel.setIcon(new ImageIcon(ImageLoader.getImage(icon)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|