Esempio n. 1
0
  /**
   * 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;
    }
  }
Esempio n. 2
0
 /**
  * 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.");
   }
 }
Esempio n. 3
0
 /**
  * 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;
 }
Esempio n. 4
0
 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);
   }
 }
Esempio n. 5
0
 /** 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());
   }
 }
Esempio n. 6
0
 /**
  * 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;
 }
Esempio n. 7
0
 /**
  * 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);
   }
 }
Esempio n. 8
0
 /**
  * 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);
   }
 }
Esempio n. 9
0
  /* (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();
    }
  }
Esempio n. 10
0
  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
  }
Esempio n. 11
0
  /**
   * 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();
  }
Esempio n. 12
0
  /**
   * 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);
  }