/******************************************************************************* * 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 * - Replaced FileSpecificationVector with plain Vector * - Ported to Java 5 * - Updated to use methods from the WindowUtil, which replaces window methods * that have been (re)moved from the robocode.util.Utils class * - Changed the F5 key press for refreshing the list of available robots * into 'modifier key' + R to comply with other OSes like e.g. Mac OS * Robert D. Maupin * - Replaced old collection types like Vector and Hashtable with * synchronized List and HashMap *******************************************************************************/ package net.sf.robocode.ui.dialog; import net.sf.robocode.repository.IRepositoryItem; import net.sf.robocode.repository.IRepositoryManager; import net.sf.robocode.ui.IWindowManager; import static net.sf.robocode.ui.util.ShortcutUtil.MENU_SHORTCUT_KEY_MASK; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.PrintWriter; import java.io.StringWriter; import java.util.List; /** * @author Mathew A. Nelson (original) * @author Matthew Reeder (contributor) * @author Flemming N. Larsen (contributor) * @author Robert D. Maupin (contributor) */ @SuppressWarnings("serial") public class RobotExtractor extends JDialog implements WizardListener { String unusedrobotPath; private static final int MIN_ROBOTS = 1; private static final int MAX_ROBOTS = 1; // 250; private JPanel robotImporterContentPane; private WizardCardPanel wizardPanel; private WizardController buttonsPanel; private RobotSelectionPanel robotSelectionPanel; public byte buf[] = new byte[4096]; private StringWriter output; private final IWindowManager windowManager; private final IRepositoryManager repositoryManager; private final EventHandler eventHandler = new EventHandler(); class EventHandler implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("Refresh")) { getRobotSelectionPanel().refreshRobotList(false); } } } public RobotExtractor(JFrame owner, IWindowManager windowManager, IRepositoryManager repositoryManager) { super(owner); this.repositoryManager = repositoryManager; this.windowManager = windowManager; initialize(); } public void update() { getRobotSelectionPanel().refreshRobotList(false); } public void cancelButtonActionPerformed() { dispose(); } public void finishButtonActionPerformed() { int rc = extractRobot(); ConsoleDialog d; d = new ConsoleDialog(windowManager.getRobocodeFrame(), "Extract results", false); d.setText(output.toString()); d.pack(); d.pack(); WindowUtil.packCenterShow(this, d); if (rc < 8) { this.dispose(); } } private WizardController getButtonsPanel() { if (buttonsPanel == null) { buttonsPanel = getWizardPanel().getWizardController(); } return buttonsPanel; } private JPanel getRobotImporterContentPane() { if (robotImporterContentPane == null) { robotImporterContentPane = new JPanel(); robotImporterContentPane.setLayout(new BorderLayout()); robotImporterContentPane.add(getButtonsPanel(), BorderLayout.SOUTH); robotImporterContentPane.add(getWizardPanel(), BorderLayout.CENTER); getWizardPanel().getWizardController().setFinishButtonTextAndMnemonic("Extract!", 'E', 0); robotImporterContentPane.registerKeyboardAction(eventHandler, "Refresh", KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); robotImporterContentPane.registerKeyboardAction(eventHandler, "Refresh", KeyStroke.getKeyStroke(KeyEvent.VK_R, MENU_SHORTCUT_KEY_MASK), JComponent.WHEN_FOCUSED); } return robotImporterContentPane; } public RobotSelectionPanel getRobotSelectionPanel() { if (robotSelectionPanel == null) { robotSelectionPanel = net.sf.robocode.core.Container.createComponent(RobotSelectionPanel.class); robotSelectionPanel.setup(MIN_ROBOTS, MAX_ROBOTS, false, "Select the robot you would like to extract to the robots directory. Robots not shown do not include source.", true, true, true, false, true, true, null); } return robotSelectionPanel; } private WizardCardPanel getWizardPanel() { if (wizardPanel == null) { wizardPanel = new WizardCardPanel(this); wizardPanel.add(getRobotSelectionPanel(), "Select robot"); } return wizardPanel; } private void initialize() { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setTitle("Robot Extract"); setContentPane(getRobotImporterContentPane()); } private int extractRobot() { repositoryManager.refresh(); int rv = 0; output = new StringWriter(); PrintWriter out = new PrintWriter(output); out.println("Robot Extract"); List<IRepositoryItem> selectedRobots = getRobotSelectionPanel().getSelectedRobots(); IRepositoryItem spec = selectedRobots.get(0); try { WindowUtil.setStatusWriter(out); rv = repositoryManager.extractJar(spec); WindowUtil.setStatusWriter(null); WindowUtil.setStatus(""); if (rv == 0) { out.println("Robot extracted successfully."); } else if (rv == -1) { out.println("Cancelled."); } } catch (Exception e) { out.println(e); rv = 8; } return rv; } }