class ExternalFileEntry {

    private JPanel pan;
    private final JTextField tf;
    private final JButton browse = new JButton(Localization.lang("Browse"));
    private final JButton view = new JButton(Localization.lang("Preview"));
    private final JButton clear = new JButton(IconTheme.JabRefIcon.DELETE_ENTRY.getIcon());
    private final JButton download = new JButton(Localization.lang("Download"));

    public ExternalFileEntry() {
      tf = new JTextField();
      setupPanel();
    }

    public ExternalFileEntry(String filename) {
      tf = new JTextField(filename);
      setupPanel();
    }

    private void setupPanel() {
      tf.setEditable(false);
      BrowseAction browseA = new BrowseAction(tf, false);
      browse.addActionListener(browseA);
      DownloadAction da = new DownloadAction(tf);
      download.addActionListener(da);
      FormBuilder builder =
          FormBuilder.create()
              .layout(
                  new FormLayout(
                      "fill:pref:grow, 4dlu, fill:pref, 4dlu, fill:pref, 4dlu, fill:pref, 4dlu, fill:pref",
                      "p"));
      builder.add(tf).xy(1, 1);
      builder.add(browse).xy(3, 1);
      builder.add(download).xy(5, 1);
      builder.add(view).xy(7, 1);
      builder.add(clear).xy(9, 1);

      pan = builder.getPanel();

      view.addActionListener(
          new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
              try {
                JournalAbbreviationRepository abbr = new JournalAbbreviationRepository();
                abbr.readJournalListFromFile(new File(tf.getText()));

                JTable table = new JTable(JournalAbbreviationsUtil.getTableModel(abbr));
                JScrollPane pane = new JScrollPane(table);
                JOptionPane.showMessageDialog(
                    null,
                    pane,
                    Localization.lang("Journal list preview"),
                    JOptionPane.INFORMATION_MESSAGE);
              } catch (FileNotFoundException ex) {
                JOptionPane.showMessageDialog(
                    null,
                    Localization.lang("File '%0' not found", tf.getText()),
                    Localization.lang("Error"),
                    JOptionPane.ERROR_MESSAGE);
              }
            }
          });
      clear.addActionListener(
          new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
              externals.remove(ExternalFileEntry.this);
              buildExternalsPanel();
            }
          });
      clear.setToolTipText(Localization.lang("Remove"));
    }

    public JPanel getPanel() {
      return pan;
    }

    public String getValue() {
      return tf.getText();
    }
  }