package com.limegroup.gnutella.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Insets; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.Timer; import javax.swing.WindowConstants; import javax.swing.SwingConstants; import com.limegroup.gnutella.util.CommonUtils; /** * Contains the <tt>JDialog</tt> instance that shows "about" information * for the application. */ //2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678| final class AboutWindow { /** * Constant handle to the <tt>JDialog</tt> that contains about * information. */ private final JDialog DIALOG; /** * Constant for the scolling pane of credits. */ private final ScrollingTextPane SCROLLING_PANE; /** * Check box to specify whether to scroll or not. */ private final JCheckBox SCROLL_CHECK_BOX = new JCheckBox(GUIMediator.getStringResource( "ABOUT_SCROLL_CHECK_BOX_LABEL")); /** * Constructs the elements of the about window. */ AboutWindow() { DIALOG = new JDialog(GUIMediator.getAppFrame()); if (!CommonUtils.isMacOSX()) DIALOG.setModal(true); DIALOG.setSize(new Dimension(450, 400)); DIALOG.setResizable(false); DIALOG.setTitle(GUIMediator.getStringResource("ABOUT_TITLE")); DIALOG.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); DIALOG.addWindowListener(new WindowAdapter() { public void windowClosed(WindowEvent we) { SCROLLING_PANE.stopScroll(); } public void windowClosing(WindowEvent we) { SCROLLING_PANE.stopScroll(); } }); // set up scrolling pane SCROLLING_PANE = createScrollingPane(); SCROLLING_PANE.addHyperlinkListener(GUIUtils.getHyperlinkListener()); // set up limewire version label JLabel client = new JLabel(GUIMediator.getStringResource("ABOUT_LABEL_START") + " " + CommonUtils.getLimeWireVersion()); client.setHorizontalAlignment(SwingConstants.CENTER); // set up java version label JLabel java = new JLabel("Java " + CommonUtils.getJavaVersion()); java.setHorizontalAlignment(SwingConstants.CENTER); // set up limewire.com label JLabel url = new URLLabel("http://www.limewire.com"); url.setHorizontalAlignment(SwingConstants.CENTER); // set up scroll check box SCROLL_CHECK_BOX.setSelected(true); SCROLL_CHECK_BOX.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { if (SCROLL_CHECK_BOX.isSelected()) SCROLLING_PANE.startScroll(); else SCROLLING_PANE.stopScroll(); } }); // set up close button JButton button = new JButton(GUIMediator.getStringResource("GENERAL_CLOSE_BUTTON_LABEL")); DIALOG.getRootPane().setDefaultButton(button); button.setToolTipText(GUIMediator.getStringResource("ABOUT_BUTTON_TIP")); button.addActionListener(GUIUtils.getDisposeAction()); // layout window JComponent pane = (JComponent)DIALOG.getContentPane(); GUIUtils.addHideAction(pane); pane.setLayout(new GridBagLayout()); pane.setBorder(BorderFactory.createEmptyBorder(GUIConstants.SEPARATOR, GUIConstants.SEPARATOR, GUIConstants.SEPARATOR, GUIConstants.SEPARATOR)); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.CENTER; gbc.fill = GridBagConstraints.NONE; gbc.weightx = 1; gbc.insets = new Insets(0,0,0,0); gbc.gridwidth = 2; gbc.gridy = 0; LogoPanel logo = new LogoPanel(); logo.setSearching(true); pane.add(logo, gbc); gbc.gridy = 1; pane.add(Box.createVerticalStrut(GUIConstants.SEPARATOR), gbc); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridy = 2; pane.add(client, gbc); gbc.gridy = 3; pane.add(java, gbc); gbc.gridy = 4; pane.add(url, gbc); gbc.gridy = 5; pane.add(Box.createVerticalStrut(GUIConstants.SEPARATOR), gbc); gbc.weighty = 1; gbc.fill = GridBagConstraints.BOTH; gbc.gridy = 6; pane.add(SCROLLING_PANE, gbc); gbc.gridy = 7; gbc.weighty = 0; gbc.fill = GridBagConstraints.NONE; pane.add(Box.createVerticalStrut(GUIConstants.SEPARATOR), gbc); gbc.anchor = GridBagConstraints.WEST; gbc.gridwidth = 1; gbc.gridy = 8; pane.add(SCROLL_CHECK_BOX, gbc); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.anchor = GridBagConstraints.EAST; pane.add(button, gbc); } private ScrollingTextPane createScrollingPane() { StringBuffer sb = new StringBuffer(); sb.append("<html>"); Color color = new JLabel().getForeground(); int r = color.getRed(); int g = color.getGreen(); int b = color.getBlue(); String hex = toHex(r) + toHex(g) + toHex(b); sb.append("<body text='#" + hex + "'>"); // introduction sb.append(GUIMediator.getStringResource("ABOUT_INTRODUCTION")); sb.append("<br><br>"); // developers sb.append(GUIMediator.getStringResource("ABOUT_DEV_BLURB")); sb.append("<ul>\n" + " <li>Greg Bildson</li>\n" + " <li>Sam Berlin</li>\n" + " <li>Zlatin Balevsky</li>\n" + " <li>Justin Schmidt</li>\n" + " <li>Dave Nicponski</li>\n" + " <li>Karl Magdsick</li>\n" + " <li>Tim Olsen</li>\n" + " <li>Felix Berger</li>\n" + "</ul>"); // business developers sb.append(GUIMediator.getStringResource("ABOUT_BIZDEV_BLURB")); sb.append("<ul>\n" + " <li>Meghan Formel</li>\n" + " <li>Kathryn Catillaz</li>\n" + " <li>Rachel Sterne</li>\n" + "</ul>"); // web developers sb.append(GUIMediator.getStringResource("ABOUT_WEBDEV_BLURB")); sb.append("<ul>\n" + " <li>Angel Leon</li>\n" + " <li>Aubrey Arago</li>\n" + " <li>Justin Schmidt</li>\n" + "</ul>"); // support staff sb.append(GUIMediator.getStringResource("ABOUT_SUPPORT_BLURB")); sb.append("<ul>\n" + " <li>Zenzele Bell</li>\n" + " <li>Christine Nicponski</li>\n" + " <li>Kirk Kahn</li>\n" + "</ul>"); // previous developers sb.append(GUIMediator.getStringResource("ABOUT_PREVIOUS_DEV_BLURB")); sb.append("<ul>\n" + " <li>Susheel Daswani</li>\n" + " <li>Adam Fisk</li>\n" + " <li>Tarun Kapoor</li>\n" + " <li>Yusuke Naito</li>\n" + " <li>Christopher Rohrs</li>\n" + " <li>Anurag Singla</li>\n" + " <li>Robert Soule</li>\n" + " <li>Sumeet Thadani</li>\n" + " <li>Ron Vogl</li>\n" + "</ul>"); // open source contributors sb.append(GUIMediator.getStringResource("ABOUT_CONTRIBUTORS_BLURB")); sb.append("<ul>\n" + " <li>Richie Bielak</li>\n" + " <li>Jerry Charumilind</li>\n" + " <li>Marvin Chase</li>\n" + " <li>Robert Collins</li>\n" + " <li>Kenneth Corbin</li>\n" + " <li>David Graff</li>\n" + " <li>Andy Hedges</li>\n" + " <li>Michael Hirsch</li>\n" + " <li>Roger Kapsi</li>\n" + " <li>Jens-Uwe Mager</li>\n" + " <li>Gordon Mohr</li>\n" + " <li>Chance Moore</li>\n" + " <li>Rick T. Piazza</li>\n" + " <li>Eugene Romanenko</li>\n" + " <li>Gregorio Roper</li>\n" + " <li>William Rucklidge</li>\n" + " <li>Eric Seidel</li>\n" + " <li>Philippe Verdy</li>\n" + " <li>Stephan Weber</li>\n" + " <li>Jason Winzenried</li>\n" + "</ul>"); // internationalization contributors sb.append(GUIMediator.getStringResource("ABOUT_I18N_BLURB")); sb.append("<br><br>"); // community VIPs sb.append(GUIMediator.getStringResource("ABOUT_COMMUNITY_BLURB")); sb.append("<ul>\n" + " <li>Vincent Falco -- Free Peers, Inc.</li>\n" + " <li>Gordon Mohr -- Bitzi, Inc.</li>\n" + " <li>John Marshall -- Gnucleus</li>\n" + " <li>Jason Thomas -- Swapper</li>\n" + " <li>Brander Lien -- ToadNode</li>\n" + " <li>Angelo Sotira -- www.gnutella.com</li>\n" + " <li>Marc Molinaro -- www.gnutelliums.com</li>\n" + " <li>Simon Bellwood -- www.gnutella.co.uk</li>\n" + " <li>Serguei Osokine</li>\n" + " <li>Justin Chapweske</li>\n" + " <li>Mike Green</li>\n" + " <li>Raphael Manfredi</li>\n" + " <li>Tor Klingberg</li>\n" + " <li>Mickael Prinkey</li>\n" + " <li>Sean Ediger</li>\n" + " <li>Kath Whittle</li>\n" + "</ul>"); // conclusion sb.append(GUIMediator.getStringResource("ABOUT_CONCLUSION")); sb.append("</body></html>"); return new ScrollingTextPane(sb.toString()); } /** * 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; } /** * Displays the "About" dialog window to the user. */ void showDialog() { if (GUIMediator.isAppVisible()) DIALOG.setLocationRelativeTo(GUIMediator.getAppFrame()); else DIALOG.setLocation(GUIMediator.getScreenCenterPoint(DIALOG)); if (SCROLL_CHECK_BOX.isSelected()) { ActionListener startTimerListener = new ActionListener() { public void actionPerformed(ActionEvent ae) { //need to check isSelected() again, //it might have changed in the past 10 seconds. if (SCROLL_CHECK_BOX.isSelected()) { //activate scroll timer SCROLLING_PANE.startScroll(); } } }; Timer startTimer = new Timer(10000, startTimerListener); startTimer.setRepeats(false); startTimer.start(); } DIALOG.setVisible(true); } }