package org.jabref.gui.exporter; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.BorderFactory; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.table.TableColumnModel; import org.jabref.Globals; import org.jabref.gui.JabRefDialog; import org.jabref.gui.JabRefFrame; import org.jabref.gui.help.HelpAction; import org.jabref.gui.keyboard.KeyBinding; import org.jabref.logic.exporter.SavePreferences; import org.jabref.logic.help.HelpFile; import org.jabref.logic.l10n.Localization; import org.jabref.logic.layout.LayoutFormatterPreferences; import ca.odell.glazedlists.gui.TableFormat; import ca.odell.glazedlists.swing.DefaultEventTableModel; import com.jgoodies.forms.builder.ButtonBarBuilder; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class ExportCustomizationDialog extends JabRefDialog { // Column widths for export customization dialog table: private static final int COL_0_WIDTH = 50; private static final int COL_1_WIDTH = 200; private static final int COL_2_WIDTH = 30; public ExportCustomizationDialog(final JabRefFrame frame) { super(frame, Localization.lang("Manage custom exports"), false, ExportCustomizationDialog.class); DefaultEventTableModel<List<String>> tableModel = new DefaultEventTableModel<>( Globals.prefs.customExports.getSortedList(), new ExportTableFormat()); JTable table = new JTable(tableModel); TableColumnModel cm = table.getColumnModel(); cm.getColumn(0).setPreferredWidth(COL_0_WIDTH); cm.getColumn(1).setPreferredWidth(COL_1_WIDTH); cm.getColumn(2).setPreferredWidth(COL_2_WIDTH); JScrollPane sp = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setPreferredScrollableViewportSize(new Dimension(500, 150)); if (table.getRowCount() > 0) { table.setRowSelectionInterval(0, 0); } JButton addExport = new JButton(Localization.lang("Add new")); addExport.addActionListener(e -> { CustomExportDialog ecd = new CustomExportDialog(frame); ecd.setVisible(true); if (ecd.okPressed()) { List<String> newFormat = Arrays.asList(ecd.name(), ecd.layoutFile(), ecd.extension()); Globals.prefs.customExports.addFormat(newFormat, Globals.prefs.getLayoutFormatterPreferences(Globals.journalAbbreviationLoader), SavePreferences.loadForExportFromPreferences(Globals.prefs)); Globals.prefs.customExports.store(Globals.prefs); } }); JButton modify = new JButton(Localization.lang("Modify")); modify.addActionListener(e -> { int row = table.getSelectedRow(); if (row == -1) { return; } List<String> old = Globals.prefs.customExports.getSortedList().get(row); CustomExportDialog ecd = new CustomExportDialog(frame, old.get(0), old.get(1), old.get(2)); ecd.setVisible(true); // ecd.show(); -> deprecated since 1.5 if (ecd.okPressed()) { old.set(0, ecd.name()); old.set(1, ecd.layoutFile()); old.set(2, ecd.extension()); table.revalidate(); table.repaint(); Globals.prefs.customExports.store(Globals.prefs); } }); JButton remove = new JButton(Localization.lang("Remove")); remove.addActionListener(e -> { int[] rows = table.getSelectedRows(); if (rows.length == 0) { return; } List<List<String>> entries = new ArrayList<>(); for (int i = 0; i < rows.length; i++) { entries.add(Globals.prefs.customExports.getSortedList().get(rows[i])); } LayoutFormatterPreferences layoutPreferences = Globals.prefs .getLayoutFormatterPreferences(Globals.journalAbbreviationLoader); SavePreferences savePreferences = SavePreferences.loadForExportFromPreferences(Globals.prefs); for (List<String> list : entries) { Globals.prefs.customExports.remove(list, layoutPreferences, savePreferences); } Globals.prefs.customExports.store(Globals.prefs); }); Action closeAction = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }; JButton close = new JButton(Localization.lang("Close")); close.addActionListener(closeAction); JButton help = new HelpAction(HelpFile.CUSTOM_EXPORTS).getHelpButton(); // Key bindings: JPanel main = new JPanel(); ActionMap am = main.getActionMap(); InputMap im = main.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); im.put(Globals.getKeyPrefs().getKey(KeyBinding.CLOSE_DIALOG), "close"); am.put("close", closeAction); main.setLayout(new BorderLayout()); main.add(sp, BorderLayout.CENTER); JPanel buttons = new JPanel(); ButtonBarBuilder bb = new ButtonBarBuilder(buttons); buttons.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); bb.addGlue(); bb.addButton(addExport); bb.addButton(modify); bb.addButton(remove); bb.addButton(close); bb.addUnrelatedGap(); bb.addButton(help); bb.addGlue(); getContentPane().add(main, BorderLayout.CENTER); getContentPane().add(buttons, BorderLayout.SOUTH); pack(); setLocationRelativeTo(frame); table.requestFocus(); } private static class ExportTableFormat implements TableFormat<List<String>> { @Override public Object getColumnValue(List<String> strings, int i) { return strings.get(i); } @Override public int getColumnCount() { return 3; } @Override public String getColumnName(int col) { switch (col) { case 0: return Localization.lang("Export name"); case 1: return Localization.lang("Main layout file"); default: return Localization.lang("Extension"); } } } }