/** Initializes the panel */
  public void init() {

    if (!initialized) {
      setLayout(new GridBagLayout());

      // configuration table
      configurationTable.init();
      configurationTable.setName(NAME_CONFIGURATION_TABLE);
      configurationTable.setCache(configurationTable.getSelectionBackground());
      JScrollPane scrollPane = new JScrollPane(configurationTable);

      GridBagConstraints c = new GridBagConstraints();
      c.gridx = 0;
      c.gridy = 0;
      add(scrollPane, c);

      // editor panel
      createEditorPanel();
      c.gridx = 0;
      c.gridy = 1;
      c.anchor = GridBagConstraints.WEST;
      add(editorPanel, c);

      initialized = true;
    }
  }
  /**
   * Gets all GUI automations
   *
   * @return An array with all GUI automations
   */
  public GUIAutomation[] getGUIAutomations() {

    TableModel model = configurationTable.getModel();
    int numberOfConfigurations = model.getRowCount();
    GUIAutomation[] guiAutomations = new GUIAutomation[numberOfConfigurations];

    // stop open edits
    if (configurationTable.isEditing()) {
      configurationTable.getCellEditor().stopCellEditing();
    }

    // build GUI automation objects
    for (int i = 0; i < numberOfConfigurations; i++) {

      ScaleableImageIcon image =
          (ScaleableImageIcon) model.getValueAt(i, ConfigurationTableModel.COLUMN_INDEX_IMAGE);

      // check for valid image
      String imagePath = null;
      if (image != null) {
        imagePath = image.getPath();
      }

      String type = (String) model.getValueAt(i, ConfigurationTableModel.COLUMN_INDEX_TYPE);
      String trigger = (String) model.getValueAt(i, ConfigurationTableModel.COLUMN_INDEX_TRIGGER);
      String midiSignature =
          (String) model.getValueAt(i, ConfigurationTableModel.COLUMN_INDEX_MIDI_SIGNATURE);
      long delay = (long) model.getValueAt(i, ConfigurationTableModel.COLUMN_INDEX_MIN_DELAY);
      float minSimilarity =
          (float) model.getValueAt(i, ConfigurationTableModel.COLUMN_INDEX_MIN_SIMILARITY);
      boolean isMovable =
          (boolean) model.getValueAt(i, ConfigurationTableModel.COLUMN_INDEX_MOVABLE);

      GUIAutomation guiAutomation =
          new GUIAutomation(
              imagePath, type, trigger, delay, midiSignature, minSimilarity, isMovable);
      guiAutomations[i] = guiAutomation;
    }

    return guiAutomations;
  }
 /**
  * Gets the popup menu
  *
  * @return The popup menu
  */
 public MidiLearnPopupMenu getPopupMenu() {
   return configurationTable.getPopupMenu();
 }