📄 gui.java
字号:
// Append project directory configurations for (File projectDir : currentProjectDirs) { try { // Append config to general config projectConfig.appendProjectDir(projectDir); } catch (FileNotFoundException e) { logger.fatal("Could not find project config file: " + projectDir); return false; } catch (IOException e) { logger .fatal("Error when reading project config file: " + projectDir); return false; } } // Create class loader projectDirClassLoader = createClassLoader(currentProjectDirs); // Register mote types String[] moteTypeClassNames = projectConfig.getStringArrayValue(GUI.class, "MOTETYPES"); if (moteTypeClassNames != null) { for (String moteTypeClassName : moteTypeClassNames) { Class<? extends MoteType> moteTypeClass = tryLoadClass(this, MoteType.class, moteTypeClassName); if (moteTypeClass != null) { registerMoteType(moteTypeClass); // logger.info("Loaded mote type class: " + moteTypeClassName); } else { logger.warn("Could not load mote type class: " + moteTypeClassName); } } } // Register plugins registerPlugin(SimControl.class, false); // Not in menu registerPlugin(SimInformation.class, false); // Not in menu registerPlugin(MoteTypeInformation.class, false); // Not in menu String[] pluginClassNames = projectConfig.getStringArrayValue(GUI.class, "PLUGINS"); if (pluginClassNames != null) { for (String pluginClassName : pluginClassNames) { Class<? extends Plugin> pluginClass = tryLoadClass(this, Plugin.class, pluginClassName); if (pluginClass != null) { registerPlugin(pluginClass); // logger.info("Loaded plugin class: " + pluginClassName); } else { logger.warn("Could not load plugin class: " + pluginClassName); } } } // Reregister temporary plugins again if (oldTempPlugins != null) { for (Class<? extends Plugin> pluginClass : oldTempPlugins) { if (registerTemporaryPlugin(pluginClass)) { // logger.info("Reregistered temporary plugin class: " + // getDescriptionOf(pluginClass)); } else logger.warn("Could not reregister temporary plugin class: " + getDescriptionOf(pluginClass)); } } // Register IP distributors String[] ipDistClassNames = projectConfig.getStringArrayValue(GUI.class, "IP_DISTRIBUTORS"); if (ipDistClassNames != null) { for (String ipDistClassName : ipDistClassNames) { Class<? extends IPDistributor> ipDistClass = tryLoadClass(this, IPDistributor.class, ipDistClassName); if (ipDistClass != null) { registerIPDistributor(ipDistClass); // logger.info("Loaded IP distributor class: " + ipDistClassName); } else { logger .warn("Could not load IP distributor class: " + ipDistClassName); } } } // Register positioners String[] positionerClassNames = projectConfig.getStringArrayValue( GUI.class, "POSITIONERS"); if (positionerClassNames != null) { for (String positionerClassName : positionerClassNames) { Class<? extends Positioner> positionerClass = tryLoadClass(this, Positioner.class, positionerClassName); if (positionerClass != null) { registerPositioner(positionerClass); // logger.info("Loaded positioner class: " + positionerClassName); } else { logger .warn("Could not load positioner class: " + positionerClassName); } } } // Register radio mediums String[] radioMediumsClassNames = projectConfig.getStringArrayValue( GUI.class, "RADIOMEDIUMS"); if (radioMediumsClassNames != null) { for (String radioMediumClassName : radioMediumsClassNames) { Class<? extends RadioMedium> radioMediumClass = tryLoadClass(this, RadioMedium.class, radioMediumClassName); if (radioMediumClass != null) { registerRadioMedium(radioMediumClass); // logger.info("Loaded radio medium class: " + radioMediumClassName); } else { logger.warn("Could not load radio medium class: " + radioMediumClassName); } } } return true; } /** * Returns the current project configuration common to the entire simulator. * * @return Current project configuration */ public ProjectConfig getProjectConfig() { return projectConfig; } /** * Returns the current project directories common to the entire simulator. * * @return Current project directories. */ public Vector<File> getProjectDirs() { return currentProjectDirs; } // // PLUGIN METHODS //// /** * Show a started plugin in working area. * * @param plugin * Internal frame to add */ public void showPlugin(VisPlugin plugin) { int nrFrames = myDesktopPane.getAllFrames().length; myDesktopPane.add(plugin); // Set standard size if not specified by plugin itself if (plugin.getWidth() <= 0 || plugin.getHeight() <= 0) { plugin.setSize(FRAME_STANDARD_WIDTH, FRAME_STANDARD_HEIGHT); } // Set location if not already visible if (!plugin.isVisible()) { plugin.setLocation((nrFrames + 1) * FRAME_NEW_OFFSET, (nrFrames + 1) * FRAME_NEW_OFFSET); plugin.setVisible(true); } // Deselect all other plugins before selecting the new one try { for (JInternalFrame existingPlugin : myDesktopPane.getAllFrames()) { existingPlugin.setSelected(false); } plugin.setSelected(true); } catch (Exception e) { // Ignore } // Mote plugin to front myDesktopPane.moveToFront(plugin); } /** * Remove a plugin from working area. * * @param plugin * Plugin to remove * @param askUser * If plugin is the last one, ask user if we should remove current * simulation also? */ public void removePlugin(Plugin plugin, boolean askUser) { // Clear any allocated resources and remove plugin plugin.closePlugin(); startedPlugins.remove(plugin); // Dispose plugin if it has visualizer if (plugin instanceof VisPlugin) { ((VisPlugin) plugin).dispose(); } if (getSimulation() != null && askUser && startedPlugins.isEmpty()) { String s1 = "Remove"; String s2 = "Cancel"; Object[] options = { s1, s2 }; int n = JOptionPane.showOptionDialog(frame, "You have an active simulation.\nDo you want to remove it?", "Remove current simulation?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, s1); if (n != JOptionPane.YES_OPTION) { return; } doRemoveSimulation(false); } } /** * Starts a plugin of given plugin class with given arguments. * * @param pluginClass * Plugin class * @param gui * GUI passed as argument to all plugins * @param simulation * Simulation passed as argument to mote and simulation plugins * @param mote * Mote passed as argument to mote plugins * @return Start plugin if any */ public Plugin startPlugin(Class<? extends Plugin> pluginClass, GUI gui, Simulation simulation, Mote mote) { // Check that plugin class is registered if (!pluginClasses.contains(pluginClass)) { logger.fatal("Plugin class not registered: " + pluginClass); return null; } // Check that visualizer plugin is not started without GUI if (!isVisualized()) { try { pluginClass.asSubclass(VisPlugin.class); // Cast succeded, plugin is visualizer plugin! logger.fatal("Can't start visualizer plugin (no GUI): " + pluginClass); return null; } catch (ClassCastException e) { } } // Construct plugin depending on plugin type Plugin newPlugin = null; int pluginType = pluginClass.getAnnotation(PluginType.class).value(); try { if (pluginType == PluginType.MOTE_PLUGIN) { if (mote == null) { logger.fatal("Can't start mote plugin (no mote selected)"); return null; } newPlugin = pluginClass.getConstructor( new Class[] { Mote.class, Simulation.class, GUI.class }) .newInstance(mote, simulation, gui); // Tag plugin with mote newPlugin.tagWithObject(mote); } else if (pluginType == PluginType.SIM_PLUGIN || pluginType == PluginType.SIM_STANDARD_PLUGIN) { if (simulation == null) { logger.fatal("Can't start simulation plugin (no simulation)"); return null; } newPlugin = pluginClass.getConstructor( new Class[] { Simulation.class, GUI.class }).newInstance( simulation, gui); } else if (pluginType == PluginType.COOJA_PLUGIN || pluginType == PluginType.COOJA_STANDARD_PLUGIN) { if (gui == null) { logger.fatal("Can't start COOJA plugin (no GUI)"); return null; } newPlugin = pluginClass.getConstructor(new Class[] { GUI.class }) .newInstance(gui); } } catch (Exception e) { logger.fatal("Exception thrown when starting plugin: " + e); e.printStackTrace(); return null; } if (newPlugin == null) return null; // Add to active plugins list startedPlugins.add(newPlugin); // Show plugin if visualizer type if (newPlugin instanceof VisPlugin) { myGUI.showPlugin((VisPlugin) newPlugin); } return newPlugin; } /** * Register a plugin to be included in the GUI. The plugin will be visible in * the menubar. * * @param newPluginClass * New plugin to register * @return True if this plugin was registered ok, false otherwise */ public boolean registerPlugin(Class<? extends Plugin> newPluginClass) { return registerPlugin(newPluginClass, true); } /** * Register a temporary plugin to be included in the GUI. The plugin will be * visible in the menubar. This plugin will automatically be unregistered if * the current simulation is removed. * * @param newPluginClass * New plugin to register * @return True if this plugin was registered ok, false otherwise */ public boolean registerTemporaryPlugin(Class<? extends Plugin> newPluginClass) { if (pluginClasses.contains(newPluginClass)) return false; boolean returnVal = registerPlugin(newPluginClass, true); if (!returnVal) return false; pluginClassesTemporary.add(newPluginClass); return true; } /** * Unregister a plugin class. Removes any plugin menu items links as well. * * @param pluginClass * Plugin class to unregister */ public void unregisterPlugin(Class<? extends Plugin> pluginClass) { // Remove (if existing) plugin class menu items for (Component menuComponent : menuPlugins.getMenuComponents()) { if (menuComponent.getClass().isAssignableFrom(JMenuItem.class)) { JMenuItem menuItem = (JMenuItem) menuComponent; if (menuItem.getClientProperty("class").equals(pluginClass)) menuPlugins.remove(menuItem); } } if (menuMotePluginClasses.contains(pluginClass)) menuMotePluginClasses.remove(pluginClass); // Remove from plugin vectors (including temporary) if (pluginClasses.contains(pluginClass)) pluginClasses.remove(pluginClass); if (pluginClassesTemporary.contains(pluginClass)) pluginClassesTemporary.remove(pluginClass); } /** * Register a plugin to be included in the GUI. * * @param newPluginClass * New plugin to register * @param addToMenu * Should this plugin be added to the dedicated plugins menubar? * @return True if this plugin was registered ok, false otherwise */ private boolean registerPlugin(Class<? extends Plugin> newPluginClass, boolean addToMenu) { // Get description annotation (if any) String description = getDescriptionOf(newPluginClass); // Get plugin type annotation (required) int pluginType; if (newPluginClass.isAnnotationPresent(PluginType.class)) { pluginType = newPluginClass.getAnnotation(PluginType.class).value(); } else { pluginType = PluginType.UNDEFINED_PLUGIN; } // Check that plugin type is valid and constructor exists try { if (pluginType == PluginType.MOTE_PLUGIN) { newPluginClass.getConstructor(new Class[] { Mote.class,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -