diff options
Diffstat (limited to 'src/net/java/sip/communicator/plugin/desktoputil/MessageDialog.java')
-rw-r--r-- | src/net/java/sip/communicator/plugin/desktoputil/MessageDialog.java | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/src/net/java/sip/communicator/plugin/desktoputil/MessageDialog.java b/src/net/java/sip/communicator/plugin/desktoputil/MessageDialog.java new file mode 100644 index 0000000..1b4ec68 --- /dev/null +++ b/src/net/java/sip/communicator/plugin/desktoputil/MessageDialog.java @@ -0,0 +1,343 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.plugin.desktoputil; + +import java.awt.*; +import java.awt.event.*; +import java.lang.reflect.*; + +import javax.swing.*; + +import net.java.sip.communicator.util.skin.*; + +/** + * 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. + * + * @author Yana Stamcheva + * @author Adam Netocny + */ +public class MessageDialog + extends SIPCommDialog + implements ActionListener, + Skinnable +{ + private static final long serialVersionUID = 1L; + + private JButton cancelButton = new JButton( + DesktopUtilActivator.getResources().getI18NString("service.gui.CANCEL")); + + protected JButton okButton = new JButton( + DesktopUtilActivator.getResources().getI18NString("service.gui.OK")); + + private JCheckBox doNotAskAgain = new SIPCommCheckBox( + DesktopUtilActivator.getResources() + .getI18NString("service.gui.DO_NOT_ASK_AGAIN")); + + private JLabel iconLabel = new JLabel(new ImageIcon( + DesktopUtilActivator.getImage("service.gui.icons.WARNING_ICON"))); + + private StyledHTMLEditorPane messageArea = new StyledHTMLEditorPane(); + + private TransparentPanel buttonsPanel + = new TransparentPanel(new FlowLayout(FlowLayout.CENTER)); + + private TransparentPanel checkBoxPanel + = new TransparentPanel(new FlowLayout(FlowLayout.LEADING)); + + private TransparentPanel mainPanel + = new TransparentPanel(new BorderLayout(5, 5)); + + private boolean isConfirmationEnabled = true; + + private int returnCode; + + /** + * Indicates that the OK button is pressed. + */ + public static final int OK_RETURN_CODE = 0; + + /** + * Indicates that the Cancel button is pressed. + */ + public static final int CANCEL_RETURN_CODE = 1; + + /** + * Indicates that the OK button is pressed and the Don't ask check box is + * checked. + */ + public static final int OK_DONT_ASK_CODE = 2; + + /** + * The maximum width that we allow message dialogs to have. + */ + private static final int MAX_MSG_PANE_WIDTH = 600; + + /** + * The maximum height that we allow message dialogs to have. + */ + 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. + * @param owner the dialog owner + * @param title the title of the message + * @param message the message to be displayed + * @param okButtonName ok button name + * @param isConfirmationEnabled indicates whether the "Do not ask again" + * button should be enabled or not + */ + public MessageDialog(Frame owner, + String title, + String message, + String okButtonName, + boolean isConfirmationEnabled) + { + super(owner, false); + + this.isConfirmationEnabled = isConfirmationEnabled; + + this.getContentPane().setLayout(new BorderLayout(5, 5)); + + this.messageArea.setOpaque(false); + this.messageArea.setEditable(false); + this.messageArea.setContentType("text/html"); + + this.messageArea.setBorder( + BorderFactory.createEmptyBorder(10, 10, 0, 10)); + this.checkBoxPanel.setBorder( + BorderFactory.createEmptyBorder(0, 10, 10, 10)); + + this.init(); + + this.setTitle(title); + + setMessage(message); + + if(okButtonName != null) + { + this.okButton.setText(okButtonName); + this.okButton.setMnemonic(okButtonName.charAt(0)); + } + } + + /** + * Creates an instance of <tt>MessageDialog</tt> by specifying the + * owner window and the message to be displayed. + * @param owner the dialog owner + * @param title the title of the message + * @param message the message to be displayed + * @param okButtonName ok button name + */ + public MessageDialog( Frame owner, + String title, + String message, + String okButtonName) + { + this(owner, title, message, okButtonName, true); + } + + /** + * Creates an instance of <tt>MessageDialog</tt> by specifying the + * owner window and the message to be displayed. + * @param owner the dialog owner + * @param title the title of the message + * @param message the message to be displayed + * @param isCancelButtonEnabled <code>true</code> to show the Cancel button, + * <code>false</code> - otherwise + */ + public MessageDialog( Frame owner, + String title, + String message, + boolean isCancelButtonEnabled) + { + this(owner, title, message, null, true); + + if(!isCancelButtonEnabled) + { + doNotAskAgain.setText(DesktopUtilActivator.getResources() + .getI18NString("service.gui.DO_NOT_SHOW_AGAIN")); + + buttonsPanel.remove(cancelButton); + } + } + + /** + * Initializes this dialog. + */ + private void init() + { + this.getRootPane().setDefaultButton(okButton); + + if(isConfirmationEnabled) + this.checkBoxPanel.add(doNotAskAgain); + + this.buttonsPanel.add(okButton); + this.buttonsPanel.add(cancelButton); + + this.okButton.addActionListener(this); + this.cancelButton.addActionListener(this); + + this.cancelButton.setMnemonic(cancelButton.getText().charAt(0)); + + this.mainPanel.add(messageArea, BorderLayout.NORTH); + this.mainPanel.add(checkBoxPanel, BorderLayout.CENTER); + + TransparentPanel iconPanel = new TransparentPanel(new BorderLayout()); + iconPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 0)); + iconPanel.add(iconLabel, BorderLayout.NORTH); + + this.getContentPane().add(iconPanel, BorderLayout.WEST); + this.getContentPane().add(mainPanel, BorderLayout.CENTER); + this.getContentPane().add(buttonsPanel, BorderLayout.SOUTH); + } + + public void replaceCheckBoxPanel(Component comp) + { + this.mainPanel.add(comp, BorderLayout.CENTER); + } + + /** + * Sets the message to be displayed. + * @param message The message to be displayed. + */ + public void setMessage(String message) + { + this.messageArea.setText(message); + + setMaxWidth(600); + } + + /** + * try to reevaluate the preferred size of the message pane. + * (this is definitely not a neat way to do it ... but it works). + */ + public void setMaxWidth(int maxWidth) + { + //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(maxWidth, height)); + } + + /** + * Shows the dialog. + * @return The return code that should indicate what was the choice of + * the user. If the user chooses cancel, the return code is the + * CANCEL_RETURN_CODE. + */ + public int showDialog() + { + if (!SwingUtilities.isEventDispatchThread()) + { + final int[] returnCodes = new int[1]; + Exception exception = null; + try + { + SwingUtilities.invokeAndWait(new Runnable() + { + public void run() + { + returnCodes[0] = showDialog(); + } + }); + } + catch (InterruptedException ex) + { + exception = ex; + } + catch (InvocationTargetException ex) + { + exception = ex; + } + if (exception != null) + throw new UndeclaredThrowableException(exception); + return returnCodes[0]; + } + + pack(); + + setModal(true); + setVisible(true); + + return returnCode; + } + + /** + * Handles the <tt>ActionEvent</tt>. Depending on the user choice sets + * the return code to the appropriate value. + * + * @param e the <tt>ActionEvent</tt> that notified us + */ + public void actionPerformed(ActionEvent e) + { + JButton button = (JButton)e.getSource(); + + if(button.equals(okButton)) + { + if (doNotAskAgain.isSelected()) + { + this.returnCode = OK_DONT_ASK_CODE; + } + else + { + this.returnCode = OK_RETURN_CODE; + } + } + else + { + this.returnCode = CANCEL_RETURN_CODE; + } + + this.dispose(); + } + + /** + * Visually clicks the cancel button on close. + * + * @param isEscaped indicates if the window was close by pressing the escape + * button + */ + @Override + protected void close(boolean isEscaped) + { + this.cancelButton.doClick(); + } + + /** + * Reloads icon. + */ + public void loadSkin() + { + iconLabel.setIcon(new ImageIcon( + DesktopUtilActivator.getImage("service.gui.icons.WARNING_ICON"))); + } + + /** + * Changes the icon in the dialog. + * @param image + */ + public void setIcon(Image image) + { + iconLabel.setIcon(new ImageIcon(image)); + } + + /** + * Changes the icon in the dialog. + * @param image + */ + public void setIcon(ImageIcon image) + { + iconLabel.setIcon(image); + } +} |