public void actionPerformed(ActionEvent e) {
   progressBar.progress.setValue(LocalConfig.getInstance().getProgress());
   progressBar.progress.repaint();
   if (LocalConfig.getInstance().getProgress() == 100) {
     progressBar.setVisible(false);
     progressBar.dispose();
   }
 }
 @Override
 protected Void doInBackground() throws Exception {
   int progress = 0;
   TextReactionsModelReader reader = new TextReactionsModelReader();
   reader.load(
       GraphicalInterface.getReactionsCSVFile(), LocalConfig.getInstance().getDatabaseName());
   while (progress < 100) {
     try {
       Thread.sleep(1000);
     } catch (InterruptedException ignore) {
     }
   }
   t.stop();
   return null;
 }
  public void write(String file, String databaseName) {
    String queryString = "jdbc:sqlite:" + databaseName + ".db";
    try {
      Class.forName("org.sqlite.JDBC");
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    try {
      Connection conn = DriverManager.getConnection(queryString);
      // String extension = ".csv";
      CSVWriter writer;
      try {
        writer = new CSVWriter(new FileWriter(file), GraphicalInterface.getSplitCharacter());

        String headerNames = "";
        // start with 1 to avoid reading database id
        for (int i = 1; i < GraphicalInterfaceConstants.REACTIONS_COLUMN_NAMES.length; i++) {
          headerNames += GraphicalInterfaceConstants.REACTIONS_COLUMN_NAMES[i] + "#";
        }

        ReactionsMetaColumnManager reactionsMetaColumnManager = new ReactionsMetaColumnManager();

        int metaColumnCount =
            reactionsMetaColumnManager.getMetaColumnCount(
                LocalConfig.getInstance().getDatabaseName());
        for (int j = 1; j < metaColumnCount + 1; j++) {
          headerNames +=
              reactionsMetaColumnManager.getColumnName(
                      LocalConfig.getInstance().getDatabaseName(), j)
                  + "#";
        }

        String[] header = (headerNames.substring(0, headerNames.length() - 1)).split("#");

        writer.writeNext(header);
        int numReactions = GraphicalInterface.reactionsTable.getModel().getRowCount();
        for (int n = 0; n < numReactions; n++) {
          int viewRow = GraphicalInterface.reactionsTable.convertRowIndexToModel(n);

          String knockout = "false";
          String fluxValue = "0.0";
          String reactionAbbreviation = " ";
          String reactionName = " ";
          String reactionString = " ";
          String reversible = " ";
          String lowerBound = "-999999";
          String upperBound = "999999";
          String objective = "0.0";
          String meta1 = " ";
          String meta2 = " ";
          String meta3 = " ";
          String meta4 = " ";
          String meta5 = " ";
          String meta6 = " ";
          String meta7 = " ";
          String meta8 = " ";
          String meta9 = " ";
          String meta10 = " ";
          String meta11 = " ";
          String meta12 = " ";
          String meta13 = " ";
          String meta14 = " ";
          String meta15 = " ";

          // check if null before toString() to avoid null pointer error
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.KO_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.KO_COLUMN)
                    .toString()
                    .length()
                > 0) {
              knockout =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(viewRow, GraphicalInterfaceConstants.KO_COLUMN);
            } else {
              knockout = "false";
            }
          }
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.FLUX_VALUE_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.FLUX_VALUE_COLUMN)
                    .toString()
                    .length()
                > 0) {
              fluxValue =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(viewRow, GraphicalInterfaceConstants.FLUX_VALUE_COLUMN);
            } else {
              fluxValue = "0.0";
            }
          }
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_ABBREVIATION_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_ABBREVIATION_COLUMN)
                    .toString()
                    .length()
                > 0) {
              reactionAbbreviation =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(
                              viewRow, GraphicalInterfaceConstants.REACTION_ABBREVIATION_COLUMN);
            } else {
              reactionAbbreviation = " ";
            }
          }
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_NAME_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_NAME_COLUMN)
                    .toString()
                    .length()
                > 0) {
              reactionName =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_NAME_COLUMN);
            } else {
              reactionName = " ";
            }
          }
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_STRING_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_STRING_COLUMN)
                    .toString()
                    .length()
                > 0) {
              reactionString =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_STRING_COLUMN);
            } else {
              reactionString = " ";
            }
          }
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.REVERSIBLE_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REVERSIBLE_COLUMN)
                    .toString()
                    .length()
                > 0) {
              reversible =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(viewRow, GraphicalInterfaceConstants.REVERSIBLE_COLUMN);
            } else {
              reversible = " ";
            }
          }
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.LOWER_BOUND_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.LOWER_BOUND_COLUMN)
                    .toString()
                    .length()
                > 0) {
              lowerBound =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(viewRow, GraphicalInterfaceConstants.LOWER_BOUND_COLUMN);
            } else {
              lowerBound = "-999999";
            }
          }
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.UPPER_BOUND_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.UPPER_BOUND_COLUMN)
                    .toString()
                    .length()
                > 0) {
              upperBound =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(viewRow, GraphicalInterfaceConstants.UPPER_BOUND_COLUMN);
            } else {
              upperBound = "999999";
            }
          }
          if (GraphicalInterface.reactionsTable
                  .getModel()
                  .getValueAt(viewRow, GraphicalInterfaceConstants.BIOLOGICAL_OBJECTIVE_COLUMN)
              != null) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.BIOLOGICAL_OBJECTIVE_COLUMN)
                    .toString()
                    .length()
                > 0) {
              objective =
                  (String)
                      GraphicalInterface.reactionsTable
                          .getModel()
                          .getValueAt(
                              viewRow, GraphicalInterfaceConstants.BIOLOGICAL_OBJECTIVE_COLUMN);
            } else {
              objective = "0.0";
            }
          }

          String metaString = "";
          if (metaColumnCount > 0) {
            // check if null before toString() to avoid null pointer error
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META1_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META1_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta1 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META1_COLUMN);
              }
            }
            metaString += meta1 + "#";
          }
          if (metaColumnCount > 1) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META2_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META2_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta2 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META2_COLUMN);
              }
            }
            metaString += meta2 + "#";
          }
          if (metaColumnCount > 2) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META3_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META3_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta3 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META3_COLUMN);
              }
            }
            metaString += meta3 + "#";
          }
          if (metaColumnCount > 3) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META4_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META4_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta4 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META4_COLUMN);
              }
            }
            metaString += meta4 + "#";
          }
          if (metaColumnCount > 4) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META5_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META5_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta5 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META5_COLUMN);
              }
            }
            metaString += meta5 + "#";
          }
          if (metaColumnCount > 5) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META6_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META6_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta6 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META6_COLUMN);
              }
            }
            metaString += meta6 + "#";
          }
          if (metaColumnCount > 6) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META7_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META7_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta7 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META7_COLUMN);
              }
            }
            metaString += meta7 + "#";
          }
          if (metaColumnCount > 7) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META8_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META8_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta8 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META8_COLUMN);
              }
            }
            metaString += meta8 + "#";
          }
          if (metaColumnCount > 8) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META9_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META9_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta9 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META9_COLUMN);
              }
            }
            metaString += meta9 + "#";
          }
          if (metaColumnCount > 9) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META10_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META10_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta10 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(
                                viewRow, GraphicalInterfaceConstants.REACTION_META10_COLUMN);
              }
            }
            metaString += meta10 + "#";
          }
          if (metaColumnCount > 10) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META11_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META11_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta11 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(
                                viewRow, GraphicalInterfaceConstants.REACTION_META11_COLUMN);
              }
            }
            metaString += meta11 + "#";
          }
          if (metaColumnCount > 11) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META12_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META12_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta12 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(
                                viewRow, GraphicalInterfaceConstants.REACTION_META12_COLUMN);
              }
            }
            metaString += meta12 + "#";
          }
          if (metaColumnCount > 12) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META13_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META13_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta13 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(
                                viewRow, GraphicalInterfaceConstants.REACTION_META13_COLUMN);
              }
            }
            metaString += meta13 + "#";
          }
          if (metaColumnCount > 13) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META14_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META14_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta14 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(
                                viewRow, GraphicalInterfaceConstants.REACTION_META14_COLUMN);
              }
            }
            metaString += meta14 + "#";
          }
          if (metaColumnCount > 14) {
            if (GraphicalInterface.reactionsTable
                    .getModel()
                    .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META15_COLUMN)
                != null) {
              if (GraphicalInterface.reactionsTable
                      .getModel()
                      .getValueAt(viewRow, GraphicalInterfaceConstants.REACTION_META15_COLUMN)
                      .toString()
                      .length()
                  > 0) {
                meta15 =
                    (String)
                        GraphicalInterface.reactionsTable
                            .getModel()
                            .getValueAt(
                                viewRow, GraphicalInterfaceConstants.REACTION_META15_COLUMN);
              }
            }
            metaString += meta15 + "#";
          }

          if (metaString.length() > 0) {
            String[] entries =
                (knockout
                        + "#"
                        + fluxValue
                        + "#"
                        + reactionAbbreviation
                        + "#"
                        + reactionName
                        + "#"
                        + reactionString
                        + "#"
                        + reversible
                        + "#"
                        + lowerBound
                        + "#"
                        + upperBound
                        + "#"
                        + objective
                        + "#"
                        + metaString.substring(0, metaString.length() - 1))
                    .split("#");
            writer.writeNext(entries);
          } else {
            String[] entries =
                (knockout
                        + "#"
                        + fluxValue
                        + "#"
                        + reactionAbbreviation
                        + "#"
                        + reactionName
                        + "#"
                        + reactionString
                        + "#"
                        + reversible
                        + "#"
                        + lowerBound
                        + "#"
                        + upperBound
                        + "#"
                        + objective)
                    .split("#");
            writer.writeNext(entries);
          }
        }
        writer.close();
        conn.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  public ReactionColumnNameInterface(final Connection con, ArrayList<String> columnNamesFromFile)
      throws SQLException {

    final ArrayList<Image> icons = new ArrayList<Image>();
    icons.add(new ImageIcon("etc/most16.jpg").getImage());
    icons.add(new ImageIcon("etc/most32.jpg").getImage());

    LocalConfig.getInstance().setProgress(0);
    progressBar.pack();
    progressBar.setIconImages(icons);
    progressBar.setSize(200, 70);
    progressBar.setTitle("Loading...");
    progressBar.setVisible(false);

    setColumnNamesFromFile(columnNamesFromFile);

    setTitle(ColumnInterfaceConstants.REACTIONS_COLUMN_NAME_INTERFACE_TITLE);
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

    cbKnockout.setEditable(true);
    cbFluxValue.setEditable(true);
    cbReactionAbbreviation.setEditable(true);
    cbReactionName.setEditable(true);
    cbReactionEquation.setEditable(true);
    cbReversible.setEditable(true);
    cbLowerBound.setEditable(true);
    cbUpperBound.setEditable(true);
    cbObjective.setEditable(true);

    cbKnockout.setPreferredSize(new Dimension(250, 30));
    cbKnockout.setMaximumSize(new Dimension(250, 30));
    cbKnockout.setMinimumSize(new Dimension(250, 30));

    cbFluxValue.setPreferredSize(new Dimension(250, 30));
    cbFluxValue.setMaximumSize(new Dimension(250, 30));
    cbFluxValue.setMinimumSize(new Dimension(250, 30));

    cbReactionAbbreviation.setPreferredSize(new Dimension(250, 30));
    cbReactionAbbreviation.setMaximumSize(new Dimension(250, 30));
    cbReactionAbbreviation.setMinimumSize(new Dimension(250, 30));

    cbReactionName.setPreferredSize(new Dimension(250, 30));
    cbReactionName.setMaximumSize(new Dimension(250, 30));
    cbReactionName.setMinimumSize(new Dimension(250, 30));

    cbReactionEquation.setPreferredSize(new Dimension(250, 30));
    cbReactionEquation.setMaximumSize(new Dimension(250, 30));
    cbReactionEquation.setMinimumSize(new Dimension(250, 30));

    cbReversible.setPreferredSize(new Dimension(250, 30));
    cbReversible.setMaximumSize(new Dimension(250, 30));
    cbReversible.setMinimumSize(new Dimension(250, 30));

    cbLowerBound.setPreferredSize(new Dimension(250, 30));
    cbLowerBound.setMaximumSize(new Dimension(250, 30));
    cbLowerBound.setMinimumSize(new Dimension(250, 30));

    cbUpperBound.setPreferredSize(new Dimension(250, 30));
    cbUpperBound.setMaximumSize(new Dimension(250, 30));
    cbUpperBound.setMinimumSize(new Dimension(250, 30));

    cbObjective.setPreferredSize(new Dimension(250, 30));
    cbObjective.setMaximumSize(new Dimension(250, 30));
    cbObjective.setMinimumSize(new Dimension(250, 30));

    JTextField fieldKnockout = (JTextField) cbKnockout.getEditor().getEditorComponent();
    fieldKnockout.addKeyListener(new ComboKeyHandler(cbKnockout));

    JTextField fieldFluxValue = (JTextField) cbFluxValue.getEditor().getEditorComponent();
    fieldFluxValue.addKeyListener(new ComboKeyHandler(cbFluxValue));

    JTextField fieldReactionAbbreviation =
        (JTextField) cbReactionAbbreviation.getEditor().getEditorComponent();
    fieldReactionAbbreviation.addKeyListener(new ComboKeyHandler(cbReactionAbbreviation));

    JTextField fieldReactionName = (JTextField) cbReactionName.getEditor().getEditorComponent();
    fieldReactionName.addKeyListener(new ComboKeyHandler(cbReactionName));

    JTextField fieldReactionEquation =
        (JTextField) cbReactionEquation.getEditor().getEditorComponent();
    fieldReactionEquation.addKeyListener(new ComboKeyHandler(cbReactionEquation));

    JTextField fieldReversible = (JTextField) cbReversible.getEditor().getEditorComponent();
    fieldReversible.addKeyListener(new ComboKeyHandler(cbReversible));

    JTextField fieldLowerBound = (JTextField) cbLowerBound.getEditor().getEditorComponent();
    fieldLowerBound.addKeyListener(new ComboKeyHandler(cbLowerBound));

    JTextField fieldUpperBound = (JTextField) cbUpperBound.getEditor().getEditorComponent();
    fieldUpperBound.addKeyListener(new ComboKeyHandler(cbUpperBound));

    JTextField fieldObjective = (JTextField) cbObjective.getEditor().getEditorComponent();
    fieldObjective.addKeyListener(new ComboKeyHandler(cbObjective));

    populateNamesFromFileBoxes(columnNamesFromFile);

    // box layout
    Box vb = Box.createVerticalBox();

    Box hbLabels = Box.createHorizontalBox();
    Box hb1 = Box.createHorizontalBox();
    Box hb2 = Box.createHorizontalBox();
    Box hb3 = Box.createHorizontalBox();
    Box hb4 = Box.createHorizontalBox();
    Box hb5 = Box.createHorizontalBox();
    Box hb6 = Box.createHorizontalBox();
    Box hb7 = Box.createHorizontalBox();
    Box hb8 = Box.createHorizontalBox();
    Box hb9 = Box.createHorizontalBox();
    Box hbTop = Box.createHorizontalBox();
    Box hbKnockoutLabel = Box.createHorizontalBox();
    Box hbKnockout = Box.createHorizontalBox();
    Box hbFluxValueLabel = Box.createHorizontalBox();
    Box hbFluxValue = Box.createHorizontalBox();
    Box hbReactionAbbreviationLabel = Box.createHorizontalBox();
    Box hbReactionAbbreviation = Box.createHorizontalBox();
    Box hbReactionNameLabel = Box.createHorizontalBox();
    Box hbReactionName = Box.createHorizontalBox();
    Box hbReactionEquationLabel = Box.createHorizontalBox();
    Box hbReactionEquation = Box.createHorizontalBox();
    Box hbReversibleLabel = Box.createHorizontalBox();
    Box hbReversible = Box.createHorizontalBox();
    Box hbLowerBoundLabel = Box.createHorizontalBox();
    Box hbLowerBound = Box.createHorizontalBox();
    Box hbUpperBoundLabel = Box.createHorizontalBox();
    Box hbUpperBound = Box.createHorizontalBox();
    Box hbObjectiveLabel = Box.createHorizontalBox();
    Box hbObjective = Box.createHorizontalBox();

    Box hbButton = Box.createHorizontalBox();

    // top label
    JLabel topLabel = new JLabel();
    topLabel.setText(ColumnInterfaceConstants.REACTIONS_TOP_LABEL);
    topLabel.setSize(new Dimension(300, 30));
    // top, left, bottom. right
    topLabel.setBorder(BorderFactory.createEmptyBorder(20, 30, 20, 200));
    topLabel.setAlignmentX(LEFT_ALIGNMENT);

    hbTop.add(topLabel);
    hbTop.setAlignmentX(LEFT_ALIGNMENT);

    hbLabels.add(hbTop);

    // knockout Label and combo
    JLabel knockoutLabel = new JLabel();
    knockoutLabel.setText(ColumnInterfaceConstants.KO_LABEL);
    knockoutLabel.setSize(new Dimension(300, 20));
    knockoutLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 80));
    knockoutLabel.setAlignmentX(LEFT_ALIGNMENT);
    // knockoutLabel.setAlignmentY(TOP_ALIGNMENT);

    JPanel panelKnockoutLabel = new JPanel();
    panelKnockoutLabel.setLayout(new BoxLayout(panelKnockoutLabel, BoxLayout.X_AXIS));
    panelKnockoutLabel.add(knockoutLabel);
    panelKnockoutLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbKnockoutLabel.add(panelKnockoutLabel);
    hbKnockoutLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelKnockout = new JPanel();
    panelKnockout.setLayout(new BoxLayout(panelKnockout, BoxLayout.X_AXIS));
    panelKnockout.add(cbKnockout);
    panelKnockout.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelKnockout.setAlignmentX(RIGHT_ALIGNMENT);

    hbKnockout.add(panelKnockout);
    hbKnockout.setAlignmentX(RIGHT_ALIGNMENT);

    hb1.add(hbKnockoutLabel);
    hb1.add(hbKnockout);

    // flux value label and combo
    JLabel fluxValueLabel = new JLabel();
    fluxValueLabel.setText(ColumnInterfaceConstants.FLUX_VALUE_LABEL);
    fluxValueLabel.setSize(new Dimension(300, 20));
    fluxValueLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 80));
    fluxValueLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelFluxValueLabel = new JPanel();
    panelFluxValueLabel.setLayout(new BoxLayout(panelFluxValueLabel, BoxLayout.X_AXIS));
    panelFluxValueLabel.add(fluxValueLabel);
    panelFluxValueLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbFluxValueLabel.add(panelFluxValueLabel);
    hbFluxValueLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelFluxValue = new JPanel();
    panelFluxValue.setLayout(new BoxLayout(panelFluxValue, BoxLayout.X_AXIS));
    panelFluxValue.add(cbFluxValue);
    panelFluxValue.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelFluxValue.setAlignmentX(RIGHT_ALIGNMENT);

    hbFluxValue.add(panelFluxValue);
    hbFluxValue.setAlignmentX(RIGHT_ALIGNMENT);

    hb2.add(hbFluxValueLabel);
    hb2.add(hbFluxValue);

    // reaction abbreviation label and combo
    JLabel reactionAbbreviationLabel = new JLabel();
    reactionAbbreviationLabel.setText(ColumnInterfaceConstants.REACTION_ABBREVIATION_LABEL);
    reactionAbbreviationLabel.setSize(new Dimension(300, 20));
    reactionAbbreviationLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 80));
    reactionAbbreviationLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelReactionAbbreviationLabel = new JPanel();
    panelReactionAbbreviationLabel.setLayout(
        new BoxLayout(panelReactionAbbreviationLabel, BoxLayout.X_AXIS));
    panelReactionAbbreviationLabel.add(reactionAbbreviationLabel);
    panelReactionAbbreviationLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbReactionAbbreviationLabel.add(panelReactionAbbreviationLabel);
    hbReactionAbbreviationLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelReactionAbbreviation = new JPanel();
    panelReactionAbbreviation.setLayout(new BoxLayout(panelReactionAbbreviation, BoxLayout.X_AXIS));
    panelReactionAbbreviation.add(cbReactionAbbreviation);
    panelReactionAbbreviation.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelReactionAbbreviation.setAlignmentX(RIGHT_ALIGNMENT);

    hbReactionAbbreviation.add(panelReactionAbbreviation);
    hbReactionAbbreviation.setAlignmentX(RIGHT_ALIGNMENT);

    hb3.add(hbReactionAbbreviationLabel);
    hb3.add(hbReactionAbbreviation);

    // reaction name label and combo
    JLabel reactionNameLabel = new JLabel();
    reactionNameLabel.setText(ColumnInterfaceConstants.REACTION_NAME_LABEL);
    reactionNameLabel.setSize(new Dimension(300, 20));
    reactionNameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 80));
    reactionNameLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelReactionNameLabel = new JPanel();
    panelReactionNameLabel.setLayout(new BoxLayout(panelReactionNameLabel, BoxLayout.X_AXIS));
    panelReactionNameLabel.add(reactionNameLabel);
    panelReactionNameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbReactionNameLabel.add(panelReactionNameLabel);
    hbReactionNameLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelReactionName = new JPanel();
    panelReactionName.setLayout(new BoxLayout(panelReactionName, BoxLayout.X_AXIS));
    panelReactionName.add(cbReactionName);
    panelReactionName.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelReactionName.setAlignmentX(RIGHT_ALIGNMENT);

    hbReactionName.add(panelReactionName);
    hbReactionName.setAlignmentX(RIGHT_ALIGNMENT);

    hb4.add(hbReactionNameLabel);
    hb4.add(hbReactionName);

    // reaction equation label and combo
    JLabel reactionEquationLabel = new JLabel();
    reactionEquationLabel.setText(ColumnInterfaceConstants.REACTION_EQUATION_LABEL);
    reactionEquationLabel.setSize(new Dimension(300, 20));
    reactionEquationLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 80));
    reactionEquationLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelReactionEquationLabel = new JPanel();
    panelReactionEquationLabel.setLayout(
        new BoxLayout(panelReactionEquationLabel, BoxLayout.X_AXIS));
    panelReactionEquationLabel.add(reactionEquationLabel);
    panelReactionEquationLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbReactionEquationLabel.add(panelReactionEquationLabel);
    hbReactionEquationLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelReactionEquation = new JPanel();
    panelReactionEquation.setLayout(new BoxLayout(panelReactionEquation, BoxLayout.X_AXIS));
    panelReactionEquation.add(cbReactionEquation);
    panelReactionEquation.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelReactionEquation.setAlignmentX(RIGHT_ALIGNMENT);

    hbReactionEquation.add(panelReactionEquation);
    hbReactionEquation.setAlignmentX(RIGHT_ALIGNMENT);

    hb5.add(hbReactionEquationLabel);
    hb5.add(hbReactionEquation);

    // reversible label and combo
    JLabel reversibleLabel = new JLabel();
    reversibleLabel.setText(ColumnInterfaceConstants.REVERSIBLE_LABEL);
    reversibleLabel.setSize(new Dimension(300, 20));
    reversibleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 80));
    reversibleLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelReversibleLabel = new JPanel();
    panelReversibleLabel.setLayout(new BoxLayout(panelReversibleLabel, BoxLayout.X_AXIS));
    panelReversibleLabel.add(reversibleLabel);
    panelReversibleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbReversibleLabel.add(panelReversibleLabel);
    hbReversibleLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelReversible = new JPanel();
    panelReversible.setLayout(new BoxLayout(panelReversible, BoxLayout.X_AXIS));
    panelReversible.add(cbReversible);
    panelReversible.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelReversible.setAlignmentX(RIGHT_ALIGNMENT);

    hbReversible.add(panelReversible);
    hbReversible.setAlignmentX(RIGHT_ALIGNMENT);

    hb6.add(hbReversibleLabel);
    hb6.add(hbReversible);

    // lower bound label and combo
    JLabel lowerBoundLabel = new JLabel();
    lowerBoundLabel.setText(ColumnInterfaceConstants.LOWER_BOUND_LABEL);
    lowerBoundLabel.setSize(new Dimension(300, 20));
    lowerBoundLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 80));
    lowerBoundLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelLowerBoundLabel = new JPanel();
    panelLowerBoundLabel.setLayout(new BoxLayout(panelLowerBoundLabel, BoxLayout.X_AXIS));
    panelLowerBoundLabel.add(lowerBoundLabel);
    panelLowerBoundLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbLowerBoundLabel.add(panelLowerBoundLabel);
    hbLowerBoundLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelLowerBound = new JPanel();
    panelLowerBound.setLayout(new BoxLayout(panelLowerBound, BoxLayout.X_AXIS));
    panelLowerBound.add(cbLowerBound);
    panelLowerBound.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelLowerBound.setAlignmentX(RIGHT_ALIGNMENT);

    hbLowerBound.add(panelLowerBound);
    hbLowerBound.setAlignmentX(RIGHT_ALIGNMENT);

    hb7.add(hbLowerBoundLabel);
    hb7.add(hbLowerBound);

    // upper bound label and combo
    JLabel upperBoundLabel = new JLabel();
    upperBoundLabel.setText(ColumnInterfaceConstants.UPPER_BOUND_LABEL);
    upperBoundLabel.setSize(new Dimension(300, 20));
    upperBoundLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 80));
    upperBoundLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelUpperBoundLabel = new JPanel();
    panelUpperBoundLabel.setLayout(new BoxLayout(panelUpperBoundLabel, BoxLayout.X_AXIS));
    panelUpperBoundLabel.add(upperBoundLabel);
    panelUpperBoundLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbUpperBoundLabel.add(panelUpperBoundLabel);
    hbUpperBoundLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelUpperBound = new JPanel();
    panelUpperBound.setLayout(new BoxLayout(panelUpperBound, BoxLayout.X_AXIS));
    panelUpperBound.add(cbUpperBound);
    panelUpperBound.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelUpperBound.setAlignmentX(RIGHT_ALIGNMENT);

    hbUpperBound.add(panelUpperBound);
    hbUpperBound.setAlignmentX(RIGHT_ALIGNMENT);

    hb8.add(hbUpperBoundLabel);
    hb8.add(hbUpperBound);

    // objective label and combo
    JLabel objectiveLabel = new JLabel();
    objectiveLabel.setText(ColumnInterfaceConstants.BIOLOGICAL_OBJECTIVE_LABEL);
    objectiveLabel.setSize(new Dimension(300, 20));
    objectiveLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 80));
    objectiveLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelObjectiveLabel = new JPanel();
    panelObjectiveLabel.setLayout(new BoxLayout(panelObjectiveLabel, BoxLayout.X_AXIS));
    panelObjectiveLabel.add(objectiveLabel);
    panelObjectiveLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));

    hbObjectiveLabel.add(panelObjectiveLabel);
    hbObjectiveLabel.setAlignmentX(LEFT_ALIGNMENT);

    JPanel panelObjective = new JPanel();
    panelObjective.setLayout(new BoxLayout(panelObjective, BoxLayout.X_AXIS));
    panelObjective.add(cbObjective);
    panelObjective.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
    panelObjective.setAlignmentX(RIGHT_ALIGNMENT);

    hbObjective.add(panelObjective);
    hbObjective.setAlignmentX(RIGHT_ALIGNMENT);

    hb9.add(hbObjectiveLabel);
    hb9.add(hbObjective);

    okButton.setMnemonic(KeyEvent.VK_O);
    JLabel blank = new JLabel("    ");
    cancelButton.setMnemonic(KeyEvent.VK_C);
    JLabel blank2 = new JLabel("    ");
    nextRowButton.setMnemonic(KeyEvent.VK_N);

    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
    buttonPanel.add(okButton);
    buttonPanel.add(blank);
    buttonPanel.add(cancelButton);
    buttonPanel.add(blank2);
    buttonPanel.add(nextRowButton);
    buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 20, 20, 20));

    hbButton.add(buttonPanel);

    vb.add(hbLabels);
    vb.add(hb1);
    vb.add(hb2);
    vb.add(hb3);
    vb.add(hb4);
    vb.add(hb5);
    vb.add(hb6);
    vb.add(hb7);
    vb.add(hb8);
    vb.add(hb9);
    vb.add(hbButton);

    add(vb);

    ActionListener okButtonActionListener =
        new ActionListener() {
          public void actionPerformed(ActionEvent prodActionEvent) {
            // add metacolumn names to db
            ReactionsMetaColumnManager reactionsMetaColumnManager =
                new ReactionsMetaColumnManager();
            ArrayList<String> metaColumnNames = new ArrayList();
            ArrayList<Integer> usedIndices = new ArrayList();
            ArrayList<Integer> metaColumnIndexList = new ArrayList();

            if (getColumnNamesFromFile().contains(cbKnockout.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setKnockoutColumnIndex(
                      getColumnNamesFromFile().indexOf(cbKnockout.getSelectedItem()));
              usedIndices.add(getColumnNamesFromFile().indexOf(cbKnockout.getSelectedItem()));
            }
            if (getColumnNamesFromFile().contains(cbFluxValue.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setFluxValueColumnIndex(
                      getColumnNamesFromFile().indexOf(cbFluxValue.getSelectedItem()));
              usedIndices.add(getColumnNamesFromFile().indexOf(cbFluxValue.getSelectedItem()));
            }
            if (getColumnNamesFromFile().contains(cbReactionAbbreviation.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setReactionAbbreviationColumnIndex(
                      getColumnNamesFromFile().indexOf(cbReactionAbbreviation.getSelectedItem()));
              usedIndices.add(
                  getColumnNamesFromFile().indexOf(cbReactionAbbreviation.getSelectedItem()));
            }
            if (getColumnNamesFromFile().contains(cbReactionName.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setReactionNameColumnIndex(
                      getColumnNamesFromFile().indexOf(cbReactionName.getSelectedItem()));
              usedIndices.add(getColumnNamesFromFile().indexOf(cbReactionName.getSelectedItem()));
            }
            if (getColumnNamesFromFile().contains(cbReactionEquation.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setReactionEquationColumnIndex(
                      getColumnNamesFromFile().indexOf(cbReactionEquation.getSelectedItem()));
              usedIndices.add(
                  getColumnNamesFromFile().indexOf(cbReactionEquation.getSelectedItem()));
            }
            if (getColumnNamesFromFile().contains(cbReversible.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setReversibleColumnIndex(
                      getColumnNamesFromFile().indexOf(cbReversible.getSelectedItem()));
              usedIndices.add(getColumnNamesFromFile().indexOf(cbReversible.getSelectedItem()));
            }
            if (getColumnNamesFromFile().contains(cbLowerBound.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setLowerBoundColumnIndex(
                      getColumnNamesFromFile().indexOf(cbLowerBound.getSelectedItem()));
              usedIndices.add(getColumnNamesFromFile().indexOf(cbLowerBound.getSelectedItem()));
            }
            if (getColumnNamesFromFile().contains(cbUpperBound.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setUpperBoundColumnIndex(
                      getColumnNamesFromFile().indexOf(cbUpperBound.getSelectedItem()));
              usedIndices.add(getColumnNamesFromFile().indexOf(cbUpperBound.getSelectedItem()));
            }
            if (getColumnNamesFromFile().contains(cbObjective.getSelectedItem())) {
              LocalConfig.getInstance()
                  .setBiologicalObjectiveColumnIndex(
                      getColumnNamesFromFile().indexOf(cbObjective.getSelectedItem()));
              usedIndices.add(getColumnNamesFromFile().indexOf(cbObjective.getSelectedItem()));
            }
            for (int i = 0; i < getColumnNamesFromFile().size(); i++) {
              if (!usedIndices.contains(i)) {
                metaColumnNames.add(getColumnNamesFromFile().get(i));
                metaColumnIndexList.add(
                    getColumnNamesFromFile().indexOf(getColumnNamesFromFile().get(i)));
              }
            }

            reactionsMetaColumnManager.addColumnNames(
                LocalConfig.getInstance().getDatabaseName(), metaColumnNames);
            LocalConfig.getInstance().setReactionsMetaColumnIndexList(metaColumnIndexList);

            setVisible(false);
            dispose();

            progressBar.setVisible(true);

            t.start();

            task = new Task();
            task.execute();
          }
        };

    okButton.addActionListener(okButtonActionListener);

    ActionListener cancelButtonActionListener =
        new ActionListener() {
          public void actionPerformed(ActionEvent prodActionEvent) {
            setVisible(false);
            dispose();
            // this is a hack, same as clear method in gui
            try {
              Class.forName("org.sqlite.JDBC");
              DatabaseCreator databaseCreator = new DatabaseCreator();
              LocalConfig.getInstance().setDatabaseName(ConfigConstants.DEFAULT_DATABASE_NAME);
              Connection con =
                  DriverManager.getConnection(
                      "jdbc:sqlite:" + ConfigConstants.DEFAULT_DATABASE_NAME + ".db");
              databaseCreator.createDatabase(LocalConfig.getInstance().getDatabaseName());
              databaseCreator.addRows(
                  LocalConfig.getInstance().getDatabaseName(),
                  GraphicalInterfaceConstants.BLANK_DB_NUMBER_OF_ROWS,
                  GraphicalInterfaceConstants.BLANK_DB_NUMBER_OF_ROWS);
            } catch (ClassNotFoundException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            }
          }
        };

    cancelButton.addActionListener(cancelButtonActionListener);

    ActionListener nextRowButtonActionListener =
        new ActionListener() {
          public void actionPerformed(ActionEvent prodActionEvent) {
            TextReactionsModelReader reader = new TextReactionsModelReader();
            int correction = LocalConfig.getInstance().getReactionsNextRowCorrection();
            if ((correction + 1) < reader.numberOfLines(GraphicalInterface.getReactionsCSVFile())) {
              LocalConfig.getInstance().setReactionsNextRowCorrection(correction + 1);
              System.out.println(
                  "corr " + LocalConfig.getInstance().getReactionsNextRowCorrection());
              ArrayList<String> newColumnNamesFromFile =
                  reader.columnNamesFromFile(
                      GraphicalInterface.getReactionsCSVFile(),
                      LocalConfig.getInstance().getReactionsNextRowCorrection());
              setColumnNamesFromFile(newColumnNamesFromFile);
              populateNamesFromFileBoxes(newColumnNamesFromFile);
            }
          }
        };

    nextRowButton.addActionListener(nextRowButtonActionListener);
  }
  public void populateNamesFromFileBoxes(ArrayList<String> columnNamesFromFile) {

    LocalConfig.getInstance().setKnockoutColumnIndex(-1);
    LocalConfig.getInstance().setFluxValueColumnIndex(-1);
    LocalConfig.getInstance().setReversibleColumnIndex(-1);
    LocalConfig.getInstance().setLowerBoundColumnIndex(-1);
    LocalConfig.getInstance().setUpperBoundColumnIndex(-1);
    LocalConfig.getInstance().setBiologicalObjectiveColumnIndex(-1);
    cbKnockout.removeAllItems();
    cbFluxValue.removeAllItems();
    cbReactionAbbreviation.removeAllItems();
    cbReactionName.removeAllItems();
    cbReactionEquation.removeAllItems();
    cbReversible.removeAllItems();
    cbLowerBound.removeAllItems();
    cbUpperBound.removeAllItems();
    cbObjective.removeAllItems();
    // add all column names to from file comboboxes
    for (int c = 0; c < columnNamesFromFile.size(); c++) {
      cbKnockout.addItem(columnNamesFromFile.get(c));
      cbFluxValue.addItem(columnNamesFromFile.get(c));
      cbReactionAbbreviation.addItem(columnNamesFromFile.get(c));
      cbReactionName.addItem(columnNamesFromFile.get(c));
      cbReactionEquation.addItem(columnNamesFromFile.get(c));
      cbReversible.addItem(columnNamesFromFile.get(c));
      cbLowerBound.addItem(columnNamesFromFile.get(c));
      cbUpperBound.addItem(columnNamesFromFile.get(c));
      cbObjective.addItem(columnNamesFromFile.get(c));
    }
    cbKnockout.setSelectedIndex(-1);
    cbFluxValue.setSelectedIndex(-1);
    cbReversible.setSelectedIndex(-1);
    cbLowerBound.setSelectedIndex(-1);
    cbUpperBound.setSelectedIndex(-1);
    cbObjective.setSelectedIndex(-1);
    for (int c = 0; c < columnNamesFromFile.size(); c++) {
      // filters to match column names from file to required column names in table
      if ((columnNamesFromFile.get(c).toLowerCase())
                  .compareTo(GraphicalInterfaceConstants.KNOCKOUT_COLUMN_FILTER[0])
              == 0
          || (columnNamesFromFile.get(c).toLowerCase())
                  .compareTo(GraphicalInterfaceConstants.KNOCKOUT_COLUMN_FILTER[1])
              == 0) {
        cbKnockout.setSelectedIndex(c);
        LocalConfig.getInstance().setKnockoutColumnIndex(c);
      } else if ((columnNamesFromFile.get(c).toLowerCase())
          .contains(GraphicalInterfaceConstants.FLUX_VALUE_COLUMN_FILTER[0])) {
        cbFluxValue.setSelectedIndex(c);
        LocalConfig.getInstance().setFluxValueColumnIndex(c);
      } else if ((columnNamesFromFile.get(c).toLowerCase())
          .contains(GraphicalInterfaceConstants.REVERSIBLE_COLUMN_FILTER[0])) {
        cbReversible.setSelectedIndex(c);
        LocalConfig.getInstance().setReversibleColumnIndex(c);
      } else if ((columnNamesFromFile.get(c).toLowerCase())
                  .compareTo(GraphicalInterfaceConstants.LOWER_BOUND_FILTER[0])
              == 0
          || (columnNamesFromFile.get(c).toLowerCase())
                  .compareTo(GraphicalInterfaceConstants.LOWER_BOUND_FILTER[1])
              == 0
          || (columnNamesFromFile.get(c).toLowerCase())
                  .compareTo(GraphicalInterfaceConstants.LOWER_BOUND_FILTER[2])
              == 0) {
        cbLowerBound.setSelectedIndex(c);
        LocalConfig.getInstance().setLowerBoundColumnIndex(c);
      } else if ((columnNamesFromFile.get(c).toLowerCase())
                  .compareTo(GraphicalInterfaceConstants.UPPER_BOUND_FILTER[0])
              == 0
          || (columnNamesFromFile.get(c).toLowerCase())
                  .compareTo(GraphicalInterfaceConstants.UPPER_BOUND_FILTER[1])
              == 0
          || (columnNamesFromFile.get(c).toLowerCase())
                  .compareTo(GraphicalInterfaceConstants.UPPER_BOUND_FILTER[2])
              == 0) {
        cbUpperBound.setSelectedIndex(c);
        LocalConfig.getInstance().setUpperBoundColumnIndex(c);
      } else if ((columnNamesFromFile.get(c).toLowerCase())
          .contains(GraphicalInterfaceConstants.BIOLOGICAL_OBJECTIVE_FILTER[0])) {
        cbObjective.setSelectedIndex(c);
        LocalConfig.getInstance().setBiologicalObjectiveColumnIndex(c);
      }
    }

    // csv files written by TextReactionWriter will have KO and fluxValue as col 1 and 2
    if ((columnNamesFromFile.get(0).toLowerCase())
                .compareTo(GraphicalInterfaceConstants.KNOCKOUT_COLUMN_FILTER[0])
            == 0
        || (columnNamesFromFile.get(0).toLowerCase())
                .compareTo(GraphicalInterfaceConstants.KNOCKOUT_COLUMN_FILTER[1])
            == 0) {
      cbReactionAbbreviation.setSelectedIndex(2);
      LocalConfig.getInstance().setReactionAbbreviationColumnIndex(2);
      cbReactionName.setSelectedIndex(3);
      LocalConfig.getInstance().setReactionNameColumnIndex(3);
      cbReactionEquation.setSelectedIndex(4);
      LocalConfig.getInstance().setReactionEquationColumnIndex(4);
    } else {
      // first two columns are recommended to be column 1 and 2: abbreviation (id), and name
      cbReactionAbbreviation.setSelectedIndex(0);
      LocalConfig.getInstance().setReactionAbbreviationColumnIndex(0);
      cbReactionName.setSelectedIndex(1);
      LocalConfig.getInstance().setReactionNameColumnIndex(1);
      cbReactionEquation.setSelectedIndex(2);
      LocalConfig.getInstance().setReactionEquationColumnIndex(2);
    }
  }