private void selectModel(SubstitutionModel m) {
   manager.inputData.model = m;
   for (JMenuItem mi : modelButtons) {
     if (mi.getText().equals(m.getMenuName())) {
       mi.setSelected(true);
       break;
     }
   }
 }
 private String tryModels() {
   String message = "";
   try {
     SubstitutionModel[] defaultSubstList = {new Kimura3(), new Dayhoff()};
     for (SubstitutionModel model : defaultSubstList) {
       try {
         model.acceptable(manager.inputData.seqs);
         selectModel(model);
         break;
       } catch (RecognitionError e) {
       }
     }
     if (manager.inputData.model == null) {
       double max = 0.0;
       int wrong = 0;
       for (Class<? extends SubstitutionModel> cl : substModels) {
         SubstitutionModel m;
         try {
           m = cl.newInstance();
           if (m.acceptable(manager.inputData.seqs) > max) {
             manager.inputData.model = m;
             max = m.acceptable(manager.inputData.seqs);
             selectModel(m);
           }
         } catch (RecognitionError e) {
           wrong++;
           message += e.message;
         }
       }
     }
   } catch (Exception e) {
     JOptionPane.showMessageDialog(
         this,
         e.getLocalizedMessage(),
         "Error accessing substitution models",
         JOptionPane.ERROR_MESSAGE);
   }
   return message;
 }
  /**
   * An ActioListener is implemented, so we have to implement this function. It handles actions on
   * the menu bar.
   */
  @Override
  public void actionPerformed(ActionEvent ev) {
    if (ev.getActionCommand() == "Add sequence(s)...") {
      addSequences();
    } else if (ev.getActionCommand() == "Exit") {
      System.exit(0);
    } else if (ev.getActionCommand() == "Preferences...") {
      // System.out.println("here!!!");
      op = new OutputPreferences(this);
    } else if (ev.getActionCommand() == "Settings") {
      mcmcSettingsDlg.display(this);
    } else if (ev.getActionCommand() == "Set up and run") {
      if (manager.inputData.seqs.sequences.size() < 2) {
        JOptionPane.showMessageDialog(
            this,
            "At least two sequences are needed!!!",
            "Not enough sequences",
            JOptionPane.ERROR_MESSAGE);
        //    			manager.finished();
        return;
      }
      // disableAllButtons();
      mcmcSettingsDlg.display(this);
      // start();

    } else if (ev.getActionCommand() == "Pause") {
      pauseItem.setEnabled(false);
      pauseButton.setEnabled(false);

      resumeItem.setEnabled(true);
      resumeButton.setEnabled(true);
      setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      final String savTit = getTitle();
      setTitle("Pausing...");
      manager.thread.suspendSoft();
      setTitle(savTit);
      setCursor(Cursor.getDefaultCursor());
    } else if (ev.getActionCommand() == "Resume") {
      manager.thread.resumeSoft();
      pauseItem.setEnabled(true);
      pauseButton.setEnabled(true);
      resumeItem.setEnabled(false);
      resumeButton.setEnabled(false);
    } else if (ev.getActionCommand() == "Stop") {
      setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
      final String savTit = getTitle();
      setTitle("Stopping...");
      manager.thread.stopSoft();
      finished();
      setTitle(savTit);
      setCursor(Cursor.getDefaultCursor());
    } else if (ev.getActionCommand() == "RNA mode") {
      if (rnaButton.isSelected()) {
        dlg = new RNASettingsDlg(this);
        dlg.display(this);

        // manager.inputgui = input.inputgui;
        // manager.inputgui.updateSequences();
        // tab.addTab(input.getTabName(), input.getIcon(), input.getJPanel(), input.getTip());
        manager.inputgui = input.inputgui;
        manager.inputgui.updateSequences();
        // System.out.println("SELECTED!!!");

        manager.postProcMan.rnaMode = true;
        // manager.postProcMan.reload();

        int count = tab.getTabCount();
        for (Postprocess plugin : pluginTabs) {
          // System.out.println(plugin.getTabName() + ": " + plugin.screenable);
          if (plugin.rnaAssociated) {
            tabPluginMap.put(count, plugin);
            tab.addTab(plugin.getTabName(), plugin.getIcon(), plugin.getJPanel(), plugin.getTip());
            count++;
          }

          // manager.postProcMan.init();
        }

      } else {

        manager.postProcMan.rnaMode = false;
        // System.out.println("NOT SELECTED!!!");
        manager.inputgui = input.inputgui;
        manager.inputgui.updateSequences();

        int count = 0;
        for (Postprocess plugin : pluginTabs) {
          if (plugin.rnaAssociated) {
            tabPluginMap.remove(plugin);
            String removePlugin = tab.getTitleAt(count + 1);
            tab.remove(count + 1);
            count--;
          }

          count++;
        }
      }

    } else if (ev.getActionCommand() == "About...") {
      new HelpWindow(
          this, "About", getClass().getClassLoader().getResource("doc/about/index.html"), false);
    } else if (ev.getActionCommand() == "Html doc for developers") {
      new HelpWindow(
          this, "Html doc for Developers", ClassLoader.getSystemResource("doc/index.html"), true);
    } else if (ev.getActionCommand() == "Description of plugins") {
      new HelpWindow(
          this,
          "Description of plugins",
          ClassLoader.getSystemResource("doc/plugin_description/index.html"),
          true);

    } else if (ev.getActionCommand() == "Help for users") {
      helpUsers();
    } else { // new substitution model selected
      for (Class<? extends SubstitutionModel> cl : substModels) {
        try {
          if (ev.getActionCommand().equals(SubstitutionModel.getMenuName(cl))) {
            try {
              SubstitutionModel model = cl.newInstance();
              model.acceptable(manager.inputData.seqs);
              manager.inputData.model = model;
              break;
            } catch (RecognitionError e) {
              selectModel(manager.inputData.model);
              JOptionPane.showMessageDialog(
                  this, e.message, "Cannot apply this model...", JOptionPane.ERROR_MESSAGE);
              break;
            }
          }
        } catch (Exception e) {
          ErrorMessage.showPane(this, e, true);
        }
      }
    }
  }
  /** The only constructor of the class. It launches the main window. */
  @SuppressWarnings("unchecked")
  public MainFrame() throws Exception {
    super("StatAlign " + StatAlign.version);

    try {
      String syslook = UIManager.getSystemLookAndFeelClassName();
      if (!UIManager.getLookAndFeel().getClass().getName().equals(syslook)) {
        UIManager.setLookAndFeel(syslook);
        SwingUtilities.updateComponentTreeUI(this);
      }
    } catch (Exception ex) {
      JOptionPane.showMessageDialog(this, ex);
    }

    ArrayList<Class<?>> substModList = new ArrayList<Class<?>>();
    for (String model :
        Utils.classesInPackage(SubstitutionModel.class.getPackage().getName() + ".plugins")) {
      try {
        Class<?> cl = Class.forName(model);
        /* Only include non-abstract substitution models that extend SubstitutionModel */
        if (!Modifier.isAbstract(cl.getModifiers()) && SubstitutionModel.class.isAssignableFrom(cl))
          substModList.add(cl);
      } catch (Exception ex) {
      }
    }

    substModels =
        (Class<? extends SubstitutionModel>[])
            substModList.toArray(new Class<?>[substModList.size()]);
    manager = new MainManager(this);
    mcmcSettingsDlg = new McmcSettingsDlg(this);

    setMinimumSize(new Dimension(500, 250));

    ///
    /// Creates the MenuBar and the ToolBar
    ///

    toolBar = new JToolBar();
    toolBar.setFloatable(false);
    toolBar.setRollover(true);
    JMenuBar menubar = new JMenuBar();

    JMenu menu = new JMenu("File");
    menu.setMnemonic(KeyEvent.VK_F);
    JMenuItem item;

    String openText = "Add sequence(s)...";
    ImageIcon icon = new ImageIcon(ClassLoader.getSystemResource("icons/open.png"));
    openItem = createMenuItem(openText, true);
    openItem.setAccelerator(KeyStroke.getKeyStroke("control O"));
    openItem.setMnemonic(KeyEvent.VK_A);
    openItem.setIcon(icon);
    menu.add(openItem);

    openButton = createButton(icon, "Add sequence(s)...");
    toolBar.add(openButton);

    toolBar.addSeparator();

    JMenuItem ioPreferencesItem = createMenuItem("Preferences...", true);
    ioPreferencesItem.setAccelerator(KeyStroke.getKeyStroke("control 1"));
    ioPreferencesItem.setMnemonic(KeyEvent.VK_P);
    menu.add(ioPreferencesItem);

    menu.addSeparator();

    item = createMenuItem("Exit", true);
    item.setAccelerator(KeyStroke.getKeyStroke("alt F4"));
    item.setMnemonic(KeyEvent.VK_X);
    menu.add(item);
    menubar.add(menu);

    //		menu = new JMenu("Edit");
    //		menu.setMnemonic(KeyEvent.VK_E);
    //		item = new JMenuItem("Cut");
    //		item.addActionListener(this);
    //		item.setAccelerator(KeyStroke.getKeyStroke("control X"));
    //		menu.add(item);
    //		item = new JMenuItem("Copy");
    //		item.addActionListener(this);
    //		item.setAccelerator(KeyStroke.getKeyStroke("control C"));
    //		menu.add(item);
    //		item = new JMenuItem("Paste");
    //		item.addActionListener(this);
    //		item.setAccelerator(KeyStroke.getKeyStroke("control V"));
    //		menu.add(item);
    //		menubar.add(menu);

    menu = new JMenu("Analysis");
    menu.setMnemonic(KeyEvent.VK_M);

    //        item = createMenuItem("Settings", true);
    //        item.setAccelerator(KeyStroke.getKeyStroke("control M"));
    //        item.setMnemonic(KeyEvent.VK_S);
    //        menu.add(item);

    String runText = "Set up and run";
    icon = new ImageIcon(ClassLoader.getSystemResource("icons/play.png"));
    runItem = createMenuItem(runText, false);
    runItem.setAccelerator(KeyStroke.getKeyStroke("control ENTER"));
    runItem.setIcon(icon);
    menu.add(runItem);
    menu.addSeparator();

    runButton = createButton(icon, runText);
    runButton.setEnabled(false);
    toolBar.add(runButton);

    String pauseText = "Pause";
    icon = new ImageIcon(ClassLoader.getSystemResource("icons/pause.png"));
    pauseItem = createMenuItem("Pause", false);
    pauseItem.setIcon(icon);
    menu.add(pauseItem);

    pauseButton = createButton(icon, pauseText);
    pauseButton.setEnabled(false);
    toolBar.add(pauseButton);

    String resumeText = "Resume";
    icon = new ImageIcon(ClassLoader.getSystemResource("icons/resume.png"));
    resumeItem = createMenuItem(resumeText, false);
    resumeItem.setIcon(icon);
    menu.add(resumeItem);

    resumeButton = createButton(icon, resumeText);
    resumeButton.setEnabled(false);
    toolBar.add(resumeButton);

    String stopText = "Stop";
    icon = new ImageIcon(ClassLoader.getSystemResource("icons/stop.png"));
    stopItem = createMenuItem("Stop", false);
    stopItem.setIcon(icon);
    menu.add(stopItem);
    menubar.add(menu);

    stopButton = createButton(icon, stopText);
    stopButton.setEnabled(false);
    toolBar.add(stopButton);

    String rnaText = "RNA mode";
    rnaButton =
        createToggleButton(new ImageIcon(ClassLoader.getSystemResource("icons/rna1.png")), rnaText);
    rnaButton.setEnabled(false);
    rnaButton.setSelected(false);
    toolBar.add(rnaButton);

    //        String settingsText = "Settings";
    //        JButton settingsButton = createButton(new ImageIcon(ClassLoader.
    //        		getSystemResource("icons/settings.png")), settingsText);
    //        toolBar.add(settingsButton);

    menu = new JMenu("Model");
    menu.setMnemonic(KeyEvent.VK_L);

    modelButtons = new JMenuItem[substModels.length];
    ButtonGroup modelGroup = new ButtonGroup();
    HashMap<String, ArrayList<Class<? extends SubstitutionModel>>> substModTypes =
        new HashMap<String, ArrayList<Class<? extends SubstitutionModel>>>();
    for (Class<? extends SubstitutionModel> cl : substModels) {
      String type = SubstitutionModel.getType(cl);
      ArrayList<Class<? extends SubstitutionModel>> arr = substModTypes.get(type);
      if (arr == null)
        substModTypes.put(type, arr = new ArrayList<Class<? extends SubstitutionModel>>());
      arr.add(cl);
    }
    String[] typeArr = new String[substModTypes.keySet().size()];
    int s = 0;
    if (typeArr.length >= 2) {
      typeArr[0] = "protein"; // amino acid subst models first
      typeArr[1] = "nucleotide"; // then nucleotide models, then the rest
      s = 2;
    }
    for (String type : substModTypes.keySet()) {
      if (!type.equals("protein") && !type.equals("nucleotide")) typeArr[s++] = type;
    }
    s = 0;
    for (String type : typeArr) {
      if (s > 0) menu.addSeparator();
      for (Class<? extends SubstitutionModel> cl : substModTypes.get(type)) {
        String name = SubstitutionModel.getMenuName(cl);
        item = new JRadioButtonMenuItem(name);
        item.addActionListener(this);
        modelButtons[s++] = item;
        modelGroup.add(item);
        menu.add(item);
      }
    }
    modelGroup.clearSelection();
    menubar.add(menu);

    /*menu = new JMenu("View");
    menu.setMnemonic(KeyEvent.VK_V);
    JMenuItem zoomInItem = new JMenuItem("Zoom in");
    zoomInItem.setEnabled(false);
    zoomInItem.addActionListener(this);
    menu.add(zoomInItem);
    JMenuItem zoomOutItem = new JMenuItem("Zoom out");
    zoomOutItem.setEnabled(false);
    zoomOutItem.addActionListener(this);
    menu.add(zoomOutItem);
    JMenuItem autofitItem = new JMenuItem("Fit to frame");
    autofitItem.setEnabled(false);
    autofitItem.addActionListener(this);
    menu.add(autofitItem);

    menubar.add(menu);*/

    menu = new JMenu("Help");
    menu.setMnemonic(KeyEvent.VK_H);
    item = new JMenuItem("About...");
    item.addActionListener(this);
    menu.add(item);
    menu.addSeparator();
    item = new JMenuItem("Help for users");
    item.addActionListener(this);
    menu.add(item);
    menu.addSeparator();
    item = new JMenuItem("Html doc for developers");
    item.addActionListener(this);
    menu.add(item);
    item = new JMenuItem("Description of plugins");
    item.addActionListener(this);
    menu.add(item);

    menubar.add(menu);

    setJMenuBar(menubar);
    add(toolBar, BorderLayout.PAGE_START);

    ///
    /// Creates the main panel
    ///

    Container cp = getContentPane();
    JPanel mainPanel = new JPanel(new BorderLayout());
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    mainPanel.setMinimumSize(new Dimension(screenSize.width / 3, screenSize.height / 3));
    mainPanel.setMaximumSize(new Dimension(screenSize.width, screenSize.height));
    mainPanel.setPreferredSize(new Dimension(screenSize.width / 2, screenSize.height / 2));

    tab = new JTabbedPane();

    input = new Input(manager);
    tab.addTab(input.getTabName(), input.getIcon(), input.getJPanel(), input.getTip());
    manager.inputgui = input.inputgui;

    // Sorts the tab according to their getTabOrder()
    pluginTabs = manager.postProcMan.plugins.clone();
    Arrays.sort(
        pluginTabs,
        new Comparator<Postprocess>() {
          @Override
          public int compare(Postprocess firstTab, Postprocess secondTab) {
            return Double.compare(firstTab.getTabOrder(), secondTab.getTabOrder());
          }
        });

    tabPluginMap = new HashMap<Integer, Postprocess>();
    for (int i = 0; i < pluginTabs.length; i++) {
      Postprocess plugin = pluginTabs[i];
      if (plugin.selected && !plugin.rnaAssociated) {
        tabPluginMap.put(i + 1, plugin); // TODO: Jesus Java, horrible.
        tab.addTab(plugin.getTabName(), plugin.getIcon(), plugin.getJPanel(), plugin.getTip());
      }
    }

    tab.addChangeListener(
        new ChangeListener() {
          @Override
          public void stateChanged(ChangeEvent changeEvent) {
            JTabbedPane pane = (JTabbedPane) changeEvent.getSource();
            Integer i = pane.getSelectedIndex();

            // Remove the last tabs toolbar items.
            if (lastSelectedTabIndex != -1) {
              Postprocess lastPlugin = tabPluginMap.get(lastSelectedTabIndex);
              if (lastPlugin != null && lastPlugin.hasToolBar) {
                for (JComponent item : lastPlugin.getToolBarItems()) {
                  toolBar.remove(item);
                }
                toolBar.revalidate(); // TODO: optimize.
                toolBar.repaint();
              }
            }

            // Add the currents tab toolbar items.
            Postprocess plugin = tabPluginMap.get(i);
            if (plugin != null && plugin.hasToolBar) {
              for (JComponent item : plugin.getToolBarItems()) {
                toolBar.add(item);
              }
              toolBar.revalidate();
              toolBar.repaint();
            }
            lastSelectedTabIndex = i;
          }
        });

    mainPanel.add(tab, BorderLayout.CENTER);

    cp.add(mainPanel, BorderLayout.CENTER);
    JPanel statusBar = new JPanel(new BorderLayout());
    statusText = new JLabel(IDLE_STATUS_MESSAGE);
    statusBar.add(statusText, BorderLayout.CENTER);
    cp.add(statusBar, BorderLayout.SOUTH);

    //		setSize(300, 200);
    //		setLocationByPlatform(true);
    //    	setLocation(screenSize.width/4,screenSize.height/4);
    pack();
    setBounds(
        screenSize.width / 5 - 15,
        screenSize.height / 5 - 15,
        screenSize.width * 3 / 5 + 30,
        screenSize.height * 3 / 5 + 30);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
  }