/** * The default constructor for this class. * * <p>The first time this constructor is called, it initializes the static parameters of this * class. This approach is necessary as to give proper error reporting if one of the * initialization steps fails. * * @throws CorruptConfigurationEntryException If one of the initialization steps fails. */ public QUDG() throws CorruptConfigurationEntryException { // only call the first time a QUDG object is created if (!initialized) { // speed up by comparing the squared distances (needs not take the square root to get the // distance) r_min = Configuration.getDoubleParameter("QUDG/rMin"); r_min_squared = r_min * r_min; r_max = Configuration.getDoubleParameter("QUDG/rMax"); r_max_squared = r_max * r_max; // Sanity check double geomNodeRMax = Configuration.getDoubleParameter("GeometricNodeCollection/rMax"); if (r_max > geomNodeRMax) { // dangerous! This is probably not what the user wants! Main.minorError( "WARNING: The maximum transmission range used for the QUDG connectivity model is larger than the maximum transmission range specified for the GeometricNodeCollection.\nAs a result, not all connections will be found! Either fix the problem in the project-specific configuration file or the '-overwrite' command line argument."); } if (r_max <= r_min) { Main.minorError( "WARNING: The maximum transmission range used for the QUDG connectivity model is not larger than the minimum tansmission range.\nEither fix the problem in the project-specific configuration file or the '-overwrite' command line argument."); } // TODO: rewrite the docu of this class String type = Configuration.getStringParameter("QUDG/ProbabilityType"); if (type.toLowerCase().equals("constant")) { probabilityType = 0; probability = Configuration.getDoubleParameter("QUDG/connectionProbability"); } else if (type.toLowerCase().equals("linear")) { probabilityType = 1; m = 1 / (r_min - r_max); q = r_max / (r_max - r_min); } else if (type.toLowerCase().equals("quadratic")) { probabilityType = 2; throw new NotYetImplementedException( "QUDG does not yet support quadratic probability distributions."); } else { // TODO: rewrite the following exception, rewrite docu as well throw new CorruptConfigurationEntryException( "The QUDG connectivity model requires an entry in the project" + " configuration file that specifies the kind of probability to be applied if the distance between two nodes " + "lies between rMin and rMax. Possible values for ProbabilityType are 'constant', 'linear', and 'quadratic'.\n\n" + "'constant' requires yet another entry 'connectionProbability', which specifies the constant probability at which the connection exists.\n\n" + "'linear' applies a linear regression that decreases from 1 to 0 from rMin to rMax.\n\n" + "'quadratic' applies a quadratic regression that decreases from 1 to 0 from rMin to rMax.\n\n"); } probability = Configuration.getDoubleParameter("QUDG/connectionProbability"); initialized = true; } }
/** * Show the description for a given project * * @param projectName The project name */ private void generateGUIDescription(String projectName) { File proj = new File( Configuration.sourceDirPrefix + "/" + Configuration.projectDirInSourceFolder + "/" + projectName + "/" + Configuration.descriptionFileName); try { if (!proj.exists()) { descriptionText.setText("There is no description-file in the currently selected project."); } else { LineNumberReader r = new LineNumberReader(new FileReader(proj)); String description = ""; String tmp = null; while ((tmp = r.readLine()) != null) { description += tmp + "\n"; } descriptionText.setText(description); descriptionText.setCaretPosition(0); } } catch (FileNotFoundException e) { descriptionText.setText("There is no description-file in the currently selected project."); } catch (IOException e) { Main.minorError(e); descriptionText.setText("There is no description-file in the currently selected project."); } }
/** * Creates a new icon button where the icon is supposed to be stored in the framework * * @param actionCommand Name of the action that is performed when this button is pressed * @param imageName The name of the image file, which is stored in the directory specified by * Configuration.imageDir * @param toolTip Tooltip text to be shown for this button * @return A new JButton with an icon */ protected JButton createFrameworkIconButton( String actionCommand, String imageName, String toolTip) { // To support jar files, we cannot access the file directly ClassLoader cldr = this.getClass().getClassLoader(); JButton b = null; try { URL url = cldr.getResource(Configuration.imageDir + imageName); ImageIcon icon = new ImageIcon(url); b = new JButton(icon); } catch (NullPointerException e) { Main.fatalError( "Cannot access the application icon " + imageName + ", which should be stored in\n" + Configuration.binaryDir + "/" + Configuration.imageDir + imageName + "."); return null; } // b.setPreferredSize(new Dimension(29, 29)); b.setPreferredSize(new Dimension(0, 9)); b.setActionCommand(actionCommand); b.setFocusable(false); b.setBorderPainted(false); // b.setBackground(bgColor); b.addActionListener(this); // b.addMouseListener(this); // move over the button => draw border b.setToolTipText(toolTip); return b; }
public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { if (userInputListener.isModified()) { // the user has modified the config, but not stored it int decision = JOptionPane.showConfirmDialog( this, "The configuration for project '" + selectedProjectName + "' has unsaved changes. Do you wish to save them?", "Save Changes?", JOptionPane.YES_NO_CANCEL_OPTION); if (decision == JOptionPane.YES_OPTION) { // store try { storeConfig(false); } catch (Exception ex) { Main.fatalError(ex); } } if (decision == JOptionPane.CANCEL_OPTION) { selection.removeListSelectionListener(this); selection.setSelectedValue(selectedProjectName, true); selection.addListSelectionListener(this); return; } } selectedProjectName = (String) selection.getSelectedValue(); generateGUIGonfiguration(selectedProjectName); generateGUIDescription(selectedProjectName); } }
/** Creates a new Drop Rate Reliability Model instance. */ public LossyDelivery() { try { dropRate = Configuration.getDoubleParameter("LossyDelivery/dropRate"); } catch (CorruptConfigurationEntryException e) { Main.fatalError( "Missing configuration entry for the Message Transmission Model:\n" + e.getMessage()); } }
/** * Validates the custom configuration and displays, if necessary, error messages. * * @return The XML document describing the custom configuration, null if the configuration did not * parse properly. */ private Document validateCustomFields() { Document doc = null; try { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Document><Custom>" + customParameters.getText() + "</Custom></Document>"; doc = new SAXBuilder().build(new StringReader(xml)); } catch (JDOMException e) { Main.minorError("Invalid XML in the custom configuration:\n\n" + e.getMessage()); return null; } catch (IOException e) { Main.minorError( "Cannot parse custom configuration due to I/O exception:\n\n" + e.getMessage()); return null; } return doc; }
/** * Starts this timer to go off after a certain time, where the time is specified relative to the * current time. * * <p>In synchrone mode, set the relative time to 1 to have the timer go off in the following * round. * * @param relativeTime The time in which the timer should go off. relativeTime must be greater * than 0. * @param n The node that started the timer and on which the timer will be fired. */ public final void startRelative(double relativeTime, Node n) { if (relativeTime <= 0) { Main.fatalError( "A relative time indicating when a timer should start must be strictly positive."); } node = n; fireTime = Global.currentTime + relativeTime; if (Global.isAsynchronousMode) { Runtime.eventQueue.insert(TimerEvent.getNewTimerEvent(this, fireTime)); } else { node.getTimers().add(this); } }
/** * Starts this timer to go off at the specified time, where the time is given absolute. * * @param absoluteTime The (absolute) time when the timer should goes off. This time must be * strictly greater than the current time. * @param n The node that started the timer and on which the timer will be fired. */ public final void startAbsolute(double absoluteTime, Node n) { if (absoluteTime <= Global.currentTime) { Main.fatalError( "The absolute time when a timer goes off must be strictly larger than the current time."); } node = n; fireTime = absoluteTime; if (Global.isAsynchronousMode) { Runtime.eventQueue.insert(TimerEvent.getNewTimerEvent(this, fireTime)); } else { node.getTimers().add(this); } }
/* (non-Javadoc) * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent e) { if (e.getSource().equals(saveConfig) || e.getSource() .equals( saveConfig2)) { // -------------------------------------------------------------------- if (selection.getSelectedValue() == null) { JOptionPane.showMessageDialog( this, "Please select a project from the selection.", "No project selected.", JOptionPane.ERROR_MESSAGE); } else try { storeConfig(false); } catch (Exception ex) { Main.fatalError(ex); } } else if (e.getSource() .equals(ok)) { // -------------------------------------------------------------------- if (selection.getSelectedValue() == null) { JOptionPane.showMessageDialog( this, "Please select a project from the selection.", "No project selected.", JOptionPane.ERROR_MESSAGE); } else { if (userInputListener.isModified()) { // the user has modified the config, but not stored it int decision = JOptionPane.showConfirmDialog( this, "The modifications to this configuration have not yet been saved.\n\nDo you want to store this configuration, such that it is also available for subsequent runs?", "Unsaved modifications", JOptionPane.YES_NO_CANCEL_OPTION); if (decision == JOptionPane.YES_OPTION) { // store try { storeConfig(false); } catch (Exception ex) { Main.fatalError(ex); } } if (decision == JOptionPane.CANCEL_OPTION) { return; // don't do anything } } Document customDoc = validateCustomFields(); if (customDoc == null) { // there is invalid xml in the custom entry return; } if (!selectedProjectName.equals("defaultProject")) { Global.projectName = selectedProjectName; Global.useProject = true; appConfig.lastChosenProject = Global.projectName; } Element customEle = customDoc.getRootElement().getChild("Custom"); XMLParser.parseCustom(customEle, ""); setFrameworkConfig(); // Block the overwriting of the now set values. XMLParser.blockParse = true; this.setVisible(false); // reset the tooltip dismiss delay to the default value ToolTipManager.sharedInstance().setDismissDelay(defaultTooltipDismissDelay); appConfig.projectSelectorSelectedTab = 1 + right.getSelectedIndex(); appConfig .writeConfig(); // write the config, s.t. when the main application crashes, at least // the project selector config is preserved storeConfig(true); // store the config to a file s.t. the simulation process can read it // wake up the waiting object. synchronized (main) { main.notify(); } } } else if (e.getSource() .equals(cancel)) { // -------------------------------------------------------------------- if (userInputListener.isModified()) { // the user has modified the config, but not stored it int decision = JOptionPane.showConfirmDialog( this, "The configuration for project '" + selectedProjectName + "' has unsaved changes. Do you wish to save them?", "Save Changes?", JOptionPane.YES_NO_CANCEL_OPTION); if (decision == JOptionPane.YES_OPTION) { // store try { storeConfig(false); } catch (Exception ex) { Main.fatalError(ex); } } if (decision == JOptionPane.CANCEL_OPTION) { return; } } appConfig.projectSelectorSelectedTab = 1 + right.getSelectedIndex(); appConfig.writeConfig(); System.exit(1); } else if (e.getSource() .equals(collapse)) { // -------------------------------------------------------------------- showOptionalFields = false; insertProjectEntries(); this.repaint(); } else if (e.getSource() .equals(expand)) { // -------------------------------------------------------------------- showOptionalFields = true; insertProjectEntries(); this.repaint(); } }
private void storeConfig(boolean isTemporary) { // Test that the custom config is OK Document customConfig = validateCustomFields(); if (customConfig == null) { return; } // Build the framework config XML tree Document doc = new Document(); Element root = new Element("Document"); doc.setRootElement(root); Element framework = new Element("Framework"); root.addContent(framework); Element custom = new Element("Custom"); root.addContent(custom); custom.addContent( new Element( "_xml_custom_")); // this tag will be replaced by the config text in a second step for (ConfigEntry e : projectEntries) { if (e.valueComponent != null) { // there is a value field in the GUI if (e.comment != "") { // the comment is not "", add it framework.addContent( new Comment(e.comment.replace("\n", " "))); // without the newline chars } // get the value of this entry from the GUI String value = ""; if (e.valueComponent instanceof JComboBox) { value = (String) ((JComboBox) e.valueComponent).getSelectedItem(); } else if (e.valueComponent instanceof JTextComponent) { value = ((JTextComponent) e.valueComponent).getText(); } // create and add a new entry in the XML file Element elem = new Element(e.key); elem.setAttribute("value", value); framework.addContent(elem); framework.addContent( new Element( "_xml_NL_")); // after each entry, we would like a new-line in the document - these // tags are replaced in a second step } else { // this is a section entry, which will be inserted as comment // String line = " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "; String line = "***********************************************************************"; framework.addContent(new Comment(line)); String name = " " + e.key; while (name.length() < line.length()) { // fill the name with spaces s.t. the '-->' are aligned name += " "; } framework.addContent(new Comment(name)); framework.addContent(new Comment(line)); } } String outputPath = Configuration.sourceDirPrefix + "/" + Configuration.projectDirInSourceFolder + "/" + selectedProjectName; File outputFile = new File(outputPath + "/" + Configuration.configfileFileName + (isTemporary ? ".run" : "")); // And write the xml tree to the file XMLOutputter outputter = new XMLOutputter(); Format f = Format.getPrettyFormat(); f.setIndent("\t"); outputter.setFormat(f); File tempOutputFile = new File(outputPath + "/" + Configuration.configfileFileName + ".temp"); try { FileWriter fW = new FileWriter(tempOutputFile); outputter.output(doc, fW); fW.flush(); fW.close(); } catch (IOException e) { Main.minorError("Could not write a temporary configuration file!\n\n" + e.getMessage()); return; } // in a second step, parse the temp file, replace the _xml_nl_ by new-lines and the _xml_custom_ // by the custom text try { BufferedWriter output = new BufferedWriter(new FileWriter(outputFile)); LineNumberReader input = new LineNumberReader(new FileReader(tempOutputFile)); String line = input.readLine(); while (line != null) { if (line.contains("<_xml_NL_")) { output.newLine(); } else if (line.contains("<_xml_custom_")) { output.write(customParameters.getText()); } else { output.write(line); output.newLine(); } line = input.readLine(); } output.flush(); output.close(); input.close(); tempOutputFile.delete(); } catch (IOException e1) { Main.minorError("Could not write the configuration file!\n\n" + e1.getMessage()); } userInputListener.reset(); // finally reset the 'modified' flag }
/** * Generate the GUI components to show the config for a given project * * @param projectName */ private void generateGUIGonfiguration(String projectName) { boolean configExists = true; Element frameworkElement = null; String configFileName = Configuration.sourceDirPrefix + "/" + Configuration.projectDirInSourceFolder + "/" + projectName + "/" + Configuration.configfileFileName; File configFile = new File(configFileName); if (!configFile.exists()) { configExists = false; } else try { Document doc = new SAXBuilder().build(configFile); Element root = doc.getRootElement(); frameworkElement = root.getChild("Framework"); Element custom = root.getChild("Custom"); if (custom == null) { Main.fatalError( "Invalid configuration file: A Custom entry is missing.\n" + "The file needs to be of the following form: \n" + "<Document>\n <Framework>...</Framework>\n <Custom></Custom>\n</Document>"); } if (frameworkElement == null) { Main.fatalError( "Invalid configuration file: A 'framework' entry is missing.\n" + "The file needs to be of the following form: \n" + "<Document>\n <Framework>...</Framework>\n <Custom></Custom>\n</Document>"); } } catch (JDOMException e1) { Main.fatalError("Invalid configuration file:\n\n" + e1.getMessage()); } catch (IOException e1) { Main.fatalError("Cannot open or read from configuration file:\n\n" + e1.getMessage()); } projectEntries = new Vector<ConfigEntry>(); String sectionName = ""; Class<?> configClass = Configuration.class; // We assume here that the fields are returned in the order they are listed in the java file! Field[] fields = configClass.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; try { // read the annotations for this field Configuration.DefaultInConfigFile dan = field.getAnnotation(Configuration.DefaultInConfigFile.class); Configuration.OptionalInConfigFile oan = field.getAnnotation(Configuration.OptionalInConfigFile.class); Configuration.SectionInConfigFile san = field.getAnnotation(Configuration.SectionInConfigFile.class); if (dan != null || oan != null) { if (san != null) { // get the title sectionName = san.value(); projectEntries.add( new ConfigEntry( sectionName, "", Configuration.SectionInConfigFile.class, "", false, field)); } String description = dan != null ? dan.value() : oan.value(); // the description text // test whether the XML file contains an entry for this field String value = null; if (configExists) { Element e = frameworkElement.getChild(field.getName()); if (e != null) { value = e.getAttributeValue("value"); // null if not there } } if (value == null) { // there was no entry in the config-file. Take the default value. projectEntries.add( new ConfigEntry( field.getName(), Configuration.getConfigurationText(field.get(null)), field.getType(), description, oan != null, field)); } else { // there is an entry in the XML file projectEntries.add( new ConfigEntry( field.getName(), value, field.getType(), description, oan != null, field)); // elem.comment } } else if (field.getName().equals("edgeType")) { // NOTE: the edgeType member does not carry any annotations (exception) String comment = "The default type of edges to be used"; String value = null; if (configExists) { Element e = frameworkElement.getChild(field.getName()); if (e != null) { value = e.getAttributeValue("value"); // null if not there } } if (value == null) { // there was no entry in the config-file. Take the default value. projectEntries.add( new ConfigEntry( field.getName(), Configuration.getEdgeType(), field.getType(), comment, oan != null, field)); } else { projectEntries.add( new ConfigEntry( field.getName(), value, field.getType(), comment, oan != null, field)); } } } catch (IllegalArgumentException e) { Main.fatalError(e); } catch (IllegalAccessException e) { Main.fatalError(e); } } // for each entry, create the corresponding GUI components asynchronousSimulationCB = null; mobilityCB = null; for (ConfigEntry e : projectEntries) { String ttt = e.comment.equals("") ? null : e.comment; // the tool tip text, don't show at all, if no text to display // creating the text field UnborderedJTextField label; if (e.entryClass == Configuration.SectionInConfigFile.class) { label = new UnborderedJTextField(e.key.toString(), Font.BOLD); } else { label = new UnborderedJTextField(" " + e.key.toString(), Font.PLAIN); } label.setToolTipText(ttt); e.textComponent = label; if (e.entryClass == boolean.class) { String[] ch = {"true", "false"}; MultiLineToolTipJComboBox booleanChoice = new MultiLineToolTipJComboBox(ch); if ((e.value).compareTo("true") != 0) { booleanChoice.setSelectedItem("false"); } else { booleanChoice.setSelectedItem("true"); } booleanChoice.addActionListener( userInputListener); // ! add this listener AFTER setting the value! booleanChoice.setToolTipText(ttt); e.valueComponent = booleanChoice; // special case: mobility can only be changed if simulation is in sync mode. if (e.key.equals("asynchronousMode")) { asynchronousSimulationCB = booleanChoice; if (mobilityCB != null && (e.value).equals("true")) { mobilityCB.setSelectedItem("false"); mobilityCB.setEnabled(false); } } if (e.key.equals("mobility")) { mobilityCB = booleanChoice; if (asynchronousSimulationCB != null && asynchronousSimulationCB.getSelectedItem().equals("true")) { mobilityCB.setSelectedItem("false"); mobilityCB.setEnabled(false); } } } else if (e.entryClass == Configuration.SectionInConfigFile.class) { e.valueComponent = null; // there's no component for the section } else { // special case for some text fields that expect the name of an implementation. They // should show the available implementations in a drop down field ImplementationChoiceInConfigFile ian = e.field.getAnnotation(ImplementationChoiceInConfigFile.class); if (ian != null) { Vector<String> ch = Global.getImplementations(ian.value(), true); MultiLineToolTipJComboBox choice = new MultiLineToolTipJComboBox(ch); choice.setEditable( true); // let the user the freedom to enter other stuff (which is likely to be // wrong...) choice.setSelectedItem(e.value); choice.addActionListener( userInputListener); // ! add this listener AFTER setting the value! choice.setToolTipText(ttt); e.valueComponent = choice; } else { if (e.key.equals("javaCmd")) { // special case - this field may contain a lot of text JTextArea textArea = new MultiLineToolTipJTextArea(e.value.toString()); textArea.setToolTipText(ttt); textArea.setBorder((new JTextField()).getBorder()); // copy the border textArea.setLineWrap(true); // textArea.setPreferredSize(new Dimension(50, 30)); textArea.addKeyListener(userInputListener); e.valueComponent = textArea; } else { MultiLineToolTipJTextField textField = new MultiLineToolTipJTextField(e.value.toString()); textField.setToolTipText(ttt); textField.addKeyListener(userInputListener); e.valueComponent = textField; } } } } // and finally add all the entries insertProjectEntries(); customConfigurationPanel.removeAll(); // And add the custom entries // this code snipped was used to redirect the mouse wheel applied on this // text field to the entire tab when the custom config was below the framework config // // remove all mouse wheel listeners from the text input // for(MouseWheelListener mwl : customParameters.getMouseWheelListeners()) { // customParameters.removeMouseWheelListener(mwl); // } // // and add the 'global' one // customParameters.addMouseWheelListener(new // MouseWheelForwarder(scrollableConfigurationPane.getMouseWheelListeners())); customParameters.setTabSize(3); customParameters.setLineWrap(true); customParameters.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); if (configExists) { customParameters.setText(getCustomText(configFile)); } else { customParameters.setText(""); } customParameters.addKeyListener( userInputListener); // ! add this listener AFTER setting the text ! JScrollPane customScroll = new JScrollPane( customParameters, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); customScroll.setWheelScrollingEnabled(true); customConfigurationPanel.add(customScroll); userInputListener.reset(); super.repaint(); }
/** * This method populates the ProjectSelector with all the subpanels and buttons * * @param main The object to notify when the ok button is pressed. */ public void populate(Object main) { this.main = main; // gather all projects String[] projects = getAllProjectNames(); if (projects == null) { Main.fatalError( "Cannot find the project folder. Please ensure that the framework is installed properly."); } Arrays.sort(projects); // sort the projects in ascending order this.addComponentListener( new ComponentListener() { int oldX = appConfig.projectSelectorWindowPosX, oldY = appConfig.projectSelectorWindowPosY; public void componentResized(ComponentEvent e) { if (ProjectSelector.this.getExtendedState() == JFrame.MAXIMIZED_BOTH) { appConfig.projectSelectorIsMaximized = true; appConfig.projectSelectorWindowPosX = oldX; appConfig.projectSelectorWindowPosY = oldY; } else { appConfig.projectSelectorIsMaximized = false; appConfig.projectSelectorWindowWidth = ProjectSelector.this.getWidth(); appConfig.projectSelectorWindowHeight = ProjectSelector.this.getHeight(); } customParameters.setSize( 100, customParameters .getHeight()); // needed to ensure that the text field shrinks as well } public void componentMoved(ComponentEvent e) { oldX = appConfig.projectSelectorWindowPosX; oldY = appConfig.projectSelectorWindowPosY; appConfig.projectSelectorWindowPosX = ProjectSelector.this.getX(); appConfig.projectSelectorWindowPosY = ProjectSelector.this.getY(); } public void componentShown(ComponentEvent e) {} public void componentHidden(ComponentEvent e) {} }); // safe the overal config file when the project selector closes this.addWindowListener( new WindowListener() { public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { appConfig.projectSelectorSelectedTab = 1 + right.getSelectedIndex(); appConfig.writeConfig(); } public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} }); this.setLayout(new BorderLayout()); this.setResizable(true); if (appConfig.projectSelectorIsMaximized) { setExtendedState(JFrame.MAXIMIZED_BOTH); } this.setSize( new Dimension(appConfig.projectSelectorWindowWidth, appConfig.projectSelectorWindowHeight)); this.setLocation(appConfig.projectSelectorWindowPosX, appConfig.projectSelectorWindowPosY); JPanel left = new JPanel(); left.setLayout(new BorderLayout()); // List of all projects selection.setListData(projects); selection.setSelectedValue(appConfig.lastChosenProject, true); if (!selection.isSelectionEmpty()) { selectedProjectName = (String) selection.getSelectedValue(); } else { selectedProjectName = ""; } selection.addListSelectionListener(this); selection.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 0)); selection.setBackground(listPanel.getBackground()); listScroller = new JScrollPane(selection); listPanel.setLayout(new BorderLayout()); listScroller.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); listPanel.add(listScroller, BorderLayout.CENTER); listPanel.setBorder(BorderFactory.createTitledBorder("Available Projects")); left.add(listPanel, BorderLayout.CENTER); // OK / Cancel buttons buttonPanel.add(ok); buttonPanel.add(cancel); ok.addActionListener(this); cancel.addActionListener(this); buttonPanel.setPreferredSize(new Dimension(projectListWidth, 40)); left.add(buttonPanel, BorderLayout.SOUTH); this.add(left, BorderLayout.WEST); // right.setBorder(BorderFactory.createTitledBorder("Project Description & Configuration")); // The tab containing the description of the selected project JPanel description = new JPanel(); description.setLayout(new BorderLayout()); scrollableDescriptionPane = new JScrollPane(descriptionText); description.add(scrollableDescriptionPane); descriptionText.setEditable(false); descriptionText.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); int i = selection.getSelectedIndex(); if (i == -1) { // there was no defaultProject descriptionText.setText("Please select a project."); } else { generateGUIDescription(selectedProjectName); } right.addTab("Description", description); // The tab containing the config-file entries configuration.setLayout(new BoxLayout(configuration, BoxLayout.Y_AXIS)); scrollableConfigurationPane = new JScrollPane(frameworkConfigurationPanel); // increment the scroll speed (for some reason the speed for the scrollableConfigurationPane is // very low) scrollableConfigurationPane.getVerticalScrollBar().setUnitIncrement(15); frameworkConfigurationPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); configuration.add(scrollableConfigurationPane); JPanel bp = new JPanel(); bp.add(saveConfig); saveConfig.addActionListener(this); saveConfig.setMnemonic(java.awt.event.KeyEvent.VK_S); configuration.add(bp); expand = createFrameworkIconButton("expand", "expand.gif", "Show advanced settings"); collapse = createFrameworkIconButton("collapse", "collapse.gif", "Hide advanced settings"); customConfigurationPanel.setLayout(new BorderLayout()); JPanel mainCustomConfigurationPanel = new JPanel(); mainCustomConfigurationPanel.setLayout( new BoxLayout(mainCustomConfigurationPanel, BoxLayout.Y_AXIS)); mainCustomConfigurationPanel.add(customConfigurationPanel); // and the save button JPanel bp2 = new JPanel(); bp2.add(saveConfig2); saveConfig2.addActionListener(this); saveConfig2.setMnemonic(java.awt.event.KeyEvent.VK_S); mainCustomConfigurationPanel.add(bp2); right.addTab("Framework Config", configuration); right.addTab("Project Config", mainCustomConfigurationPanel); right.setMnemonicAt(0, java.awt.event.KeyEvent.VK_D); right.setMnemonicAt(1, java.awt.event.KeyEvent.VK_F); right.setMnemonicAt(2, java.awt.event.KeyEvent.VK_P); right.setSelectedIndex(appConfig.projectSelectorSelectedTab - 1); if (i == -1) { JTextField msg = new JTextField("Please select a project."); msg.setEditable(false); frameworkConfigurationPanel.add(msg); } else { generateGUIGonfiguration(selectedProjectName); } this.add(right, BorderLayout.CENTER); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getRootPane().setDefaultButton(ok); this.setVisible(true); // this.setUndecorated(true); // GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this); }