added experimental feature: generate executable JAR from current simulation
+ made some methods public for accessing configuration state etc from outside the GUI class + minor bug fix in reparse projectes method
This commit is contained in:
parent
bc0d46a966
commit
4c7ef8b022
1 changed files with 89 additions and 40 deletions
|
@ -24,7 +24,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: GUI.java,v 1.147 2009/10/28 13:37:29 nifi Exp $
|
* $Id: GUI.java,v 1.148 2009/10/29 10:16:05 fros4943 Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package se.sics.cooja;
|
package se.sics.cooja;
|
||||||
|
@ -132,6 +132,7 @@ import se.sics.cooja.plugins.MoteTypeInformation;
|
||||||
import se.sics.cooja.plugins.ScriptRunner;
|
import se.sics.cooja.plugins.ScriptRunner;
|
||||||
import se.sics.cooja.plugins.SimControl;
|
import se.sics.cooja.plugins.SimControl;
|
||||||
import se.sics.cooja.plugins.SimInformation;
|
import se.sics.cooja.plugins.SimInformation;
|
||||||
|
import se.sics.cooja.util.ExecuteJAR;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main file of COOJA Simulator. Typically contains a visualizer for the
|
* Main file of COOJA Simulator. Typically contains a visualizer for the
|
||||||
|
@ -230,8 +231,8 @@ public class GUI extends Observable {
|
||||||
private static Logger logger = Logger.getLogger(GUI.class);
|
private static Logger logger = Logger.getLogger(GUI.class);
|
||||||
|
|
||||||
// External tools setting names
|
// External tools setting names
|
||||||
private static Properties defaultExternalToolsSettings;
|
public static Properties defaultExternalToolsSettings;
|
||||||
private static Properties currentExternalToolsSettings;
|
public static Properties currentExternalToolsSettings;
|
||||||
|
|
||||||
private static final String externalToolsSettingNames[] = new String[] {
|
private static final String externalToolsSettingNames[] = new String[] {
|
||||||
"PATH_CONTIKI", "PATH_COOJA_CORE_RELATIVE",
|
"PATH_CONTIKI", "PATH_COOJA_CORE_RELATIVE",
|
||||||
|
@ -402,19 +403,19 @@ public class GUI extends Observable {
|
||||||
File projectDir = restorePortablePath(new File(p));
|
File projectDir = restorePortablePath(new File(p));
|
||||||
currentProjectDirs.add(projectDir);
|
currentProjectDirs.add(projectDir);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load extendable parts (using current project config)
|
/* Parse current project configuration */
|
||||||
try {
|
try {
|
||||||
reparseProjectConfig();
|
reparseProjectConfig();
|
||||||
} catch (ParseProjectsException e) {
|
} catch (ParseProjectsException e) {
|
||||||
logger.fatal("Error when loading projects: " + e.getMessage(), e);
|
logger.fatal("Error when loading projects: " + e.getMessage(), e);
|
||||||
if (isVisualized()) {
|
if (isVisualized()) {
|
||||||
JOptionPane.showMessageDialog(GUI.getTopParentContainer(),
|
JOptionPane.showMessageDialog(GUI.getTopParentContainer(),
|
||||||
"Default projects could not load, reconfigure project directories:" +
|
"Default projects could not load, reconfigure project directories:" +
|
||||||
"\n\tMenu->Settings->Manage project directories" +
|
"\n\tMenu->Settings->Manage project directories" +
|
||||||
"\n\nSee console for stack trace with more information.",
|
"\n\nSee console for stack trace with more information.",
|
||||||
"Project loading error", JOptionPane.ERROR_MESSAGE);
|
"Project loading error", JOptionPane.ERROR_MESSAGE);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -631,6 +632,7 @@ public class GUI extends Observable {
|
||||||
guiActions.add(reloadRandomSimulationAction);
|
guiActions.add(reloadRandomSimulationAction);
|
||||||
guiActions.add(saveSimulationAction);
|
guiActions.add(saveSimulationAction);
|
||||||
guiActions.add(closePluginsAction);
|
guiActions.add(closePluginsAction);
|
||||||
|
guiActions.add(exportExecutableJARAction);
|
||||||
guiActions.add(exitCoojaAction);
|
guiActions.add(exitCoojaAction);
|
||||||
guiActions.add(startStopSimulationAction);
|
guiActions.add(startStopSimulationAction);
|
||||||
guiActions.add(removeAllMotesAction);
|
guiActions.add(removeAllMotesAction);
|
||||||
|
@ -683,6 +685,7 @@ public class GUI extends Observable {
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
|
|
||||||
menu.add(new JMenuItem(closePluginsAction));
|
menu.add(new JMenuItem(closePluginsAction));
|
||||||
|
menu.add(new JMenuItem(exportExecutableJARAction));
|
||||||
|
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
|
|
||||||
|
@ -1043,7 +1046,7 @@ public class GUI extends Observable {
|
||||||
return myDesktopPane;
|
return myDesktopPane;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setLookAndFeel() {
|
public static void setLookAndFeel() {
|
||||||
|
|
||||||
JFrame.setDefaultLookAndFeelDecorated(true);
|
JFrame.setDefaultLookAndFeelDecorated(true);
|
||||||
JDialog.setDefaultLookAndFeelDecorated(true);
|
JDialog.setDefaultLookAndFeelDecorated(true);
|
||||||
|
@ -1119,7 +1122,7 @@ public class GUI extends Observable {
|
||||||
return desktop;
|
return desktop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Simulation quickStartSimulationConfig(File config, boolean vis) {
|
public static Simulation quickStartSimulationConfig(File config, boolean vis) {
|
||||||
logger.info("> Starting COOJA");
|
logger.info("> Starting COOJA");
|
||||||
JDesktopPane desktop = createDesktopPane();
|
JDesktopPane desktop = createDesktopPane();
|
||||||
if (vis) {
|
if (vis) {
|
||||||
|
@ -1968,7 +1971,11 @@ public class GUI extends Observable {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Plugin[] getStartedPlugins() {
|
||||||
|
return startedPlugins.toArray(new Plugin[0]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a mote plugins submenu for given mote.
|
* Return a mote plugins submenu for given mote.
|
||||||
*
|
*
|
||||||
|
@ -3294,32 +3301,12 @@ public class GUI extends Observable {
|
||||||
* @param file
|
* @param file
|
||||||
* File to write
|
* File to write
|
||||||
*/
|
*/
|
||||||
public void saveSimulationConfig(File file) {
|
public void saveSimulationConfig(File file) {
|
||||||
this.currentConfigFile = file; /* Used to generate config relative paths */
|
this.currentConfigFile = file; /* Used to generate config relative paths */
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Create simulation config
|
|
||||||
Element root = new Element("simconf");
|
|
||||||
|
|
||||||
/* Store project directories meta data */
|
|
||||||
for (File project: currentProjectDirs) {
|
|
||||||
Element projectElement = new Element("project");
|
|
||||||
projectElement.addContent(createPortablePath(project).getPath().replaceAll("\\\\", "/"));
|
|
||||||
root.addContent(projectElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
Element simulationElement = new Element("simulation");
|
|
||||||
simulationElement.addContent(mySimulation.getConfigXML());
|
|
||||||
root.addContent(simulationElement);
|
|
||||||
|
|
||||||
// Create started plugins config
|
|
||||||
Collection<Element> pluginsConfig = getPluginsConfigXML();
|
|
||||||
if (pluginsConfig != null) {
|
|
||||||
root.addContent(pluginsConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create and write to document
|
// Create and write to document
|
||||||
Document doc = new Document(root);
|
Document doc = new Document(extractSimulationConfig());
|
||||||
FileOutputStream out = new FileOutputStream(file);
|
FileOutputStream out = new FileOutputStream(file);
|
||||||
XMLOutputter outputter = new XMLOutputter();
|
XMLOutputter outputter = new XMLOutputter();
|
||||||
outputter.setFormat(Format.getPrettyFormat());
|
outputter.setFormat(Format.getPrettyFormat());
|
||||||
|
@ -3332,6 +3319,30 @@ public class GUI extends Observable {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Element extractSimulationConfig() {
|
||||||
|
// Create simulation config
|
||||||
|
Element root = new Element("simconf");
|
||||||
|
|
||||||
|
/* Store project directories meta data */
|
||||||
|
for (File project: currentProjectDirs) {
|
||||||
|
Element projectElement = new Element("project");
|
||||||
|
projectElement.addContent(createPortablePath(project).getPath().replaceAll("\\\\", "/"));
|
||||||
|
root.addContent(projectElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
Element simulationElement = new Element("simulation");
|
||||||
|
simulationElement.addContent(mySimulation.getConfigXML());
|
||||||
|
root.addContent(simulationElement);
|
||||||
|
|
||||||
|
// Create started plugins config
|
||||||
|
Collection<Element> pluginsConfig = getPluginsConfigXML();
|
||||||
|
if (pluginsConfig != null) {
|
||||||
|
root.addContent(pluginsConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns started plugins config.
|
* Returns started plugins config.
|
||||||
|
@ -4142,6 +4153,44 @@ public class GUI extends Observable {
|
||||||
return !startedPlugins.isEmpty();
|
return !startedPlugins.isEmpty();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
GUIAction exportExecutableJARAction = new GUIAction("Export simulation as executable JAR") {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
getSimulation().stopSimulation();
|
||||||
|
|
||||||
|
/* Info message */
|
||||||
|
JOptionPane.showMessageDialog(GUI.getTopParentContainer(),
|
||||||
|
"This function attempts to build an executable COOJA JAR from the current simulation.\n" +
|
||||||
|
"The JAR will contain all simulation dependencies, including project JAR files and mote firmware files.\n" +
|
||||||
|
"\nExecutable simulations can be used to run already prepared simulations on several computers.\n" +
|
||||||
|
"\nThis is an experimental feature!",
|
||||||
|
"Export simulation to executable JAR", JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
|
||||||
|
/* Select output directory */
|
||||||
|
JFileChooser fc = new JFileChooser();
|
||||||
|
fc.setDialogTitle("Select directory for " + ExecuteJAR.EXECUTABLE_JAR_FILENAME);
|
||||||
|
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
|
||||||
|
fc.setAcceptAllFileFilterUsed(false);
|
||||||
|
int returnVal = fc.showSaveDialog(myDesktopPane);
|
||||||
|
if (returnVal != JFileChooser.APPROVE_OPTION) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
File dir = fc.getSelectedFile();
|
||||||
|
if (!dir.isDirectory()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
ExecuteJAR.buildExecutableJAR(GUI.this, dir);
|
||||||
|
} catch (RuntimeException ex) {
|
||||||
|
JOptionPane.showMessageDialog(GUI.getTopParentContainer(),
|
||||||
|
ex.getMessage(),
|
||||||
|
"Mote type not supported", JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public boolean shouldBeEnabled() {
|
||||||
|
return getSimulation() != null;
|
||||||
|
}
|
||||||
|
};
|
||||||
GUIAction exitCoojaAction = new GUIAction("Exit", KeyEvent.VK_X, KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK)) {
|
GUIAction exitCoojaAction = new GUIAction("Exit", KeyEvent.VK_X, KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK)) {
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
myGUI.doQuit(true);
|
myGUI.doQuit(true);
|
||||||
|
|
Loading…
Reference in a new issue