/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Mathew A. Nelson * - Initial API and implementation * Matthew Reeder * - Added keyboard mnemonics to buttons * Flemming N. Larsen * - Code cleanup *******************************************************************************/ package net.sf.robocode.ui.dialog; import net.sf.robocode.repository.IRepositoryItem; import net.sf.robocode.ui.BrowserManager; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLDecoder; import java.util.StringTokenizer; /** * @author Mathew A. Nelson (original) * @author Matthew Reeder (contributor) * @author Flemming N. Larsen (contributor) */ @SuppressWarnings("serial") public class RobotDescriptionPanel extends JPanel { private JLabel robotNameLabel; private final JLabel[] descriptionLabel = new JLabel[3]; private JPanel descriptionPanel; private JButton webpageButton; private JLabel robocodeVersionLabel; private JLabel filePathLabel; private IRepositoryItem currentRobotSpecification; private final static String BLANK_STRING = " "; private final EventHandler eventHandler = new EventHandler(); private class EventHandler implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getSource() == getWebpageButton()) { if (currentRobotSpecification != null) { URL htmlFile = currentRobotSpecification.getWebpage(); if (htmlFile != null && htmlFile.toString().length() > 0) { try { BrowserManager.openURL(htmlFile.toString()); } catch (IOException ignored) {} } } } } } public RobotDescriptionPanel() { super(); initialize(); } private JLabel getFilePathLabel() { if (filePathLabel == null) { filePathLabel = new JLabel(); filePathLabel.setText(" "); } return filePathLabel; } private JLabel getDescriptionLabel(int index) { if (descriptionLabel[index] == null) { descriptionLabel[index] = new JLabel(); descriptionLabel[index].setFont(new Font("Monospaced", Font.PLAIN, 12)); descriptionLabel[index].setHorizontalAlignment(SwingConstants.LEFT); descriptionLabel[index].setText(BLANK_STRING); } return descriptionLabel[index]; } private JPanel getDescriptionPanel() { if (descriptionPanel == null) { descriptionPanel = new JPanel(); descriptionPanel.setAlignmentY(Component.CENTER_ALIGNMENT); descriptionPanel.setLayout(new BoxLayout(descriptionPanel, BoxLayout.Y_AXIS)); descriptionPanel.setBorder(BorderFactory.createEtchedBorder()); for (int i = 0; i < 3; i++) { descriptionPanel.add(getDescriptionLabel(i)); } } return descriptionPanel; } private JButton getWebpageButton() { if (webpageButton == null) { webpageButton = new JButton("Webpage"); webpageButton.setMnemonic('W'); webpageButton.setVisible(false); webpageButton.setAlignmentY(Component.CENTER_ALIGNMENT); webpageButton.addActionListener(eventHandler); } return webpageButton; } private JLabel getRobocodeVersionLabel() { if (robocodeVersionLabel == null) { robocodeVersionLabel = new JLabel(); } return robocodeVersionLabel; } private JLabel getRobotNameLabel() { if (robotNameLabel == null) { robotNameLabel = new JLabel(); robotNameLabel.setHorizontalAlignment(SwingConstants.CENTER); robotNameLabel.setText(" "); } return robotNameLabel; } private void initialize() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); JPanel p = new JPanel(); p.setLayout(new BorderLayout()); p.add(getRobotNameLabel(), BorderLayout.CENTER); JPanel q = new JPanel(); q.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); q.add(getRobocodeVersionLabel()); p.add(q, BorderLayout.EAST); q = new JPanel(); q.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); p.add(q, BorderLayout.WEST); add(p); p = new JPanel(); p.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); p.add(getDescriptionPanel()); add(p); p = new JPanel(); p.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); p.add(getWebpageButton()); add(p); p = new JPanel(); p.setLayout(new FlowLayout(FlowLayout.CENTER, 1, 1)); p.add(getFilePathLabel()); add(p); } public void showDescription(IRepositoryItem robotSpecification) { this.currentRobotSpecification = robotSpecification; if (robotSpecification == null) { getRobotNameLabel().setText(" "); for (int i = 0; i < 3; i++) { getDescriptionLabel(i).setText(BLANK_STRING); } getWebpageButton().setVisible(false); getRobocodeVersionLabel().setText(" "); getFilePathLabel().setText(" "); } else { String name = robotSpecification.getUniqueFullClassNameWithVersion(); if (name.charAt(name.length() - 1) == '*') { name = name.substring(0, name.length() - 1) + " (development version)"; } String s = robotSpecification.getAuthorName(); if (s != null && s.length() > 0) { name += " by " + s; } getRobotNameLabel().setText(name); final URL url = robotSpecification.getItemURL(); if (url != null) { String path = url.toString(); try { path = URLDecoder.decode(url.toString(), "UTF-8"); } catch (UnsupportedEncodingException ignore) {} getFilePathLabel().setText(path); } else { getFilePathLabel().setText(""); } String desc = robotSpecification.getDescription(); int count = 0; if (desc != null) { StringTokenizer tok = new StringTokenizer(desc, "\n"); while (tok.hasMoreTokens() && count < 3) { StringBuffer line = new StringBuffer(tok.nextToken()); if (line != null) { if (line.length() > BLANK_STRING.length()) { line.delete(BLANK_STRING.length(), line.length()); } for (int i = line.length(); i < BLANK_STRING.length(); i++) { line.append(' '); } getDescriptionLabel(count).setText(line.toString()); } count++; } } for (int i = count; i < 3; i++) { getDescriptionLabel(i).setText(BLANK_STRING); } URL u = robotSpecification.getWebpage(); getWebpageButton().setVisible(u != null && u.toString().length() > 0); String v = robotSpecification.getRobocodeVersion(); getRobocodeVersionLabel().setText(v == null ? "" : "Built for " + v); } getDescriptionPanel().setMaximumSize(getDescriptionPanel().getPreferredSize()); } }