package com.limegroup.gnutella.gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.limegroup.gnutella.version.UpdateInformation;
/**
* Creates a new update panel for prompting the user for whether
* or not they would like to update.
*/
final class UpdateDialog extends JDialog {
/**
* Constructs the dialog.
*/
public UpdateDialog(UpdateInformation info) {
super(GUIMediator.getAppFrame());
setModal(true);
setResizable(false);
setTitle(GUIMediator.getStringResource("UPDATE_DIALOG_CAPTION"));
JButton button = buildContentArea(info);
pack();
Dimension size = new Dimension(500, 300);
setSize(size);
((JComponent)getContentPane()).setPreferredSize(size);
getRootPane().setDefaultButton(button);
button.requestFocus();
setLocation(GUIMediator.getScreenCenterPoint(this));
}
private JButton buildContentArea(UpdateInformation info) {
JComponent icon = new URLLabel(info.getUpdateURL(), getUpdateIcon());
JComponent title = makeText(getUpdateTitle(info.getUpdateTitle()), false);
JComponent text = makeText(info.getUpdateText(), true);
JButton button1 = makeButton1(info);
JButton button2 = makeButton2(info);
JComponent jc = (JComponent)getContentPane();
jc.setLayout(new GridBagLayout());
jc.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
GridBagConstraints gc = new GridBagConstraints();
JPanel p = new JPanel(new GridBagLayout());
gc.gridwidth = GridBagConstraints.RELATIVE;
gc.insets = new Insets(0, 0, 0, 5);
p.add(icon, gc);
gc.gridwidth = GridBagConstraints.REMAINDER;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.insets = new Insets(0, 0, 0, 0);
p.add(title, gc);
jc.add(p, gc);
gc.fill = GridBagConstraints.BOTH;
gc.anchor = GridBagConstraints.CENTER;
gc.insets = new Insets(5, 0, 5, 0);
gc.weightx = 1;
gc.weighty = 1;
jc.add(text, gc);
p = new JPanel(new GridBagLayout());
gc.gridwidth = GridBagConstraints.RELATIVE;
gc.fill = GridBagConstraints.NONE;
gc.insets = new Insets(0, 0, 0, 3);
gc.weightx = 0;
gc.weighty = 0;
gc.anchor = GridBagConstraints.EAST;
p.add(button1, gc);
gc.gridwidth = GridBagConstraints.REMAINDER;
gc.anchor = GridBagConstraints.WEST;
gc.insets = new Insets(0, 3, 0, 0);
p.add(button2, gc);
gc.insets = new Insets(0, 0, 0, 0);
gc.anchor = GridBagConstraints.CENTER;
jc.add(p, gc);
return button1;
}
private String getUpdateTitle(String title) {
if(title != null)
return "<b>" + title + "</b>";
else
return "<b>" + GUIMediator.getStringResource("UPDATE_TITLE") + "</b>";
}
private Icon getUpdateIcon() {
return GUIMediator.getThemeImage("searching");
}
private JComponent makeText(String text, boolean scroll) {
JEditorPane pane = new JEditorPane();
JLabel dummy = new JLabel();
pane.setContentType("text/html");
pane.setEditable(false);
pane.setBackground(dummy.getBackground());
pane.setFont(dummy.getFont());
pane.addHyperlinkListener(GUIUtils.getHyperlinkListener());
// set the color of the foreground appropriately.
text = updateForeground(dummy.getForeground(), text);
pane.setText(text);
pane.setCaretPosition(0);
if(!scroll)
return pane;
JScrollPane scroller = new JScrollPane(pane);
scroller.setPreferredSize(new Dimension(400, 100));
scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scroller.setBorder(null);
return scroller;
}
private String updateForeground(Color color, String html) {
int r = color.getRed();
int g = color.getGreen();
int b = color.getBlue();
String hex = toHex(r) + toHex(g) + toHex(b);
return "<html><body text='#" + hex + "'>" + html + "</body></html>";
}
/**
* Returns the int as a hex string.
*/
private String toHex(int i) {
String hex = Integer.toHexString(i).toUpperCase();
if(hex.length() == 1)
return "0" + hex;
else
return hex;
}
private JButton makeButton1(final UpdateInformation info) {
String text = info.getButton1Text();
if(text == null)
text = GUIMediator.getStringResource("UPDATE_NOW_LABEL");
JButton b = new JButton(text);
b.setToolTipText(GUIMediator.getStringResource("UPDATE_TIP"));
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String updateCommand = info.getUpdateCommand();
if (updateCommand != null) {
GUIMediator.flagUpdate(updateCommand);
int restartNow =
GUIMediator.showYesNoTitledMessage("UPDATE_RESTART","UPDATE_RESTART_TITLE");
if (restartNow == MessageService.YES_OPTION)
GUIMediator.shutdown();
} else
GUIMediator.openURL(info.getUpdateURL());
setVisible(false);
dispose();
}
});
return b;
}
private JButton makeButton2(final UpdateInformation info) {
String text = info.getButton2Text();
if(text == null)
text = GUIMediator.getStringResource("UPDATE_LATER_LABEL");
JButton b = new JButton(text);
b.setToolTipText(GUIMediator.getStringResource("UPDATE_TIP"));
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
dispose();
}
});
return b;
}
}