/* * Copyright (c) 2006, Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Institute nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: CreateSimDialog.java,v 1.1 2006/08/21 12:13:02 fros4943 Exp $ */ package se.sics.cooja.dialogs; import java.awt.*; import java.awt.event.*; import java.io.File; import java.text.*; import java.util.Vector; import javax.swing.*; import org.apache.log4j.Logger; import se.sics.cooja.*; /** * A dialog for creating and configuring a simulation. * * @author Fredrik Osterlind */ public class CreateSimDialog extends JDialog { private static final long serialVersionUID = 1L; private static Logger logger = Logger.getLogger(CreateSimDialog.class); private AddSimEventHandler myEventHandler = new AddSimEventHandler(); private final static int LABEL_WIDTH = 170; private final static int LABEL_HEIGHT = 15; private Simulation mySimulation = null; private CreateSimDialog myDialog; private JFormattedTextField delayTime, simulationTime, tickTime; private JTextField title; private JComboBox radioMediumBox; private JTextField logFilename; private JCheckBox logCheckBox; /** * Shows a dialog for configuring a simulation. * * @param parentFrame Parent frame for dialog * @param simulationToConfigure Simulation to configure * @return True if simulation configured correctly */ public static boolean showDialog(Frame parentFrame, Simulation simulationToConfigure) { CreateSimDialog myDialog = new CreateSimDialog(parentFrame); myDialog.mySimulation = simulationToConfigure; // Set title if (simulationToConfigure.getTitle() != null) { // Title already preset myDialog.title.setText(simulationToConfigure.getTitle()); } else { // Suggest title myDialog.title.setText("[enter simulation title]"); } // Set delay time myDialog.delayTime.setValue(new Integer(simulationToConfigure.getDelayTime())); // Set simulation time myDialog.simulationTime.setValue(new Integer(simulationToConfigure.getSimulationTime())); // Set tick time myDialog.tickTime.setValue(new Integer(simulationToConfigure.getTickTime())); // Select radio medium if (simulationToConfigure.getRadioMedium() != null) { Class radioMediumClass = simulationToConfigure.getRadioMedium().getClass(); String currentDescription = GUI.getDescriptionOf(radioMediumClass); for (int i=0; i < myDialog.radioMediumBox.getItemCount(); i++) { String menuDescription = (String) myDialog.radioMediumBox.getItemAt(i); if (menuDescription.equals(currentDescription)) { myDialog.radioMediumBox.setSelectedIndex(i); break; } } } // Set position and focus of dialog myDialog.setLocationRelativeTo(parentFrame); myDialog.title.requestFocus(); myDialog.title.select(0, myDialog.title.getText().length()); myDialog.setVisible(true); if (myDialog.mySimulation != null) { // Simulation configured correctly return true; } return false; } private CreateSimDialog(Frame frame) { super(frame, "Create new simulation", true); myDialog = this; JPanel mainPane = new JPanel(); mainPane.setLayout(new BoxLayout(mainPane, BoxLayout.Y_AXIS)); JLabel label; JTextField textField; JPanel smallPane; JButton button; JComboBox comboBox; JFormattedTextField numberField; NumberFormat integerFormat = NumberFormat.getIntegerInstance(); // BOTTOM BUTTON PART JPanel buttonPane = new JPanel(); buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.X_AXIS)); buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); buttonPane.add(Box.createHorizontalGlue()); button = new JButton("Cancel"); button.setActionCommand("cancel"); button.addActionListener(myEventHandler); buttonPane.add(button); button = new JButton("Create"); button.setActionCommand("create"); button.addActionListener(myEventHandler); buttonPane.add(Box.createRigidArea(new Dimension(10, 0))); myDialog.rootPane.setDefaultButton(button); buttonPane.add(button); // MAIN PART // Title smallPane = new JPanel(); smallPane.setAlignmentX(Component.LEFT_ALIGNMENT); smallPane.setLayout(new BoxLayout(smallPane, BoxLayout.X_AXIS)); label = new JLabel("Simulation title"); label.setPreferredSize(new Dimension(LABEL_WIDTH,LABEL_HEIGHT)); textField = new JTextField(); textField.setText("[no title]"); textField.setColumns(25); title = textField; smallPane.add(label); smallPane.add(Box.createHorizontalStrut(10)); smallPane.add(textField); mainPane.add(smallPane); mainPane.add(Box.createRigidArea(new Dimension(0,5))); // Radio Medium selection smallPane = new JPanel(); smallPane.setAlignmentX(Component.LEFT_ALIGNMENT); smallPane.setLayout(new BoxLayout(smallPane, BoxLayout.X_AXIS)); label = new JLabel("Radio Medium"); label.setPreferredSize(new Dimension(LABEL_WIDTH,LABEL_HEIGHT)); Vector radioMediumDescriptions = new Vector(); for (Class radioMediumClass: GUI.currentGUI.getRegisteredRadioMediums()) { String description = GUI.getDescriptionOf(radioMediumClass); radioMediumDescriptions.add(description); } comboBox = new JComboBox(radioMediumDescriptions); comboBox.setSelectedIndex(0); radioMediumBox = comboBox; label.setLabelFor(comboBox); smallPane.add(label); smallPane.add(Box.createHorizontalStrut(10)); smallPane.add(comboBox); mainPane.add(smallPane); mainPane.add(Box.createRigidArea(new Dimension(0,5))); // Radio Medium Logging selection smallPane = new JPanel(); smallPane.setAlignmentX(Component.LEFT_ALIGNMENT); smallPane.setLayout(new BoxLayout(smallPane, BoxLayout.X_AXIS)); logCheckBox = new JCheckBox("Log all radio traffic?"); logCheckBox.setPreferredSize(new Dimension(LABEL_WIDTH,LABEL_HEIGHT)); textField = new JTextField(); textField.setText("[filename]"); textField.setColumns(25); logFilename = textField; smallPane.add(logCheckBox); smallPane.add(Box.createHorizontalStrut(10)); smallPane.add(textField); mainPane.add(smallPane); mainPane.add(Box.createRigidArea(new Dimension(0,5))); // Delay time smallPane = new JPanel(); smallPane.setAlignmentX(Component.LEFT_ALIGNMENT); smallPane.setLayout(new BoxLayout(smallPane, BoxLayout.X_AXIS)); label = new JLabel("Delay time (ms)"); label.setPreferredSize(new Dimension(LABEL_WIDTH,LABEL_HEIGHT)); numberField = new JFormattedTextField(integerFormat); numberField.setValue(new Integer(100)); numberField.setColumns(4); delayTime = numberField; smallPane.add(label); smallPane.add(Box.createHorizontalStrut(150)); smallPane.add(numberField); mainPane.add(smallPane); mainPane.add(Box.createRigidArea(new Dimension(0,5))); // Simulation start time smallPane = new JPanel(); smallPane.setAlignmentX(Component.LEFT_ALIGNMENT); smallPane.setLayout(new BoxLayout(smallPane, BoxLayout.X_AXIS)); label = new JLabel("Simulation start time (ms)"); label.setPreferredSize(new Dimension(LABEL_WIDTH,LABEL_HEIGHT)); numberField = new JFormattedTextField(integerFormat); numberField.setValue(new Integer(0)); numberField.setColumns(4); simulationTime = numberField; smallPane.add(label); smallPane.add(Box.createHorizontalStrut(150)); smallPane.add(numberField); mainPane.add(smallPane); mainPane.add(Box.createRigidArea(new Dimension(0,5))); // Tick time smallPane = new JPanel(); smallPane.setAlignmentX(Component.LEFT_ALIGNMENT); smallPane.setLayout(new BoxLayout(smallPane, BoxLayout.X_AXIS)); label = new JLabel("Tick time (ms)"); label.setPreferredSize(new Dimension(LABEL_WIDTH,LABEL_HEIGHT)); numberField = new JFormattedTextField(integerFormat); numberField.setValue(new Integer(1)); numberField.setColumns(4); tickTime = numberField; smallPane.add(label); smallPane.add(Box.createHorizontalStrut(150)); smallPane.add(numberField); mainPane.add(smallPane); mainPane.add(Box.createRigidArea(new Dimension(0,5))); mainPane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); Container contentPane = getContentPane(); contentPane.add(mainPane, BorderLayout.NORTH); contentPane.add(buttonPane, BorderLayout.SOUTH); pack(); } private class AddSimEventHandler implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("cancel")) { mySimulation = null; dispose(); } else if (e.getActionCommand().equals("create")) { mySimulation.setDelayTime(((Number) delayTime.getValue()).intValue()); mySimulation.setSimulationTime(((Number) simulationTime.getValue()).intValue()); mySimulation.setTickTime(((Number) tickTime.getValue()).intValue()); mySimulation.setTitle(title.getText()); String currentRadioMediumDescription = (String) radioMediumBox.getSelectedItem(); for (Class radioMediumClass: GUI.currentGUI.getRegisteredRadioMediums()) { String radioMediumDescription = GUI.getDescriptionOf(radioMediumClass); if (currentRadioMediumDescription.equals(radioMediumDescription)) { try { mySimulation.setRadioMedium(radioMediumClass.newInstance()); } catch (Exception ex) { logger.fatal("Exception when creating radio medium: " + ex); mySimulation.setRadioMedium(null); } break; } } if (logCheckBox.isSelected()) { ConnectionLogger connLogger = new ConnectionLogger(new File(logFilename.getText())); mySimulation.getRadioMedium().setConnectionLogger(connLogger); } dispose(); } } } }