import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
/***********************************************************************************
* VistaDialog *
***********************************************************************************
* A class to show various dialogs in Windows(R) Vista(R) style. *
* *
* The following examples show how the dialogs are created and shown: *
* *
* Error dialog: *
* VistaDialog.showDialog("Outlook", "Can't move \"Sent Items\"", *
* "You don't have permission to access this item.", *
* VistaDialog.ERROR_MESSAGE); *
* *
* Warning dialog: *
* VistaDialog.showDialog("Network", "Unable to access remote computer", *
* "The network cable might be unplugged.", *
* VistaDialog.WARNING_MESSAGE); *
* *
* Information dialog: *
* VistaDialog.showDialog("Low Battery", "Change your battery or change to " + *
* "outlet power immediately", *
* "Your computer has a low battery, so you should act immediately to keep " + *
* "from losing your work.", *
* VistaDialog.INFORMATION_MESSAGE); *
* *
* Confirmation dialog: *
* VistaDialog dialog = VistaDialog.showConfirmationDialog("Format F:", *
* "Are you sure to format this volume?", "Formatting this volume will " + *
* "erase all data on it. Back up any data you want to keep before " + *
* "formatting. Do you want to continue?"); *
* if(dialog.yesSelected == true) System.out.println("Answer was YES!"); *
* else System.out.println("Answer was NO!"); *
***********************************************************************************
* (c) Impressive Artworx, 2k8 *
* @author Manuel Kaess *
* @version 1.2 *
***********************************************************************************
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
***********************************************************************************/
public class VistaDialog extends JDialog implements ActionListener
{
/** constants for the various message types */
public final static int INFORMATION_MESSAGE = 0;
public final static int CONFIRMATION_MESSAGE = 1;
public final static int WARNING_MESSAGE = 2;
public final static int ERROR_MESSAGE = 3;
public final static String YES_OPTION = "yes";
public final static String NO_OPTION = "no";
public final static String NO_ACTION = "dispose";
/** the dialog instance */
private static VistaDialog dialog;
/** the selected yes or no option of a confirmation dialog */
public boolean yesSelected = false;
/** a label that shows the appropriate icon image */
private JLabel iconLabel;
/** a text area for the messages */
private JTextArea messages;
/** a text area that shows the title description of the message(s) */
private JTextArea titleText;
/** the different fonts */
private static Font titleTextFont = new Font("Segoe UI", Font.PLAIN, 15);
private static Font messageTextFont = new Font("Segoe UI", Font.PLAIN, 12);
/** the colors */
private static Color background = Color.WHITE;
private static Color titleTextColor = new Color(0, 51, 188); // dark blue
/**
* Method to show a dialog of the type type.
*
* @param title the title that is shown in the top of the window
* @param labelText the text that gives a description of the message
* @param messageText the message text (can be multiple lines, seperated by "\n")
* @param type the type of the dialog, one of the message type constants
*/
public static void showDialog(String title, String labelText, String messageText, int type)
{
if(type <= INFORMATION_MESSAGE) showInformationDialog(title, labelText, messageText);
else if(type == WARNING_MESSAGE) showWarningDialog(title, labelText, messageText);
else if(type >= ERROR_MESSAGE) showErrorDialog(title, labelText, messageText);
}
/**
* Shows a confirmation dialog with the options to answer with yes or no.
*
* @param title the title that is shown in the top of the window
* @param labelText the text that gives a description of the information message
* @param questionText the question text (can be multiple lines, seperated by "\n")
*/
public static VistaDialog showConfirmationDialog(String title, String labelText, String questionText)
{
JFrame frame = new JFrame();
dialog = new VistaDialog(frame, CONFIRMATION_MESSAGE);
// set the title
dialog.setTitle(title);
// set the textual description of the message
dialog.titleText.setText(labelText);
// set the message
dialog.messages.setText(questionText);
dialog.messages.setCaretPosition(0);
// show the dialog window
setSizeAndShowDialog(dialog);
return dialog;
}
/**
* Method to show a dialog of the type type.
*
* @param title the title that is shown in the top of the window
* @param labelText the text that gives a description of the message
* @param messages the messages
* @param type the type of the dialog, one of the message type constants
*/
public static void showDialog(String title, String labelText, List messages, int type)
{
StringBuilder sb = new StringBuilder();
String newline = "\n";
// add all messages to one String
for(String message : messages)
{
sb.append(message);
sb.append(newline);
}
// remove final newline
int newlineLength = newline.length();
sb.delete(sb.length() - newlineLength, sb.length());
showDialog(title, labelText, sb.toString(), type);
}
/**
* Shows an information message dialog.
*
* @param title the title that is shown in the top of the window
* @param labelText the text that gives a description of the information message
* @param messageText the message text (can be multiple lines, seperated by "\n")
*/
private static void showInformationDialog(String title, String labelText, String messageText)
{
JFrame frame = new JFrame();
dialog = new VistaDialog(frame, INFORMATION_MESSAGE);
// set the title
dialog.setTitle(title);
// set the textual description of the message
dialog.titleText.setText(labelText);
// set the message
dialog.messages.setText(messageText);
dialog.messages.setCaretPosition(0);
// show the dialog window
setSizeAndShowDialog(dialog);
}
/**
* Shows a warning dialog.
*
* @param title the title that is shown in the top of the window
* @param labelText the text that gives a description of the information message
* @param messageText the message text (can be multiple lines, seperated by "\n")
*/
private static void showWarningDialog(String title, String labelText, String messageText)
{
JFrame frame = new JFrame();
dialog = new VistaDialog(frame, WARNING_MESSAGE);
// set the title
dialog.setTitle(title);
// set the textual description of the message
dialog.titleText.setText(labelText);
// set the message
dialog.messages.setText(messageText);
dialog.messages.setCaretPosition(0);
// show the dialog window
setSizeAndShowDialog(dialog);
}
/**
* Shows an error message dialog.
*
* @param title the title that is shown in the top of the window
* @param labelText the text that gives a description of the information message
* @param messageText the message text (can be multiple lines, seperated by "\n")
*/
private static void showErrorDialog(String title, String labelText, String messageText)
{
JFrame frame = new JFrame();
dialog = new VistaDialog(frame, ERROR_MESSAGE);
// set the title
dialog.setTitle(title);
// set the textual description of the message
dialog.titleText.setText(labelText);
// set the message
dialog.messages.setText(messageText);
dialog.messages.setCaretPosition(0);
// show the dialog window
setSizeAndShowDialog(dialog);
}
/**
* Constructor.
*
* @param frame the parent frame
* @param type the dialog type
*/
private VistaDialog(JFrame frame, int type)
{
super(frame);
initGUI(type);
}
/**
* Initializes the GUI elements.
*
* @param type the dialog type
*/
private void initGUI(int type)
{
try
{
Container cp = getContentPane();
int maxWidth = 400;
Image icon = null;
if(type <= INFORMATION_MESSAGE) icon = ((ImageIcon)UIManager.get("OptionPane.warningIcon")).getImage();
else if(type == CONFIRMATION_MESSAGE) icon = ((ImageIcon)UIManager.get("OptionPane.questionIcon")).getImage();
else if(type == WARNING_MESSAGE) icon = ((ImageIcon)UIManager.get("OptionPane.warningIcon")).getImage();
else if(type >= ERROR_MESSAGE) icon = ((ImageIcon)UIManager.get("OptionPane.errorIcon")).getImage();
int icoWidth = icon.getWidth(null);
int icoHeight = icon.getHeight(null);
BorderLayout thisLayout = new BorderLayout();
cp.setLayout(thisLayout);
iconLabel = new JLabel();
iconLabel.setIcon(new ImageIcon(icon));
iconLabel.setSize(icoWidth, icoHeight);
messages = new JTextArea();
messages.setText("");
messages.setLineWrap(true);
messages.setWrapStyleWord(true);
messages.setFont(messageTextFont);
messages.setEditable(false);
messages.setSize(maxWidth - icoWidth - 50, 40);
titleText = new JTextArea(){
@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
super.paintComponent(g);
}
};
titleText.setText("");
titleText.setForeground(titleTextColor);
titleText.setFont(titleTextFont);
titleText.setLineWrap(true);
titleText.setWrapStyleWord(true);
titleText.setEditable(false);
titleText.setSize(maxWidth - icoWidth - 20, icoHeight);
// header panel
JPanel header = new JPanel();
header.setBackground(background);
header.setLayout(new FlowLayout(FlowLayout.LEFT));
header.add(iconLabel);
header.add(titleText);
// main panel
JPanel main = new JPanel();
main.setLayout(new BorderLayout(10, 10));
main.setBackground(background);
messages.setBackground(background);
messages.setBorder(BorderFactory.createEmptyBorder(10, 50, 0, 10));
main.add(messages, BorderLayout.CENTER);
// button panel
JPanel buttons = new JPanel();
buttons.setLayout(new FlowLayout(FlowLayout.RIGHT));
// the buttons depend on the dialog type...
if(type <= INFORMATION_MESSAGE)
{
// an information message only has an OK button
JButton okButt = new JButton();
okButt.addActionListener(this);
okButt.setText(UIManager.getString("OptionPane.okButtonText"));
buttons.add(okButt);
}
else if(type == CONFIRMATION_MESSAGE)
{
// a confirmation message has a yes and a no answer
JButton yesButt = new JButton();
yesButt.addActionListener(this);
yesButt.setText(UIManager.getString("OptionPane.yesButtonText"));
yesButt.setActionCommand(YES_OPTION);
buttons.add(yesButt);
JButton noButt = new JButton();
noButt.addActionListener(this);
noButt.setText(UIManager.getString("OptionPane.noButtonText"));
noButt.setActionCommand(NO_OPTION);
buttons.add(noButt);
}
else if(type == WARNING_MESSAGE)
{
// a warning message only has an OK button
JButton okButt = new JButton();
okButt.addActionListener(this);
okButt.setText(UIManager.getString("InternalFrameTitlePane.closeButtonText"));
okButt.setActionCommand(NO_ACTION);
buttons.add(okButt);
}
else if(type >= ERROR_MESSAGE)
{
// an error message only has a close button
JButton closeButt = new JButton();
closeButt.addActionListener(this);
closeButt.setText(UIManager.getString("InternalFrameTitlePane.closeButtonText"));
closeButt.setActionCommand(NO_ACTION);
buttons.add(closeButt);
}
// add the panels to the dialog window
cp.add(header, BorderLayout.NORTH);
cp.add(main, BorderLayout.CENTER);
cp.add(buttons, BorderLayout.SOUTH);
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Sets the dialog size correctly.
*/
private static void setSizeAndShowDialog(VistaDialog d)
{
d.setIconImage(null);
d.setModal(true);
d.setAlwaysOnTop(true);
d.setMinimumSize(new Dimension(400, 200));
d.pack();
d.setResizable(false);
d.setLocationRelativeTo(null);
d.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
d.setVisible(true);
}
// A listener for the button(s).
public void actionPerformed(ActionEvent e)
{
JButton source = (JButton)e.getSource();
String command = source.getActionCommand();
VistaDialog dialog = VistaDialog.dialog;
if(command.equals(YES_OPTION)) dialog.yesSelected = true;
else if(command.equals(NO_OPTION)) dialog.yesSelected = false;
// now hide the dialog window
dialog.setVisible(false);
}
}